<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}window.gtag=gtag;gtag('consent','default',{'ad_storage':'denied','ad_user_data':'denied','ad_personalization':'denied','analytics_storage':'denied','functionality_storage':'granted','security_storage':'granted','wait_for_update':500});</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-MTH6M5SP');</script>
<!-- End Google Tag Manager -->
<!-- Google Ads (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-865006673"></script>
<script>window.dataLayer=window.dataLayer||[];window.gtag=window.gtag||function(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','AW-865006673');window.__ifmAds={"id":"AW-865006673","labels":{"buchung":"qQ84CKKD0ckcENHou5wD","kontakt":"yL31CKWD0ckcENHou5wD"}};</script>
<!-- End Google Ads -->
<title>Berufliche Weiterbildung &amp; Coaching bei ifmera academy</title>
<link rel="preload" href="/assets/fonts/Roboto-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="icon" href="/favicon.ico" sizes="48x48"><link rel="icon" href="/assets/favicons/favicon.svg" type="image/svg+xml"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicons/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/favicons/apple-touch-icon.png"><link rel="manifest" href="/assets/favicons/site.webmanifest"><meta name="theme-color" content="#00444A">
<meta name="description" content="ifmera academy: Stärken Sie Ihre berufliche Wirksamkeit mit Weiterbildung, Coaching &amp; Consulting. Über 600 Seminare für Fach- &amp; Führungskräfte. Jetzt Ihr Thema entdecken!"><meta name="keywords" content="Weiterbildung, Coaching, Seminare, Consulting, Führungskräfteentwicklung, ifmera academy, Berufliche Weiterbildung, Fachkräfte, Führungskräfte, Kompetenzaufbau, Live-Online Seminar, Geförderte Weiterbildung, Unternehmensberatung, Weiterbildungsanbieter, DACH"><link rel="canonical" href="https://ifmera.com/de/"><meta property="og:url" content="https://ifmera.com/de/"><link rel="alternate" hreflang="de" href="https://ifmera.com/de/"><link rel="alternate" hreflang="x-default" href="https://ifmera.com/de/"><meta property="og:type" content="website"><meta property="og:title" content="Berufliche Weiterbildung &amp; Coaching bei ifmera academy"><meta name="twitter:title" content="Berufliche Weiterbildung &amp; Coaching bei ifmera academy"><meta property="og:description" content="ifmera academy: Stärken Sie Ihre berufliche Wirksamkeit mit Weiterbildung, Coaching &amp; Consulting. Über 600 Seminare für Fach- &amp; Führungskräfte. Jetzt Ihr Thema entdecken!"><meta name="twitter:description" content="ifmera academy: Stärken Sie Ihre berufliche Wirksamkeit mit Weiterbildung, Coaching &amp; Consulting. Über 600 Seminare für Fach- &amp; Führungskräfte. Jetzt Ihr Thema entdecken!"><meta property="og:image" content="https://ifmera.com/media/ifmera-teaser.webp"><meta name="twitter:image" content="https://ifmera.com/media/ifmera-teaser.webp"><meta name="twitter:card" content="summary_large_image">
<style>  @font-face {
    font-family: 'Roboto';
    src: url('/assets/fonts/Roboto-latin.woff2') format('woff2');
    font-weight: 100 900;
    font-display: swap;
    font-style: normal;
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
  }
  @font-face {
    font-family: 'Roboto';
    src: url('/assets/fonts/Roboto-latin-ext.woff2') format('woff2');
    font-weight: 100 900;
    font-display: swap;
    font-style: normal;
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  /* Tuned Arial-Fallback mit Roboto-Metriken → kein CLS während Font-Swap (Google-validierte Override-Werte) */
  @font-face {
    font-family: 'Roboto Fallback';
    src: local('Arial');
    font-weight: 100 900;
    font-style: normal;
    size-adjust: 100.06%;
    ascent-override: 92.77%;
    descent-override: 24.41%;
    line-gap-override: 0%;
  }
  :root {
    --color-primary: #00444A;          /* Haupt-Teal (Hintergrund, Text) */
    --color-accent: #FF7758;           /* Orange/Coral (CTA, Titel) */
    --color-light: #FAF5EB;            /* Helles Weiß */
    --color-icon: #E6FF2A;             /* Icon-Farbe (Tab-Icons, Badge-Icon) */
    --color-light-contrast: #FFFFFF;   /* Karten-Hintergrund */
    --color-primary-muted: color-mix(in srgb, var(--color-primary), transparent 25%); /* gedimmter Teal für Sub-Texte/Captions — transparent 25% (war 40%) hebt Kontrast auf hellem BG von 3,44:1 auf ~5,1:1 (WCAG AA), Hue bleibt identisch */
    --color-on-accent: color-mix(in srgb, var(--color-primary), black 9%); /* Lesbarer Text/Link/Button-Text auf Accent-Orange-BG. Reines Primary ergibt nur 4,17:1, black 9% = 4,54:1 (WCAG AA ≥ 4,5; 8% = 4,50 Kante) — minimale Abweichung vom Primary, Hue bleibt Marken-Teal. ÜBERALL nutzen, wo --color-accent der Hintergrund ist: CTA-Buttons, #inhouse-schulung, #suche. */
    --cta-text-color: var(--color-on-accent); /* CTA-Button-Text referenziert die geteilte On-Accent-Variable */
    /* Höhe des fixed Headers — wird vom sticky-TOC als top-Offset genutzt.
       Werte = gemessene .nav-fixed-wrapper.offsetHeight im jeweils scrolled
       Zustand (zu dem Zeitpunkt wo Sticky greift, ist die Nav immer scrolled).
       Tuning per Media-Query weiter unten. */
    --nav-height: 3.25rem;
    --font-size-sm: 0.85rem;            /* Klein — Mini-Labels, Helper-Texte, Footer-Copyright */
    --font-size-md: 1rem;               /* Mittel — Standard-Body, Buttons, UI */
    --font-size-lg: 1.25rem;            /* Groß — Sektions-Body, Sub-Headings */
    --font-size-xl: 1.6rem;             /* Extra-Groß — Notch-Subtitles, Preis-Displays, H3 in Cards */
    --radius-sm: 0.5rem;
    --radius-md: 1rem;
    --radius-lg: 1.5rem;
    --padding: 2rem;

    /* ─── Form-Field System ─── */
    --form-field-bg: var(--color-light-contrast);
    --form-field-border: color-mix(in srgb, var(--color-primary) 20%, transparent);
    --form-field-border-hover: color-mix(in srgb, var(--color-primary) 40%, transparent);
    --form-field-border-focus: var(--color-primary);
    --form-field-border-invalid: var(--color-accent);
    --form-field-border-valid: color-mix(in srgb, var(--color-primary) 55%, transparent);
    --form-field-text: var(--color-primary);
    --form-field-placeholder: var(--color-primary-muted); /* war Primary @ 45% = 2,46:1 ❌; muted (Primary @ 75%) = 5,35:1 ✅ auf weißem Feld-BG. Single-Source für ::placeholder, Datum/Zeit/Datetime-Hints, Color-Wert & Combobox-Placeholder */
    --form-field-radius: var(--radius-sm);
    --form-field-height: 3rem;
    --form-field-padding-x: 1rem;
    --form-field-gap-icon: 0.75rem;
    --form-field-focus-ring: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);
    --form-field-shake-distance: 6px;
  }

  /* --nav-height pro Breakpoint — Werte matchen die scrolled Nav, da
     Sticky nur greift, wenn die Nav bereits scrolled ist. Bei Bedarf
     Live-Anpassung über DevTools möglich (top-Position der sticky TOC).
     Breakpoints matchen die existierenden Nav-Layout-Stufen:
       >1280:    einzeilig, ~53px scrolled  → 3.25rem
       ≤1280:    nav-center wrapt zweite Zeile, ~86px scrolled → 5.5rem
       ≤800:     Burger-Drawer aktiv, nav-center aus Flow, ~52px → 3.5rem */
  @media (max-width: 1279.98px) {
    :root { --nav-height: 5.5rem; }
  }
  @media (max-width: 799.98px) {
    :root { --nav-height: 3.5rem; }
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }
  html {
    scroll-behavior: smooth;
    scroll-padding-top: 7rem;
    /* Scrollbar-Platz IMMER reservieren — verhindert Layout-Shift beim Öffnen
       des Mobile-Drawers (wo html overflow: hidden gesetzt wird). */
    scrollbar-gutter: stable;
  }

  body {
    font-family: 'Roboto', 'Roboto Fallback', sans-serif;
    font-size: var(--font-size-md);
    background-color: var(--color-light);
    color: var(--color-primary);
    line-height: 1.6;
    overflow-x: hidden;
  }

  /* ─── Navigation ─── */
  .nav-fixed-wrapper {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 1000;
    /* Cremeweiß statt transparent: matcht den Body-BG visuell 1:1, deckt
       aber den ~11px-Überstand der Hero-Oberkante (mit border-radius)
       die sonst durch den transparenten Nav-Bereich oberhalb des
       Mega-Panels durchblitzt. Scrolled-Zustand überschreibt mit Teal. */
    background: var(--color-light);
    transition: background 0.2s ease-out, box-shadow 0.35s ease;
  }

  .nav-fixed-wrapper.nav-scrolled {
    background: var(--color-primary);
    box-shadow: 0 2px 12px rgba(0,0,0,0.15);
  }

  .nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    max-width: 90rem;
    width: 100%;
    margin: 0 auto;
    padding: 1rem 3.5rem;
    background: transparent;
    position: relative;
    z-index: 10;
    transition: padding 0.35s ease;
  }

  .nav-scrolled .nav {
    padding-top: 0.35rem;
    padding-bottom: 0.35rem;
  }

  /* CTA button — nav-scrolled state collapses text + shrinks icon
     (base styles live further below near `.nav-right`) */
  .nav-scrolled .btn-cta-text {
    max-width: 0;
    opacity: 0;
    padding: 0;
  }

  .nav-scrolled .btn-cta-wrap {
    padding: 0.5rem;
    gap: 0;
  }

  .nav-scrolled .btn-cta-icon {
    width: 1.4rem;
    height: 1.4rem;
  }

  .nav-logo svg {
    height: 52px;
    width: auto;
    display: block;
    transition: height 0.35s ease;
  }

  .nav-scrolled .nav-logo svg {
    height: 42px;
  }

  /* Logo parts transition for compact state */
  .nav-logo svg #logo-form,
  .nav-logo svg #logo-dot {
    transition: opacity 0.35s ease, transform 0.35s ease;
    transform-origin: center center;
  }

  .nav-scrolled .nav-logo svg #logo-form,
  .nav-scrolled .nav-logo svg #logo-dot,
  .nav-scrolled .nav-logo svg #logo-academy {
    opacity: 0;
    transform: scale(0.5);
  }

  .nav-logo svg #logo-ifmera {
    transition: transform 0.35s ease, opacity 0.35s ease;
    transform-origin: left center;
  }

  .nav-scrolled .nav-logo svg #logo-ifmera {
    transform: scale(1.45) translate(-20px, 65px);
  }

  .nav-logo svg #logo-academy {
    transition: opacity 0.35s ease, transform 0.35s ease;
    transform-origin: left center;
  }

  .nav-logo svg #logo-dot {
    fill: var(--color-icon);
    stroke: var(--color-primary);
    stroke-width: 5px;
  }

  .nav-scrolled .nav-logo svg #logo-ifmera .lg {
    fill: var(--color-icon);
  }

  .nav-center {
    display: flex;
    align-items: center;
    gap: 2.25rem;
    list-style: none;
  }

  /* Top-level link/trigger styles live on .nav-trigger (further down) — no
     blanket `.nav-center a` rule, since mega-panel links use their own
     .link / .mega-thema-tile / .mega-promo-card colors. */

  .nav-right {
    display: flex;
    align-items: center;
    gap: 1.25rem;
  }

  /* .btn-cta-wrap trägt jetzt die .cta-secondary-Klasse (Skin = Single-Source:
     Hintergrund, Border-Entfernung, :hover und :active kommen von .cta-secondary).
     Das bespoke Nav-Layout (kompaktes asymmetrisches Padding fürs Phone-Icon, Gap,
     Textgewicht, Scroll-Collapse-Transition) steht als Override-Regel direkt NACH
     .cta-secondary. Scroll-Collapse: .nav-scrolled .btn-cta-wrap (0,2,0) weiter oben. */

  .btn-cta-icon {
    width: 28px;
    height: 28px;
    flex-shrink: 0;
    color: var(--color-light);
    fill: var(--color-light);
    transition: width 0.35s ease, height 0.35s ease;
  }

  .btn-cta-text {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    max-width: 12rem;
    opacity: 1;
    white-space: nowrap;
    transition: max-width 0.4s ease, opacity 0.25s ease, padding 0.4s ease;
  }

  .btn-cta-label {
    color: var(--color-light);
    font-size: var(--font-size-md);
    font-weight: 600;
    line-height: 1.2;
  }

  .btn-cta-phone {
    color: var(--color-light);
    font-size: var(--font-size-sm);
    font-weight: 400;
    text-decoration: none;
    letter-spacing: 0.02em;
    line-height: 1.2;
    transition: opacity 0.2s;
  }

  .btn-cta-phone:hover {
    opacity: 0.8;
    text-decoration: underline;
  }

  .nav-icon {
    width: 28px;
    height: 28px;
    fill: var(--color-primary);
    cursor: pointer;
    transition: opacity 0.2s, fill 0.35s ease;
  }

  .nav-scrolled .nav-icon {
    fill: var(--color-light);
  }

  .nav-icon:hover { opacity: 0.6; }

  /* ─── Hero Section ─── */
  .hero {
    position: relative;
    overflow: hidden;
    min-height: 45rem;
    margin-top: 5.2rem;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    /* full-bleed mit Deckelung (CMS-Abweichung vom Testdesign — bei Asset-Resync erhalten!):
       aus content-wrap ausbrechen bis 3.5rem Abstand zum Viewport, ABER höchstens 2172px
       breit (= native Hero-/Teaser-Breite) und dann viewport-zentriert.
       margin-left: calc(50% - W/2) zentriert eine Breite W mittig im Viewport (50% = halbe
       content-wrap-Breite, content-wrap ist selbst viewport-zentriert). Für W = 100vw-7rem
       reduziert sich das exakt auf das frühere calc(-50vw + 50% + 3.5rem) → unter ~2284px
       Viewport unverändert; die Deckelung greift erst darüber. */
    width: min(100vw - 7rem, 2172px);
    margin-left: calc(50% - min(100vw - 7rem, 2172px) / 2);
    border-radius: var(--radius-lg);
  }

  .hero > img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* CMS-Abweichung vom Testdesign (bei Asset-Resync aus test\design erhalten!):
       Statt das Bild hart rechts (`right center`) zu verankern (→ Beschnitt NUR links,
       Personen kleben am rechten Rand / Frau rutscht hinter die Karte), wird der Beschnitt
       verteilt: bei `X% center` werden X% des Überstands links abgeschnitten, (100−X)% rechts.
       67% → rechts ≈ 50% von dem, was links wegfällt ((100−67)/67 ≈ 0,49). So rückt das
       sichtbare Fenster etwas nach rechts → die Menschen bleiben sichtbar.
       Tuning: höher = weniger Rechts-Beschnitt (74% ≈ 35%), niedriger = mehr (50% = mittig). */
    object-position: 67% center;
    display: block;
    z-index: 0;
  }

  .hero-card {
    position: relative;
    z-index: 1;
    /* CMS-Abweichung (2026-06-23, bei Asset-Resync erhalten!): Karte schrumpft auf
       Inhaltsbreite, gedeckelt auf [35rem … 50rem]. fit-content statt width:100% →
       kurze Titel ergeben eine schmalere Karte (Floor 35rem), lange Titel füllen bis
       50rem und brechen um. min/max via min() gegen die Viewportbreite geklammert
       (Mobile bleibt nahezu full-bleed wie bisher). */
    width: fit-content;
    min-width: min(35rem, calc(100% - 3rem));
    max-width: min(50rem, calc(100% - 3rem));
    /* Position HERO-relativ statt viewport-relativ (CMS-Abweichung — bei Asset-Resync erhalten!):
       seit die .hero gedeckelt+zentriert ist (max 2172px), ist sie nicht mehr am Viewport-Rand
       verankert → das frühere calc(50vw - 47rem) verschob die Karte. 50% = halbe Hero-Breite
       (Hero hat kein Padding). Unter der Deckelung gilt 50% = 50vw - 3.5rem → calc(50% - 43.5rem)
       ist exakt das frühere calc(50vw - 47rem) (43.5rem = 47rem - 3.5rem halber 7rem-Außenrand);
       über der Deckelung wird der Wert konstant → Karte bleibt fest zur Hero-Box. */
    margin-left: max(0px, calc(50% - 43.5rem));
    padding: var(--padding);
  }

  .hero-card::before {
    content: "";
    position: absolute;
    inset: 0;
    background-color: var(--color-primary);
    clip-path: url(#hero-notch-clip);
    z-index: -1;
  }

  /* Bewusste Abweichung vom Testdesign (2026-06-10): Der SVG-clipPath
     (#hero-notch-clip, objectBoundingBox) skaliert Radien & Notch-Tiefe mit der
     Kartenhöhe → elliptisch verzerrte Rundungen bei inhaltabhängiger Höhe
     (kalibriert war 800×450). shape() hält Radius (--radius-lg) und Notch
     (121.5px) fix; url()-Clip bleibt Fallback für Browser ohne shape()
     (z.B. Firefox ESR 140). MUSS vor der ≤1280-Media-Query stehen, damit
     deren clip-path:none weiter gewinnt. */
  @supports (clip-path: shape(from 0 0, line to 0 0)) {
    .hero-card::before {
      --r: var(--radius-lg);   /* 24px Eckradius, fix statt proportional */
      --notch: 7.59375rem;     /* 121.5px — Breite & Tiefe der Aussparung */
      clip-path: shape(
        from var(--r) 0,
        hline to calc(100% - var(--notch) - var(--r)),
        arc to calc(100% - var(--notch)) var(--r) of var(--r) cw,
        vline to calc(var(--notch) - var(--r)),
        arc to calc(100% - var(--notch) + var(--r)) var(--notch) of var(--r) ccw,
        hline to calc(100% - var(--r)),
        arc to 100% calc(var(--notch) + var(--r)) of var(--r) cw,
        vline to calc(100% - var(--r)),
        arc to calc(100% - var(--r)) 100% of var(--r) cw,
        hline to var(--r),
        arc to 0 calc(100% - var(--r)) of var(--r) cw,
        vline to var(--r),
        arc to var(--r) 0 of var(--r) cw
      );
    }
  }


  /* Badge */
  .badge {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    background: rgba(255, 255, 255, 0.10);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    padding: 0.25rem 0.8rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    color: var(--color-light);
    font-weight: 500;
    margin-bottom: 1.25rem;
    
  }

  .badge-icon {
    width: 16px;
    height: 16px;
    fill: var(--color-icon);
  }

  /* Hero Title */
  .hero-title {
    /* --hero-fs: serverseitig von Blocks\Hero berechnete Schriftgröße, damit ein langer Titel
       in ≤3 Zeilen passt, OHNE client-seitiges Verkleinern (kein Karten-Umspringen/Flash).
       Fehlt sie (kurzer Titel), gilt die Basis 3.5rem. ≤1280px überschreibt die Responsive-clamp. */
    font-size: var(--hero-fs, 3.5rem);
    font-weight: 500;
    color: var(--color-light);
    line-height: 1.25;
    margin-top: 2rem;
    margin-bottom: 2rem;
  }

  /* === Responsive: ≤1280 (Kompakt — Hero) ===
     Bild wechselt von position:absolute zu Flex-Flow (order:1, nach der Card).
     margin-top:-3rem erzeugt den Overlap. Wenn Card wächst, rutscht das Bild mit. */
  @media (max-width: 1279.98px) {
    .hero {
      margin-top: 7.5rem;
      justify-content: flex-start;
      padding-top: 1.5rem;
      min-height: auto;
    }
    .hero > img {
      position: relative;
      inset: auto;
      order: 1;
      width: 100%;
      height: 28rem;
      max-width: none;
      max-height: none;
      margin-top: -3rem;
      object-fit: cover;
      /* CMS-Abweichung (bei Asset-Resync aus test\design erhalten!): Beschnitt verteilen wie
         im Desktop-Hero — 83% → rechts ≈ 20% von dem, was links wegfällt ((100−83)/83 ≈ 0,20).
         Tuning: höher = weniger Rechts-Beschnitt, niedriger = mehr (50% = mittig). */
      object-position: 83% center;
      border-radius: var(--radius-lg);
    }
    .hero-title { font-size: clamp(1.5rem, 0.75rem + 3vw, 2.5rem); }
    .hero-card { padding: 1.5rem; text-align: center; margin-left: auto; margin-right: auto; }
    .hero-breadcrumbs { justify-content: center; flex-wrap: wrap; }
    .badge-row { justify-content: center; }
    .badge-row .star { width: clamp(18px, 12px + 1.5vw, 28px); height: clamp(18px, 12px + 1.5vw, 28px); }
    .hero-card::before { clip-path: none; border-radius: var(--radius-lg); }
  }

  /* === Responsive: ≤650 (Extra-Stufe — Schmal-Stack — Hero) === */
  @media (max-width: 650px) {
    .hero > img { height: 24rem; margin-top: -1.5rem; }

    .hero-title { margin-top: 0; margin-bottom: 1rem; }
    .hero-card { padding: 1rem; max-width: calc(100% - 1rem); }
  }

  /* Badge + Stars row (bottom of hero-card) */
  .badge-row {
    display: flex;
    align-items: center;
    gap: 1rem;
  }
  .badge-row .badge,
  .badge-row .stars {
    margin-bottom: 0;
  }

  /* Hero-Card Breadcrumbs (light, inside hero) */
  .hero-breadcrumbs {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: var(--font-size-md);
    margin-bottom: 1rem;
    opacity: 0.9;
  }
  .hero-breadcrumbs a {
    color: var(--color-light);
    text-decoration: none;
  }
  .hero-breadcrumbs .link {
    color: var(--color-light);
    background-size: 100% 0;
  }
  .hero-breadcrumbs .sep {
    width: 0.8rem;
    height: 0.8rem;
    flex-shrink: 0;
    fill: var(--color-light);
  }
  .hero-breadcrumbs .home-icon {
    width: 16px;
    height: 16px;
    fill: var(--color-light);
    display: block;
  }
  @media (max-width: 650px) {
    .hero-breadcrumbs { display: none; }
  }

  /* Stars */
  /* ↓ Cascade-Hinweis: .stars-rating display:none muss NACH der Basis-Definition stehen,
     daher separater 650-Block nach dem Stars-Abschnitt (gleiche Logik wie .hero-breadcrumbs oben) */
  .stars {
    display: flex;
    gap: 0.2rem;
    margin-bottom: 1.5rem;
    text-decoration: none;
    color: inherit;
  }

  .star {
    width: 1.3rem;
    height: 1.3rem;
  }

  .stars-rating {
    margin-left: 0.5rem;
    color: var(--color-icon);
    font-weight: 600;
    align-self: center;
  }

  .star-filled { fill: var(--color-icon); }
  .star-empty { fill: rgba(255, 255, 255, 0.25); }
  @media (max-width: 650px) {
    .stars-rating { display: none; }
  }

  /* Action Icons Row */
  .actions {
    display: inline-flex;
    align-items: center;
    gap: 0.0rem;
    border-radius: var(--radius-sm);
    padding: 0 0.5rem;
  }

  .actions .action-icon {
    width: 40px;
    height: 44px;

    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-primary);
    cursor: pointer;
    transition: color 0.2s, transform 0.2s;

    text-decoration: none;
  }

  .actions .action-icon:hover,
  .actions .action-icon:focus-visible {
    color: var(--color-accent);
    transform: translateY(-3px);
    outline: none;
  }

  .actions .action-icon svg {
    width: 28px;
    height: 28px;
    fill: currentColor;
  }

  /* ─── Merkliste (Panel im Header + Toggle in der Aktionsleiste) ─── */
  /* Aktionsleisten-Herz: gefüllt; akzentfarben, sobald die Seite gemerkt ist. */
  .actions .action-icon.is-merkt,
  .actions .action-icon.is-merkt:hover,
  .actions .action-icon.is-merkt:focus-visible {
    color: var(--color-accent);
  }

  /* Header-Trigger (öffnet das Merkliste-Panel) */
  .merkliste-wrap {
    position: relative;
    display: inline-flex;
  }
  .nav-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
  }
  /* Badge am Trigger verankern (nicht am Wrap) — damit der Wrap bei ≤650 auf
     position:static gehen kann, ohne dass der Zähler-Dot wegspringt. */
  .merkliste-trigger { position: relative; }
  /* Zähler-Dot auf dem Herz-Trigger: Akzent-BG + Primary-Text */
  .merkliste-badge {
    position: absolute;
    top: -4px;
    right: -6px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    box-sizing: border-box;
    border-radius: 999px;
    background: var(--color-accent);
    color: var(--color-primary);
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 16px;
    text-align: center;
    pointer-events: none;
  }
  .merkliste-badge[hidden] { display: none; }
  /* Zähler-Pulse, wenn das geflogene Herz „ankommt" */
  .merkliste-badge.is-bump { animation: merkliste-bump 0.45s ease; }
  @keyframes merkliste-bump {
    0%   { transform: scale(1); }
    40%  { transform: scale(1.55); }
    100% { transform: scale(1); }
  }

  /* Schwebende Herz-Kopie (vom Toggle ins Header-Herz) */
  .merkliste-fly {
    position: fixed;
    z-index: 1200;
    pointer-events: none;
    color: var(--color-accent);
    will-change: transform, opacity;
  }
  .merkliste-fly svg {
    display: block;
    width: 100%;
    height: 100%;
    fill: currentColor;
    /* Dünne Primary-Kontur, damit sich das Akzent-Herz beim Überfliegen des
       Accent-CTA-Buttons abhebt. paint-order: stroke → Kontur liegt sauber
       außen (Fill malt die innere Hälfte zu). */
    stroke: var(--color-primary);
    stroke-width: 1.75;
    stroke-linejoin: round;
    paint-order: stroke;
  }

  /* Dropdown-Panel (rechtsbündig unter dem Trigger) */
  .merkliste-panel {
    position: absolute;
    top: calc(100% + 0.5rem);
    right: 0;
    width: 20rem;
    max-width: calc(100vw - 2rem);
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
    border-right: 3px solid var(--color-accent);
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.16);
    padding: 1rem 1.25rem;
    z-index: 1000;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-8px);
    pointer-events: none;
    transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
  }
  .merkliste-wrap.is-open .merkliste-panel {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    pointer-events: auto;
  }
  .merkliste-panel-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 0.5rem;
  }
  .merkliste-panel-head strong {
    color: var(--color-primary);
    font-size: var(--font-size-lg);
  }
  .merkliste-panel-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    border: none;
    background: transparent;
    color: var(--color-primary);
    cursor: pointer;
    border-radius: var(--radius-sm);
    transition: color 0.2s;
    flex-shrink: 0;
  }
  .merkliste-panel-close:hover,
  .merkliste-panel-close:focus-visible {
    color: var(--color-accent);
    outline: none;
  }
  .merkliste-panel-close svg { width: 1rem; height: 1rem; fill: currentColor; }

  .merkliste-list {
    list-style: none;
    margin: 0;
    padding: 0;
    max-height: min(60vh, 24rem);
    overflow-y: auto;
  }
  .merkliste-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0;
    border-bottom: 1px solid color-mix(in srgb, var(--color-primary) 12%, transparent);
  }
  .merkliste-item:last-child { border-bottom: none; }
  .merkliste-item-link {
    flex: 1;
    min-width: 0;
    color: var(--color-primary);
    text-decoration: none;
    font-size: var(--font-size-md);
    line-height: 1.35;
    transition: color 0.2s;
  }
  .merkliste-item-link:hover,
  .merkliste-item-link:focus-visible {
    color: var(--color-accent);
    text-decoration: underline;
    outline: none;
  }
  .merkliste-item-remove {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    border: none;
    background: transparent;
    color: var(--color-primary-muted);
    cursor: pointer;
    border-radius: var(--radius-sm);
    transition: color 0.2s, background 0.2s;
  }
  .merkliste-item-remove:hover,
  .merkliste-item-remove:focus-visible {
    color: var(--color-accent);
    background: color-mix(in srgb, var(--color-accent) 12%, transparent);
    outline: none;
  }
  .merkliste-item-remove svg { width: 0.85rem; height: 0.85rem; fill: currentColor; }
  /* Dezente Gruppen-Überschrift in der Merkliste (z.B. „Weiterbildungen"). */
  .merkliste-group {
    padding: 0.6rem 0 0.2rem;
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-primary-muted);
  }
  .merkliste-group:first-child { padding-top: 0; }
  .merkliste-empty {
    margin: 0;
    color: var(--color-primary-muted);
    font-size: var(--font-size-sm);
    line-height: 1.4;
    text-align: center;
    padding: 0.5rem 0;
  }

  /* „Diese Seite merken"-Button im Panel-Fuß (Toggle für die aktuelle Seite) */
  .merkliste-panel-foot {
    margin-top: 0.75rem;
    padding-top: 0.75rem;
    border-top: 1px solid color-mix(in srgb, var(--color-primary) 12%, transparent);
  }
  .merkliste-add {
    width: 100%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    min-height: 2.5rem;
    padding: 0.5rem 1rem;
    border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
    border-radius: var(--radius-sm);
    background: var(--color-light);
    color: var(--color-primary);
    font-family: inherit;
    font-size: var(--font-size-md);
    font-weight: 600;
    cursor: pointer;
    transition: background 0.2s, color 0.2s, border-color 0.2s;
  }
  .merkliste-add svg { width: 1.1rem; height: 1.1rem; fill: currentColor; flex-shrink: 0; }
  .merkliste-add:hover,
  .merkliste-add:focus-visible {
    background: var(--color-primary);
    color: var(--color-light);
    border-color: var(--color-primary);
    outline: none;
  }
  /* Gemerkt: akzentuiert (Icon wird via reflectMerk zum gefüllten Herz) */
  .merkliste-add.is-merkt {
    color: var(--color-accent);
    border-color: var(--color-accent);
  }
  .merkliste-add.is-merkt:hover,
  .merkliste-add.is-merkt:focus-visible {
    background: var(--color-accent);
    color: var(--color-light);
    border-color: var(--color-accent);
  }

  @media (prefers-reduced-motion: reduce) {
    .merkliste-panel { transition: none; }
    .merkliste-badge.is-bump { animation: none; }
  }
  /* ≤650: Panel über die volle Breite (sonst zu schmal → verdeckt/abgeschnitten,
     da rechts neben dem Trigger Profil-Icon + CTA-Button stehen). Wrap wird
     static → das Panel verankert sich am `nav` (position: relative, volle
     Viewport-Breite); `top: 100%` = Nav-Unterkante in BEIDEN Scroll-Zuständen. */
  @media (max-width: 650px) {
    .merkliste-wrap { position: static; }
    .merkliste-panel {
      top: 100%;
      left: 0.5rem;
      right: 0.5rem;
      width: auto;
      max-width: none;
      margin-top: 0.5rem;
    }
  }

  /* ─── Info Bar (Keynote) ─── */
  .info-bar-wrapper {
    max-width: 90rem;
    /* !important nötig: zieht die Info-Bar nach oben, damit sie das Hero-Bild
       leicht überlappt — überschreibt eine konkurrierende Margin-Regel im
       Komfort-MQ-Block weiter unten. */
    margin: -4.5rem auto 0 !important;
    position: relative;
    z-index: 2;
  }


  .info-bar-tabs {
    display: inline-flex;
    overflow: hidden;
    position: relative;
    z-index: 1;
    margin-left: -2rem;
  }

  .info-bar {
    background: #1f5b60;
    border-radius: 0 var(--radius-lg) var(--radius-lg) var(--radius-lg);
    overflow: hidden;
    position: relative;
    transition: border-radius 0.35s ease;
    margin: 0 -2rem;
  }

  .info-bar-tab {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.75rem 2rem;
    min-width: 11rem;
    font-size: var(--font-size-md);
    font-weight: 500;
    color: #99b4b7;
    cursor: pointer;
    transition: all 0.25s;
    background: #00444a;
    border: none;
    border-right: 1px solid #1f5b60;
    border-radius: var(--radius-md) var(--radius-md) 0 0;
    font-family: inherit;
    position: relative;
  }

  .info-tab-radio { display: none; }

  .info-bar-tab:last-of-type { border-right: none; }

  .info-bar-tab:hover {
    color: var(--color-light);
  }
  .info-bar-tab:hover svg {
    fill: var(--color-light);
  }

  #tab-online:checked ~ .info-bar-tabs label[for="tab-online"],
  #tab-praesenz:checked ~ .info-bar-tabs label[for="tab-praesenz"],
  #tab-inhouse:checked ~ .info-bar-tabs label[for="tab-inhouse"] {
    background: #1f5b60;
    color: var(--color-light);
  }

  /* Gleitender Aktiv-Indikator unter dem aktiven Tab — CSS-only, anzahl-adaptiv.
     CMS-Abweichung (bei Asset-Resync aus test\design erhalten!): Das Testdesign hatte fix 3 Tabs
     mit festen Translate-Offsets (praesenz=11rem, inhouse=22rem). Im CMS sind die Tabs dynamisch
     (1–3 Stück, je nach Terminen) → die festen Offsets verrutschten bei <3 Tabs.
     Lösung: --ai = aktiver Tab-Index (= Anzahl VORHANDENER Tabs vor dem aktiven), per :has() gesetzt;
     --tab-count = Anzahl gerenderter Tabs (liefert PHP inline). Desktop: feste 11rem-Slots →
     translateX(--ai * 11rem). So gleitet der Strich animiert zum aktiven Tab, egal wie viele da sind. */
  .info-bar-tabs { --ai: 0; }
  .info-bar-wrapper:has(#tab-praesenz:checked):has(#tab-online) .info-bar-tabs { --ai: 1; }
  .info-bar-wrapper:has(#tab-inhouse:checked):has(#tab-online):has(#tab-praesenz) .info-bar-tabs { --ai: 2; }
  .info-bar-wrapper:has(#tab-inhouse:checked):has(#tab-online):not(:has(#tab-praesenz)) .info-bar-tabs { --ai: 1; }
  .info-bar-wrapper:has(#tab-inhouse:checked):not(:has(#tab-online)):has(#tab-praesenz) .info-bar-tabs { --ai: 1; }
  .info-bar-tab-indicator {
    position: absolute;
    bottom: 0;
    left: 2rem;
    height: 2px;
    width: calc(11rem - 4rem);
    background: var(--color-accent);
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    transform: translateX(calc(var(--ai) * 11rem));
    transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    pointer-events: none;
    will-change: transform;
  }
  @media (prefers-reduced-motion: reduce) {
    .info-bar-tab-indicator { transition: none; }
  }

  #tab-online:checked ~ .info-bar #content-online,
  #tab-praesenz:checked ~ .info-bar #content-praesenz,
  #tab-inhouse:checked ~ .info-bar #content-inhouse {
    display: flex;
  }

  .info-bar-tab svg {
    width: 18px;
    height: 18px;
    fill: #99b4b7;
    flex-shrink: 0;
  }

  #tab-online:checked ~ .info-bar-tabs label[for="tab-online"] svg,
  #tab-praesenz:checked ~ .info-bar-tabs label[for="tab-praesenz"] svg,
  #tab-inhouse:checked ~ .info-bar-tabs label[for="tab-inhouse"] svg {
    fill: var(--color-light);
  }

  .info-bar-content {
    display: none;
    align-items: center;
    justify-content: space-between;
    padding: 1.0rem 2rem 1.2rem;
    gap: 1.5rem;
    flex-wrap: wrap;
  }

  .info-bar-item {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    color: var(--color-light);
    font-size: var(--font-size-lg);
  }

  .info-bar-item svg {
    width: 22px;
    height: 22px;
    fill: var(--color-light);
    flex-shrink: 0;
  }

  .info-bar-price {
    font-size: var(--font-size-xl);
    font-weight: 700;
    color: var(--color-light);
    line-height: 1.2;
  }

  .info-bar-label {
    font-weight: 400;
    line-height: 1.3;
  }

  /* ─── CTA Button System ─── */

  .cta-main,
  .cta-secondary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.7rem 1.5rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    font-weight: 600;
    font-family: inherit;
    text-decoration: none;
    cursor: pointer;
    transition: background 0.25s, transform 0.25s ease;
    border: none;
    transform: scale(1);
  }

  /* Einheitliche CTA-Icon-Größe für Primary UND Secondary (Single-Source).
     Kein Inline-style auf CTA-SVGs setzen — sonst weicht das Icon von diesem
     Standard ab (war der Fall beim breadcrumb-wissenswelten-CTA). */
  .cta-main svg,
  .cta-secondary svg {
    width: 1rem;
    height: 1rem;
    flex-shrink: 0;
    fill: currentColor;
  }

  /* btn-cta-wrap trägt .cta-secondary → .cta-secondary svg (0,1,1) würde das
     Phone-Icon auf 1.4rem schrumpfen. Hier zurück auf 28px (ebenfalls 0,1,1,
     spätere Quelle gewinnt); .nav-scrolled .btn-cta-icon (0,2,0) schlägt diese
     Regel weiterhin für den Scroll-Shrink auf 22px. */
  .btn-cta-wrap svg {
    width: 1.2rem;
    height: 1.2rem;
  }

  .cta-main {
    background: var(--color-accent);
    color: var(--cta-text-color, var(--color-light));
  }

  .cta-main:hover {
    /* Kein Farbwechsel im Hover — nur das Scale-Up als Feedback. Mit dunklem CTA-Text
       (--cta-text-color) würde jeder Orange-Shift den Hover-Kontrast verschieben;
       ohne Farbwechsel bleibt er = Ruhe-Kontrast (4,54:1, AA). */
    transform: scale(1.05);
  }
  .cta-main:active { transform: scale(0.98); }

  .cta-secondary {
    background: #1f5b60;
    color: var(--color-light);
    border: none;
  }

  .cta-secondary:hover {
    background: #145258;
    transform: scale(1.05);
  }
  .cta-secondary:active { transform: scale(0.98); }

  /* btn-cta-wrap: Skin von .cta-secondary, aber bespoke Nav-Layout. Steht NACH
     .cta-secondary → schlägt dessen Basis-Layout (gleiche Spezifität 0,1,0, spätere
     Quelle gewinnt). .nav-scrolled .btn-cta-wrap (0,2,0) und der Mobile-Override
     (spätere Quelle) schlagen diese Regel weiter → Scroll-Collapse + Mobile bleiben
     intakt. align-items/cursor/border-radius/color erbt es von .cta-secondary. */
  .btn-cta-wrap {
    display: flex;
    justify-content: flex-start;
    gap: 0.6rem;
    padding: 0.6rem 1.2rem 0.6rem 0.7rem;
    font-weight: 400;
    white-space: nowrap;
    transition: padding 0.4s ease, gap 0.4s ease, background 0.25s ease, transform 0.25s ease;
  }

  @media (prefers-reduced-motion: reduce) {
    .cta-main, .cta-secondary, .btn-cta-wrap { transition: background 0.25s; }
    .cta-main:hover, .cta-secondary:hover, .btn-cta-wrap:hover, .cta-main:active, .cta-secondary:active, .btn-cta-wrap:active,
    .form-field-cta-btn:hover, .form-field-cta-btn:active, .kurs-card-cta:hover { transform: none; }
  }

  .info-bar-cta {
    white-space: nowrap;
    transition: background 0.25s, color 0.3s, transform 0.25s ease;
  }

  /* ─── Sticky Info-Bar-CTA ───────────────────────────────────────────────
     Der vorhandene Info-Bar-Button („Termine anzeigen" bzw. „Angebot
     anfordern") dockt beim Scrollen unter dem Header an — gespiegelt zur
     sticky TOC links. Sobald die Info-Bar unter die Nav scrollt (JS-Detektion
     via IntersectionObserver auf .info-bar-wrapper, rootMargin = -nav-height),
     setzt `body.cta-stuck` den aktiven CTA auf position: fixed an --nav-height.
     Nur der aktive Tab-CTA rendert (inaktive .info-bar-content sind display:none
     → ihre fixierten CTAs bleiben unsichtbar). Beim Hochscrollen wird die Klasse
     entfernt → der CTA kehrt in die Info-Bar zurück.
     CSS-First-Ausnahme: position: sticky scheidet aus, weil der CTA in der
     kurzen .info-bar-content sitzt (Containing Block zu klein, um seitenweit zu
     docken). Daher JS-getriggertes fixed — erlaubt unter „Komplexe
     Positionierung" / etabliertes IntersectionObserver-Muster (kein Reflow). */
  body.cta-stuck .info-bar-cta {
    position: fixed;
    /* Vertikal wie die TOC-Pille (gleiche --nav-height + Offsets unten) */
    top: var(--nav-height);
    /* Rechte Kante = innere rechte content-wrap-Kante → spiegelt die TOC-Pille
       links. `100%` (statt 100vw) = ICB des fixed-Elements (ohne Scrollbar) →
       identische Breitenbasis wie content-wrap. + content-wrap padding (3.5rem > 1536). */
    right: calc(max(0px, (100% - 90rem) / 2) + 3.5rem);
    left: auto;
    z-index: 50;
    /* margin-right: -1.1rem spiegelt den Links-Bleed der gestuckten TOC-Pille
       (margin-left: -1.1rem) → gleicher Abstand zum rechten Rand wie die TOC zum
       linken. Die Box blutet ggf. minimal über den Rand, der Inhalt bleibt dank
       des button-eigenen Horizontal-Paddings sichtbar (genau wie bei der TOC). */
    margin: 0 -1.1rem 0 0;
    /* Höhe exakt wie die 44px-TOC-Pille: weniger Vertikal-Padding als der
       Default-cta-main (0.7rem) + min-height-Klemme (Horizontal-Padding bleibt). */
    padding-top: 0.4rem;
    padding-bottom: 0.4rem;
    min-height: 44px;
    /* Lasche-Optik wie TOC-Pille: oben eckig (klebt an Nav), unten gerundet */
    border-radius: 0 0 var(--radius-sm) var(--radius-sm);
    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
    animation: cta-dock 0.28s ease-out;
  }
  /* Stacking-Fix: Der fixierte CTA ist Kind von .info-bar-wrapper
     (position:relative; z-index:2) → er steckt in dessen Stacking-Context, sein
     z-index:50 zählt global nur als „2", wodurch Sektionen mit höherem z-index
     darüber malen (Text-Überlappung). Im gestuckten Zustand (Wrapper ohnehin
     unter der Nav, unsichtbar) heben wir den Wrapper-Context auf 999 — über allen
     Inhalts-Sektionen (≤50), aber unter Nav (1000) und Mega-Panels (1100). */
  body.cta-stuck .info-bar-wrapper {
    z-index: 999;
  }
  @keyframes cta-dock {
    from { opacity: 0; transform: translateY(-0.5rem); }
    to   { opacity: 1; transform: translateY(0); }
  }
  /* top-Offsets matchen die TOC (Sub-Pixel-Abweichung der scrolled Nav je Stufe) */
  @media (max-width: 1279.98px) {
    body.cta-stuck .info-bar-cta { top: calc(var(--nav-height) - 0.2rem); }
  }
  @media (max-width: 799.98px) {
    body.cta-stuck .info-bar-cta { top: calc(var(--nav-height) - 0.3rem); }
  }
  @media (max-width: 1536px) {
    body.cta-stuck .info-bar-cta { right: calc(max(0px, (100% - 90rem) / 2) + 1.5rem); }
  }
  /* ≤650: content-wrap-Padding (+ Nav-Padding) sinkt auf 0.5rem → rechte
     CTA-Kante nachziehen, damit sie bündig mit dem Content-Rand bleibt
     (spiegelbildlich zur TOC-Pille links). */
  @media (max-width: 650px) {
    body.cta-stuck .info-bar-cta { right: 0.5rem; }
  }
  @media (prefers-reduced-motion: reduce) {
    body.cta-stuck .info-bar-cta { animation: none; }
  }
  /* === Responsive: ≤414 (Smartphone) — TOC + Buchen-Button teilen sich die
     Zeile je 50 %, RANDLOS: beide Pillen reichen bis zum jeweiligen Bildschirm-
     rand und treffen sich exakt in der Bildschirmmitte (W/2) → kein Spalt, kein
     Überlapp. Zusätzlich schmaleres Horizontal-Padding (0.5rem), damit die Labels
     hineinpassen (Texte ~148 / ~158px; halbe Breite bei 360px ≈ 180px → passt mit
     Reserve). Höhe = 44px-TOC-Pille (aus Basis-Regel). Gilt nur bei gedocktem
     Button (body.cta-stuck). === */
  @media (max-width: 414px) {
    body.cta-stuck .info-bar-cta {
      /* füllt die rechte Hälfte randlos: links bis zur Mitte (50% des ICB),
         rechts bündig zum Bildschirmrand (right:0, kein Außen-Rand). 0.5rem
         Horizontal-Padding (statt cta-main 1.5rem) → „Termine anzeigen" passt
         ohne Überlauf. Höhe aus der Basis-Regel. */
      left: 50%;
      right: 0;
      margin-right: 0;
      padding-left: 0.5rem;
      padding-right: 0.5rem;
    }
    /* TOC füllt die linke Hälfte randlos: width = halbe Bildschirmbreite
       (calc(50% + 0.5rem) kompensiert das content-wrap-Padding), margin-left
       -0.5rem schiebt die Pille bis zum linken Bildschirmrand; ihre rechte Kante
       endet exakt in der Mitte = linke CTA-Kante (kein Spalt, kein Überlapp). */
    body.cta-stuck .toc-section { display: flex; width: calc(50% + 0.5rem); margin-left: -0.5rem; }
    body.cta-stuck .toc-section .toc-dropdown { flex: 1; }
    /* width:100% füllt die Spalte; margin-left:0 hebt den -1.1rem-Bleed der
       gestuckten Pille auf; padding 0.5rem (statt 1.25rem) schafft Platz für
       „Inhaltsverzeichnis"; justify-content:center zentriert Label + Chevron
       wie im 50%-CTA-Button daneben (.cta-main/.cta-secondary nutzen ebenfalls
       justify-content:center). Zweiter Selektor schlägt den Firefox-Fallback
       `.toc-section.is-stuck .toc-toggle` (0,3,0) per Spezifität (0,4,1). */
    body.cta-stuck .toc-toggle,
    body.cta-stuck .toc-section.is-stuck .toc-toggle { width: 100%; margin-left: 0; padding-left: 0.5rem; padding-right: 0.5rem; justify-content: center; }
  }

  /* === Responsive: ≤1280 (Kompakt — Info-Bar-Content) === */
  @media (max-width: 1279.98px) {
    .info-bar-item svg { width: clamp(18px, 12px + 1.5vw, 22px); height: clamp(18px, 12px + 1.5vw, 22px); }
  }

  /* === Responsive: <650 (Extra-Stufe — Info-Bar) ===
     Tab-Icons werden ausgeblendet, Tabs nutzen flex: 1 1 0 → gleich breite Slots (100%/--tab-count).
     Der gleitende Indikator wird hier per `left` (container-relativ) statt translateX positioniert,
     da die Slotbreite prozentual ist; --ai/--tab-count wie auf dem Desktop. */
  @media (max-width: 650px) {
    .info-bar-tab svg { display: none; }
    .info-bar-tab {
      min-width: 0;
      flex: 1 1 0;
      padding: 0.75rem 0.5rem;
      font-size: var(--font-size-md);
    }
    .info-bar-tabs { display: flex; }
    .info-bar-tab-indicator {
      width: calc(100% / var(--tab-count, 3) - 2rem);
      left: calc(var(--ai) * (100% / var(--tab-count, 3)) + 1rem);
      transform: none;
      transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    }
    .info-bar-content { gap: 1rem; }
  }

  /* ─── Toolbar: TOC (sticky, floated left) + Share (floated right) ─── */
  /* Trick: margin statt padding für den Top-Abstand, damit das im stuck-State
     nicht ins Spiel kommt. `position: sticky` orientiert sich an der Border-Box,
     margin liegt OUTSIDE → wird beim Andocken effektiv ignoriert, die Pille
     sitzt sauber an `top:` ohne Phantom-Abstand. */
  .toc-section,
  .share-section {
    margin: 1.75rem 0 0.75rem;
    font-size: var(--font-size-md);
    min-height: 44px; /* matched zu .action-icon-Höhe für vertikale Ausrichtung TOC ↔ Icons */
    display: flex;
    align-items: center;
  }
  .toc-section {
    /* inline-flex + width:max-content statt float:left — siehe Mozilla Bug
       1781297: die Kombi `float:left` + `position:sticky` triggert in Firefox
       einen rekursiven Reflow-Loop, der Phantom-Layout-Space injiziert (Seite
       wächst beim Scrollen auf >1M px). Da nur die Sticky-Element-eigene
       Float-Kombi den Bug auslöst, reicht es, die TOC inline statt floated
       zu setzen — Share-Section bleibt float:right, sitzt durch DOM-Reihenfolge
       (TOC inline vor Share float) auf derselben Zeile. Sticky funktioniert
       weiter (Containing Block bleibt .content-wrap), klebt bis zum Footer. */
    display: inline-flex;
    width: max-content;
    vertical-align: top;
    position: sticky;
    /* Default: Lasche klebt direkt an Nav-Unterkante (kein Gap). Pro Breakpoint
       leicht negativer Offset, weil die Sub-Pixel-Genauigkeit der scrolled
       Nav-Höhe je Layout-Stufe minimal abweicht. */
    top: var(--nav-height);
    z-index: 50;
    /* scroll-state Container für stuck-Detection — saubere CSS-only Erkennung,
       wann die sticky toc-section tatsächlich an `top:` gedockt ist. */
    container-type: scroll-state;
  }
  @media (max-width: 1279.98px) {
    .toc-section { top: calc(var(--nav-height) - 0.2rem); }
  }
  @media (max-width: 799.98px) {
    .toc-section { top: calc(var(--nav-height) - 0.3rem); }
  }
  .share-section {
    float: right;
  }
  .toc-section a,
  .share-section a {
    color: var(--color-primary);
    text-decoration: none;
    transition: opacity 0.2s;
  }
  .toc-section a:hover,
  .share-section a:hover { text-decoration: underline; }

  /* Secondary-CTA in TOC-Panel/Share behält seinen Standard-Skin: heller Text,
     kein Underline — auch im Hover/Focus. Die generischen Link-Hover-Regeln
     (.toc-panel a:hover / .toc-section a:hover → accent-Farbe + underline)
     dürfen den Button nicht umfärben. Spezifität 0,3,1 schlägt die a:hover-Regeln
     (0,2,1); der Hover-Skin (BG-Abdunklung + scale) kommt weiter von .cta-secondary:hover.
     transition hier mitziehen (Spezifität 0,2,1 schlägt `.toc-panel a{transition:color 0.2s}`
     bzw. `.toc-section a,.share-section a{transition:opacity}` 0,1,1): sonst überschreiben
     diese generischen a-Regeln den .cta-secondary-Übergang (0,1,0) → Background/Scale beim
     Hover springen ohne Animation (Betreiber-Bug 2026-06-26 „Wissenswelten-Button: Hover-
     Transition fehlt wie beim Secondary-Button"). */
  .share-section a.cta-secondary,
  .toc-panel a.cta-secondary,
  .share-section a.cta-secondary:hover,
  .toc-panel a.cta-secondary:hover,
  .share-section a.cta-secondary:focus-visible,
  .toc-panel a.cta-secondary:focus-visible {
    color: var(--color-light);
    text-decoration: none;
    transition: background 0.25s, transform 0.25s ease;
  }
  .toc-panel .breadcrumb-wissenswelten {
    /* display:flex (block-level) + width:fit-content + margin auto = horizontal zentriert;
       align-items:center zentriert das Chevron-Icon vertikal. Ohne dies erbt der Button von
       `.toc-panel a{display:block}` (höhere Spezifität als .cta-secondary) ein display:block →
       das SVG fällt auf vertical-align:baseline und sitzt zu hoch (Betreiber-Bug 2026-06-15). */
    display: flex;
    align-items: center;
    margin: 1rem auto 0;
    width: fit-content;
  }

  /* ─── Content ─── */
  .content {
    max-width: 90rem;
    margin: 0 auto;
    padding: 1rem 3.5rem 4rem;
  }
  .content-wrap {
    max-width: 90rem;
    margin: 0 auto;
    padding: 0 3.5rem;
  }
  .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
  .content-wrap #einleitung { margin-top: 0; }
  .content-wrap > section:not(:first-of-type):not(.toc-section):not(.share-section) { margin-top: 8rem; }
  /* Alle Sektionen nach der Float-Toolbar räumen die Floats auf — die erste
     räumt visuell, alle weiteren sind ohnehin bereits unterhalb. Robust gegen
     beliebige Sektions-Reihenfolge (z.B. via Preset). */
  .content-wrap > section:not(.toc-section):not(.share-section) { clear: both; }

  /* === Responsive: ≤1280 (Kompakt — Sektions-Abstand) === */
  @media (max-width: 1279.98px) {
    .content-wrap > section:not(:first-of-type):not(.toc-section):not(.share-section) { margin-top: 5rem; }
  }
  /* Eine Sektion DIREKT nach der TOC-/Share-Toolbar bekommt KEINEN 8rem/5rem-Topabstand
     (Betreiberwunsch 2026-06-15) — die Toolbar bringt ihren eigenen unteren Abstand mit.
     Spezifität (0,4,1) = die obigen Regeln; steht in der Quelle DANACH (auch nach der
     ≤1280-Media-Query) → gewinnt bei allen Breiten. #einleitung behält seinen ID-Wert. */
  .content-wrap > .toc-section + section:not(.toc-section):not(.share-section),
  .content-wrap > .share-section + section:not(.toc-section):not(.share-section) { margin-top: 0; }

  /* === Responsive: ≤1536 (Komfort-Modus) ===
     Bei Bildschirmen ≤1536px (alle außer extra-breiten Monitoren):
       - .content-wrap verliert seitliches Innenpadding (3.5rem → 1.5rem) für mehr nutzbare Breite
       - .nav reduziert seitliches Padding (3.5rem → 1.5rem) für mehr nutzbare Breite
       - .hero bricht full-bleed bis zum Viewport-Rand aus (statt 3.5rem Abstand)
       - .hero > img klebt direkt am Viewport-Rand (right: 0 statt max()-Offset)
       - .hero-card bekommt margin-left 1.5rem (statt max()-basiertem Auto-Center)
       - .info-bar-wrapper bekommt seitlichen 1.5rem-Margin statt auto-Centering
     Oberhalb 1536px bleibt das ursprüngliche Layout mit großzügigem Außenrand. */
  @media (max-width: 1536px) {
    .content-wrap {
      padding: 0 1.5rem;
    }
    .nav {
      padding: 1rem 1.5rem;
    }
    .hero {
      width: 100vw;
      margin-left: calc(-50vw + 50%);
    }
    .hero > img {
      right: 0;
    }
    .hero-card {
      margin-left: 1.5rem;
    }
    @media (max-width: 1279.98px) {
      .hero-card {
        margin-left: auto;
        margin-right: auto;
      }
    }
    .info-bar-wrapper {
      margin: -4.5rem 2rem 0 !important;
    }
  }



  /* ─── Table of Contents Dropdown ─── */
  .toc-dropdown {
    position: relative;
  }

  .toc-toggle {
    background: none;
    border: none;
    font-family: inherit;
    font-size: var(--font-size-lg);
    font-weight: 600;
    color: var(--color-primary);
    cursor: pointer;
    display: flex;
    align-items: center;
    padding: 0;
    min-height: 44px; /* matched zu .action-icon-Höhe für vertikale Ausrichtung TOC ↔ Icons */
    transition: color 0.2s, background 0.3s ease, border-radius 0.3s ease, padding 0.3s ease, box-shadow 0.3s ease;
  }
  .toc-toggle:hover {
    color: var(--color-accent);
  }
  .toc-toggle svg {
    transition: transform 0.25s ease;
  }
  .toc-dropdown.open .toc-toggle svg {
    transform: rotate(180deg);
  }

  /* "Stuck"-Styling — Toggle wird zur schwebenden teal Pille, sobald
     die toc-section tatsächlich an `top:` gedockt ist. Pure CSS via
     @container scroll-state(stuck: top) — moderne CSS-only "actually
     stuck" Detection (Baseline 2025). */
  @container scroll-state(stuck: top) {
    .toc-toggle {
      background: var(--color-primary);
      color: var(--color-light);
      /* Gedockt = medium (kompaktere Pille, deckungsgleich mit dem Sticky-CTA);
         ungedockt bleibt large (Basis-.toc-toggle). */
      font-size: var(--font-size-md);
      padding: 0.5rem 1.25rem;
      /* Lasche-Optik: oben eckig (klebt an Nav-Unterkante), unten abgerundet */
      border-radius: 0 0 var(--radius-sm) var(--radius-sm);
      box-shadow: 0 2px 12px rgba(0,0,0,0.15);
      /* Im stuck-State leicht nach links rausziehen, sodass die Pille bündig
         mit dem äußeren Nav-Padding-Rand sitzt statt eingerückt im content-wrap.
         margin-left statt left/position:relative — einfacher, keine
         Stacking-Context-Komplikation. */
      margin-left: -1.1rem;
    }
    .toc-dropdown.open .toc-toggle {
      /* Im offenen Zustand: alle 4 Ecken eckig, damit das Panel darunter
         nahtlos andockt (Panel selbst hat den Bottom-Radius). */
      border-radius: 0;
      box-shadow: none;
    }
    /* Gedockt + offen: Panel bündig links mit der nach links gezogenen Pille
       (Toggle hat margin-left:-1.1rem) — Betreiberwunsch 2026-06-15. Nur ≥651px:
       bei ≤650 ist die TOC gestapelt/zentriert und das Panel geht full-bleed (s.u.). */
    @media (min-width: 651px) {
      .toc-dropdown.open .toc-panel { left: -1.1rem; }
    }
    .toc-toggle:hover {
      color: var(--color-accent);
    }
  }
  /* Fallback für Browser ohne scroll-state Container Queries (insbesondere
     Firefox — CQ Level 2 noch nicht unterstützt). Trigger: .toc-section.is-stuck,
     präzise per JS gesetzt, sobald die toc-section tatsächlich an `top:` gedockt
     ist (getBoundingClientRect().top <= sticky-top). Ersetzt den früheren
     .nav-scrolled-Proxy, der schon bei scrollY > 50 — also lange VOR dem
     Andocken — den teal Hintergrund zeigte (Firefox-Bug). @supports not (...)
     scopt die Regel auf Browser ohne scroll-state, damit Chrome/Edge weiterhin
     die native Detection nutzen und das JS dort gar nicht erst läuft. */
  @supports not (container-type: scroll-state) {
    .toc-section.is-stuck .toc-toggle {
      background: var(--color-primary);
      color: var(--color-light);
      font-size: var(--font-size-md); /* gedockt = medium, ungedockt = large (Basis) */
      padding: 0.5rem 1.25rem;
      border-radius: 0 0 var(--radius-sm) var(--radius-sm);
      box-shadow: 0 2px 12px rgba(0,0,0,0.15);
      margin-left: -1.1rem;
    }
    .toc-section.is-stuck .toc-dropdown.open .toc-toggle {
      border-radius: 0;
      box-shadow: none;
    }
    /* Gedockt + offen: Panel bündig links mit der Pille (margin-left:-1.1rem). Nur ≥651px. */
    @media (min-width: 651px) {
      .toc-section.is-stuck .toc-dropdown.open .toc-panel { left: -1.1rem; }
    }
    .toc-section.is-stuck .toc-toggle:hover {
      color: var(--color-accent);
    }
  }

  .toc-panel {
    position: absolute;
    top: 100%;
    left: 0;
    margin-top: 0;
    background: var(--color-light);
    border-radius: 0 var(--radius-sm) var(--radius-sm) var(--radius-sm);
    border-right: 3px solid var(--color-accent);
    padding: 0 1.5rem;
    width: max-content;
    max-width: calc(100vw - 2rem);
    box-shadow: 0 8px 24px rgba(0,0,0,0);
    z-index: 1000;
    list-style: none;
    max-height: 0;
    opacity: 0;
    overflow: hidden;
    transition: max-height 0.35s ease, opacity 0.25s ease, padding 0.35s ease, box-shadow 0.35s ease;
    pointer-events: none;
  }
  .toc-dropdown.open .toc-panel {
    max-height: min(calc(100vh - 6rem), 60rem);
    opacity: 1;
    padding: 1.25rem 1.5rem;
    box-shadow: 0 8px 24px rgba(0,0,0,0.12);
    pointer-events: auto;
    overflow-y: auto;
  }

  .toc-panel ol {
    list-style: decimal;
    padding: 0 0 0 1.25rem;
    margin: 0;
  }
  .toc-panel li {
    margin-bottom: 0.5rem;
    padding-left: 0.25rem;
  }
  .toc-panel li:last-child {
    margin-bottom: 0;
  }
  .toc-panel li::marker {
    color: var(--color-primary);
    font-weight: 600;
  }
  .toc-panel a {
    color: var(--color-accent);
    text-decoration: none;
    font-size: var(--font-size-md);
    line-height: 1.4;
    display: block;
    transition: color 0.2s;
  }
  .toc-panel a:hover {
    color: var(--color-accent);
    text-decoration: underline;
  }

  /* === Responsive: ≤650 (Extra-Stufe — Toolbar-Stack) ===
     Bei schmalen Bildschirmen passen TOC + 9 Share-Icons nicht mehr
     nebeneinander. Floats deaktivieren → Sections stapeln vertikal,
     beide mittig (TOC bleibt sticky, im ungedockten Zustand zentriert). */
  @media (max-width: 650px) {
    .toc-section,
    .share-section {
      float: none;
      width: 100%;
    }
    /* Share ist nie sticky → bedingungslos mittig (zentriert .actions im
       full-width Section). */
    .share-section {
      justify-content: center;
      margin-top: 0;
    }
    .share-section .actions {
      justify-content: center;
      display: flex;
    }
    /* TOC nur im NICHT-gedockten Zustand zentrieren: gedockt (body.cta-stuck)
       behält die Pille ihren Links-Bleed (toggle margin-left:-1.1rem) bzw. die
       50/50-Teilung mit dem Sticky-CTA (≤414) — Zentrieren würde sie sonst aus
       der linken Nav-Kante in die Mitte schieben. */
    body:not(.cta-stuck) .toc-section {
      justify-content: center;
    }
    /* Kein font-size-Override mehr (war medium): gestapelt + ungedockt bleibt
       das Toggle large (Basis-.toc-toggle); gedockt wird es weiterhin medium
       über @container scroll-state(stuck) bzw. den .is-stuck-Fallback. */
    .toc-dropdown .toc-panel {
      width: 100vw;
      max-width: 100vw;
      border-radius: 0 0 var(--radius-sm) var(--radius-sm);
    }
    /* Ungedockt (gestapelt + zentriert): Panel über die GESAMTE Bildschirmbreite — full bleed.
       Der Dropdown ist hier viewport-zentriert, daher setzt left:50% + margin-left:-50vw die
       linke Kante exakt an den Bildschirmrand (Betreiberwunsch 2026-06-15). Gedockt behält die
       links-bündige Pillen-Ausrichtung (≥651px), bei ≤650 bleibt es bei left:0. */
    body:not(.cta-stuck) .toc-dropdown .toc-panel {
      left: 50%;
      margin-left: -50vw;
    }
  }

  .content p, .content-wrap p {
    font-size: var(--font-size-lg);
    line-height: 1.6;
    color: var(--color-primary);
    margin-bottom: 1.25rem;
  }

  /* ─── Section: Keynotes ─── */
  #keynotes {
    padding-top: 0;
  }

  .keynote-grid-top {
    display: grid;
    grid-template-columns: minmax(400px, 440px) 1fr;
    gap: 2rem;
  }

  /* === Responsive: ≤1280 (Keynotes) ===
     Grid wechselt von 2-Spalten (Badge + Karten) auf 1-Spalte:
     Open Badge oben, Karten gestapelt darunter. */
  @media (max-width: 1279.98px) {
    .keynote-grid-top {
      grid-template-columns: 1fr;
    }
  }

  /* ─── Unified Notch + Dot System ─── */
  .has-notch {
    --padding-x: var(--padding);
    --padding-top: 1.5rem;
    --title-notch-gap: 1rem;
    --dot-size: 2.5rem;
    --notch-size: 3.5rem;
    --dot-offset: 0;
    --notch-bg: var(--color-light);
    --dot-bg: var(--color-icon);
    --mask-pos: 0% 100%;
    position: relative;
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
  }

  .has-notch > .notch {
    --notch-exposure: calc(var(--notch-size) - var(--dot-size));
    position: absolute;
    top: 0;
    right: 0;
    display: flex;
    align-items: flex-start;
    justify-content: flex-end;
    min-width: var(--notch-size);
    min-height: var(--notch-size);
    box-sizing: border-box;
    background-color: var(--notch-bg);
    border-bottom-left-radius: var(--radius-sm);
    padding: 0 0 var(--notch-exposure) var(--notch-exposure);
    z-index: 3;
  }

  .has-notch > .notch::before,
  .has-notch > .notch::after {
    content: "";
    position: absolute;
    width: var(--radius-sm);
    height: var(--radius-sm);
    background-color: var(--notch-bg);
    -webkit-mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-sm), black calc(var(--radius-sm) + 0.03125rem));
    mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-sm), black calc(var(--radius-sm) + 0.03125rem));
  }

  .has-notch > .notch::before { top: 0; left: calc(var(--radius-sm) * -1); }
  .has-notch > .notch::after { right: 0; bottom: calc(var(--radius-sm) * -1); }

  .has-notch > .notch > .dot {
    position: relative;
    top: var(--dot-offset);
    right: var(--dot-offset);
    min-width: var(--dot-size);
    min-height: var(--dot-size);
    height: var(--dot-size);
    margin: 0;
    border-radius: var(--radius-sm);
    background-color: var(--dot-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-primary);
    z-index: 2;
    padding: 0 0.9rem;
    white-space: nowrap;
    font-weight: 700;
    font-size: var(--font-size-md);
  }

  .has-notch > .notch > .dot svg {
    width: 1.2rem;
    height: 1.2rem;
    display: block;
    fill: currentColor;
  }

  /* Icon-only dot (enthält nur ein svg): Padding strippen, damit das svg im Dot-Quadrat zentriert ist */
  .has-notch > .notch > .dot:has(> svg):not(:has(> :not(svg))) {
    padding: 0;
  }

  /* is-left: Notch klappt nach links */
  .has-notch.is-left {
    --mask-pos: 100% 100%;
    padding: var(--has-notch-padding, 2.5rem);
    padding-top: var(--has-notch-padding-top, calc(var(--notch-size) + 1rem));
  }

  .has-notch.is-left > .notch {
    left: 0;
    right: auto;
    justify-content: flex-start;
    padding: 0 var(--notch-exposure) var(--notch-exposure) 0;
    border-bottom-left-radius: 0;
    border-bottom-right-radius: var(--radius-sm);
  }

  .has-notch.is-left > .notch::before { left: auto; right: calc(var(--radius-sm) * -1); }
  .has-notch.is-left > .notch::after { right: auto; left: 0; }

  .has-notch.is-left > .notch > .dot {
    right: auto;
    left: var(--dot-offset);
  }

  /* === Responsive: ≤650 (Extra-Stufe — Notch-Padding) === */
  @media (max-width: 650px) {
    .has-notch,
    .has-notch.is-left,
    .has-notch.keynote-card {
      --padding-x: 1rem;
      padding-inline: var(--padding-x);
    }
  }

  /* dot-outside: Dot ragt über die Kante des Rechtecks hinaus */
  .has-notch.dot-outside { --dot-offset: -0.7rem; }

  /* is-bottom-right: Notch sitzt unten rechts, Dot-Farbe wird Accent */
  .has-notch.is-bottom-right {
    --mask-pos: 0% 0%;
    --dot-bg: var(--color-accent);
  }
  .has-notch.is-bottom-right > .notch {
    top: auto;
    bottom: 0;
    right: 0;
    align-items: flex-end;
    justify-content: flex-end;
    padding: var(--notch-exposure) 0 0 var(--notch-exposure);
    border-bottom-left-radius: 0;
    border-top-left-radius: var(--radius-sm);
  }
  .has-notch.is-bottom-right > .notch::before {
    top: auto;
    bottom: 0;
    left: calc(var(--radius-sm) * -1);
  }
  .has-notch.is-bottom-right > .notch::after {
    right: 0;
    bottom: auto;
    top: calc(var(--radius-sm) * -1);
  }
  .has-notch.is-bottom-right > .notch > .dot {
    top: auto;
    bottom: var(--dot-offset);
    right: var(--dot-offset);
    transform-origin: bottom right;
    transition:
      transform 0.35s cubic-bezier(0.22, 1, 0.36, 1),
      border-radius 0.35s ease;
    will-change: transform;
  }

  /* is-bottom-right Hover (Single-Source): Dot wächst auf Notch-Größe (×1.4) und
     verschmilzt mit der Notch, die Concave-Pseudos faden aus. Gilt generisch für
     .card.is-bottom-right, .mega-card.has-notch UND jeden weiteren Block mit
     .has-notch.is-bottom-right (z.B. .termine-keynotes-teaser). */
  .has-notch.is-bottom-right > .notch::before,
  .has-notch.is-bottom-right > .notch::after {
    transition: opacity 0.15s ease;
  }
  .has-notch.is-bottom-right:hover > .notch > .dot {
    transform: scale(1.4);
    border-radius: calc(var(--radius-sm) / 1.4) 0 calc(var(--radius-sm) / 1.4) 0;
  }
  .has-notch.is-bottom-right:hover > .notch::before,
  .has-notch.is-bottom-right:hover > .notch::after {
    opacity: 0;
    transition: opacity 0.2s ease 0.15s;
  }

  /* Keynote-Card: box-styling (padding, background, float-reserve) */
  .keynote-card {
    --notch-reserve-x: calc(var(--notch-size) - var(--padding) + 0.55rem);
    --notch-reserve-y: calc(var(--notch-size) - var(--padding-top) + var(--title-notch-gap));
    border: 0;
    padding: var(--padding-top) var(--padding) var(--padding);
    display: flex;
    flex-direction: column;
    min-height: 100%;
    overflow: visible;
    cursor: pointer;
    transition: transform 0.35s ease, box-shadow 0.35s ease;
  }
  .keynote-card:hover {
    transform: translateY(-6px);
    box-shadow: 0 12px 32px rgba(0, 68, 74, 0.12);
  }
  /* Dot wächst auf Notch-Größe, Pseudo-Rundungen blenden aus → Dot+Notch verschmelzen */
  .keynote-card > .notch > .dot {
    transform-origin: top right;
    transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), border-radius 0.35s ease;
    will-change: transform;
  }
  .keynote-card > .notch::before,
  .keynote-card > .notch::after {
    transition: opacity 0.15s ease;
  }
  .keynote-card:hover > .notch > .dot {
    transform: scale(1.4);
    border-radius: 0 calc(var(--radius-sm) / 1.4) 0 calc(var(--radius-sm) / 1.4);
  }
  .keynote-card:hover > .notch::before,
  .keynote-card:hover > .notch::after {
    opacity: 0;
    transition: opacity 0.2s ease 0.15s;
  }
  .keynote-card-link {
    position: absolute;
    inset: 0;
    z-index: 4;
    border-radius: var(--radius-sm);
    text-decoration: none;
    color: inherit;
  }

  .keynote-card-inner {
    position: relative;
    z-index: 1;
    display: flow-root;
    flex: 1;
    min-width: 0;
    min-height: 100%;
    overflow: hidden;
  }

  .keynote-card-inner::before {
    content: "";
    float: right;
    width: var(--notch-reserve-x);
    height: var(--notch-reserve-y);
    shape-outside: inset(0);
    shape-margin: 0.2rem;
    margin-left: 1.2rem;
    margin-bottom: 0.2rem;
  }

  .keynote-card.is-left .keynote-card-inner::before {
    float: left;
    margin-right: 1.2rem;
    margin-left: 0;
  }

  .keynote-card h3 {
    font-size: var(--font-size-xl);
    font-weight: 700;
    color: var(--color-primary);
    margin: 0 0 2rem;
    line-height: 1.3;
  }

  /* Keynote-Karte mit Info-Icon (z.B. Verpflegung): das .keynote-card-inner bildet einen
     eigenen Stacking-Context (z-index:1) und läge sonst UNTER dem .keynote-card-link (z-index:4)
     → Info-Icon nicht hover-/klickbar. Inner über den Link heben, aber per pointer-events:none
     Flächen-Klicks weiter auf den Link durchreichen; nur das Info-Icon fängt Pointer-Events. */
  .keynote-card--has-info .keynote-card-inner {
    z-index: 5;
    pointer-events: none;
  }
  .keynote-card--has-info .keynote-card-inner .tooltip-icon {
    pointer-events: auto;
  }
  .keynote-card h3 .tooltip-icon {
    font-size: var(--font-size-md); /* Info-Icon kleiner als der xl-Titel */
  }
  /* Gleiches Tap-Target-Problem wie beim Termine-Teaser: das Info-Icon liegt über dem
     ganzflächigen .keynote-card-link → Hitbox auf ≥48px aufblähen, Icon-Optik + Heading-
     Zeilenhöhe per negativem Margin unverändert lassen. */
  .keynote-card--has-info h3 .tooltip-icon {
    --tt-hit: 50px;
    box-sizing: content-box;
    width: 1em;
    height: 1em;
    padding: calc((var(--tt-hit) - 1em) / 2);
    margin: calc((1em - var(--tt-hit)) / 2);
    transform: none;
  }

  .keynote-card p {
    margin-bottom: 0;
  }

  .keynote-side-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 2rem;
  }

  .keynote-card-bottom-media {
    /* Bleed bis Kartenkante via --padding-x (folgt Parent-Padding auch responsiv),
       cap'd bei 440px. Bei cap zentriert über (100% - 440px) / 2 — max() verhindert,
       dass das Element über die Kartenkante hinausragt.
       margin-top: auto schiebt das Bild im Flex-Column-Container ans Karten-Ende,
       auch wenn die Karte durch gestapelte Nachbarn höher gestreckt wird. */
    position: relative;
    width: min(440px, calc(100% + 2 * var(--padding-x)));
    margin-top: auto;
    margin-inline: max(calc(-1 * var(--padding-x)), calc((100% - 440px) / 2));
    margin-bottom: calc(-1 * var(--padding));
    border-radius: 0 0 var(--radius-sm) var(--radius-sm);
    overflow: hidden;
  }
  .keynote-card-bottom-img {
    display: block;
    width: 100%;
    height: auto;
  }
  .keynote-card-bottom-svg {
    position: absolute;
    top: 25%;
    left: 39.5%;
    width: 50%;
    height: auto;
    transform: perspective(900px) rotateY(-15deg) rotateX(5deg) rotate(2deg);
    transform-origin: center;
  }
  .keynote-card:has(> .keynote-card-bottom-media) .keynote-card-inner {
    flex: 0 1 auto;
    min-height: 0;
  }

  /* ─── Info-Tile (Komponente) ─── */

  .info-tile {
    flex: 0 0 auto;
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    padding: 1.5rem;
    border-radius: var(--radius-sm);
    color: var(--color-primary);
    background: var(--color-light);
  }

  .info-tile--dark {
    background: var(--color-primary);
    color: var(--color-light);
  }

  .info-tile-headline {
    align-self: flex-start;
    font-size: var(--font-size-xl);
    font-weight: 800;
    line-height: 1.1;
    color: var(--color-primary);
    background: var(--color-icon);
    padding: 0.2em 0.2em;
    box-decoration-break: clone;
    -webkit-box-decoration-break: clone;
    letter-spacing: -0.02em;
    margin-bottom: 0.75rem;
  }

  .info-tile-title {
    font-size: var(--font-size-md);
    font-weight: 700;
    line-height: 1.3;
    color: inherit;
    position: relative;
    z-index: 2;
  }

  .info-tile-bg-icon {
    position: absolute;
    right: -0.6rem;
    bottom: -0.9rem;
    width: 5.5rem;
    height: 5.5rem;
    opacity: 0.12;
    pointer-events: none;
    z-index: 1;
  }

  .info-tile--dark .info-tile-bg-icon {
    fill: var(--color-light);
    opacity: 0.18;
  }

  .info-tile:not(.info-tile--dark) .info-tile-bg-icon {
    fill: var(--color-primary);
  }

  /* ─── Info-Tile: Headline zentriert, Titel ausklappbar (Smartphone) ───
     Auf ≤414px zeigt jede Tile nur die zentrierte Headline; das dekorative SVG
     bleibt ausgeblendet. Der Titel-Text ist per Tap (Hover-Trigger via
     cursor:pointer, wie bei #nutzen) aufklappbar (max-height/opacity-Accordion)
     → SEO-sauber, da der Text interaktiv erreichbar bleibt. Padding 0.5rem. */
  @media (max-width: 414px) {
    .info-tile {
      align-items: center;
      text-align: center;
      cursor: pointer;
      padding: 0.5rem;
      -webkit-tap-highlight-color: transparent;
    }
    .info-tile-bg-icon {
      display: none;           /* dekoratives SVG bleibt raus */
    }
    .info-tile-headline {
      align-self: center;      /* überschreibt flex-start */
      margin-bottom: 0;
    }
    /* Titel eingeklappt */
    .info-tile-title {
      max-height: 0;
      opacity: 0;
      overflow: hidden;
      transition: max-height 0.35s ease, opacity 0.3s ease, margin-top 0.35s ease;
    }
    /* Erste Berührung / Hover → Titel einblenden */
    .info-tile:hover .info-tile-title {
      max-height: 16rem;
      opacity: 1;
      margin-top: 0.5rem;
    }
    /* Chevron-Indikator rechts neben der Headline, dreht beim Aufklappen.
       Absolut positioniert (Tile ist position:relative); top auf Headline-
       Mitte (≈1.7rem ab Tile-Oberkante) + translateY(-50%) zentriert vertikal. */
    .info-tile::after {
      content: "";
      position: absolute;
      top: 1.7rem;
      right: 0.75rem;
      width: 0.5rem;
      height: 0.5rem;
      border-right: 2px solid var(--color-accent);
      border-bottom: 2px solid var(--color-accent);
      transform: translateY(-50%) rotate(45deg);
      transition: transform 0.3s ease;
    }
    .info-tile:hover::after {
      transform: translateY(-50%) rotate(-135deg);
    }
  }
  @media (max-width: 414px) and (prefers-reduced-motion: reduce) {
    .info-tile-title,
    .info-tile::after { transition: none; }
  }


  .has-notch > .notch-subtitle {
    font-size: var(--font-size-xl);
    font-weight: 700;
    color: var(--color-primary);
    margin: 0 0 1.5rem;
    line-height: 1.25;
  }

  /* ─── .bullet-list ─── Wiederverwendbare Liste mit kleinem, quadratisch-
     abgerundetem Teal-Bullet. Verschachtelte `li > ul > li` bekommen automatisch
     eine gedämpfte Bullet-Farbe (über --bullet-bg). */
  .bullet-list {
    --bullet-bg: var(--color-primary);
    list-style: none;
  }
  .bullet-list li {
    position: relative;
  }
  .bullet-list li::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.45em;
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 0.15rem;
    background: var(--bullet-bg);
    z-index: 2;
  }
  .bullet-list li > ul > li::before {
    --bullet-bg: color-mix(in srgb, var(--color-primary), white 50%);
  }

  /* ─── Section: Termine ─── */
  #termine {
    position: relative;
    overflow: hidden;
    padding: 4rem 0;
    background-color: var(--color-primary);
    /* full-bleed: aus content-wrap ausbrechen */
    width: 100vw;
    margin-left: calc(-50vw + 50%);
  }

  .termine-content {
    position: relative;
    z-index: 3;
    max-width: 90rem;
    margin: 0 auto;
    padding: 0 3.5rem;
  }
  /* === Responsive: ≤1536 (Komfort — Termine-Content) === */
  @media (max-width: 1536px) {
    .termine-content { padding: 0 1.5rem; }
  }
  /* === Responsive: ≤650 (Schmal-Stack — Termine-Content) === */
  @media (max-width: 650px) {
    .termine-content { padding: 0 0.5rem; }
  }

  .termine-title {
    color: var(--color-light);
    text-align: center;
    margin-bottom: 3rem;
  }

  h2 {
    display: inline-block;
    font-size: 2rem;
    font-weight: 700;
    margin-bottom: 1.5rem;
  }

  .section-heading {
    text-align: center;
    line-height: 2.5rem;
    margin-bottom: 3rem;
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  .section-heading .logo-icon {
    width: 48px;
    height: 48px;
    margin-bottom: 1rem;
  }
  .section-heading .logo-icon path,
  .section-heading .logo-icon rect {
    fill: var(--color-primary);
  }

  .site-footer h2 {
    display: block;
    background-image: none;
    -webkit-text-fill-color: currentColor;
  }

  .termine-filters {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 1.75rem;
  }

  .filter-button {
    background: #1f5b60;
    border: none;
    border-radius: var(--radius-sm);
    padding: 0.35rem 1rem;
    color: var(--color-light);
    font-size: var(--font-size-md);
    font-weight: 600;
    cursor: pointer;
    transition: all 0.25s;
    font-family: inherit;
    white-space: nowrap;
    /* element-unabhängiger Reset (defensiv). Die Such-Tags sind wieder <button> wie im
       Testdesign (2026-06-27, SEO: KEINE crawlbaren <a href="…?q=Tag">-Links mehr; Klick
       via JS, s. Blocks\SearchTags + main.js JS Block 5). Bei Asset-Resync erhalten! */
    text-decoration: none;
  }

  .filter-button:hover {
    background: rgba(255, 255, 255, 0.08);
  }

  .filter-button.active {
    background: var(--color-light);
    color: var(--color-primary);
  }

  .filter-button {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
  }

  .termine-inhouse-btn {
    padding: 0.7rem 1.5rem;
    font-size: var(--font-size-md);
  }

  .termine-inhouse-btn:hover {
    background: #145258;
  }

  /* Vertikaler Trenner zwischen Action-Icon-Gruppen in der Toolbar */
  .actions .action-divider {
    flex: none;
    width: 2px;
    height: 28px;
    background: #c8c4bc; /* 20% dunkler als --color-light (#FAF5EB) */
    margin: 0 0.5rem;
  }

  .filter-icon {
    width: 16px;
    height: 16px;
    fill: var(--color-light);
    flex-shrink: 0;
  }

  .filter-button.active .filter-icon {
    fill: var(--color-primary);
  }

  .termine-layout {
    display: flex;
    flex-wrap: wrap;
    gap: 2rem;
    align-items: flex-start;
  }

  .termine-left {
    flex: 1;
    min-width: 0;
    align-self: stretch;        /* füllt die Zeilenhöhe (= rechte Aside-Spalte) → Buttons docken unten an */
    display: flex;
    flex-direction: column;
  }

  .termine-list {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
    max-height: calc(7 * 53px + 6 * 1.5rem);
    overflow-y: auto;
    padding-right: 0.5rem;
    scrollbar-color: var(--color-primary) rgba(255, 255, 255, 0.08);
    scrollbar-width: thin;
  }
  /* Shared dark-theme scrollbar (Termine-Views: list / year-scaffold / stepper) */
  .termine-list::-webkit-scrollbar,
  .termine-year-scaffold::-webkit-scrollbar,
  .stepper-list::-webkit-scrollbar { width: 8px; }
  .termine-list::-webkit-scrollbar-track,
  .termine-year-scaffold::-webkit-scrollbar-track,
  .stepper-list::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.06); border-radius: 4px; }
  .termine-list::-webkit-scrollbar-thumb,
  .termine-year-scaffold::-webkit-scrollbar-thumb,
  .stepper-list::-webkit-scrollbar-thumb { background: var(--color-primary); border-radius: 4px; }

  @media (max-width: 1279.98px) {
    .termine-list {
      grid-template-columns: 1fr;
    }
  }

  .termin-card {
    display: flex;
    align-items: center;
    background: rgba(255, 255, 255, 0.07);
    border-radius: var(--radius-sm);
    padding: 0.55rem 1.25rem;
    gap: 1.25rem;
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    cursor: pointer;
  }

  .termin-card:hover {
    background: rgba(255, 255, 255, 0.14);
  }

  .termin-card.selected {
    background: var(--color-light);
    color: var(--color-primary);
  }

  .termin-card.selected .termin-date {
    color: var(--color-primary);
  }

  .termin-card.selected .termin-days,
  .termin-card.selected .termin-location {
    color: var(--color-primary);
  }

  .termin-card.selected .termin-location svg,
  .termin-card.selected .termin-type-icon {
    fill: var(--color-primary);
  }

  .termin-dot { display: none; }

  .termin-card:has(.termin-dot.frei)       { border-left: 0.5rem solid var(--color-icon); }
  .termin-card:has(.termin-dot.wenig)      { border-left: 0.5rem solid var(--color-accent); }
  .termin-card:has(.termin-dot.ausgebucht) { border-left: 0.5rem solid rgba(255, 255, 255, 0.25); }

  /* Ausgewählte Karte = cremefarbener Grund: die gedämpfte weiße „ausgebucht"-/keine-Platzgarantie-
     Kante (nur auf dem dunklen Grund sichtbar) sonst unsichtbar → hier auf ein gedämpftes Teal umstellen. */
  .termin-card.selected:has(.termin-dot.ausgebucht) { border-left-color: rgba(0, 68, 74, 0.3); }

  .termin-type-icon {
    width: 20px;
    height: 20px;
    fill: var(--color-icon);
    flex-shrink: 0;
  }

  .termin-date {
    font-size: var(--font-size-md);
    font-weight: 500;
    color: var(--color-light);
    white-space: nowrap;
  }

  .termin-date-wrap {
    display: flex;
    flex-direction: column;
  }

  .termin-days {
    font-size: var(--font-size-sm);
    /* 0.65 alpha auf der teal Termin-Section ergibt Contrast Ratio 4.82:1
       (knapp über WCAG AA-Schwelle 4.5:1). 0.45 davor war 3.15:1 — zu niedrig.
       Bleibt visuell subtiler als .termin-location (0.7). */
    color: rgba(255, 255, 255, 0.65);
    white-space: nowrap;
  }

  .termin-card-cta {
    text-decoration: none;
    cursor: pointer;
    border: 1px dashed rgba(255, 255, 255, 0.25);
    transition: background 0.2s, border-color 0.2s;
  }

  .termin-card-cta:hover {
    background: rgba(255, 255, 255, 0.12);
    border-color: rgba(255, 255, 255, 0.25);
  }

  .termin-card-cta .termin-days {
    white-space: normal;
  }

  .termin-location {
    font-size: var(--font-size-md);
    color: rgba(255, 255, 255, 0.7);
    display: flex;
    align-items: center;
    gap: 0.3rem;
    margin-left: auto;
  }

  .termin-location svg {
    width: 14px;
    height: 14px;
    fill: var(--color-icon);
    flex-shrink: 0;
  }

  .termine-legend {
    display: flex;
    justify-content: center;
    gap: 1.25rem;
    margin-top: 1rem;
    padding-top: 0.75rem;
  }

  .legend-item {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: var(--font-size-sm);
    /* 0.62 statt 0.55: hebt Kontrast gegen den dunklen Teal-BG von 4,44:1 auf ~5,2:1
       (WCAG AA ≥ 4,5:1 für Kleintext). Optisch weiterhin gedimmt. */
    color: rgba(255, 255, 255, 0.62);
  }

  .legend-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
  }

  .legend-dot.frei { background: var(--color-icon); }
  .legend-dot.wenig { background: var(--color-accent); }
  .legend-dot.ausgebucht { background: rgba(255, 255, 255, 0.25); }

  /* Wrapper dockt unten in der linken Spalte an (Desktop) → füllt den sonst leeren Platz neben der rechten Aside-Spalte.
     In ALLEN Termin-Ansichten sichtbar (Liste/Jahr/Karte/Stepper). */
  .termine-more-wrap {
    margin-top: auto;
  }

  .termine-more {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    margin-top: 1.25rem;
  }

  .termine-more-btn {
    padding: 0.5rem 1.75rem;
    border-radius: var(--radius-sm);
    border: 1.5px solid rgba(255, 255, 255, 0.3);
    background: rgba(255, 255, 255, 0.06);
    color: var(--color-light);
    font-size: var(--font-size-md);
    font-weight: 500;
    cursor: pointer;
    transition: all 0.2s;
    font-family: inherit;
  }

  .termine-more-btn:hover {
    background: rgba(255, 255, 255, 0.15);
    border-color: rgba(255, 255, 255, 0.5);
  }

  /* Right column: Sidebar (Mein Seminar) + Inklusivleistungen-Teaser */
  .termine-side {
    width: 300px;
    flex-shrink: 0;
    align-self: stretch;        /* Spalte füllt die Zeilenhöhe (= linke Terminliste) → bis nach unten */
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    min-width: 0;
  }

  .termine-sidebar {
    --notch-bg: var(--color-primary);
    --has-notch-padding: 1.5rem;
    background: var(--color-light);
    /* Größe/Position liegen jetzt auf .termine-side; Aside bleibt inhaltshoch */
  }

  .sidebar-title {
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-primary);
    line-height: 1.3;
    margin-bottom: 1.25rem;
  }

  .sidebar-details {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    margin-bottom: 1rem;
  }

  .sidebar-detail {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    font-size: var(--font-size-md);
    color: var(--color-primary);
  }

  .sidebar-detail svg {
    width: 20px;
    height: 20px;
    fill: var(--color-primary);
    flex-shrink: 0;
  }

  .sidebar-detail-label {
    font-size: var(--font-size-md);
    line-height: 1.3;
  }

  .sidebar-detail-label strong {
    display: block;
    font-weight: 600;
  }

  .sidebar-price-row {
    display: flex;
    align-items: last baseline;
    justify-content: center;
    gap: 0.4rem;
    margin-bottom: 0.2rem;
  }

  .sidebar-price {
    font-size: var(--font-size-xl);
    font-weight: 700;
    color: var(--color-primary);
  }

  .sidebar-price-sub {
    font-size: var(--font-size-sm);
    color: var(--color-primary-muted);
  }

  .sidebar-cta {
    width: 100%;
  }

  /* Inklusivleistungen-Block (füllt den Rest der rechten Spalte) */
  .termine-keynotes-teaser {
    --notch-bg: var(--color-primary); /* Notch wirkt wie der teal Section-BG, der durch die cremefarbene Karte „durchscheint" (wie bei Vorkurs) */
    flex: 1 1 auto;             /* füllt den verbleibenden Platz bis zur Unterkante der linken Liste */
    min-height: 0;
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
    background: var(--color-light);
    border-radius: var(--radius-sm);
    padding: 1.5rem;
    color: var(--color-primary);
    transition: transform 0.35s ease, box-shadow 0.35s ease; /* Hover-Lift wie .mega-card.has-notch */
  }
  .termine-keynotes-teaser:hover {
    transform: translateY(-4px);
    box-shadow: 0 10px 28px rgba(0, 0, 0, 0.25); /* dunkler Schatten, da Karte auf teal Section-BG sitzt */
  }

  .termine-keynotes-teaser-head {
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-primary);
  }

  .termine-keynotes-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.7rem;
  }

  .termine-keynotes-list li {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    font-size: var(--font-size-md);
    line-height: 1.25;
    color: var(--color-primary);
  }

  /* Leitendes Leistungs-Icon (direktes li-Kind) — das Info-Icon im .tooltip-icon-Button bleibt unberührt (1em) */
  .termine-keynotes-list li > svg {
    width: 20px;
    height: 20px;
    fill: var(--color-primary);
    flex-shrink: 0;
  }

  /* Link-Overlay macht die ganze Inklusivleistungen-Karte klickbar (→ #keynotes).
     Tooltip-Buttons liegen mit höherem z-index darüber und bleiben bedienbar. */
  .termine-keynotes-teaser-link {
    position: absolute;
    inset: 0;
    z-index: 4;
    border-radius: var(--radius-sm);
    text-decoration: none;
  }
  .termine-keynotes-teaser-link:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
  }
  .termine-keynotes-list .tooltip-icon {
    position: relative;
    z-index: 5;
    /* Tap-Target auf 48×48px vergrößern (Lighthouse „tap-targets" verlangt das, weil der kleine
       Button das ganzflächige Link-Overlay überlappt) OHNE Icon-Optik oder Zeilenhöhe zu ändern:
       Padding bläht nur die Hit-/Klickbox auf, negativer Margin nimmt den Platz im Flex-Layout
       wieder zurück (Flex misst die Margin-Box → Zeile bleibt 1em hoch). margin-left erhält den
       schmalen Abstand zum Text. */
    --tt-hit: 50px;
    box-sizing: content-box;
    width: 1em;
    height: 1em;
    padding: calc((var(--tt-hit) - 1em) / 2);
    margin: calc((1em - var(--tt-hit)) / 2) calc((1em - var(--tt-hit)) / 2) calc((1em - var(--tt-hit)) / 2) calc(-0.35rem + (1em - var(--tt-hit)) / 2);
    transform: none;
  }
  /* Live-Online-Termin ausgewählt → „Getränke & Mittagessen" entfällt (kein Catering vor Ort) */
  .termine-keynotes-teaser.is-online .termine-keynotes-list li[data-presence-only] {
    display: none;
  }

  /* Participants slider */
  .sidebar-detail-participants {
    display: flex;
    align-items: center;
    gap: 0.6rem;
  }

  .participants-count {
    font-size: var(--font-size-md);
    font-weight: 700;
    color: var(--color-primary);
    min-width: 1.2rem;
    text-align: center;
  }

  .participants-slider {
    -webkit-appearance: none;
    appearance: none;
    flex: 1;
    height: 4px;
    border-radius: var(--radius-sm);
    background: rgba(0, 0, 0, 0.15);
    outline: none;
    cursor: pointer;
  }

  .participants-slider::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--color-icon);
    cursor: pointer;
    border: 2px solid var(--color-primary);
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
    transition: transform 0.15s;
  }

  .participants-slider::-webkit-slider-thumb:hover {
    transform: scale(1.15);
  }

  .participants-slider::-moz-range-thumb {
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--color-icon);
    cursor: pointer;
    border: 2px solid var(--color-primary);
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
  }

  .participants-discount {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    margin-bottom: 0.75rem;
    font-size: var(--font-size-md);
    color: var(--color-primary);
    font-weight: 600;
    border-radius: var(--radius-sm);
  }

  .participants-discount svg {
    width: 16px;
    height: 16px;
    fill: var(--color-primary);
    flex-shrink: 0;
    display: none;
  }

  .participants-discount strong {
    font-weight: 700;
  }

  .participants-discount.hidden {
    display: none;
  }

  .participants-discount.active {
    background: var(--color-primary);
    color: var(--color-icon);
    padding: 0.45rem 0.75rem;
    font-size: var(--font-size-md);
  }

  .participants-discount.active svg {
    display: block;
    fill: var(--color-icon);
  }

  /* ─── Sidebar card-switch animations ─── */

  @keyframes sb-row-out {
    from { opacity: 1; transform: translateY(0); }
    to   { opacity: 0; transform: translateY(6px); }
  }

  @keyframes sb-row-in {
    from { opacity: 0; transform: translateY(-8px); }
    to   { opacity: 1; transform: translateY(0); }
  }

@keyframes sb-cta-nudge {
    0%   { transform: scale(1); box-shadow: 0 0 0 0 rgba(230, 255, 42, 0); }
    50%  { transform: scale(1.06); box-shadow: 0 0 12px 2px rgba(230, 255, 42, 0.4); }
    100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(230, 255, 42, 0); }
  }

  @keyframes sb-date-highlight {
    0%   { background-size: 0% 100%; }
    20%  { background-size: 100% 100%; }
    75%  { background-size: 100% 100%; }
    100% { background-size: 0% 100%; }
  }

  .sidebar-detail-label.sb-animating-out {
    animation: sb-row-out 0.25s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
  }

  .sidebar-detail-label.sb-animating-in {
    animation: sb-row-in 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
  }

.sidebar-cta.sb-nudge {
    animation: sb-cta-nudge 0.4s cubic-bezier(0.16, 1, 0.3, 1);
  }

  .sidebar-detail-label.sb-date-flash {
    background-image: linear-gradient(90deg, rgb(230, 255, 42) 0%, rgb(230, 255, 42) 100%);
    background-repeat: no-repeat;
    background-position: left center;
    background-size: 0% 100%;
    animation: sb-date-highlight 1s ease 0.2s both;
    border-radius: 3px;
    padding: 1px 4px;
    margin: -1px -4px;
  }

  @media (prefers-reduced-motion: reduce) {
    .sidebar-detail-label.sb-animating-out,
    .sidebar-detail-label.sb-animating-in,
    .sidebar-cta.sb-nudge,
    .sidebar-detail-label.sb-date-flash {
      animation: none;
    }
  }

  /* ─────────────────────────────────────────── */
  /*  Termine: View Switcher + Alternative Views */
  /* ─────────────────────────────────────────── */

  .termine-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 3rem;
    flex-wrap: wrap;
  }

  .termine-header .termine-title {
    margin: 0;
    text-align: left;
  }

  .termine-viewswitch {
    display: inline-flex;
    align-items: stretch;
    background: #1f5b60;
    border: none;
    border-radius: var(--radius-sm);
    padding: 4px;
    gap: 2px;
    height: 44px;
    box-sizing: border-box;
    margin-left: auto;
    margin-right: 0;
    flex-shrink: 0;
  }

  .view-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 100%;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: var(--radius-sm);
    color: rgba(255, 255, 255, 0.7);
    font: inherit;
    cursor: pointer;
    transition: background 0.2s, color 0.2s, transform 0.15s;
  }

  .view-btn span { display: none; }

  .view-btn:hover { color: var(--color-light); background: rgba(255,255,255,0.08); }
  .view-btn:active { transform: scale(0.9); }

  .view-btn.active {
    background: var(--color-light);
    color: var(--color-primary);
    box-shadow: 0 2px 8px rgba(0,0,0,0.2);
  }

  .view-btn .view-icon {
    width: 22px;
    height: 22px;
    fill: var(--color-light);
    flex-shrink: 0;
    transition: fill 0.2s;
  }

  .view-btn.active .view-icon { fill: var(--color-primary); }

  /* Scaffolds hidden by default */
  .termine-year-scaffold,
  .termine-map-scaffold,
  .termine-stepper-scaffold { display: none; }

  /* Filters visible in list + year view */
  .termine-left[data-view="map"]     .termine-filters,
  .termine-left[data-view="stepper"] .termine-filters { display: none; }

  .termine-left[data-view="year"]    .termine-list,
  .termine-left[data-view="map"]     .termine-list,
  .termine-left[data-view="stepper"] .termine-list { display: none; }

  .termine-left[data-view="year"]    .termine-year-scaffold    { display: block; }
  .termine-left[data-view="map"]     .termine-map-scaffold     { display: flex; }
  .termine-left[data-view="stepper"] .termine-stepper-scaffold { display: flex; }

  /* ═══ Year view (full calendar) ═══ */
  .termine-year-scaffold {
    max-height: calc(7 * 53px + 6 * 1.5rem);
    overflow-y: auto;
    padding-right: 0.5rem;
    scrollbar-color: var(--color-primary) rgba(255, 255, 255, 0.08);
    scrollbar-width: thin;
  }
  .year-section { margin-bottom: 1.25rem; }
  .year-section:last-child { margin-bottom: 0; }
  .year-section-head {
    color: var(--color-light);
    font-weight: 700;
    font-size: var(--font-size-lg);
    margin: 0.5rem 0;
    padding-left: 0.25rem;
    letter-spacing: 0.02em;
  }

  .termine-year-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 0.9rem;
  }
  /* === Responsive: Year-Grid Stufen ===
     Default 4 Spalten → ≤1280 3 Spalten → ≤900 (Extra-Stufe) 2 Spalten → ≤414 1 Spalte */
  @media (max-width: 1279.98px) { .termine-year-grid { grid-template-columns: repeat(3, 1fr); } }
  @media (max-width: 900px)  { .termine-year-grid { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 650px)  { .termine-year-grid { grid-template-columns: 1fr; } }
  .year-month.is-row-past { display: none; }

  .year-month {
    background: rgba(255, 255, 255, 0.05);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: var(--radius-md);
    padding: 0.6rem 0.55rem 0.7rem;
    min-width: 0;
  }

  .month-head {
    color: var(--color-light);
    font-weight: 700;
    font-size: var(--font-size-sm);
    margin-bottom: 0.4rem;
    padding: 0 0.15rem;
  }

  .month-grid {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 1px;
    font-size: var(--font-size-sm);
    font-variant-numeric: tabular-nums;
  }

  .month-day {
    text-align: center;
    color: rgba(255, 255, 255, 0.82);
    border-radius: var(--radius-sm);
    position: relative;
    aspect-ratio: 1 / 1;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .month-day.is-empty { color: transparent; }
  .month-day.is-weekend:not(.has-termin) { color: rgba(255, 255, 255, 0.42); background: rgba(255, 255, 255, 0.04); }

  .month-day.is-past { opacity: 0.28; text-decoration: line-through; }
  .month-day.is-today {
    outline: 2px solid var(--color-light);
    outline-offset: 1px;
    font-weight: 700;
    z-index: 1;
  }

  .month-day.has-termin {
    cursor: pointer;
    font-weight: 700;
    color: var(--color-primary);
    transition: transform 0.18s, box-shadow 0.18s;
  }
  .month-day.termin-frei       { background: var(--color-icon); }
  .month-day.termin-wenig      { background: var(--color-accent); color: var(--color-light); }
  .month-day.termin-ausgebucht { background: rgba(255, 255, 255, 0.35); color: var(--color-primary); }

  /* Merge consecutive termin days into a single pill */
  .month-day.has-termin.continues-right {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
  }
  .month-day.has-termin.continues-left {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
  }
  /* Bridge the 1px grid gap with a tinted box-shadow matching the termin status */
  .month-day.termin-frei.continues-right       { box-shadow: 2px 0 0 0 var(--color-icon); }
  .month-day.termin-wenig.continues-right      { box-shadow: 2px 0 0 0 var(--color-accent); }
  .month-day.termin-ausgebucht.continues-right { box-shadow: 2px 0 0 0 rgba(255, 255, 255, 0.35); }

  .month-day.has-termin:hover,
  .month-day.has-termin.is-hover-group {
    filter: brightness(1.12);
    z-index: 2;
  }
  .month-day.has-termin.is-past { opacity: 0.4; }
  .month-day.is-selected { z-index: 3; }
  .month-day.is-selected::before {
    content: '';
    position: absolute;
    inset: -3px;
    border: 2px solid var(--color-light);
    border-radius: calc(var(--radius-sm) + 1px);
    pointer-events: none;
    box-sizing: border-box;
  }
  .month-day.is-selected.continues-right::before {
    border-right: 0;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
  }
  .month-day.is-selected.continues-left::before {
    border-left: 0;
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
  }

  /* ═══ Map view ═══ */
  .termine-map-scaffold {
    display: none;
    flex-direction: row;
    gap: 1.25rem;
    align-items: flex-start;
    justify-content: center;
    position: relative;
  }

  .map-wrap {
    flex: 0 1 487px;
    max-width: 487px;
    position: relative;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: var(--radius-md);
    padding: 1rem;
    overflow: hidden;
    transition: flex 0.35s ease;
  }

  .termine-map-scaffold.is-city-open {
    justify-content: flex-start;
  }

  .map-svg { width: 100%; height: auto; display: block; }

  .map-country { fill: rgba(255, 255, 255, 0.08); stroke: rgba(255, 255, 255, 0.28); stroke-width: 0.6; stroke-linejoin: round; transition: fill 0.25s; }

  .map-pin {
    transition: transform 0.2s;
    transform-origin: center;
    transform-box: fill-box;
    outline: none;
  }
  .map-pin:focus, .map-pin:focus-visible, .map-pin:active {
    outline: none;
  }
  .map-pin.has-termine { cursor: pointer; }
  .map-pin.has-termine:hover { transform: scale(1.15); }

  .map-pin-dot {
    fill: var(--color-light);
    transition: transform 0.15s;
    transform-origin: center;
    transform-box: fill-box;
  }
  .map-pin.has-termine:hover .map-pin-dot {
    transform: scale(1.3);
  }
  .map-pin.is-empty { cursor: default; }
  .map-pin.is-empty .map-pin-dot {
    fill: rgba(255,255,255,0.35);
  }

  .map-pin-label {
    fill: var(--color-light);
    font-size: 7.5px;
    font-weight: 600;
    text-anchor: middle;
    paint-order: stroke;
    stroke: var(--color-primary);
    stroke-width: 2.5;
    stroke-linejoin: round;
  }
  .map-pin.is-empty .map-pin-label {
    font-size: 6.5px;
    opacity: 0.7;
  }

  .map-pin-count-bg {
    fill: var(--color-accent);
  }
  .map-pin-count {
    fill: var(--color-light);
    font-size: 6px;
    font-weight: 700;
    text-anchor: middle;
  }

  .map-pin.has-termine:hover .map-pin-label {
    fill: var(--color-icon);
    stroke: var(--color-primary);
  }
  .map-pin.has-termine:hover .map-pin-count-bg {
    fill: color-mix(in srgb, var(--color-accent), white 20%);
  }

  .map-pin-online-bg {
    fill: var(--color-primary);
    stroke: rgba(255, 255, 255, 0.25);
    stroke-width: 0.6;
    transition: fill 0.2s;
  }
  .map-pin-online-label {
    fill: var(--color-light);
    font-size: 6.5px;
    font-weight: 700;
    text-anchor: middle;
    dominant-baseline: central;
    stroke: none;
    paint-order: normal;
  }
  .map-pin.map-pin-online.has-termine:hover .map-pin-online-bg {
    fill: color-mix(in srgb, var(--color-primary), white 15%);
  }
  .map-pin.map-pin-online.has-termine:hover .map-pin-online-label {
    fill: var(--color-icon);
  }
  .map-pin.map-pin-online.is-empty { opacity: 0.7; }

  .map-city-panel {
    flex: 1;
    min-width: 240px;
    background: rgba(255, 255, 255, 0.06);
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: var(--radius-md);
    padding: 1rem;
    display: none;
    flex-direction: column;
    gap: 0.75rem;
    animation: panel-slide-right 0.35s cubic-bezier(0.25, 0.8, 0.25, 1);
  }
  .termine-map-scaffold.is-city-open .map-city-panel { display: flex; }

  @keyframes panel-slide-right {
    from { transform: translateX(40px); opacity: 0; }
    to   { transform: translateX(0);    opacity: 1; }
  }

  .map-city-panel-head {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid rgba(255,255,255,0.1);
  }
  .map-city-back {
    background: rgba(255, 255, 255, 0.08);
    border: 1px solid rgba(255, 255, 255, 0.15);
    border-radius: var(--radius-sm);
    color: var(--color-light);
    width: 32px;
    height: 32px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background 0.2s, transform 0.15s;
    flex-shrink: 0;
  }
  .map-city-back:hover { background: var(--color-accent); transform: translateX(-2px); }
  .map-city-back svg { width: 14px; height: 14px; fill: currentColor; transform: rotate(180deg); }

  .map-city-title {
    color: var(--color-light);
    font-size: var(--font-size-lg);
    font-weight: 700;
    flex: 1;
  }
  .map-city-count {
    color: var(--color-icon);
    font-size: var(--font-size-sm);
    font-weight: 600;
  }

  .map-city-list {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
  }
  .map-city-list .termin-card {
    padding: 0.35rem 0.75rem;
    gap: 0.75rem;
    view-transition-name: none !important;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    transition: none !important;
  }
  .map-city-list .termin-date {
    font-size: var(--font-size-sm);
  }
  .map-city-list .termin-location {
    display: none;
  }

  .map-city-empty {
    color: rgba(255, 255, 255, 0.6);
    text-align: center;
    padding: 1.5rem 1rem;
    font-size: var(--font-size-md);
    line-height: 1.5;
  }

  .map-city-empty a {
    color: var(--color-icon);
    text-decoration: underline;
    font-weight: 600;
  }

  /* === Responsive: ≤1280 (Kompakt — Termine-Map) ===
     Map + City-Panel stapeln früh, sonst wird die Karte zu klein.
     Pin-Labels werden bei kleinerer SVG-Darstellung schwer lesbar — Font-Sizes
     in SVG-User-Units anheben. Hardcoded bw=12/14, bh=9 in der JS-Badge-Logik
     erlauben ~25% Bump für .map-pin-count ohne Overflow. */
  @media (max-width: 1279.98px) {
    .termine-map-scaffold { flex-direction: column; align-items: center; }
    .map-wrap { max-width: 100%; }
    .map-city-panel { max-width: 100%; width: 100%; }
    .map-pin-label { font-size: 10px; }
    .map-pin.is-empty .map-pin-label { font-size: 9px; }
    .map-pin-count { font-size: 7.5px; }
    .map-pin-online-label { font-size: 8px; text-rendering: geometricPrecision; }
  }

  /* ═══ Stepper view ═══ */
  .termine-stepper-scaffold {
    display: none;
    flex-direction: column;
    gap: 1.5rem;
  }

  .stepper-progress {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.25rem 1rem;
  }
  .stepper-step {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex: 1;
    opacity: 0.55;
    transition: opacity 0.3s;
  }
  .stepper-step.is-active { opacity: 1; }
  .stepper-step.is-done   { opacity: 0.85; }

  .stepper-circle {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background: rgba(255,255,255,0.1);
    border: 2px solid rgba(255,255,255,0.2);
    color: var(--color-light);
    font-weight: 700;
    font-size: var(--font-size-md);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition: all 0.3s;
  }
  .stepper-step.is-active .stepper-circle {
    background: var(--color-accent);
    border-color: var(--color-accent);
    color: var(--color-light);
    box-shadow: 0 0 0 4px rgba(255,119,88,0.25);
  }
  .stepper-step.is-done .stepper-circle {
    background: var(--color-icon);
    border-color: var(--color-icon);
    color: var(--color-primary);
  }
  .stepper-label {
    color: var(--color-light);
    font-size: var(--font-size-md);
    font-weight: 600;
    white-space: nowrap;
  }
  .stepper-connector {
    flex: 1;
    height: 2px;
    background: rgba(255,255,255,0.15);
    border-radius: 1px;
    min-width: 10px;
  }
  .stepper-step.is-done + .stepper-connector { background: var(--color-icon); }

  .stepper-panel {
    display: none;
    flex-direction: column;
    gap: 1rem;
    animation: step-fade-in 0.35s cubic-bezier(0.25, 0.8, 0.25, 1);
  }
  .stepper-panel.is-active { display: flex; }

  @keyframes step-fade-in {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
  }

  .stepper-title {
    color: var(--color-light);
    font-size: var(--font-size-lg);
    font-weight: 700;
    margin-bottom: 0.25rem;
  }
  .stepper-subtitle {
    color: rgba(255,255,255,0.6);
    font-size: var(--font-size-md);
    margin-bottom: 0.5rem;
  }

  .stepper-tiles {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
    gap: 0.75rem;
  }

  .stepper-tile {
    background: rgba(255,255,255,0.06);
    border: 2px solid transparent;
    border-radius: var(--radius-md);
    padding: 1.1rem 1rem;
    color: var(--color-light);
    font: inherit;
    font-weight: 600;
    font-size: var(--font-size-md);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.4rem;
    cursor: pointer;
    text-align: center;
    transition: border-color 0.2s, transform 0.2s, box-shadow 0.2s;
  }
  .stepper-tile:hover {
    background: rgba(255,255,255,0.11);
    border-color: var(--color-icon);
    transform: translateY(-2px);
  }
  .stepper-tile.is-selected {
    background: var(--color-light);
    color: var(--color-primary);
    border-color: var(--color-light);
  }
  .stepper-tile svg {
    width: 22px;
    height: 22px;
    fill: var(--color-icon);
  }
  .stepper-tile.is-selected svg { fill: var(--color-accent); }
  .stepper-tile-count {
    font-size: var(--font-size-sm);
    font-weight: 500;
    opacity: 0.75;
  }
  .stepper-tile.is-selected .stepper-tile-count { opacity: 0.65; }

  [data-panel="1"] .stepper-tiles {
    grid-template-columns: repeat(2, minmax(180px, 220px));
    justify-content: center;
    gap: 1.25rem;
  }
  [data-panel="1"] .stepper-tile {
    padding: 1.8rem 1.5rem;
    font-size: var(--font-size-lg);
    gap: 0.6rem;
  }
  [data-panel="1"] .stepper-tile svg {
    width: 32px;
    height: 32px;
  }
  /* === Responsive: ≤650 (Schmal-Stack — Stepper-Panel-1-Tiles kompakter) === */
  @media (max-width: 650px) {
    [data-panel="1"] .stepper-tiles {
      grid-template-columns: repeat(2, minmax(0, 1fr));
      gap: 0.75rem;
    }
    [data-panel="1"] .stepper-tile {
      padding: 1rem 0.75rem;
      font-size: var(--font-size-md);
      gap: 0.4rem;
    }
    [data-panel="1"] .stepper-tile svg {
      width: 24px;
      height: 24px;
    }
  }

  .stepper-list {
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
    max-height: 480px;
    overflow-y: auto;
    padding-right: 0.5rem;
    scrollbar-color: var(--color-primary) rgba(255, 255, 255, 0.08);
    scrollbar-width: thin;
  }
  .stepper-list .termin-card {
    view-transition-name: none !important;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    transition: none !important;
  }

  .stepper-nav {
    display: flex;
    justify-content: flex-end;
    gap: 0.75rem;
    margin-top: 0.5rem;
  }
  .stepper-btn:disabled { opacity: 0.35; cursor: not-allowed; }
  .stepper-btn[data-nav="back"]:disabled { display: none; }
  .stepper-btn[data-nav="back"] { margin-right: auto; }
  .stepper-btn svg { vertical-align: middle; }

  /* Sidebar always sticks, even in alternative views */
  .termine-left[data-view="map"],
  .termine-left[data-view="stepper"] {
    min-height: 560px;
  }

  /* Reduced motion */
  @media (prefers-reduced-motion: reduce) {
    .map-city-panel,
    .stepper-panel {
      animation: none;
    }
    .termin-card { view-transition-name: none !important; }
  }

  .group-discount-hint {
    font-size: var(--font-size-sm);
    color: var(--color-primary);
    text-align: center;
    margin-bottom: 0.5rem;
    font-weight: 600;
  }

  .group-discount-hint.hidden {
    display: none;
  }

  .sidebar-price-detail {
    font-size: var(--font-size-sm);
    color: rgba(0, 0, 0, 0.55);
    text-align: center;
    margin-bottom: 1.25rem;
  }

  .sidebar-price-detail:empty {
    margin-bottom: 1rem;
  }

  .sidebar-price-stack {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
  }

  .sidebar-price-orig {
    font-size: var(--font-size-sm);
    color: var(--color-primary-muted);
    text-decoration: line-through;
    margin-bottom: 0.1rem;
  }

  .sidebar-price-orig:empty {
    display: none;
  }

  .sidebar-price-saved {
    color: var(--color-accent);
    font-weight: 600;
  }

  /* ─── Section: Bewertungen (merged with Referenzen) ─── */
  #bewertungen {
    /* KEIN Sektion-Hintergrund – Body-Light (--color-light) scheint durch */
  }

  .bewertungen-grid {
    display: grid;
    grid-template-columns: 1fr 22rem;
    gap: 1.5rem;
    margin-top: 2.5rem;
    align-items: stretch;
  }

  /* ── Testimonial-Karussell (linke Spalte) ──
     Läuft über die generische initCarousel-Factory: 1 Slide sichtbar, schlicht
     (kein Peek/Scale wie Empfehlungen). Die Karte füllt die Spaltenhöhe (= Sidebar)
     via Flex-Kette; Dots (Füll-Pillen) sitzen unter dem Viewport. */
  .bewertung-carousel {
    display: flex;
    flex-direction: column;
    min-width: 0;
  }
  .bewertung-viewport {
    flex: 1 1 auto;
    display: flex;
  }
  .bewertung-track {
    flex: 1 1 100%;
    /* min-width:0 ist Pflicht: als Flex-Item im Flex-Viewport hätte der Track sonst
       min-width:auto und würde auf seine (überlaufende) Slide-Content-Breite wachsen
       (> Viewport). Dann wären die Slides breiter als der cqw-basierte Translate-Schritt
       → versetzte/überlappende Karten. min-width:0 hält den Track auf Viewport-Breite. */
    min-width: 0;
    transform: translateX(calc(var(--slide-index) * -100cqw));
  }
  .bewertung-slide {
    flex: 0 0 100%;
    box-sizing: border-box;
    display: flex;
    min-width: 0;
  }
  .bewertung-slide > .bewertung-card {
    flex: 1;
    width: 100%;
    min-width: 0;
  }

  /* ── Testimonial-Karte ── */
  .bewertung-card {
    --card-bg: var(--color-light-contrast);
    --notch-bg: var(--color-light);
    --dot-size: 5rem;         /* 2× von 2.5rem default */
    --notch-size: 6.4rem;     /* dot + 1.4rem Exposure (vorher 2rem, jetzt 30% kleiner) */
    background: var(--card-bg);
    border-radius: var(--radius-md);
    padding: var(--padding);
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    min-height: 22rem;
  }

  .bewertung-card .notch > .dot svg {
    fill: var(--color-primary);
    width: 3rem;              /* 2× von 1.5rem default */
    height: 3rem;
  }

  /* Notch + Dot nach links unten verschoben, mit --radius-md statt Default --radius-sm */
  .bewertung-card {
    --mask-pos: 100% 0%;
  }
  .bewertung-card > .notch {
    top: auto;
    bottom: 0;
    left: 0;
    right: auto;
    align-items: flex-end;
    justify-content: flex-start;
    padding: var(--notch-exposure) var(--notch-exposure) 0 0;
    border-bottom-left-radius: 0;
    border-top-right-radius: var(--radius-md);
  }
  .bewertung-card > .notch::before,
  .bewertung-card > .notch::after {
    width: var(--radius-md);
    height: var(--radius-md);
    -webkit-mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-md), black calc(var(--radius-md) + 0.03125rem));
    mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-md), black calc(var(--radius-md) + 0.03125rem));
  }
  .bewertung-card > .notch::before {
    top: auto;
    bottom: 0;
    left: auto;
    right: calc(var(--radius-md) * -1);
  }
  .bewertung-card > .notch::after {
    top: calc(var(--radius-md) * -1);
    bottom: auto;
    right: auto;
    left: 0;
  }
  .bewertung-card > .notch > .dot {
    top: auto;
    bottom: var(--dot-offset);
    right: auto;
    left: var(--dot-offset);
    border-radius: var(--radius-md);
  }

  .bewertung-card-head {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 1rem;
  }

  .bewertung-card-head-right {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 1.75rem;
    flex-shrink: 0;
  }

  .bewertung-card .bewertung-kind {
    margin: 0;
    text-align: right;
    color: var(--color-primary-muted);
    font-weight: 700;
    font-size: var(--font-size-sm);
    line-height: 1.4;
  }

  .bewertung-card .bewertung-kind::before {
    content: '* ';
  }

  .bewertung-card-author {
    display: flex;
    align-items: center;
    gap: 1.25rem;
    min-width: 0;
  }

  .bewertung-avatar {
    width: 3rem;
    height: 3rem;
    border-radius: 50%;
    background: var(--color-primary);
    color: var(--color-light);
    display: grid;
    place-items: center;
    font-weight: 700;
    font-size: var(--font-size-sm);
    letter-spacing: 0.02em;
    flex-shrink: 0;
    overflow: hidden;
  }

  .bewertung-meta {
    display: flex;
    flex-direction: column;
    line-height: 1.3;
    min-width: 0;
  }

  .bewertung-name {
    color: var(--color-primary);
    font-weight: 600;
    font-size: var(--font-size-md);
  }

  .bewertung-company-logo {
    height: 2.75rem;
    width: auto;
    max-width: 7rem;
    object-fit: contain;
    display: block;
  }

  .bewertung-quote {
    font-size: var(--font-size-lg);
    line-height: 1.6;
    color: var(--color-primary);
    margin: 0;
    flex: 1;
    font-style: normal;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  .bewertung-stars {
    display: flex;
    gap: 0.2rem;
    margin-top: 0.25rem;
  }

  .bewertung-stars svg {
    width: 1rem;
    height: 1rem;
  }

  .bewertung-stars .star-filled {
    fill: var(--color-accent);
  }

  .bewertung-stars .star-empty-light {
    fill: rgba(0, 0, 0, 0.12);
  }

  /* ── Sidebar (zusammengeführter Block: Rating + Kategorien + Stimmen) ── */
  .bewertung-sidebar {
    display: flex;
    flex-direction: column;
    background: var(--color-primary);
    color: var(--color-light);
    border-radius: var(--radius-md);
    padding: var(--padding);
    gap: 1.25rem;
  }

  .bewertung-rating-card {
    background: transparent;
    color: inherit;
    border-radius: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
  }

  .bewertung-rating-row-top {
    display: flex;
    align-items: baseline;
    justify-content: center;
    gap: 0.5rem;
  }

  .bewertung-rating-score {
    font-size: 3rem;
    font-weight: 700;
    line-height: 1;
  }

  .bewertung-rating-of {
    font-size: var(--font-size-md);
    color: color-mix(in srgb, var(--color-light), transparent 30%);
  }

  .bewertung-rating-stars {
    display: flex;
    justify-content: center;
    gap: 0.3rem;
    margin: 0.75rem 0 0.5rem;
  }

  .bewertung-rating-stars svg {
    width: 1.6rem;
    height: 1.6rem;
    fill: var(--color-icon);
  }

  .bewertung-rating-stars .star-empty-dark {
    fill: color-mix(in srgb, var(--color-light), transparent 75%);
  }

  .bewertung-rating-count {
    font-size: var(--font-size-sm);
    color: color-mix(in srgb, var(--color-light), transparent 30%);
  }
  /* Info-Icon auf dem dunklen Teal-Sidebar-BG: Default ist --color-primary (unsichtbar) → cremeweiß */
  .bewertung-rating-count .tooltip-icon {
    color: var(--color-light);
  }

  .bewertung-cats-card,
  .bewertung-voices-card {
    background: transparent;
    border-radius: 0;
    padding: 0;
    box-shadow: none;
  }

  .bewertung-cat {
    display: grid;
    grid-template-columns: 7rem 1fr 2.25rem;
    align-items: center;
    gap: 0.75rem;
    padding: 0.3rem 0;
  }

  .bewertung-cat-label {
    color: var(--color-light);
    font-size: var(--font-size-sm);
  }

  .bewertung-cat-bar {
    height: 4px;
    background: color-mix(in srgb, var(--color-light), transparent 85%);
    border-radius: 999px;
    overflow: hidden;
  }

  .bewertung-cat-bar > span {
    display: block;
    height: 100%;
    background: var(--color-icon);
    border-radius: 999px;
  }

  .bewertung-cat-val {
    font-weight: 700;
    font-size: var(--font-size-sm);
    color: var(--color-light);
    text-align: right;
  }

  .bewertung-voices-card {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 0.6rem;
  }

  .bewertung-voices-label {
    writing-mode: horizontal-tb;
    transform: none;
    text-transform: uppercase;
    font-size: var(--font-size-sm);
    letter-spacing: 0.18em;
    color: color-mix(in srgb, var(--color-light), transparent 40%);
    font-weight: 600;
    text-align: center;
  }

  .bewertung-voices {
    display: flex;
    gap: 0.4rem;
    flex: 1;
    justify-content: space-between;
  }

  .bewertung-voice {
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    border: 1.5px solid color-mix(in srgb, var(--color-light), transparent 70%);
    background: transparent;
    color: var(--color-light);
    font-size: var(--font-size-sm);
    font-weight: 600;
    cursor: pointer;
    transition: all 0.25s ease;
    padding: 0;
    display: grid;
    place-items: center;
  }

  .bewertung-voice:hover {
    border-color: var(--color-light);
    transform: scale(1.05);
  }

  .bewertung-voice.active {
    border-color: var(--color-icon);
    background: var(--color-icon);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-icon), transparent 70%);
    color: var(--color-primary);
  }

  /* ── Logo-Box (Vertrauen aus 60+ Unternehmen) ── */
  .bewertung-logo-box {
    margin-top: 3rem;
    background: var(--color-primary);
    color: var(--color-light);
    border-radius: var(--radius-md);
    padding: var(--padding);
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
    gap: 3rem;
    align-items: center;
  }

  .bewertung-logo-eyebrow {
    display: block;
    text-transform: uppercase;
    letter-spacing: 0.16em;
    font-size: var(--font-size-sm);
    color: color-mix(in srgb, var(--color-light), transparent 35%);
    margin-bottom: 0.75rem;
    font-weight: 500;
  }

  .bewertung-logo-title {
    font-size: 2rem;
    font-weight: 700;
    margin: 0;
    line-height: 1.15;
  }

  .bewertung-logo-title-accent {
    color: var(--color-icon);
  }

  .bewertung-inline-logo {
    display: inline-flex;
    align-items: center;
    vertical-align: baseline;
  }

  .bewertung-inline-logo svg {
    height: 0.85em;
    width: auto;
    display: inline-block;
    vertical-align: baseline;
    position: relative;
    /* viewBox 30 35 620 170: visuelle Buchstaben-Unterkante liegt bei ~96.5% der SVG-Höhe,
       darunter sind ~3.5% Leerraum → 0.03em Verschiebung nach unten richtet die Letter-Bottoms
       auf der Schrift-Baseline aus */
    top: 0.03em;
  }

  .bewertung-logo-grid {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 0.75rem;
  }

  .bewertung-logo-btn {
    aspect-ratio: 1;
    max-width: 140px;
    max-height: 140px;
    background: color-mix(in srgb, var(--color-light), transparent 88%);
    border: none;
    border-radius: var(--radius-md);
    display: grid;
    place-items: center;
    padding: 1rem;
    cursor: pointer;
    transition: all 0.3s ease;
    overflow: hidden;
  }

  .bewertung-logo-btn svg {
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
    /* brightness(0) macht alle opaken Pixel schwarz, invert(1) dann komplett weiß
       → einheitliche helle Silhouette unabhängig von der Logo-Komplexität.
       Flache Wortmarken und mehrfarbige Logos erscheinen dadurch im gleichen Tonwert. */
    filter: brightness(0) invert(1) opacity(0.7);
    transition: filter 0.3s ease, transform 0.3s ease;
  }

  .bewertung-logo-btn:hover {
    background: color-mix(in srgb, var(--color-light), transparent 78%);
  }

  .bewertung-logo-btn:hover svg {
    filter: brightness(0) invert(1) opacity(0.95);
  }

  .bewertung-logo-btn.active {
    background: var(--color-light);
    box-shadow: 0 10px 28px rgba(0, 0, 0, 0.18);
    transform: translateY(-2px);
  }

  .bewertung-logo-btn.active svg {
    filter: none;
  }

  /* === Responsive: ≤1280 (Bewertungen) ===
     2-Spalten-Grid (Karte + Sidebar) wechselt zu 1-Spalte.
     Logo-Box wechselt von 2-Spalten (Text + Logos) auf 1-Spalte
     (Logos wandern unter den Text). */
  @media (max-width: 1279.98px) {
    .bewertungen-grid {
      grid-template-columns: 1fr;
      gap: 1.25rem;
    }
    .bewertung-logo-box {
      grid-template-columns: 1fr;
      padding: 2.25rem;
      gap: 2rem;
    }
    .bewertung-logo-title {
      font-size: var(--font-size-xl);
    }
  }

  /* === Responsive: ≤650 (Bewertungen — kompakt) === */
  @media (max-width: 650px) {
    .bewertung-card {
      padding: 1rem;
      --dot-size: 3.5rem;
      --notch-size: 4.5rem;
    }
    .bewertung-quote {
      font-size: var(--font-size-md);
    }
    .bewertung-sidebar {
      padding: 1rem;
    }
    .bewertung-logo-box {
      padding: 1rem;
    }
    .bewertung-logo-grid {
      grid-template-columns: repeat(3, 1fr);
    }
    .bewertung-voice {
      width: 2.25rem;
      height: 2.25rem;
    }
  }

  /* ─── Individuelle Inhouse-Schulung ─── */
  #inhouse-schulung {
    position: relative;
    padding: 3rem 0;
    background: var(--color-accent);
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    overflow: hidden;
  }
  .inhouse-inner {
    position: relative;
    z-index: 2;
    max-width: 90rem;
    margin: 0 auto;
    padding: 0 6rem;
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 3rem;
    align-items: center;
    color: var(--color-on-accent); /* Basis-Textfarbe auf Accent-BG (vererbt an .inhouse-usps li etc.) */
  }
  .inhouse-text {
    position: relative;
  }
  #inhouse-schulung h2 {
    color: var(--color-on-accent);
    line-height: 1.15;
    margin: 0 0 0.5rem;
    display: block;
  }
  /* ID-scoped, um die globale Regel `.content-wrap p` (0,1,1) zu schlagen */
  #inhouse-schulung .inhouse-subtitle {
    color: var(--color-on-accent);
    font-size: var(--font-size-lg);
    font-weight: 500;
    line-height: 1.4;
    margin: 0 0 1.25rem;
  }
  /* ─── .check-list ─── Wiederverwendbare Liste mit Neon-Gelb-Checkmark-Bullet.
     Per-Liste `--check-top` setzen, um den vertikalen Offset an die Zeilenhöhe
     des umgebenden Texts anzupassen. */
  .check-list {
    --check-top: 0.4em;
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
  }
  .check-list li {
    padding-left: 2rem;
    position: relative;
  }
  .check-list li::before {
    content: "\2713";
    position: absolute;
    left: 0;
    top: var(--check-top);
    width: 1.25rem;
    height: 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 0.2rem;
    background: var(--color-icon);
    color: var(--color-primary);
    font-size: var(--font-size-md);
    font-weight: 800;
    line-height: 1;
    box-sizing: border-box;
  }
  .inhouse-usps {
    --check-top: 0.15em;
    gap: 0.75rem;
  }
  .inhouse-usps li {
    font-weight: 500;
    font-size: var(--font-size-md);
    line-height: 1.55;
  }
  .inhouse-action {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 0.6rem;
  }
  .inhouse-bg-icon {
    position: absolute;
    right: 5rem;
    bottom: -6.5rem;
    width: 16rem;
    height: 16rem;
    fill: color-mix(in srgb, var(--color-accent), black 30%);
    pointer-events: none;
    z-index: 1;
  }
  @media (max-width: 1536px) {
    .inhouse-inner {
      padding: 0 3.5rem;
    }
    .inhouse-bg-icon {
      right: -3rem;
    }
  }
  @media (max-width: 1279.98px) {
    .inhouse-bg-icon {
      bottom: -11rem;
    }
  }
  @media (max-width: 900px) {
    /* ID-scoped (1,1,0), damit es die cms-blocks.css-Regel `.cms-icon-block-svg`
       (0,1,0, lädt NACH main.css) schlägt: seit die Inhouse-Sektion aus Bordmittel-
       Blöcken besteht, trägt das Hintergrund-Icon als IconBlock zusätzlich
       `.cms-icon-block-svg{display:inline-block}` → das reine `.inhouse-bg-icon`
       (0,1,0) verlor per Quellreihenfolge und das Icon blieb mobil sichtbar. */
    #inhouse-schulung .inhouse-bg-icon {
      display: none;
    }
  }
  /* CTA-Spezial-Standard: Neon-Gelb auf Primary-Text, hohe Aufmerksamkeit,
     funktioniert auf Accent-, Primary- und Light-Hintergrund. Wird zentral
     genutzt (Inhouse-Sektion, Footer-Beratung, etc.). */
  .cta-highlight {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    background: var(--color-icon);
    color: var(--color-primary);
    padding: 0.7rem 1.5rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    font-weight: 600;
    text-decoration: none;
    border: none;
    cursor: pointer;
    font-family: inherit;
    white-space: nowrap;
    transform: scale(1);
    transition: opacity 0.25s, transform 0.25s ease;
  }
  .cta-highlight svg {
    width: 1.4rem;
    height: 1.4rem;
    fill: currentColor;
  }
  .cta-highlight:hover {
    opacity: 0.85;
    transform: scale(1.05);
  }
  .cta-highlight:active { transform: scale(0.98); }
  @media (prefers-reduced-motion: reduce) {
    .cta-highlight { transition: opacity 0.25s; }
    .cta-highlight:hover, .cta-highlight:active { transform: none; }
  }
  .link.inhouse-link {
    --link-color: var(--color-on-accent);
    --link-hover-text: var(--color-light);
    display: inline-block;
    margin-top: 1.25rem;
  }

  /* === Responsive: ≤1280 (Inhouse) === */
  @media (max-width: 1279.98px) {
    .inhouse-inner {
      grid-template-columns: 1fr;
      text-align: left;
      gap: 1.5rem;
      padding: 0 1.5rem;
    }
    .inhouse-action { align-items: flex-start; }
  }
  /* === Responsive: ≤650 (Inhouse) === */
  @media (max-width: 650px) {
    #inhouse-schulung { padding: 2.5rem 0; }
    .inhouse-usps { gap: 0.5rem 1rem; }
  }

  /* ─── Folgekurse ─── */
  #folgekurse {
    max-width: 90rem;
  }
  .folgekurse-inner > p,
  .empfehlungen-inner > p {
    text-align: center;
    max-width: 52rem;
    margin: 0 auto;
  }
  .folgekurse-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 2.5rem;
    margin-top: 2.5rem;
  }
  #folgekurse .card,
  #empfehlungen .card {
    display: flex;
    flex-direction: column;
  }
  #folgekurse .kurs-card-body,
  #empfehlungen .kurs-card-body {
    flex: 1;
    align-items: stretch;
  }
  #folgekurse .kurs-card-content,
  #empfehlungen .kurs-card-content {
    display: flex;
    flex-direction: column;
  }
  #folgekurse .kurs-card-meta,
  #empfehlungen .kurs-card-meta {
    margin-top: auto;
  }
  #folgekurse .card {
    min-width: 0;
    position: relative;
    transition: box-shadow 0.35s ease, margin-top 0.35s ease, margin-bottom 0.35s ease;
  }
  #folgekurse .card:hover {
    margin-top: -6px;
    margin-bottom: 6px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
  }
  /* Hidden cards: jenseits initial-visible-Threshold via :nth-child unsichtbar */
  @keyframes folgekurseReveal {
    from {
      opacity: 0;
      transform: translateY(20px);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  }
  /* === Responsive: Folgekurse Show-More-Logik ===
     Desktop ≥1281px: 4 Cards sichtbar, 5. via 'Mehr anzeigen' (nur Card 5 animiert).
     ≤1280px (Kompakt): nur 2 Cards sichtbar, 3-5 via Button (Stagger-Animation). */
  @media (min-width: 1280px) {
    #folgekurse .folgekurse-grid:not(.is-expanded) > .card:nth-child(n+5) { display: none; }
    #folgekurse .folgekurse-grid.is-expanded > .card:nth-child(5) {
      animation: folgekurseReveal 0.5s ease both;
    }
  }
  @media (max-width: 1279.98px) {
    #folgekurse .folgekurse-grid:not(.is-expanded) > .card:nth-child(n+3) { display: none; }
    #folgekurse .folgekurse-grid.is-expanded > .card:nth-child(n+3) {
      animation: folgekurseReveal 0.5s ease both;
    }
    #folgekurse .folgekurse-grid.is-expanded > .card:nth-child(3) { animation-delay: 0s; }
    #folgekurse .folgekurse-grid.is-expanded > .card:nth-child(4) { animation-delay: 0.12s; }
    #folgekurse .folgekurse-grid.is-expanded > .card:nth-child(5) { animation-delay: 0.24s; }
  }
  /* Mehr-Button verbergen wenn alles aufgeklappt */
  .folgekurse-grid.is-expanded ~ .folgekurse-more-wrap { display: none; }
  @media (prefers-reduced-motion: reduce) {
    #folgekurse .folgekurse-grid.is-expanded > .card { animation: none !important; }
  }
  #folgekurse .kurs-card-category {
    position: relative;
    z-index: 5;
  }
  .folgekurse-more-wrap {
    text-align: center;
    margin-top: 3rem;
  }
  .folgekurse-more-wrap.is-hidden {
    display: none;
  }
  /* === Responsive: ≤1280 (Folgekurse-Grid) ===
     Grid 2-Spalten → 1-Spalte. Cards-mit-Visual werden global zentriert mit
     max-width (siehe globale .card:has(> .card-visual)-Regel weiter unten). */
  @media (max-width: 1279.98px) {
    .folgekurse-grid {
      grid-template-columns: 1fr;
    }
    /* Standard-Regel: ALLE Cards mit Visual bekommen max-width + Zentrierung
       (greift global für Vorkurs/Folgekurse/Empfehlungen/etc.) */
    .card.has-notch:has(> .card-visual) {
      max-width: 48rem;
      margin-left: auto;
      margin-right: auto;
    }
  }

  /* ─── Suche ─── */
  #suche {
    position: relative;
    overflow: hidden;
    padding: 5rem 0;
    background: var(--color-accent);
    width: 100vw;
    margin-left: calc(-50vw + 50%);
  }
  .suche-inner {
    position: relative;
    z-index: 2;
    max-width: 90rem;
    margin: 0 auto;
    padding: 0 3.5rem;
    text-align: center;
    color: var(--color-on-accent); /* Basis-Textfarbe auf Accent-BG (h2 etc.) — Form/Pills/CTA setzen eigene Farben */
  }
  .suche-tags-field {
    position: relative;
    max-width: 60rem;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }
  .suche-keywords {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem;
    margin: 2.5rem auto 0;
    max-width: 60rem;
  }
  /* Wissenswelten-CTA am Section-Ende: kleiner Intro-Text + Secondary-CTA */
  .suche-wissenswelten {
    margin: 3rem auto 0;
    max-width: 60rem;
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  /* Intro-Text: ID-Scope schlägt die globale `.content-wrap p` (0,1,1) → --color-on-accent
     (4,54:1 auf Accent-BG, WCAG AA) statt Primary-Teal-Fallback (4,17:1, nicht AA). */
  #suche .suche-wissenswelten-text {
    color: var(--color-on-accent);
  }
  /* Wrap zentriert das form-field und gibt den Section-spezifischen weißen
     Glow um das Feld (gegen den Accent-Hintergrund). */
  .suche-input-wrap {
    position: relative;
    z-index: 3;
    max-width: 32rem;
    width: 100%;
  }
  /* Section-Overrides: weißer Glow als focus-Ring (statt Primary-Teal), und der
     integrierte CTA-Button bekommt Neon-Gelb statt Accent-Coral — sonst würde
     der orange Button im orangen Section-BG verschwinden. Der Lupen-Slot ist
     leicht gedimmt, wie zuvor `.suche-icon { opacity: 0.5 }`. */
  #suche .form-field-icon-slot--leading {
    color: var(--color-primary);
    opacity: 0.5;
  }
  #suche .form-field-cta-btn {
    --cta-btn-bg: var(--color-icon);
    --cta-btn-color: var(--color-primary);
  }
  /* === Responsive: ≤1280 (Suche) === */
  @media (max-width: 1279.98px) {
    #suche {
      padding: 3.5rem 0;
    }
    .suche-inner {
      padding: 0 1rem;
    }
  }

  /* ─── Empfehlungen ─── */
  #empfehlungen {
    max-width: 90rem;
    padding: 0;
  }
  .empfehlungen-viewport {
    overflow: clip;
    overflow-clip-margin: 2rem;
    margin-top: 2.5rem;
    padding-top: 1rem;
    container-type: inline-size;
  }
  .empfehlungen-track {
    display: flex;
    will-change: transform;
    --slide-index: 0;
    /* Slide-Width 60cqw, Zentrierungs-Offset (100-60)/2 = 20cqw */
    transform: translateX(calc(20cqw - var(--slide-index) * 60cqw));
  }
  .empfehlungen-track.is-animating {
    transition: transform 0.55s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  }
  .empfehlungen-track {
    cursor: grab;
  }
  .empfehlungen-track:active {
    cursor: grabbing;
  }
  .empfehlungen-slide {
    flex: 0 0 60%;
    padding: 0 1rem;
    box-sizing: border-box;
    transition: transform 0.4s ease;
    /* Recede-Effekt inaktiver Vorschau-Karten rein über scale(0.72) — KEIN
       Verdunkeln (kein filter:brightness/opacity). Da kein Dimming, läuft auch
       kein Kontrast-/axe-Thema: die Karte rendert in voller On-Card-Helligkeit
       (5,18:1), nur kleiner. */
    transform: scale(0.72);
  }
  .empfehlungen-slide.is-active {
    transform: scale(1);
  }

  #empfehlungen .card {
    position: relative;
    transition: box-shadow 0.35s ease, margin-top 0.35s ease, margin-bottom 0.35s ease;
  }
  .empfehlungen-slide:not(.is-active) .kurs-card-link,
  .empfehlungen-slide:not(.is-active) .kurs-card-category {
    pointer-events: none;
  }
  /* Hover-Lift wird im Karussell unterdrückt: Slides haben bereits scale-Animation
     via .is-active — ein zusätzlicher Hover-translateY würde mit dem scale kollidieren. */
  #empfehlungen .card:hover {
    transform: none;
    box-shadow: none;
  }
  #empfehlungen .empfehlungen-slide.is-active .card:hover {
    margin-top: -4px;
    margin-bottom: 4px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
  }
  #empfehlungen .kurs-card-category {
    position: relative;
    z-index: 5;
  }
  #empfehlungen .kurs-card-content > .kurs-card-summary {
    color: var(--color-light);
  }
  .empfehlungen-slide:not(.is-active) .kurs-card-content > .kurs-card-summary {
    /* Visueller Fade ab Zeile 3 ohne Layout-Box zu beschneiden — Track-Höhe bleibt stabil,
       SR/Crawler sehen vollen Text. Ersetzt -webkit-line-clamp + JS-fixViewportHeight. */
    -webkit-mask-image: linear-gradient(180deg, #000 0, #000 3lh, transparent 5lh);
            mask-image: linear-gradient(180deg, #000 0, #000 3lh, transparent 5lh);
  }

  /* ─── Carousel (wiederverwendbar: Empfehlungen, Team, …) ───
     Strukturelle Basis-Klassen für jedes Karussell, das über die
     generische initCarousel(config)-Factory läuft. Die instanz-
     spezifische Transform-Formel (Slide-Breite, Zentrierung, Peek/
     Scale) liegt im CSS der jeweiligen Sektion und liest --slide-index.
     #empfehlungen nutzt weiterhin seine eigenen .empfehlungen-track/
     -viewport-Regeln (Peek + Scale-Dim), bindet aber dieselben Dots
     und dieselbe JS-Factory ein. */
  .carousel-viewport {
    overflow: clip;
    container-type: inline-size;
  }
  .carousel-track {
    display: flex;
    will-change: transform;
    --slide-index: 0;
    cursor: grab;
  }
  .carousel-track:active {
    cursor: grabbing;
  }
  .carousel-track.is-animating {
    transition: transform 0.55s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  }
  .carousel-dots {
    display: flex;
    gap: 0.5rem;
    justify-content: center;
    margin-top: 1.5rem;
  }
  .carousel-dots[hidden] {
    /* nötig, da .carousel-dots{display:flex} das UA-[hidden] sonst überschreibt */
    display: none;
  }
  /* Dots: inaktiv = kleiner Punkt; aktiv = Pille, die sich als Fortschrittsbalken
     im Autoplay-Takt füllt (Zeit bis zum nächsten Slide). Markup je Dot (vom JS
     generiert): <button class="carousel-dot"><span class="carousel-dot-track">
     <span class="carousel-dot-fill"></span></span></button>. */
  .carousel-dot {
    height: 24px;
    min-width: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    cursor: pointer;
    border: none;
    padding: 0;
  }
  .carousel-dot-track {
    position: relative;
    width: 10px;
    height: 10px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--color-primary), transparent 75%);
    overflow: hidden;
    /* Elongation der Pille animiert die Track-Breite → Nachbar-Dots rücken weich */
    transition: width 0.35s ease, background 0.3s ease;
  }
  .carousel-dot:hover .carousel-dot-track,
  .carousel-dot:focus-visible .carousel-dot-track {
    background: color-mix(in srgb, var(--color-primary), transparent 55%);
  }
  .carousel-dot-fill {
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: var(--color-primary);
    transform: scaleX(0);
    transform-origin: left center;
  }
  .carousel-dot.active .carousel-dot-track {
    /* aktive Pille — Breite über --carousel-dot-active-width (Default 70px) */
    width: var(--carousel-dot-active-width, 70px);
  }
  /* Ohne Autoplay (oder reduced-motion): aktive Pille ist statisch voll gefüllt */
  .carousel-dot.active .carousel-dot-fill {
    transform: scaleX(1);
  }
  /* Mit Autoplay: Füllung läuft 0→100% über die Autoplay-Dauer (--carousel-autoplay).
     Wechselt der aktive Dot, startet die Animation am neuen Dot automatisch neu
     (Klassen-Wechsel). Hover friert sie ein (.is-paused). */
  .carousel-has-autoplay .carousel-dot.active .carousel-dot-fill {
    transform: scaleX(0);
    animation: carousel-dot-fill var(--carousel-autoplay, 5500ms) linear forwards;
  }
  .carousel-dots.is-paused .carousel-dot.active .carousel-dot-fill {
    animation-play-state: paused;
  }
  @keyframes carousel-dot-fill {
    from { transform: scaleX(0); }
    to { transform: scaleX(1); }
  }
  @media (prefers-reduced-motion: reduce) {
    .carousel-dot-track { transition: none; }
    .carousel-has-autoplay .carousel-dot.active .carousel-dot-fill {
      animation: none;
      transform: scaleX(1);
    }
  }

  /* === Responsive: ≤1280 (Empfehlungen-Karussell) ===
     Mobile: Karte nimmt nahezu volle Viewport-Breite ein — exakt 0.5rem
     Abstand zur Viewport-Kante links/rechts. Viewport bricht aus dem
     .content-wrap-Padding (1.5rem) via Full-Bleed (100vw) aus, sodass
     Slide-Width 100% + Slide-Padding 0.5rem den Card-zu-Rand-Abstand
     exakt definieren. Kein Peek der Nachbar-Slides mehr (verursachte zuvor
     großzügige Lücken um die aktive Karte) — Navigation erfolgt über Dots. */
  @media (max-width: 1279.98px) {
    .empfehlungen-slide {
      flex: 0 0 100%;
      padding: 0 0.5rem;
    }
    .empfehlungen-viewport {
      width: 100vw;
      margin-left: calc(-50vw + 50%);
    }
    .empfehlungen-track {
      /* Slide-Width 100cqw, kein Zentrierungs-Offset */
      transform: translateX(calc(var(--slide-index) * -100cqw));
    }
    #empfehlungen {
      padding: 0;
    }
  }

  /* ─── Team (Karussell) ───
     Läuft über die generische initCarousel-Factory (siehe .carousel-*).
     Desktop: 3 Karten sichtbar, Advance-by-1 (nur aktiv ab >3 Karten).
     ≤1280px: nur EINE Karte sichtbar (statt vertikal gestapelt).
     Slide-Breite per cqw (container-type: inline-size auf .carousel-viewport).
     Lücke zwischen den 3 Karten = --carousel-gap (per initCarousel({gap}) gesetzt,
     Fallback 1.5rem): Die Karten sind --team-card-size breit und in ihren ⅓-Slots
     zentriert; die Row-Breite (max-width) ist exakt so gewählt, dass zwischen den
     Karten genau --carousel-gap bleibt → kleinerer gap ⇒ engere Row. */
  #team {
    max-width: 90rem;
    padding: 0;
    background: var(--color-light);
  }
  .team-carousel-viewport {
    --team-card-size: 256px;
    margin: 2.5rem auto 0;
    /* 3 Karten + 3× Gap (2 Lücken innen + 2× halber Außenrand) → genau --carousel-gap
       zwischen je zwei Karten. cqw bezieht sich danach auf diese gecappte Breite. */
    max-width: calc(var(--team-card-size) * 3 + var(--carousel-gap, 1.5rem) * 3);
  }
  .team-carousel-track {
    /* 3 sichtbar: Slide-Breite 100/3 cqw, links-bündig (kein Zentrier-Offset).
       --slide-index = current + perView (Klon-Offset) wird vom JS gesetzt. */
    transform: translateX(calc(var(--slide-index) * -100cqw / 3));
  }
  .team-slide {
    flex: 0 0 calc(100% / 3);
    box-sizing: border-box;
    display: flex;
    justify-content: center;
  }
  .team-card {
    position: relative;
    width: 100%;
    max-width: var(--team-card-size);
    aspect-ratio: 3 / 4;
    clip-path: url(#image-clip-notch-tr);
    cursor: pointer;
  }
  .team-card img,
  .team-card video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  .team-card video {
    opacity: 0;
    transition: opacity 0.35s ease;
  }
  .team-card:hover video {
    opacity: 1;
  }
  /* === Responsive: ≤1280 (Team) ===
     Ab hier nur EINE Karte sichtbar (Full-Bleed), Navigation über Dots/Swipe.
     Karte bleibt --team-card-size breit, zentriert; Gap entfällt (nur 1 Karte). */
  @media (max-width: 1279.98px) {
    .team-carousel-viewport {
      width: 100vw;
      max-width: none;
      margin-left: calc(-50vw + 50%);
    }
    .team-carousel-track {
      transform: translateX(calc(var(--slide-index) * -100cqw));
    }
    .team-slide {
      flex: 0 0 100%;
    }
  }

  /* ─── FAQ ─── */
  #faq {
    max-width: 90rem;
    background: var(--color-light);
  }
  .faq-accordion {
    display: flex;
    flex-direction: column;
    gap: 0;
  }
  .faq-item {
    background: transparent;
    border-radius: 0;
    border-bottom: 1px solid color-mix(in srgb, var(--color-primary), white 80%);
    transition: background-color 0.35s ease, padding 0.35s ease, border-color 0.25s ease, border-radius 0.35s ease, margin 0.35s ease;
  }
  .faq-item:first-child {
    border-top: 0;
  }
  /* Notch lebt INNERHALB von <summary> — .has-notch > .notch greift nicht, daher self-contained */
  .faq-item .notch {
    --notch-exposure: calc(var(--notch-size) - var(--dot-size));
    position: absolute;
    top: 0;
    right: 0;
    display: flex;
    align-items: flex-start;
    justify-content: flex-end;
    min-width: var(--notch-size);
    min-height: var(--notch-size);
    box-sizing: border-box;
    background-color: var(--notch-bg);
    border-bottom-left-radius: var(--radius-sm);
    padding: 0 0 var(--notch-exposure) var(--notch-exposure);
    z-index: 3;
    pointer-events: none;
    transition: top 0.35s ease, right 0.35s ease, background-color 0.35s ease, padding 0.35s ease, min-width 0.35s ease, min-height 0.35s ease, border-bottom-left-radius 0.35s ease;
  }
  .faq-item .notch::before,
  .faq-item .notch::after {
    content: "";
    position: absolute;
    width: var(--radius-sm);
    height: var(--radius-sm);
    background-color: var(--notch-bg);
    -webkit-mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-sm), black calc(var(--radius-sm) + 0.03125rem));
    mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-sm), black calc(var(--radius-sm) + 0.03125rem));
    transition: opacity 0.25s ease;
  }
  .faq-item .notch::before { top: 0; left: calc(var(--radius-sm) * -1); }
  .faq-item .notch::after { right: 0; bottom: calc(var(--radius-sm) * -1); }
  .faq-item .notch > .dot {
    position: relative;
    top: var(--dot-offset);
    right: var(--dot-offset);
    min-width: var(--dot-size);
    min-height: var(--dot-size);
    height: var(--dot-size);
    margin: 0;
    border-radius: var(--radius-sm);
    background-color: var(--dot-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-primary);
    z-index: 2;
    padding: 0;
    transition: background-color 0.35s ease, min-width 0.35s ease, min-height 0.35s ease, height 0.35s ease, border-radius 0.35s ease;
  }
  .faq-item .notch > .dot svg {
    width: 1.5rem;
    height: 1.5rem;
    display: block;
    fill: currentColor;
    transition: fill 0.2s ease, transform 0.35s ease, width 0.35s ease, height 0.35s ease;
  }
  /* INAKTIV: .is-active statt [open]-Selektor — Chromium propagiert Style-Invalidation
     nicht von <details> in <summary>-Kinder bei dynamischem open-Toggle */
  .faq-item .notch:not(.is-active) {
    top: 1.25rem;
    right: 0.5rem;
    min-width: 0;
    min-height: 0;
    background-color: transparent;
    border-bottom-left-radius: 0;
    padding: 0;
  }
  .faq-item .notch:not(.is-active)::before,
  .faq-item .notch:not(.is-active)::after {
    opacity: 0;
  }
  .faq-item .notch:not(.is-active) > .dot {
    background-color: transparent;
    min-width: 28px;
    min-height: 28px;
    height: 28px;
    border-radius: 0;
  }
  .faq-item .notch:not(.is-active) > .dot svg {
    width: 28px;
    height: 28px;
    fill: var(--color-primary);
  }
  .faq-item:hover .notch:not(.is-active) > .dot svg {
    fill: var(--color-accent);
  }
  .faq-question {
    display: flex;
    align-items: center;
    width: 100%;
    padding: 1.25rem 3rem 1.25rem 0;
    background: none;
    border: none;
    cursor: pointer;
    font-family: inherit;
    font-size: var(--font-size-lg);
    font-weight: 600;
    color: var(--color-primary);
    text-align: left;
    line-height: 1.4;
    list-style: none;
    transition: color 0.2s, padding 0.35s ease, font-size 0.35s ease;
  }
  .faq-question::-webkit-details-marker { display: none; }
  .faq-question::marker { content: ""; }
  .faq-question:hover {
    color: var(--color-accent);
  }
  /* AKTIV: Keynote-Card-Optik */
  .faq-item[open] {
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
    border-bottom-color: transparent;
    padding: 0 2rem;
    margin: 0.75rem 0;
  }
  .faq-item[open]:first-child {
    border-top-color: transparent;
  }
  .faq-item .notch.is-active > .dot svg {
    transform: rotate(45deg);
  }
  /* CMS-Abweichung (2026-06-25): KEINE max-height-Klappanimation mehr. Die alte
     max-height:80rem schnitt lange Antworten (z.B. die automatisch zerlegte Variable
     {{seminar.berufliche_perspektiven}}) per overflow:hidden hart ab — ohne Scrollbalken.
     Ein geschlossenes <details> versteckt seinen Inhalt ohnehin nativ (browserübergreifend),
     ein offenes zeigt die NATÜRLICHE Höhe → kein Clipping, egal wie lang. Statt einer
     höhenbasierten Animation (mit <details>/content-visibility unzuverlässig) blendet der
     Inhalt beim Öffnen per CSS-Animation sanft ein (Fade + leichtes Hochschieben) — kein
     JS, keine Höhenmessung, in jedem Browser identisch. Bei Asset-Resync aus test\design
     erhalten! */
  .faq-answer {
    overflow: hidden;
  }
  .faq-answer-inner {
    font-size: var(--font-size-lg);
    line-height: 1.6;
    color: var(--color-primary);
    padding: 0.5rem 0 1.5rem;
  }
  .faq-item[open] .faq-answer-inner {
    animation: faqReveal 0.35s cubic-bezier(0.4, 0, 0.2, 1);
  }
  @keyframes faqReveal {
    from { opacity: 0; transform: translateY(-0.5rem); }
    to   { opacity: 1; transform: none; }
  }
  @media (prefers-reduced-motion: reduce) {
    .faq-item[open] .faq-answer-inner { animation: none; }
  }
  .faq-answer-inner p {
    margin: 0 0 0.75rem;
  }
  .faq-answer-inner ul {
    margin: 0.5rem 0 0;
  }
  .faq-answer-inner ul li {
    padding-left: 1rem;
    margin-bottom: 0.5rem;
    line-height: 1.5;
  }
  .faq-contact {
    margin-top: 2.5rem;
    /* Notch sitzt oben rechts → padding-top muss Platz für die Notch lassen.
       Horizontal + Bottom nutzen --padding-x von .has-notch (responsive: 2rem → 1rem ≤650px). */
    padding: calc(var(--notch-size) + 1rem) var(--padding-x) var(--padding-x);
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    align-items: center;
    text-align: center;
  }
  .faq-contact-text {
    margin: 0;
    font-size: var(--font-size-lg);
    color: var(--color-primary);
  }
  .faq-contact-form {
    width: 100%;
    max-width: 50rem;
  }
  /* Form-field füllt den ganzen Form-Wrapper, ohne eigene Außenränder */
  .faq-contact-form .form-field {
    width: 100%;
  }
  /* === Responsive: ≤1280 (FAQ) === */
  @media (max-width: 1279.98px) {
    .faq-question {
      padding: 1rem 2.5rem 1rem 0;
    }
    .faq-item[open] {
      padding: 0 1.25rem;
    }
    .faq-item .notch:not(.is-active) {
      top: 1rem;
      right: 0.25rem;
    }
  }
  /* ─── Footer ─── */
  /* Footer ist selbst der Grid-Container. Full-Bleed-BG via horizontalem Padding, das ab Viewport > 90rem mitwächst und Content bei max 90rem zentriert */
  .site-footer {
    margin-top: 10rem;
    padding: 5rem max(2rem, calc((100% - 90rem) / 2)) 1.5rem;
    background: var(--color-primary);
    color: var(--color-light);
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr) minmax(0, 1fr);
    /* CMS: links/rechts sind flexible Spalten-Stapel (.footer-side) statt fester benannter
       Bereiche — Footer-Karten lassen sich im Dashboard (view=footer) hinzufügen/entfernen */
    grid-template-areas:
      "left  map  right"
      "bottom  bottom  bottom";
    column-gap: 4rem;
    row-gap: 2.5rem;
  }
  .footer-map-widget {
    grid-area: map;
    min-width: 0;
    width: 100%;
    align-self: center;
  }
  .footer-side { display: flex; flex-direction: column; gap: 2.5rem; min-width: 0; }
  .footer-side--left  { grid-area: left; }
  .footer-side--right { grid-area: right; }
  .footer-bottom      { grid-area: bottom; }

  /* Linke Spalte: alle Inhalte rechtsbündig (näher an der Map) */
  .footer-side--left { text-align: right; }
  .footer-col-social .footer-social { justify-content: flex-end; }
  .footer-col-trust .footer-tuev { margin-left: auto; }

  .footer-logo-wrap {
    display: inline-flex;
    align-items: center;
  }
  .footer-logo-wrap .footer-logo-inline {
    height: 0.85em;
    width: auto;
    display: inline-block;
    vertical-align: baseline;
    position: relative;
    bottom: -0.05em;
  }

  .footer-map-widget {
    position: relative;
    max-width: 400px;
    margin: 0 auto;
  }
  .footer-map-svg {
    width: 100%;
    height: auto;
    display: block;
    overflow: visible;
  }
  .footer-map-svg .map-country {
    fill: rgba(250, 245, 235, 0.06);
    stroke: rgba(250, 245, 235, 0.35);
    stroke-width: 0.6;
    stroke-linejoin: round;
  }
  .footer-pin {
    cursor: pointer;
  }
  .footer-pin circle {
    fill: var(--color-light);
    transition: transform 0.18s, fill 0.18s;
    transform-origin: center;
    transform-box: fill-box;
  }
  .footer-pin text {
    fill: var(--color-light);
    font-size: 10px;
    font-weight: 700;
    text-anchor: middle;
    paint-order: stroke;
    stroke: var(--color-primary);
    stroke-width: 3;
    stroke-linejoin: round;
    opacity: 1;
  }
  .footer-pin:hover circle,
  .footer-pin:focus-visible circle {
    transform: scale(1.45);
    fill: var(--color-icon);
  }
  .footer-pin:hover text,
  .footer-pin:focus-visible text {
    fill: var(--color-icon);
  }
  .footer-pin:focus-visible {
    outline: none;
  }
  .footer-pin:focus-visible circle {
    stroke: var(--color-icon);
    stroke-width: 2;
  }

  /* Live-Online Pin in der Karte (Termin-Stil, dezent, ohne Count) */
  .footer-pin-online { cursor: pointer; }
  .footer-pin-online-bg {
    fill: var(--color-primary);
    stroke: rgba(250, 245, 235, 0.35);
    stroke-width: 0.6;
    transition: fill 0.2s, stroke 0.2s;
  }
  .footer-pin-online-label {
    fill: var(--color-light);
    font-size: 9px;
    font-weight: 700;
    text-anchor: middle;
    dominant-baseline: central;
    stroke: none;
    paint-order: normal;
    transition: fill 0.2s;
  }
  .footer-pin-online:hover .footer-pin-online-bg,
  .footer-pin-online:focus-visible .footer-pin-online-bg {
    fill: color-mix(in srgb, var(--color-primary), white 15%);
    stroke: var(--color-icon);
  }
  .footer-pin-online:hover .footer-pin-online-label,
  .footer-pin-online:focus-visible .footer-pin-online-label {
    fill: var(--color-icon);
  }
  .footer-pin-online:focus-visible { outline: none; }

  .footer-col-title {
    font-size: var(--font-size-md);
    font-weight: 700;
    color: var(--color-light);
    letter-spacing: 0.02em;
    margin-bottom: 1rem;
    text-transform: uppercase;
  }
  .footer-list {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0;
    margin: 0;
  }
  .footer-list a {
    color: rgba(250, 245, 235, 0.78);
    text-decoration: none;
    font-size: var(--font-size-md);
    line-height: 1.5;
    transition: color 0.2s;
  }
  .footer-list a:hover,
  .footer-list a:focus-visible {
    color: var(--color-icon);
    outline: none;
  }

  /* Social-Icons (gleiches Pattern wie .action-icon: nur Icon, kein BG/Border) */
  .footer-social {
    list-style: none;
    display: flex;
    gap: 0.75rem;
    padding: 0;
    margin: 0;
  }
  .footer-social-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--color-light);
    text-decoration: none;
    transition: color 0.2s, transform 0.2s;
  }
  .footer-social-link svg {
    width: 28px;
    height: 28px;
    fill: currentColor;
  }
  .footer-social-link:hover,
  .footer-social-link:focus-visible {
    color: var(--color-icon);
    transform: translateY(-1px);
    outline: none;
  }

  /* Kontakt-Block */
  .footer-contact {
    font-style: normal;
    display: flex;
    flex-direction: column;
    gap: 0.65rem;
  }
  .footer-contact-row {
    display: inline-flex;
    align-items: flex-start;
    gap: 0.55rem;
    color: rgba(250, 245, 235, 0.78);
    text-decoration: none;
    font-size: var(--font-size-md);
    line-height: 1.5;
    transition: color 0.2s;
  }
  .footer-contact-row:hover,
  .footer-contact-row:focus-visible {
    color: var(--color-icon);
    outline: none;
  }
  .footer-contact-row--static { cursor: default; }
  .footer-contact-row--static:hover { color: rgba(250, 245, 235, 0.78); }
  .footer-contact-icon {
    width: 16px;
    height: 16px;
    flex-shrink: 0;
    margin-top: 0.2em;
    fill: var(--color-icon);
  }

  /* Zertifikat: TÜV-Nord (lokales Logo) */
  .footer-tuev {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.75rem 1rem;
    background: var(--color-light);
    border-radius: var(--radius-sm);
  }
  .footer-tuev-logo {
    display: block;
    height: 100px;
    width: auto;
    max-width: 100%;
  }

  /* Bottom Bar (spannt Cols 2+3 in der untersten Zeile des 3-Col-Grids) */
  .footer-bottom {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.75rem;
    padding-top: 1.5rem;
    border-top: 1px solid rgba(250, 245, 235, 0.12);
    text-align: center;
  }
  .footer-copyright {
    color: rgba(250, 245, 235, 0.65);
    font-size: var(--font-size-sm);
    margin: 0;
  }
  .footer-legal ul {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 1.4rem;
    padding: 0;
    margin: 0;
  }
  /* Legal-Links sehen aus wie die Unternehmen-Listen-Links */
  .footer-legal a,
  .footer-legal button {
    color: rgba(250, 245, 235, 0.78);
    background: transparent;
    border: none;
    padding: 0;
    font-family: inherit;
    font-size: var(--font-size-sm);
    line-height: 1.5;
    text-decoration: none;
    cursor: pointer;
    transition: color 0.2s;
  }
  .footer-legal a:hover,
  .footer-legal a:focus-visible,
  .footer-legal button:hover,
  .footer-legal button:focus-visible {
    color: var(--color-icon);
    outline: none;
  }

  .footer-subtext {
    font-size: var(--font-size-md);
    color: var(--color-light);
    font-weight: 400;
  }

  /* === Footer Responsive ===
     Stufen: Default 3-Spalten (Company | Map | Kontakt) → ≤1280 column-gap kleiner →
     ≤900 2 Spalten mit Map oben → <650 (Extra-Stufe wie Toolbar) alles 1-spaltig zentriert. */
  @media (max-width: 1279.98px) {
    .site-footer { column-gap: 1.5rem; row-gap: 2rem; }
  }
  @media (max-width: 900px) {
    .site-footer {
      padding: 4rem 1.5rem 1.25rem;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      grid-template-areas:
        "map   map"
        "left  right"
        "bottom  bottom";
      column-gap: 3rem; /* mehr Abstand zwischen den beiden Spalten unter der Map */
    }
    .footer-map-widget { max-width: 440px; margin: 0 auto; }
  }
  /* === Responsive: <650 (Extra-Stufe — Footer, gleiche Stufe wie Toolbar) ===
     1-spaltiges Layout, alles zentriert. Übersteuert die rechtsbündige Default-Logik
     der linken Spalte (company/social/trust). */
  @media (max-width: 650px) {
    .site-footer {
      padding: 3rem 1.25rem 1rem;
      grid-template-columns: 1fr;
      grid-template-areas:
        "map"
        "left"
        "right"
        "bottom";
    }
    /* Beide Spalten-Stapel bei <650 zentrieren statt rechts-/linksbündig */
    .footer-side { text-align: center; }
    .footer-col-social .footer-social { justify-content: center; }
    .footer-col-trust .footer-tuev { margin: 0 auto; }
    .footer-col-contact .footer-contact { align-items: center; }
    .footer-legal ul { gap: 0.4rem 1rem; justify-content: center; }
  }

  /* ─── Team-CTA-Block (vorher im Footer, jetzt am Ende der Team-Sektion) ─── */
  .team-cta-block {
    max-width: 90rem;
    margin: 5rem auto 4rem;
    padding: 0 2rem;
    text-align: center;
  }
  /* Headline auf hellem Body — Primary Teal, kleiner, inline-Logo */
  .team-cta-block .footer-text {
    display: block;
    font-size: var(--font-size-xl);
    color: var(--color-primary);
    margin-bottom: 1.5rem;
  }
  /* === Responsive: ≤1280 (Team-CTA-Block) === */
  @media (max-width: 1279.98px) {
    .team-cta-block { margin: 4rem 1.25rem 3rem; padding: 0; }
  }

  /* ─── Scroll-to-Top Button ─── */
  .scroll-top {
    position: fixed;
    bottom: 2rem;
    right: 2rem;
    z-index: 900;
    width: 3rem;
    height: 3rem;
    border: 2px solid var(--color-light);
    border-radius: var(--radius-sm);
    background: color-mix(in srgb, var(--color-primary) 65%, transparent);
    color: var(--color-light);
    cursor: pointer;
    display: grid;
    place-items: center;
    opacity: 0;
    visibility: hidden;
    translate: 0 1rem;
    transition: opacity 0.3s ease, visibility 0.3s ease, translate 0.3s ease, background 0.2s ease;
  }
  .scroll-top.is-visible {
    opacity: 1;
    visibility: visible;
    translate: 0 0;
  }
  .scroll-top:hover,
  .scroll-top:focus-visible {
    background: var(--color-primary);
  }
  .scroll-top:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
  }
  .scroll-top svg {
    width: 1.25rem;
    height: 1.25rem;
    fill: currentColor;
  }
  @media (prefers-reduced-motion: reduce) {
    .scroll-top { transition: none; }
  }
  @media (max-width: 650px) {
    .scroll-top { bottom: 1.25rem; right: 1.25rem; width: 2.5rem; height: 2.5rem; }
  }

  /* ─── Section: Design-System-Demos (temporär) ─── */
  .dev-demos {
    max-width: 90rem;
    margin: 4rem auto;
    padding: 0 2rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
  }
  .dev-demo {
    padding: 1rem 1.25rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    margin: 0;
  }
  .dev-demo--light { background: var(--color-light-contrast); color: var(--color-primary); }
  .dev-demo--dark  { background: var(--color-primary);        color: var(--color-light); }
  /* === Responsive: ≤650 (Dev-Demos) === */
  @media (max-width: 650px) {
    .dev-demos { padding: 0 1.25rem; }
  }

  /* ─── Section: Form-Field-System (Demo + Reusable) ─── */
  .dev-demo-form {
    background: var(--color-light-contrast);
    padding: 3rem 2.5rem;
    border-radius: var(--radius-md);
    margin: 4rem auto;
    max-width: 90rem;
    box-shadow: 0 4px 32px color-mix(in srgb, var(--color-primary) 8%, transparent);
  }
  .dev-demo-form-title {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--color-primary);
    margin-bottom: 0.5rem;
  }
  .dev-demo-form-intro {
    color: color-mix(in srgb, var(--color-primary) 70%, transparent);
    margin-bottom: 2.5rem;
    max-width: 50rem;
  }
  .dev-demo-form-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.75rem 2rem;
  }
  .dev-demo-form-grid > .form-field--full,
  .dev-demo-form-grid > fieldset,
  .dev-demo-form-grid > .form-field-actions {
    grid-column: 1 / -1;
  }
  /* === Responsive: ≤1280 (Form-Field-Demo) === */
  @media (max-width: 1279.98px) {
    .dev-demo-form { padding: 2rem 1.5rem; margin: 3rem 1.25rem; }
    .dev-demo-form-grid { grid-template-columns: 1fr; gap: 1.5rem; }
  }
  .dev-demo-form-eyebrow {
    font-size: var(--font-size-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 700;
    color: var(--color-accent);
    display: inline-block;
    margin-right: 0.4rem;
    flex-shrink: 0;
  }

  /* ─── .form-field: Wrapper ─── */
  .form-field {
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
    position: relative;
  }
  .form-field-label {
    font-size: var(--font-size-sm);
    font-weight: 600;
    color: var(--color-primary);
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
  }
  .form-field-label .tooltip-icon { font-size: var(--font-size-md); opacity: 0.55; }
  .form-field-required {
    color: var(--color-accent);
    margin-left: 0.1em;
    font-weight: 700;
  }
  .form-field-helper,
  .form-field-error {
    font-size: var(--font-size-sm);
    color: color-mix(in srgb, var(--color-primary) 70%, transparent);
    line-height: 1.4;
    margin-top: 0.1rem;
  }
  .form-field-error {
    color: var(--color-accent);
    display: flex;
    align-items: center;
    gap: 0.35rem;
    animation: form-field-error-in 0.25s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-error svg {
    width: 14px; height: 14px;
    fill: currentColor;
    flex-shrink: 0;
  }
  .form-field-error[hidden] { display: none; }
  /* Wenn ein Fehler sichtbar ist, blendet der Helper aus — gleiche Position für den User */
  .form-field:has(.form-field-error:not([hidden])) .form-field-helper,
  .form-field-fieldset:has(.form-field-error:not([hidden])) .form-field-helper {
    display: none;
  }
  /* Highlight-Ring für Felder mit ausgelöstem Error (aria-invalid wird per JS gesetzt) */
  .form-field:has([aria-invalid="true"]) .form-field-control,
  .form-field:has([aria-invalid="true"]) .form-field-combobox-trigger {
    box-shadow: 0 0 0 2px var(--color-accent);
  }
  .form-field-helper-link { color: var(--color-accent); text-decoration: underline; text-underline-offset: 2px; }
  .form-field-helper-link:hover { color: color-mix(in srgb, var(--color-accent), black 15%); }

  /* ─── .form-field-control: Input-Container ─── */
  /* Idle = kein Border / kein Ring. Hover & Focus zeigen Ring. Bei `.is-filled`
     erscheint rechts ein quadratischer Haken-Dot in Icon-Gelb (pop-scale-in). */
  .form-field-control {
    --check-top: 50%;
    --check-translate-y: -50%;
    position: relative;
    display: flex;
    align-items: center;
    background: var(--color-light);
    border: none;
    border-radius: var(--form-field-radius);
    min-height: var(--form-field-height);
    transition: box-shadow 0.25s ease, transform 0.2s ease;
  }
  /* Haken-Dot — Styling exakt wie `.check-list li::before` */
  .form-field-control::after {
    content: "\2713";
    position: absolute;
    right: 1rem;
    top: var(--check-top);
    width: 1.25rem;
    height: 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 0.2rem;
    background: var(--color-primary);
    color: var(--color-icon);
    font-size: var(--font-size-md);
    font-weight: 800;
    line-height: 1;
    box-sizing: border-box;
    transform: translateY(var(--check-translate-y)) scale(0);
    transition: transform 0.35s cubic-bezier(.22, 1, .36, 1);
    pointer-events: none;
    z-index: 2;
  }
  .form-field-control.is-filled::after {
    transform: translateY(var(--check-translate-y)) scale(1);
  }
  .form-field-control:hover {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  .form-field-control:focus-within {
    box-shadow: 0 0 0 2px var(--color-primary);
  }
  /* Invalid: ring switches to accent (highest priority) */
  .form-field:has(.form-field-input:user-invalid) .form-field-control,
  .form-field:has(textarea:user-invalid) .form-field-control,
  .form-field:has([aria-invalid="true"]) .form-field-control {
    box-shadow: 0 0 0 2px var(--color-accent);
  }
  /* Invalid: Haken-Dot wird unterdrückt — kein "fertig"-Signal bei Fehler */
  .form-field-control:has(.form-field-input:user-invalid)::after,
  .form-field-control:has(textarea:user-invalid)::after,
  .form-field-control:has([aria-invalid="true"])::after,
  .form-field-combobox:has([aria-invalid="true"])::after {
    transform: translateY(var(--check-translate-y, -50%)) scale(0);
  }
  /* Invalid + is-filled: reservierten Haken-Slot wieder freigeben, sonst klafft rechts ein Loch */
  .form-field-control.is-filled:has(.form-field-input:user-invalid) .form-field-icon-slot,
  .form-field-control.is-filled:has(textarea:user-invalid) .form-field-icon-slot,
  .form-field-control.is-filled:has([aria-invalid="true"]) .form-field-icon-slot {
    padding-right: var(--form-field-padding-x);
  }
  .form-field-control.is-filled:has(textarea:user-invalid) .form-field-textarea-wrap,
  .form-field-control.is-filled:has([aria-invalid="true"]) .form-field-textarea-wrap {
    padding-right: 0;
  }
  /* Wenn gefüllt: bestehende Slot-Icons rücken nach links damit der Haken-Dot
     daneben Platz hat (er ersetzt sie nicht) */
  .form-field-icon-slot {
    transition: padding-right 0.4s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-control.is-filled .form-field-icon-slot {
    padding-right: calc(var(--form-field-padding-x) + 1.25rem + 0.5rem);
  }
  /* Textarea: Haken oben rechts statt vertikal zentriert (Höhe variiert dynamisch) */
  .form-field--textarea .form-field-control {
    --check-top: 0.7rem;
    --check-translate-y: 0;
  }
  .form-field-control.is-filled .form-field-textarea-wrap {
    padding-right: calc(var(--form-field-padding-x) + 1.25rem + 0.5rem);
    transition: padding-right 0.4s cubic-bezier(.22, 1, .36, 1);
  }
  /* Felder ohne Haken-Dot (haben Right-Sub-Controls oder Sonderlayout) */
  .form-field--file .form-field-control::after,
  .form-field-control:has(input[type="search"])::after {
    display: none;
  }
  /* Slot-Padding-Adjustment für die ausgeschlossenen Felder NICHT triggern */
  .form-field--file .form-field-control.is-filled .form-field-icon-slot,
  .form-field-control.is-filled:has(input[type="search"]) .form-field-icon-slot {
    padding-right: var(--form-field-padding-x);
  }
  /* Telefon: das dekorative Phone-Icon WEICHT bei gefülltem (valid) Feld dem Haken,
     statt daneben stehen zu bleiben (anders als das informative E-Mail-Favicon).
     Nur wenn der Haken auch erscheint (= nicht invalid) — bei Fehler bleibt das Icon,
     da dann kein Haken kommt und die rechte Seite sonst leer wäre. */
  .form-field--tel .form-field-control.is-filled:not(:has(.form-field-input:user-invalid)) .form-field-icon-slot {
    padding-right: var(--form-field-padding-x);
  }
  .form-field--tel .form-field-control.is-filled:not(:has(.form-field-input:user-invalid)) .form-field-icon-slot svg {
    opacity: 0;
    transition: opacity 0.25s ease;
  }
  /* Favicon-Resolver (E-Mail/URL): wurde KEIN Provider-Logo geladen, weicht das reine
     Default-Icon (@) bei gefülltem+validem Feld dem Haken (wie beim Telefon), statt
     daneben stehen zu bleiben. MIT geladenem Favicon bleibt dieses sichtbar (informativ)
     — dann greift `:not(:has(…is-loaded))` nicht und Favicon + Haken stehen nebeneinander. */
  .form-field[data-favicon-resolver] .form-field-control.is-filled:not(:has(.form-field-input:user-invalid)):not(:has(img.form-field-favicon.is-loaded)) .form-field-icon-slot {
    padding-right: var(--form-field-padding-x);
  }
  .form-field[data-favicon-resolver] .form-field-control.is-filled:not(:has(.form-field-input:user-invalid)):not(:has(img.form-field-favicon.is-loaded)) .form-field-favicon-default {
    opacity: 0;
    transition: opacity 0.25s ease;
  }
  /* Range: Haken-Dot vertikal zentriert; Track-Padding-Right shift damit der
     Value-Pill nicht überdeckt wird */
  .form-field--range .form-field-control.is-filled .form-field-range-track {
    padding-right: calc(1.25rem + 0.5rem);
    transition: padding-right 0.4s cubic-bezier(.22, 1, .36, 1);
  }
  /* Color: nicht-interagiert → Value-Text als Placeholder, Swatch gedimmt */
  .form-field[data-color-display]:not(.is-interacted) .form-field-color-value {
    color: var(--form-field-placeholder);
    font-style: italic;
  }
  /* Transition auf Basis-Rule (beide Richtungen animierbar) — Default ist hell
     (browser-default opacity:1, filter:none), nur `:not(.is-interacted)` dimmt. */
  .form-field[data-color-display] .form-field-input[type="color"] {
    transition: opacity 0.3s ease, filter 0.3s ease;
  }
  .form-field[data-color-display]:not(.is-interacted) .form-field-input[type="color"] {
    opacity: 0.35;
    filter: grayscale(1);
  }

  /* ─── Base Input Styles (all types) ─── */
  .form-field-input,
  .form-field textarea,
  .form-field select {
    flex: 1;
    min-width: 0;
    border: none;
    background: transparent;
    outline: none;
    padding: 0.7rem var(--form-field-padding-x);
    font-family: inherit;
    font-size: var(--font-size-md);
    color: var(--form-field-text);
    line-height: 1.4;
    width: 100%;
    /* Brand-Akzent für native Picker-Highlights (Date/Time/Color/Range, checked-states) */
    accent-color: var(--color-primary);
    color-scheme: light;
  }
  .form-field-input::placeholder,
  .form-field textarea::placeholder {
    color: var(--form-field-placeholder);
    transition: opacity 0.2s ease;
  }
  .form-field-input:focus::placeholder,
  .form-field textarea:focus::placeholder {
    opacity: 0.5;
  }

  /* Chrome autofill neutralisieren */
  .form-field-input:-webkit-autofill,
  .form-field-input:-webkit-autofill:hover,
  .form-field-input:-webkit-autofill:focus {
    -webkit-text-fill-color: var(--form-field-text);
    -webkit-box-shadow: inset 0 0 0 1000px var(--form-field-bg);
    transition: background-color 9999s ease-in-out 0s, color 9999s ease-in-out 0s;
    caret-color: var(--color-primary);
  }

  /* ─── Trailing Icon Slot (rechts) ─── */
  .form-field-icon-slot {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding-right: var(--form-field-padding-x);
    color: var(--color-primary);
    pointer-events: none;
    transition: color 0.2s ease;
  }
  .form-field-icon-slot svg {
    width: 20px;
    height: 20px;
    fill: currentColor;
  }
  .form-field-icon-slot img.form-field-favicon {
    width: 20px;
    height: 20px;
    border-radius: 0.25rem;
    object-fit: contain;
    opacity: 0;
    transform: scale(0.85);
    transition: opacity 0.3s ease, transform 0.3s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-icon-slot img.form-field-favicon.is-loaded {
    opacity: 1;
    transform: scale(1);
  }
  .form-field-icon-slot .form-field-favicon-default {
    transition: opacity 0.3s ease;
  }
  .form-field-icon-slot:has(img.form-field-favicon.is-loaded) .form-field-favicon-default {
    display: none;
  }
  .form-field-control:focus-within .form-field-icon-slot {
    color: var(--color-primary);
  }
  /* Favicon-Resolver-Slots: alle Icon-Layer (Default-Icon, Favicon-Img, Valid-Mark) in
     dieselbe Grid-Zelle stapeln, damit der unsichtbare Favicon-<img> keinen Layout-Space
     rechts neben dem Default-Icon einnimmt. So sitzt das Icon flush am Padding-Right. */
  .form-field[data-favicon-resolver] .form-field-icon-slot {
    display: grid;
    grid-template-columns: 20px;
    place-items: center;
  }
  .form-field[data-favicon-resolver] .form-field-icon-slot > * {
    grid-area: 1 / 1;
  }

  /* Clickable icon-button inside the slot (eye toggle, clear, etc.) */
  .form-field-icon-btn {
    background: transparent;
    border: none;
    color: inherit;
    padding: 0.25rem;
    margin: -0.25rem;
    cursor: pointer;
    border-radius: 0.25rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    pointer-events: auto;
    transition: color 0.2s ease, background 0.2s ease, transform 0.2s ease;
  }
  .form-field-icon-btn:hover,
  .form-field-icon-btn:focus-visible {
    color: var(--color-primary);
    background: color-mix(in srgb, var(--color-primary) 8%, transparent);
    outline: none;
  }
  .form-field-icon-btn:focus-visible {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  .form-field-icon-btn:active { transform: scale(0.92); }
  .form-field-icon-btn svg { width: 18px; height: 18px; fill: currentColor; }
  .form-field-icon-slot:has(.form-field-icon-btn) { pointer-events: auto; }
  /* Search-Slot: X-Clear-Button braucht Luft zur Lupe rechts daneben */
  .form-field-icon-slot:has([data-search-clear-btn]) { gap: 0.5rem; }
  /* Clear-Btn nur sichtbar wenn Such-Input einen Wert hat (placeholder ist nicht mehr shown) */
  [data-search-clear-btn] { display: none; }
  .form-field:has(input[type="search"]:not(:placeholder-shown)) [data-search-clear-btn] {
    display: inline-flex;
  }

  /* ─── Leading-Icon-Slot: Icon links vom Input (z.B. Lupe in der Suche) ─── */
  /* Default `.form-field-icon-slot` sitzt rechts mit padding-right. Der Modifier
     `--leading` flippt das Padding auf die linke Seite, damit das Icon flush am
     linken Rand der Control sitzt. Reihenfolge im DOM bestimmt die visuelle
     Position (Flex folgt der DOM-Reihenfolge). */
  .form-field-icon-slot--leading {
    padding-right: 0;
    padding-left: var(--form-field-padding-x);
  }

  /* ─── Inline-CTA-Variante: integrierter CTA-Button im Eingabefeld ─── */
  /* Funktioniert für text/search/email/url-Inputs (Button am rechten Rand der
     Control, in voller Feldhöhe) und für Textareas (Button schwebt absolut
     unten rechts im .form-field-textarea-wrap). Button-Farbe ist über
     --cta-btn-bg / --cta-btn-color überschreibbar (Default Accent-Coral) —
     so kann z.B. #suche auf Neon-Gelb wechseln, ohne neue Klassen zu brauchen. */
  .form-field-cta-btn {
    --cta-btn-bg: var(--color-accent);
    --cta-btn-color: var(--cta-text-color, var(--color-light));
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    background: var(--cta-btn-bg);
    color: var(--cta-btn-color);
    border: none;
    font: inherit;
    font-weight: 600;
    font-size: 0.95rem;
    white-space: nowrap;
    cursor: pointer;
    border-radius: calc(var(--form-field-radius) - 2px);
    transition: background 0.25s ease, transform 0.2s ease, box-shadow 0.25s ease;
  }
  .form-field-cta-btn svg {
    width: 18px;
    height: 18px;
    fill: currentColor;
    flex-shrink: 0;
  }
  .form-field-cta-btn:hover {
    /* Nur Scale, kein Farbwechsel (s. .cta-main:hover) */
    transform: scale(1.05);
  }
  .form-field-cta-btn:active { transform: scale(0.97); }
  .form-field-cta-btn:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
  }

  /* Inline-CTA in normalen Inputs (text/search/email/…): Button-Pill rechts,
     volle Innenhöhe der Control mit kleinem Inset. Flex-wrap erlaubt das
     Stacken auf Smartphone-Größe (s.u.). */
  .form-field--inline-cta:not(.form-field--textarea) .form-field-control {
    flex-wrap: wrap;
    padding-right: 0.35rem;
  }
  .form-field--inline-cta:not(.form-field--textarea) > .form-field-control > .form-field-cta-btn {
    align-self: stretch;
    padding: 0 1.1rem;
    margin: 0.3rem 0;
  }

  /* Inline-CTA in Textareas: Button schwebt unten rechts. Textarea bekommt
     unten + rechts genug Padding, damit der Text nicht unter den Button läuft. */
  .form-field--inline-cta.form-field--textarea .form-field-textarea-wrap > textarea {
    padding-right: 7rem;
    padding-bottom: 3rem;
  }
  .form-field-cta-btn--floating {
    position: absolute;
    right: 0.5rem;
    bottom: 0.5rem;
    padding: 0.55rem 1.1rem;
    font-size: 0.9rem;
    z-index: 2;
  }

  /* Im Inline-CTA-Modus übernimmt der CTA-Button die rechte Seite —
     der is-filled Haken-Dot wird daher unterdrückt und die Slot-Padding-Shifts
     für den Haken-Dot werden ebenfalls deaktiviert (sonst würde der leading
     Lupe-Slot rechts plötzlich extra Platz bekommen). */
  .form-field--inline-cta .form-field-control::after {
    display: none;
  }
  .form-field--inline-cta .form-field-control.is-filled .form-field-icon-slot {
    padding-right: 0;
  }
  .form-field--inline-cta .form-field-control.is-filled .form-field-icon-slot--leading {
    padding-left: var(--form-field-padding-x);
  }
  .form-field--inline-cta.form-field--textarea .form-field-control.is-filled .form-field-textarea-wrap {
    padding-right: 0;
  }

  /* === Responsive: ≤414 (Smartphone — Inline-CTA stackt unter dem Feld) === */
  @media (max-width: 414px) {
    /* Desktop-Inset (padding-right 0.35rem) zurücksetzen — auf Mobile übernimmt
       der Button-Margin die symmetrische Einrahmung rundherum. */
    .form-field--inline-cta:not(.form-field--textarea) .form-field-control {
      padding-right: 0;
    }
    .form-field--inline-cta:not(.form-field--textarea) > .form-field-control > .form-field-cta-btn {
      flex: 0 0 calc(100% - 0.7rem);
      margin: 0.35rem;
      padding: 0.7rem 1.1rem;
      min-height: var(--form-field-height);
      border-radius: var(--form-field-radius);
    }
    .form-field--inline-cta.form-field--textarea .form-field-textarea-wrap > textarea {
      padding-right: 0;
      padding-bottom: 0.75rem;
    }
    .form-field--inline-cta.form-field--textarea .form-field-cta-btn--floating {
      position: static;
      display: flex;
      width: 100%;
      padding: 0.7rem 1.1rem;
      box-shadow: none;
      min-height: var(--form-field-height);
      font-size: 0.95rem;
    }
  }

  /* ─── Per-Type defaults (auto-styling) ─── */
  /* Email: default @ icon via slot (rendered in HTML); Favicon will replace */
  /* Search: x-clear button appears when value present */
  .form-field-input[type="search"]::-webkit-search-cancel-button {
    -webkit-appearance: none;
    appearance: none;
  }

  /* Date / Time / Color: native picker, but icon overlay decoration */
  /* Placeholder-Look bei leerem Feld (Format-Hinweis "tt.mm.jjjj" in light grey),
     primary color sobald is-filled (Wert gesetzt) */
  .form-field-input[type="date"],
  .form-field-input[type="time"],
  .form-field-input[type="datetime-local"],
  .form-field-input[type="month"],
  .form-field-input[type="week"] {
    color: var(--form-field-placeholder);
    font-family: inherit;
    transition: color 0.2s ease;
  }
  .form-field-input[type="date"]::-webkit-datetime-edit,
  .form-field-input[type="time"]::-webkit-datetime-edit,
  .form-field-input[type="datetime-local"]::-webkit-datetime-edit,
  .form-field-input[type="month"]::-webkit-datetime-edit,
  .form-field-input[type="week"]::-webkit-datetime-edit {
    color: var(--form-field-placeholder);
  }
  .form-field-control.is-filled .form-field-input[type="date"],
  .form-field-control.is-filled .form-field-input[type="time"],
  .form-field-control.is-filled .form-field-input[type="datetime-local"],
  .form-field-control.is-filled .form-field-input[type="month"],
  .form-field-control.is-filled .form-field-input[type="week"],
  .form-field-control.is-filled .form-field-input[type="date"]::-webkit-datetime-edit,
  .form-field-control.is-filled .form-field-input[type="time"]::-webkit-datetime-edit,
  .form-field-control.is-filled .form-field-input[type="datetime-local"]::-webkit-datetime-edit {
    color: var(--form-field-text);
  }
  .form-field-input[type="date"]::-webkit-calendar-picker-indicator,
  .form-field-input[type="time"]::-webkit-calendar-picker-indicator,
  .form-field-input[type="datetime-local"]::-webkit-calendar-picker-indicator {
    background: none;
    opacity: 0;
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    cursor: pointer;
  }
  .form-field-control:has(.form-field-input[type="date"]),
  .form-field-control:has(.form-field-input[type="time"]),
  .form-field-control:has(.form-field-input[type="datetime-local"]) {
    cursor: pointer;
  }

  /* Color input: native, but inside a brand-wrapper */
  .form-field-input[type="color"] {
    -webkit-appearance: none;
    appearance: none;
    width: 3rem;
    height: 2rem;
    border: none;
    background: transparent;
    cursor: pointer;
    padding: 0;
    flex: 0 0 auto;
    margin-left: var(--form-field-padding-x);
  }
  .form-field-input[type="color"]::-webkit-color-swatch-wrapper { padding: 0; }
  .form-field-input[type="color"]::-webkit-color-swatch {
    border: 1px solid var(--form-field-border);
    border-radius: 0.3rem;
  }
  .form-field-input[type="color"]::-moz-color-swatch {
    border: 1px solid var(--form-field-border);
    border-radius: 0.3rem;
  }
  .form-field-color-value {
    flex: 1;
    padding: 0 0.5rem;
    font-family: 'Roboto Mono', ui-monospace, monospace;
    font-size: var(--font-size-md);
    color: var(--color-primary);
    pointer-events: none;
  }

  /* ─── Range (Slider) ─── */
  .form-field--range .form-field-control {
    flex-direction: column;
    align-items: stretch;
    padding: 0.75rem 1rem;
    background: var(--color-light);
    gap: 0.5rem;
  }
  .form-field-range-track {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.75rem;
  }
  .form-field-range {
    -webkit-appearance: none;
    appearance: none;
    flex: 1;
    height: 4px;
    background: color-mix(in srgb, var(--color-primary) 18%, transparent);
    border-radius: 999px;
    outline: none;
    margin: 0;
    cursor: pointer;
  }
  .form-field-range::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 18px;
    height: 18px;
    background: var(--color-icon);
    border: 2px solid var(--color-primary);
    border-radius: 50%;
    cursor: grab;
    transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.2s ease, border-color 0.2s ease;
    box-shadow: 0 1px 4px color-mix(in srgb, var(--color-primary) 30%, transparent);
  }
  .form-field-range::-moz-range-thumb {
    width: 18px;
    height: 18px;
    background: var(--color-icon);
    border: 2px solid var(--color-primary);
    border-radius: 50%;
    cursor: grab;
    transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.2s ease, border-color 0.2s ease;
  }
  .form-field-range:hover::-webkit-slider-thumb { transform: scale(1.18); }
  .form-field-range:hover::-moz-range-thumb { transform: scale(1.18); }
  .form-field-range:active::-webkit-slider-thumb { cursor: grabbing; transform: scale(1.05); }
  /* Not-selected (user hasn't interacted yet): muted thumb + placeholder-style value pill */
  .form-field--range:not(.is-interacted) .form-field-range::-webkit-slider-thumb {
    background: var(--color-light-contrast);
    border-color: color-mix(in srgb, var(--color-primary) 35%, transparent);
    box-shadow: none;
  }
  .form-field--range:not(.is-interacted) .form-field-range::-moz-range-thumb {
    background: var(--color-light-contrast);
    border-color: color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  .form-field--range:not(.is-interacted) .form-field-range-value {
    background: color-mix(in srgb, var(--color-primary) 15%, transparent);
    color: color-mix(in srgb, var(--color-primary) 55%, transparent);
  }
  .form-field-range-value {
    min-width: 3rem;
    padding: 0.2rem 0.55rem;
    background: var(--color-primary);
    color: var(--color-light);
    border-radius: 0.35rem;
    font-size: var(--font-size-sm);
    font-weight: 600;
    text-align: center;
    font-variant-numeric: tabular-nums;
    transition: background 0.2s ease, color 0.2s ease;
  }

  /* ─── Number (Stepper) ─── */
  .form-field--number .form-field-input[type="number"] {
    -moz-appearance: textfield;
    appearance: textfield;
    text-align: center;
    font-variant-numeric: tabular-nums;
    font-weight: 600;
  }
  .form-field--number .form-field-input[type="number"]::-webkit-outer-spin-button,
  .form-field--number .form-field-input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none;
    appearance: none;
    margin: 0;
  }
  /* Stepper-Buttons im Range-Value-Pill-Look (gräuliche tinted-Primary-Pille) */
  .form-field-stepper {
    background: color-mix(in srgb, var(--color-primary) 15%, transparent);
    color: color-mix(in srgb, var(--color-primary) 55%, transparent);
    border: none;
    border-radius: 0.35rem;
    font-size: var(--font-size-md);
    cursor: pointer;
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2rem;
    min-height: 2rem;
    padding: 0.3rem 0.5rem;
    margin: 0 0.5rem;
    transition: background 0.15s ease, color 0.15s ease;
    user-select: none;
  }
  .form-field-stepper:hover {
    background: color-mix(in srgb, var(--color-primary) 30%, transparent);
    color: var(--color-primary);
  }
  .form-field-stepper:active {
    background: var(--color-icon);
    color: var(--color-primary);
  }
  .form-field-stepper:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px var(--color-primary);
  }
  .form-field-stepper svg { width: 14px; height: 14px; fill: currentColor; }
  /* Number-Input: Wert zentriert; kein extra padding */
  .form-field--number .form-field-input {
    padding-left: 0;
    padding-right: 0;
  }
  /* + Stepper hat IMMER den größeren Margin-Right — so bleibt der Slot für Number-Icon/Haken-Dot konstant */
  .form-field--number .form-field-stepper-up {
    margin-right: calc(1.25rem + 1rem + 0.5rem);
  }
  /* Number-Slot: Money-Bill-Icon via Sprite (statt Inline-Data-URI),
     wechselt im is-filled-Zustand auf den Standard-Haken-Dot */
  .form-field--number .form-field-number-icon {
    position: absolute;
    right: 1rem;
    top: var(--check-top);
    width: 1.25rem;
    height: 1.25rem;
    transform: translateY(var(--check-translate-y));
    fill: var(--color-primary);
    pointer-events: none;
    z-index: 2;
    transition: opacity 0.25s ease;
  }
  .form-field--number .form-field-control.is-filled .form-field-number-icon {
    opacity: 0;
  }

  .form-field[data-money-format] .form-field-input {
    text-align: right;
    padding-right: 0.25rem;
    font-variant-numeric: tabular-nums;
    font-weight: 500;
  }

  /* ─── Textarea Auto-Grow (CSS-Grid trick) ─── */
  .form-field--textarea .form-field-control {
    min-height: auto;
    padding: 0;
  }
  .form-field-textarea-wrap {
    flex: 1;
    padding: 0.7rem var(--form-field-padding-x);
    position: relative;
  }
  .form-field-textarea-wrap > textarea {
    field-sizing: content;
    resize: none;
    padding: 0;
    min-height: 4.5rem;
    line-height: 1.4;
    font: inherit;
    width: 100%;
    display: block;
  }
  .form-field-counter {
    align-self: flex-end;
    font-size: var(--font-size-sm);
    color: var(--color-primary-muted); /* war Primary @ 55% = 3,13:1 ❌; muted (Primary @ 75%) = 5,35:1 ✅ auf weißer Karte — wie .sidebar-price-sub */
    font-variant-numeric: tabular-nums;
    padding: 0 var(--form-field-padding-x) 0.5rem;
  }
  .form-field-counter.is-near-limit { color: var(--color-accent); font-weight: 600; }

  /* ─── Password Strength Bar ─── */
  .form-field-strength {
    display: flex;
    gap: 0.3rem;
    margin-top: 0.4rem;
    align-items: center;
    position: relative;
    cursor: help;
  }
  .form-field-strength-bars {
    display: flex;
    flex: 1;
    gap: 0.25rem;
  }
  .form-field-strength-bar {
    flex: 1;
    height: 4px;
    background: color-mix(in srgb, var(--color-primary) 12%, transparent);
    border-radius: 999px;
    transition: background-color 0.3s ease;
  }
  .form-field-strength[data-score="1"] .form-field-strength-bar:nth-child(-n+1),
  .form-field-strength[data-score="2"] .form-field-strength-bar:nth-child(-n+2),
  .form-field-strength[data-score="3"] .form-field-strength-bar:nth-child(-n+3),
  .form-field-strength[data-score="4"] .form-field-strength-bar:nth-child(-n+4) {
    background: var(--color-icon);
  }
  .form-field-strength[data-score="1"] .form-field-strength-bar:nth-child(-n+1) { background: color-mix(in srgb, var(--color-accent), white 10%); }
  .form-field-strength[data-score="2"] .form-field-strength-bar:nth-child(-n+2) { background: color-mix(in srgb, var(--color-accent), var(--color-icon) 50%); }
  .form-field-strength-label {
    font-size: var(--font-size-sm);
    font-weight: 600;
    color: color-mix(in srgb, var(--color-primary) 70%, transparent);
    min-width: 4rem;
    text-align: right;
  }
  /* Rules-Popover: zeigt 5 Anforderungen mit ×/✓ — sichtbar bei Hover/Focus der Strength-Bar
     oder via JS-Klasse .is-rules-visible (z.B. während Tippen) */
  .form-field-strength-rules {
    position: absolute;
    top: calc(100% + 0.6rem);
    left: 0;
    right: 0;
    margin: 0;
    padding: 0.7rem 0.85rem;
    list-style: none;
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
    box-shadow:
      0 0 0 1px color-mix(in srgb, var(--color-primary) 15%, transparent),
      0 10px 28px color-mix(in srgb, var(--color-primary) 18%, transparent);
    font-size: var(--font-size-sm);
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    z-index: 5;
    opacity: 0;
    transform: translateY(-4px);
    pointer-events: none;
    transition: opacity 0.2s ease, transform 0.2s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-strength-rules::before {
    content: "";
    position: absolute;
    top: -5px;
    left: 1rem;
    width: 10px;
    height: 10px;
    background: var(--color-light-contrast);
    box-shadow: -1px -1px 0 color-mix(in srgb, var(--color-primary) 15%, transparent);
    transform: rotate(45deg);
  }
  .form-field-strength:hover .form-field-strength-rules,
  .form-field-strength:focus-within .form-field-strength-rules,
  .form-field-strength.is-rules-visible .form-field-strength-rules {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
  }
  .form-field-strength-rules li {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--color-accent);
    transition: color 0.2s ease;
  }
  .form-field-strength-rules li[data-passed="true"] {
    color: color-mix(in srgb, var(--color-primary), #1f7a3a 35%);
  }
  .form-field-strength-rules li svg {
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    fill: currentColor;
  }
  .form-field-strength-rules li .rule-ico-ok { display: none; }
  .form-field-strength-rules li[data-passed="true"] .rule-ico-fail { display: none; }
  .form-field-strength-rules li[data-passed="true"] .rule-ico-ok { display: inline-block; }

  /* ─── Checkbox & Radio (custom) ─── */
  .form-field-check {
    display: inline-flex;
    align-items: flex-start;
    gap: 0.7rem;
    cursor: pointer;
    user-select: none;
    line-height: 1.4;
    padding: 0.3rem 0;
  }
  .form-field-check input[type="checkbox"],
  .form-field-check input[type="radio"] {
    position: absolute;
    opacity: 0;
    pointer-events: none;
    width: 0;
    height: 0;
  }
  .form-field-check-box {
    flex-shrink: 0;
    width: 1.25rem;
    height: 1.25rem;
    border: none;
    background: var(--color-light-contrast);
    border-radius: 0.25rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* Box mittig zur ERSTEN Textzeile (line-height 1.4) — zentriert einzeilige Labels
       (z.B. Anrede Frau/Herr/divers) korrekt und bleibt bei mehrzeiligen (Label+Hint)
       an der ersten Zeile ausgerichtet. (1.4em Zeilenhöhe − 1.25rem Box) / 2 */
    margin-top: calc((1.4em - 1.25rem) / 2);
    /* IDLE: 2px tinted teal ring (war vorher nur bei Hover sichtbar) */
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
    transition: box-shadow 0.2s ease, background 0.2s ease, transform 0.15s ease;
    position: relative;
  }
  .form-field-check input[type="radio"] + .form-field-check-box {
    border-radius: 50%;
  }
  /* HOVER + SELECTED: solid Primary-Ring */
  .form-field-check:hover .form-field-check-box,
  .form-field-check input:checked + .form-field-check-box,
  .form-field-check input:focus-visible + .form-field-check-box {
    box-shadow: 0 0 0 2px var(--color-primary);
  }
  .form-field-check-box svg {
    width: 0.9rem;
    height: 0.9rem;
    color: var(--color-primary);
    opacity: 0;
    transition: opacity 0.15s ease 0.05s;
  }
  .form-field-check-box svg path {
    fill: none;
    stroke: currentColor;
    stroke-width: 3;
    stroke-linecap: round;
    stroke-linejoin: round;
    stroke-dasharray: 24;
    stroke-dashoffset: 24;
    transition: stroke-dashoffset 0.3s cubic-bezier(.22, 1, .36, 1) 0.05s;
  }
  /* Checkbox + Radio: gleiche Checked-Optik (Yellow-Fill + Check-Icon), nur unterschiedlicher
     Border-Radius (Square vs. Circle) */
  .form-field-check input:checked + .form-field-check-box {
    background: var(--color-icon);
    transform: scale(1.05);
    animation: form-field-check-pop 0.3s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-check input:checked + .form-field-check-box svg { opacity: 1; }
  .form-field-check input:checked + .form-field-check-box svg path { stroke-dashoffset: 0; }
  .form-field-check-label { color: var(--color-primary); }
  .form-field-check-hint {
    display: block;
    font-size: var(--font-size-sm);
    color: var(--color-primary-muted); /* war Primary @ 65% = 4,06:1 ❌; muted (75%) = 5,35:1 ✅ */
    margin-top: 0.1rem;
  }
  @keyframes form-field-check-pop {
    0% { transform: scale(0.85); }
    60% { transform: scale(1.12); }
    100% { transform: scale(1.05); }
  }

  /* ─── Fieldset / Legend ─── */
  /* Legend sitzt AUSSERHALB der cream-Karte (oberhalb, wie ein form-field-label).
     Die Optionen werden im `.form-field-fieldset-body`-Wrapper als cream-Karte gestylt. */
  .form-field-fieldset {
    background: transparent;
    border: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0;
  }
  .form-field-fieldset legend {
    font-size: var(--font-size-sm);
    font-weight: 600;
    color: var(--color-primary);
    padding: 0;
    margin: 0 0 0.375rem 0;
    background: transparent;
  }
  .form-field-fieldset-body {
    background: var(--color-light);
    border-radius: var(--form-field-radius);
    padding: 0.75rem 1rem;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    transition: box-shadow 0.2s ease;
  }
  .form-field-fieldset-body:hover {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  /* Single Checkbox/Radio (kein Fieldset-Wrapper): die form-field-check selbst bekommt
     den light-Hintergrund als Karten-Container, identisch zum Fieldset-Look */
  .form-field > .form-field-check {
    background: var(--color-light);
    border-radius: var(--form-field-radius);
    padding: 0.75rem 1rem;
    transition: box-shadow 0.2s ease;
  }
  .form-field > .form-field-check:hover {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }

  /* ─── Switch (iOS-style toggle) ─── */
  .form-field-switch {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    cursor: pointer;
    user-select: none;
    background: var(--color-light);
    border-radius: var(--form-field-radius);
    padding: 0.5rem var(--form-field-padding-x);
    min-height: var(--form-field-height);
    transition: box-shadow 0.2s ease;
  }
  .form-field-switch:hover {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 25%, transparent);
  }
  .form-field-switch:has(input:focus-visible) {
    box-shadow: 0 0 0 2px var(--color-primary);
  }
  .form-field-switch input { position: absolute; opacity: 0; pointer-events: none; }
  .form-field-switch-track {
    width: 2.6rem;
    height: 1.5rem;
    background: color-mix(in srgb, var(--color-primary) 25%, transparent);
    border-radius: 999px;
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    padding: 0 0.15rem;
    box-sizing: border-box;
    transition: background 0.25s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-switch-thumb {
    width: 1.2rem;
    height: 1.2rem;
    background: var(--color-light-contrast);
    border-radius: 50%;
    transform: translateX(0);
    transition: transform 0.25s cubic-bezier(.22, 1, .36, 1), background 0.25s ease;
    box-shadow: 0 1px 3px color-mix(in srgb, var(--color-primary) 30%, transparent);
  }
  .form-field-switch input:checked ~ .form-field-switch-track {
    background: var(--color-primary);
  }
  .form-field-switch input:checked ~ .form-field-switch-track .form-field-switch-thumb {
    transform: translateX(1.1rem);
    background: var(--color-icon);
  }

  /* ─── Combobox / Custom Select ─── */
  .form-field-combobox {
    position: relative;
  }
  /* Haken-Dot rechts wenn etwas ausgewählt ist — Box-/Haken-Farben MÜSSEN mit
     .form-field-control::after übereinstimmen: Teal-Box (--color-primary) +
     Neon-Gelb-Haken (--color-icon). (Waren hier versehentlich invertiert → Select
     zeigte gelbe Box + Teal-Haken, alle anderen Felder Teal-Box + gelber Haken.) */
  .form-field-combobox::after {
    content: "\2713";
    position: absolute;
    right: 1rem;
    top: 50%;
    width: 1.25rem;
    height: 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 0.2rem;
    background: var(--color-primary);
    color: var(--color-icon);
    font-size: var(--font-size-md);
    font-weight: 800;
    line-height: 1;
    box-sizing: border-box;
    transform: translateY(-50%) scale(0);
    transition: transform 0.35s cubic-bezier(.22, 1, .36, 1);
    pointer-events: none;
    z-index: 2;
  }
  .form-field-combobox.is-filled::after {
    transform: translateY(-50%) scale(1);
  }
  /* Bei is-filled: Trigger-Padding-Right + Chevron rückt nach links, damit der Haken-Dot Platz hat */
  .form-field-combobox.is-filled .form-field-combobox-trigger {
    padding-right: calc(var(--form-field-padding-x) + 1.25rem + 0.5rem);
  }
  .form-field-combobox > select.form-field-native-select {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
    padding: 0;
    margin: -1px;
  }
  .form-field-combobox-trigger {
    width: 100%;
    min-height: var(--form-field-height);
    background: var(--color-light);
    border: none;
    border-radius: var(--form-field-radius);
    padding: 0.5rem var(--form-field-padding-x);
    display: flex;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
    text-align: left;
    color: var(--color-primary);
    font-family: inherit;
    font-size: var(--font-size-md);
    transition: box-shadow 0.2s ease, padding-right 0.4s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-combobox-trigger:hover {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  .form-field-combobox-trigger[aria-expanded="true"],
  .form-field-combobox-trigger:focus-visible {
    box-shadow: 0 0 0 2px var(--color-primary);
    outline: none;
  }
  .form-field-combobox-value {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .form-field-combobox-value.is-placeholder { color: var(--form-field-placeholder); }
  .form-field-combobox-chevron {
    flex-shrink: 0;
    width: 0.9rem;
    height: 0.9rem;
    fill: currentColor;
    color: var(--color-primary);
    transform: rotate(90deg);
    transition: transform 0.25s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-combobox-trigger[aria-expanded="true"] .form-field-combobox-chevron {
    transform: rotate(-90deg);
  }
  /* Clear-Button im Single-Select: sichtbar wenn etwas gewählt ist, ersetzt visuell den Haken-Dot Slot */
  .form-field-combobox-clear {
    background: transparent;
    border: none;
    color: var(--color-primary);
    cursor: pointer;
    padding: 0.25rem;
    margin: 0;
    border-radius: 0.25rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition: background 0.2s ease, transform 0.15s ease;
  }
  .form-field-combobox-clear[hidden] { display: none; }
  .form-field-combobox-clear:hover {
    background: color-mix(in srgb, var(--color-primary) 10%, transparent);
  }
  .form-field-combobox-clear:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent);
  }
  .form-field-combobox-clear:active { transform: scale(0.92); }
  .form-field-combobox-clear svg { width: 16px; height: 16px; fill: currentColor; }
  .form-field-combobox-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    flex: 1;
    min-width: 0;
  }
  .form-field-combobox-chip {
    background: color-mix(in srgb, var(--color-primary) 10%, transparent);
    color: var(--color-primary);
    padding: 0.3rem 0.5rem 0.3rem 0.6rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    font-weight: 500;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
  }
  .form-field-combobox-chip-remove {
    background: transparent;
    border: none;
    cursor: pointer;
    color: inherit;
    padding: 0;
    width: 14px;
    height: 14px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    transition: background 0.15s ease;
  }
  .form-field-combobox-chip-remove:hover { background: color-mix(in srgb, var(--color-primary) 20%, transparent); }
  .form-field-combobox-chip-remove svg { width: 10px; height: 10px; fill: currentColor; }

  .form-field-combobox-popup {
    position: absolute;
    top: calc(100% + 0.4rem);
    left: 0;
    right: 0;
    z-index: 50;
    background: var(--color-light-contrast);
    border: 1px solid var(--form-field-border);
    border-radius: var(--form-field-radius);
    box-shadow: 0 8px 24px color-mix(in srgb, var(--color-primary) 18%, transparent);
    padding: 0.4rem;
    opacity: 0;
    transform: translateY(-4px) scale(0.98);
    transform-origin: top center;
    pointer-events: none;
    transition: opacity 0.18s ease, transform 0.18s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-combobox-trigger[aria-expanded="true"] + .form-field-combobox-popup {
    opacity: 1;
    transform: translateY(0) scale(1);
    pointer-events: auto;
  }
  .form-field-combobox-listbox {
    max-height: 16rem;
    overflow-y: auto;
    margin: 0;
    padding: 0;
    list-style: none;
  }
  .form-field-combobox-search {
    width: 100%;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--form-field-border);
    border-radius: 0.35rem;
    background: var(--color-light);
    color: var(--color-primary);
    font: inherit;
    margin-bottom: 0.3rem;
    outline: none;
  }
  .form-field-combobox-search:focus { border-color: var(--color-primary); }
  .form-field-combobox-option {
    padding: 0.5rem 0.6rem 0.5rem 2.2rem;
    border-radius: 0.3rem;
    cursor: pointer;
    position: relative;
    color: var(--color-primary);
    line-height: 1.4;
    user-select: none;
    transition: background 0.15s ease;
  }
  .form-field-combobox-option:hover,
  .form-field-combobox-option.is-active {
    background: color-mix(in srgb, var(--color-primary) 8%, transparent);
  }
  .form-field-combobox-option::before {
    content: "";
    position: absolute;
    left: 0.5rem;
    top: 50%;
    transform: translateY(-50%);
    width: 1.25rem;
    height: 1.25rem;
    border-radius: 0.2rem;
    background: transparent;
    transition: background 0.2s ease, transform 0.2s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-combobox-option[aria-selected="true"]::before {
    content: "\2713";
    background: var(--color-icon);
    color: var(--color-primary);
    font-weight: 800;
    font-size: var(--font-size-sm);
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
  }
  .form-field-combobox-option[aria-disabled="true"] { opacity: 0.4; cursor: not-allowed; }
  .form-field-combobox-empty {
    padding: 1rem;
    text-align: center;
    color: color-mix(in srgb, var(--color-primary) 50%, transparent);
    font-size: var(--font-size-md);
  }

  /* ─── File Drop-Zone ─── */
  .form-field--file .form-field-control {
    padding: 0;
    min-height: auto;
    background: var(--color-light);
    border: 2px dashed color-mix(in srgb, var(--color-primary) 30%, transparent);
    box-shadow: none;
    transition: border-color 0.2s ease, background 0.2s ease;
  }
  .form-field--file .form-field-control:hover,
  .form-field--file .form-field-control.is-dragover {
    border-color: var(--color-primary);
    box-shadow: none;
  }
  .form-field--file .form-field-control:focus-within {
    border-color: var(--color-primary);
    box-shadow: none;
  }
  .form-field--file .form-field-control.is-dragover {
    border-color: var(--color-accent);
    border-style: solid;
  }
  .form-field-dropzone {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 1.5rem 1rem;
    text-align: center;
    cursor: pointer;
    color: var(--color-primary);
    gap: 0.4rem;
  }
  .form-field-dropzone input[type="file"] {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    pointer-events: none;
  }
  .form-field-dropzone-icon {
    width: 32px; height: 32px;
    fill: currentColor;
    opacity: 0.7;
  }
  .form-field-dropzone-primary {
    font-weight: 600;
  }
  .form-field-dropzone-primary u {
    color: var(--color-accent);
    text-decoration-color: var(--color-accent);
    text-underline-offset: 2px;
  }
  .form-field-dropzone-secondary {
    font-size: var(--font-size-sm);
    color: var(--color-primary-muted); /* war Primary @ 60% = 3,56:1 ❌; muted (75%) = 5,35:1 ✅ */
  }
  .form-field-files {
    list-style: none;
    margin: 0.6rem 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
  }
  .form-field-file {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.5rem 0.75rem;
    background: var(--color-light);
    border-radius: 0.4rem;
    font-size: var(--font-size-md);
  }
  .form-field-file-thumb {
    width: 32px; height: 32px;
    border-radius: 0.3rem;
    object-fit: cover;
    background: color-mix(in srgb, var(--color-primary) 10%, transparent);
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .form-field-file-thumb svg { width: 18px; height: 18px; fill: var(--color-primary); }
  .form-field-file-name {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--color-primary);
  }
  .form-field-file-size {
    color: color-mix(in srgb, var(--color-primary) 55%, transparent);
    font-size: var(--font-size-sm);
    font-variant-numeric: tabular-nums;
  }
  .form-field-file-remove {
    background: transparent;
    border: none;
    cursor: pointer;
    color: var(--color-primary);
    opacity: 0.6;
    padding: 0.2rem;
    border-radius: 0.25rem;
    transition: opacity 0.15s ease, color 0.15s ease;
  }
  .form-field-file-remove:hover { opacity: 1; color: var(--color-accent); }
  .form-field-file-remove svg { width: 16px; height: 16px; fill: currentColor; }

  /* ─── Typo-Suggestion (Email) ─── */
  .form-field-suggest {
    font-size: var(--font-size-sm);
    color: var(--color-primary);
    margin-top: 0.25rem;
    animation: form-field-error-in 0.25s cubic-bezier(.22, 1, .36, 1);
  }
  .form-field-suggest-btn {
    background: transparent;
    border: none;
    padding: 0;
    color: var(--color-accent);
    font: inherit;
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 2px;
    font-weight: 600;
  }
  .form-field-suggest-btn:hover { color: color-mix(in srgb, var(--color-accent), black 15%); }


  /* ─── Submit Actions ─── */
  .form-field-actions {
    display: flex;
    gap: 0.75rem;
    align-items: center;
    margin-top: 1rem;
    flex-wrap: wrap;
  }
  .form-field-submit {
    padding: 0.85rem 2rem;
    background: var(--color-accent);
    color: var(--color-light);
    border: none;
    border-radius: var(--form-field-radius);
    font: inherit;
    font-weight: 600;
    font-size: var(--font-size-md);
    cursor: pointer;
    transition: background 0.2s ease, transform 0.15s cubic-bezier(.22, 1, .36, 1), box-shadow 0.2s ease;
    position: relative;
    will-change: transform;
  }
  .form-field-submit:hover {
    background: color-mix(in srgb, var(--color-accent), black 12%);
    box-shadow: 0 6px 18px color-mix(in srgb, var(--color-accent) 35%, transparent);
  }
  .form-field-submit:active { transform: scale(0.98); }
  .form-field-submit:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 35%, transparent);
  }
  .form-field-reset {
    padding: 0.85rem 1.5rem;
    background: transparent;
    color: var(--color-primary);
    border: 1px solid var(--form-field-border);
    border-radius: var(--form-field-radius);
    font: inherit;
    font-weight: 500;
    font-size: var(--font-size-md);
    cursor: pointer;
    transition: background 0.2s ease, border-color 0.2s ease;
  }
  .form-field-reset:hover {
    background: color-mix(in srgb, var(--color-primary) 6%, transparent);
    border-color: var(--form-field-border-hover);
  }
  .form-field-reset:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 22%, transparent);
  }

  /* ─── Shake on invalid submit ─── */
  @keyframes form-field-shake {
    0%, 100% { transform: translateX(0); }
    20% { transform: translateX(calc(-1 * var(--form-field-shake-distance))); }
    40% { transform: translateX(var(--form-field-shake-distance)); }
    60% { transform: translateX(calc(-1 * var(--form-field-shake-distance))); }
    80% { transform: translateX(var(--form-field-shake-distance)); }
  }
  /* Shake nur nachdem das Form mindestens 1× submitted wurde. JS setzt .is-submitted am Form
     und nutzt einen Reflow-Trick zum Re-Triggern; CSS macht den Rest via :user-invalid. */
  .is-submitted .form-field:has(:user-invalid) .form-field-control,
  .is-submitted .form-field:has(:user-invalid) .form-field-combobox-trigger,
  .is-submitted .form-field:has(:user-invalid) .form-field-check-box {
    animation: form-field-shake 0.4s cubic-bezier(.36, .07, .19, .97);
  }

  @keyframes form-field-error-in {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: translateY(0); }
  }

  /* ─── Reduced Motion ─── */
  @media (prefers-reduced-motion: reduce) {
    .form-field-control,
    .form-field-control::after,
    .form-field-icon-slot,
    .form-field-textarea-wrap,
    .form-field-input,
    .form-field-icon-slot img.form-field-favicon,
    .form-field-check-box,
    .form-field-check-box svg,
    .form-field-check-box svg path,
    .form-field-switch-thumb,
    .form-field-switch-track,
    .form-field-combobox-trigger,
    .form-field-combobox-popup,
    .form-field-combobox-chevron,
    .form-field-submit,
    .form-field-reset,
    .form-field-stepper,
    .form-field-error,
    .form-field-suggest {
      transition: none !important;
      animation: none !important;
    }
    /* Reduced motion: Haken-Dot snappt direkt rein/raus */
    .form-field-control.is-filled::after {
      transform: translateY(var(--check-translate-y)) scale(1);
    }
    .is-submitted .form-field:has(:user-invalid) .form-field-control,
    .is-submitted .form-field:has(:user-invalid) .form-field-combobox-trigger,
    .is-submitted .form-field:has(:user-invalid) .form-field-check-box {
      animation: none;
      outline: 2px solid var(--color-accent);
      outline-offset: 2px;
    }
  }

  /* ─── Responsive (Legacy 900px — wird in Phase 2 section-weise zu 1280/414 migriert) ─── */
  @media (max-width: 900px) {
    /* Hero-Regeln migriert zu eigenem Block bei .hero-title-Definition (1280 + 414) */
    /* Nav-Regeln migriert zum Nav-Drawer-Block (1280 + 414) */
    .toc-section, .share-section { padding-left: 0; padding-right: 0; }
    .content { padding-left: 1.25rem; padding-right: 1.25rem; }
    #termine { padding: 2.5rem 0; }
    .termine-layout { flex-direction: column; }
    .termine-left { width: 100%; }
    .termine-side { width: 100%; }
    .termine-sidebar { width: 100%; position: relative; }
    .termine-more { width: 100%; }
    .termine-viewswitch { margin-left: auto; margin-right: 0; }
    .termin-card { gap: 0.75rem; padding: 0.8rem 1rem; }
    .termin-date { font-size: var(--font-size-md); }
    /* Info-Bar-Regeln migriert zu eigenem Block (1280 + <650) bei .info-bar-cta */
  }

  /* ─── Zielgruppe ─── */
  #zielgruppe {
    max-width: 90rem;
  }
  .section-zielgruppe-intro > p:not(.notch-subtitle) {
    margin: 0;
  }

  /* ─── Vorkurs ─── */
  #vorkurs {
    max-width: 90rem;
  }
  .vorkurs-layout {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 2.5rem;
    align-items: start;
  }
  .vorkurs-intro > p {
    margin: 0;
  }
  /* === Responsive: ≤1280 (Vorkurs) === */
  @media (max-width: 1279.98px) {
    .vorkurs-layout {
      grid-template-columns: 1fr;
      gap: 1.5rem;
    }
  }
  .kurs-card-category {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-size: var(--font-size-md);
    color: var(--color-light);
    opacity: 0.65;
    text-decoration: none;
    margin-bottom: 0.35rem;
    min-height: 24px;
    transition: opacity 0.2s;
  }
  .kurs-card-category:hover { opacity: 1; }
  .kurs-card-category svg {
    width: 14px;
    height: 14px;
    fill: var(--color-light);
    flex-shrink: 0;
  }
  .kurs-card-level-group {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
  }
  .kurs-card-level {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    background: rgba(255, 255, 255, 0.10);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    padding: 0.4rem 0.9rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-sm);
    line-height: 1.1;
    color: var(--color-light);
    font-weight: 500;
    margin-bottom: 0.5rem;
  }
  .kurs-card-level-group .kurs-card-rating {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    margin: 0 0 0 auto;
  }
  .kurs-card-level-group .kurs-card-level {
    margin-bottom: 0;
  }
  .kurs-card-level svg {
    width: 16px;
    height: 16px;
    fill: var(--color-icon);
    flex-shrink: 0;
  }
  .kurs-card-title {
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-light);
    margin: 0 0 0.5rem;
    line-height: 1.4;
  }
  .kurs-card-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    margin-right: 3rem;
    color: var(--color-light);
    font-size: var(--font-size-md);
  }
  .kurs-card-meta-item {
    display: flex;
    align-items: center;
    gap: 0.4rem;
  }
  .kurs-card-meta-item svg {
    width: 18px;
    height: 18px;
    fill: var(--color-light);
    flex-shrink: 0;
  }
  .kurs-card-summary {
    font-size: var(--font-size-md);
    opacity: 0.65;
    margin: 0 0 1rem;
    line-height: 1.45;
  }
  .kurs-card-rating {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin-bottom: 0.5rem;
  }
  .kurs-card-rating .stars {
    margin-bottom: 0;
    gap: 0.15rem;
  }
  .kurs-card-rating .star {
    width: 0.9rem;
    height: 0.9rem;
  }
  .kurs-card-rating .star-filled {
    fill: var(--color-icon);
    filter: none;
  }
  .kurs-card-cta {
    display: block;
    text-align: center;
    background: var(--color-accent);
    color: var(--cta-text-color, var(--color-light));
    text-decoration: none;
    padding: 0.45rem 1.1rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-sm);
    font-weight: 600;
    transition: background 0.25s;
  }
  .kurs-card-cta:hover {
    /* Nur Scale, kein Farbwechsel (s. .cta-main:hover) */
    transform: scale(1.05);
  }
  .kurs-card-body {
    display: flex;
    gap: 1.5rem;
    align-items: flex-end;
  }
  .kurs-card-img {
    width: 150px;
    flex-shrink: 0;
    align-self: flex-end;
    border-radius: 0 0 var(--radius-sm) 0;
    object-fit: contain;
    transform: scaleX(-1);
    margin: 0 -3rem -1.5rem 0;
  }
  .kurs-card-content {
    flex: 1;
    min-width: 0;
  }
  #vorkurs .card {
    transition: box-shadow 0.35s ease, opacity 1s cubic-bezier(0.16, 1, 0.3, 1), transform 0.35s ease;
  }
  #vorkurs .card:hover {
    transform: translateY(-6px);
  }
  #vorkurs .kurs-card-body {
    flex-direction: row-reverse;
  }
  #vorkurs .kurs-card-img {
    transform: none;
    margin: 0;
    border-radius: 0 0 0 var(--radius-sm);
    align-self: flex-end;
  }
  .kurs-card-link {
    position: absolute;
    inset: 0;
    z-index: 4;
    border-radius: var(--radius-sm);
    text-decoration: none;
    color: inherit;
  }
  /* Standard-Regel: Card-Spalten-Layout für ALLE Cards mit Visual.
     Visual links (10rem fest), Content rechts.
     padding-left = visual-width (10rem) + Visual-left-offset (1.5rem) + Gap (1.25rem)
     damit der Content immer den gleichen Abstand zum Visual hat — unabhängig
     von der Card-Container-Breite oder Sektion (Vorkurs/Folgekurse/Empfehlungen/etc.).
     Doppel-Class (.card.has-notch) für Specificity-Boost gegen .card.is-bottom-right. */
  .card.has-notch:has(> .card-visual) {
    padding-left: calc(10rem + 1.5rem + 1.25rem);
  }
  /* Reusable: applies a small top-right notch clip-path to any image */
  .image-notch-tr {
    clip-path: url(#image-clip-notch-tr);
  }
  #vorkurs .kurs-card-bg-img {
    position: absolute;
    top: 1.5rem;
    left: 1.5rem;
    width: calc(25% - 1.5rem);
    height: calc(100% - 3rem);
    object-fit: cover;
    object-position: center;
    pointer-events: none;
    z-index: 0;
  }
  .card-visual {
    position: absolute;
    top: calc(100% - 10.5rem);
    left: 1.5rem;
    /* Feste Breite damit der Bildplatz für ALLE .card-Elemente identisch ist
       (unabhängig von Card-Container-Breite). Muss zu padding-left in
       #folgekurse/#empfehlungen/#vorkurs .card passen. */
    width: 10rem;
    bottom: 1.5rem;
    background: rgba(255, 255, 255, 0.10);
    border-radius: var(--radius-sm);
    z-index: 1;
    pointer-events: none;
    --notch-size: 2rem;
    --dot-size: 0rem;
    --notch-bg: var(--card-bg, var(--color-primary));
    transition: top 0.9s ease;
  }
  .card:hover .card-visual {
    top: 5rem;
  }
  /* card-visual bildet bei z-index:1 einen Stacking-Context → ein Badge darin
     läge unter dem .kurs-card-link (z-index:4). Trägt das Visual die KI-Kennzeichnung,
     heben wir es über den Link; da .card-visual pointer-events:none behält, bleibt
     die Bildfläche als Link klickbar, nur die Badge (pointer-events:auto) ist hittable. */
  .card-visual.ki-disclaimer {
    z-index: 5;
  }

  /* === Responsive: ≤650 (Extra-Stufe — Card-Visual ausblenden) ===
     Auf schmalen Bildschirmen reicht der Platz für Bild + Text nicht mehr —
     das Visual wird ausgeblendet und der Content nutzt die volle Card-Breite.
     padding-left wird zurück auf den Default-Padding (var(--padding)) gesetzt. */
  @media (max-width: 650px) {
    .card-visual {
      display: none;
    }
    .card.has-notch:has(> .card-visual) {
      padding-left: var(--padding);
    }
  }
  .card-visual-img {
    position: absolute;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    width: auto;
    max-width: 100%;
    max-height: 17rem;
    margin-left: -0.5rem;
  }
  #vorkurs .kurs-card-category {
    position: relative;
    z-index: 5;
  }
  /* === Responsive: ≤1280 (Zielgruppe) === */
  @media (max-width: 1279.98px) {
    .section-zielgruppe-intro {
      width: 100%;
    }
  }

  /* ─── .card: Notch-Card mit optionaler Border + Collapse-Hover ─── */
  .card {
    --card-bg: var(--color-light);
    --padding: 1.5rem;
    --notch-size: 2.4rem;
    --dot-size: 2rem;
    --dot-offset: -0.7rem;
    background-color: var(--card-bg);
    border-radius: var(--radius-sm);
    padding: calc(var(--notch-size) + 0.5rem) var(--padding) var(--padding);
    min-height: 6rem;
    box-sizing: border-box;
    transition: box-shadow 0.35s ease 0.4s, transform 0.35s ease 0.4s;
  }
  .card:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
  }

  .card > .notch {
    border-top-right-radius: var(--radius-sm);
    transition: background-color 0.4s ease, box-shadow 0.4s ease;
  }
  .card.is-left > .notch {
    border-top-right-radius: 0;
    border-top-left-radius: var(--radius-sm);
  }

  .card > .notch > .dot {
    transition:
      top 0.4s ease,
      bottom 0.4s ease,
      right 0.4s ease,
      left 0.4s ease,
      width 0.4s ease,
      height 0.4s ease,
      min-width 0.4s ease,
      min-height 0.4s ease,
      border-radius 0.4s ease;
  }

  /* Collapse-Hover: Notch-BG + Inset-Border + Pseudos verschwinden, Dot rückt in die Karten-Ecke */
  .card:not(.is-bottom-right):hover > .notch {
    background-color: transparent;
    box-shadow: none;
  }
  .card:not(.is-bottom-right):hover > .notch::before,
  .card:not(.is-bottom-right):hover > .notch::after {
    opacity: 0;
  }
  .card:not(.is-bottom-right):hover > .notch > .dot {
    top: 0;
    right: 0;
    border-radius: 0 var(--radius-sm) 0 var(--radius-sm);
  }
  .card.is-left:not(.is-bottom-right):hover > .notch > .dot {
    right: auto;
    left: 0;
    border-radius: var(--radius-sm) 0 var(--radius-sm) 0;
  }

  /* is-bottom-right Card-Variante: Notch unten-rechts, Dot füllt beim Hover */
  .card.is-bottom-right {
    --dot-offset: 0;
    --notch-size: 3.5rem;
    --dot-size: 2.5rem;
    padding: 1.5rem;
  }
  .card.is-bottom-right > .notch {
    border-top-right-radius: 0;
    border-top-left-radius: var(--radius-sm);
    border-bottom-right-radius: var(--radius-sm);
  }
  /* Dot-Merge-Hover + Concave-Fade: generisch via .has-notch.is-bottom-right (siehe oben) */
  .card.is-bottom-right > .notch > .dot {
    padding: 0;
  }
  .card.is-bottom-right > .notch > .dot svg {
    width: 1.2rem;
    height: 1.2rem;
    fill: var(--color-primary);
  }

  /* Card content styling */
  .card > p, .card > .card-content p {
    font-size: var(--font-size-lg);
    line-height: 1.7;
    color: var(--color-primary);
    margin: 0;
  }

  /* ─── Ihr Nutzen ─── */
  .nutzen-inner {
    max-width: 90rem;
    margin: 0 auto;
  }
  .nutzen-inner p {
    font-size: var(--font-size-lg);
    line-height: 1.6;
    color: var(--color-primary);
    margin-bottom: 1.5rem;
  }
  .nutzen-inner ul {
    gap: 1rem;
  }
  .nutzen-inner li {
    font-size: var(--font-size-lg);
    line-height: 1.6;
    color: var(--color-primary);
  }
  .nutzen-inner li strong {
    color: inherit;
  }

  /* ─── Nutzen: Tap-to-Expand auf Smartphone ───
     CMS liefert pro <li> `<strong>Titel</strong><br>Beschreibung…` als nackten
     Textknoten — HTML darf nicht verändert werden, daher reine CSS-Lösung.
     Klassisches Accordion-Pattern: das <li> wird per max-height auf eine Zeile
     (= nur der Titel; die Beschreibung steht durch das <br> garantiert auf
     Zeile 2+) geklappt, overflow:hidden blendet den Rest aus. SEO-sauber: der
     volle Text bleibt im HTML, kein Cloaking, von Google als interaktives
     Aufklappen akzeptiert (kein font-size:0-Spam-Signal).
     Erste Berührung löst :hover aus (cursor:pointer macht das <li> für iOS
     „tap-bar") → restlicher Text klappt auf. Persistenter Klick-Toggle bräuchte
     ein input/label im HTML (CMS-bedingt nicht möglich), daher :hover als
     Tap-Trigger. Titel der Nutzen-Liste sind einzeilig → eine Zeilenhöhe
     (line-height 1.6 × --font-size-lg 1.25rem = 2rem) reicht für den Titel. */
  @media (max-width: 414px) {
    #nutzen .check-list li {
      cursor: pointer;
      max-height: 2rem;             /* eine Zeile = nur der <strong>-Titel */
      overflow: hidden;
      padding-right: 1.75rem;       /* Platz für den Auf-/Zu-Indikator */
      transition: max-height 0.35s ease;
      -webkit-tap-highlight-color: transparent;
    }
    /* Indikator-Chevron (Border-Dreieck, font-unabhängig in rem) */
    #nutzen .check-list li::after {
      content: "";
      position: absolute;
      right: 0.3rem;
      top: 0.7rem;
      width: 0.55rem;
      height: 0.55rem;
      border-right: 2px solid var(--color-accent);
      border-bottom: 2px solid var(--color-accent);
      transform: rotate(45deg);     /* zeigt nach unten = „aufklappbar" */
      transition: transform 0.3s ease;
    }
    /* Erste Berührung / Hover → Beschreibung einblenden, Chevron drehen */
    #nutzen .check-list li:hover {
      max-height: 16rem;            /* großzügig über die reale Texthöhe */
    }
    #nutzen .check-list li:hover::after {
      transform: rotate(-135deg);   /* zeigt nach oben = „zuklappbar" */
    }
  }
  @media (max-width: 414px) and (prefers-reduced-motion: reduce) {
    #nutzen .check-list li,
    #nutzen .check-list li::after { transition: none; }
  }

  /* ─── Tooltip-System ─── */
  .ifmera-tooltip {
    position: fixed;
    top: 0;
    left: 0;
    z-index: 10000;
    width: max-content;
    max-width: 360px;
    padding: 0.5rem 0.75rem;
    background: var(--color-primary);
    color: var(--color-light);
    font-size: var(--font-size-md);
    line-height: 1.4;
    border-radius: var(--radius-sm);
    box-shadow:
      0 0 0 2px color-mix(in srgb, var(--color-light) 35%, transparent),
      0 4px 14px color-mix(in srgb, var(--color-primary) 35%, transparent);
    opacity: 0;
    transform: translateY(4px);
    pointer-events: none;
    transition: opacity 0.2s cubic-bezier(0.25, 0.8, 0.25, 1),
                transform 0.2s cubic-bezier(0.25, 0.8, 0.25, 1);
    will-change: opacity, transform;
  }
  .ifmera-tooltip.is-visible {
    opacity: 1;
    transform: translateY(0);
  }
  .ifmera-tooltip.is-touch-active,
  .ifmera-tooltip.is-interactive {
    pointer-events: auto;
  }
  .ifmera-tooltip-inner {
    word-wrap: break-word;
  }
  .ifmera-tooltip-inner b,
  .ifmera-tooltip-inner strong { font-weight: 700; }
  .ifmera-tooltip-arrow {
    position: absolute;
    width: 14px;
    height: 7px;
    pointer-events: none;
  }
  .ifmera-tooltip-arrow::before,
  .ifmera-tooltip-arrow::after {
    content: "";
    position: absolute;
    width: 0;
    height: 0;
  }
  /* placement top: Pfeil zeigt nach unten */
  .ifmera-tooltip[data-placement="top"] .ifmera-tooltip-arrow {
    bottom: -7px;
    left: var(--arrow-x, 50%);
    transform: translateX(-50%);
  }
  .ifmera-tooltip[data-placement="top"] .ifmera-tooltip-arrow::before {
    bottom: 0;
    left: -1px;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
    border-top: 8px solid color-mix(in srgb, var(--color-light) 35%, transparent);
  }
  .ifmera-tooltip[data-placement="top"] .ifmera-tooltip-arrow::after {
    bottom: 2px;
    left: 0;
    border-left: 7px solid transparent;
    border-right: 7px solid transparent;
    border-top: 7px solid var(--color-primary);
  }
  /* placement bottom: Pfeil zeigt nach oben */
  .ifmera-tooltip[data-placement="bottom"] .ifmera-tooltip-arrow {
    top: -7px;
    left: var(--arrow-x, 50%);
    transform: translateX(-50%);
  }
  .ifmera-tooltip[data-placement="bottom"] .ifmera-tooltip-arrow::before {
    top: 0;
    left: -1px;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
    border-bottom: 8px solid color-mix(in srgb, var(--color-light) 35%, transparent);
  }
  .ifmera-tooltip[data-placement="bottom"] .ifmera-tooltip-arrow::after {
    top: 2px;
    left: 0;
    border-left: 7px solid transparent;
    border-right: 7px solid transparent;
    border-bottom: 7px solid var(--color-primary);
  }
  /* placement left: Pfeil zeigt nach rechts */
  .ifmera-tooltip[data-placement="left"] .ifmera-tooltip-arrow {
    right: -7px;
    top: var(--arrow-y, 50%);
    width: 7px;
    height: 14px;
    transform: translateY(-50%);
  }
  .ifmera-tooltip[data-placement="left"] .ifmera-tooltip-arrow::before {
    right: 0;
    top: -1px;
    border-top: 8px solid transparent;
    border-bottom: 8px solid transparent;
    border-left: 8px solid color-mix(in srgb, var(--color-light) 35%, transparent);
  }
  .ifmera-tooltip[data-placement="left"] .ifmera-tooltip-arrow::after {
    right: 2px;
    top: 0;
    border-top: 7px solid transparent;
    border-bottom: 7px solid transparent;
    border-left: 7px solid var(--color-primary);
  }
  /* placement right: Pfeil zeigt nach links */
  .ifmera-tooltip[data-placement="right"] .ifmera-tooltip-arrow {
    left: -7px;
    top: var(--arrow-y, 50%);
    width: 7px;
    height: 14px;
    transform: translateY(-50%);
  }
  .ifmera-tooltip[data-placement="right"] .ifmera-tooltip-arrow::before {
    left: 0;
    top: -1px;
    border-top: 8px solid transparent;
    border-bottom: 8px solid transparent;
    border-right: 8px solid color-mix(in srgb, var(--color-light) 35%, transparent);
  }
  .ifmera-tooltip[data-placement="right"] .ifmera-tooltip-arrow::after {
    left: 2px;
    top: 0;
    border-top: 7px solid transparent;
    border-bottom: 7px solid transparent;
    border-right: 7px solid var(--color-primary);
  }
  /* Info-Icon-Helper (wiederverwendbar) */
  .tooltip-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    vertical-align: -0.125em;
    transform: translateY(-0.25em); /* Info-Icon sitzt generell etwas höher als die Textzeile */
    width: 1em;
    height: 1em;
    padding: 0;
    margin: 0 0.15em;
    background: transparent;
    border: none;
    color: var(--color-primary);
    opacity: 0.55;
    cursor: help;
    border-radius: 50%;
    transition: opacity 0.2s ease;
  }
  .tooltip-icon:hover,
  .tooltip-icon:focus-visible {
    opacity: 1;
  }
  .tooltip-icon:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
  }
  .tooltip-icon svg {
    width: 100%;
    height: 100%;
    fill: currentColor;
  }
  @media (prefers-reduced-motion: reduce) {
    .ifmera-tooltip {
      transition: none;
      transform: none;
    }
    .ifmera-tooltip.is-visible {
      transform: none;
    }
  }

  /* ─── KI-Bild-Kennzeichnung (EU AI Act Art. 50, ab 08/2026) ───
     Wiederverwendbar: Container bekommt .ki-disclaimer (öffnet eine
     inline-size-Container-Query, damit die Badge mit der BILD-Breite skaliert
     — kleines Bild → kleines Icon, großes Bild → größeres Icon, gecappt per
     clamp). Darin liegt als letztes Kind ein <button class="ki-disclaimer-badge">
     mit Info-Icon unten rechts; der KI-Hinweis steht als aria-label IM HTML
     (sichtbar/maschinenlesbar ohne JS) und wird vom Custom-Tooltip-System
     (data-tooltip) als ifmera-Tooltip gerendert. */
  /* NICHT auf <img>: ein Size-Container leitet seine Breite vom Eltern-CB ab und
     trägt 0 zur Shrink-to-fit-Breite des Wrappers bei → Wrapper kollabierte auf 0.
     Beim Auto-Modus liefert .ki-disclaimer-wrap die Container-Query; die manuellen
     Container (.hero/.card-visual) sind ohnehin keine <img>. */
  .ki-disclaimer:not(img) {
    container-type: inline-size;
  }
  /* Auto-Modus (CMS): genügt .ki-disclaimer direkt am <img>. Ein <img> ist ein
     ersetztes/leeres Element → kann KEINE Pseudo-Elemente/Kinder tragen, daher
     kann CSS allein kein Icon darüberlegen. js/main.js (Block 19) umschließt
     solche Bilder mit .ki-disclaimer-wrap und injiziert die Badge. Der Wrapper
     ist Bezugsrahmen (position) + Container-Query-Quelle (= Bildbreite). */
  .ki-disclaimer-wrap {
    position: relative;
    display: inline-block; /* schrumpft auf die Bildbreite */
    max-width: 100%;
    line-height: 0; /* kein Inline-Whitespace unter dem Bild */
    /* KEIN container-type: auf einem content-breiten inline-block kollabiert es
       auf 0. Stattdessen liefert js/main.js (Block 19) die echte Bildbreite als
       --ki-img-w; die Badge skaliert daraus (8 % der Bildbreite, gecappt). */
    --ki-badge-size: clamp(1.5rem, calc(var(--ki-img-w, 20rem) * 0.08), 2.5rem);
  }
  .ki-disclaimer-badge {
    position: absolute;
    right: 0.6rem;
    bottom: 0.6rem;
    z-index: 6;
    /* Manuelle Container (Hero/Card-Visual) skalieren per Container-Query (8cqi);
       der CMS-Auto-Wrapper überschreibt mit --ki-badge-size (JS-Bildbreite).
       Betreiberwunsch 2026-06-19: „KI"-Text-Pille statt Info-„i". Höhe = Badge-Größe,
       Breite richtet sich nach dem Text (min. quadratisch); font-size = Badge-Größe,
       daraus skalieren Text (0.5em) und Innenabstand (em-basiert) proportional mit. */
    height: var(--ki-badge-size, clamp(1.5rem, 8cqi, 2.5rem));
    min-width: var(--ki-badge-size, clamp(1.5rem, 8cqi, 2.5rem));
    font-size: var(--ki-badge-size, clamp(1.5rem, 8cqi, 2.5rem));
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 0.22em;
    border: 0.09em solid var(--color-light);
    border-radius: 999px;
    background: var(--color-primary);
    color: var(--color-light);
    box-shadow: 0 0.06em 0.25em rgba(0, 0, 0, 0.28);
    cursor: help;
    pointer-events: auto; /* überschreibt z.B. .card-visual { pointer-events: none } */
    transition: transform 0.2s ease;
  }
  .ki-disclaimer-badge:hover,
  .ki-disclaimer-badge:focus-visible {
    transform: scale(1.08);
  }
  .ki-disclaimer-badge:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
  }
  /* Der Badge-Text „KI": hell auf Teal-Pille, fett, proportional zur Badge-Größe. */
  .ki-disclaimer-badge-text {
    font-size: 0.4em;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.04em;
  }
  @media (prefers-reduced-motion: reduce) {
    .ki-disclaimer-badge { transition: none; }
    .ki-disclaimer-badge:hover,
    .ki-disclaimer-badge:focus-visible { transform: none; }
  }

  /* ─── Link-Marker (Hover-Animation) ─── */
  /* .no-link am Element schaltet den Link-Marker ab; :where() hält die
     Spezifität bei (0,1,0) wie das nackte .link → keine Override-Regression. */
  .link:not(:where(.no-link)) {
    --link-color: var(--color-accent);
    --link-hover-text: var(--color-light);
    color: var(--link-color);
    text-decoration: none;
    background-image: linear-gradient(var(--link-color), var(--link-color));
    background-repeat: no-repeat;
    background-position: 0 100%;
    background-size: 100% 2px;
    transition: background-size 0.25s ease-out, color 0.3s ease-out;
  }
  .link:not(:where(.no-link)):hover,
  .link:not(:where(.no-link)):focus-visible {
    color: var(--link-hover-text);
    background-size: 100% 100%;
  }
  .link:not(:where(.no-link)):focus-visible {
    outline: 2px solid var(--link-color);
    outline-offset: 2px;
  }
  @media (prefers-reduced-motion: reduce) {
    .link:not(:where(.no-link)) {
      transition: none;
    }
  }

  /* ─── Mega-Menu System ─── */
  .nav-center {
    margin: 0;
    padding: 0;
  }
  .nav-item {
    position: static;
    list-style: none;
  }
  .nav-trigger {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    background: none;
    border: none;
    color: var(--color-primary);
    text-decoration: none;
    font-size: var(--font-size-lg);
    font-weight: 500;
    font-family: inherit;
    padding: 0.5rem 0;
    cursor: pointer;
    transition: opacity 0.2s, color 0.35s ease;
    position: relative;
    line-height: 1.2;
  }
  .nav-scrolled .nav-trigger { color: var(--color-light); }
  .nav-trigger:hover { opacity: 0.75; }
  .nav-trigger:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 4px;
    border-radius: 2px;
  }
  .nav-chevron {
    width: 0.7rem;
    height: 0.7rem;
    flex-shrink: 0;
    transition: transform 0.25s ease;
    fill: currentColor;
  }
  .nav-trigger[aria-expanded="true"] .nav-chevron {
    transform: rotate(180deg);
  }
  /* Hover-Bridge */
  .nav-item--mega .nav-trigger::after {
    content: "";
    position: absolute;
    top: 100%;
    left: -0.5rem;
    right: -0.5rem;
    height: 1.2rem;
  }
  /* Open-State bekommt die Akzent-Farbe (visueller Cue für Mega-Panel offen).
     aria-current="page" bleibt semantisch erhalten (SEO/Screenreader), aber bewusst
     OHNE visuelles Override – damit alle Trigger im Idle-State gleich aussehen. */
  .nav-trigger[aria-expanded="true"] {
    color: var(--color-accent);
  }
  .nav-scrolled .nav-trigger[aria-expanded="true"] {
    color: var(--color-icon);
  }

  /* Mega-Panel */
  .mega-panel {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    background: var(--color-light);
    box-shadow: 0 16px 40px -8px rgba(0, 0, 0, 0.18);
    /* Der 40px-Blur des Schattens würde sonst ~16px über die Panel-Oberkante
       in den (transparenten) Nav-Bereich bluten → sichtbare Schattenkante
       zwischen Header und Panel. clip-path schneidet den Schatten exakt an der
       Oberkante ab (inset top = 0), lässt ihn an Seiten/unten aber stehen. */
    clip-path: inset(0 -48px -48px -48px);
    border-radius: 0 0 var(--radius-md) var(--radius-md);
    opacity: 0;
    transform: translateY(-8px);
    visibility: hidden;
    transition: opacity 0.2s ease-out, transform 0.2s ease-out, visibility 0s linear 0.2s;
    z-index: 5;
    overflow: hidden;
  }
  .mega-panel[data-open="true"] {
    opacity: 1;
    transform: translateY(0);
    visibility: visible;
    transition: opacity 0.2s ease-out, transform 0.2s ease-out, visibility 0s linear 0s;
  }
  /* Im scrolled-Zustand keine translateY-Slide-Animation: die 8px-Bewegung
     würde sonst kurz das cremefarbene Panel über den teal Nav-Bereich
     legen (sichtbar als Cream-Flash beim Öffnen/Schließen). Im un-scrolled
     State ist der Wrapper selbst cremefarben, da fällt es nicht auf. */
  .nav-fixed-wrapper.nav-scrolled .mega-panel,
  .nav-fixed-wrapper.nav-scrolled .mega-panel[data-open="true"] {
    transform: translateY(0);
  }
  .mega-panel-inner {
    max-width: 90rem;
    margin-inline: auto;
    padding: 2.5rem 3.5rem;
    position: relative;
  }
  .mega-grid {
    display: grid;
    gap: 2.5rem;
  }
  .mega-grid--2 { grid-template-columns: 1fr 1fr; }
  .mega-grid--3 { grid-template-columns: 1fr 1fr 1fr; }
  .mega-link-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
  }
  .mega-link-list a {
    font-size: var(--font-size-md);
    line-height: 1.35;
    display: inline-block;
  }

  /* Weiterbildung Layout — 4 Formate-Cards + Wissenswelten-Entry + 2 Promo-Banner als
     Row, alles in einem Single-Column-Wrapper (kein Sidebar-Split mehr). */
  .mega-weiterbildung-layout {
    display: block;
  }
  .mega-weiterbildung-main {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr;
    gap: 1.25rem;
  }
  /* Bottom-Row: Wissenswelten links (2 Cols) + Promo-Block rechts (2 Cols) mit 2 Bannern row. */
  .mega-weiterbildung-main > .mega-promo {
    grid-column: 3 / -1;
    flex-direction: row;
    gap: 1rem;
    margin-top: 0.25rem;
  }
  .mega-weiterbildung-main > .mega-promo > .mega-promo-banner {
    flex: 1;
  }
  /* Coaching Layout — Main-Area + Promo-Sidebar (gleiche Mechanik wie Weiterbildung) */
  .mega-coaching-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 18rem;
    gap: 2rem;
  }
  .mega-coaching-main {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.25rem;
  }
  /* Info Layout — 3 Spalten (je 1 Card + optional Promo-Banner darunter, außerhalb der Card).
     Subgrid: alle Promos teilen sich row 2 → identische Höhe (tallest content), alle Cards in
     row 1 stretchen auf gleiche Höhe. Card-Oberkanten und Promo-Unterkanten sind so bündig. */
  .mega-info-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
    grid-template-rows: 1fr auto;
    gap: 1rem 2rem;
  }
  .mega-info-col {
    display: grid;
    grid-template-rows: subgrid;
    grid-row: 1 / -1;
  }
  .mega-info-col > .mega-card { grid-row: 1; }
  .mega-info-col > .mega-promo-banner,
  .mega-info-col > .mega-wissenswelten-card { grid-row: 2; }
  /* Col ohne Promo-Element (Über uns): Card spannt beide Rows, damit unten kein Loch bleibt */
  .mega-info-col:not(:has(> .mega-promo-banner, > .mega-wissenswelten-card)) > .mega-card {
    grid-row: 1 / -1;
  }
  /* Consulting Layout — 2 Notch-Cards + Explainer-Card (alle 3 gleichbreit, da Explainer Fließtext ist und keine schmale Sidebar passt) */
  .mega-consulting-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
    gap: 2rem;
  }
  .mega-card {
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
    padding: 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
  }
  /* Cards with a sub-link-list get more breathing room between blocks */
  .mega-card:has(.mega-link-list) { gap: 1rem; }
  .mega-card-title {
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-primary);
    margin: 0;
    letter-spacing: -0.01em;
  }
  .mega-card-desc {
    font-size: var(--font-size-md);
    line-height: 1.5;
    color: var(--color-primary);
    opacity: 0.85;
    margin: 0;
  }
  .mega-card-cta {
    margin-top: auto;
    align-self: flex-start;
    padding-top: 0.4rem;
    font-size: var(--font-size-md);
    font-weight: 600;
  }
  .mega-card-cta svg {
    width: 0.95rem;
    height: 0.95rem;
    fill: currentColor;
    vertical-align: -0.15em;
    margin-left: 0.35rem;
  }

  /* Clickable mega-card: whole card is a link, dot+chevron in bottom-right notch
     grows on hover (same pattern as .card.is-bottom-right / .kurs-card-link). */
  .mega-card.has-notch {
    --notch-size: 2.8rem;
    --dot-size: 2rem;
    --notch-bg: var(--color-light);
    padding-bottom: calc(var(--notch-size) + 0.5rem);
    transition: transform 0.35s ease, box-shadow 0.35s ease;
  }
  .mega-card.has-notch:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 24px rgba(0, 68, 74, 0.12);
  }
  /* Dot-Merge-Hover + Concave-Fade: generisch via .has-notch.is-bottom-right; hier nur Icon-Größe */
  .mega-card.has-notch > .notch > .dot svg {
    width: 1.1rem;
    height: 1.1rem;
    fill: var(--color-primary);
  }
  .mega-card-link {
    position: absolute;
    inset: 0;
    z-index: 4;
    border-radius: var(--radius-sm);
    text-decoration: none;
    color: inherit;
  }

  /* Wissenswelten-Card — wiederverwendbares Dark-Teal-CTA-Tile mit Icon rechts.
     Kontext-neutrale Basisklasse (keine Grid-Positionierung); Container-spezifisches
     Placement wird unten via Kontext-Selektoren ergänzt. */
  .mega-wissenswelten-card {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    background: var(--color-primary);
    color: var(--color-light);
    border-radius: var(--radius-sm);
    padding: 1.1rem 1.5rem;
    border: none;
    font-family: inherit;
    cursor: pointer;
    text-align: left;
    text-decoration: none;
    transition: transform 0.2s;
  }
  .mega-wissenswelten-card:hover {
    transform: translateY(-2px);
  }
  /* Weiterbildung-Stage-1 Platzierung: linke Hälfte (2 Cols), neben Promo-Block */
  .mega-weiterbildung-main > .mega-wissenswelten-card {
    grid-column: 1 / span 2;
    margin-top: 0.25rem;
  }
  .mega-wissenswelten-card-text strong {
    display: block;
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-icon);
    margin-bottom: 0.15rem;
  }
  .mega-wissenswelten-card-text span {
    font-size: var(--font-size-md);
    opacity: 0.85;
  }
  .mega-wissenswelten-card-icon {
    width: 22px;
    height: 22px;
    flex-shrink: 0;
    fill: var(--color-icon);
    transition: fill 0.2s ease;
  }
  .mega-wissenswelten-card:hover .mega-wissenswelten-card-icon {
    fill: var(--color-accent);
  }

  /* Promo Sidebar — stack of mega-promo-banner tiles (no wrapper bg/padding) */
  .mega-promo {
    display: flex;
    flex-direction: column;
    gap: 1rem;
  }
  .mega-promo-banner {
    background: var(--color-accent);
    border-radius: var(--radius-sm);
    padding: 1rem 1.1rem;
    color: var(--color-primary); /* Betreiberwunsch: Promo-Banner-Text in Primary (war: light) */
    text-decoration: none;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    transition: transform 0.2s;
  }
  .mega-promo-banner:hover { transform: translateY(-2px); }
  .mega-promo-banner-eyebrow {
    font-size: var(--font-size-sm);
    letter-spacing: 0.1em;
    opacity: 0.95;
    text-transform: uppercase;
    font-weight: 600;
  }
  .mega-promo-banner-title {
    font-size: var(--font-size-md);
    font-weight: 700;
    line-height: 1.25;
  }
  .mega-promo-banner-cta {
    font-size: var(--font-size-sm);
    margin-top: 0.2rem;
    opacity: 0.95;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
  }
  .mega-promo-banner-cta svg {
    width: 0.8rem;
    height: 0.8rem;
    fill: currentColor;
    flex-shrink: 0;
    padding-bottom: 0.1rem;
  }

  /* Stage Container für Weiterbildung — beide Stages teilen sich EINE Grid-Zelle
     (1/1, gestapelt). Dadurch ist die .mega-stages-Höhe IMMER die der größeren
     Stage, egal welche gerade aktiv ist → das Panel schrumpft beim Stage-Wechsel
     NICHT zusammen. Das behebt den Bug, dass der Cursor nach dem Klick auf die
     kürzere Wissenswelten-Stage plötzlich UNTERHALB des (geschrumpften) Panels
     liegt → mouseleave feuert → das Menü schließt ("springt zurück"). Die
     inaktive Stage bleibt im Layout (transform/opacity beeinflussen die
     Grid-Sizing-Höhe nicht), wird aber via opacity/pointer-events/inert versteckt.
     (Früher: inaktive Stage position:absolute → Höhe = nur die aktive Stage →
     Kollaps um ~178px beim Wechsel auf Wissenswelten.) */
  .mega-stages {
    display: grid;
  }
  .mega-stage {
    grid-area: 1 / 1;
    transition: transform 0.28s ease, opacity 0.22s ease;
  }
  .mega-panel:has(#wb-stage-1:checked) .mega-stage--2 {
    transform: translateX(24px);
    opacity: 0;
    pointer-events: none;
  }
  .mega-panel:has(#wb-stage-2:checked) .mega-stage--1 {
    transform: translateX(-24px);
    opacity: 0;
    pointer-events: none;
  }

  .mega-stage-2-head {
    display: flex;
    align-items: center;
    gap: 1.25rem;
    margin-bottom: 1.5rem;
  }
  .mega-back {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    background: none;
    border: 1px solid color-mix(in srgb, var(--color-primary) 20%, transparent);
    border-radius: var(--radius-sm);
    padding: 0.5rem 1rem;
    font-family: inherit;
    font-size: var(--font-size-md);
    color: var(--color-primary);
    cursor: pointer;
    transition: background 0.2s, color 0.2s, border-color 0.2s;
  }
  .mega-back:hover {
    background: var(--color-primary);
    color: var(--color-light);
    border-color: var(--color-primary);
  }
  .mega-back svg {
    width: 14px;
    height: 14px;
    fill: currentColor;
  }
  .mega-stage-2-title {
    font-size: var(--font-size-xl);
    font-weight: 700;
    margin: 0;
    color: var(--color-primary);
  }
  .mega-themen-grid {
    display: grid;
    /* CMS-Abweichung (Betreiberwunsch): 21rem statt 14rem — lange Komposita wie
       „Nachhaltigkeitsmanagement" passten in die schmaleren Kacheln nicht.
       Bei Asset-Resync aus test\design erhalten! */
    grid-template-columns: repeat(auto-fill, minmax(21rem, 1fr));
    gap: 0.75rem;
    list-style: none;
    padding: 0;
    margin: 0;
  }
  .mega-themen-grid > li {
    display: flex;
  }
  .mega-thema-tile {
    flex: 1;
    background: var(--color-light-contrast);
    border: 1px solid color-mix(in srgb, var(--color-primary) 8%, transparent);
    border-radius: var(--radius-sm);
    padding: 0.95rem 1.2rem;
    text-decoration: none;
    color: var(--color-primary);
    font-size: var(--font-size-md);
    font-weight: 500;
    transition: background 0.2s, transform 0.2s, border-color 0.2s, color 0.2s;
    display: flex;
    align-items: center;
    gap: 0.65rem;
  }
  .mega-thema-tile:hover {
    background: var(--color-primary);
    color: var(--color-light);
    border-color: var(--color-primary);
    transform: translateY(-2px);
  }
  .mega-thema-tile .mega-thema-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--color-icon);
    flex-shrink: 0;
  }

  /* Close button (mobile drawer only — hidden on desktop) */
  .nav-close-item { display: none; }

  /* Burger Button */
  .nav-burger {
    display: none;
    width: 38px;
    height: 38px;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    cursor: pointer;
    padding: 0;
    color: var(--color-primary);
    transition: color 0.35s ease;
  }
  .nav-scrolled .nav-burger { color: var(--color-light); }
  .nav-burger svg {
    width: 26px;
    height: 26px;
    fill: currentColor;
    pointer-events: none;
  }
  .nav-burger svg * { pointer-events: none; }
  .nav-trigger svg { pointer-events: none; }
  .nav-burger:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
    border-radius: 4px;
  }

  @media (prefers-reduced-motion: reduce) {
    .mega-panel,
    .mega-stage,
    .nav-chevron,
    .nav-center,
    .nav-backdrop {
      transition: none;
    }
  }

  /* === Mega-Menu Responsive: ≤1280 (Kompakt) ===
     Greift im Range 800-1279, wo Mega-Panels noch als Desktop-Dropdowns
     gerendert werden, aber kompaktere Innen-Layouts brauchen. Unter 800
     übernimmt der Drawer-Block und überschreibt diese Werte.
     Nav zweizeilig: nav-center rutscht als volle Zeile unter Logo + Icons. */
  @media (max-width: 1279.98px) {
    .nav {
      flex-wrap: wrap;
      padding-top: 0.65rem;
      padding-bottom: 0;
    }
    .nav-center {
      order: 10;
      width: 100%;
      justify-content: center;
      gap: 1.5rem;
      padding: 0.45rem 0 0.55rem;
    }
    .nav-scrolled .nav {
      padding-top: 0.25rem;
    }
    .nav-scrolled .nav-center {
      padding: 0.5rem 0 0;
      border-top: none;
    }
    .nav-scrolled .nav-center .nav-trigger {
      padding: 0;
    }
    /* Coaching-Layout kollabiert bei 1280 — Promo wandert als Row darunter.
       Info & Consulting bleiben mehrspaltig bis Drawer-Modus (<800), damit ihre Punkte nicht
       untereinander stapeln. Weiterbildung ist bereits Single-Column (kein Sidebar-Split),
       aber Main-Grid kollabiert von 4 Cards in 1 Row auf 2x2, damit Cards genug Breite haben. */
    .mega-coaching-layout {
      grid-template-columns: 1fr;
    }
    .mega-weiterbildung-main {
      grid-template-columns: 1fr 1fr;
    }
    /* Bei 2-Col-Layout Promo wieder volle Breite (sonst Out-of-Range bei grid-column: 3 / -1) */
    .mega-weiterbildung-main > .mega-promo {
      grid-column: 1 / -1;
    }
    .mega-coaching-layout .mega-promo {
      flex-direction: row;
    }
    .mega-coaching-layout .mega-promo-banner {
      flex: 1;
    }
    .mega-panel-inner {
      padding: var(--padding);
    }
  }
  /* === Responsive: <800 (Drawer-Modus) ===
     <800px: nav-center transforms from horizontal mega-bar into a slide-in
     right-side drawer. Each <li>'s mega-panel switches from absolute dropdown
     to inline accordion that expands when its trigger is clicked (the existing
     [data-open] flag the controller already sets). Single source of truth — same
     <ul>/<li>/.mega-panel/.mega-card DOM as desktop, no duplication.
     nav-burger wird visuell ganz rechts platziert (order: 999), nav-right bleibt
     sichtbar. CTA-Button wird kompaktiert (icon-only) sobald Burger sichtbar. */
  @media (max-width: 799.98px) {
    /* Hero margin-top zurücksetzen — Nav ist einzeilig im Burger-Modus */
    .hero { margin-top: 4.2rem; }
    .nav-burger {
      display: inline-flex;
      order: 999; /* Burger ganz rechts, nach nav-right */
      margin-left: 0.5rem; /* Abstand zu nav-right */
    }
    /* nav-right + burger werden rechts zusammengruppiert,
       Logo bleibt links — statt space-between Verteilung. */
    .nav-right {
      margin-left: auto;
    }
    .btn-cta-wrap {
      padding-right: 0.6rem;
      gap: 0;
    }
    .btn-cta-text {
      max-width: 0;
      opacity: 0;
      padding: 0;
    }
    .btn-cta-icon {
      width: 28px;
      height: 28px;
    }

    /* Drawer backdrop via wrapper ::after.
       z-index lives in wrapper's stacking context (wrapper has z:1000).
       Backdrop = 5 < .nav (lifted to 1101 below when open) so .nav/.nav-center
       (descendants of .nav) stay above the backdrop. */
    .nav-fixed-wrapper::after {
      content: "";
      position: fixed;
      inset: 0;
      background: rgba(0, 0, 0, 0.5);
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.28s ease, visibility 0s linear 0.28s;
      z-index: 5;
      pointer-events: none;
    }
    .nav-fixed-wrapper:has(.burger-checkbox:checked)::after {
      opacity: 1;
      visibility: visible;
      pointer-events: auto;
      transition: opacity 0.28s ease, visibility 0s linear 0s;
    }
    /* Lift .nav (and its descendant drawer) above the backdrop while open.
       Default .nav z-index is 10 which gets dominated by backdrop 5 → 1101 wins. */
    .nav-fixed-wrapper:has(.burger-checkbox:checked) .nav {
      z-index: 1101;
    }

    /* nav-center becomes the drawer.
       box-shadow ist NUR aktiv wenn Drawer offen — sonst projiziert sich der
       Schatten des versteckten (translateX 100%) Drawers zurück in den Viewport. */
    .nav-center {
      position: fixed;
      top: 0;
      right: 0;
      bottom: 0;
      width: min(420px, 92vw);
      background: var(--color-light);
      box-shadow: none;
      flex-direction: column;
      align-items: stretch;
      justify-content: flex-start;
      gap: 0;
      padding: 4.5rem 0 1.5rem;
      overflow-y: auto;
      transform: translateX(100%);
      transition: transform 0.28s ease, box-shadow 0.28s ease;
      z-index: 1100;
    }
    /* Override ≤1280 .nav-scrolled rule that shrinks padding for compact
       horizontal bar — in drawer mode the top space for the X button must stay */
    .nav-scrolled .nav-center {
      padding: 4.5rem 0 1.5rem;
    }

    .nav-close-item {
      display: block;
      position: absolute;
      top: 0.75rem;
      right: 0.75rem;
      list-style: none;
    }
    .nav-close {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 38px;
      height: 38px;
      background: none;
      border: none;
      cursor: pointer;
      padding: 0;
      color: var(--color-primary);
      border-radius: var(--radius-sm);
      transition: background 0.2s ease;
    }
    .nav-close:hover,
    .nav-close:focus-visible {
      background: color-mix(in srgb, var(--color-primary) 8%, transparent);
    }
    .nav-close:focus-visible {
      outline: 2px solid var(--color-primary);
      outline-offset: 2px;
    }
    .nav-close svg {
      width: 1rem;
      height: 1rem;
      fill: var(--color-primary);
      pointer-events: none;
    }
    .nav-fixed-wrapper:has(.burger-checkbox:checked) .nav-center {
      transform: translateX(0);
      box-shadow: -8px 0 32px rgba(0, 0, 0, 0.25);
    }

    /* Each nav-item full width */
    .nav-item {
      width: 100%;
      border-top: 1px solid color-mix(in srgb, var(--color-primary) 10%, transparent);
    }
    .nav-item:first-child { border-top: none; }

    /* Triggers as full-width rows */
    .nav-trigger {
      width: 100%;
      justify-content: space-between;
      padding: 1rem 1.5rem;
      font-size: var(--font-size-lg);
      font-weight: 600;
      color: var(--color-primary) !important;
    }
    /* Override ≤1280 .nav-scrolled rule that zeroes padding for compact
       horizontal bar — in drawer mode the padding must stay */
    .nav-scrolled .nav-center .nav-trigger {
      padding: 1rem 1.5rem;
    }
    /* Disable hover-bridge pseudo on mobile */
    .nav-item--mega .nav-trigger::after { display: none; }
    /* Chevron rotates 180° via existing aria-expanded rule from desktop */

    /* Mega-panel switches from absolute dropdown to inline accordion.
       Controller's [data-open] flag still drives open/close. */
    .mega-panel {
      position: static;
      left: auto;
      right: auto;
      top: auto;
      box-shadow: none;
      border-radius: 0;
      background: color-mix(in srgb, var(--color-primary) 4%, transparent);
      max-height: 0;
      overflow: hidden;
      opacity: 1;
      visibility: visible;
      transform: none;
      transition: max-height 0.35s ease;
    }
    .mega-panel[data-open="true"] {
      max-height: 4000px;
    }
    .mega-panel-inner {
      padding: 1rem 1.5rem !important;
    }

    /* Stack grids into single column */
    .mega-grid,
    .mega-weiterbildung-main,
    .mega-coaching-main {
      grid-template-columns: 1fr !important;
      gap: 0.5rem;
    }
    /* Info-Cols: Subgrid-Setup für Drawer auf flex zurücksetzen, damit Card+Promo
       innerhalb jeder Col vertikal gestapelt werden und nicht überlappen */
    .mega-info-layout { grid-template-rows: none; }
    .mega-info-col {
      display: flex;
      flex-direction: column;
      gap: 1rem;
      grid-row: auto;
    }
    .mega-grid--2,
    .mega-grid--3 {
      grid-template-columns: 1fr;
    }
    .mega-weiterbildung-layout,
    .mega-coaching-layout,
    .mega-info-layout,
    .mega-consulting-layout {
      grid-template-columns: 1fr;
      gap: 0.5rem;
    }

    /* Drawer ist Kompakt-Modus — Erklär-Karte (Desktop-Kontext) ist hier überflüssig */
    .mega-card--explainer { display: none; }

    /* Cards collapse to plain text-links inside drawer — no Notch, kein Dot, kein CTA-Button.
       .has-notch-Specificity über-trumpfen, damit padding-bottom (--notch-size + 0.5rem) wegfällt. */
    .mega-card,
    .mega-card.has-notch {
      background: transparent;
      padding: 0.5rem 0;
      border-radius: 0;
      gap: 0;
      min-height: 0;
      transform: none;
      box-shadow: none;
    }
    /* Desktop-Hover-Lift (translateY + Shadow) im Drawer abschalten */
    .mega-card.has-notch:hover {
      transform: none;
      box-shadow: none;
    }
    .mega-card:has(.mega-link-list) { gap: 0.5rem; }
    .mega-card-desc { display: none; } /* keep drawer compact */
    .mega-card .notch,
    .mega-card .dot,
    .mega-card-cta { display: none; }
    .mega-card-title {
      font-size: var(--font-size-md);
      font-weight: 600;
      padding: 0;
      margin: 0;
    }
    /* Link-Highlight-Marker nur für klickbare Karten (mit .mega-card-link Overlay) */
    .mega-card:has(.mega-card-link) .mega-card-title {
      display: inline-block;
      align-self: flex-start;
      font-weight: 500;
      line-height: 1.4;
      --link-color: var(--color-accent);
      --link-hover-text: var(--color-light);
      color: var(--link-color);
      background-image: linear-gradient(var(--link-color), var(--link-color));
      background-repeat: no-repeat;
      background-position: 0 100%;
      background-size: 100% 2px;
      transition: background-size 0.25s ease-out, color 0.3s ease-out;
    }
    .mega-card:has(.mega-card-link):hover .mega-card-title,
    .mega-card:has(.mega-card-link):focus-within .mega-card-title {
      color: var(--link-hover-text);
      background-size: 100% 100%;
    }
    @media (prefers-reduced-motion: reduce) {
      .mega-card:has(.mega-card-link) .mega-card-title { transition: none; }
    }
    .mega-link-list { padding-left: 0.25rem; }
    .mega-link-list a { font-size: var(--font-size-md); padding: 0.25rem 0; }

    /* Promo-Banner im Drawer sichtbar lassen — analog zur Info-Spalte „Wissen",
       deren Banner schon im Drawer erscheint (sie liegt direkt in .mega-info-col,
       nicht in .mega-promo). Weiterbildung + Coaching tragen ihre Banner in einer
       .mega-promo-Sidebar, die zuvor komplett ausgeblendet war. Jetzt: volle Breite,
       als gestapelte Spalte (Desktop/1280 setzen flex-direction:row → hier column). */
    .mega-weiterbildung-main > .mega-promo,
    .mega-coaching-layout .mega-promo {
      display: flex;
      flex-direction: column;
      gap: 0.5rem;
      margin-top: 0.5rem;
    }

    /* Wissenswelten: flatten — no two-stage, hide entry-card and back-button.
       Nur im Weiterbildung-Kontext ausblenden; in anderen Kontexten (z.B. Info-Col als
       wiederverwendete Tel-CTA) bleibt die Card im Drawer sichtbar. */
    .mega-weiterbildung-main > .mega-wissenswelten-card { display: none; }
    .mega-stage-2-head .mega-back { display: none; }
    .mega-stage-2-head { margin-bottom: 0.5rem; }
    .mega-stage-2-title { font-size: var(--font-size-md); }
    /* Both stages render inline regardless of data-view */
    .mega-stages { display: flex; flex-direction: column; gap: 0.5rem; }
    .mega-stage,
    .mega-panel:has(#wb-stage-1:checked) .mega-stage--2,
    .mega-panel:has(#wb-stage-2:checked) .mega-stage--1 {
      position: static !important;
      inset: auto !important;
      transform: none !important;
      opacity: 1 !important;
      pointer-events: auto !important;
    }
    /* CMS-Abweichung (Betreiberwunsch): im Burger-Drawer nur EINE Spalte —
       zwei Spalten schoben die langen Kategorienamen aus dem Panel. */
    .mega-themen-grid { grid-template-columns: 1fr; gap: 0.4rem; }
    .mega-thema-tile { padding: 0.65rem 0.85rem; font-size: var(--font-size-sm); }
  }

  /* Hidden State-Carrier für Mobile-Drawer + Stage-Switch.
     Werden visuell entfernt, behalten aber ihren :checked-State für die :has()-Selektoren. */
  .burger-checkbox, .stage-radio {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
    margin: 0;
    padding: 0;
  }

  /* Body-Scroll-Lock im Mobile-Drawer rein CSS-deklarativ */
  @media (max-width: 1279.98px) {
    html:has(.burger-checkbox:checked) {
      overflow: hidden;
    }
  }

  /* ─── Privatsphäre-Einstellungen (Consent-Banner + Dialog + Embeds) ───────
     NEUTRALE Klassennamen (ifm-prefs-*, KEIN "cookie/consent/gdpr/banner") und
     JS-Render (js/main.js, Block 16) → reduziert Fehl-Ausblendung durch Cookie-
     Filterlisten ("I don't care about cookies", uBlock EasyList-Cookie), ohne
     Adblocker aktiv zu bekämpfen. Banner = nicht-blockierende Notch-Karte unten
     LINKS (kollidiert nicht mit dem Scroll-to-Top-Button unten rechts); die
     Detail-Auswahl ist ein natives <dialog> (Top-Layer, Focus-Trap + ESC gratis,
     gut für Screenreader UND website-bedienende KI-Agenten). */

  /* Merken-Icon ist jetzt ein <button> statt <a> (Toggle-Semantik) → Button-
     Default-Styles resetten; Größe/Hover kommen aus ".actions .action-icon". */
  .actions button.action-icon {
    background: none;
    border: 0;
    padding: 0;
    font: inherit;
    color: var(--color-primary);
  }
  /* Gemerkt-Zustand: gefülltes Akzent-Herz */
  .actions .action-icon[aria-pressed="true"] {
    color: var(--color-accent);
  }

  /* Banner-Karte (Notch-Design, unten links, nicht modal) */
  .ifm-prefs-card {
    position: fixed;
    left: 1.5rem;
    bottom: 1.5rem;
    z-index: 1090; /* über Sektionen, unter Nav/Mega (1100) + Tooltip (10000) */
    width: min(30rem, calc(100vw - 3rem));
    padding: 1.6rem 1.75rem;
    box-shadow: 0 14px 44px rgba(0, 0, 68, 0.22);
    animation: ifm-prefs-rise 0.4s cubic-bezier(.22, 1, .36, 1) both;
    /* .has-notch liefert background (weiß) + radius + Notch-Mechanik */
  }
  /* Notch-Dot der Banner-Karte: da die Karte frei über dem Inhalt schwebt, wird der
     Notch-Hintergrund auf die Kartenfarbe (weiß) gesetzt → der „Ausschnitt“ blendet
     sich aus, übrig bleibt der akzentfarbene Dot als Eck-Badge mit Schild-Icon. */
  .ifm-prefs-card > .notch { --notch-bg: var(--color-light-contrast); --dot-bg: var(--color-accent); border-radius: var(--radius-sm); }
  .ifm-prefs-card > .notch > .dot { color: var(--color-light); }

  .ifm-prefs-title {
    margin: 0 3rem 0.5rem 0; /* rechts frei für den Notch-Dot */
    font-size: var(--font-size-xl);
    line-height: 1.2;
    color: var(--color-primary);
  }
  .ifm-prefs-text {
    margin: 0 0 1.1rem;
    font-size: var(--font-size-sm);
    line-height: 1.55;
    color: var(--color-primary);
  }

  .ifm-prefs-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem;
  }
  /* Erste Ebene: "Akzeptieren" und "Ablehnen" exakt gleich groß/prominent (DSGVO-
     Pflicht — Ablehnen darf nicht benachteiligt werden). "Einstellungen" = tertiär. */
  .ifm-prefs-actions .cta-main,
  .ifm-prefs-actions .cta-secondary {
    flex: 1 1 9rem;
    padding: 0.6rem 1rem;
    font-size: var(--font-size-sm);
  }
  .ifm-prefs-link,
  .ifm-prefs-clear {
    background: none;
    border: 0;
    cursor: pointer;
    font: inherit;
    font-size: var(--font-size-sm);
    color: var(--color-primary);
    text-decoration: underline;
    text-underline-offset: 3px;
    padding: 0.4rem 0.2rem;
  }
  .ifm-prefs-link { flex: 0 0 auto; margin-left: auto; }
  .ifm-prefs-link:hover, .ifm-prefs-link:focus-visible,
  .ifm-prefs-clear:hover, .ifm-prefs-clear:focus-visible {
    color: var(--color-accent);
    text-decoration-thickness: 2px;
    outline: none;
  }

  @keyframes ifm-prefs-rise {
    from { opacity: 0; transform: translateY(1.5rem); }
    to   { opacity: 1; transform: translateY(0); }
  }

  /* ─── „Buchung fortsetzen“-Erinnerung (main.js Block 18) ─── */
  .ifm-resume-card {
    position: fixed;
    left: 1.5rem;
    bottom: 1.5rem;
    z-index: 1080; /* über Sektionen, unter Consent-Karte (1090) + Nav/Mega (1100) */
    width: min(24rem, calc(100vw - 3rem));
    padding: 1.25rem;
    background: var(--color-light-contrast);
    border-radius: var(--radius-sm);
    box-shadow: 0 14px 44px rgba(0, 0, 68, 0.22);
    /* Einstieg per CSS-Mount-Animation (kein JS-rAF nötig → robust). */
    animation: ifm-resume-rise 0.45s cubic-bezier(.22, 1, .36, 1) both;
    transition: opacity 0.35s ease, transform 0.35s ease;
  }
  /* Wegklicken: nach unten ausblenden, dann entfernt das JS das Element */
  .ifm-resume-card.is-leaving { opacity: 0; transform: translateY(1.5rem); }

  /* Kopfzeile: Titel links, Schließen-× rechts auf gleicher Höhe */
  .ifm-resume-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.4rem;
  }
  .ifm-resume-close {
    flex-shrink: 0;
    width: 1.75rem;
    height: 1.75rem;
    display: grid;
    place-items: center;
    border: 0;
    background: none;
    border-radius: var(--radius-sm);
    color: var(--color-primary);
    cursor: pointer;
    opacity: 0.6;
    transition: opacity 0.2s ease, background 0.2s ease;
  }
  .ifm-resume-close:hover, .ifm-resume-close:focus-visible {
    opacity: 1;
    background: color-mix(in srgb, var(--color-primary) 10%, transparent);
    outline: none;
  }
  .ifm-resume-close svg { width: 1.1rem; height: 1.1rem; fill: currentColor; }

  .ifm-resume-title {
    margin: 0;
    font-size: var(--font-size-xl);
    line-height: 1.2;
    color: var(--color-primary);
  }
  .ifm-resume-text {
    margin: 0 0 1.1rem;
    font-size: var(--font-size-sm);
    line-height: 1.55;
    color: var(--color-primary);
  }
  .ifm-resume-text strong { font-weight: 700; }
  .ifm-resume-cta { width: 100%; }

  @keyframes ifm-resume-rise {
    from { opacity: 0; transform: translateY(1.5rem); }
    to   { opacity: 1; transform: translateY(0); }
  }
  @media (prefers-reduced-motion: reduce) {
    .ifm-resume-card { animation: none; }
  }
  @media (max-width: 414px) {
    .ifm-resume-card { left: 0.5rem; right: 0.5rem; bottom: 0.5rem; width: auto; }
  }

  /* ─── Detail-Dialog (natives <dialog>, modal) ─── */
  .ifm-prefs-dialog {
    width: min(40rem, calc(100vw - 2rem));
    max-height: min(86vh, 50rem);
    margin: auto; /* zentriert im Top-Layer */
    padding: 0;
    border: none;
    border-radius: var(--radius-md);
    background: var(--color-light);
    color: var(--color-primary);
    box-shadow: 0 24px 70px rgba(0, 0, 68, 0.4);
    overflow: hidden; /* innerer Container scrollt */
  }
  .ifm-prefs-dialog::backdrop {
    background: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(2px);
  }
  /* Hintergrund-Scroll-Lock, solange der Dialog offen ist */
  html:has(.ifm-prefs-dialog[open]) { overflow: hidden; }

  .ifm-prefs-dialog-inner {
    display: flex;
    flex-direction: column;
    max-height: inherit;
  }
  .ifm-prefs-dialog-head {
    position: relative; /* Anker für den absolut gesetzten Close-Button (s.u.) */
    padding: 1rem;
  }
  /* Titel + Intro stehen jetzt im vollen Inhaltsfluss (kein Flex-Geschwister neben
     dem Close-Button mehr) → der Intro-Text reicht bis zur Inhalts-Kante. Nur der
     Titel hält rechts Platz für das absolut gesetzte „×“ frei (margin-right). */
  .ifm-prefs-dialog-title { margin: 0 2.5rem 0 0; font-size: var(--font-size-xl); color: var(--color-primary); }
  .ifm-prefs-dialog-intro { margin: 0.35rem 0 0; font-size: var(--font-size-sm); line-height: 1.5; }
  .ifm-prefs-close {
    position: absolute;
    top: 0.75rem;
    right: 0.75rem;
    width: 2.25rem;
    height: 2.25rem;
    display: grid;
    place-items: center;
    background: none;
    border: 0;
    border-radius: var(--radius-sm);
    color: var(--color-primary);
    cursor: pointer;
    transition: background 0.2s ease;
  }
  .ifm-prefs-close:hover, .ifm-prefs-close:focus-visible {
    background: color-mix(in srgb, var(--color-primary) 12%, transparent);
    outline: none;
  }
  .ifm-prefs-close svg { width: 1.1rem; height: 1.1rem; }

  /* Kategorie-Liste (scrollbarer Mittelteil) */
  .ifm-prefs-cats {
    overflow-y: auto;
    padding: 0.25rem 1rem 0.5rem;
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
  }
  .ifm-prefs-cat {
    border: 1px solid color-mix(in srgb, var(--color-primary) 16%, transparent);
    border-radius: var(--radius-sm);
    padding: 0.9rem 1rem;
  }
  .ifm-prefs-cat-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
  }
  .ifm-prefs-cat-name { font-weight: 700; font-size: var(--font-size-md); }
  .ifm-prefs-cat-desc {
    margin: 0.5rem 0 0;
    font-size: var(--font-size-sm);
    line-height: 1.5;
    color: color-mix(in srgb, var(--color-primary) 82%, transparent);
  }
  /* Switch im Kategorie-Kopf: nur der Toggle (BG/Padding/min-height der
     .form-field-switch-Komponente strippen), Fokus-Ring der Komponente bleibt. */
  .ifm-prefs-cat .form-field-switch {
    background: none;
    padding: 0;
    min-height: 0;
    gap: 0;
    flex: 0 0 auto;
  }
  .ifm-prefs-cat .form-field-switch:hover { box-shadow: none; }
  /* "Notwendig": dauerhaft aktiv + deaktiviert (nicht abwählbar) */
  .ifm-prefs-cat--locked .form-field-switch { cursor: not-allowed; opacity: 0.7; }

  .ifm-prefs-tools { padding: 0.5rem 1rem 0; }

  .ifm-prefs-dialog-foot {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    padding: 1rem;
    margin-top: 0.5rem;
    border-top: 1px solid color-mix(in srgb, var(--color-primary) 12%, transparent);
  }
  /* Reihenfolge: "Auswahl speichern" volle Breite oben (granulare Wahl bestätigen),
     darunter "Alle ablehnen" + "Alle akzeptieren" gleich groß nebeneinander. */
  .ifm-prefs-save {
    flex: 1 1 100%;
    order: -1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.7rem 1.5rem;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    font-weight: 600;
    font-family: inherit;
    cursor: pointer;
    background: transparent;
    color: var(--color-primary);
    border: 2px solid color-mix(in srgb, var(--color-primary) 45%, transparent);
    transition: border-color 0.2s ease, background 0.2s ease;
  }
  .ifm-prefs-save:hover, .ifm-prefs-save:focus-visible {
    border-color: var(--color-primary);
    background: color-mix(in srgb, var(--color-primary) 8%, transparent);
    outline: none;
  }
  .ifm-prefs-dialog-foot .cta-main,
  .ifm-prefs-dialog-foot .cta-secondary { flex: 1 1 8rem; }

  /* ─── Click-to-load-Platzhalter für externe Medien (YouTube / Google Maps) ─── */
  .ifm-embed {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    min-height: 12rem;
    padding: 1.75rem;
    text-align: center;
    background: var(--color-primary);
    color: var(--color-light);
    border-radius: var(--radius-md);
  }
  .ifm-embed-provider { font-weight: 700; font-size: var(--font-size-lg); }
  .ifm-embed-note { margin: 0; font-size: var(--font-size-sm); max-width: 30rem; opacity: 0.88; line-height: 1.5; }
  .ifm-embed [data-embed-load] { margin-top: 0.25rem; }
  .ifm-embed iframe {
    width: 100%;
    aspect-ratio: 16 / 9;
    border: 0;
    border-radius: var(--radius-md);
    display: block;
  }

  /* ─── Reduced Motion ─── */
  @media (prefers-reduced-motion: reduce) {
    .ifm-prefs-card { animation: none; }
    .ifm-prefs-dialog::backdrop { backdrop-filter: none; }
    .ifm-prefs-close, .ifm-prefs-save { transition: none; }
  }

  /* ─── Responsive: Smartphone (≤414px) ─── */
  @media (max-width: 414px) {
    .ifm-prefs-card {
      left: 0.5rem;
      right: 0.5rem;
      bottom: 0.5rem;
      width: auto;
      padding: 1.3rem 1.3rem;
    }
    .ifm-prefs-title { margin-right: 2.5rem; }
    .ifm-prefs-actions .cta-main,
    .ifm-prefs-actions .cta-secondary { flex: 1 1 100%; }
    .ifm-prefs-link { margin-left: 0; width: 100%; text-align: center; }
    .ifm-prefs-dialog-foot .cta-main,
    .ifm-prefs-dialog-foot .cta-secondary { flex: 1 1 100%; }
  }

  /* === Responsive: ≤650 (Extra-Stufe — Schmal-Stack — Nav) === */
  @media (max-width: 650px) {
    .nav-right { gap: 0.5rem; }
    .nav {
      padding-left: 0.5rem;
      padding-right: 0.5rem;
    }
    .content-wrap {
      padding: 0 0.5rem;
    }
  }

  /* Lock body scroll while mobile drawer open */
  .nav-fixed-wrapper:has(.burger-checkbox:checked) ~ * { /* visual: drawer is on top, content stays */ }

  /* =====================================================================
     Icon-Kachel-Raster (.icon-tile-grid / .icon-tile) — GETEILTE Komponente:
     weiße Karte, Icon oben + Titel darunter, optional kleine Meta-Zeile.
     Genutzt vom CMS-Block „Kategorien" (Wissenswelten-Übersicht) UND vom
     Kontakt-Funnel (Themen-Auswahl; dort .icon-tile + JS-Hook .kontakt-bereich-btn).
     Werte 1:1 aus der früheren kontakt.css-Kacheloptik → Funnel-Look unverändert.
     CMS-Ergänzung in main.css (bei einem Asset-Resync aus test\design ERHALTEN —
     test\design kennt diese Klassen nicht).
     ===================================================================== */
  .icon-tile-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    grid-auto-rows: 1fr;            /* alle Kacheln exakt gleich hoch */
    gap: 1rem;
    width: 100%;
    max-width: 62rem;
    margin: 0.5rem auto 0;
  }
  .icon-tile {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    gap: 0.5rem;
    width: 100%;
    height: 100%;                  /* füllt die 1fr-Zelle → gleiche Höhe */
    min-height: 5.5rem;
    padding: 1.1rem 1.15rem;
    border: none;
    border-radius: var(--radius-sm);
    background: var(--color-light-contrast);   /* weiße Karte, hebt sich vom hellen Body ab */
    color: var(--color-primary);
    font-family: inherit;
    text-decoration: none;
    cursor: pointer;
    box-shadow: 0 10px 26px rgba(0, 68, 74, 0.12);
    transition: transform 0.2s ease, box-shadow 0.2s ease;
  }
  .icon-tile:hover { transform: translateY(-3px); box-shadow: 0 16px 34px rgba(0, 68, 74, 0.18); }
  .icon-tile:focus-visible { outline: 3px solid var(--color-accent); outline-offset: 3px; }
  .icon-tile-icon { width: 1.7rem; height: 1.7rem; flex-shrink: 0; fill: var(--color-accent); }
  .icon-tile-title { font-size: var(--font-size-lg); font-weight: 700; line-height: 1.2; }
  .icon-tile-meta { font-size: var(--font-size-sm); font-weight: 500; line-height: 1.2; color: var(--color-primary-muted); }
  @media (max-width: 1279.98px) {
    .icon-tile-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 34rem; }
  }
  @media (max-width: 414px) {
    .icon-tile-grid { grid-template-columns: 1fr; }
  }
  @media (prefers-reduced-motion: reduce) {
    .icon-tile { transition: none; }
    .icon-tile:hover { transform: none; }
  }
/* =============================================================================
   OMA CMS — generische Block-Layer.
   Ergaenzt main.css fuer Layout-Belange, die dort nur seiten-/ID-spezifisch
   existieren (Section-Hintergruende, Full-Bleed, Grid, generisches Quote/Figure).
   Nutzt ausschliesslich die bestehenden Design-Tokens → 1:1-Look.
   ========================================================================== */

/* ---- Mobile-/Basis-Korrekturen --------------------------------------------- */
/* (1) Horizontaler Overflow-Schutz am ROOT (Betreiber-Bug 2026-06-17):
   Full-Bleed-Sektionen (.cms-section--full, Mega-Menue) + die Demo-Karussells
   (#empfehlungen/#bewertungen/#team) sind 100vw breit; mit `scrollbar-gutter: stable`
   (main.css html) ragt 100vw um die Scrollbar-Breite ueber den Inhaltsbereich hinaus.
   `body{overflow-x:hidden}` (main.css) klippt das im Desktop-Blink (auch DevTools-Mobile),
   ABER echte Handy-Browser (Chrome/Firefox) weiten ihr Layout-Viewport auf die volle
   Inhaltsbreite → die Seite laesst sich horizontal pannen und der fixe Header (width:100%)
   deckt den Ueberstand nicht mehr ("Header fixed nicht richtig"). Auf der Startseite fehlen
   diese Bloecke → dort kein Fehler. `overflow-x:clip` am html reduziert
   documentElement.scrollWidth zuverlaessig auf die Viewportbreite (verifiziert 407→375 @375px)
   OHNE eigenen Scroll-Container zu erzeugen (clip ≠ hidden) → position:fixed, der
   Off-Canvas-Drawer und das vertikale Scrollen bleiben intakt.
   **WICHTIG — body MUSS hier mit auf `clip` (statt main.css `overflow-x:hidden`):** Sobald `html`
   einen Nicht-`visible`-Wert hat, propagiert die `overflow` des body NICHT mehr zum Viewport
   (CSS-Overflow-Propagation). main.css `body{overflow-x:hidden}` wird dann via der „eine Achse
   hidden ⇒ andere Achse auto"-Regel zu `overflow:hidden auto` → body wird ein EIGENER, im Viewport
   GESCHACHTELTER Scroll-Container. Das zerschießt das sticky Inhaltsverzeichnis (`section.toc-section`,
   `position:sticky; top:52px`): es klebt dann am nicht-scrollenden body statt am Viewport und scrollt
   weg (live verifiziert: tocTop -608/-1608 statt 52). `body{overflow-x:clip}` ergibt `clip/visible`
   (KEIN Scroll-Container) → Viewport bleibt der einzige Scroller → sticky klebt wieder (tocTop 52).
   Daher NICHT body wieder auf `hidden` setzen. */
html, body { overflow-x: clip; }

/* (2) Lange deutsche Komposita in Ueberschriften (z.B. "Weiterbildungssuche" auf /suche/)
   brechen mit dem Default `overflow-wrap:normal` nicht und ragen auf schmalen Viewports aus
   Karte/Viewport heraus. break-word bricht nur im Notfall (kein Einfluss auf normales Umbrechen),
   hyphens:auto trennt dank lang="de" sauber an Silbengrenzen. */
h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; hyphens: auto; }

/* (3) Letzter Absatz ohne Bottom-Margin (Betreiberwunsch 2026-06-23): ein <p>, auf das KEIN
   weiteres <p> folgt, soll keinen margin-bottom mehr setzen (verhindert ueberfluessigen
   Abstand am Ende einer Textgruppe). Scope .content-wrap + :not(:has(+ p)) ergibt (0,1,2)
   und schlaegt damit die globale `.content p, .content-wrap p{margin-bottom:1.25rem}` (0,1,1). */
.content-wrap p:not(:has(+ p)) { margin-bottom: 0; }

/* (4) h3-Default (Betreiberwunsch 2026-06-23): main.css setzt keinen generischen h3-Stil
   (nur der globale *{margin:0}-Reset greift), daher hier vereinheitlichen. (0,1,1) schlaegt
   den Reset per Quell-Reihenfolge; .keynote-card h3 (0,2,0) u.ae. bleiben unberuehrt. */
.content-wrap h3 { margin: 1rem 0; font-size: var(--font-size-xl); }

/* ---- Section-Hintergruende -------------------------------------------------- */
/* WICHTIG: keine :where()-Selektoren (Spezifitaet 0) — sonst schlaegt die globale
   Regel .content-wrap p (0,1,1) die Textfarbe. cms-blocks.css wird NACH main.css
   geladen, daher gewinnen gleich-spezifische Selektoren (0,1,1) per Quell-Reihenfolge. */
.cms-section--accent { background: var(--color-accent); }
.cms-section--accent,
.cms-section--accent h1, .cms-section--accent h2, .cms-section--accent h3, .cms-section--accent h4,
.cms-section--accent p, .cms-section--accent li, .cms-section--accent strong, .cms-section--accent em,
.cms-section--accent a { color: var(--color-on-accent); }

.cms-section--teal { background: var(--color-primary); }
.cms-section--teal,
.cms-section--teal h1, .cms-section--teal h2, .cms-section--teal h3, .cms-section--teal h4,
.cms-section--teal p, .cms-section--teal li, .cms-section--teal strong, .cms-section--teal em { color: var(--color-light); }
.cms-section--teal a { color: var(--color-icon); }

/* Termine-Sektion (6.7) im teal Abschnitt: die generischen Teal-Textregeln oben sind fuer die
   HELLEN Karten der Sektion (Mein-Seminar-Sidebar, Inklusivleistungs-Teaser) und die Buttons zu
   breit — sonst weiss-auf-weiss (Inklusivleistungs-li, strong in der Sidebar) bzw. gelbe
   CTA-Texte. Hoehere Spezifitaet (0,2,1) gewinnt unabhaengig von der Reihenfolge. */
.cms-section--teal .termine-keynotes-list li,
.cms-section--teal .group-discount-hint strong { color: var(--color-primary); }
/* dunkle Rabatt-Pille in der hellen Sidebar behaelt helle Schrift (generische strong-Regel passt dort) */
/* CTA-Links in der Termine-Sektion: die generische `.cms-section--teal a`-Regel (0,1,1) faerbt
   .cta-secondary/.cta-main (beide nur 0,1,0) sonst icon-gelb. Jeden Button auf SEINE natuerliche
   Farbe zuruecksetzen (cta-secondary = hell auf dunkelgruen, cta-main = on-accent-Teal auf Coral) —
   der gelbe `.map-city-empty a`-Link (JS-Kartenansicht, „Wunschtermin") MUSS gelb bleiben. */
.cms-section--teal .termine-more a { color: var(--color-light); }
.cms-section--teal a.sidebar-cta { color: var(--cta-text-color, var(--color-light)); }

/* Termine „Weiterbildung/Anfrage"-Modus (Blocks\Termine): Teilnehmer-UI bzw. Preiszeile ausblenden.
   Der Slider bleibt im DOM (main.js JS Block 9 bricht ohne #participants-slider ganz ab); display:none
   macht ihn nur unsichtbar/nicht fokussierbar → Teilnehmer bleibt 1. */
.termine-sidebar[data-no-participants] .sidebar-detail-participants,
.termine-sidebar[data-no-participants] #group-discount-hint,
.termine-sidebar[data-no-participants] #participants-discount { display: none; }
.termine-sidebar[data-price-hide] .sidebar-price-row { display: none; }

.cms-section--light { background: var(--color-light-contrast); }

/* Contained-Section MIT Hintergrund: Innenabstand + Radius */
.cms-section--boxed { padding: var(--padding); border-radius: var(--radius-lg); }

/* Full-Width (full-bleed) — bricht aus .content-wrap aus, Breite/Zentrierung 1:1 wie .hero
   (2026-06-27, Betreiberwunsch „nicht breiter als die Hero-Sektion"): aus content-wrap
   ausbrechen bis 3,5rem Abstand zum Viewport, ABER höchstens 2172px (= native Hero-/Teaser-
   Breite, Deckelung) und dann viewport-zentriert — EXAKT die .hero-Formel (main.css). Vorher
   war es ungedeckelt (calc(100vw-7rem), wuchs >2172px) UND ab 1536px randlos 100vw (= 7rem
   breiter als die Hero) → an zwei Stellen breiter als die Hero. Oberhalb 1536px: 3,5rem Rand +
   Radius + Hero-Deckelung; ab 1536px bricht es NICHT mehr aus .content-wrap aus (width:100%,
   margin:0, Radius bleibt) — s. Media-Query unten. Unterschied zu --bleed = durchgehend 100vw. */
.cms-section--full {
  width: min(100vw - 7rem, 2172px);
  margin-left: calc(50% - min(100vw - 7rem, 2172px) / 2);
  border-radius: var(--radius-lg);
  padding: 3.5rem;
  overflow: hidden;
}
.cms-section--full > .cms-section-inner { max-width: 84rem; margin: 0 auto; }

@media (max-width: 1536px) {
  /* ab 1536: nicht mehr aus .content-wrap ausbrechen — Sektion fuellt den
     Inhaltsbereich (width:100%, margin:0), Radius bleibt (Betreiberwunsch). */
  .cms-section--full { padding: 2.5rem 1.5rem; margin: 0; width: 100%; }
}

/* Randlos (full-bleed ohne Seitenrand/Radius bei JEDER Breite, wie die Termine-Sektion).
   Unterschied zu --full: KEIN 3,5rem-Rand/Radius ab 1536px → durchgehend 100vw. */
.cms-section--bleed {
  width: 100vw;
  margin-left: calc(-50vw + 50%);
  border-radius: 0;
  padding: 3.5rem;
  overflow: hidden;
}
.cms-section--bleed > .cms-section-inner { max-width: 84rem; margin: 0 auto; }
@media (max-width: 1536px) {
  .cms-section--bleed { padding: 2.5rem 1.5rem; }
}

/* ---- Grid ------------------------------------------------------------------- */
.cms-grid {
  display: grid;
  /* Grid-eigene Variablen NICHT von einem übergeordneten Grid erben: CSS-Custom-Properties
     vererben sich standardmäßig — ein verschachteltes Grid (Grid-in-Grid) übernähme sonst die
     „Spaltenbreiten"/Spalten/Zeilen des Eltern-Grids und ignorierte seine eigenen Einstellungen
     (z.B. inneres Grid „Spalten=1", aber äußeres hat Spaltenbreiten „1fr 2fr" → inneres würde
     fälschlich 2 Spalten zeigen). `initial` setzt sie auf den garantiert-ungültigen Wert →
     var() greift wieder auf den jeweiligen Fallback bzw. den am Grid selbst gesetzten Inline-Wert. */
  --cms-grid-template: initial;
  --cms-grid-cols: initial;
  --cms-grid-rows: initial;
  --cms-grid-gap: initial;
  /* --cms-grid-template = eigene Spaltenbreiten (Grid-Einstellung „Spaltenbreiten"), z.B.
     „2fr 1fr" oder „220px 1fr". Leer → gleichmäßige Spalten aus --cms-grid-cols. Als Variable
     gesetzt (nicht inline grid-template-columns), damit die Mobil-Regel unten weiter auf 1 Spalte
     überschreiben kann. */
  grid-template-columns: var(--cms-grid-template, repeat(var(--cms-grid-cols, 2), minmax(0, 1fr)));
  grid-template-rows: var(--cms-grid-rows, none);
  gap: var(--cms-grid-gap, 2rem);
}
@media (max-width: 900px) {
  .cms-grid { grid-template-columns: 1fr; grid-template-rows: none; }
}

/* ---- Auto-Layout: Info-Tile-Sidebar ----------------------------------------
   Bildet die Original-Sektion (section-inhalte-body + info-tile-aside) automatisch
   nach, OHNE Per-Block-CSS: greift, sobald ein Grid Info-Tiles enthält. So müssen
   die fertigen main.css-Maße nicht inline dupliziert werden.
   Struktur: äußeres .cms-grid › [ .cms-grid (Hauptinhalt) , .cms-grid › .info-tile (Sidebar) ].
   Hinweis: nutzt :has() (alle aktuellen Browser, Stand 2026). */

/* Sidebar-Spalte = Grid, das Info-Tiles direkt enthält: vertikal gestapelt, 1rem Abstand,
   oben verankert (Tiles nicht auf Zeilenhöhe strecken).
   :not(.cms-grid--plain) = Opt-out über die Grid-Einstellung „Feste Spalten erzwingen"
   (Blocks\Grid setzt dann die Klasse cms-grid--plain → dieses Auto-Layout greift nicht mehr,
   das Grid behält seine echten --cms-grid-cols-Spalten). */
.cms-grid:has(> .info-tile):not(.cms-grid--plain) {
  grid-template-columns: 1fr;
  gap: 1rem;
  align-self: start;
}
/* Tablet (900–1279px): Tiles als 2er-Reihe wie info-tile-aside im Original. */
@media (min-width: 900px) and (max-width: 1279.98px) {
  .cms-grid:has(> .info-tile):not(.cms-grid--plain) { grid-template-columns: 1fr 1fr; }
}

/* Äußerer 2-Spalten-Container = Grid mit Info-Tile-NACHFAHREN, aber ohne direkte
   Info-Tile-Kinder (die Tiles liegen in der Sidebar-Spalte): flexibler Hauptinhalt
   links + feste 17rem-Sidebar rechts. Die :not(:has(> .info-tile))-Klausel grenzt ihn
   von der Sidebar selbst ab.
   WICHTIG: Der Hauptinhalt (Untertitel + Text/Liste) liegt FLACH als direkte Kinder —
   KEIN Wrapper-Grid nötig. Alle direkten Kinder gehen in die linke Spalte; nur die
   Tile-Sidebar in die rechte und über alle Textzeilen gespannt. row-gap:0, damit die
   Textzeilen mit ihren EIGENEN Margins fließen (kein doppelter Grid-Abstand). */
.cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) {
  grid-template-columns: minmax(0, 1fr) 17rem;
  column-gap: 2rem;
  row-gap: 0;
  align-items: start;
}
.cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) > * { grid-column: 1; }
.cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) > .cms-grid:has(> .info-tile) {
  grid-column: 2;
  grid-row: 1 / span 50;
  align-self: start;
}
/* ≤1279px: einspaltig stapeln, Spalten-/Zeilenplatzierung zurücksetzen */
@media (max-width: 1279.98px) {
  .cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) { grid-template-columns: 1fr; }
  .cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) > *,
  .cms-grid:has(.info-tile):not(:has(> .info-tile)):not(.cms-grid--plain) > .cms-grid:has(> .info-tile) {
    grid-column: auto;
    grid-row: auto;
  }
}

/* Notch-Untertitel, der in einer Grid-Spalte liegt, behält die Notch-Typografie —
   main.css stylt .notch-subtitle nur als direktes Kind von .has-notch;
   in einer Grid-Spalte (Hauptinhalt) greift das sonst nicht. Der Abstand zum folgenden
   Inhalt kommt aus dessen margin-bottom (1.5rem) — NICHT aus dem Grid-gap, damit Absätze
   (Über-uns) nicht doppelt (gap + p-margin) auseinanderstehen. */
.cms-grid > .notch-subtitle {
  font-size: var(--font-size-xl);
  font-weight: 700;
  color: var(--color-primary);
  margin: 0 0 1.5rem;
  line-height: 1.25;
}
/* Hauptinhalts-Spalte (links): Untertitel + Listen/Absätze fließen mit ihren EIGENEN
   Margins (Untertitel oben via margin-bottom). Listen/Absätze brauchen keinen Grid-Gap
   → kein doppelter Abstand zwischen Absätzen (gap + p-margin). Liste oben anlegen. */
.cms-grid > .cms-list { margin: 0; }

/* ---- Auto-Layout: Seminar-Karte neben Intro (Vorkurs-Pattern) ----------------
   Original-Sektion #vorkurs: links Intro (H2 + Absatz), rechts EINE breite Kurs-Karte
   (.vorkurs-layout = 1fr 1fr, gap 2.5rem, align start). Nachbau mit Bordmitteln:
   Grid › [ Heading, Text …, Seminar-Karte ] FLACH als direkte Kinder — die Karte
   wandert automatisch in die rechte Spalte und spannt alle Intro-Zeilen; die Texte
   fließen mit ihren eigenen Margins (row-gap 0, kein Riesen-Abstand H2→Absatz mehr).
   Der Block-Wrapper .cms-seminarkarte ist einspaltig + ohne margin-top (das geerbte
   .folgekurse-grid ist 2-spaltig mit margin-top 2.5rem und würde die einzelne Karte
   halbieren/nach unten schieben). Greift nur bei GENAU EINER Karte im Grid. */
.cms-seminarkarte { grid-template-columns: 1fr; margin-top: 0; }
/* Karten-Hover OHNE Verzögerung + Kategorie-Link klickbar — für ALLE CMS-Kartengitter mit
   .folgekurse-grid: das Grid-Layout des Folgekurse-/Empfehlungen-Blocks (rendert .folgekurse-grid
   OHNE die Test-ID #folgekurse) UND die Seminar-Karte (.cms-seminarkarte ist selbst .folgekurse-grid).
   (1) Die Basis-.card hat 0.4s transition-delay (transition … 0.4s) → träge; ohne Delay animieren
       wie im Original (#folgekurse/#vorkurs/.ks-grid).
   (2) Kategorie über den ganzflächigen .kurs-card-link-Overlay (z-index:4) heben, sonst fängt der
       Overlay den Klick.
   Spezifität .folgekurse-grid … (0,2,0) schlägt .card/.kurs-card-category (0,1,0). Das Carousel-
   Layout nutzt id="empfehlungen" → über main.css schon delay-frei + Kategorie z-index:5. */
.folgekurse-grid .card { transition: box-shadow 0.35s ease, transform 0.35s ease; }
.folgekurse-grid .kurs-card-category { position: relative; z-index: 5; }
.cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) {
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  column-gap: 2.5rem;
  row-gap: 0;
  align-items: start;
}
.cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) > * { grid-column: 1; }
.cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) > .cms-seminarkarte {
  grid-column: 2;
  grid-row: 1 / span 50;
  align-self: start;
}
/* ≤1279px: einspaltig stapeln (wie .vorkurs-layout im Original), Platzierung zurück */
@media (max-width: 1279.98px) {
  .cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }
  .cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) > *,
  .cms-grid:has(> .cms-seminarkarte):not(:has(> .cms-seminarkarte ~ .cms-seminarkarte)) > .cms-seminarkarte {
    grid-column: auto;
    grid-row: auto;
  }
}

/* Kategorien-Block (Wissenswelten-Übersicht) rendert seit 2026-06-18 die geteilte
   Icon-Kachel-Komponente `.icon-tile`/`.icon-tile-grid` (main.css, wie der Kontakt-Funnel)
   statt der früheren `.card`-Optik → die alte `.cms-kategorien .card`-Hover-Lift-Korrektur
   ist entfallen (kein `.card` mehr in diesem Block).
   Block-Abweichungen gegenüber der geteilten Komponente (Spezifität 0,2,0 schlägt die
   Basis `.icon-tile-grid` 0,1,0; cms-blocks.css lädt nach main.css):
   - KEINE max-width-Begrenzung (füllt die Sektion; der Funnel behält seine 62rem).
   - Spaltenzahl frei wählbar über das Block-Attribut „Spalten" (Editor) → Inline-Variable
     `--cms-kat-cols` am Grid-Root (Blocks\Kategorien); = die MAXIMALE Spaltenzahl.
   - Auto-Fit statt fixem 4→1-Breakpoint (Betreiberwunsch 2026-06-26): Jede Spalten-Spur
     ist mindestens `--cms-kat-min` breit. Der Track-Min = MAX(--cms-kat-min, (Breite −
     Lücken)/N): solange die volle Breite reicht, ist jede Spur ≥ 1/N → exakt N Spalten;
     wird es enger, greift `--cms-kat-min` → auto-fill packt so viele Spuren wie passen
     (N→…→3→2→1). `min(100%, …)` verhindert Überlauf auf sehr schmalen Viewports.
   - KEIN Box-Shadow im Ruhezustand, nur beim Hover (Betreiberwunsch 2026-06-26). */
.icon-tile-grid.cms-kategorien {
  --cms-kat-min: 13rem;
  max-width: none;
  grid-template-columns: repeat(
    auto-fill,
    minmax(
      min(
        100%,
        max(
          var(--cms-kat-min),
          calc((100% - (var(--cms-kat-cols, 4) - 1) * 1rem) / var(--cms-kat-cols, 4))
        )
      ),
      1fr
    )
  );
}
.icon-tile-grid.cms-kategorien .icon-tile { box-shadow: none; }
.icon-tile-grid.cms-kategorien .icon-tile:hover {
  box-shadow: 0 16px 34px rgba(0, 68, 74, 0.18);
}
/* Lange Komposita (z.B. „Produktionsmanagement") umbrechen statt aus der Kachel
   zu ragen: Wort-Umbruch + deutsche Silbentrennung (lang="de"). */
.icon-tile-grid.cms-kategorien .icon-tile-title {
  overflow-wrap: break-word;
  word-break: break-word;
  hyphens: auto;
}

/* ---- Blog-Beiträge (Blocks\BlogPosts) ---------------------------------------
   Notch-Karten (Notch unten rechts, ganze Karte = Link). Mit Teaser: das Bild als
   Hintergrund + Titel darüber (heller Text auf abdunkelndem Verlauf); ohne Teaser:
   einfarbig dunkelgrün (--color-primary) mit Titel. Spaltenzahl über --cms-blog-cols. */
.cms-blogposts { width: 100%; }
.cms-blogposts > .section-heading { margin: 0 0 1.5rem; }
.cms-blogposts-grid {
  display: grid;
  gap: 1.5rem;
  grid-template-columns: repeat(
    auto-fill,
    minmax(
      min(
        100%,
        max(
          16rem,
          calc((100% - (var(--cms-blog-cols, 3) - 1) * 1.5rem) / var(--cms-blog-cols, 3))
        )
      ),
      1fr
    )
  );
}
.cms-blog-card {
  /* has-notch is-bottom-right liefert Notch + radius-sm; hier Box + dunkler Grund. */
  display: flex;
  flex-direction: column;
  min-height: 16rem;
  background: var(--color-primary);
  color: var(--color-light);
  text-decoration: none;
  overflow: visible; /* Notch-Masken + Dot-Hover dürfen NICHT geclippt werden */
  transition: transform 0.35s ease, box-shadow 0.35s ease;
}
.cms-blog-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 18px 38px rgba(0, 68, 74, 0.28);
}
.cms-blog-card-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: inherit;
  margin: 0;
  z-index: 0;
}
.cms-blog-card-shade {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  z-index: 1;
  background: linear-gradient(
    to top,
    rgba(0, 68, 74, 0.85) 0%,
    rgba(0, 68, 74, 0.45) 40%,
    rgba(0, 68, 74, 0.05) 75%
  );
}
.cms-blog-card-body {
  position: relative;
  z-index: 2;
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 0.4rem;
  padding: 1.5rem 1.5rem 2.2rem;
}
.cms-blog-card-date {
  position: absolute;
  top: 1.2rem;
  left: 1.5rem;
  z-index: 2; /* über dem Verlauf (.cms-blog-card-shade z-index 1) */
  font-size: var(--font-size-sm);
  color: var(--color-light);
  opacity: 0.92;
  letter-spacing: 0.02em;
  text-shadow: 0 1px 4px rgba(0, 68, 74, 0.55);
}
.cms-blog-card-title {
  margin: 0;
  color: var(--color-light);
  font-size: var(--font-size-lg);
  font-weight: 700;
  line-height: 1.25;
  overflow-wrap: break-word;
}
/* Karussell-Layout (via Carousel::shell): Karte füllt die Slide → gleiche Höhe in der Reihe. */
.cms-blogposts-carousel .carousel-slide { display: flex; }
.cms-blogposts-carousel .cms-blog-card { width: 100%; }

/* ---- Ganzflächiger Karten-/Element-Link ("stretched link") ------------------
   Wie .keynote-card-link/.kurs-card-link/.mega-card-link der Testseite: ein
   absolut positionierter <a> füllt den ganzen Block (Notch/Div/Section/Info-Tile)
   und macht ihn komplett anklickbar — ohne sichtbaren Linktext. Der Block-Root
   wird dafür zum Positionierungskontext. Verdrahtet über Renderer::linkOverlay()
   (attrs.link). */
.cms-has-link { position: relative; }
.cms-stretch-link {
  position: absolute;
  inset: 0;
  z-index: 4;
  border-radius: inherit;
  text-decoration: none;
  color: inherit;
  font-size: 0;
}
/* Interaktive Inhalte (echte Links, Buttons, Tooltip-/Info-Icons) über dem
   Flächen-Link klickbar halten — sonst fängt der Overlay ihre Klicks ab. */
.cms-has-link a:not(.cms-stretch-link),
.cms-has-link button,
.cms-has-link .tooltip-icon,
.cms-has-link [data-tooltip] { position: relative; z-index: 5; }
/* Editor-Canvas: statt des klickbaren <a> ein nicht-interaktiver Eck-Marker
   (Renderer rendert ihn im Editor-Modus), damit der Overlay die Block-Auswahl
   nicht blockiert. Unten links → kollidiert nicht mit Notch (oben) / „+"-Chip. */
.cms-link-badge {
  position: absolute;
  left: .55rem; bottom: .55rem;
  z-index: 6;
  pointer-events: none;
  font-size: 1rem;
  line-height: 1;
  opacity: .7;
}

/* ---- Notch-Block: Default-Box je Position ------------------------------------
   main.css gibt NUR dem Oben-Links-Notch (.has-notch.is-left) einen Default-Innen-
   abstand; Oben-Rechts (blankes .has-notch) und Unten-Rechts (.is-bottom-right)
   hatten KEINEN → Inhalt klebte am Rand bzw. unter der Notch, die Karte hatte keinen
   Innenrand (die Keynote-Karten sahen nur durch ihre eigene .keynote-card-Klasse gut
   aus). Der Renderer hängt an jeden Notch-Block die Marker-Klasse .cms-notch.
   :where() hält die Defaults auf Spezifität 0 → eine eigene CSS-Klasse (z.B.
   keynote-card) ODER die main.css-is-left-Regel gewinnen weiterhin; sonst greift
   dies als Grundausstattung.
   --cms-notch-pad = seitlicher Innenabstand (≤650 = 1rem, wie main.css --padding-x),
   damit die Float-Reserve unten exakt zur tatsächlichen Seitenbreite passt. */
:where(.cms-notch) {
  --cms-notch-pad: var(--has-notch-padding, 2.5rem);
  display: flow-root;               /* BFC: enthält den Eck-Reserve-Float (oben rechts) */
  padding: var(--cms-notch-pad);
  padding-top: var(--padding-top, 1.5rem);
}
@media (max-width: 650px) { :where(.cms-notch) { --cms-notch-pad: 1rem; } }

/* OBEN RECHTS: KEINEN vollen Top-Streifen reservieren (das ergab oben zu viel Abstand)
   — stattdessen nur die Notch-ECKE per Float freihalten, wie bei den Keynote-Karten.
   Die Überschrift beginnt mit normalem kleinem Top-Abstand und umfließt die Notch.
   Ausgenommen: is-left (behält den vollen Top-Abstand aus main.css), is-bottom-right
   (Notch unten) und keynote-card (eigene Float-Reserve; als Flex-Container würde der
   Float sonst zum Flex-Item). */
:where(.cms-notch:not(.is-left):not(.is-bottom-right):not(.keynote-card))::before {
  content: "";
  float: right;
  width: calc(var(--notch-size) - var(--cms-notch-pad) + 0.9rem);
  height: calc(var(--notch-size) - var(--padding-top, 1.5rem) + var(--title-notch-gap, 1rem));
  shape-outside: inset(0);
  margin-left: 1rem;
}
/* unten rechts: Notch sitzt unten → unten Platz reservieren (Float geht nur top-down). */
:where(.cms-notch.is-bottom-right) { padding-bottom: calc(var(--notch-size) + 1rem); }

/* Klickbarer Notch (Link „ganzer Block" gesetzt → .cms-has-link): Hover-Lift wie die
   Keynote-Karten; der Dot verschmilzt beim Hover in die Ecke. Unten-Rechts merged
   bereits global (.has-notch.is-bottom-right:hover) → hier nur der Lift. */
.cms-notch.cms-has-link { cursor: pointer; transition: transform .35s ease, box-shadow .35s ease; }
.cms-notch.cms-has-link:hover { transform: translateY(-6px); box-shadow: 0 12px 32px rgba(0, 68, 74, .12); }
.cms-notch.cms-has-link:not(.is-bottom-right) > .notch > .dot {
  transform-origin: var(--cms-notch-origin, top right);
  transition: transform .35s cubic-bezier(0.22, 1, 0.36, 1), border-radius .35s ease;
}
.cms-notch.cms-has-link.is-left { --cms-notch-origin: top left; }
.cms-notch.cms-has-link:not(.is-bottom-right):hover > .notch > .dot {
  transform: scale(1.4);
  border-radius: 0 calc(var(--radius-sm) / 1.4) 0 calc(var(--radius-sm) / 1.4);
}
.cms-notch.cms-has-link.is-left:not(.is-bottom-right):hover > .notch > .dot {
  border-radius: calc(var(--radius-sm) / 1.4) 0 calc(var(--radius-sm) / 1.4) 0;
}
.cms-notch.cms-has-link:not(.is-bottom-right) > .notch::before,
.cms-notch.cms-has-link:not(.is-bottom-right) > .notch::after { transition: opacity .15s ease; }
.cms-notch.cms-has-link:not(.is-bottom-right):hover > .notch::before,
.cms-notch.cms-has-link:not(.is-bottom-right):hover > .notch::after { opacity: 0; transition: opacity .2s ease .15s; }

/* Standort-Karte (Default-Look der Vorlage „Standort-Karte"): dunkle Teal-Karte mit heller Schrift.
   Der Karten-KOERPER wird dunkel (schlaegt .has-notch{background:var(--color-light-contrast)} per
   Quell-Reihenfolge bei gleicher Spezifitaet 0,1,0); der Notch-Tab/-„Biss" (--notch-bg) bleibt
   cremefarben = Seitenhintergrund, sodass das Eck weiterhin korrekt ausgestanzt aussieht. Die
   Text-Regeln schlagen die generischen .content-wrap-Ueberschrift-/Absatz-Regeln ebenso per
   Quell-Reihenfolge (0,1,1). Der .dot ist ausgenommen (bei dotType h2/text sitzt er auf der
   gelben Pille — seine Farbe nicht ueberschreiben). */
.cms-standort-card { background: var(--color-on-accent); color: var(--color-light); }
.cms-standort-card h2:not(.dot),
.cms-standort-card h3,
.cms-standort-card h4,
.cms-standort-card p,
.cms-standort-card li,
.cms-standort-card strong,
.cms-standort-card a:not(.cms-stretch-link) { color: var(--color-light); }

/* ---- Listen (generisch) ----------------------------------------------------- */
/* .bullet-list ist in main.css bewusst ohne Einrueckung (lieferte die früher der
   Test-Container .inhalte-list, im CMS entfernt). Der generische CMS-Listenblock liefert
   die Einrueckung selbst. .check-list ist in main.css bereits eigenstaendig → nur Gap ergaenzen. */
ul.cms-list.bullet-list { display: flex; flex-direction: column; gap: .6rem; font-size: var(--font-size-lg); color: var(--color-primary); }
ul.cms-list.bullet-list li { padding-left: 1.4rem; }
ul.cms-list.bullet-list ul { display: flex; flex-direction: column; gap: .35rem; margin: .4rem 0 0; }
/* Verschachtelte Listen aus gebundenem HTML (z.B. {{seminar.inhalt}}) tragen keine
   eigene Klasse → der UA-Default-Marker (disc/circle) erschiene zusaetzlich zum
   gerenderten ::before-Bullet bzw. Haken. Hier abschalten; die Einrueckung/Marker
   kommen von .bullet-list/.check-list per Nachfahren-Selektor. */
ul.cms-list ul, ul.cms-list ol { list-style: none; padding-left: 0; }
ul.cms-list.check-list { gap: .4rem; font-size: var(--font-size-lg); }
ol.cms-list { padding-left: 1.6rem; font-size: var(--font-size-lg); color: var(--color-primary); }
ol.cms-list li { margin-bottom: .5rem; }

/* ---- FAQ-/Accordion-Antworten (HTML) ---------------------------------------
   Antworten dürfen frei HTML enthalten — sowohl manuell eingegeben als auch
   automatisch aus oma_seminar_antworten (Quelle „Seminar-FAQ"). main.css' globaler
   *{padding:0}-Reset entfernt die ul/ol-Einrückung → Default-Marker würden links
   geclippt. ul-Bullets nutzen denselben Stil wie der Listen-Block (.bullet-list):
   kleines, quadratisch-abgerundetes Teal-Bullet via ::before. */
.faq-answer-inner ul { list-style: none; padding-left: 0; margin: .5rem 0 0; }
.faq-answer-inner ol { list-style: decimal; padding-left: 1.6rem; margin: .5rem 0 0; }
.faq-answer-inner ul li { position: relative; padding-left: 1.4rem; margin-bottom: .4rem; line-height: 1.5; }
.faq-answer-inner ol li { margin-bottom: .4rem; line-height: 1.5; }
.faq-answer-inner ul li::before {
  content: ''; position: absolute; left: 0; top: .5em;
  width: .5rem; height: .5rem; border-radius: .15rem;
  background: var(--color-primary); z-index: 2;
}
.faq-answer-inner ul li > ul > li::before { background: color-mix(in srgb, var(--color-primary), white 50%); }
/* Einleitung über dem Accordion (Quelle „Aus Textfeld": Inhalt vor der ersten Überschrift). */
.faq-accordion .faq-intro { margin-bottom: 1.5rem; }
.faq-accordion .faq-intro > :last-child { margin-bottom: 0; }

/* ---- Text-Block mit Liste/Überschrift --------------------------------------
   Hat der Autor strukturelle Block-Elemente (<ul>/<ol>/<h3>…) in einen Text-Block
   gesetzt, rendert er als <div class="cms-rich-text"> mit echtem Markup (statt sie zu
   <br> zu flatten). Die Bullets/Nummerierung kommen NICHT von hier, sondern von den
   echten Listen-Klassen, die Renderer::addListClasses an jedes <ul>/<ol> hängt
   (cms-list bullet-list / cms-list → main.css .bullet-list + ul.cms-list.bullet-list
   oben) → exakt wie der Listen-Block, gilt auch im Roh-HTML-Block. Hier nur Rhythmus. */
.cms-rich-text > :last-child { margin-bottom: 0; }
.cms-rich-text ul.cms-list, .cms-rich-text ol.cms-list { margin: .5rem 0 1.25rem; }
.cms-rich-text ul.cms-list ul, .cms-rich-text ul.cms-list ol { margin: .35rem 0 0; }

/* ---- Rich-Text inline: abbr ------------------------------------------------- */
/* Abkuerzungen (aus der Rich-Text-Leiste „Ab" wie aus gebundenem HTML) einheitlich
   gepunktet unterstreichen + Hilfe-Cursor. Greift in Canvas UND Live (beide laden
   cms-blocks.css) — unabhaengig vom UA-Default. Farbe folgt dem Text (currentColor). */
abbr { text-decoration: underline dotted; text-decoration-thickness: 1px; text-underline-offset: 3px; cursor: help; }

/* ---- Zitat: Notch-Karte (Look wie Bewertungs-Quote) ------------------------- */
/* .cms-quote-card traegt zusaetzlich .has-notch → erbt die Notch-Mechanik aus main.css;
   hier nur groesserer Dot (wie Bewertungen), Notch links UNTEN und Karten-Optik.
   Gleiche Spezifitaet wie die main.css-Basisregeln (0,2,0 / 0,3,0) → cms-blocks.css
   wird NACH main.css geladen, gewinnt also per Quell-Reihenfolge. */
.cms-quote-card {
  --dot-size: 5rem;            /* 2× Default — wie .bewertung-card */
  --notch-size: 6.4rem;        /* Dot + 1.4rem Exposure */
  --mask-pos: 100% 0%;
  background: var(--color-light-contrast);
  border-radius: var(--radius-md);
  padding: var(--padding, 2.5rem);
  margin: 0;
  position: relative;
  min-height: 16rem;
  display: flex;
  flex-direction: column;
}
.cms-quote-card > .notch {       /* Notch nach links unten */
  top: auto; bottom: 0; left: 0; right: auto;
  align-items: flex-end; justify-content: flex-start;
  padding: var(--notch-exposure) var(--notch-exposure) 0 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--radius-md);
}
.cms-quote-card > .notch::before,
.cms-quote-card > .notch::after {
  width: var(--radius-md); height: var(--radius-md);
  -webkit-mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-md), black calc(var(--radius-md) + 0.03125rem));
  mask-image: radial-gradient(circle at var(--mask-pos), transparent var(--radius-md), black calc(var(--radius-md) + 0.03125rem));
}
.cms-quote-card > .notch::before { top: auto; bottom: 0; left: auto; right: calc(var(--radius-md) * -1); }
.cms-quote-card > .notch::after  { top: calc(var(--radius-md) * -1); bottom: auto; right: auto; left: 0; }
.cms-quote-card > .notch > .dot  { top: auto; bottom: var(--dot-offset); right: auto; left: var(--dot-offset); border-radius: var(--radius-md); }
.cms-quote-card > .notch > .dot svg { fill: var(--color-primary); width: 3rem; height: 3rem; }
/* Inhalt mittig (wie Bewertungs-Quote); unten Platz, damit Text den Dot nicht ueberlappt */
/* Inhalt = echtes <blockquote> (Semantik/SEO); UA-Default-Margin zuruecksetzen. */
.cms-quote-card .cms-quote-body {
  flex: 1;
  display: flex; flex-direction: column; justify-content: center;
  gap: .75rem;
  margin: 0; border: 0;
  text-align: center;
  font-size: var(--font-size-lg); line-height: 1.6; color: var(--color-primary);
  padding: 1rem 1rem 2.5rem;
}
.cms-quote-card .cms-quote-body .cms-quote-text { margin: 0; border: 0; font-style: normal; }
.cms-quote-card .cms-quote-cite { margin-top: .75rem; text-align: center; font-weight: 600; color: var(--color-primary-muted); }
/* Liste im Zitat: per Default zentrierter Block (Bullets bleiben am Text), passend zum
   zentrierten Zitattext — sonst kleben die Bullets links und der Text steht mittig.
   Eine explizite Listen-Ausrichtung (inline-style aus ListBlock) überschreibt das. */
.cms-quote-card .cms-quote-body > .cms-list { width: fit-content; margin-inline: auto; text-align: left; }

/* ---- Inline-Icon im Fliesstext (Rich-Text-Leiste „Icon einfuegen") ---------- */
/* Default-Groesse als Fallback (inline style ueberschreibt); fill folgt dem Text. */
.cms-inline-icon { display: inline-block; width: 1.2em; height: 1.2em; vertical-align: -0.15em; fill: currentColor; }
.cms-inline-icon[data-tooltip] { cursor: help; }

/* ---- Inline-Bild im Fliesstext (Rich-Text-Leiste „Bild einfuegen") ---------- */
/* Float/Breite/Abstand kommen als inline-style vom Editor; hier nur sinnvolle Defaults. */
.cms-inline-img { max-width: 100%; height: auto; border-radius: var(--radius-sm); }
/* Clearfix fuer Absaetze mit gefloateten Inline-Bildern, damit Folgeinhalt nicht ueberlappt. */
.content-wrap p:has(> .cms-inline-img[style*="float"])::after { content: ""; display: block; clear: both; }

/* ---- Icon-Block (einzelnes Icon, Groesse + Farbe frei) ---------------------- */
.cms-icon-block { display: block; line-height: 0; color: var(--color-primary); }
.cms-icon-block.is-center { text-align: center; }
.cms-icon-block.is-right  { text-align: right; }
.cms-icon-block.is-left   { text-align: left; }
.cms-icon-block-svg { display: inline-block; width: 2rem; height: 2rem; fill: currentColor; }
/* Breite Symbole (z.B. Wortmarke icon-ifmera-wortmarke): Breite folgt der Hoehe (Seitenverhaeltnis
   aus der echten viewBox) statt aufs Quadrat gestaucht zu werden. Hoehe steuerbar via "Groesse". */
.cms-icon-block-svg.is-wide { width: auto; }

/* ---- Sterne-Block (Bewertung 0-5 als 5 Sterne) ------------------------------ */
.cms-stars { display: flex; align-items: center; gap: .45rem; flex-wrap: wrap; }
.cms-stars.is-center { justify-content: center; }
.cms-stars.is-right  { justify-content: flex-end; }
.cms-stars .stars { margin-bottom: 0; gap: .2rem; }
.cms-stars .star { width: var(--cms-star-size, 1.3rem); height: var(--cms-star-size, 1.3rem); }
.cms-stars .star-filled { fill: var(--cms-star-fill, var(--color-icon)); }
/* Leere Sterne sichtbar auf hellem Seiten-Grund (die main.css-Default-Empty-Farbe ist weiss-
   transparent, nur fuer dunkle Karten gedacht). Spezifitaet 0,2,0 schlaegt main.css .star-empty. */
.cms-stars .star-empty { fill: var(--cms-star-empty, color-mix(in srgb, var(--color-primary), transparent 78%)); }
.cms-stars-value { font-weight: 700; color: var(--cms-star-fill, var(--color-icon)); }
.cms-stars-text { color: inherit; }

/* ---- Formular (generisch) --------------------------------------------------- */
.cms-form { display: flex; flex-direction: column; gap: 1rem; max-width: 640px; }
.form-field-checks { display: flex; flex-direction: column; gap: .4rem; }
.cms-form-msg { padding: .7rem 1rem; border-radius: var(--radius-sm); font-size: .92rem; }
.cms-form-msg.ok { background: #e6ffd9; color: #234d12; }
.cms-form-msg.err { background: var(--coral-soft, #fbe3da); color: #7a2718; }

/* ---- Hero: Notch-Freistellung des Titels -------------------------------------
   Notch-Reserve über padding-right AM TITEL selbst (2026-06-26 — ersetzt den
   früheren float-Guard `.hero-notch-guard` + den ::after-Inline-Spacer).
   Warum dieser Weg:
   1. Hält den Titeltext aus der Aussparung (Notch oben rechts).
   2. Zählt — anders als ein float — in die max-content-Breite des Titels, sodass die
      fit-content-Karte (main.css .hero-card) um die Notch MITWÄCHST → kurze Titel passen
      NEBEN die Notch in EINE Zeile (kein vorzeitiger Umbruch wie „Offene Seminare" → 2 Zeilen).
   3. Erzeugt KEINE Phantom-Leerzeile: der frühere inline-block-Spacer brach auf eine eigene
      Zeile um, deren Zeilenbox-Strut trotz line-height:0 = 70px hoch blieb → genau die „so viel
      Platz unter dem Titel"-Lücke (live verifiziert: Text 1 Zeile, h1 aber 140px hoch).
   Nur der TITEL ist eingerückt — Breadcrumb/Untertitel/eingefügte Blöcke behalten die volle
   Kartenbreite. Maß = Notch (7.59375rem, siehe main.css .hero-card::before) − Card-Padding + 1rem
   Luft (identisch zur alten float-Reserve). Unter 1280px gibt es keine Notch → Reserve entfällt.
   Der `<i class="hero-notch-guard">` wird von Blocks\Hero nicht mehr gerendert. */
.hero-card .hero-title {
  padding-right: calc(7.59375rem - var(--padding) + 1rem);
  /* overflow-wrap: normal (NICHT break-word) — Betreiberbug 2026-06-27 „er packt das ‚t' in eine
     neue Zeile, obwohl nach hinten noch Platz ist": Die Notch-Reserve (padding-right) verschmälert
     JEDE Zeile, aber die Notch sitzt nur oben rechts (Zeile 1). Ein langes Wort ab Zeile 2 ist nur
     ~wenige px breiter als die verschmälerte Zeile → break-word riss das letzte Zeichen ab. Mit
     `normal` darf das Wort statt zu brechen in die (unterhalb der Notch leere) Reserve ÜBERLAUFEN →
     es nutzt die volle Kartenbreite. Dass dabei kein Wort aus der KARTE läuft, garantiert der
     serverseitige Fit (Blocks\Hero::titleFontPx, TITLE_FULL_PX-Sicherung verkleinert Monster-Wörter).
     Überschreibt die globale Regel `h1,h2,…{overflow-wrap:break-word}` (Spezifität 0,2,0 > 0,0,1). */
  overflow-wrap: normal;
}
@media (max-width: 1279.98px) {
  /* Mobil: keine Notch (padding-right 0) UND kein serverseitiger Fit → lange Wörter wieder brechen,
     damit sie nicht aus der (hier schmalen, full-bleed) Karte/Viewport ragen. */
  .hero-card .hero-title { padding-right: 0; overflow-wrap: break-word; }
}

/* Hero-Titel bricht am WORT/Leerzeichen um, NICHT per Silbentrennung (Betreiberwunsch 2026-06-26:
   „Geförderte"/„Weiterbildung" statt „Geförderte Weiterbil-/dung"). hyphens:manual schaltet die
   automatische Silbentrennung ab → der gierige Zeilenfüller weicht auf die nächste Zeile aus statt
   zu trennen. Den Wort-Überlauf/-Umbruch regelt `.hero-card .hero-title` (oben, je Breakpoint).
   Die Begrenzung auf max. 3 Zeilen (Schrift-Verkleinerung) berechnet Blocks\Hero serverseitig und
   gibt sie als --hero-fs aus (siehe main.css .hero-title) → kein client-seitiges Resize/Flash. */
.hero-title {
  -webkit-hyphens: manual;
  hyphens: manual;
}

/* ---- Karussell-Block (generisch) --------------------------------------------
   Die strukturellen Klassen .carousel-viewport/-track/-slide/-dots kommen aus
   main.css (überfllow-clip, container-type, Dots-Optik, Animations-Transition).
   Was dort NUR instanz-spezifisch existiert (Empfehlungen/Team/Bewertungen) und
   dem generischen CMS-Block fehlte: die Slide-BREITE + der --slide-index-TRANSFORM.
   Ohne sie lagen alle Slides (inkl. der vom JS erzeugten Loop-Klone) nebeneinander
   → „Blöcke doppelt, nichts bewegt sich". Hier generisch nachgezogen, gesteuert
   über --cms-pv (Desktop) / --cms-pv-m (Mobil), die der Renderer am Root setzt.
   Breakpoint 900px = deckungsgleich mit der JS-mobileQuery der Factory. */
.cms-carousel { position: relative; }
.cms-carousel .carousel-slide {
  flex: 0 0 calc(100% / var(--cms-pv, 1));
  box-sizing: border-box;
  /* gap als Slide-Innenabstand (hält die cqw-Transform-Mathematik exakt, da
     border-box; --carousel-gap setzt der Renderer/JS nur, wenn ein gap gewählt ist) */
  padding: 0 calc(var(--carousel-gap, 0px) / 2);
}
.cms-carousel .carousel-track {
  transform: translateX(calc(var(--slide-index) * -100cqw / var(--cms-pv, 1)));
}
@media (max-width: 900px) {
  .cms-carousel .carousel-slide { flex-basis: calc(100% / var(--cms-pv-m, 1)); }
  .cms-carousel .carousel-track {
    transform: translateX(calc(var(--slide-index) * -100cqw / var(--cms-pv-m, 1)));
  }
}
/* Team-Karten (Blocks\TeamCard) im generischen Karussell der zerlegten Team-Sektion auf die
   Demo-Kartenbreite (256px) cappen + im Slot zentrieren. Der .team-card-Look (Notch-Clip,
   3/4-Format, Hover-Video) + #team kommen 1:1 aus main.css; ohne die .team-carousel-viewport
   fehlt dort nur das --team-card-size-Cap, das hier nachgezogen wird. */
.cms-carousel .team-card { max-width: 16rem; margin-inline: auto; }

/* Helle Dots + Fortschrittsanzeige (Toggle „dotsLight" am Karussell- UND Bild-Karussell-Block):
   Die Standard-Dots aus main.css nutzen --color-primary (dunkles Teal) und verschwinden auf
   einem dunklen/teal Karussell-Hintergrund. Diese Klasse (vom Renderer am Root gesetzt) färbt
   Track, Hover und die Fortschritts-Füllung der aktiven Pille auf Hell um.
   cms-blocks.css lädt NACH main.css → höhere Spezifität (0,2,0 > 0,1,0) gewinnt. */
.cms-carousel--dots-light .carousel-dot-track {
  background: color-mix(in srgb, var(--color-light), transparent 62%);
}
.cms-carousel--dots-light .carousel-dot:hover .carousel-dot-track,
.cms-carousel--dots-light .carousel-dot:focus-visible .carousel-dot-track {
  background: color-mix(in srgb, var(--color-light), transparent 40%);
}
.cms-carousel--dots-light .carousel-dot-fill {
  background: var(--color-light);
}

/* Bild-Karussell (Blocks\BildKarussell): Slides = Bilder aus einem Medien-Ordner.
   Baseline: Bild füllt den Slot (kein Block-Bild-Margin); die per-Bild-Einstellungen
   imgWidth/imgHeight/objectFit/imgCss kommen als Inline-Style ans <img> und überschreiben. */
.cms-bildkarussell .carousel-slide { display: flex; align-items: center; }
.cms-bildkarussell .carousel-slide img.bk-img {
  width: 100%; height: auto; display: block; margin: 0; object-fit: cover;
}
/* Darstellung „Mittig" (center): ein Bild zentriert — greift, wenn das Bild über
   imgWidth schmaler als der Slot ist (sonst füllt es ohnehin). */
.cms-bildkarussell--center .carousel-slide,
.cms-bildkarussell--peek .carousel-slide { justify-content: center; }
.cms-bildkarussell--center .carousel-slide img.bk-img { width: auto; max-width: 100%; }
/* Darstellung „Mittig mit Vorschau" (peek) — wie #empfehlungen: das aktive Bild groß in
   der Mitte, die Nachbarbilder verkleinert links+rechts sichtbar. Forciert 1 zentriertes
   Bild (perView=1 im Renderer); Position rein über --slide-index (vom JS gesetzt). */
.cms-bildkarussell--peek .carousel-viewport { overflow-clip-margin: 2rem; padding-top: 1rem; padding-bottom: 0.5rem; }
.cms-bildkarussell--peek .carousel-slide {
  flex: 0 0 60%;
  transition: transform 0.4s ease;
  transform: scale(0.82);
}
.cms-bildkarussell--peek .carousel-slide.is-active { transform: scale(1); }
.cms-bildkarussell--peek .carousel-track {
  /* Slide-Breite 60cqw, Zentrierungs-Offset (100-60)/2 = 20cqw → aktive Karte mittig. */
  transform: translateX(calc(20cqw - var(--slide-index) * 60cqw));
}
@media (max-width: 1279.98px) {
  /* Auf schmalen Viewports kein Peek (sonst große Lücken): ein Bild voll, Navigation über Dots. */
  .cms-bildkarussell--peek .carousel-slide { flex-basis: 100%; transform: none; }
  .cms-bildkarussell--peek .carousel-slide.is-active { transform: none; }
  .cms-bildkarussell--peek .carousel-track { transform: translateX(calc(var(--slide-index) * -100cqw)); }
}

/* Header/Footer nutzen das Original-Markup + die main.css-Klassen (.nav-fixed-wrapper, .site-footer) — kein Extra-CSS nötig. */

/* ---- Bild / Figure ---------------------------------------------------------- */
/* Block-Bild im Inhaltsfluss bekommt Abstand zum umgebenden Text (Artikel-/KI-Bilder).
   In Rastern (.cms-grid) kein Extra-Abstand — dort regelt das Grid die Abstände. */
.cms-figure { margin: 2.5rem 0; }
.cms-figure img,
img.cms-img { max-width: 100%; height: auto; display: block; border-radius: var(--radius-sm); }
img.cms-img { margin: 2.5rem 0; }
.cms-figure img.cms-img { margin: 0; }                 /* in figure trägt die figure den Abstand */
.cms-grid img.cms-img, .cms-grid .cms-figure { margin: 0; }
.cms-figure figcaption { margin-top: .5rem; font-size: var(--font-size-sm); color: var(--color-primary-muted); }

/* ---- Bewertungen ohne Rating-Sidebar (Durchschnitt < 4) --------------------- */
/* main.css .bewertungen-grid ist 2-spaltig (1fr 22rem). Fehlt die Sidebar, soll das
   Karussell die volle Breite nutzen → einspaltig. */
.bewertungen-grid--no-sidebar { grid-template-columns: 1fr; }

/* ---- Bewertungen-Sonderlayout: KEIN Karussell (keine Firmen-/Teilnehmerstimmen) ----
   Statt der rechts „deplatzierten" Sidebar → EIN zusammenhängender Block (eine dunkle
   Teal-Karte aus main.css, volle Breite) mit 3 Spalten innen, durch dezente Trenner
   getrennt: Score/Sterne · erste 3 Kategorien · letzte 2 Kategorien.
   grid-auto-flow:column + auto-columns → so viele gleich breite Spalten wie Bereiche. */
#bewertungen .bewertung-stats-panel {
  margin-top: 2.5rem;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  gap: 2.5rem;
  align-items: stretch;
}
#bewertungen .bewertung-stats-panel > * {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
#bewertungen .bewertung-stats-panel > * + * {
  border-left: 1px solid color-mix(in srgb, var(--color-light), transparent 85%);
  padding-left: 2.5rem;
}
@media (max-width: 900px) {
  #bewertungen .bewertung-stats-panel {
    grid-auto-flow: row;
    grid-auto-columns: auto;
    gap: 1.5rem;
  }
  #bewertungen .bewertung-stats-panel > * + * {
    border-left: 0;
    padding-left: 0;
    border-top: 1px solid color-mix(in srgb, var(--color-light), transparent 85%);
    padding-top: 1.5rem;
  }
}

/* Rating-Sidebar: LEERE Sterne dimmen. main.css setzt .bewertung-rating-stars svg auf --color-icon
   (gelb) und dimmt nur .star-empty-DARK — Renderer::starSvgs() gibt aber .star-empty aus → leere Sterne
   blieben gelb (z.B. 4,0 sah aus wie 5 volle). Korrekte Klasse, gewinnt per Spezifität (0,2,0). */
.bewertung-rating-stars .star-empty { fill: color-mix(in srgb, var(--color-light), transparent 75%); }

/* Teilnehmerstimmen-Buttons: Außenabstand statt an die Kanten gedrückt. main.css nutzt
   justify-content: space-between (kein Außenraum → bei 2 Buttons in den Ecken). space-evenly
   verteilt gleichmäßig inkl. Außenseiten. Gleiche Spezifität (0,1,0) → gewinnt per Quell-Reihenfolge. */
.bewertung-voices { justify-content: space-evenly; }

/* Position/Funktion der Firmenstimme (z.B. „Pressesprecherin") als gedämpfte Unterzeile
   zwischen Name und Sternen. Nur bei Firmenstimmen gesetzt (Teilnehmerstimmen haben keine role). */
.bewertung-role {
  color: var(--color-primary-muted);
  font-size: var(--font-size-sm);
  line-height: 1.3;
  margin-top: 0.1rem;
}

/* Bewertungs-Zitat: Höhe begrenzen + scrollen bei sehr langem Text (Betreiberwunsch 2026-06-24).
   main.css gibt .bewertung-quote `flex:1` + `align-items:center` und KEINE max-height → ein langes
   Zitat (z.B. ausführliche Teilnehmerstimme) ließ die Karte beliebig hoch werden. Hier wird das
   Zitat auf --bewertung-quote-max gedeckelt und bekommt eine eigene Scrollleiste; die Karte bleibt
   nahe ihrer min-height (22rem). overflow-y:auto setzt zugleich die automatische Flex-Mindesthöhe
   auf 0 → die max-height greift trotz `flex:1`. `align-items: safe center` zentriert kurze Zitate
   weiter vertikal, schaltet aber bei Überlauf auf „start", damit der Anfang sichtbar/erreichbar
   bleibt (sonst würde zentrierter Überlauf oben abgeschnitten und nicht scrollbar). Gleiche
   Spezifität (0,1,0) wie main.css → gewinnt per Quell-Reihenfolge. */
.bewertung-quote {
  --bewertung-quote-max: 14rem;
  max-height: var(--bewertung-quote-max);
  overflow-y: auto;
  align-items: safe center;
  scrollbar-width: thin;
  overscroll-behavior: contain;
}

/* ── Karte (Maps-Block) ───────────────────────────────────────────────────
   Visueller Teil = der bestehende Consent-Platzhalter .ifm-embed (main.css);
   hier nur Block-Rahmen, „Route planen"-Button und optionale feste Höhe. */
.cms-maps { display: block; }
.cms-maps-actions { display: flex; gap: 0.6rem; flex-wrap: wrap; justify-content: center; margin-top: 0.25rem; }
.cms-maps-dir { margin-top: 0.9rem; display: inline-flex; align-items: center; gap: 0.4rem; }
.cms-maps-dir-ico { width: 1.1em; height: 1.1em; fill: currentColor; }
/* Feste Höhe (attrs.height) statt 16:9 — Variable kommt per Inline-Style am Wrapper. */
.cms-maps--fixed .ifm-embed { min-height: var(--maps-h); }
.cms-maps--fixed .ifm-embed iframe { aspect-ratio: auto; height: var(--maps-h); }

/* ══════════════════════════════════════════════════════════════════════════
   Mega-Suche (Block KursSuche) — Suchleiste oben, Filter links, Ergebnisse rechts.
   Reuse: bestehendes .form-field-Input-System (main.css) + .folgekurse-grid/.card/.kurs-card-*
   + .cta-main/.cta-secondary. Live-Filterung ohne Button (main.js JS Block 19).
   ══════════════════════════════════════════════════════════════════════════ */
.cms-kurssuche { display: block; }
.cms-kurssuche .ks-intro { margin: 0 0 1.5rem; max-width: 60rem; }
.cms-kurssuche .ks-form { margin: 0; }

/* Filter-Controls reuse das .form-field-System; der „fertig"-Haken-Dot ergibt bei Filtern
   keinen Sinn → unterdrücken. (Sucheingabe ist type=search → main.css blendet ihn ohnehin aus.) */
.cms-kurssuche .form-field-control::after { display: none !important; }
.cms-kurssuche .ks-field { margin: 0; }
.cms-kurssuche .ks-field .form-field-label { font-size: var(--font-size-sm); margin-bottom: 0.3rem; }
.cms-kurssuche .form-field-control select { cursor: pointer; padding-right: 1.9rem; }
/* Hintergrund WEISS NUR für das Sucheingabe-Feld (Betreiberwunsch 2026-06-17) — es liegt auf der
   cremefarbenen Seite und soll sich klar abheben. Die Filter-Felder bleiben cremefarben (Standard). */
.cms-kurssuche .ks-searchfield .form-field-control { background: var(--color-light-contrast); }

/* ── Ausblend-Optionen (Block-Attribute showSearch/showSort/showCount) ── */
/* Elemente bleiben für main.js im DOM, werden nur per Wurzel-Klasse ausgeblendet. Suchleiste verbergen
   blendet auch den KI-Berater-Button (liegt darin) + die leere Topbar mit aus. */
.cms-kurssuche.ks-hide-search .ks-searchbar { display: none; }
.cms-kurssuche.ks-hide-sort .ks-sort { display: none; }
.cms-kurssuche.ks-hide-count .ks-count { display: none; }
/* Sind Sortierung UND Trefferanzahl aus, fällt die ganze Toolbar-Zeile weg. */
.cms-kurssuche.ks-hide-sort.ks-hide-count .ks-toolbar { display: none; }
/* Pagination unten verbergen (bleibt für main.js im DOM, JS baut sie weiter — nur CSS-versteckt). */
.cms-kurssuche.ks-hide-pagination .ks-pagination { display: none; }

/* ── Suchleiste oben (volle Breite) ── */
.ks-searchbar { margin-bottom: 1.5rem; }
.ks-searchfield { position: relative; }
.ks-searchfield .form-field { width: 100%; }
.ks-searchfield .form-field-input { font-size: var(--font-size-lg); }
/* „x"-Leeren-Button: das hidden-Attribut allein reicht nicht (`.form-field-icon-btn{display:inline-flex}`
   überschreibt die UA-Regel `[hidden]{display:none}`) → explizit ausblenden, wenn das Feld leer ist. */
.ks-q-clear[hidden] { display: none; }

/* Autovervollständigung */
.ks-suggest {
  position: absolute; left: 0; right: 0; top: calc(100% + 0.25rem); z-index: 40;
  list-style: none; margin: 0; padding: 0.3rem;
  background: var(--color-light-contrast); border-radius: var(--radius-sm);
  box-shadow: 0 8px 28px color-mix(in srgb, var(--color-primary) 22%, transparent);
  max-height: 18rem; overflow-y: auto;
}
.ks-suggest[hidden] { display: none; }
.ks-suggest-item { padding: 0.5rem 0.7rem; border-radius: var(--radius-sm); cursor: pointer; font-size: var(--font-size-md); }
.ks-suggest-item:hover, .ks-suggest-item.is-active { background: color-mix(in srgb, var(--color-primary) 10%, transparent); }

/* ── 2-Spalten-Layout: Filter links, Suchleiste + Ergebnisse rechts ── */
/* grid-template-rows: auto 1fr ist WICHTIG (Fix 2026-06-23): die Filter-Sidebar spannt beide Zeilen
   (grid-row:1/span 2). Wären beide Zeilen „auto", verteilt der Grid-Algorithmus die Überhöhe der hohen
   Sidebar bei wenigen/EINEM Treffer auf BEIDE Zeilen → Zeile 1 (Topbar/Suchleiste) wird aufgebläht und
   das einzelne Ergebnis rutscht in die Mitte. Mit der flexiblen 1fr-Zeile 2 absorbiert NUR diese den
   Sidebar-Überstand (ein über eine flexible Spur spannendes Element wächst nur die flexible Spur) →
   die Suchleiste bleibt knapp, das Ergebnis sitzt direkt darunter, egal wie viele Treffer. */
.ks-layout { display: grid; grid-template-columns: minmax(0, 20rem) minmax(0, 1fr); grid-template-rows: auto 1fr; column-gap: 2rem; row-gap: 0; align-items: start; }
/* Topbar (Suchleiste + KI-Berater) = rechte Spalte, Zeile 1; Filter-Sidebar links über beide Zeilen;
   Ergebnisse (ks-main) darunter rechts (Zeile 2). So beginnt die Suchleiste linksbündig zu den Ergebnissen,
   und der Filter kann auf Mobil ZWISCHEN Suchleiste und Ergebnisse rutschen (s. Media-Query ≤900px).
   Der Abstand Suchleiste→Ergebnisse kommt aus .ks-searchbar { margin-bottom } (row-gap: 0). */
.ks-layout > .ks-topbar  { grid-column: 2; grid-row: 1; }
.ks-layout > .ks-sidebar { grid-column: 1; grid-row: 1 / span 2; }
.ks-layout > .ks-main    { grid-column: 2; grid-row: 2; }
/* Filterlose Variante (Einfüge-Option „Filter-Sidebar anzeigen" = aus): einspaltig, Suchleiste über den Karten. */
.ks-layout.ks-layout--nofilter { display: block; }
/* Mobil-Filter-Umschalter (CSS-Checkbox-Hack): auf Desktop unsichtbar, nur ≤900px aktiv. Die Checkbox bleibt
   fokussierbar (kein display:none) und trägt KEIN name → nicht in der Suche/FormData. */
.ks-filter-cb { position: absolute; width: 1px; height: 1px; margin: -1px; opacity: 0; pointer-events: none; }
.ks-filter-toggle { display: none; align-items: center; gap: 0.55rem; width: 100%; padding: 0.7rem 1rem; cursor: pointer;
  border: 1px solid color-mix(in srgb, var(--color-primary) 22%, transparent); border-radius: var(--radius-sm);
  background: var(--color-light-contrast); color: var(--color-primary); font-weight: 600; font-size: var(--font-size-md); user-select: none; }
.ks-filter-toggle:hover { border-color: var(--color-primary); }
.ks-filter-toggle > svg { width: 1.15rem; height: 1.15rem; fill: currentColor; flex-shrink: 0; }
.ks-filter-toggle .ks-filter-chev { margin-left: auto; transition: transform 0.2s ease; transform: rotate(90deg); }
.ks-filter-cb:checked ~ .ks-filter-toggle .ks-filter-chev { transform: rotate(-90deg); }
.ks-filter-cb:focus-visible ~ .ks-filter-toggle { outline: 2px solid var(--color-primary); outline-offset: 2px; }
/* Filter-Sidebar = Notch-Karte (Notch links oben, Filter-Icon im Dot). NICHT sticky (2026-06-17,
   Betreiberwunsch): ein langer Filter (viele Felder) war sticky-fixiert höher als der Viewport →
   sein unteres Ende war erst nach dem Durchscrollen ALLER Ergebnisse erreichbar. Als normale Spalte
   (position:relative, am Spaltenanfang via align-items:start) ist der ganze Filter direkt oben sicht-
   und scrollbar. Internes Overflow-Scrollen wäre die Alternative gewesen, würde aber die Filter-
   Comboboxen + den Zeitraum-Popover abschneiden. position:relative dient zugleich als Notch-Anker
   (überschreibt .has-notch{position:relative} nur explizit). --has-notch-padding* = Innenabstand + Notch-Freiraum. */
.ks-sidebar { display: flex; flex-direction: column; gap: 1.25rem; position: relative; --has-notch-padding: 1.1rem; --has-notch-padding-top: calc(var(--notch-size) + 0.85rem); }
/* „Filter"-Beschriftung IM Dot der Notch (Icon + Text): der Dot wächst dank Design-System-Styling
   (padding 0 0.9rem, white-space:nowrap) zur Pille; gap trennt Icon und Text. */
.ks-sidebar .ks-filter-dot { gap: 0.4rem; }
.ks-main { min-width: 0; }
.ks-filters { display: flex; flex-direction: column; gap: 1.1rem; }
.ks-fieldset { margin: 0; padding: 0; border: 0; min-width: 0; }
.ks-legend { display: block; font-weight: 600; font-size: var(--font-size-sm); color: var(--color-primary); padding: 0; margin-bottom: 0.4rem; }
/* Zentrierter Sidebar-Footer: „Alle Filter zurücksetzen" (Secondary-Button) + „Allgemeine Seiten
   durchsuchen" (Akzent-Link) untereinander, beide mittig. */
.ks-sidebar-foot { display: flex; flex-direction: column; align-items: center; gap: 0.7rem; margin-top: 0.4rem; text-align: center; }
.ks-sidebar-foot .ks-reset-btn { cursor: pointer; }
.ks-apply { border: 0; cursor: pointer; width: 100%; }
/* „Allgemeine Seiten durchsuchen" — Akzent-Link (statt der früheren Checkbox) am Ende der Sidebar.
   Klick → ?seiten=1 (Seiten-Modus: ohne Filter/KI). */
.ks-pages-link { display: inline-block; font-size: var(--font-size-sm); color: var(--color-accent); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
.ks-pages-link:hover, .ks-pages-link:focus-visible { text-decoration-thickness: 2px; }
/* Seiten-Modus: Ein-Spalten-Layout (keine Filter-Sidebar) + Rücklink zur Kurssuche. ks-main hat hier KEINE
   Topbar daneben → die 2-Spalten-Platzierung (grid-column:2/row:2) zurücksetzen, sonst landet es in einer
   impliziten zweiten Spalte. */
.ks-layout--pages { grid-template-columns: 1fr; }
.ks-layout.ks-layout--pages > .ks-main { grid-column: 1; grid-row: auto; }
.ks-pages-bar { margin-bottom: 1rem; }
.ks-pages-back { font-size: var(--font-size-sm); color: var(--color-primary); text-decoration: none; font-weight: 600; }
.ks-pages-back:hover, .ks-pages-back:focus-visible { text-decoration: underline; }
.ks-pagehits--only { margin-top: 1.25rem; }

/* Pills (Typ/Abschluss/Förder-Programme) */
.ks-pills { display: flex; flex-wrap: wrap; gap: 0.45rem; }
.ks-pill {
  display: inline-flex; align-items: center; gap: 0.4rem;
  border: 1px solid var(--form-field-border);
  border-radius: 999px; padding: 0.3rem 0.7rem;
  background: var(--color-light); cursor: pointer;
  font-size: var(--font-size-sm); line-height: 1.2;
  transition: border-color .12s, background .12s;
}
.ks-pill:hover { border-color: var(--form-field-border-hover); }
.ks-pill input { accent-color: var(--color-primary); margin: 0; }
.ks-pill.is-on { border-color: var(--color-primary); background: color-mix(in srgb, var(--color-primary) 8%, var(--color-light)); font-weight: 600; }
.ks-pill input:disabled { cursor: not-allowed; }

/* Preis-Range */
.ks-field--preis .ks-range { width: 100%; accent-color: var(--color-primary); margin-top: 0.3rem; }
.ks-field--preis [data-ks-price-out] { font-weight: 600; }
/* Min/Max-Skala UNTER dem Schieberegler, IN der Feld-Box: links „0 €", MITTIG „max. Kurskosten"
   (zwischen den beiden Preisen zentriert), rechts der aktuelle Höchstwert (statt „egal"). 3-Spalten-
   Grid (1fr auto 1fr) → die Mitte ist box-zentriert, unabhängig von den Seitenbreiten. */
.ks-field--preis .ks-price-scale { display: grid; grid-template-columns: 1fr auto 1fr; align-items: baseline; gap: 0.5rem; margin-top: 0.45rem; font-size: var(--font-size-sm); color: var(--color-primary); }
.ks-field--preis .ks-price-min { text-align: left; }
.ks-field--preis .ks-price-cap { text-align: center; color: var(--color-primary-muted); }
.ks-field--preis .ks-price-max { text-align: right; }

/* ── FÖRDERUNG — eine „100 % gefördert"-Checkbox + Hinweis mit Info-Icon ──
   (Checkbox/Hinweis tight gruppieren; Hinweis sitzt knapp unter der Karte wie ein FormField-Helper.
   Der Link liegt IM Tooltip des Info-Icons — s. .ifmera-tooltip-inner a unten.) */
.cms-kurssuche .ks-foerder-field { display: flex; flex-direction: column; gap: 0.1rem; }
.cms-kurssuche .ks-foerder-hint { margin-top: 0; }
/* Die beiden Förder-Checkbox-Labels („100 % gefördert" / „ohne Förderung") fett (Betreiberwunsch). */
.cms-kurssuche .ks-foerder-field .form-field-check-label { font-weight: 700; }
/* Klickbarer Link im Tooltip (dunkler Teal-Hintergrund → heller, unterstrichener Link; das Tooltip-
   System macht den Tooltip bei <a>-Inhalt automatisch interaktiv = anfahr-/klickbar). */
.ifmera-tooltip-inner a { color: var(--color-light); text-decoration: underline; text-underline-offset: 2px; font-weight: 600; }
.ifmera-tooltip-inner a:hover, .ifmera-tooltip-inner a:focus-visible { color: var(--color-icon); }

/* ── Zeitraum-Feld (FormField ftype=daterange) — EIN Feld: Trigger + Popover mit Schnellauswahl
   (Diese Woche/Monat/Jahr …) + Von/Bis-Datumspicker. Generisch (überall im .form-field-System),
   Popover/Presets/Label per main.js initDateRange. Nur von ODER nur bis möglich; mobil-tauglich. ── */
.form-field--daterange .form-field-daterange-trigger { text-align: left; cursor: pointer; }
.form-field--daterange .form-field-control::after { display: none; } /* kein „fertig"-Haken-Dot am Button */
.form-field--daterange:not(.is-set) .form-field-daterange-value { color: var(--form-field-placeholder); }
.form-field-daterange-pop {
  position: absolute; z-index: 60; left: 0; top: calc(100% + 0.4rem);
  width: max-content; min-width: 100%; max-width: min(22rem, calc(100vw - 1.5rem));
  background: var(--color-light-contrast); border: 1px solid var(--form-field-border);
  border-radius: var(--radius-md); padding: 0.75rem;
  box-shadow: 0 12px 30px color-mix(in srgb, var(--color-primary) 22%, transparent);
  display: flex; flex-direction: column; gap: 0.7rem;
}
.form-field-daterange-pop[hidden] { display: none; }
.form-field-daterange-presets { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.form-field-daterange-preset {
  border: 1px solid var(--form-field-border); background: var(--color-light);
  border-radius: 999px; padding: 0.3rem 0.7rem; font: inherit; font-size: var(--font-size-sm);
  line-height: 1.2; cursor: pointer; color: var(--form-field-text);
  transition: border-color .12s, background .12s;
}
.form-field-daterange-preset:hover { border-color: var(--form-field-border-hover); }
.form-field-daterange-preset.is-active { border-color: var(--color-primary); background: color-mix(in srgb, var(--color-primary) 8%, var(--color-light)); font-weight: 600; }
.form-field-daterange-inputs { display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; }
.form-field-daterange-in { display: flex; flex-direction: column; gap: 0.25rem; font-size: var(--font-size-sm); font-weight: 600; color: var(--color-primary); }
.form-field-daterange-in input { width: 100%; border: 1px solid var(--form-field-border); border-radius: var(--radius-sm); background: var(--color-light); color: var(--form-field-text); padding: 0.4rem 0.5rem; font: inherit; font-weight: 400; accent-color: var(--color-primary); color-scheme: light; cursor: pointer; }
/* Kalender-Icon des nativen Datumsfeldes klar als Klickziel (öffnet den Kalender) */
.form-field-daterange-in input::-webkit-calendar-picker-indicator { cursor: pointer; opacity: 0.9; }
.form-field-daterange-in input:hover { border-color: var(--form-field-border-hover); }
.form-field-daterange-actions { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }
.form-field-daterange-clear { background: none; border: 0; padding: 0.2rem; color: var(--color-primary-muted); text-decoration: underline; cursor: pointer; font: inherit; font-size: var(--font-size-sm); }
.form-field-daterange-apply { border: 0; border-radius: var(--radius-sm); background: var(--color-primary); color: var(--color-light); padding: 0.4rem 0.9rem; cursor: pointer; font: inherit; font-weight: 600; font-size: var(--font-size-sm); }
/* Editor-Canvas-Variante: schlichte Von/Bis-Felder nebeneinander (kein JS-Popover im Canvas). */
.form-field-daterange-static { display: flex; align-items: center; gap: 0.4rem; width: 100%; }
.form-field-daterange-static .form-field-input { flex: 1 1 0; min-width: 0; }
.form-field-daterange-sep { color: var(--color-primary-muted); flex: 0 0 auto; }
@media (max-width: 480px) { .form-field-daterange-inputs { grid-template-columns: 1fr; } }

/* ── Toolbar (Trefferzahl + Sortierung) ── */
.ks-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem; margin-bottom: 1.25rem; }
.ks-count { font-weight: 700; font-size: var(--font-size-lg); }
/* Sortierung = echte FormField-Combobox (wie die Filter). Label LINKS neben dem Feld (inline). */
.ks-sort { flex-direction: row; align-items: center; gap: 0.5rem; width: auto; max-width: 100%; }
.ks-sort .form-field-label { margin: 0; flex: 0 0 auto; white-space: nowrap; font-size: var(--font-size-sm); }
.ks-sort .form-field-combobox { width: 12rem; }
/* „Fertig"-Haken-Dot NUR bei der Sortierung ausblenden (sie hat immer einen Wert → Dot wäre sinnlos);
   die übrigen Filter-Comboboxen behalten ihn. Ohne Dot das is-filled-Extrapadding wieder zurücknehmen. */
.ks-sort .form-field-combobox::after { display: none; }
.ks-sort .form-field-combobox.is-filled .form-field-combobox-trigger { padding-right: var(--form-field-padding-x); }
/* Ausnahme NUR fürs Sortier-Feld: der sonst nur bei :hover sichtbare Box-Shadow-Ring liegt hier
   DAUERHAFT an, aber in Light/Weiß statt Teal → das Feld hebt sich ohne Hover ab. Hover/Fokus/offen
   behalten ihren Teal-Ring (höher-spezifisch re-asserted). */
.cms-kurssuche .ks-sort .form-field-combobox-trigger { box-shadow: 0 0 0 2px var(--color-light-contrast); }
.cms-kurssuche .ks-sort .form-field-combobox-trigger:hover { box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 35%, transparent); }
.cms-kurssuche .ks-sort .form-field-combobox-trigger[aria-expanded="true"],
.cms-kurssuche .ks-sort .form-field-combobox-trigger:focus-visible { box-shadow: 0 0 0 2px var(--color-primary); }

/* ── Ergebnisraster: EINE Karte pro Zeile (Betreiberwunsch) ── */
.cms-kurssuche .ks-grid { grid-template-columns: 1fr; margin-top: 0; }
/* Einfüge-Option „Karten je Zeile = 2": zweispaltiges Raster. Im schmalen Slot kein Platz fürs Seiten-Bild
   → Karten-Bild ausblenden + has-notch-Innenabstand zurücksetzen (wie bei den schmalen Karten, s. ≤1280-Regel). */
.cms-kurssuche .ks-grid--cols2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.25rem; }
.cms-kurssuche .ks-grid--cols2 .card-visual { display: none; }
.cms-kurssuche .ks-grid--cols2 .card.has-notch:has(> .card-visual) { padding-left: var(--padding); max-width: none; margin-left: 0; margin-right: 0; }
@media (max-width: 700px) { .cms-kurssuche .ks-grid--cols2 { grid-template-columns: 1fr; } }
.cms-kurssuche .ks-results { position: relative; min-height: 8rem; }
.cms-kurssuche .ks-results[aria-busy="true"] { opacity: .55; transition: opacity .15s; }

/* Karte: Merken-Button + Förder-Badge + Typ-Badge (nur Suchergebnisse) */
.cms-kurssuche .card { position: relative; }
/* Hover-Lift OHNE Verzögerung: die Basis-.card hat eine 0.4s-Verzögerung (transition … 0.4s) → wirkt träge.
   Wie beim Original (#folgekurse) sofort animieren. Spezifität .ks-grid .card (0,2,0) schlägt .card (0,1,0). */
.ks-grid .card { transition: box-shadow 0.35s ease, transform 0.35s ease; }
.ks-grid .kurs-card-merk {
  position: absolute; top: 1.3rem; right: 0.7rem; z-index: 6;
  width: 2.2rem; height: 2.2rem; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--color-light) 90%, transparent);
  border: 1px solid color-mix(in srgb, var(--color-primary) 18%, transparent);
  cursor: pointer; padding: 0; color: var(--color-primary);
}
.ks-grid .kurs-card-merk svg { width: 1.15rem; height: 1.15rem; fill: currentColor; }
.ks-grid .kurs-card-merk:hover { background: var(--color-light); }
.ks-grid .kurs-card-merk.is-merkt { color: var(--color-accent); background: var(--color-light); }
/* Top-Badge-Reihe rechts Platz für den absoluten Merken-Button (top/right 0.7rem, 2.2rem breit) reservieren,
   sonst liegen die rechtsbündigen Sterne (.kurs-card-rating, margin-left:auto) unter dem Herz-Button. */
.ks-grid .kurs-card-level-group { padding-right: 2.2rem; }
/* Förder- + Typ-Badge teilen Größe/Schriftgröße mit dem Einstufungs-Badge (.kurs-card-level) daneben */
.ks-grid .kurs-card-foerder {
  display: inline-flex; align-items: center; gap: 0.4rem;
  background: var(--color-accent); color: var(--color-on-accent);
  font-size: var(--font-size-sm); font-weight: 700; line-height: 1.1;
  padding: 0.4rem 0.9rem; border-radius: var(--radius-sm);
}
.ks-grid .kurs-card-foerder svg { width: 0.95em; height: 0.95em; fill: var(--color-on-accent); }
/* Typ-Badge IMMER hell + Primärfarbe (Betreiberwunsch 2026-06-17) — kein typ-spezifischer Farbcode mehr */
.ks-grid .kurs-card-type {
  display: inline-flex; align-items: center; border-radius: var(--radius-sm);
  padding: 0.4rem 0.9rem; font-size: var(--font-size-sm); font-weight: 700; line-height: 1.1;
  background: var(--color-light); color: var(--color-primary);
}
.ks-grid .kurs-card-price { font-weight: 600; }
/* Kategorie-Link über den ganzflächigen .kurs-card-link-Overlay (z-index:4) heben → klickbar (wie #folgekurse) */
.ks-grid .kurs-card-category { position: relative; z-index: 5; }

/* ── Leerzustand / Pagination / Seiten-Treffer / Editor-Hinweis ── */
.ks-empty { text-align: center; padding: 2.5rem 1rem; }
.ks-empty-title { font-weight: 700; font-size: var(--font-size-lg); margin: 0 0 0.4rem; }
.ks-empty-hint { color: var(--color-primary-muted); margin: 0 0 1.2rem; }
.ks-pagination { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 0.5rem 0.75rem; margin-top: 2rem; }
.ks-page { text-decoration: none; } /* .ks-page-prev/-next nutzen zusätzlich .cta-secondary */
.ks-pages { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; }
.ks-page-num {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 2.25rem; height: 2.25rem; padding: 0 0.5rem; box-sizing: border-box;
  border-radius: var(--radius-sm); text-decoration: none; font-weight: 600;
  color: var(--color-primary); border: 1px solid var(--form-field-border);
  /* Pagination ist jetzt <button> (nicht crawlbar, SEO 2026-06-27) → UA-Button-Optik zurücksetzen. */
  background: transparent; font-family: inherit; font-size: inherit; cursor: pointer;
  transition: background 0.15s, border-color 0.15s, color 0.15s;
}
button.ks-page-num:hover, button.ks-page-num:focus-visible { border-color: var(--color-primary); background: color-mix(in srgb, var(--color-primary) 8%, transparent); }
.ks-page-num.is-current { background: var(--color-primary); border-color: var(--color-primary); color: var(--color-light); cursor: default; }
.ks-page-ellipsis { display: inline-flex; align-items: center; padding: 0 0.15rem; color: var(--color-primary-muted); }
.ks-pagehits { margin-top: 2.5rem; }
.ks-pagehits-head { font-size: var(--font-size-lg); margin: 0 0 0.8rem; }
/* Trefferzahl in der „Allgemeine Seiten"-Ansicht (eigenständig, nicht in der .ks-toolbar). */
.ks-pagecount { margin: 0 0 1.1rem; }
.ks-pagehit-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 1.1rem; }
/* Titel = `.link` (Akzentfarbe + Hover-Animation aus main.css); inline-block → Unterstrich spannt nur den Text. */
.ks-pagehit-title { display: inline-block; font-weight: 600; font-size: var(--font-size-lg); }
.ks-pagehit-snip { display: block; color: var(--color-primary-muted); font-size: var(--font-size-sm); margin-top: 0.25rem; }
.ks-editor-note { padding: 1.5rem; text-align: center; color: var(--color-primary-muted); border: 1px dashed var(--form-field-border); border-radius: var(--radius-md); }

/* ── KI-Suche: Button + Hinweis ── */
.ks-searchbar { display: flex; gap: 0.6rem; align-items: stretch; }
.ks-searchbar .ks-searchfield { flex: 1 1 auto; }
.ks-ai-btn {
  flex: 0 0 auto; display: inline-flex; align-items: center; gap: 0.4rem;
  background: var(--color-primary); color: var(--color-light); border: 0; cursor: pointer;
  border-radius: var(--form-field-radius); padding: 0 1.1rem; font: inherit; font-weight: 600; white-space: nowrap;
}
.ks-ai-btn:hover { background: color-mix(in srgb, var(--color-primary) 88%, #000); }
.ks-ai-btn.is-loading { opacity: .6; cursor: progress; }
/* Sparkles-Icon (sprite.svg) in der Icon-Farbe (Lime) auf dem Teal-Button — ersetzt das frühere ✨-Emoji. */
.ks-ai-icon { width: 1.15em; height: 1.15em; fill: var(--color-icon); flex: 0 0 auto; }
/* ── KI-Berater-Chat (dockt INLINE unter der Suchleiste an — nicht mehr schwebend) ── */
.ks-chat {
  display: flex; flex-direction: column; margin: 0 0 1.5rem;
  max-height: min(32rem, 70vh); overflow: hidden;
  background: var(--color-light-contrast); border: 1px solid var(--form-field-border);
  border-radius: var(--radius-md);
  box-shadow: 0 8px 28px color-mix(in srgb, var(--color-primary) 14%, transparent);
}
.ks-chat[hidden] { display: none; }
.ks-chat-head { display: flex; align-items: center; justify-content: space-between; padding: 0.8rem 1rem; background: var(--color-primary); color: var(--color-light); font-weight: 700; }
.ks-chat-head > span { display: inline-flex; align-items: center; gap: 0.4rem; }
.ks-chat-close { background: none; border: 0; color: inherit; cursor: pointer; font-size: 1.1rem; line-height: 1; }
.ks-chat-log { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 0.9rem; display: flex; flex-direction: column; gap: 0.6rem; }
.ks-chat-msg { max-width: 85%; padding: 0.55rem 0.8rem; border-radius: var(--radius-md); font-size: var(--font-size-sm); line-height: 1.45; }
.ks-chat-msg--user { align-self: flex-end; background: var(--color-primary); color: var(--color-light); border-bottom-right-radius: 0.2rem; }
.ks-chat-msg--bot { align-self: flex-start; background: color-mix(in srgb, var(--color-primary) 8%, var(--color-light)); border-bottom-left-radius: 0.2rem; }
.ks-chat-courses { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.6rem; }
.ks-chat-course { display: flex; flex-direction: column; gap: 0.15rem; padding: 0.5rem 0.7rem; text-decoration: none;
  background: var(--color-light); border: 1px solid var(--form-field-border); border-radius: var(--radius-sm);
  transition: border-color .15s ease, box-shadow .15s ease; }
.ks-chat-course:hover { border-color: var(--color-primary); box-shadow: 0 2px 10px color-mix(in srgb, var(--color-primary) 12%, transparent); }
.ks-chat-course-name { font-weight: 700; color: var(--color-primary); line-height: 1.3; }
.ks-chat-course-meta { font-size: 0.78rem; color: color-mix(in srgb, var(--color-primary) 65%, transparent); }
/* Aufzählungen in der KI-Antwort (z.B. Terminlisten) */
.ks-chat-ul { margin: 0.2rem 0 0.35rem; padding-left: 1.1rem; list-style: disc; }
.ks-chat-ul li { margin: 0.1rem 0; }
.ks-chat-p { margin: 0 0 0.5rem; }
.ks-chat-p:last-child { margin-bottom: 0; }
/* Seminar-Block in einer Mehrfach-Empfehlung: fetter Name als Kopf + Trennlinie → jeder Kurs klar abgegrenzt */
.ks-chat-seminar { margin: 0.75rem 0 0.2rem; padding-top: 0.6rem; border-top: 1px solid color-mix(in srgb, var(--color-primary) 18%, transparent); }
.ks-chat-seminar:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.ks-chat-seminar strong { color: var(--color-primary); }
/* Vorschlags-Chips in der Begrüßung (Conversation-Starter) */
.ks-chat-starters { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.6rem; }
.ks-chat-starter { font: inherit; font-size: 0.8rem; cursor: pointer; padding: 0.35rem 0.7rem;
  background: var(--color-light); color: var(--color-primary); border: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
  border-radius: 999px; line-height: 1.2; transition: background .15s ease, border-color .15s ease; }
.ks-chat-starter:hover { background: color-mix(in srgb, var(--color-primary) 10%, var(--color-light)); border-color: var(--color-primary); }
.ks-chat-form { display: flex; gap: 0.4rem; padding: 0.7rem; border-top: 1px solid var(--form-field-border); }
.ks-chat-form[hidden] { display: none; } /* sonst überschreibt display:flex die UA-[hidden]-Regel (Datenschutz-Gate) */
.ks-chat-input { flex: 1 1 auto; min-width: 0; border: 1px solid var(--form-field-border); border-radius: var(--radius-sm); padding: 0.5rem 0.7rem; font: inherit; }
.ks-chat-send { background: var(--color-primary); color: var(--color-light); border: 0; border-radius: var(--radius-sm); padding: 0.5rem 0.9rem; cursor: pointer; font: inherit; font-weight: 600; }
/* Fußzeile: KI-Offenlegung + Mensch-Handoff */
.ks-chat-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.4rem 0.8rem;
  padding: 0.4rem 0.9rem 0.6rem; font-size: 0.72rem; }
.ks-chat-ai-note { color: color-mix(in srgb, var(--color-primary) 55%, transparent); }
.ks-chat-handoff { font-weight: 600; color: var(--color-primary); text-decoration: none; white-space: nowrap; }
.ks-chat-handoff:hover { text-decoration: underline; }
/* Datenschutz-Gate: erscheint im Chat-Log statt des Beraters, bis „KI-Beratung" eingewilligt ist. */
.ks-chat-gate { display: flex; flex-direction: column; align-items: flex-start; gap: 0.7rem; padding: 0.4rem 0.2rem; }
.ks-chat-gate[hidden] { display: none; }
.ks-chat-gate-text { margin: 0; font-size: var(--font-size-sm); line-height: 1.5; }
.ks-chat-gate-text strong { color: var(--color-primary); }
.ks-chat-gate-btn { align-self: center; }
.ks-chat-gate-hint { margin: 0; font-size: 0.74rem; line-height: 1.45; color: color-mix(in srgb, var(--color-primary) 60%, transparent); }

/* ≤1279.98px: in der Suche fehlt den Ergebniskarten der Platz fürs Bild (Filter-Sidebar + schmale
   Inhaltsspalte) → Card-Visual ausblenden, Inhalt nutzt die volle Kartenbreite. Spiegelt die globale
   ≤650-Regel (main.css), nur hier früher (am 1280-Umbruch) und NUR für die Suchkarten (.ks-grid).
   Grenze == globale :has(>.card-visual)-Regel (1279.98px), damit beide exakt deckungsgleich greifen.
   Die globale Regel deckelt Bild-Karten ≤1279.98px auf max-width:48rem + zentriert sie (fürs
   Folgekurse-/Empfehlungen-Grid gedacht). Eine Suchkarte matcht :has(>.card-visual) auch bei
   display:none weiter → ohne Neutralisierung bliebe sie auf 768px zentriert = schmaler als die
   bildlosen Karten. Daher max-width/margin hier zurücksetzen (Spezifität .ks-grid … (0,4,0) > (0,3,0)). */
@media (max-width: 1279.98px) {
  .ks-grid .card-visual { display: none; }
  .ks-grid .card.has-notch:has(> .card-visual) { padding-left: var(--padding); max-width: none; margin-left: 0; margin-right: 0; }
}
@media (max-width: 900px) {
  /* Einspaltig als Flex: die DOM-Reihenfolge (Topbar → Umschalter → Sidebar → Ergebnisse) ergibt direkt die
     gewünschte Stapelung — Suchleiste oben, Filter (eingeklappt) darunter, dann die Karten (Betreiberwunsch 2026-06-17). */
  .ks-layout { display: flex; flex-direction: column; gap: 1rem; }
  .ks-filter-toggle { display: flex; }
  /* Filter standardmäßig EINGEKLAPPT; der Umschalter (CSS-Checkbox) klappt ihn aus. */
  .ks-layout > .ks-sidebar { display: none; }
  .ks-filter-cb:checked ~ .ks-sidebar { display: flex; }
  /* nicht mehr sticky auf Mobil, aber relative (nicht static) → Notch bleibt am Sidebar verankert */
  .ks-sidebar { position: relative; top: auto; }
}
@media (max-width: 650px) {
  /* Suchkarten ≤650 (Betreiberwunsch 2026-06-17): das Merken-Herz wird ausgeblendet (stört auf den
     schmalen Karten); die Platz-Reservierung der Badge-Reihe entfällt damit. Die Sterne rücken in eine
     eigene Zeile unter die Badges (flex-basis:100%). Da das Sterne-Element NUR bei vorhandener Bewertung
     gerendert wird (Renderer), entsteht ohne Sterne kein Element → KEINE leere Zeile. */
  .ks-grid .kurs-card-merk { display: none; }
  .ks-grid .kurs-card-level-group { padding-right: 0; }
  .ks-grid .kurs-card-level-group .kurs-card-rating { flex-basis: 100%; margin-left: 0; }
}
@media (max-width: 640px) {
  .ks-toolbar { justify-content: flex-start; }
  .ks-searchbar { flex-wrap: wrap; }
  .ks-ai-btn { flex: 1 1 100%; justify-content: center; padding: 0.6rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cms-kurssuche .ks-results { transition: none; }
}

/* ---- Wissenswelten-Mega-Menue: Kategorie-Icon (ersetzt den .mega-thema-dot) ----
   Statt des kleinen Punkts zeigt jede Wissenswelten-Kachel ein Sprite-Icon
   `icon-cat-<permalink>` (bzw. das in den Einstellungen gewaehlte Standard-Icon
   `wissenswelten_default_icon`; siehe Blocks\Header). Das Icon folgt der Textfarbe der
   Kachel (teal → weiss bei Hover) statt der Akzentfarbe — auf der hellen Kachel besser
   lesbar als ein lime Icon, und es spiegelt die vorhandene Hover-Transition des Tile-Texts.
   .mega-thema-dot bleibt in main.css fuer den Fallback (kein Icon gewaehlt). Liegt in
   cms-blocks.css, damit ein 1:1-Asset-Resync von main.css aus test\design die Regel nicht entfernt. */
.mega-thema-tile .mega-thema-icon {
  width: 1.15rem;
  height: 1.15rem;
  flex-shrink: 0;
  color: var(--color-primary);
  fill: currentColor;
}
.mega-thema-tile .mega-thema-icon * { fill: currentColor; }
.mega-thema-tile:hover .mega-thema-icon { color: var(--color-light); }

/* =============================================================================
   Hero als Container: frei eingefügte Blöcke (Blocks\Hero ist container) erscheinen
   in der Hero-Card unter Titel/Badge. Auf dem teal Card-Grund hell + Float (Notch-
   Guard) freigeben. Block-eigene Farben (Heading=Akzent, Button) bleiben unberührt.
   ========================================================================== */
.hero-card-extra { margin-top: 1.5rem; clear: both; color: var(--color-light); }
.hero-card-extra > :first-child { margin-top: 0; }

/* Responsive Schrift für in die Hero-Card eingefügte Blöcke (Text/Untertitel/Heading …):
   die Blöcke beziehen ihre Größe aus den --font-size-*-Tokens (auch das Editor-Feld „Größe"
   setzt inline font-size:var(--font-size-…)). Statt jeden Block einzeln zu skalieren, werden
   die Tokens LOKAL auf .hero-card-extra fluid neu definiert → jeder eingefügte Block schrumpft
   auf Mobile automatisch mit, analog zur .hero-title-clamp (main.css ≤1279.98). Greift erst ab
   ≤1279.98 (wie die H1); Desktop = unveränderte Originalgrößen. Bei Asset-Resync erhalten. */
@media (max-width: 1279.98px) {
  .hero-card-extra {
    --font-size-sm: clamp(0.8rem,  0.74rem + 0.25vw, 0.85rem);
    --font-size-md: clamp(0.9rem,  0.78rem + 0.5vw,  1rem);
    --font-size-lg: clamp(1rem,    0.7rem  + 1.2vw,  1.25rem);
    --font-size-xl: clamp(1.2rem,  0.8rem  + 1.6vw,  1.6rem);
  }
}

/* Geräte-Sichtbarkeit je Block (visibility.device → Renderer hängt die Klasse ans
   Block-Wurzel-Element). Universal für ALLE Blocktypen. Im Editor-Canvas greifen diese
   Regeln NICHT (dort emittiert der Renderer stattdessen .cms-vis-edit-Marker, s. canvas.php)
   → der Block bleibt im Editor immer sichtbar/anwählbar. Breakpoints = Designsystem
   (650 = Schmal-Stack/Handy, 1279.98 = Kompakt/Handy+Tablet). Bei Asset-Resync erhalten. */
@media (max-width: 650px)     { .cms-vis-hide-phone  { display: none !important; } }
@media (max-width: 1279.98px) { .cms-vis-hide-mobile { display: none !important; } }
@media (min-width: 650.02px)  { .cms-vis-only-phone  { display: none !important; } }

/* =============================================================================
   Timeline / Zeitstrahl (Blocks\Timeline + Blocks\TimelineEntry).
   Vertikale, abwechselnde Zeitleiste: zentrale (gepunktete) Linie, farbige Punkte,
   Oberpunkt (Jahr) + Kurztext je Eintrag, Bild auf der Gegenseite, Detailtext der
   per Hover/Klick aufklappt, sanfte Einblendung beim Scrollen (main.js JS Block 20).
   Tokens 1:1 aus dem Designsystem; --tl-accent (Punkt) per Block/Eintrag setzbar.
   ========================================================================== */

/* Eine direkt auf der Seite platzierte Timeline (Wurzel ist ein <div>, keine <section>)
   bekommt den Sektions-Abstand wie echte Sektionen (in einer Section eingebettet liefert
   die Überschrift den Abstand). Gleiche Werte/Breakpoint wie .content-wrap > section. */
.content-wrap > .cms-timeline:not(:first-child) { margin-top: 8rem; clear: both; }
@media (max-width: 1279.98px) {
  .content-wrap > .cms-timeline:not(:first-child) { margin-top: 5rem; }
}

.cms-timeline { position: relative; padding: 1rem 0; }
/* Zentrale Linie (Standard gepunktet; Stil über data-tl-line). Liegt HINTER den Einträgen
   (z-index 0) → in den Lücken sichtbar; die opaken Punkt-Ringe maskieren sie sauber. */
.cms-timeline::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 50%;
  width: 0; transform: translateX(-50%); z-index: 0;
  border-left: 3px dotted var(--tl-line, color-mix(in srgb, var(--color-primary), transparent 55%));
}
.cms-timeline[data-tl-line="dashed"]::before { border-left-style: dashed; }
.cms-timeline[data-tl-line="solid"]::before  { border-left-style: solid; }

/* Eintrag = 3-Spalten-Grid: Inhalt | Punkt (auf der Linie) | Bild. KEIN z-index (sonst eigener
   Stacking-Context → das Detail-Overlay käme nicht über benachbarte Einträge); Einträge liegen
   per Quell-Reihenfolge ohnehin über der Linie (::before, z-index:0). */
.cms-timeline-entry {
  position: relative;
  display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center; column-gap: 2rem;
}
.cms-timeline-entry + .cms-timeline-entry { margin-top: 3.5rem; }
.tl-marker { grid-column: 2; display: flex; align-items: center; justify-content: center; }
.tl-content { position: relative; } /* Anker für das absolute Detail-Overlay */

/* Anordnung: die Seite (links/rechts) trägt JEDER Eintrag als Klasse (vom Renderer gesetzt —
   robust gegen interleaved Wrapper wie .cms-cond-hidden; „abwechselnd" wechselt die Seite je
   sichtbarem Eintrag). Inhalt hugt die Linie, Bild auf der Gegenseite. */
.cms-timeline-entry--left  .tl-content { grid-column: 1; text-align: right; max-width: 30rem; margin-left: auto; }
.cms-timeline-entry--left  .tl-media   { grid-column: 3; }
.cms-timeline-entry--right .tl-content { grid-column: 3; text-align: left;  max-width: 30rem; margin-right: auto; }
.cms-timeline-entry--right .tl-media   { grid-column: 1; }
/* Desktop: alle Zellen in DIESELBE Grid-Zeile zwingen. Bei einem --right-Eintrag steht das
   Bild (grid-column 1) im DOM HINTER dem Inhalt (grid-column 3) → das Sparse-Auto-Placement von
   CSS-Grid kann die „zurückliegende" Spalte 1 nicht mehr in Zeile 1 unterbringen und schiebt das
   Bild in eine zweite Zeile (= „Bild nach unten gerückt", live wie im Editor). grid-row:1 hält
   alles in einer Reihe. NUR Desktop — die Mobil-Ansicht (≤900px, eine Spalte) stapelt Inhalt/Bild
   bewusst über Auto-Placement; horizontal hat eigene grid-row-Zuweisungen. */
@media (min-width: 901px) {
  .cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry > * { grid-row: 1; }
}

/* Punkt auf der Linie (opaker Ring „bricht" die Linie). Farbe: --tl-dot (Eintrag) → --tl-accent
   (Block) → Akzent. */
.tl-dot {
  width: 1.4rem; height: 1.4rem; border-radius: 50%;
  background: var(--tl-dot, var(--tl-accent, var(--color-accent)));
  box-shadow: 0 0 0 5px var(--color-light), 0 0 0 7px color-mix(in srgb, var(--tl-dot, var(--tl-accent, var(--color-accent))), transparent 78%);
  display: flex; align-items: center; justify-content: center; color: var(--color-light-contrast);
}
.tl-dot--icon { width: 2.6rem; height: 2.6rem; }
.tl-dot svg { width: 1.3rem; height: 1.3rem; fill: currentColor; display: block; }
/* Text/Zahl im Punkt (z.B. „1.") statt Icon (Betreiberwunsch 2026-06-25). Pille (border-radius 999px)
   + min-width=height → einzelne Ziffer bleibt rund, mehrstellige Texte wachsen waagerecht (der
   box-shadow-Ring folgt der Form). Schrift erbt die helle Punkt-Farbe (--color-light-contrast). */
.tl-dot--text { width: auto; min-width: 2.6rem; height: 2.6rem; border-radius: 999px; padding: 0 .55rem; }
.tl-dot-text { font-size: var(--font-size-sm); font-weight: 700; line-height: 1; white-space: nowrap; }

/* Inhalt */
.tl-year  { font-size: var(--font-size-xl); font-weight: 700; color: var(--color-primary); line-height: 1.2; }
.tl-short { font-size: var(--font-size-lg); color: var(--color-primary); line-height: 1.55; margin-top: .35rem; }

/* Detailtext: Aufklapp-Knopf + Panel. Das Panel ist ein SCHWEBENDES Overlay (position:absolute)
   → es klappt bei Hover/Klick auf, OHNE das umgebende Layout zu verschieben (Betreiberwunsch).
   .tl-detail = Positionierer (absolut), .tl-detail-inner = die sichtbare Karte. */
.tl-detail-toggle {
  display: inline-flex; align-items: center; gap: .35rem; margin-top: .6rem;
  background: none; border: 0; padding: 0; cursor: pointer; font: inherit;
  color: var(--color-accent); font-weight: 600; font-size: var(--font-size-sm);
}
.tl-detail-toggle:hover { text-decoration: underline; }
.tl-detail-chev { width: 1em; height: 1em; fill: currentColor; transition: transform .25s ease; }
.cms-timeline-entry.is-open .tl-detail-chev { transform: rotate(90deg); }
.tl-detail {
  position: absolute; z-index: 30;
  width: max(100%, 21rem); max-width: min(30rem, 88vw); max-height: 70vh; overflow: auto;
  /* Karten-Oberfläche (Hintergrund/Haarlinie/Ecken/Schatten) liegt am SCROLL-Container selbst: sein
     eigener outset-box-shadow wird vom eigenen overflow:auto NICHT beschnitten (anders als der eines
     Kindes), und die runden Ecken klippen den Inhalt sauber. So bleibt der Schatten rundum sichtbar
     und an den Ecken rund (Fix 2026-06-25 — vorher lag der Schatten an .tl-detail-inner und wurde
     vom umschließenden overflow:auto abgeschnitten / die Ecken wirkten platt). */
  background: var(--color-light-contrast); border-radius: var(--radius-sm);
  border: 1px solid color-mix(in srgb, var(--color-primary), transparent 90%);
  box-shadow: 0 2px 8px rgba(0, 68, 74, .14), 0 16px 40px rgba(0, 68, 74, .26);
  opacity: 0; visibility: hidden; transform: translateY(8px); pointer-events: none;
  transition: opacity .2s ease, transform .2s ease, visibility .2s;
}
.tl-detail-inner {
  text-align: left; padding: .95rem 1.15rem;
  font-size: var(--font-size-md); color: var(--color-primary); line-height: 1.6;
}
.tl-detail-inner + .tl-detail-inner { margin-top: .5rem; }
/* Hover-Modus: über einem Eintrag MIT aufklappbarem Detail den „Hilfe"-Cursor (Pfeil + Fragezeichen/
   Info) zeigen → signalisiert „hier erscheint per Hover mehr" (Betreiberwunsch 2026-06-25). Nur bei
   Hover-Reveal (nicht „Immer sichtbar") und nicht im Editor-Canvas (dort steht das Detail in-flow). */
@media (hover: hover) and (pointer: fine) {
  .cms-timeline:not(.cms-timeline--detail-always):not(.cms-timeline--editor) .cms-timeline-entry:has(.tl-detail) { cursor: help; }
}
/* Vertikal: unter dem Inhalt, zur Linie hin verankert. */
.cms-timeline:not(.cms-timeline--horizontal) .tl-detail { top: 100%; }
.cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry--left  .tl-detail { right: 0; left: auto; }
.cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry--right .tl-detail { left: 0; right: auto; }
.cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry.is-open .tl-detail { opacity: 1; visibility: visible; transform: none; pointer-events: auto; }
@media (hover: hover) and (pointer: fine) {
  /* Hover-Vorschau: sichtbar, aber pointer-events bleibt none → das Panel folgt der Maus
     (main.js) und „lässt den Cursor durch" (sonst verlöre der Eintrag das :hover). Erst beim
     Anpinnen (.is-open, Klick) wird es interaktiv. */
  .cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry:hover .tl-detail { opacity: 1; visibility: visible; transform: none; }
}
/* Horizontal: zentriert über dem Eintrag (begrenzt, intern scrollbar). */
.cms-timeline--horizontal .tl-detail { top: 50%; left: 50%; width: 17rem; max-width: 84vw; max-height: 13rem; transform: translate(-50%, -50%) scale(.96); }
.cms-timeline--horizontal .cms-timeline-entry.is-open .tl-detail { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); pointer-events: auto; }
@media (hover: hover) and (pointer: fine) {
  .cms-timeline--horizontal .cms-timeline-entry:hover .tl-detail { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); }
}
/* Maus-Folge-Zustand (main.js setzt left/top/right/bottom/transform inline): schwebt frei am
   Cursor, viewport-fixiert (kein Clipping durch Overflow/Stacking). Beim Anpinnen eingefroren. */
.tl-detail.tl-following { position: fixed; width: 21rem; max-width: 88vw; max-height: 70vh; }
/* Detail-Anzeige „Immer sichtbar": kein Knopf, Detail steht in-flow dauerhaft (zuletzt → gewinnt). */
.cms-timeline.cms-timeline--detail-always .tl-detail-toggle { display: none; }
.cms-timeline.cms-timeline--detail-always .tl-detail {
  position: static; opacity: 1; visibility: visible; transform: none; pointer-events: auto;
  width: auto; max-width: none; max-height: none; overflow: visible; margin-top: .7rem;
}
/* Detail in-flow macht die Inhalts-Spalte hoch → das (kürzere) Bild würde mit align-items:center
   in der Zeile vertikal zentriert („nach unten gerückt") statt neben dem Text zu stehen. Oben
   ausrichten (wie Mobile/Editor-Canvas). */
.cms-timeline.cms-timeline--detail-always:not(.cms-timeline--horizontal) .cms-timeline-entry { align-items: start; }
.cms-timeline.cms-timeline--detail-always:not(.cms-timeline--horizontal) .tl-dot { margin-top: .3rem; }

/* Bild — Default-Margin von img.cms-img (2.5rem) hier neutralisieren. Größe über
   --tl-img-size (Timeline-Default) bzw. ein Inline-max-width am Bild (Eintrag-Override). */
.tl-media { display: flex; justify-content: center; }
.cms-timeline img.cms-img { margin: 0; }
.tl-img { width: 100%; max-width: var(--tl-img-size, 13rem); height: auto; display: block; }
.cms-timeline[data-tl-imgshape="round"]   .tl-img { aspect-ratio: 1; object-fit: cover; border-radius: 50%; }
.cms-timeline[data-tl-imgshape="rounded"] .tl-img { border-radius: var(--radius-md); }
.cms-timeline[data-tl-imgshape="square"]  .tl-img { border-radius: 0; }

/* Detailtext als echte Blöcke (Eintrag ist Container; Kinder rendern im Detail-Panel). */
.tl-detail-blocks > * + * { margin-top: .8rem; }
.tl-detail-blocks .cms-img, .tl-detail-blocks .cms-figure { margin: 0; }

/* Fortschritts-Linie (vertikal): füllt die Linie beim Scrollen in Akzentfarbe (main.js setzt
   --tl-progress 0..1). Liegt über der gepunkteten Basislinie, unter den Punkten. */
.tl-progress {
  position: absolute; top: 0; left: 50%; width: 3px; transform: translateX(-50%);
  height: calc(var(--tl-progress, 0) * 100%); z-index: 0;
  background: var(--tl-accent, var(--color-accent)); border-radius: 2px;
}

/* Scroll-Einblendung — No-JS-sicher: erst „scharf" (versteckt), wenn main.js die Klasse
   tl-anim setzt; ohne JS bleibt alles sichtbar. is-revealed wird per IntersectionObserver
   gesetzt (JS Block 20). Auf Desktop schiebt sich der Eintrag aus seiner Seite herein. */
.cms-timeline.tl-anim .cms-timeline-entry { opacity: 0; transform: translateY(28px); transition: opacity .6s ease, transform .6s ease; }
.cms-timeline.tl-anim .cms-timeline-entry.is-revealed { opacity: 1; transform: none; }
@media (min-width: 901px) {
  .cms-timeline.tl-anim .cms-timeline-entry--left  { transform: translate(-36px, 14px); }
  .cms-timeline.tl-anim .cms-timeline-entry--right { transform: translate(36px, 14px); }
  .cms-timeline.tl-anim .cms-timeline-entry.is-revealed { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .cms-timeline.tl-anim .cms-timeline-entry { transition: none; }
}

/* Mobil (≤900px), NUR vertikal: einspaltig, Linie + Punkte links, Inhalt/Bild rechts daneben.
   (Horizontal scrollt ohnehin und bleibt unberührt.) */
@media (max-width: 900px) {
  .cms-timeline:not(.cms-timeline--horizontal)::before { left: 1.1rem; transform: none; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-progress { left: 1.1rem; }
  .cms-timeline:not(.cms-timeline--horizontal) .cms-timeline-entry { grid-template-columns: 2.2rem minmax(0, 1fr); column-gap: 1.1rem; align-items: start; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-content { grid-column: 2 !important; text-align: left !important; max-width: none; margin: 0 !important; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-media   { grid-column: 2 !important; justify-content: flex-start; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-marker  { grid-column: 1 !important; justify-content: center; align-self: start; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-dot { margin-top: .3rem; }
  .cms-timeline:not(.cms-timeline--horizontal) .tl-img { max-width: 10rem; margin-top: .75rem; }
}

/* =============================================================================
   Timeline — horizontale Layout-Variante (orientation=horizontal).
   Einträge stehen nebeneinander (horizontal scrollbar), zentrale Linie waagerecht,
   Inhalt/Bild abwechselnd ober-/unterhalb. Die Linie liegt im .tl-track (Wrapper),
   damit sie über ALLE Einträge reicht (auch beim Scrollen).
   ========================================================================== */
.cms-timeline--horizontal { overflow-x: auto; overflow-y: hidden; padding: .5rem 0 1rem; }
.cms-timeline--horizontal::before { display: none; }            /* vertikale Linie aus */
.cms-timeline--horizontal .tl-track {
  display: flex; gap: 2.5rem; width: max-content; position: relative; padding: 1.5rem 0;
}
.cms-timeline--horizontal .tl-track::before {
  content: ""; position: absolute; top: 50%; left: 0; right: 0; height: 0; transform: translateY(-50%);
  z-index: 0; border-top: 3px dotted var(--tl-line, color-mix(in srgb, var(--color-primary), transparent 55%));
}
.cms-timeline--horizontal[data-tl-line="dashed"] .tl-track::before { border-top-style: dashed; }
.cms-timeline--horizontal[data-tl-line="solid"]  .tl-track::before { border-top-style: solid; }
.cms-timeline--horizontal .cms-timeline-entry {
  position: relative; z-index: 1; flex: 0 0 var(--tl-entry-width, 16rem);
  grid-template-columns: 1fr; grid-template-rows: 1fr auto 1fr; column-gap: 0; row-gap: .6rem;
  text-align: center; margin-top: 0 !important; align-items: center;
}
.cms-timeline--horizontal .tl-marker { grid-row: 2; grid-column: 1; }
/* „links" = oben, „rechts" = unten (abwechselnd über/unter der Linie). */
.cms-timeline--horizontal .cms-timeline-entry--left  .tl-content { grid-row: 1; grid-column: 1; align-self: end;   text-align: center; max-width: none; margin: 0 auto; }
.cms-timeline--horizontal .cms-timeline-entry--left  .tl-media   { grid-row: 3; grid-column: 1; align-self: start; }
.cms-timeline--horizontal .cms-timeline-entry--right .tl-content { grid-row: 3; grid-column: 1; align-self: start; text-align: center; max-width: none; margin: 0 auto; }
.cms-timeline--horizontal .cms-timeline-entry--right .tl-media   { grid-row: 1; grid-column: 1; align-self: end; }
.cms-timeline--horizontal .tl-img { max-width: var(--tl-img-size, 9rem); margin-inline: auto; }
/* Horizontale Einblendung: ober-/unterhalb hereinschieben. */
@media (min-width: 901px) {
  .cms-timeline--horizontal.tl-anim .cms-timeline-entry--left  { transform: translate(0, -24px); }
  .cms-timeline--horizontal.tl-anim .cms-timeline-entry--right { transform: translate(0, 24px); }
  .cms-timeline--horizontal.tl-anim .cms-timeline-entry.is-revealed { transform: none; }
}

/* =====================================================================
   Formular-Editor (kind='formular'): Schritt-Formulare + Formular-Start
   ---------------------------------------------------------------------
   Blocks\Form im SCHRITT-MODUS (formstep-Kinder): mehrseitiger Wizard wie der
   Kontakt-Funnel — Fortschrittsanzeige, ein sichtbarer Schritt, Zurück/Weiter/
   Absenden, Danke-Schritt nach dem Absenden. Bewusst SELBSTSTÄNDIG gestylt
   (nicht von buchung.css abhängig) → funktioniert auch eingebettet auf
   normalen CMS-Seiten. Logik: main.js JS Block 22 (initFormSteps).
   ===================================================================== */
.cms-form--steps { max-width: 46rem; }

/* Schritte: live nur der aktive sichtbar (sanfte Einblendung wie .buchung-step). */
.cms-form--steps .cms-fstep { display: none; }
.cms-form--steps .cms-fstep.is-active { display: block; animation: cms-fstep-in 0.4s cubic-bezier(0.22, 1, 0.36, 1); }
@keyframes cms-fstep-in {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .cms-form--steps .cms-fstep.is-active { animation: none; }
}

/* Weiße Schritt-Karte (Default; attrs.card=false = transparent). Innen fließen die
   Formularfelder/Blöcke mit eigenem Abstand (der .cms-form-Flex-gap greift am Form-Root). */
.cms-fstep--card {
  background: var(--color-light-contrast);
  border-radius: var(--radius-lg);
  padding: clamp(1.5rem, 3vw, 2.5rem);
}
.cms-fstep > * + * { margin-top: 1rem; }
/* Formular-Inhalte in einer Notch-Karte (Standard neuer Formulare): gleicher vertikaler
   Rhythmus wie direkt im Schritt. Das erste sichtbare Kind nach dem absoluten .notch-Eck
   bekommt so zugleich etwas Luft unter dem Dot-Titel. */
.cms-form--steps .cms-notch > * + * { margin-top: 1rem; }
.cms-fstep > h1:first-child, .cms-fstep > h2:first-child, .cms-fstep > h3:first-child { margin-top: 0; }

/* Fortschrittsanzeige: nummerierte Punkte + Schritt-Titel, verbunden durch eine Linie.
   Bewusst NICHT sticky (2026-07-02 kurz sticky gebaut, auf Betreiberwunsch wieder entfernt —
   sie scrollt normal mit). */
.cms-fsteps-progress {
  list-style: none;
  display: flex;
  gap: 0.4rem;
  margin: 0 0 1.25rem;
  padding: 0;
}
@media (max-width: 650px) {
  /* Formular-Name in eine eigene Header-Zeile (sonst quetscht er sich zwischen Logo und ✕) */
  .buchung-header .formular-header-name { grid-column: 1 / -1; grid-row: 2; justify-self: center; margin-top: -0.25rem; }
}
.cms-fsteps-dot {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.35rem;
  position: relative;
  text-align: center;
  color: color-mix(in srgb, var(--color-primary), transparent 45%);
  font-size: var(--font-size-sm);
}
.cms-fsteps-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-primary), transparent 88%);
  color: var(--color-primary);
  font-weight: 700;
}
/* Verbindungslinie zwischen den Punkten */
.cms-fsteps-dot + .cms-fsteps-dot::before {
  content: '';
  position: absolute;
  top: 1rem;
  right: calc(50% + 1.3rem);
  width: calc(100% - 2.6rem);
  height: 2px;
  border-radius: 2px;
  background: color-mix(in srgb, var(--color-primary), transparent 85%);
}
.cms-fsteps-dot.is-current { color: var(--color-primary); font-weight: 700; }
.cms-fsteps-dot.is-current .cms-fsteps-num { background: var(--color-accent); color: var(--color-on-accent); }
.cms-fsteps-dot.is-done .cms-fsteps-num { background: var(--color-icon); color: var(--color-primary); }
.cms-fsteps-dot.is-done + .cms-fsteps-dot::before,
.cms-fsteps-dot.is-current + .cms-fsteps-dot::before { background: color-mix(in srgb, var(--color-primary), transparent 55%); }
@media (max-width: 650px) {
  .cms-fsteps-lbl { display: none; } /* schmal: nur Nummern */
}

/* Step-Gate-Validierung: Fehlermeldung/.form-field-error + Highlight-Ring kommen aus
   main.css; nur die Shake-Zuweisung liegt sonst in buchung.css — hier dupliziert, damit
   eingebettete Schritt-Formulare auf NORMALEN CMS-Seiten (ohne buchung.css) sie haben. */
.cms-form--steps .is-shaking { animation: form-field-shake 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97); }

/* Navigation: Zurück links, Weiter/Absenden rechts (wie .buchung-actions). */
.cms-fsteps-nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  margin-top: 0.25rem;
}
/* WICHTIG: .cta-main/.cta-secondary setzen display:inline-flex (main.css) und überschreiben
   damit die UA-[hidden]-Regel (gleicher Fallstrick wie .ks-q-clear[hidden]) → ohne diese Regel
   wären „Weiter" UND „Absenden" GLEICHZEITIG sichtbar (Betreiberbug 2026-07-02). JS steuert die
   Buttons übers hidden-Attribut: Weiter nur VOR dem letzten Schritt, Absenden nur AUF dem letzten. */
.cms-fsteps-nav button[hidden] { display: none; }
.cms-fsteps-nav .cms-fsteps-back svg { transform: rotate(180deg); }
.cms-fsteps-nav .cms-fsteps-next,
.cms-fsteps-nav .cms-fsteps-submit { margin-left: auto; }
.cms-fsteps-nav button svg { width: 1.05rem; height: 1.05rem; }
.cms-fsteps-nav button[disabled] { opacity: 0.6; cursor: wait; }
/* Nach erfolgreichem Absenden: Navigation + Fortschritt weg, Danke-Schritt zeigt sich. */
.cms-form--steps.is-submitted .cms-fsteps-nav,
.cms-form--steps.is-submitted .cms-fsteps-progress { display: none; }

/* Bedingtes Formularfeld (data-cond-field, main.js initFieldConditions): ausgeblendet,
   solange das Steuer-Feld nicht den geforderten Wert hat. Eigene Klasse statt [hidden] —
   .form-field-Regeln mit display würden das UA-[hidden] überschreiben (bekannter Fallstrick). */
.cms-cond-field-off { display: none !important; }

/* Editor-Canvas: main.js läuft nicht → ALLE Schritte gestapelt sichtbar, jeder mit Badge
   „Schritt: <Titel>" (data-step-title) + gestrichelter Kontur → einzeln anwähl-/editierbar. */
.cms-form--steps-editor .cms-fstep {
  display: block;
  position: relative;
  outline: 2px dashed color-mix(in srgb, var(--color-primary), transparent 65%);
  outline-offset: 4px;
  margin: 1.6rem 0 1rem;
}
.cms-form--steps-editor .cms-fstep::before {
  content: 'Schritt: ' attr(data-step-title);
  position: absolute;
  top: -1.15rem;
  left: 0;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--color-primary);
  opacity: 0.75;
  pointer-events: none;
}
.cms-form--steps-editor .cms-fstep--thanks::before { content: 'Danke-Schritt (erscheint nach dem Absenden): ' attr(data-step-title); }
.cms-form--steps-editor .cms-fsteps-nav button { pointer-events: none; opacity: 0.7; }

/* Konfetti-Partikel (Kopie aus buchung.css — Schritt-Formulare laufen auch auf normalen
   CMS-Seiten, die buchung.css NICHT laden; identische Regeln, Doppel-Laden ist harmlos). */
.confetti-piece {
  position: fixed;
  top: 0; left: 0;
  width: 9px;
  height: 15px;
  z-index: 2000;
  pointer-events: none;
  opacity: 0;
  will-change: transform, opacity;
  animation: confetti-burst var(--cf-dur, 2s) var(--cf-delay, 0s) both;
}
@keyframes confetti-burst {
  0% {
    transform: translate(0, 0) rotate(0deg) scale(0.6);
    opacity: 1;
    animation-timing-function: cubic-bezier(0.12, 0.7, 0.3, 1);
  }
  45% {
    transform: translate(calc(var(--cf-x, 0px) * 0.7), var(--cf-peak, -200px)) rotate(calc(var(--cf-rot, 360deg) * 0.55)) scale(1);
    opacity: 1;
    animation-timing-function: cubic-bezier(0.5, 0, 0.8, 0.45);
  }
  100% {
    transform: translate(var(--cf-x, 0px), var(--cf-end, -60px)) rotate(var(--cf-rot, 360deg)) scale(1);
    opacity: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .confetti-piece { display: none; }
}

/* Formular-Start-Block (normale Seiten): Feld + Button → öffnet /formular/<slug>/ mit
   Vorbefüllung. Feld = SSOT FormField::markup (Feldtyp wählbar); bei text/search/textarea
   sitzt der Button als Inline-CTA IM Feld, sonst als eigener .cms-formstart-btn daneben
   (schmale Viewports: darunter, dank flex-wrap). */
.cms-formstart {
  max-width: 34rem;
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;   /* Button bündig zur Feld-Unterkante (Label oben drüber) */
  gap: 0.9rem;
}
.cms-formstart .form-field,
.cms-formstart .form-field-fieldset { flex: 1 1 16rem; min-width: 0; }
.cms-formstart .cms-formstart-btn { flex: 0 0 auto; }
.cms-formstart .cms-formstart-btn svg { width: 1.05rem; height: 1.05rem; }

/* Formular-Name mittig im Funnel-Header: gleiche Chip-Optik wie der „Thema"-Chip des
   Kontakt-Funnels (.kontakt-header-bereich), aber NICHT klickbar → Hover-Effekt neutralisieren
   (kontakt.css lädt NACH cms-blocks.css → doppelte Klasse für die nötige Spezifität). */
.kontakt-header-bereich.formular-header-name { cursor: default; }
.kontakt-header-bereich.formular-header-name:hover { background: color-mix(in srgb, var(--color-primary) 8%, transparent); }

/* Formular-Seiten-Shell (/formular/<slug>/, cms_formular_document): Funnel-Look wie
   kontakt.php (buchung.css/kontakt.css sind dort geladen). Sticky-Footer wie
   .kontakt-page: body = Flex-Spalte über die volle Fensterhöhe, die Shell wächst →
   die kontakt-actionbar sitzt IMMER am unteren Fensterrand, auch wenn der Inhalt
   kürzer als das Fenster ist (ohne die body-Regel war das flex:1 der Shell wirkungslos —
   Betreiberbug 2026-07-06). Der Sprite-Container ist position:absolute → kein Flex-Item. */
body.formular-page { display: flex; flex-direction: column; min-height: 100dvh; }
.formular-shell { flex: 1 1 auto; width: 100%; }
.formular-shell .cms-form--steps { margin-inline: auto; }
.formular-main { max-width: 46rem; margin: 0 auto; }
.formular-main > h1 { margin: 0 0 1.5rem; }
/* ============================================================================
   Druck-Stylesheet der LIVE-Seiten — „Seite drucken" (Share-Block-Icon, main.js
   JS Block 21 → window.print()). Inline via cms_render_document() (helpers.php)
   auf jeder CMS-Seite. CMS-eigenes Asset → von einem Asset-Resync aus test\design
   UNBERÜHRT. Blendet die interaktive Web-Chrome (Mega-Menü, Share-Leiste, Consent-
   Banner, Scroll-Top, sticky TOC, Footer-Karte) aus und legt einen KONFIGURIERBAREN
   Lauf-Kopf/-Fuß (Logo/Claim oben · Kontakt/Impressum unten) auf jede Druckseite —
   Inhalte aus den Export-Einstellungen (cms_print_chrome(), oma_cms_setting export_*).
   ============================================================================ */

/* Lauf-Kopf/-Fuß am Bildschirm unsichtbar — sie erscheinen NUR im Druck. */
.cms-print-head, .cms-print-foot { display: none; }

@media print {
  @page { size: A4; margin: 16mm 12mm; }

  html, body { background: #fff !important; }
  body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }

  /* Interaktive Web-Chrome ausblenden — gedruckt wird allein der Inhalt. */
  .nav-fixed-wrapper, .site-footer, .share-section, .scroll-top,
  .toc-dropdown, .toc-section, [data-prefs-trigger],
  .ifm-prefs-card, .ifm-prefs-dialog, .ifm-resume-card, .ifmera-tooltip,
  .cms-end-appender { display: none !important; }

  /* Sticky/fixed-Inhaltsblöcke im normalen Fluss drucken. */
  [style*="position:fixed"], [style*="position: fixed"] { position: static !important; }

  /* Inhalt: kein zentrierter Rahmen, Platz für Lauf-Kopf/-Fuß. */
  main.content-wrap, .content-wrap {
    margin: 0 !important; max-width: none !important;
    padding: 13mm 0 11mm !important;
  }

  /* Karussells: alle Slides untereinander (kein Inhalt darf wegfallen). */
  .carousel-track, [class*="-track"] { transform: none !important; }
  .carousel-slide { width: auto !important; flex: 0 0 100% !important; break-inside: avoid; }

  /* FAQ/Accordion offen drucken; Bewertungs-Zitat in voller Höhe (kein Scroll-Deckel beim Druck).
     display:block neutralisiert die grid-template-rows:0fr-Klappanimation → Antwort voll sichtbar. */
  .faq-answer, .accordion-panel, [class*="answer"], .bewertung-quote {
    display: block !important;
    max-height: none !important; height: auto !important; overflow: visible !important;
  }

  /* Markenflächen (teal/accent/Notch) drucken statt weiß. */
  .cms-section--accent, .cms-section--teal, .cms-section--boxed, .notch, .dot,
  .hero-card, .info-bar, .cta-main, .cta-secondary, .kurs-card-type, .kurs-card-foerder,
  .icon-tile, .bewertung-card {
    -webkit-print-color-adjust: exact; print-color-adjust: exact;
  }

  /* Umbrüche schützen + Sektionsabstände entspannen. */
  .content-wrap > section { margin-top: 1.5rem !important; }
  .card, .notch, .info-tile, .kurs-card, .bewertung-card, figure, table { break-inside: avoid; }
  h1, h2, h3 { break-after: avoid; }
  img { max-width: 100% !important; }
  a { text-decoration: none; color: inherit; }

  /* ── Konfigurierbarer Lauf-Kopf/-Fuß (cms_print_chrome()) ── */
  .cms-print-head {
    display: flex; align-items: center; justify-content: space-between; gap: 1rem;
    position: fixed; top: 0; left: 0; right: 0; height: 11mm;
    border-bottom: 1.5pt solid var(--color-primary, #00444A);
    color: var(--color-primary, #00444A); font-size: 8pt;
  }
  .cms-print-head .cms-print-logo svg { height: 7mm; width: auto; color: var(--color-primary, #00444A); }
  .cms-print-claim { font-style: italic; opacity: .82; text-align: right; }
  .cms-print-foot {
    display: flex; align-items: center; justify-content: center;
    position: fixed; bottom: 0; left: 0; right: 0; height: 9mm;
    border-top: .75pt solid rgba(0, 68, 74, .25);
    color: rgba(0, 68, 74, .7); font-size: 7pt; text-align: center;
  }
}
</style>
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MTH6M5SP" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div aria-hidden="true" style="position:absolute;width:0;height:0;overflow:hidden"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="0" height="0" style="position:absolute;width:0;height:0;overflow:hidden" aria-hidden="true">
  <defs>
    <!-- ClipPaths für CSS `clip-path: url(#…)`. Sprite wird via PHP-Include
         inline in jede Seite eingefügt → ClipPaths sind im DOM verfügbar. -->
    <clipPath id="image-clip-notch-tr" clipPathUnits="objectBoundingBox">
      <path d="M 0.03,0 L 0.7225,0 Q 0.7525,0 0.7525,0.03 L 0.7525,0.15 Q 0.7525,0.18 0.7825,0.18 L 0.97,0.18 Q 1,0.18 1,0.21 L 1,0.97 Q 1,1 0.97,1 L 0.03,1 Q 0,1 0,0.97 L 0,0.03 Q 0,0 0.03,0 Z"/>
    </clipPath>
    <clipPath id="hero-notch-clip" clipPathUnits="objectBoundingBox">
      <path d="M 0.03,0 L 0.818125,0 Q 0.848125,0 0.848125,0.0533 L 0.848125,0.2167 Q 0.848125,0.27 0.878125,0.27 L 0.97,0.27 Q 1,0.27 1,0.3233 L 1,0.9467 Q 1,1 0.97,1 L 0.03,1 Q 0,1 0,0.9467 L 0,0.0533 Q 0,0 0.03,0 Z"/>
    </clipPath>
    <!-- ═══════════════════════════════════════════════════════════
         SOLID ICON SET – single source of truth for all UI icons.
         Paths have no explicit fill so color is inherited via CSS
         (fill: currentColor / fill: <var>) from the using element.
         ═══════════════════════════════════════════════════════════ -->
    <linearGradient id="icon-star-half-gradient">
      <stop offset="50%" stop-color="var(--color-icon)"/>
      <stop offset="50%" stop-color="rgba(255,255,255,0.25)"/>
    </linearGradient>
    <symbol id="icon-search-solid" viewBox="2.53 2.57 19.038 18.938"><path d="M21.18,18.64l-5.2-4.99c.69-1.11,1.09-2.41,1.09-3.81,0-4.01-3.26-7.27-7.27-7.27s-7.27,3.26-7.27,7.27,3.26,7.27,7.27,7.27c1.34,0,2.6-.37,3.68-1.01l5.28,5.06c.5.48,1.3.46,1.78-.04l.68-.71c.48-.5.46-1.3-.04-1.78ZM9.8,15.12c-2.91,0-5.27-2.36-5.27-5.27s2.37-5.27,5.27-5.27,5.27,2.36,5.27,5.27-2.36,5.27-5.27,5.27Z"/></symbol>
    <symbol id="icon-filter-solid" viewBox="0 0 640 640">
      <path d="M96 128C83.1 128 71.4 135.8 66.4 147.8C61.4 159.8 64.2 173.5 73.4 182.6L256 365.3L256 480C256 488.5 259.4 496.6 265.4 502.6L329.4 566.6C338.6 575.8 352.3 578.5 364.3 573.5C376.3 568.5 384 556.9 384 544L384 365.3L566.6 182.7C575.8 173.5 578.5 159.8 573.5 147.8C568.5 135.8 556.9 128 544 128L96 128z"/>
    </symbol>
    <symbol id="icon-user-solid" viewBox="3.79 2.14 16.51 19.81"><path d="M12.05,10.64c2.35,0,4.25-1.9,4.25-4.25s-1.9-4.25-4.25-4.25-4.25,1.9-4.25,4.25,1.9,4.25,4.25,4.25ZM15.54,12.29h-6.99c-2.63,0-4.76,2.13-4.76,4.76v2.38c0,1.39,1.13,2.52,2.52,2.52h11.47c1.39,0,2.52-1.13,2.52-2.52v-2.38c0-2.63-2.13-4.76-4.76-4.76Z"/></symbol>
    <symbol id="icon-monitor-solid" viewBox="2.06 2.67 19.98 18.76"><path d="M18.99,2.67H5.11c-1.68,0-3.05,1.36-3.05,3.05v8.51c0,1.68,1.36,3.05,3.05,3.05h4.96v2.15h-3.21c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h10.38c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-3.21v-2.15h4.96c1.68,0,3.05-1.36,3.05-3.05V5.72c0-1.68-1.36-3.05-3.05-3.05ZM20.03,9.11c0,.66-.8,1-1.27.53l-3.69-3.69c-.47-.47-.14-1.27.53-1.27h2.83c.89,0,1.61.72,1.61,1.61v2.83Z"/></symbol>
    <symbol id="icon-users-solid" viewBox="1.81 3.24 28.55 17.61"><circle cx="24.47" cy="8.07" r="2.94"/>
<circle cx="7.23" cy="8.07" r="2.94"/>
<path d="M6.75,18.61v-2.12c0-1.69.68-3.22,1.77-4.35h-3.42c-1.82,0-3.29,1.47-3.29,3.29v1.65c0,.96.78,1.74,1.74,1.74h3.21c0-.07-.02-.14-.02-.22Z"/>
<path d="M15.97,10.8c2.09,0,3.78-1.69,3.78-3.78s-1.69-3.78-3.78-3.78-3.78,1.69-3.78,3.78,1.69,3.78,3.78,3.78ZM19.08,12.26h-6.22c-2.34,0-4.23,1.9-4.23,4.23v2.12c0,1.24,1,2.24,2.24,2.24h10.2c1.24,0,2.24-1,2.24-2.24v-2.12c0-2.34-1.9-4.23-4.23-4.23Z"/>
<path d="M27.08,12.15h-3.42c1.1,1.12,1.77,2.66,1.77,4.35v2.12c0,.07-.02.14-.02.22h3.21c.96,0,1.74-.78,1.74-1.74v-1.65c0-1.82-1.47-3.29-3.29-3.29Z"/></symbol>
    <symbol id="icon-home-solid" viewBox="2.019 2.198 20.072 19.703"><path d="M21.76,10.06L12.6,2.4c-.32-.27-.79-.27-1.11,0L2.33,10.06c-.62.52-.25,1.53.56,1.53h1v8.13c0,1.2.98,2.18,2.18,2.18h11.97c1.2,0,2.18-.98,2.18-2.18v-8.13h1c.81,0,1.18-1.01.56-1.53Z"/></symbol>
    <symbol id="icon-building-solid" viewBox="2.019 2.198 20.062 19.703"><path d="M21.76,10.06L12.6,2.4c-.32-.27-.79-.27-1.11,0L2.33,10.06c-.62.52-.25,1.53.56,1.53h1v8.13c0,1.2.98,2.18,2.18,2.18h1.81v-2.22c0-1.38,1.12-2.07,2.49-2.07h3.36c1.38,0,2.49.69,2.49,2.07v2.22h1.81c1.2,0,2.18-.98,2.18-2.18v-8.13h1c.81,0,1.18-1.01.56-1.53ZM12.16,16.03c-1.36,0-2.46-1.1-2.46-2.46s1.1-2.46,2.46-2.46,2.46,1.1,2.46,2.46-1.1,2.46-2.46,2.46Z"/></symbol>
    <symbol id="icon-clock-solid" viewBox="1.87 1.87 20.36 20.36"><path d="M12.05,1.87C6.43,1.87,1.87,6.43,1.87,12.05s4.56,10.18,10.18,10.18,10.18-4.56,10.18-10.18S17.67,1.87,12.05,1.87ZM16.03,15.37l-.55.55c-.29.29-.76.29-1.06,0l-3.36-3.36s0-.02-.02-.03c-.14-.14-.23-.34-.23-.56v-6.29c0-.44.36-.79.79-.79h.69c.44,0,.79.35.79.79v5.69l2.94,2.94c.29.29.29.76,0,1.06Z"/></symbol>
    <symbol id="icon-location-solid" viewBox="4.87 2.102 14.349 19.894"><path d="M18.84,6.69c-.43-1.47-1.44-2.73-2.78-3.48C10.51.09,4.87,4.02,4.87,9.27s3.98,9.93,6.29,12.34c.51.53,1.32.51,1.81-.03,2.68-2.96,7.66-8.71,5.87-14.89ZM12.04,12.38c-1.71,0-3.1-1.39-3.1-3.1s1.39-3.1,3.1-3.1,3.1,1.39,3.1,3.1-1.39,3.1-3.1,3.1Z"/></symbol>
    <symbol id="icon-calendar-solid" viewBox="2.84 3.01 18.45 18.08"><path d="M17.97,5.13h-1.49v-1.43c0-.38-.31-.69-.69-.69h-.63c-.38,0-.69.31-.69.69v1.43h-4.83v-1.43c0-.38-.31-.69-.69-.69h-.63c-.38,0-.69.31-.69.69v1.43h-1.49c-1.82,0-3.3,1.48-3.3,3.3v9.36c0,1.82,1.48,3.3,3.3,3.3h11.85c1.82,0,3.3-1.48,3.3-3.3v-9.36c0-1.82-1.48-3.3-3.3-3.3ZM17.97,19.09H6.12c-.72,0-1.3-.58-1.3-1.3v-7.19h14.45v7.19c0,.72-.58,1.3-1.3,1.3Z"/></symbol>
    <symbol id="icon-chevron-right-solid" viewBox="7.338 4.577 9.415 14.955"><path d="M16.37,12.97l-6.18,6.18c-.51.51-1.34.51-1.85,0l-.62-.62c-.51-.51-.51-1.34,0-1.85l4.63-4.63-4.62-4.62c-.51-.51-.51-1.34,0-1.85l.62-.62c.51-.51,1.34-.51,1.85,0l6.17,6.17c.51.51.51,1.34,0,1.85Z"/></symbol>
    <symbol id="icon-chevrons-right-solid" viewBox="3.117 4.557 17.865 14.955"><path d="M12.15,11.11l-6.17-6.17c-.51-.51-1.34-.51-1.85,0l-.62.62c-.51.51-.51,1.34,0,1.85l4.62,4.62-4.63,4.63c-.51.51-.51,1.34,0,1.85l.62.62c.51.51,1.34.51,1.85,0l6.18-6.18c.51-.51.51-1.34,0-1.85ZM20.6,11.11l-6.17-6.17c-.51-.51-1.34-.51-1.85,0l-.62.62c-.51.51-.51,1.34,0,1.85l4.62,4.62-4.63,4.63c-.51.51-.51,1.34,0,1.85l.62.62c.51.51,1.34.51,1.85,0l6.18-6.18c.51-.51.51-1.34,0-1.85Z"/></symbol>
    <symbol id="icon-euro-solid" viewBox="6.01 4.3 12.07 15.52"><path d="M12.49,6.29h4.88c.39,0,.7-.32.7-.7v-.59c0-.39-.32-.7-.7-.7h-4.88c-2.6,0-4.71,2.11-4.71,4.71v.2h-1.07c-.39,0-.7.31-.7.7v.6c0,.39.31.7.7.7h1.07v1.7h-1.07c-.39,0-.7.31-.7.7v.61c0,.39.31.7.7.7h1.07v.19c0,2.6,2.11,4.71,4.71,4.71h4.89c.38,0,.7-.31.7-.7v-.61c0-.38-.31-.7-.7-.7h-4.89c-1.5,0-2.71-1.22-2.71-2.71v-.19h4.32c.39,0,.7-.31.7-.7v-.61c0-.39-.31-.7-.7-.7h-4.32v-1.7h4.32c.39,0,.7-.31.7-.7v-.6c0-.39-.31-.7-.7-.7h-4.32v-.2c0-1.5,1.22-2.71,2.71-2.71Z"/></symbol>
    <symbol id="icon-envelope-solid" viewBox="1.63 2.612 20.825 18.868"><path d="M17.86,13.54h-.66c-.37,0-.67.3-.67.67v3.69c0,.87-.71,1.58-1.58,1.58H5.21c-.87,0-1.58-.71-1.58-1.58v-9.74c0-.87.71-1.58,1.58-1.58h1.73c.37,0,.67-.3.67-.67v-.66c0-.37-.3-.67-.67-.67h-1.73c-1.98,0-3.58,1.6-3.58,3.58v9.74c0,1.98,1.6,3.58,3.58,3.58h9.74c1.98,0,3.58-1.6,3.58-3.58v-3.69c0-.37-.3-.67-.67-.67ZM22.17,6.74l-4.83-3.95c-.51-.42-1.28-.05-1.28.61v1.22h-4.95c-1.18,0-2.14.96-2.14,2.14v3.31h0v1.3c0,.51.63.7.95.31.71-.87,1.74-1.47,2.91-1.61h0s3.23,0,3.23,0v1.22c0,.66.77,1.03,1.28.61l4.83-3.95c.38-.31.38-.9,0-1.21Z"/></symbol>
    <symbol id="icon-phone-solid" viewBox="1.887 1.883 20.33 20.33"><path d="M10.25,5.04l-2.55-2.55c-.81-.81-2.13-.81-2.95,0l-1.22,1.22c-2.19,2.19-2.19,5.75,0,7.94l8.92,8.92c2.19,2.19,5.75,2.19,7.94,0l1.22-1.22c.81-.81.81-2.13,0-2.95l-2.55-2.55c-.81-.81-2.13-.81-2.95,0l-.86.86c-.64.64-1.68.64-2.32,0l-3.53-3.53c-.64-.64-.64-1.68,0-2.32l.86-.86c.81-.81.81-2.13,0-2.95Z"/></symbol>
    <symbol id="icon-mail-solid" viewBox="2.45 4.72 19.2 14.65"><path d="M3.17,7.96l7.8,5.85c.64.48,1.52.48,2.16,0l7.8-5.85c.45-.34.72-.87.72-1.44,0-.99-.81-1.8-1.8-1.8H4.25c-.99,0-1.8.81-1.8,1.8,0,.57.27,1.1.72,1.44ZM20.96,10.44l-6.75,5.07c-1.28.96-3.04.96-4.32,0l-6.75-5.07c-.28-.21-.69-.01-.69.34v6.19c0,1.33,1.07,2.4,2.4,2.4h14.4c1.33,0,2.4-1.07,2.4-2.4v-6.19c0-.35-.4-.56-.69-.34Z"/></symbol>
    <symbol id="icon-printer-solid" viewBox="0.74 2.01 22.62 20.11"><path d="M20.31,10.2h-1.81v-4.19l-.03-.49-3.2-3.19-.37-.32h-6.49c-1.63,0-2.96,1.33-2.96,2.96v5.24h-1.66c-1.68,0-3.05,1.36-3.05,3.05v5.81c0,1.68,1.36,3.05,3.05,3.05h16.52c1.68,0,3.05-1.36,3.05-3.05v-5.81c0-1.68-1.36-3.05-3.05-3.05ZM7.45,4.96c0-.53.43-.96.96-.96h5.02v2.11c0,.46.38.84.84.84h2.23v6.71H7.45V4.96ZM18.01,18.48c0,.32-.26.59-.59.59H6.67c-.32,0-.59-.26-.59-.59v-.45c0-.32.26-.59.59-.59h10.75c.32,0,.59.26.59.59v.45Z"/></symbol>
    <symbol id="icon-document-solid" viewBox="1.01 1.47 22.06 21.15"><path d="M5.06,10.81c-.39-.19-.85-.28-1.36-.28H1.01v6.68h1.8v-2.18h.86c.81,0,1.46-.2,1.93-.59.48-.4.72-.94.72-1.6,0-.45-.11-.85-.33-1.2-.22-.35-.53-.63-.93-.82ZM4.3,13.38c-.13.13-.33.19-.6.19h-.89v-1.6h.91c.25,0,.43.08.57.23.14.16.21.37.21.64,0,.24-.06.42-.2.55ZM10.99,16.79c.47-.27.84-.66,1.1-1.14.26-.48.39-1.03.39-1.64v-.3c0-.6-.14-1.15-.4-1.64-.27-.49-.64-.87-1.11-1.14-.47-.27-1.01-.4-1.59-.4h-2.2v6.68h2.24c.58,0,1.11-.14,1.57-.42ZM8.97,15.76v-3.79h.4c.42,0,.73.14.94.42.22.29.33.74.33,1.33v.28c0,.59-.11,1.04-.33,1.34-.22.29-.52.43-.92.43h-.41ZM17.84,11.97v-1.45h-4.55v6.68h1.8v-2.56h2.5v-1.44h-2.5v-1.23h2.75ZM22.75,5.46l-3.66-3.66c-.21-.21-.5-.33-.8-.33h-7.66c-1.92,0-3.47,1.56-3.47,3.47v3.56c0,.35.29.64.64.64h.72c.35,0,.64-.29.64-.64v-3.56c0-.81.66-1.47,1.47-1.47h6.73v2.56c0,.58.47,1.06,1.06,1.06h2.66v12.06c0,.81-.66,1.47-1.47,1.47h-8.97c-.81,0-1.47-.66-1.47-1.47v-.1c0-.39-.32-.71-.71-.71h-.59c-.39,0-.71.32-.71.71v.1c0,1.92,1.56,3.47,3.47,3.47h8.97c1.92,0,3.47-1.56,3.47-3.47V6.27c0-.31-.12-.6-.33-.8Z"/></symbol>
    <symbol id="icon-award-solid" viewBox="4.88 1.15 14.32 21.787"><path d="M6.75,22.34c0,.49.55.77.95.48l3.06-2.2c.16-.11.25-.29.25-.48v-3.06c-1.58-.19-3.04-.8-4.25-1.71v6.97ZM19.2,8.31c0-3.95-3.2-7.16-7.16-7.16s-7.16,3.2-7.16,7.16,3.2,7.16,7.16,7.16,7.16-3.2,7.16-7.16ZM16.28,7.39l-1.72,1.81.33,2.47c.04.33-.3.58-.6.43l-2.25-1.08-2.25,1.08c-.3.14-.64-.1-.6-.43l.33-2.47-1.72-1.81c-.23-.24-.1-.64.23-.7l2.45-.45,1.19-2.2c.16-.29.58-.29.74,0l1.19,2.2,2.45.45c.33.06.46.46.23.7ZM13.1,20.14c0,.19.09.37.25.48l3.06,2.2c.39.28.95,0,.95-.48v-6.97c-1.21.91-2.66,1.52-4.25,1.71v3.06Z"/></symbol>
    <symbol id="icon-hourglass-solid" viewBox="5.65 2.7 12.8 18.71"><path d="M17.43,8.06c.02-.08.03-.17.03-.25v-3.11h.26c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-1.26s0,0,0,0H7.63s0,0,0,0h-1.26c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h.26v3.11c0,.07,0,.14.02.21.05.53.24.98.58,1.32l2.95,2.7-2.97,2.73c-.3.3-.49.73-.55,1.24-.02.08-.03.17-.03.26v3.14h-.26c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h11.36c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-.26v-3.14c0-.07,0-.14-.02-.21-.05-.53-.24-.98-.58-1.32l-2.95-2.7,2.97-2.73c.3-.3.49-.73.55-1.24ZM15.46,4.7v2.94s-.01.09-.02.14c0,.05,0,.07-.01.1h-6.78s-.01-.05-.01-.1c0-.04,0-.07-.01-.11v-2.97h6.83ZM15.45,16.3s0,.07.01.11v2.56l-2.81-2.58c-.34-.34-.88-.34-1.22,0l-2.81,2.58v-2.53s.01-.09.02-.14c0-.08.01-.12.02-.15l3.38-3.1s0,0,0,0c0,0,0,0,0,0l3.37,3.1s.02.08.02.15Z"/></symbol>
    <symbol id="icon-podium-solid" viewBox="1.77 2.633 20.55 18.848"><path d="M13.83,11.09h-3.57c-.61,0-1.1.49-1.1,1.1v5.28s0,0,0,0v2.91c0,.61.49,1.1,1.1,1.1h3.57c.61,0,1.1-.49,1.1-1.1v-8.18c0-.61-.49-1.1-1.1-1.1ZM6.44,12.97h-3.57c-.61,0-1.1.49-1.1,1.1v3.4s0,0,0,0v2.91c0,.61.49,1.1,1.1,1.1h3.57c.61,0,1.1-.49,1.1-1.1v-6.31c0-.61-.49-1.1-1.1-1.1ZM22.32,16.69c0-.61-.49-1.1-1.1-1.1h-3.57c-.61,0-1.1.49-1.1,1.1v2.19s0,0,0,0v1.49c0,.61.49,1.1,1.1,1.1h3.57c.61,0,1.1-.49,1.1-1.1v-3.68ZM15.27,4.92l-1.92-.35-.93-1.72c-.16-.29-.58-.29-.74,0l-.93,1.72-1.92.35c-.33.06-.46.46-.23.7l1.35,1.42-.26,1.94c-.04.33.3.58.6.43l1.76-.85,1.76.85c.3.14.64-.1.6-.43l-.26-1.94,1.35-1.42c.23-.24.1-.64-.23-.7Z"/></symbol>
    <symbol id="icon-tag-solid" viewBox="2.025 2.035 20.03 20.03"><path d="M21.39,11.85L12.24,2.71c-.49-.49-1.18-.74-1.88-.66l-5.64.6c-1.08.12-1.93.97-2.05,2.04l-.63,5.67c-.08.7.17,1.39.66,1.89l9.14,9.14c.9.9,2.36.9,3.27,0l6.27-6.27c.9-.9.9-2.36,0-3.27ZM7.72,7.72c-.57.57-1.49.57-2.06,0-.57-.57-.57-1.49,0-2.06.57-.57,1.49-.57,2.06,0,.57.57.57,1.49,0,2.06Z"/></symbol>
    <symbol id="icon-heart-solid" viewBox="2.312 3.628 19.467 16.829"><path d="M21.75,8.51c-.21-2.48-2.17-4.53-4.64-4.84-1.71-.21-3.29.39-4.4,1.47-.37.36-.97.36-1.34,0-1.11-1.08-2.69-1.68-4.4-1.47-2.48.31-4.44,2.38-4.64,4.86-.14,1.71.54,3.27,1.69,4.33l7.29,7.29c.41.41,1.07.41,1.48,0l7.33-7.33h0c1.12-1.07,1.78-2.62,1.64-4.32Z"/></symbol>
    <symbol id="icon-heart-plus" viewBox="0 0 576 512">
      <path d="M298.7 97.64L257 143.7L213.5 97.91C173.6 57.42 110 52.6 70.71 86.82L70.53 86.97C21.8 128.7 19.4 203.3 62.71 248.2L62.73 248.2L256.4 447.9C256.5 447.9 256.6 447.8 256.7 447.7L269.1 434.8C273.4 445.3 278.7 455.3 284.9 464.6L279.4 470.3C266.4 483.2 245.5 483.2 233.5 470.3L39.71 270.5C-16.22 212.5-13.23 116.6 49.7 62.68C102.8 16.41 184.1 24.47 234.3 73.46C235 74.19 235.7 74.92 236.5 75.67L256.4 96.64L275.4 75.67C276.3 74.76 277.2 73.87 278.1 72.99C328.3 24.42 408.3 16.56 463.2 62.68C506.1 100.1 520.7 157.6 507 208.7C497.4 204.2 487.3 200.5 476.8 197.8C486.3 158.8 474.8 115.3 442.4 87C400.9 52.33 338.2 57.7 298.7 97.64V97.64zM499.3 324.7C505.6 330.9 505.6 341.1 499.3 347.3L427.3 419.3C421.1 425.6 410.9 425.6 404.7 419.3L364.7 379.3C358.4 373.1 358.4 362.9 364.7 356.7C370.9 350.4 381.1 350.4 387.3 356.7L416 385.4L476.7 324.7C482.9 318.4 493.1 318.4 499.3 324.7H499.3zM288 368C288 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368C576 447.5 511.5 512 432 512C352.5 512 288 447.5 288 368zM432 480C493.9 480 544 429.9 544 368C544 306.1 493.9 256 432 256C370.1 256 320 306.1 320 368C320 429.9 370.1 480 432 480z"/>
    </symbol>
    <symbol id="icon-whatsapp" viewBox="3.24 3.24 17.62 17.62"><path d="M17.81,3.24H6.29c-1.68,0-3.05,1.36-3.05,3.05v11.52c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05V6.29c0-1.68-1.36-3.05-3.05-3.05ZM17.48,14c-.58,1.6-1.83,2.86-3.42,3.46-1.49.55-3.14.47-4.56-.23l-2.32.58c-.06.01-.11.02-.17.02-.2,0-.39-.08-.53-.24-.17-.18-.24-.44-.17-.7l.61-2.19c-.74-1.42-.85-3.09-.3-4.6.59-1.62,1.86-2.89,3.48-3.47,1.32-.47,2.76-.45,4.06.07,1.54.61,2.75,1.86,3.31,3.42.45,1.26.45,2.64,0,3.9ZM13.8,7.61c-1.07-.42-2.26-.44-3.35-.05-1.34.48-2.39,1.53-2.88,2.87-.47,1.31-.35,2.75.33,3.96l.1.18-.6,2.14,2.23-.55.17.09c1.21.65,2.63.74,3.91.27,1.32-.49,2.35-1.53,2.83-2.86.37-1.04.37-2.18,0-3.22-.46-1.29-1.46-2.32-2.74-2.83ZM14.45,13.93l-.34.29c-.58.5-1.47.44-1.97-.15l-2.12-2.46c-.24-.28-.36-.64-.33-1.02s.2-.71.48-.95l.34-.29c.09-.08.2-.12.32-.12.14,0,.27.06.37.17l.61.7c.18.21.15.51-.05.69l-.24.21c-.1.08-.15.2-.16.32,0,.12.03.25.11.34l.84.98c.17.2.47.22.67.05l.24-.21c.1-.09.22-.13.35-.12.13,0,.25.07.33.17l.61.7c.09.1.13.22.12.35,0,.13-.07.25-.17.33Z"/></symbol>
    <symbol id="icon-instagram" viewBox="1.64 5.18 17.62 17.62"><path d="M10.45,12.15c-1.01,0-1.84.82-1.84,1.84s.82,1.84,1.84,1.84,1.84-.82,1.84-1.84-.82-1.84-1.84-1.84ZM12.97,9.17h-5.05c-1.27,0-2.29,1.03-2.29,2.29v5.05c0,1.27,1.03,2.29,2.29,2.29h5.05c1.27,0,2.29-1.03,2.29-2.29v-5.05c0-1.27-1.03-2.29-2.29-2.29ZM10.45,16.82c-1.56,0-2.84-1.27-2.84-2.84s1.27-2.84,2.84-2.84,2.84,1.27,2.84,2.84-1.27,2.84-2.84,2.84ZM13.56,11.65c-.37.06-.72-.2-.79-.57-.06-.37.18-.74.58-.8.39-.06.73.21.79.58.06.38-.2.73-.58.79ZM16.21,5.18H4.69c-1.68,0-3.05,1.36-3.05,3.05v11.52c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05v-11.52c0-1.68-1.36-3.05-3.05-3.05ZM16.27,16.51c0,1.82-1.48,3.29-3.29,3.29h-5.05c-1.82,0-3.29-1.48-3.29-3.29v-5.05c0-1.82,1.48-3.29,3.29-3.29h5.05c1.82,0,3.29,1.48,3.29,3.29v5.05Z"/></symbol>
    <symbol id="icon-facebook" viewBox="3.24 3.24 17.6 17.62"><path d="M17.81,3.24H6.29c-1.68,0-3.05,1.36-3.05,3.05v11.52c0,1.68,1.36,3.05,3.05,3.05h4.31v-5.46s0-.6,0-.6h-2.18s0-2.45,0-2.45h2.17s0-1.91,0-1.91c0-.72.18-1.4.57-2,.35-.55.86-.92,1.49-1.09.52-.14,1.12-.19,1.61-.17.49.02,1.39.18,1.39.18v2.06s-1.4.05-1.4.05c-.44.06-.76.37-.9.77-.08.26-.11.51-.12.78v1.32s2.33,0,2.33,0l-.33,2.45h-2.01s0,6.06,0,6.06h4.57c1.68,0,3.05-1.36,3.05-3.05V6.29c0-1.68-1.36-3.05-3.05-3.05Z"/></symbol>
    <symbol id="icon-linkedin" viewBox="3.24 3.24 17.62 17.62"><path d="M17.81,3.24H6.29c-1.68,0-3.05,1.36-3.05,3.05v11.52c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05V6.29c0-1.68-1.36-3.05-3.05-3.05ZM7.92,6.9c.64-.06,1.19.4,1.25,1.02.06.63-.4,1.19-1.03,1.25-.62.06-1.19-.39-1.25-1.02-.07-.63.38-1.2,1.02-1.26ZM9.18,17.2h-2.29v-6.87h2.29v6.87ZM17.2,17.2h-2.29s0-3.5,0-3.5l-.04-.52c-.07-.4-.27-.73-.69-.82-.26-.06-.53-.05-.79.02-.48.13-.67.53-.74,1l-.04.63v3.19h-2.29v-6.87h2.29s0,1,0,1c.02,0,.03,0,.04-.02.31-.61.87-.9,1.54-.96.33-.03.65-.02.97.03,1.76.27,2.01,1.8,2.03,3.34v3.49Z"/></symbol>
    <symbol id="icon-xing" viewBox="0 0 24 24"><path d="M18.188 0c-.517 0-.741.325-.927.66 0 0-7.455 13.224-7.702 13.657.015.024 4.919 9.023 4.919 9.023.17.308.436.66.967.66h3.454c.211 0 .375-.078.463-.22.089-.151.089-.346-.009-.536l-4.879-8.916c-.004-.006-.004-.016 0-.022L22.139.756c.095-.191.097-.387.006-.535C22.056.078 21.894 0 21.686 0h-3.498zM3.648 4.74c-.211 0-.385.074-.473.216-.09.149-.078.339.02.531l2.34 4.05c.004.01.004.016 0 .021L1.86 16.051c-.099.188-.093.381 0 .529.085.142.239.234.45.234h3.461c.518 0 .766-.348.945-.667l3.734-6.609-2.378-4.155c-.172-.315-.434-.659-.962-.659H3.648v.016z"/></symbol>
    <symbol id="icon-x-twitter" viewBox="0 0 24 24"><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z"/></symbol>
    <symbol id="icon-star-solid" viewBox="2.413 2.833 19.277 18.431"><path d="M12.86,3.32l2.63,4.86,5.44,1c.73.13,1.01,1.02.5,1.55l-3.81,4,.73,5.48c.1.73-.66,1.28-1.32.96l-4.98-2.39-4.98,2.39c-.67.32-1.42-.23-1.32-.96l.73-5.48-3.81-4c-.51-.53-.22-1.42.5-1.55l5.44-1,2.63-4.86c.35-.65,1.28-.65,1.63,0Z"/></symbol>
    <symbol id="icon-quote-solid" viewBox="4.04 6.37 16.02 11.36"><path d="M17.59,6.37h-2.1c-1.36,0-2.47,1.11-2.47,2.47v2.1c0,1.36,1.11,2.47,2.47,2.47h2.1c.16,0,.32-.02.47-.05v.51c0,1.02-.83,1.85-1.85,1.85h-1.1c-.42,0-.76.34-.76.76v.49c0,.42.34.76.76.76h1.1c2.13,0,3.85-1.72,3.85-3.85v-5.04c0-1.36-1.11-2.47-2.47-2.47ZM8.61,6.37h-2.1c-1.36,0-2.47,1.11-2.47,2.47v2.1c0,1.36,1.11,2.47,2.47,2.47h2.1c.16,0,.32-.02.47-.05v.51c0,1.02-.83,1.85-1.85,1.85h-1.1c-.42,0-.76.34-.76.76v.49c0,.42.34.76.76.76h1.1c2.13,0,3.85-1.72,3.85-3.85v-5.04c0-1.36-1.11-2.47-2.47-2.47Z"/></symbol>
    
    <symbol id="icon-star-half-solid" viewBox="2.413 2.833 19.277 18.431"><path fill="url(#icon-star-half-gradient)" d="M12.86,3.32l2.63,4.86,5.44,1c.73.13,1.01,1.02.5,1.55l-3.81,4,.73,5.48c.1.73-.66,1.28-1.32.96l-4.98-2.39-4.98,2.39c-.67.32-1.42-.23-1.32-.96l.73-5.48-3.81-4c-.51-.53-.22-1.42.5-1.55l5.44-1,2.63-4.86c.35-.65,1.28-.65,1.63,0Z"/></symbol>
    <symbol id="icon-level-basic" viewBox="1.818 2.741 20.46 18.589"><path d="M3.07,4.04c-.68.03-1.22.57-1.24,1.24-.07,1.86.1,5.56,2.34,7.8,1.97,1.97,5.06,2.34,7.05,2.35v5.18c0,.4.32.72.72.72h.56c.4,0,.72-.32.72-.72v-6.54c.06-1.89-.14-5.49-2.34-7.7-2.24-2.24-5.94-2.41-7.8-2.34ZM22.27,3.65c-.02-.49-.41-.88-.9-.9-1.34-.05-4,.07-5.62,1.69-1.61,1.61-1.74,4.27-1.69,5.62.02.49.41.88.9.9,1.34.05,4-.07,5.62-1.69,1.61-1.61,1.74-4.27,1.69-5.62Z"/></symbol>
    <symbol id="icon-level-advanced" viewBox="3.724 2.015 16.657 20.065"><path d="M20.06,17.99l-3.4-4.16h.81c.91,0,1.41-1.05.83-1.76l-3.06-3.75h.7c.65,0,1.01-.76.6-1.26l-3.89-4.76c-.31-.38-.89-.38-1.2,0l-3.89,4.76c-.41.5-.05,1.26.6,1.26h.7l-3.06,3.75c-.57.7-.07,1.76.83,1.76h.81l-3.4,4.16c-.74.9-.1,2.25,1.07,2.25h5.89v1.08c0,.42.34.76.76.76h.59c.42,0,.76-.34.76-.76v-1.08h5.89c1.16,0,1.8-1.35,1.07-2.25Z"/></symbol>
    <symbol id="icon-level-expert" viewBox="0.949 3.557 26.779 16.992"><path d="M27.43,17.71l-8.67-13.32c-.72-1.11-2.35-1.11-3.08,0l-5.36,8.24-1.44-2.21c-.63-.97-2.05-.97-2.68,0l-4.99,7.66c-.69,1.06.07,2.47,1.34,2.47h23.34c1.46,0,2.33-1.61,1.54-2.84ZM19.79,12.51h-5.15c-.58,0-.93-.65-.61-1.13l2.57-3.95c.29-.44.94-.44,1.23,0l2.57,3.95c.32.49-.03,1.13-.61,1.13Z"/></symbol>
    <symbol id="icon-level-kompakt" viewBox="3.92 2.12 16.22 19.85"><path d="M15.1,3.75h-2.06v-.94c0-.38-.31-.69-.69-.69h-.62c-.38,0-.69.31-.69.69v.94h-2.06c-2.79,0-5.06,2.27-5.06,5.06v1.71c0,.52.4.94.91.98v2.29c0,2.35,1.12,4.59,2.99,6,.04.03.08.06.12.08l3.6,1.98c.15.08.32.12.48.12s.33-.04.48-.12l3.61-1.98s.08-.05.12-.08c1.88-1.41,3-3.66,3-6.01v-2.28c.51-.05.91-.46.91-.98v-1.71c0-2.79-2.27-5.06-5.06-5.06ZM17.25,13.78c0,1.7-.8,3.33-2.15,4.37l-3.07,1.68-3.05-1.68c-1.34-1.04-2.14-2.67-2.14-4.37v-2.27h10.41v2.26Z"/></symbol>
    <symbol id="icon-level-spezial" viewBox="0.39 2.607 23.303 18.883"><path d="M23.49,5.33l-1.82-.51c-.09-.03-.17-.1-.19-.19l-.51-1.82c-.08-.27-.47-.27-.54,0l-.51,1.82c-.03.09-.1.17-.19.19l-1.82.51c-.27.08-.27.47,0,.54l1.82.51c.09.03.17.1.19.19l.51,1.82c.08.27.47.27.54,0l.51-1.82c.03-.09.1-.17.19-.19l1.82-.51c.27-.08.27-.47,0-.54ZM16.29,6.81c-.45-.55-1.13-.88-1.85-.88H4.95c-.72,0-1.39.32-1.85.88l-2.17,2.65c-.73.89-.72,2.18.03,3.06l6.91,8.13c.95,1.12,2.68,1.12,3.64,0l6.91-8.13c.75-.88.76-2.16.03-3.06l-2.17-2.65ZM16.1,11.06l-1.82.51c-.09.03-.17.1-.19.19l-.51,1.82c-.08.27-.47.27-.54,0l-.51-1.82c-.03-.09-.1-.17-.19-.19l-1.82-.51c-.27-.08-.27-.47,0-.54l1.82-.51c.09-.03.17-.1.19-.19l.51-1.82c.08-.27.47-.27.54,0l.51,1.82c.03.09.1.17.19.19l1.82.51c.27.08.27.47,0,.54Z"/></symbol>
    <symbol id="icon-layers-solid" viewBox="3.012 2.398 18.075 19.295"><path d="M11.7,2.48L3.44,6.61c-.57.29-.57,1.11,0,1.39l8.26,4.13c.22.11.48.11.7,0l8.26-4.13c.57-.29.57-1.11,0-1.39L12.4,2.48c-.22-.11-.48-.11-.7,0Z"/>
<path d="M3.44,12.74l8.26,4.13c.22.11.48.11.7,0l8.26-4.13c.57-.29.57-1.11,0-1.39l-.76-.38c-.22-.11-.48-.11-.7,0l-6.8,3.4c-.22.11-.48.11-.7,0l-6.8-3.4c-.22-.11-.48-.11-.7,0l-.76.38c-.57.29-.57,1.11,0,1.39Z"/>
<path d="M3.44,17.48l8.26,4.13c.22.11.48.11.7,0l8.26-4.13c.57-.29.57-1.11,0-1.39l-.76-.38c-.22-.11-.48-.11-.7,0l-6.8,3.4c-.22.11-.48.11-.7,0l-6.8-3.4c-.22-.11-.48-.11-.7,0l-.76.38c-.57.29-.57,1.11,0,1.39Z"/></symbol>
    <symbol id="icon-folder-solid" viewBox="2.32 4.21 19.45 15.66"><path d="M18.72,6.26h-6.21c-.46-.5-1.12-1.21-1.54-1.65-.25-.26-.58-.4-.94-.4h-5.28c-1.34,0-2.43,1.09-2.43,2.43v10.18c0,1.68,1.36,3.05,3.05,3.05h13.35c1.68,0,3.05-1.36,3.05-3.05v-7.52c0-1.68-1.36-3.05-3.05-3.05Z"/></symbol>
    <symbol id="icon-logo-form-dot" viewBox="0 0 262 262">
      <path fill-rule="evenodd" d="M208.98,112.20h-44.66c-8.28,0-15-6.72-15-15v-44.66c0-8.28-6.72-15-15-15h-119.32c-8.28,0-15,6.72-15,15v193.97c0,8.28,6.72,15,15,15h193.97c8.28,0,15-6.72,15-15v-119.32c0-8.28-6.72-15-15-15ZM88,148h-38v24h38v38h24v-38h38v-24h-38v-38h-24z"/>
      <rect x="186.44" y="0" width="75.09" height="75.09" rx="15" ry="15"/>
    </symbol>
    <symbol id="icon-check-shield-solid" viewBox="0 0 24 24">
      <path d="M12 2 4 5v6c0 4.5 3.2 8.7 8 10 4.8-1.3 8-5.5 8-10V5l-8-3zm-1.2 14.5L6.5 12.2l1.4-1.4 2.9 2.9 5.3-5.3 1.4 1.4-6.7 6.7z"/>
    </symbol>
    <symbol id="icon-calendar-x-solid" viewBox="2.84 3.01 18.45 18.08"><path d="M17.97,5.13h-1.49v-1.43c0-.38-.31-.69-.69-.69h-.63c-.38,0-.69.31-.69.69v1.43h-4.83v-1.43c0-.38-.31-.69-.69-.69h-.63c-.38,0-.69.31-.69.69v1.43h-1.49c-1.82,0-3.3,1.48-3.3,3.3v9.36c0,1.82,1.48,3.3,3.3,3.3h11.85c1.82,0,3.3-1.48,3.3-3.3v-9.36c0-1.82-1.48-3.3-3.3-3.3ZM19.27,17.78c0,.72-.58,1.3-1.3,1.3H6.12c-.72,0-1.3-.58-1.3-1.3v-7.19h14.45v7.19ZM9.13,17.23l.45.45c.27.27.71.27.98,0l1.49-1.49,1.49,1.49c.27.27.71.27.98,0l.45-.45c.27-.27.27-.71,0-.98l-1.49-1.49,1.49-1.49c.27-.27.27-.71,0-.98l-.45-.45c-.27-.27-.71-.27-.98,0l-1.49,1.49-1.49-1.49c-.27-.27-.71-.27-.98,0l-.45.45c-.27.27-.27.71,0,.98l1.49,1.49-1.49,1.49c-.27.27-.27.71,0,.98Z"/></symbol>
    <symbol id="icon-file-text-solid" viewBox="4.08 1.47 15.91 21.14"><path d="M15.21,15.57h-6.15c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h6.15c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72ZM15.21,12.15h-6.15c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h6.15c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72ZM9.06,8.73c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h6.15c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-6.15ZM19.67,5.46l-3.65-3.65c-.21-.22-.51-.34-.81-.34h-7.66c-1.92,0-3.47,1.56-3.47,3.47v14.2c0,1.92,1.56,3.47,3.47,3.47h8.97c1.92,0,3.47-1.56,3.47-3.47V6.27c0-.3-.12-.6-.33-.8ZM18.01,19.15c0,.81-.66,1.47-1.47,1.47H7.56c-.81,0-1.47-.66-1.47-1.47V4.95c0-.81.66-1.47,1.47-1.47h6.73v2.56c0,.58.47,1.06,1.06,1.06h2.66v12.06Z"/></symbol>
    <symbol id="icon-coffee-solid" viewBox="2.51 0.197 19.06 23.682"><path d="M10.91,4.34s0,0,0,0c.14.14.21.31.21.5s-.07.37-.21.5c-.39.39-.39,1.02,0,1.41.2.2.45.29.71.29s.51-.1.71-.29c.51-.51.8-1.19.8-1.92s-.28-1.41-.8-1.92c0,0,0,0,0,0,0,0,0,0,0,0-.28-.28-.28-.73,0-1.01.39-.39.39-1.02,0-1.41-.39-.39-1.02-.39-1.41,0-1.06,1.06-1.06,2.78,0,3.84,0,0,0,0,0,0ZM19.66,10.63h-2.7v-.13c0-1.04-.84-1.88-1.88-1.88H4.39c-1.04,0-1.88.84-1.88,1.88v9.8c0,1.98,1.6,3.58,3.58,3.58h7.28c1.98,0,3.58-1.6,3.58-3.58v-.8c2.58-.22,4.62-2.37,4.62-5.01v-1.94c0-1.06-.86-1.92-1.92-1.92ZM19.58,14.49c0,1.54-1.14,2.8-2.62,3.01v-4.88h2.62v1.86ZM7.07,4.34s0,0,0,0c.14.14.21.31.21.5s-.07.37-.21.5c-.39.39-.39,1.02,0,1.41.19.2.45.29.71.29s.51-.1.71-.29c.51-.51.8-1.19.8-1.92s-.28-1.41-.8-1.92c0,0,0,0,0,0,0,0,0,0,0,0-.14-.13-.21-.31-.21-.5s.07-.37.21-.51c.39-.39.39-1.02,0-1.41s-1.02-.39-1.41,0c-.51.51-.8,1.19-.8,1.92s.28,1.41.8,1.92c0,0,0,0,0,0Z"/></symbol>
    
    <symbol id="icon-eye-solid" viewBox="1.305 5.27 21.49 13.55"><path d="M22.3,10.79c-1.81-1.96-5.72-5.52-10.25-5.52S3.61,8.83,1.8,10.79c-.66.71-.66,1.8,0,2.51,1.81,1.96,5.72,5.52,10.25,5.52s8.44-3.56,10.25-5.52c.66-.71.66-1.8,0-2.51ZM12.05,15.78c-2.06,0-3.73-1.67-3.73-3.73s1.67-3.73,3.73-3.73,3.73,1.67,3.73,3.73-1.67,3.73-3.73,3.73Z"/></symbol>
    <symbol id="icon-eye-off-solid" viewBox="1.305 3.143 21.49 17.815"><path d="M22.3,10.79c-1.81-1.96-5.72-5.52-10.25-5.52-1.54,0-3,.41-4.33,1.03l-2.94-2.94c-.29-.29-.76-.29-1.05,0l-.37.37c-.29.29-.29.76,0,1.05l2.53,2.53c-1.76,1.13-3.19,2.51-4.09,3.49-.66.71-.66,1.8,0,2.51,1.81,1.96,5.72,5.52,10.25,5.52,1.54,0,3-.41,4.33-1.03l2.94,2.94c.29.29.76.29,1.05,0l.37-.37c.29-.29.29-.76,0-1.05l-2.53-2.53c1.76-1.13,3.19-2.51,4.09-3.49.66-.71.66-1.8,0-2.51ZM12.05,15.78c-2.06,0-3.73-1.67-3.73-3.73,0-.67.19-1.28.49-1.82l5.06,5.06c-.54.31-1.16.49-1.82.49ZM15.28,13.87l-5.06-5.06c.54-.31,1.16-.49,1.82-.49,2.06,0,3.73,1.67,3.73,3.73,0,.67-.19,1.28-.49,1.82Z"/></symbol>
    <symbol id="icon-check-solid" viewBox="4.287 6.107 15.495 11.865"><path d="M8.93,17.6l-4.26-4.26c-.51-.51-.51-1.34,0-1.85l.62-.62c.51-.51,1.34-.51,1.85,0l2.71,2.71,7.08-7.09c.51-.51,1.34-.51,1.85,0l.62.62c.51.51.51,1.34,0,1.85l-8.63,8.63c-.51.51-1.34.51-1.85,0Z"/></symbol>
    <symbol id="icon-x-solid" viewBox="5.957 5.968 12.165 12.165"><path d="M17.74,15.27l-2.17-2.17-1.06-1.06,3.22-3.22c.51-.51.51-1.34,0-1.85l-.62-.62c-.51-.51-1.34-.51-1.85,0l-2.17,2.17h0s-1.06,1.06-1.06,1.06l-3.22-3.22c-.51-.51-1.34-.51-1.85,0l-.62.62c-.51.51-.51,1.34,0,1.85l2.17,2.17h0s1.06,1.06,1.06,1.06l-3.22,3.22c-.51.51-.51,1.34,0,1.85l.62.62c.51.51,1.34.51,1.85,0l2.17-2.17,1.06-1.06,3.22,3.22c.51.51,1.34.51,1.85,0l.62-.62c.51-.51.51-1.34,0-1.85Z"/></symbol>
    <symbol id="icon-plus-solid" viewBox="4.43 4.43 15.24 15.23"><path d="M18.35,10.3h-3.06s0,0,0,0h-1.49s0-4.56,0-4.56c0-.72-.59-1.31-1.31-1.31h-.88c-.72,0-1.31.59-1.31,1.31v3.06s0,0,0,0v1.49s-4.56,0-4.56,0c-.72,0-1.31.59-1.31,1.31v.88c0,.72.59,1.31,1.31,1.31h4.56s0,4.56,0,4.56c0,.72.59,1.31,1.31,1.31h.88c.72,0,1.31-.59,1.31-1.31v-4.56s4.56,0,4.56,0c.72,0,1.31-.59,1.31-1.31v-.88c0-.72-.59-1.31-1.31-1.31Z"/></symbol>
    <symbol id="icon-minus-solid" viewBox="4.43 10.3 15.23 3.5"><path d="M18.35,10.3h-3.06s0,0,0,0H5.74c-.72,0-1.31.59-1.31,1.31v.88c0,.72.59,1.31,1.31,1.31h12.61c.72,0,1.31-.59,1.31-1.31v-.88c0-.72-.59-1.31-1.31-1.31Z"/></symbol>
    <symbol id="icon-money-bill" viewBox="0 0 640 640">
      <path d="M278.7 64.7C296 68.4 307 85.4 303.3 102.7L284.2 192L410.7 192L432.7 89.3C436.4 72 453.4 61 470.7 64.7C488 68.4 499 85.4 495.3 102.7L476.2 192L544 192C561.7 192 576 206.3 576 224C576 241.7 561.7 256 544 256L462.4 256L435 384L502.8 384C520.5 384 534.8 398.3 534.8 416C534.8 433.7 520.5 448 502.8 448L421.2 448L399.2 550.7C395.5 568 378.5 579 361.2 575.3C343.9 571.6 332.9 554.6 336.6 537.3L355.7 448L229.2 448L207.2 550.7C203.5 568 186.5 579 169.2 575.3C151.9 571.6 140.9 554.6 144.6 537.3L163.8 448L96 448C78.3 448 64 433.7 64 416C64 398.3 78.3 384 96 384L177.6 384L205 256L137.2 256C119.5 256 105.2 241.7 105.2 224C105.2 206.3 119.5 192 137.2 192L218.8 192L240.8 89.3C244.4 72 261.4 61 278.7 64.7zM270.4 256L243 384L369.5 384L396.9 256L270.4 256z"/>
    </symbol>
    <symbol id="icon-upload-solid" viewBox="5.13 1.87 13.83 20.35"><path d="M6.32,11.16h2.19v3.4c0,.94.76,1.7,1.7,1.7h3.69c.94,0,1.7-.76,1.7-1.7v-3.4h2.19c.96,0,1.49-1.11.88-1.86l-5.73-7.01c-.46-.56-1.31-.56-1.76,0l-5.73,7.01c-.61.74-.08,1.86.88,1.86ZM17.65,18.72H6.44c-.72,0-1.31.59-1.31,1.31v.88c0,.72.59,1.31,1.31,1.31h11.21c.72,0,1.31-.59,1.31-1.31v-.88c0-.72-.59-1.31-1.31-1.31Z"/></symbol>
    <symbol id="icon-globe-solid" viewBox="2.52 2.52 19.06 19.06"><path d="M12.05,2.52C6.79,2.52,2.52,6.79,2.52,12.05s4.27,9.53,9.53,9.53,9.53-4.27,9.53-9.53S17.3,2.52,12.05,2.52ZM18.68,8.1h-2.92c-.27-1.25-.66-2.4-1.13-3.33,1.71.61,3.14,1.8,4.05,3.33ZM12.02,4.32s0,0,.01,0c.4.11,1.33,1.49,1.89,3.78h-3.75c.56-2.29,1.48-3.67,1.85-3.78ZM9.47,4.77c-.48.93-.86,2.08-1.13,3.33h-2.92c.92-1.53,2.35-2.72,4.05-3.33ZM4.32,12.05c0-.74.11-1.46.31-2.14h3.41c-.08.71-.13,1.44-.13,2.14,0,.53.03,1.06.07,1.58h-3.49c-.11-.51-.16-1.04-.16-1.58ZM5.11,15.42h3.11c.28,1.5.73,2.86,1.29,3.91-1.93-.67-3.51-2.09-4.4-3.91ZM12.1,19.77s-.02,0-.02,0c-.43-.15-1.47-1.77-2.02-4.35h3.98c-.54,2.57-1.56,4.19-1.94,4.35ZM14.31,13.62h-4.53c-.05-.5-.07-1.03-.07-1.58,0-.76.05-1.48.14-2.14h4.41c.08.67.14,1.38.14,2.14,0,.55-.03,1.07-.07,1.58ZM14.58,19.34c.56-1.06,1.01-2.41,1.29-3.91h3.11c-.89,1.82-2.47,3.24-4.4,3.91ZM16.12,13.62c.04-.52.07-1.05.07-1.58,0-.71-.05-1.43-.13-2.14h3.41c.2.68.31,1.4.31,2.14,0,.54-.06,1.07-.16,1.58h-3.49Z"/></symbol>
    <symbol id="icon-info-circle" viewBox="0 0 24 24">
      <path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm1 15h-2v-6h2v6Zm0-8h-2V7h2v2Z"/>
    </symbol>
    <symbol id="icon-at-solid" viewBox="3.22 3.22 17.65 17.65"><path d="M16.68,3.22H7.42c-2.32,0-4.2,1.88-4.2,4.2v9.25c0,2.32,1.88,4.2,4.2,4.2h8.54c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72H7.42c-1.22,0-2.2-.99-2.2-2.2V7.42c0-1.22.99-2.2,2.2-2.2h9.25c1.22,0,2.2.99,2.2,2.2v6.04c0,.82-.67,1.49-1.5,1.49s-1.49-.67-1.49-1.48v-5.57c0-.4-.33-.73-.73-.73h-.54c-.36,0-.65.27-.7.61-.77-.34-1.83-.67-3.06-.67-1.84,0-3.24,1.39-3.24,3.24v3.41c0,1.85,1.39,3.24,3.24,3.24,1.75,0,3.18-.77,3.91-1.26.64.73,1.57,1.21,2.62,1.21,1.92,0,3.48-1.55,3.49-3.46h0v-6.07c0-2.32-1.88-4.2-4.2-4.2ZM13.89,13.46h0s0,0,0,0v.45c-.35.26-1.57,1.08-3.04,1.08-.91,0-1.24-.67-1.24-1.24v-3.41c0-.57.32-1.24,1.24-1.24,1.5,0,2.7.7,3.04.92v3.43Z"/></symbol>
    <symbol id="icon-palette-solid" viewBox="1.96 1.947 20.164 20.203"><path d="M22.1,10.93c-.04-.35-.09-.7-.17-1.06-.84-3.94-4.06-7.06-8.02-7.76C7.51.98,1.96,5.87,1.96,12.05c0,5.58,4.52,10.1,10.1,10.1,4.18,0,1.26-2.76,1.26-3.96,0-1.13,1.92-.89,3.09-.96,3.38-.18,6.05-2.94,5.68-6.3ZM6.29,11.27c-.8,0-1.44-.64-1.44-1.44s.64-1.44,1.44-1.44,1.44.64,1.44,1.44-.64,1.44-1.44,1.44ZM9.55,7.85c-.8,0-1.44-.64-1.44-1.44s.64-1.44,1.44-1.44,1.44.64,1.44,1.44-.64,1.44-1.44,1.44ZM14.43,7.75c-.8,0-1.44-.64-1.44-1.44s.64-1.44,1.44-1.44,1.44.64,1.44,1.44-.64,1.44-1.44,1.44ZM17.75,11.26c-.8,0-1.44-.64-1.44-1.44s.64-1.44,1.44-1.44,1.44.64,1.44,1.44-.64,1.44-1.44,1.44Z"/></symbol>
     <path id="dach-path-de" d="M560.5,190.76L560.41,191.49L560.69,192.59L561.08,192.67L561.23,193.13L560.33,194.96L559.76,195.34L559.57,196.67L559.98,197.38L559.49,199.55L559.09,200.46L557.32,202.14L554.92,203.62L554.86,204.55L555.26,206.27L554.47,207.87L554.87,208.35L556.46,208.62L557.72,210.06L559.24,210.89L561.59,213.96L564.37,215.78L564.71,216.56L565.22,217.03L564.51,218.36L564.65,219.07L565.09,219.46L565.12,219.83L564,221.5L563.36,221.79L563.31,222.48L563.05,223.1L563.41,223.77L563.62,225.37L564.08,226.05L563.9,226.68L564.27,227.24L566.26,227.84L566.8,228.52L566.64,229.46L566.21,229.88L566.61,230.75L566.09,231.69L566.13,232.61L566.48,233.21L567.42,233.72L567.74,234.33L567.46,234.72L567.52,235.45L566.81,236.47L566.97,236.8L566.63,237.37L566.95,238.51L566.62,238.92L566.41,239.9L565.6,240.48L565.33,241.08L564.64,241.46L564.66,241.85L564.27,242.01L564.25,242.63L564.57,243.18L565.39,243.49L565.56,244.19L565.5,244.63L565.75,244.84L565.64,245.35L565.87,245.84L567.31,247.11L567.31,247.43L567.71,248.05L567.64,249.14L567.87,249.83L566.76,251.34L567.13,251.78L567.14,252.39L568.49,252.81L569.69,253.75L571.09,253.98L571.26,254.29L571.76,254.44L572.22,255.36L572.15,255.7L571.94,255.7L572.08,256.19L571.92,256.43L572.09,256.7L572.11,257.44L572.41,257.63L572.21,258.08L572.32,258.7L572.98,259.56L573.08,260.07L573.48,260.33L573.67,261.05L573.58,261.54L573.3,261.74L573.58,262L573.14,262.59L572.87,264.54L572.63,264.81L572.77,265.16L572.57,265.41L572.7,266.06L572.39,266.21L572.31,266.53L572.42,266.72L572.32,267.56L572.1,267.73L572.02,268.43L571.69,268.68L571.31,270.14L571.02,270.29L571.07,270.97L570.78,271.08L570.58,272.14L569.01,273.88L569.11,274.46L568.57,276.01L567.91,276.1L567.43,275.78L566.97,276L566.67,275.37L566.29,275.47L564.84,274.81L565.2,273.51L565.52,273.25L565.47,272.39L564.08,272.98L563.71,272.82L563.62,272.57L564.34,271.36L564.4,270.57L563.68,269.79L563.06,270L563.16,269.76L562.99,269.56L562.31,269.38L562.5,268.68L562.16,268.66L562.18,269.34L561.39,268.92L560.46,269.49L559.94,269.22L559.87,268.83L559.46,268.62L558.97,268.83L558.5,268.28L558.22,268.29L557.91,268.82L557.62,268.86L557.88,269.21L557.77,269.64L557.34,269.84L557.5,270.13L557.33,270.54L557.84,270.88L558.7,270.62L558.76,271L558.24,271.25L558.53,271.45L558.45,271.66L560.2,272.24L560.3,272.6L560.02,272.81L559.98,273.49L559.25,273.39L559.19,273.68L558.24,273.96L557.47,273.6L556.77,273.85L556.82,274.25L556.58,274.75L553.75,275.88L553.51,276.34L552.74,276.38L552.57,276.61L551.68,276.08L550.95,276.48L550.97,276.72L550.59,277.05L549.89,276.93L549.54,277.76L549.86,278.29L549.78,278.56L549.42,278.78L549.02,278.63L548.9,279.12L548.26,279.2L547.26,278.85L546.49,279.14L546.2,278.92L545.82,279.2L545.79,279.46L544.9,278.99L543.61,279.7L542.68,279.55L542.02,279.85L542.36,280.78L541.74,281.56L542,281.71L541.98,282.03L541.38,282.32L540.77,283.21L539.7,282.78L539.22,281.86L538.79,281.68L538.89,282.42L538.04,283.14L537.82,283.08L537.76,283.99L537.08,284.14L536.84,283.57L536.17,283.61L535.97,284.25L535.66,284.53L535.76,284.97L535.08,286.08L535.07,286.5L533.91,286.38L533.77,286L532.81,286.61L531.68,286.32L531.44,287.39L531.46,288.29L530.61,289.26L529.81,289.48L529.92,289.78L529.21,289.1L528.99,289.17L527.24,287.93L527.2,288.32L526.97,288.43L527.03,288.85L526.74,288.27L525.49,288.83L524.94,289.62L524.89,289.98L524.19,289.34L523.71,289.57L523.02,289.38L522.64,289.7L520.84,289.99L520.31,290.85L520.37,291.55L519.93,291.37L519.37,291.8L519.15,292.42L518.48,292.45L518.48,293.4L517.64,293.99L517.54,295.23L517.05,295.07L517.14,295.82L516.94,295.83L516.89,296.2L517.21,296.69L516.97,297.01L517.18,297.32L516.19,297.19L516.24,296.98L515.88,296.54L516.12,296.39L516.21,295.79L515.13,294.89L515.29,294.52L515.7,294.78L515.68,294.52L515.47,294.12L514.37,294.08L514.36,293.54L514.21,293.4L514.31,292.96L514.04,292.78L513.99,292.44L512.25,292.57L512.76,292.95L512.67,293.37L513.07,293.9L512.19,294.39L512.26,294.62L512.06,294.81L512.8,295.35L513.28,295.26L513.2,295.47L513.53,295.67L513.51,296.07L513.79,295.98L513.96,296.42L514.26,296.46L514.09,296.61L514.39,296.88L514.48,297.43L514.65,297.45L514.19,298.39L514.34,299.37L514.92,299.6L514.98,299.87L515.32,299.77L515.27,299.96L515.89,300.45L515.61,301.04L516.77,301.22L516.99,301.88L517.22,301.68L517.83,302.37L518.5,302.43L518.55,302.78L519.15,302.86L519.23,303.14L519.04,303.23L519.17,303.44L519.76,303.09L520.1,303.57L520.38,303.55L520.57,303.84L519.98,304.6L520.13,305.01L521.58,305.51L521.66,306.08L521.03,306.78L520.88,307.42L520.54,307.59L520.55,308.18L520.06,308.26L520.04,308.88L519.86,309.11L520.01,309.85L518.54,310.68L518.57,311.27L519.11,311.83L519.37,312.53L520.22,312.82L520.32,313.06L521.04,313.08L521.19,313.72L520.96,314.39L521.18,314.6L521.08,314.97L521.31,315.02L521.18,315.3L521.85,315.27L521.91,315.96L522.19,316.35L522.15,317.21L522.55,317.73L522.46,317.86L523.12,318.23L523.43,318.04L523.59,318.32L523.5,319.08L523.61,319.43L523.37,319.82L523.86,320.58L523.87,321.19L524.93,321.5L525.09,321.85L525.95,322.46L525.98,323.09L526.47,323.6L526.43,324L527.17,324.2L527.85,324.07L528.51,324.54L528.71,324.47L528.55,323.89L529.85,324.09L530.45,324.43L531.16,325.32L531.62,325.37L531.56,326.21L531.72,326.64L532.11,326.65L532.3,327.09L532.72,327.21L532.86,327.82L533.41,328.13L533.35,328.63L534.61,329.59L534.71,329.9L534.59,330.48L534.75,330.72L535.98,331.47L537.06,331.31L538.05,332.1L538.87,333.23L539.24,333.38L539.22,333.77L539.48,334.33L539.41,334.68L539.57,334.89L539.44,335.51L541.36,336.95L541.63,336.92L541.62,336.08L542.12,335.91L542.43,336.13L543.15,336.04L543.73,337.07L543.74,336.87L544.13,336.69L544.03,337.04L545.04,338.9L545.97,338.98L546.43,338.71L546.97,340.32L547.57,340.5L547.48,340.64L548.03,341.51L547.83,342.05L548.55,342.35L548.24,342.81L548.04,343.67L547.61,344.13L547.97,344.56L548.49,344.63L548.42,344.87L547.98,344.89L548.2,347.32L547.72,347.9L547.84,348.27L547.73,348.57L547.07,349.21L546.87,348.9L546.58,349.23L546.72,349.36L546.53,349.56L546.64,349.91L546.36,350.12L546.29,350.46L544.92,349.85L544.68,349.4L543.68,348.82L543,349.03L541.97,348.16L541.61,348.12L541.48,348.34L541.59,348.54L540.93,348.96L540.96,349.15L540.43,348.9L540.18,349.09L540.43,349.79L540.32,350.09L540.57,350.55L539.92,352.28L540.18,353.11L539.59,354.87L538,356.4L536.35,357.44L534.82,357.37L533.63,357.92L532.77,357.92L531.46,358.54L530.14,360.04L528.32,360.29L527.85,361.37L527.41,361.84L526.88,361.99L526.55,362.76L526,362.63L525.79,363.2L526.06,364.33L527.92,366.12L528.41,367.76L529.23,367.97L529.4,368.49L529.73,368.38L529.8,368.81L531.1,371.3L530.3,372.79L529.52,373.7L529.81,373.75L529.83,373.94L529.66,374.42L529.31,374.59L529.11,375.21L529.5,375.58L530.43,375.69L530.81,375.67L531.19,375.18L531.38,375.21L531.97,375.53L532.71,376.34L532.63,376.87L533.08,377.95L532.33,378.97L532.54,379.38L531.98,379.52L531.92,379.77L532.24,380.21L531.7,381.04L532.02,381.45L532,382.38L531.58,382.53L531.15,383.21L530.55,382.6L530.36,382.92L529.13,382.21L528.57,381.45L527.97,381.19L527.84,380.68L527.25,380.72L526.79,380.4L526.45,379.61L526.76,379.27L526.68,379.03L526.81,378.86L527.37,378.65L526.38,377.97L526,377.45L526.42,377.15L526.51,376.76L526.01,377.05L525.42,376.54L524.3,376.47L523.7,376.85L522.78,376.78L522.18,378.02L521.37,377.92L520.54,378.26L519.29,376.7L519.31,376.1L517.8,376.44L517.14,376.04L515.46,376.59L515.16,376.13L515.65,374.92L515.39,374.61L514.6,375.57L513.54,375.94L513.65,376.54L514.3,377.86L514.46,378.59L514.37,378.84L513.9,378.95L513.87,378.64L513.72,378.59L513.02,378.87L511.88,378.75L511.4,378.45L510.54,378.71L510.33,378.25L509.64,378.61L508.34,378.6L507.14,378.97L506.9,379.59L505.61,379.3L503.17,379.52L502.56,379.2L502.51,379.63L501.92,379.61L501.55,380.39L501.55,381.33L501.17,381.69L499.84,381.96L498.31,381.71L497.28,382.97L497.77,383.11L498.03,383.83L496.3,383.69L496.12,384.03L495.33,384.37L495.3,384.97L494.85,385.3L493.93,385.36L494.53,384.34L493.54,384.16L491.91,384.83L491.79,385.24L491.55,385.34L488.76,385.26L488.61,384.75L488.88,384.57L488.9,384.28L487.76,383.02L487.89,382.72L486.51,382.67L486.59,382.07L487.52,381.72L486.9,380.98L484.62,381.69L484.35,381.54L484.22,381.07L482.9,380.75L482.8,380.3L481.64,380.3L480.89,380L480.46,380.44L480.34,381.08L479.33,381.04L478.6,380.89L477.91,380.41L478.44,379.49L477.51,379.53L477.38,379.74L477.85,380.45L477.4,382.02L477.65,382.6L478.18,382.84L478.13,383.58L478.3,384.25L477.54,384.81L477.39,385.13L477.47,385.69L476.54,386.09L476.47,386.52L475.87,387.12L475.66,387.73L475.29,388.12L473.94,388.62L473.37,389.15L472.59,389L472.03,389.21L472.14,388.41L472.51,388.36L472.87,387.91L472.56,387.44L473.34,385.75L473.14,385.57L472.84,385.83L472.21,385.42L471.94,385.65L471.83,386.18L470.86,385.98L470.45,386.59L470.14,385.25L469.86,384.85L470.58,384.33L470.32,383.96L470.26,383.4L469.84,383.48L469.49,383.12L469.29,382.5L468.39,382.65L468.11,382.19L468.28,382.03L467.65,381.45L467.76,380.69L467.51,380.8L467.61,381.04L467.13,380.96L466.79,381.2L465.89,380.63L465.74,381.25L464.51,380.63L464.73,380.28L464.76,379.67L464.21,379.17L463.74,379.19L463.39,379.53L462.85,381.08L457.21,380.12L451.39,377.25L451.08,377.3L450.69,376.94L448.08,376.36L445.32,377.52L444.93,377.32L444.74,376.66L444.39,376.43L444.57,376.16L444.43,376.02L444.88,376.11L444.85,375.81L443.73,375.5L443.45,375.14L443.59,375L443.53,374.74L443.28,374.84L443.32,375.07L442.72,375.34L442.71,375.7L443.19,375.76L443.54,376.1L443.3,376.24L443.25,376.68L443.01,376.64L441.82,376.12L442.01,375.42L441.52,375.05L441.71,374.54L442.11,374.43L441.74,373.91L441.13,374.18L440.92,373.29L440.53,373.18L440.3,372.82L440.09,373.19L440.26,373.65L439.74,374.08L439.57,373.86L439.53,372.86L438.67,372.83L438.48,372.57L438.36,373.02L438.61,373.14L438.64,373.42L438.41,373.54L438.16,373.3L437.5,373.74L437.3,373.58L436.74,373.76L436.03,374.66L436.12,375.23L435.89,375.23L435.12,375.97L435.43,376.44L435.11,376.75L435.96,377.36L436.4,377.27L436.32,377.58L436.57,377.83L436.52,377.5L436.85,377.73L437.62,377.65L437.75,377.5L437.62,377.17L437.91,377.26L437.99,376.95L438.73,377.1L439.28,376.8L439.74,377.56L439.48,377.87L439.3,377.81L439.45,377.67L439.34,377.42L439.07,377.7L439.26,378.62L438.78,379.14L438.39,379.08L438.45,378.73L438.62,378.68L438.27,378.3L437.47,378.01L437.23,378.49L436.62,378.59L436.16,378.99L436.39,379.53L436.83,379.38L436.94,379.6L436.79,379.73L435.63,380.08L434.93,379.74L434.62,380.08L433.46,379.9L432.85,379.37L432.84,378.94L432.65,378.73L431.99,378.56L431.35,378.88L431.18,378.48L430.91,378.39L430.07,379.2L429.72,379.16L429.46,379.52L428.92,379.59L428.5,380.34L428.04,380.13L427.04,380.56L425.77,380.34L425.43,380.77L424.8,380.57L424.74,379.92L424.37,379.42L423.32,379.58L422.92,379.4L422.37,380.35L420.32,381.1L419.8,381.06L419,380.23L420.08,380.09L420.12,379.88L419.78,379.44L420.19,379.01L419.82,379.29L419.27,379.18L418.74,379.71L418.42,379.67L418.08,379.35L418.11,378.89L417.74,378.54L417.58,378.03L416.66,377.11L416.44,376.01L417.2,374.89L416.82,373.47L417.5,371.54L417.38,370.37L417.9,369.8L417.93,368.76L418.75,367.47L418.45,366.56L417.65,365.53L417.8,362.83L418.25,362.36L418.3,361.64L419.19,360.13L419.67,359.66L420.23,357.14L421.31,356.35L421.05,354.23L421.71,352.37L421.8,351.22L422.38,350.84L422.59,350.45L422.46,348.26L423.28,346.46L424.32,345.79L425.88,343.9L426.05,342.78L426.96,342.68L427.25,341.87L428.02,341.78L428.5,341.35L429.74,338.11L430.75,336.44L431.48,336.16L431.38,335.89L430.8,336.11L430.7,335.78L429.95,335.86L428.57,335.4L427.71,334.62L426.64,334.15L426.14,334.2L425.91,333.7L425.25,333.23L424.95,333.75L424.3,333.52L423.84,334.01L422.33,332.98L421.75,333.6L421.17,333.68L421.04,333.28L420.79,333.45L420.26,333.23L420.3,333.51L419.81,333.66L418.97,333.34L418.94,332.76L418.28,332.43L417.52,332.54L416.77,331.99L416.53,331.28L416.19,330.92L416.06,329.71L414.84,329.85L414.99,329.24L413.37,329.63L413.32,330.53L412.56,330.52L411.92,331.42L410.88,330.95L409.84,331.42L409.59,330.94L409.03,331.25L408.37,330.57L407.92,330.65L408.1,330.24L407.85,330.12L407.46,330.28L407.58,330.95L406.91,331.49L406.69,331.29L406.73,330.74L406.32,329.68L406.46,329L405.99,329.09L405.2,328.39L404.92,328.61L404.48,327.97L404.05,327.96L403.53,328.41L402.84,327.97L402.38,328.29L402.88,329.31L402.52,329.57L402.54,330.04L402.33,330.2L401.17,329.7L400.31,329.84L399.74,329.11L400.15,328.51L400,328.12L399.4,328.19L399.17,327.4L399.28,327.15L398.67,326.82L398.87,326.15L397.7,325.45L397.15,324.83L397.26,324.46L396.72,324L396.65,323.71L397.19,323.89L397.42,323.4L397.05,323.3L397.13,322.79L396.16,322.26L396.1,321.96L396.5,321.66L396.4,321.5L393.83,319.85L393.08,320.24L392.54,320.03L392.54,318.89L392.32,318.16L392.85,317.24L392.37,316.69L392.81,316.62L392.74,316.08L393.67,315.25L394.09,314.09L393.81,313.92L393.86,313.65L395.46,312.19L395.23,311.81L395.67,311.9L395.36,311.5L395.34,310.94L395.7,310.62L395.55,310.27L395.68,310L395.45,309.71L395.95,309.22L395.72,309.02L395.58,309.36L394.72,308.68L394.36,309.04L393.86,309.07L393.18,308.72L392.43,307.77L391.61,308.18L391.39,307.19L391.08,307.27L389.76,306.19L389.71,305.57L389.44,305.44L389.6,305.26L389.62,304.98L389.42,304.76L389.54,304.57L389.18,304.4L389.06,304.59L388.87,303.97L388.69,304.11L388.78,304.45L388.58,304.45L388.32,303.91L388.41,303.4L387.78,303.01L388.05,302.63L387.77,302.48L387.97,302.24L387.65,301.96L387.72,301.61L387.45,301.23L387.51,301L387.2,301L387.62,300.57L387.3,300.58L387.46,300.33L387.42,299.97L387.7,299.93L387.55,299.68L387.75,299.57L387.74,299.23L387.54,299.07L388.11,298.31L388.06,298.06L387.67,297.93L387.97,297.66L387.84,297.45L388,297.14L388.22,297.33L388.88,296.98L388.76,296.21L388.39,295.77L388.6,295.56L388.58,295.27L389.01,295.2L389.39,294.56L390.74,294.24L390.97,293.95L390.88,293.33L391.06,292.9L391.33,292.82L391.29,292.57L391.87,292.44L392.43,293.04L392.46,292.7L393.34,292.44L393.4,292.02L392.02,290.55L392.52,289.78L392.53,289.2L392.75,288.71L392.66,288.1L392.01,287.84L391.94,287.38L392.22,286.97L390.54,286.43L389.62,286.76L389.24,285.92L388.84,285.73L389,285.39L388.63,285.22L388.58,284.72L389.16,284.34L389.61,283.65L389.99,283.68L390.03,283.25L390.51,282.75L390.52,282.45L389.04,282.24L388.79,282.56L388.61,282.46L388.75,282.26L388.44,281.91L388.74,281.67L387.98,280.63L387.43,279.38L385.86,279.1L385.72,279.4L385.63,278.99L385.78,278.56L385.24,277.98L385.42,277.57L384.34,276.85L384.57,276.41L384.96,276.66L385.41,276.23L385.29,275.21L386.06,274.88L386.44,275.19L386.75,274.31L386.46,273.66L386.88,272.77L386.03,272.69L385.96,272.44L385.3,272.29L385.24,271.68L385,271.54L385.41,270.64L384.21,270.8L383.93,270.51L382.76,270.94L382.66,270.75L382.87,270.51L382.9,270.04L382.37,269.5L382.24,269.16L382.35,268.93L382.08,268.52L383.06,267.91L383.57,268.95L384.03,268.93L384.46,267.71L385.11,267.07L385.8,266.78L386.09,266.31L386.69,265.98L386.8,265.64L388.29,265.17L388.53,264.89L387.81,264.37L388.7,263.92L388.35,263.66L386.98,264.46L386.61,264.39L386.3,262.83L386.68,262.69L386.38,262.06L387.45,261.01L388.41,259.08L388.91,258.97L388.86,258.77L389.6,258.05L389.36,257.23L389.6,256.77L389.19,256.79L389.55,254.52L389.35,253.02L388.6,252.14L388.24,251.32L386.79,249.87L387.32,248.18L385.56,247.58L385.46,246.35L385.8,246.13L384.75,245.42L383.95,245.4L383.96,244.98L384.67,244.49L384.53,244.22L384.69,243.91L384.35,243.8L384.41,243.39L383.77,242.9L384.03,242.74L383.75,242.52L384.09,242.1L384.61,242.3L385.16,242.14L386.01,241.61L386.23,241.15L386.97,241.68L388.36,241.95L388.32,241.28L387.91,240.96L387.78,240.45L387.09,240.2L387.37,239.89L388.42,239.92L388.87,240.26L388.77,240.56L389.32,241.01L390.74,240.84L391.14,241.03L391.28,241.65L392.28,241.69L392.49,242.12L393.29,242.42L393.31,241.78L393.47,241.56L392.98,241.21L393.08,240.82L393.91,241.35L394.28,241.13L394.7,241.53L395.3,241.31L396.25,240.5L396.56,240.55L399.18,239.37L399.98,240.09L400.17,240L401.34,238.97L401.57,237.97L402.17,237.79L402.22,237.03L400.61,235.62L399.23,235.23L399.37,234.18L400.26,234.02L400.52,233.7L400.4,233.42L400.66,233.27L400.77,232.54L402.74,232.47L403.09,232.13L403.29,231.24L403.82,230.58L404.72,230.41L405.43,228.9L406.59,228.84L407.08,228.35L406.33,227.26L406.3,226.7L407.27,224.58L407.29,223.85L406.97,222.96L406.5,222.9L405.97,221.94L405.56,220.63L404.53,221.75L402.69,221.26L402.69,220.94L400.68,220.82L399.44,219.99L399.58,218.8L399.06,217.71L399.79,217.86L400.01,217.37L400.86,217.38L399.87,216.41L400.03,215.56L399.75,215.12L400.57,214.43L403.11,214.24L404.42,214.79L405.22,214.48L406.61,214.96L406.9,214.61L407.25,208.86L407.69,207.87L407.58,207.48L409.58,204.27L410.29,202.04L409.92,199.47L409.96,198.31L409.58,198.03L409.5,197.45L410,196.21L410.5,196.05L410.11,195.69L410.3,195.35L410.13,193.81L410.52,193.16L410.66,192.57L410.53,192.07L410.85,191.18L412.19,191.07L409.62,190.62L406.28,190.54L405.7,189.64L405.69,189.3L405.96,188.88L405.96,187.4L406.27,185.38L406.76,184.61L406.42,183.68L406.56,183.52L406.9,184.46L408.06,184.55L406.99,184.45L406.86,184.31L406.97,184.01L406.61,183.52L406.87,183.61L407.15,184.17L407.41,184.01L407.35,183.67L407.64,184.26L407.94,184.4L407.85,183.96L408.33,183.93L408.65,183.58L408.55,183.41L408.76,183.34L408.45,183.39L407.57,182.32L407.66,181.98L408.62,181.1L409.09,180.27L410.86,178.84L411.76,178.52L413.17,178.27L415.8,178.38L416.72,178.81L420.44,177.67L420.44,177.13L420.46,177.69L420.62,177.76L421.94,177.63L422.6,177.41L423.12,176.63L422.66,177.51L424.8,177.13L426.94,177.37L427.36,177.67L427.15,178.44L427.55,179.82L428.15,179.63L428.68,180.15L429,180.01L428.92,179.83L429.08,180.02L428.7,180.19L429.03,180.71L429.35,180.69L429.06,180.76L429.22,181.32L430.19,183.3L429.86,184.33L428.61,184.8L427.9,184.64L428.07,185.96L428.7,186.75L429.71,186.55L430.84,188.18L431.75,188.41L432.48,187.85L433.21,186.1L433.11,184.09L431.39,184.14L431.7,181.97L432.5,180.93L433.68,180.89L434.65,182.23L436.32,182.97L437.14,183.06L437.42,182.82L437.53,183.21L438.12,183.49L438.24,184L438.53,184.04L438.64,183.49L438.32,182.98L438.48,182.54L438.25,182.63L438.2,182.27L438.35,182.11L438.08,182.19L438.07,182.54L437.75,181.91L437.72,181.52L436.72,179.36L436.68,178.2L437.89,174.67L438.01,174.69L437.87,174.52L437.96,174.04L438.46,172.65L438.64,172.68L439.25,171.72L439.15,171.62L439.89,171.14L440.99,170.95L440.98,171.37L441.47,171.64L441.43,172.05L441.7,172.34L441.47,171.83L443.28,173.09L445.28,173.24L447.93,172.79L447.83,172.01L447.27,171.01L446.59,170.77L445.54,169.49L444.96,168.15L445.06,167.89L444.62,167.38L445.05,167.06L444.61,167.33L444.04,166.34L443.46,166.33L445,165.55L445.87,165.72L446.12,166.07L446.64,165.93L447.02,165.71L447.2,165.15L446.65,164.9L447.06,164.71L446.43,163.94L446.68,163.86L446.4,163.86L446.01,162.53L445.34,162.44L444.52,162.92L443.92,162.08L443.52,161.09L443.64,160.11L444.14,159.28L444.19,158.87L444.04,158.63L444.26,158L444.16,157.11L443.92,156.81L442.99,157.18L442.44,156.84L441.6,156.88L440.92,157.5L441.07,157.63L440.78,157.7L440.09,157.37L439.2,156.06L439.39,156.73L438.95,156.37L439.34,156.98L438.73,156.2L439.12,154.69L439.53,154.46L439.52,154.86L439.89,154.98L440.28,154.57L440.69,154.57L440.84,154.44L440.74,154.11L440.99,154.04L439.26,153.97L439.21,153.59L439.52,153.28L443.76,152.36L444.76,152.63L445.84,151.9L446.66,150.82L447.52,150.63L447.64,150.14L448.21,150.34L448.54,150.17L448.1,150.3L447.55,150.04L447.71,149.82L447.62,149.38L447.17,148.6L446.64,148.91L446.71,149.23L446.27,149.62L446.27,150.02L446.04,150.41L445.34,150.77L444.24,150.75L443.44,150.39L443.69,149.82L443.43,149.37L444.4,148.77L444.87,148.1L444.78,147.02L445.15,146.1L444.76,145.73L443.6,145.81L443.5,145.57L444.04,145.4L444.18,145.06L443.86,144.6L443.82,144.04L442.32,142.8L442.29,142.12L442.07,141.73L441.06,141.22L441.01,140.94L441.36,140.72L441.09,139.61L440.73,138.86L440.42,138.86L440.1,138.08L439.25,137.05L439.31,136.19L439.1,135.49L437.29,135.54L435.26,136.81L434.49,136.38L434.22,135.77L433.72,135.63L433.6,136.19L432.88,136.68L432.77,137.54L432.92,137.82L432.89,138.41L432.73,138.89L432.92,139.33L432.78,140.11L432.87,140.61L432.48,140.3L432.56,136.72L432.82,134.48L434.91,129.27L435.36,129.14L436.33,129.51L434.95,129.54L435,129.94L435.4,129.92L435.86,130.38L435.82,130.69L434.61,131.32L434,132.4L434.21,132.76L434.18,134.2L434.36,134.89L435.54,135.65L439.16,135.31L439.88,134.89L439.88,134.43L440.81,134.41L441.79,135.04L442.79,135.1L443.55,134.61L444.55,134.95L445.36,134.67L446.38,134.75L448.5,135.85L450.51,135.82L452.4,136.63L452.58,136.92L452.4,137.28L452.69,138.1L453.18,138.03L453.62,138.42L453.63,138.2L453.86,138.2L454.66,138.46L455.29,137.78L455.47,137.11L456.03,136.95L456.61,138.09L456.46,138.48L456.61,138.79L456.66,138.36L457.24,137.64L457.91,137.65L458.26,137.1L459.66,136.16L459.79,135.72L460.25,135.75L459.82,136.71L460.14,137.37L464.1,138.62L465.11,140.05L465.75,140.22L466.06,139.64L466.46,139.63L466.31,139.48L466.43,138.59L467.5,139.23L467.86,139.91L468.16,141.44L469.18,142.61L469.12,143.11L468.96,142.89L469.13,142.67L469.03,142.5L468.37,142.58L468.37,143.12L468.6,143.49L469.09,143.3L468.72,143.55L469.08,143.54L468.98,147.47L468.38,148.53L467.67,149.19L465.69,150.24L465.13,150.15L465.09,150.49L465.61,151.17L466.61,151.01L466.9,150.77L466.81,150.66L471.04,149.85L472.59,150.91L471.97,151.64L472.36,152.5L472.4,153.28L471.78,153.46L471.89,153.7L471.65,154.05L471.4,154.01L471.57,154.25L471.37,154.59L471.7,155.15L471.18,156.04L472.07,155.42L471.96,155.29L472.12,154.29L472.49,154.1L472.44,153.65L473.15,152.4L474.26,152.25L474.6,151.78L475.18,151.62L476.71,152.04L478.44,153.26L481.14,154.33L483.09,156.31L484.89,156.03L486.55,154.42L487.83,153.54L489.66,153.61L488.85,153.79L489.8,154.03L490.79,153.76L491.53,152.96L491.55,153.3L491.92,153.23L492.02,153.48L491.9,153.89L491.05,154.48L490.87,154.86L490.92,154.62L490.7,154.41L490.47,154.58L490.56,154.89L490.78,154.81L491.22,160.14L488.27,162.18L486.57,164.15L485.59,164.03L485.36,163.85L485.38,163.54L485.11,163.67L484.91,164.52L484.08,165.45L484.08,165.87L484.78,167.23L486.56,167.46L486.86,167.92L486.81,168.63L487,168.71L487.78,168.46L490.08,166.95L493.02,166.64L493.61,167.59L494.69,167.75L494.42,168.13L494.33,168.74L494.56,169.4L495.29,169.6L496.27,168.62L496.95,169.51L497.74,169.46L497.69,169.97L498.27,170.28L498.37,170.75L498.88,170.83L498.9,170.63L498.69,170.65L498.56,170.32L499.3,169.73L499.36,168.34L499.12,168.49L499.12,168.24L498.93,168.26L498.74,168.71L498.57,168.63L498.55,167.22L498.19,167.69L498.15,168.55L497.52,168.1L497.33,168.34L497.64,168.43L497.38,168.38L497.11,167.85L497.15,167.29L498.61,166.35L499.51,166.37L499.5,167.08L499.29,166.88L499.28,167.8L499.04,168.11L499.54,168.3L499.71,167.7L499.52,167.41L499.92,166.69L500.44,166.4L500.1,166.24L500.12,166.04L500.66,166.25L501.25,165.96L501.5,165.47L501.41,164.91L502,164.68L502.34,164.02L502.04,163.54L501.83,163.54L500.34,165.37L500.43,164.59L500.27,164.54L500.92,163.76L501.97,163.35L503.45,161.74L505.07,161.66L506.94,162L510.36,160.83L512.74,160.62L514.01,158.7L517.14,156.62L518.65,153.69L519.59,152.74L520.56,150.27L520.94,149.9L521.22,149.94L520.93,150.26L521.06,150.42L521.9,150.97L524.09,151.37L529.28,151.26L529.48,151.91L528.43,152.38L527.35,152.13L526.93,152.56L526.56,152.31L525.52,152.33L525.28,151.8L524.71,151.74L524.11,152.12L524.03,152.58L523.36,152.13L523.45,151.97L522.87,152.56L522.17,152.76L522.21,153.02L522.62,153.2L522.51,153.38L521.69,153.25L521.01,153.7L521.33,154.15L521.76,153.75L523.09,153.86L524.07,153.27L524.14,153.07L523.9,152.88L524.14,152.62L524.84,152.48L525.04,152.78L524.48,152.92L524.6,153.39L524.26,153.92L524.47,153.92L524.39,153.79L524.76,152.93L525.05,152.93L525.16,153.89L525.5,153.95L525.71,153.51L525.89,153.91L526.16,153.91L526.52,153.04L526.54,153.56L526.91,153.89L527.09,154.89L527.19,154.63L527.75,154.65L528.54,154.03L528.87,152.85L529.43,152.41L531.53,151.54L531.77,152L531.5,152.4L531.57,152.99L532.03,153.57L532.68,153.54L532.97,154.03L532.61,154.77L532.87,155.76L533.43,156.45L533.19,156.71L533.22,157.11L533.83,157.6L534.23,157.6L534.49,157.28L534.78,157.55L534.36,157.66L534.04,158.15L534.51,157.7L534.94,157.68L535.52,158.26L535.57,158.62L537.06,158.8L537.78,160.56L538.76,160.7L538.12,160.85L537.65,161.44L538.88,160.88L539.53,161.22L539.23,160.71L539.72,160.96L539.84,161.18L539.67,161.46L539.54,161.3L538.95,161.76L538.99,162.02L539.34,161.97L539.53,161.63L539.52,161.94L539.98,162.29L540.2,163.22L540.72,164.03L541.47,164.1L540.97,163.02L541.26,162.73L544.07,162.14L545.52,161.03L545.87,161.14L545.98,161.37L545.55,161.54L545.64,161.88L546.32,162.31L546.67,162.17L546.59,162.36L546.87,162.64L546.76,162.88L547.77,163.65L547.49,164.89L547.19,165.05L547.31,165.49L546.55,166.15L546.82,166.16L546.9,166.62L547.59,167.31L548.42,167.7L548.85,168.44L548.91,168.95L549.41,168.96L550.1,169.92L549.85,170.36L549.07,170.71L548.7,171.49L548.23,171.53L548.25,171.96L547.84,172.14L548.13,172.76L548.81,172.76L549.79,174.13L550.16,174.04L551.26,175.21L554.04,176.36L555.38,176.29L555.7,176.52L556.73,175.6L557.47,176.06L557.57,176.45L557.45,176.69L556.39,177.68L557.03,177.98L557.58,177.9L557.77,178.59L557.52,178.95L557.81,179.14L557.83,180.08L558.51,180.68L558.32,183.27L558.71,184.62L559.28,185.1L559.37,186.22L559.68,186.54L559.71,187.97L560.16,189.22L560.09,189.92L560.38,190.18L560.5,190.76ZM540.04,142.7L540.16,142.94L539.96,143.54L539.22,143.86L538.87,144.49L539.19,145.75L539.77,146.49L540.65,146.78L544.24,146.25L545.16,147.01L545.19,148.1L544.97,148.54L543.07,150.08L542.93,150.8L543.24,151.87L543.8,152.75L545.04,152.88L545.69,153.53L546.39,154.71L546.99,154.96L546.46,155.2L546.03,156.04L546.09,157.41L545.84,157.6L545.32,157.1L545.81,157.19L545.66,156.61L544.79,156.91L544.49,156.57L545.57,155.9L545.7,155.52L545.02,155.4L543.74,155.88L545.14,155.1L545.26,154.71L544.46,154.77L544.02,155.21L544.15,155.36L543.86,155.41L543.21,154.57L542.55,155.03L541.65,154.9L540.72,155.44L540.69,155.85L539.81,156.38L539.07,157.7L539.17,157.22L538.38,157.56L538.4,158.12L538.56,158.3L538.71,158.2L538.54,158.01L538.65,157.76L538.96,158.14L539.47,157.74L539.75,158.12L539.9,158.68L539.22,159.29L537.1,158.25L537.75,158.43L538.01,157.25L537.49,157.69L537.7,157.98L536.64,158.13L535.71,157.56L535.62,157.25L535.54,157.51L535.21,157.55L535.13,157.04L535.27,156.84L535.08,156.6L534.82,156.93L533.94,157.1L533.98,156.62L534.33,156.32L534.9,156.51L533.42,155.32L533.7,153.94L535.13,153.77L535.66,154.04L536.47,153.46L535.97,153.33L535.84,152.84L536.33,152.74L535.89,152.75L535.99,152.57L535.61,152.38L535.45,151.83L534.17,152.09L534.55,151.01L534.75,150.9L533.79,151.36L533.58,151.34L533.59,151.06L534.07,150.09L534.57,149.59L535.77,149.9L535.61,149.91L535.73,150.37L535.5,150.52L535.73,150.41L535.66,150.59L534.92,150.58L534.83,150.88L535.18,151.2L535.32,150.75L536.29,150.62L535.87,150.49L536.67,150.01L535.79,149.84L535.8,148.93L535.18,149.21L534.58,149.03L534.4,148.16L534.27,147.85L533.95,147.83L534.04,147.66L536.11,147.34L537.05,147.81L537.18,148.08L537.03,148.53L537.37,148.81L537.53,148.47L537.39,148.38L537.45,147.88L537.23,147.42L538.58,146.44L538.73,146.57L538.38,147.46L538.11,147.55L538.42,147.7L538.87,147.2L538.91,147.61L539.66,148.62L539.48,149.03L539.63,149.54L540.25,149.79L540.43,150.35L540.89,149.96L541.52,150L541.47,149.58L541.77,148.75L541.54,147.65L541.28,147.21L541.66,147.24L541.7,146.98L541.24,147.09L541.26,147.49L540.32,147.47L539.89,146.86L539.22,146.68L538.74,145.21L537.87,145.96L537.93,146.38L536.11,147.2L536.41,146.01L536.94,145.12L536.96,144.09L535.77,144.84L535.97,145.74L535.78,146.18L534.39,147.22L534.47,146.81L535.57,145.84L535.75,145.33L535.6,144.37L536.16,143.65L537.07,143.04L540.04,142.7ZM547.91,161.22L548.55,162.73L549.27,163.61L552.27,165.32L555.87,169.17L556.65,169.72L555.77,170.24L556.17,170.33L556.38,170.69L556.39,171.83L552.69,171.63L551.72,172.54L550.66,172.7L550.27,172.56L550.86,172.44L550.94,172.17L550.39,171.79L550.23,172.52L549.81,172.82L548.28,172.47L548.17,172.26L548.49,171.71L549.77,171.47L550.28,171.11L550.6,170.39L550.28,168.95L549.74,168.4L549.99,167.56L551.12,167.52L551.15,168.13L551.28,168.19L550.9,168.66L550.99,169.47L551.29,168.94L551.2,168.69L551.54,168.52L552.37,168.5L552.12,168.9L552.74,169.22L552.64,168.92L552.89,167.71L552.73,166.75L552.28,166.42L552.29,166.64L552.03,166.78L551.8,165.63L551.28,164.95L550.01,164.92L550.14,165.01L549.96,165.59L550.1,165.52L550.5,166.16L550.29,166.35L550.35,166.59L550.13,166.4L550.38,166.07L550.26,165.92L549.75,166.74L548.97,167.14L548.82,166.66L549.14,165.91L549.38,165.79L548.89,165.45L548.2,165.82L547.7,166.49L547.06,166.46L546.99,166.07L547.14,165.73L547.35,165.78L547.97,163.67L547.85,163.31L547.24,162.89L547.11,162.41L546.78,162.27L546.63,161.51L547.42,160.98L547.91,161.22ZM490.97,148.19L492.81,148.54L493.97,149.11L495.48,151.76L495.81,152.81L494.43,152.46L493.37,152.63L493.31,152.42L494.01,152.35L493.25,152.15L492.9,152.17L492.76,152.46L493.18,152.59L492.98,152.82L491.78,152.8L491.27,152.56L491.4,151.72L491.08,151.17L490.61,151.01L489.74,151.34L490.26,151.86L489.43,151.37L489.47,149.9L489.86,148.97L490.52,148.11L490.97,148.19ZM437.6,140.07L438.88,140.45L438.8,141L439.14,141.43L438.68,142.01L438.47,142.84L436.74,142.83L435.01,142.08L434.84,141.69L435.17,140.77L435.55,140.4L437.6,140.07ZM441.35,147.22L441.38,147.93L441,148.56L441.17,148.7L441.01,148.94L441.26,149.24L440.99,149L440.62,149.53L439.63,149.71L438.9,148.77L438.88,148.27L439.02,148.08L441.35,147.22ZM401.85,181.34L400.65,181.46L399.87,181.87L400.73,182.45L400.69,182.73L400.25,182.88L400.29,182.5L400.15,182.4L399.85,182.49L399.93,182.76L399.67,182.75L398.72,182.1L398.54,181.42L400.54,180.59L401.85,181.34ZM434.62,144.28L434.59,144.58L435.02,144.71L434.62,144.88L434.93,145.17L434.14,145.32L432.68,143.29L434.17,141.6L433.7,142.49L434.18,143.91L434.62,144.28ZM412.75,176.88L412.99,177.11L411.38,177.64L410.09,177.57L409.81,177.84L409.33,177.54L408.96,177.9L408.63,177.54L409.68,176.97L412.75,176.88ZM417.82,175.71L418.94,176.06L416.46,176.3L416.03,177.01L415.58,177.05L415.42,176.73L415.76,175.89L417.82,175.71ZM534.08,145.63L534.3,146.68L534.08,146.04L534.05,146.63L533.91,145.86L533.64,146.3L533.34,146.32L533.47,146.66L533.31,146.89L533.45,147.96L532.98,148.36L532.97,148.69L532.84,148.61L532.56,149.33L532.64,150.04L532.39,150.82L532.3,150.15L533.09,147.23L533.12,146.06L533.61,145.58L534.08,145.63ZM420.84,174.9L422.8,175.22L421.55,175.68L420.29,175.5L420.02,175.96L419.67,175.7L420.09,175.05L420.84,174.9ZM436.71,150.99L437.13,151.05L437.06,151.36L437.47,151.8L437.3,151.85L437.33,152.09L436.65,152.32L435.97,150.93L436.34,150.43L436.71,150.99ZM407.4,178.25L407.8,178.46L405.69,178.86L405.2,178.69L403.68,179.04L402.93,178.94L407.4,178.25ZM440.48,143.61L440.15,144.27L438.83,144.47L438.08,145.07L437.68,144.72L437.94,144.4L439.93,143.92L440.49,143.39L440.48,143.61Z"/>
     <path id="dach-path-ch" d="M420.69,380.88L422.37,380.35L422.92,379.4L423.32,379.58L424.37,379.42L424.74,379.92L424.8,380.57L425.45,380.77L425.77,380.34L427.06,380.56L428.04,380.13L428.51,380.33L428.89,379.61L429.46,379.52L429.72,379.16L430.07,379.2L430.83,378.4L431.18,378.48L431.41,378.86L431.99,378.56L432.69,378.75L432.83,378.85L432.85,379.37L433.46,379.9L434.63,380.08L434.96,379.74L435.69,380.07L436.76,379.75L436.94,379.59L436.83,379.38L436.39,379.53L436.16,378.99L437.23,378.49L437.5,378.01L438.27,378.3L438.62,378.68L438.35,379.03L438.78,379.14L439.26,378.56L439.07,377.7L439.34,377.42L439.45,377.67L439.32,377.86L439.48,377.87L439.76,377.49L439.28,376.8L438.69,377.1L437.99,376.95L437.91,377.26L437.62,377.17L437.68,377.63L436.94,377.59L436.94,377.75L436.54,377.49L436.39,377.77L436.41,377.28L435.93,377.35L435.11,376.75L435.43,376.44L435.11,375.99L435.89,375.23L436.12,375.23L436.02,374.69L436.73,373.77L437.3,373.58L437.5,373.74L438.15,373.3L438.41,373.54L438.64,373.42L438.61,373.14L438.36,373.02L438.43,372.59L438.66,372.82L439.53,372.86L439.56,373.84L439.74,374.08L440.26,373.65L440.09,373.19L440.24,372.84L440.92,373.29L441.13,374.18L441.55,373.88L441.84,374.02L442.06,374.48L441.71,374.54L441.52,375.05L442.01,375.42L441.82,376.12L443.01,376.64L443.24,376.71L443.3,376.24L443.54,376.1L443.19,375.76L442.71,375.7L442.72,375.34L443.32,375.07L443.28,374.84L443.5,374.75L443.59,375L443.45,375.14L443.73,375.5L444.85,375.81L444.88,376.11L444.57,375.96L444.41,376.5L444.74,376.66L444.93,377.32L445.32,377.52L447.97,376.34L449.37,376.55L451.39,377.25L457.21,380.12L458,380.25L459.3,381.94L459.32,382.27L459.97,383.2L460.32,383.04L460.47,383.31L461.27,383.53L460.99,384.15L461.13,384.97L461.58,385.44L461.58,385.72L461.18,386.15L460.56,386.21L460.16,386.66L459.72,387.86L459.18,388.27L458.95,388.88L458.62,389.15L457.69,391.89L458.18,393.26L458.38,394.54L458.24,394.88L457.4,395.5L457.46,395.86L457.59,395.75L457.67,395.97L457.82,395.74L458.78,395.49L459.21,395.98L460.14,395.59L460.75,395.91L460.99,395.66L461.73,395.57L462.54,396.15L463.88,396.32L465,397.09L465.5,396.78L465.89,396.86L465.73,397.19L466.1,397.49L466.17,397.82L465.72,398.6L465.88,398.78L465.83,399.44L467.13,400.15L467.89,400.07L468.02,400.39L468.81,400.58L469.49,401.3L469.56,401.72L470.23,401.75L470.63,402.35L471.94,402.07L472.46,401.58L473.24,401.58L473.31,401.02L473.13,400.65L473.47,399.58L474.61,399.93L475.02,399.75L474.83,399.08L475.24,398.89L475.65,397.79L476.72,397.57L477.32,398.21L477.24,398.68L478.62,399.36L478.34,400.77L478.12,401L478.23,402.11L477.93,403.16L477.6,403.74L477.18,403.88L477.59,404.45L477.68,404.92L476.79,405.63L477.13,406.1L477.09,406.35L476.47,407.13L476.81,408.62L477.74,408.49L478.66,409.33L478.41,411.01L478.31,411.42L477.88,411.78L477.12,411.17L476.67,411.37L475.73,411.05L475.44,411.4L475.24,411.17L474.58,411.19L474.39,410.55L473.54,410.39L473.44,409.94L473.81,409.35L473.4,408.63L472.88,409.13L472.35,408.87L471.11,409.5L470.53,409.35L470.5,410.23L470.09,410.44L470.11,410.81L469.33,411.51L469.54,412.11L469.29,412.48L469.41,412.73L469.29,413.34L469.52,413.77L469.23,414.37L470.09,415.1L471.11,414.8L471.49,415.05L471.51,415.38L471.86,415.41L471.8,416.07L471.08,416.41L471.09,416.9L470.65,417.18L470.6,417.8L470.83,418.35L471.6,418.97L472.08,420.01L471.21,421.01L470.3,420.94L469.87,421.25L469.35,420.89L469.66,420.31L469.55,419.83L468.28,419.06L468.43,418.36L468.01,418.09L468.32,417.21L467.66,416.84L467.49,416.4L466.84,416.78L466.45,416.33L465.73,416.85L465,416.89L463.75,417.71L462.89,417.26L462.64,417.48L462.5,418.05L462.65,418.34L462.41,418.97L461.54,418.72L460.71,419.19L459.13,418.56L458.94,418.7L458.32,417.96L457.92,416.74L457.16,416.51L457.27,415.93L456.99,415.11L457.2,413.36L456.8,413.12L457.08,413.01L457.17,412.41L456.59,412.71L456.08,413.69L455.31,413.15L455.19,412.78L455.31,412.59L455.06,412.42L453.28,412.82L453.15,414.08L452.67,414.28L452.65,414.47L452.76,414.87L453.33,415.32L453.28,416.04L453.41,416.16L453.22,416.64L453.66,417.14L453.58,417.71L453.71,417.97L453.38,418.38L453.42,418.84L452.75,419.76L452.67,420.75L452.09,420.79L452.05,421.31L451.67,421.6L451.53,422.38L451.25,422.72L450.87,422.72L449.96,423.74L448.98,424.23L449.3,425.22L449.05,425.89L447.82,426.33L447.6,426.75L448.06,428.09L447.39,428.46L447.3,428.79L447.79,429.08L447.9,430L448.73,430.22L449.09,430.55L449.07,430.88L449.37,430.92L448.52,431.91L448.55,432.21L448.15,433.05L448.25,433.29L447.29,433.27L447.43,432.86L446.71,432.79L446.48,432.53L445.63,432.9L445.69,432.48L446.33,431.86L446.13,431.79L446.02,431.17L445.82,431.01L445.88,430.68L445.34,429.83L445.32,429.14L444.74,429.01L443.95,428.18L442.97,428.12L443.3,427.34L444.04,426.56L444,426.29L444.21,426.38L444.41,426.05L444.4,425.6L443.44,424.81L442.94,425.02L442.43,424.75L442.09,424.18L441.59,424.72L441.04,424.78L440.11,424.14L439.39,424.18L439.06,423.61L439.19,423.17L438.58,422.91L438.37,422.3L437.83,421.83L437.68,421.28L436.44,420.87L436.26,420.5L435.88,420.37L435.86,420.15L436.13,419.87L435.52,418.86L436.32,417.79L436.28,417.17L436.43,416.94L436.26,416.15L436.46,415.88L436.16,414.75L436.41,414.45L435.86,413.81L434.19,414.24L433.38,415.02L432.98,415.06L432.67,415.58L433.24,415.83L433.27,416.17L433.06,416.46L432.55,416.87L432.09,416.87L432.16,417.28L431.3,417.76L430.99,418.55L430.1,418.91L429.51,418.73L428.21,420.03L428.91,420.35L428.99,420.7L429.51,421.09L430.06,422.52L429.74,422.9L429.79,423.51L429.02,423.91L428.79,424.5L427.27,424.85L427.05,425.67L427.33,426.53L426.85,426.87L426.95,427.09L426.8,427.49L426.58,427.5L426.35,427.97L424.66,427.92L424.34,428.46L424.08,428.55L424.05,429.26L423.86,429.6L424,430.11L423.74,430.33L422.87,430.03L422.41,430.3L421.76,429.7L421.4,429.64L421.06,430.11L420.79,430.12L420.5,429.79L420.49,429.32L419.95,429.1L419.53,428.49L419.04,428.73L418.03,428.71L417.74,428.2L417.24,428.23L417.05,428.47L417.03,429.14L416.12,428.97L415.57,429.4L415.59,429.8L415.11,429.89L414.51,430.49L414.13,430.5L413.82,430.93L412.92,430.41L412.39,430.5L411.85,430.19L411.11,431.18L410.24,431.2L409.71,432.07L408.98,431.45L408.19,432.06L407.84,432.05L407.68,431.51L406.67,430.13L406.54,429.2L405.97,428.79L406.27,428.49L405.99,428.21L405.97,427.93L405.43,427.69L405.35,427.24L404.96,426.89L404.72,426.28L404.44,426.19L404.44,425.92L404.12,425.91L403.47,426.54L403.11,426.27L403.48,425.6L403.33,424.95L403.64,424.08L401.91,423.94L401.52,423.68L401.43,422.9L401.84,422.33L401.67,421.69L402.07,420.8L402.73,420.13L402.93,419.38L402.81,419.08L402.58,419.1L401.99,418.34L401.57,418.15L401.56,417.89L401.26,417.75L400.97,417.13L401.7,416.39L401.63,416.07L402.01,414.96L399.12,414.12L395.72,414.05L393.79,415.25L390.25,416.9L389.48,418.44L390.05,418.7L390.14,419.09L389.84,419.49L390.32,420.27L390.69,420.27L391.05,419.9L391.08,420.16L391.34,420.13L391.34,420.49L391.04,421.06L390.05,421.67L389.72,421.64L388.78,422.42L388.81,422.8L387.55,423.64L386.85,423.55L386.75,423.27L385.96,423.27L385.6,423.77L384.75,423.48L383.99,423.98L384.76,422.33L384.13,421.92L384.4,421.4L384.71,421.37L384.67,421.15L385.59,420.65L385.81,420.86L386.15,420.44L386.67,420.38L387.04,420.65L387.43,420.28L387,419.25L387.36,418.96L387.38,418.44L388.42,416.77L388.22,416.41L386.21,415.25L386.66,414.44L386.39,413.87L386.89,413.3L387.24,412.43L387.75,411.79L387.87,411.89L388.14,411.37L387.17,410.41L388.61,409.23L390.49,407.18L392.6,405.95L392.59,405.75L392.96,405.64L393.11,405.2L393.84,404.93L394.31,404.38L394.44,403.95L393.96,403.57L393.87,403.24L394.06,403.14L394.11,402.61L394.47,402.01L394.55,400.86L393.89,399.71L395.24,398.29L395.41,398.54L397.29,397.73L397.84,397.72L398.25,397.4L398.66,396.65L399.89,395.95L399.32,395.45L399.51,395.35L399.65,395.06L399.55,394.99L400.36,394.71L400.36,394.18L401.7,393.54L402.41,392.92L402.81,392.43L402.44,392.24L403.12,391.85L403.25,391.37L404.82,390.06L404.66,389.79L404.75,389.22L404.52,388.75L405.68,388.46L406.08,387.88L405.96,387.53L406.91,387.25L407.04,386.93L406.8,386.82L406.77,386.37L406.09,386.05L405.63,386.34L403.22,386.66L403.34,386.01L403.88,385.66L404.03,385.1L404.45,385.03L404.52,384.17L404.9,384.17L405.16,383.78L405.79,383.55L405.4,382.3L406.25,381.98L407.34,382.48L408.43,382.01L409.32,382.45L409.97,382.3L409.65,382.65L409.3,383.85L409.86,384.1L410.6,383.99L410.89,384.55L412.61,383.93L413.71,384.22L414.18,384.1L415.26,383.01L414.54,382.72L414.76,382.27L415.58,382.7L415.95,382.66L416.43,382.18L416.14,381.49L416.66,381.67L416.83,381.21L416.59,381.04L416.23,381.24L416.18,380.9L417.38,380.1L417.57,379.73L417.93,379.79L418.09,379.35L418.72,379.72L419.27,379.18L419.82,379.29L420.09,379.09L419.8,379.39L420.12,379.88L420.08,380.09L419.01,380.21L419.86,381.09L420.69,380.88ZM441.61,376.19L441.31,375.5L440.53,375.49L440.53,375.74L440.74,375.87L440.37,376.23L440.68,376.37L441.07,376.05L441.61,376.19Z"/>
     <path id="dach-path-at" d="M615.95,362.9L616.5,363.7L616.11,363.99L616.22,364.15L616.1,364.38L616.36,364.55L616,364.88L616.38,365.18L616.02,365.61L616.48,365.94L616.91,365.63L617.92,366.38L616.54,367.52L617,367.84L616.49,368.62L616.95,368.91L616.58,369.51L616.73,369.75L616.36,370.49L614.94,370.7L614.78,371.01L615.65,371.65L615.55,371.96L616.1,372.56L615.64,373.05L615.95,373.8L616.03,375.09L616.45,375.68L612.12,376.29L611.88,376.25L611.75,375.29L611.19,375.8L610.95,376.47L609.31,376.51L608.69,374.92L607.38,374.66L606.99,374.41L606.9,374.11L606.31,374.06L605.11,374.35L605.07,374.7L604.88,374.83L605.18,375.25L604.96,375.59L604.07,375.85L603.62,376.25L603.59,376.5L603.28,376.45L603,376.04L602.91,376.76L602.5,377.01L602.83,377.3L603.72,377.48L603.86,377.8L604.7,377.72L605.76,378.45L606.77,378.16L607.27,378.32L607.43,378.82L607.67,378.89L607.59,379.21L607.77,379.63L607.54,380.09L608.59,380.9L608.04,381.81L607.67,382L607.46,381.87L607.26,382.15L607.63,382.94L607.46,383.49L606.77,383.93L606.63,384.27L605.94,384.51L605.7,385L604.33,384.94L604.32,385.32L604.05,385.54L603.75,385.3L603.81,385.02L602.99,384.98L603.3,385.73L603.07,385.96L603.22,386.22L603.11,386.55L602.72,386.68L603.34,387.22L603.88,388.9L603.66,389.02L603.68,389.47L603.41,389.75L602.66,389.78L602.89,390.32L602.75,391.08L602.33,391.21L602.59,391.84L603.14,391.78L603.32,392.39L603.04,392.88L603.14,393.15L604.44,392.98L604.71,393.64L604.13,393.73L604.1,394.16L603.66,394.43L603.55,394.29L603.32,394.62L603.56,394.92L603.53,395.27L604.25,395.46L604.52,395.76L602.89,396.36L602.82,396.61L603.01,396.82L603.4,396.58L604.35,397.48L603.54,397.66L603.03,397.36L602.99,397.69L602.65,397.74L602.28,397.37L601.43,397.57L600.98,397.22L600.78,397.65L600.41,397.45L599.95,397.56L599.75,397.09L599.43,397.91L599.38,398.66L598.94,398.66L598.77,399.15L598.29,399.46L597.77,399.35L597.4,400.34L597.07,400.45L596.43,401.31L595.49,401.75L594.9,402.47L593.48,402.67L593.37,402.81L593.65,403.34L593.5,403.52L593.37,405.42L593.72,406.12L594.31,406.32L594.26,406.68L594.51,407.18L594.45,407.98L593.87,407.73L593.51,407.21L592.48,406.93L591.76,406.34L590.34,405.98L588.61,406.7L587.8,406.77L586.49,406.46L586.4,406.9L586.05,406.96L585.84,407.27L585.5,407.16L585.42,407.47L585.15,407.29L585.23,407.05L585.46,407.04L585.23,406.98L584.16,407.62L584.33,408.24L584.14,408.36L584.23,408.58L584.09,408.79L583.99,408.69L583.45,409.21L583.02,409.08L582.72,409.33L582.44,409.19L582.3,408.52L581.83,408.42L581.43,408.03L579.44,408.26L578.89,408.12L577.67,408.51L575.82,407.89L575.42,408.17L574.98,407.9L574.46,408.31L573.66,408.12L573.09,408.47L572.64,409.04L572.65,409.31L572.27,409.63L572.11,409.11L571.81,408.84L571.34,409.24L571.15,409.08L571.08,409.72L570.45,409.38L569.98,409.63L570.02,409.84L569.42,410.53L569.36,411.04L569.06,411.46L569.25,411.58L569.07,411.7L568.95,412.49L568.25,412.76L567.93,412.61L567.49,412.81L567.36,412.6L567.09,413.09L566.78,412.73L566.73,413.33L566.45,413.54L566.5,413.85L566.16,413.74L565.99,414.26L565.71,414.44L564.13,414.9L564.14,415.97L564,416.44L563.64,416.61L563.18,415.46L562.79,415.05L562.52,415.01L562.18,415.39L561.2,415.12L560.89,414.74L561.01,414.57L560.87,414.38L558.41,414.87L557.85,414.47L556.86,414.8L556.46,414.48L555.19,414.75L554.34,413.46L552.96,412.98L552.06,413.32L550.05,412.11L548.82,412.31L548.39,412.16L547.96,412.56L547.6,412.58L546.07,412.06L545.21,412.13L543.91,411.54L543.28,411.45L542.93,411.66L542.69,411.24L541.79,411.38L541.48,410.79L540.86,411.08L539.89,411.07L539.5,410.94L539.54,410.62L538.79,410.41L538.74,410.78L538.2,410.72L537.72,411.24L536.68,410.95L535.99,411.24L535.54,410.66L535.04,410.62L534.5,410.11L532.8,409.7L532.01,409.92L529.51,409.43L527.79,409.54L527.55,409.4L527.54,408.81L527.22,408.86L526.04,408.27L525.38,408.65L525.04,408.22L524.2,407.9L523.51,408.09L523.17,407.81L521.91,408.12L520.98,407.33L520.22,407.37L520.04,407.08L519.37,407L518.07,406.08L517.54,404.37L516.06,404.09L516.21,403.6L516.08,403.15L516.54,402.39L516.24,402.09L516.2,401.62L515.92,401.42L515.9,401.09L515.18,400.91L514.62,401.35L514.04,400.4L513.11,400.22L513.64,399.44L512.99,398.81L512.97,398L512.84,397.99L512.65,397.25L513.18,396.75L513.5,396.88L514.38,396.63L514.61,395.73L515.08,395.41L514.75,394.93L513.99,394.66L512.54,395.25L512.11,395.09L511.66,395.68L510.91,395.6L510.54,396.04L509.61,395.97L509.01,396.44L508.37,396.47L506.72,397.74L505.6,397.78L505.22,398.33L504.86,398.47L504.44,398.35L504.08,397.77L503.11,397.74L502.18,397.12L500.47,398.03L499.73,397.28L499.28,397.17L498.46,398.28L497.7,398.6L497.31,398.47L496.73,397.81L496.29,398L495.94,397.76L493.59,398.67L493.17,398.44L492.69,398.6L492.66,399.37L492.17,399.73L491.64,399.66L491.56,400.09L491.27,400.19L491.33,400.92L490.75,402L490.74,402.47L491,402.99L490.07,403.48L490.15,403.59L489.66,404.64L487.55,404.42L486.87,404.78L485.86,404.18L485.66,404.43L485.38,404.38L484.81,403.77L484.15,404.1L483.58,403.98L483.56,403.75L484.32,402.93L484.13,402.6L482.84,402.07L482.84,401.66L482.29,401.34L479.81,402.5L479.96,402.14L478.82,402.22L478.23,401.92L478.12,401L478.34,400.77L478.59,399.34L477.37,398.8L477.23,398.63L477.32,398.21L476.51,397.46L475.5,398.02L475.24,398.89L474.83,399.08L475.02,399.75L474.61,399.93L473.45,399.6L473.46,399.96L473.13,400.65L473.31,400.99L473.24,401.58L472.46,401.58L471.94,402.07L470.6,402.35L470.23,401.75L469.56,401.72L469.49,401.3L468.78,400.5L468.21,400.49L467.93,400.07L467.13,400.15L465.83,399.44L465.88,398.78L465.72,398.6L466.17,397.82L466.1,397.49L465.73,397.19L465.89,396.86L465.5,396.78L465.04,397.09L463.88,396.32L462.54,396.15L461.76,395.58L460.99,395.66L460.75,395.91L460.22,395.62L460.26,395.12L460.72,394.86L460.77,394.37L460.54,393.97L460.71,393.5L460.53,392.95L460.28,392.96L459.81,392.3L459.4,392.18L459.66,391.25L459.21,390.59L459.42,390.15L458.61,389.18L458.95,388.88L459.18,388.27L459.8,387.72L460.16,386.66L460.56,386.21L461.39,386.02L461.59,385.48L461.15,385.03L460.99,384.15L461.27,383.53L460.47,383.31L460.27,383.01L459.97,383.2L459.32,382.27L459.3,381.94L458,380.25L462.73,381.09L463.49,379.4L464.21,379.17L464.76,379.67L464.73,380.28L464.51,380.63L465.74,381.25L465.89,380.63L466.79,381.2L467.13,380.96L467.61,381.04L467.51,380.8L467.71,380.69L467.65,381.45L468.28,382.03L468.11,382.19L468.39,382.65L469.29,382.5L469.49,383.12L469.84,383.48L470.26,383.4L470.32,383.96L470.58,384.33L469.87,384.96L470.14,385.25L470.45,386.59L470.86,385.98L471.83,386.18L471.94,385.65L472.21,385.42L472.84,385.83L473.14,385.57L473.34,385.75L472.56,387.44L472.87,387.91L472.08,388.52L472.03,389.21L472.59,389L473.37,389.15L473.94,388.62L475.29,388.12L475.66,387.73L475.87,387.12L476.47,386.52L476.54,386.09L477.47,385.69L477.39,385.13L477.54,384.81L478.3,384.25L478.13,383.58L478.18,382.84L477.65,382.6L477.4,382.02L477.85,380.45L477.38,379.74L477.51,379.53L478.44,379.49L477.91,380.41L478.6,380.89L479.33,381.04L480.34,381.08L480.46,380.44L480.89,380L481.64,380.3L482.8,380.3L482.9,380.75L484.22,381.07L484.35,381.54L484.62,381.69L486.9,380.98L487.52,381.72L486.52,382.14L486.51,382.67L487.89,382.72L487.76,383.02L488.9,384.28L488.88,384.57L488.61,384.75L488.76,385.26L491.55,385.34L491.81,385.2L491.91,384.83L493.54,384.16L494.53,384.34L493.93,385.36L494.85,385.3L495.3,384.97L495.33,384.37L496.12,384.03L496.3,383.69L498.03,383.83L497.77,383.11L497.28,382.97L498.31,381.71L499.8,381.93L501.17,381.69L501.55,381.33L501.55,380.39L501.92,379.61L502.51,379.63L502.56,379.2L503.17,379.52L505.61,379.3L506.9,379.59L507.14,378.97L508.34,378.6L509.64,378.61L510.33,378.25L510.54,378.71L511.4,378.45L511.88,378.75L513.02,378.87L513.84,378.6L513.78,379.01L514.37,378.84L514.46,378.59L514.3,377.86L513.65,376.54L513.54,375.94L514.6,375.57L515.39,374.61L515.65,374.92L515.16,376.13L515.46,376.59L517.14,376.04L517.8,376.44L519.31,376.1L519.29,376.7L520.54,378.26L521.37,377.92L522.15,378.03L522.78,376.78L523.7,376.85L524.3,376.47L525.42,376.54L526.01,377.05L526.51,376.76L526.42,377.15L526,377.45L526.38,377.97L527.37,378.65L526.81,378.86L526.68,379.03L526.76,379.27L526.45,379.61L526.79,380.4L527.25,380.72L527.84,380.68L527.97,381.19L528.57,381.45L529.13,382.21L530.36,382.92L530.55,382.6L530.91,382.79L531.09,383.25L531.58,382.53L532,382.38L532.02,381.46L531.7,381.04L532.24,380.21L531.92,379.77L531.98,379.52L532.54,379.38L532.33,378.97L533.08,377.95L532.63,376.87L532.71,376.34L531.97,375.53L531.38,375.21L530.46,375.69L529.5,375.58L529.11,375.21L529.31,374.59L529.66,374.42L529.83,373.94L529.52,373.7L530.3,372.79L531.1,371.3L529.8,368.81L529.73,368.38L529.4,368.49L529.23,367.97L528.41,367.76L527.92,366.12L526.06,364.33L525.79,363.2L526,362.63L526.55,362.76L526.88,361.99L527.41,361.84L527.85,361.37L528.32,360.29L530.14,360.04L531.46,358.54L532.77,357.92L533.63,357.92L534.82,357.37L536.35,357.44L538,356.4L539.59,354.87L540.18,353.11L539.92,352.28L540.57,350.55L540.32,350.09L540.43,349.79L540.18,349.09L540.43,348.9L540.96,349.15L540.93,348.96L541.59,348.54L541.48,348.34L541.61,348.12L541.97,348.16L543,349.03L543.68,348.82L544.68,349.4L544.85,349.79L546.29,350.46L546.36,350.12L546.64,349.91L546.53,349.56L546.72,349.36L546.58,349.23L546.9,348.92L547.07,349.21L547.73,348.57L547.84,348.27L547.72,347.9L548.2,347.32L547.98,344.89L548.42,344.87L548.49,344.63L547.97,344.56L547.62,344.1L548.04,343.67L548.24,342.81L548.65,342.31L549.72,342.81L550.99,344.18L551.97,344.34L552.62,345.34L553.15,345.42L553.01,346.09L552.42,346.09L552.13,346.55L552.52,346.93L552.89,346.87L552.77,347.35L553.03,347.62L553.33,347.55L553.3,347.92L553.91,347.77L554.08,348.08L554.62,347.85L555.9,347.99L556.95,348.48L557.57,348.36L558.05,348.76L558.67,348.91L558.89,349.28L559.27,348.94L559.37,348.57L560.02,348.64L560.14,348.46L559.98,347.98L560.88,348.13L561.41,346.98L561.18,346.4L561.71,346.25L562.39,347.23L563.34,347.33L563.65,347.61L564.63,346.85L564.93,347.56L565.43,347.46L565.78,348.34L566.54,348.32L566.95,347.73L566.81,347.22L566.95,346.42L566.77,346.17L567.08,345.01L567.36,344.56L568.04,344.24L568.77,343.53L568.62,343.1L568.85,342.66L568.8,342.1L570.28,342.06L570.44,342.38L571.85,342.76L572.35,342.33L572.32,342.04L571.8,341.74L572.12,340.29L572.45,340.09L572.21,339.74L572.18,339.18L572.45,339.06L572.42,338.57L572.61,338.17L572.34,337.4L572.5,337.09L572.28,336.06L572.33,335.72L572.73,335.35L572.77,334.94L572.59,334.79L572.69,334.61L573.21,334.44L573.65,334.73L574.13,334.61L574.21,335.11L574.92,335.28L575.56,335.06L576.05,335.31L575.92,335.7L576.19,335.87L576.32,336.31L576.04,336.74L576.14,336.91L576.74,336.89L577.48,336.35L578.25,336.56L578.66,335.7L578.61,335.25L578.99,335.71L580.44,335.67L581.67,336.63L582.31,336.83L582.57,336.62L583.25,337.11L583.53,337.84L584.85,338.38L585.58,338.33L585.94,338.75L586.45,338.84L587.11,339.64L587.59,339.51L588.48,339.8L589.04,339.07L590.04,339.18L590.3,338.98L590.56,339.35L590.37,339.55L590.85,339.77L591.1,339.57L591.27,340.11L591.53,339.9L591.68,340.2L591.39,340.11L591.43,340.33L592,340.22L592.22,340.36L592.07,340.67L592.26,340.82L592.46,340.56L592.8,340.76L592.63,341.27L593.53,342.11L595.63,343.13L599.45,343.29L600.59,343.6L600.8,343.12L601.12,343.39L601,343.54L601.18,343.73L601.55,343.69L602.79,342.43L603.04,341.44L603.46,341.24L604.51,341.47L604.95,341L606.06,342.01L606.81,342.06L606.96,341.86L607.52,342.04L607.87,342.73L607.72,343.36L607.91,343.72L608.8,343.41L609.03,343.69L609.26,343.58L609.51,344.1L610.15,344.16L610.37,344.42L611.11,344.09L611.77,344.24L612.03,343.87L612.16,344.1L612.5,344.04L612.79,344.6L612.65,345.33L612.91,345.53L612.85,346.15L613.02,346.42L612.86,347.07L613.31,347.25L613.19,347.72L613.34,348.65L613.21,348.68L613.56,349.46L613.38,349.54L613.5,349.77L613.38,350.18L613.1,350.13L612.73,350.5L612.83,351.01L612.36,351.02L612.37,351.4L611.49,352.43L611.49,353.04L611.69,353.44L611.45,353.79L611.61,353.99L611.45,354.53L611.09,354.66L611.28,355.52L611.91,355.65L611.9,355.98L612.67,356.4L612.5,356.67L612.58,356.82L612.38,356.89L612.97,358.03L613.67,358.31L613.46,359.18L613.76,359.61L614.03,361.22L615.13,362.18L615.72,362.11L615.95,362.9Z"/>
</defs>

  <!-- ═══════════════════════════════════════════════════════════
       Brand Logos – Kundenlogos für Bewertungs-Karussell.
       Originalfarben inline gesetzt (kein class/style mit
       generischen Klassennamen, um Konflikte im Dokumenten-Scope
       zu vermeiden).
       ═══════════════════════════════════════════════════════════ -->
  <symbol id="logo-verbraucherzentrale" viewBox="0 0 22.5026 22.5026">
    <g transform="translate(-42.06875,-147.90208)">
    <g transform="matrix(0.26458333,0,0,0.26458333,42.06875,147.90208)">
    <path fill-rule="evenodd" d="M 42.52,85.04 C 66,85.04 85.04,66 85.04,42.52 85.04,19.04 66,0 42.52,0 19.04,0 0,19.04 0,42.52 0,66 19.04,85.04 42.52,85.04 Z m 21.9,-59.83 c -3.4,-2.12 -7.87,-1.09 -10,2.31 L 43.08,45.67 31.75,27.52 c -2.12,-3.4 -6.6,-4.43 -10,-2.31 -3.4,2.12 -4.44,6.6 -2.31,10 l 17.48,28 c 0,0 0.05,0.06 0.07,0.09 0.13,0.2 0.27,0.4 0.42,0.59 0.03,0.04 0.07,0.09 0.1,0.13 0.18,0.22 0.38,0.43 0.59,0.62 0.05,0.05 0.1,0.09 0.15,0.13 0.16,0.14 0.32,0.27 0.48,0.4 0.09,0.07 0.18,0.13 0.28,0.19 0.07,0.05 0.14,0.1 0.22,0.15 0.05,0.03 0.11,0.05 0.16,0.08 0.18,0.11 0.36,0.2 0.55,0.29 0.12,0.06 0.23,0.11 0.35,0.16 0.17,0.07 0.35,0.13 0.52,0.19 0.13,0.04 0.27,0.09 0.4,0.13 0.17,0.05 0.35,0.08 0.52,0.11 0.14,0.03 0.27,0.06 0.41,0.08 0.26,0.03 0.52,0.05 0.78,0.05 0.05,0 0.1,0 0.14,0 0,0 0,0 0,0 0,0 0,0 0,0 0.05,0 0.09,0 0.14,0 0.26,0 0.53,-0.02 0.79,-0.05 0.13,-0.02 0.27,-0.05 0.4,-0.08 0.18,-0.03 0.35,-0.06 0.53,-0.11 0.13,-0.04 0.27,-0.08 0.4,-0.13 0.18,-0.06 0.35,-0.12 0.52,-0.19 0.12,-0.05 0.23,-0.11 0.35,-0.16 0.19,-0.09 0.37,-0.18 0.55,-0.29 0.05,-0.03 0.11,-0.05 0.16,-0.08 0.08,-0.05 0.15,-0.1 0.22,-0.15 0.09,-0.06 0.18,-0.12 0.27,-0.19 0.17,-0.13 0.33,-0.26 0.49,-0.4 0.05,-0.04 0.1,-0.08 0.15,-0.13 0.21,-0.2 0.4,-0.41 0.59,-0.62 0.03,-0.04 0.07,-0.09 0.1,-0.13 0.15,-0.19 0.3,-0.39 0.43,-0.59 0.02,-0.03 0.05,-0.06 0.07,-0.09 l 17.49,-28 c 2.12,-3.4 1.09,-7.88 -2.31,-10 z" style="fill:#dc020e"/>
    </g>
    </g>
  </symbol>
  <symbol id="logo-volkswagen" viewBox="0 0 1024 1024">
    <g transform="matrix(10.188387870788574, 0, 0, 10.188387870788574, -251.519936680809, -252.79260253906244)">
    <path d="M75,120.4c-24.9,0-45.3-20.5-45.3-45.4c0-5.6,1-10.9,2.9-15.9l26.5,53.3c0.3,0.7,0.8,1.3,1.6,1.3c0.8,0,1.3-0.6,1.6-1.3l12.2-27.3c0.1-0.3,0.3-0.6,0.6-0.6s0.4,0.3,0.6,0.6l12.2,27.3c0.3,0.7,0.8,1.3,1.6,1.3c0.8,0,1.3-0.6,1.6-1.3l26.5-53.3c1.9,5,2.9,10.3,2.9,15.9C120.3,99.9,99.9,120.4,75,120.4z M75,64.7c-0.3,0-0.4-0.3-0.6-0.6l-14.2-32c4.6-1.7,9.6-2.6,14.8-2.6c5.2,0,10.2,0.9,14.8,2.6l-14.2,32C75.4,64.5,75.3,64.7,75,64.7z M60.5,97.6c-0.3,0-0.4-0.3-0.6-0.6l-23-46.4c4.1-6.3,9.6-11.6,16.3-15.3l16.6,36.9C70,72.8,70.5,73,71,73h8c0.6,0,1-0.1,1.3-0.8l16.6-36.9c6.6,3.7,12.2,9,16.3,15.3L90,97c-0.1,0.3-0.3,0.6-0.6,0.6c-0.3,0-0.4-0.3-0.6-0.6l-8.7-19.8c-0.3-0.7-0.7-0.8-1.3-0.8h-8c-0.6,0-1,0.1-1.3,0.8L61.1,97C61,97.3,60.8,97.6,60.5,97.6z M75,125c27.7,0,50-22.3,50-50c0-27.7-22.3-50-50-50c-27.7,0-50,22.3-50,50C25,102.7,47.3,125,75,125z" style="fill: rgb(0, 30, 80);"/>
    </g>
  </symbol>
  <symbol id="logo-deutsche-bahn" viewBox="0 0 100 70">
    <path fill="#f01414" fill-rule="evenodd" d="M90 0H10C4.5 0 0 4.5 0 10v50c0 5.5 4.5 10 10 10h80c5.5 0 10-4.5 10-10.1V10c0-5.5-4.5-10-10-10zM92.7 59.9c.1 1.5-1.1 2.8-2.7 2.9H10c-1.5 0-2.7-1.3-2.7-2.8V10c-.1-1.5 1.1-2.8 2.6-2.9H90c1.5 0 2.7 1.3 2.7 2.8v50z"/>
    <path fill="#f01414" d="M30.6 57.9H13.8V12.1h16.8c11.9 0 18.4 7.4 18.4 22.7 0 13.2-4.5 23-18.4 23.1zm7.3-22.2c0-9.2-1-16.4-10.9-16.4h-2.2v31.2h3.9c5.8 0 9.2-4.7 9.2-14.8zM78 33.9c4.7-1.4 7.9-5.7 8-10.7 0-1-.2-11.2-13.1-11.2H53.8v45.8H70c4.3 0 17.7 0 17.7-12.9 0-3.1-1.4-9.2-9.7-11zM64.7 19.2h3.5c4.9 0 6.9 1.7 6.9 5.5 0 3-2.2 5.5-6 5.5h-4.3v-11zm4.5 31.3h-4.5V38.7h4.8c5.7 0 7.1 3.3 7.1 5.9 0 5.9-5.6 5.9-7.4 5.9z"/>
  </symbol>
  <symbol id="logo-thyssenkrupp" viewBox="0 0 110 85">
    <g transform="translate(-29.107484,-30.29183)">
    <path d="m 102.23,52.858 c -0.157,-9.635 -8.038,-17.425 -17.709,-17.425 -9.671,0 -17.552,7.791 -17.709,17.425 -6.255,2.738 -10.637,8.983 -10.637,16.236 0,9.769 7.947,17.716 17.716,17.716 3.985,0 7.667,-1.324 10.63,-3.553 2.963,2.229 6.645,3.553 10.63,3.553 9.769,0 17.717,-7.948 17.717,-17.716 -10e-4,-7.252 -4.384,-13.498 -10.638,-16.236 z M 91.529,67.467 c -0.41,-4.474 -2.488,-8.471 -5.608,-11.363 1.843,-1.313 3.974,-2.244 6.28,-2.677 1.565,2.944 3.007,6.519 4.284,10.244 -1.38,1.569 -3.062,2.866 -4.956,3.796 z m -7.008,13.499 c -3.035,-2.72 -5.023,-6.583 -5.283,-10.905 1.669,0.522 3.444,0.805 5.283,0.805 1.839,0 3.614,-0.282 5.283,-0.805 -0.261,4.323 -2.249,8.185 -5.283,10.905 z M 72.556,63.672 c 1.277,-3.725 2.718,-7.3 4.284,-10.244 2.306,0.433 4.438,1.364 6.28,2.677 -3.12,2.892 -5.199,6.889 -5.608,11.363 -1.894,-0.931 -3.575,-2.228 -4.956,-3.796 z m -1.295,-1.679 c -1.537,-2.297 -2.493,-5.014 -2.658,-7.938 1.656,-0.584 3.435,-0.905 5.288,-0.905 0.365,0 0.725,0.017 1.083,0.041 -1.262,2.438 -2.5,5.371 -3.713,8.802 z m 6.494,-10.185 c 2.089,-3.479 4.373,-5.745 6.766,-5.745 2.393,0 4.677,2.266 6.766,5.745 -2.492,0.557 -4.79,1.636 -6.766,3.123 -1.977,-1.487 -4.273,-2.567 -6.766,-3.123 z m 6.766,17.286 c -1.853,0 -3.632,-0.321 -5.288,-0.905 0.245,-4.347 2.238,-8.234 5.288,-10.967 3.049,2.733 5.043,6.62 5.288,10.967 -1.657,0.584 -3.435,0.905 -5.288,0.905 z M 94.067,53.19 c 0.358,-0.024 0.719,-0.041 1.083,-0.041 1.854,0 3.632,0.321 5.288,0.905 -0.165,2.925 -1.121,5.642 -2.658,7.938 -1.212,-3.43 -2.451,-6.363 -3.713,-8.802 z M 84.521,37.205 c 8.467,0 15.411,6.635 15.913,14.978 -1.669,-0.522 -3.444,-0.805 -5.283,-0.805 -0.68,0 -1.35,0.042 -2.01,0.117 -2.776,-4.788 -5.658,-7.204 -8.62,-7.204 -2.961,0 -5.844,2.416 -8.62,7.204 -0.66,-0.075 -1.33,-0.117 -2.01,-0.117 -1.839,0 -3.613,0.282 -5.283,0.805 0.502,-8.344 7.446,-14.978 15.913,-14.978 z m -26.575,31.89 c 0,-6.279 3.649,-11.719 8.936,-14.318 0.318,3.473 1.643,6.657 3.679,9.262 -0.032,0.097 -0.064,0.19 -0.096,0.287 -2.547,7.735 -4.249,15.547 -4.835,18.402 -4.604,-2.8 -7.684,-7.864 -7.684,-13.633 z M 73.891,85.04 c -2.366,0 -4.61,-0.522 -6.631,-1.45 0.861,-4.412 2.489,-11.314 4.659,-18.003 1.573,1.594 3.444,2.89 5.523,3.8 0.082,5.011 2.251,9.522 5.679,12.699 -2.608,1.856 -5.792,2.954 -9.23,2.954 z m 12.03,-2.956 c 3.427,-3.177 5.597,-7.688 5.679,-12.699 2.079,-0.91 3.951,-2.206 5.524,-3.8 2.169,6.689 3.797,13.591 4.659,18.003 -2.021,0.928 -4.266,1.45 -6.632,1.45 -3.439,0.002 -6.623,-1.096 -9.23,-2.954 z m 17.491,0.644 c -0.586,-2.855 -2.289,-10.667 -4.835,-18.402 -0.032,-0.097 -0.064,-0.19 -0.097,-0.287 2.037,-2.604 3.361,-5.789 3.679,-9.262 5.288,2.599 8.937,8.039 8.937,14.318 0,5.769 -3.081,10.833 -7.684,13.633 z" style="fill:#0095d8"/>
    <path d="m 128.771,106.601 c -0.252,-0.11 -0.468,-0.266 -0.646,-0.468 -0.178,-0.202 -0.316,-0.444 -0.415,-0.726 -0.098,-0.282 -0.147,-0.595 -0.147,-0.94 v -2.263 c 0,-0.38 0.058,-0.714 0.174,-1.002 0.116,-0.288 0.269,-0.529 0.458,-0.722 0.19,-0.193 0.412,-0.337 0.664,-0.432 0.252,-0.095 0.512,-0.142 0.779,-0.142 0.285,0 0.551,0.052 0.797,0.156 0.246,0.104 0.449,0.264 0.606,0.481 0.157,0.217 0.28,0.498 0.37,0.842 0.065,0.255 0.111,0.547 0.138,0.873 0.026,0.327 0.04,0.674 0.04,1.042 0,0.285 -0.014,0.603 -0.04,0.953 -0.027,0.351 -0.061,0.639 -0.103,0.864 -0.101,0.517 -0.3,0.92 -0.597,1.212 -0.297,0.291 -0.712,0.436 -1.247,0.436 -0.301,0.001 -0.578,-0.054 -0.831,-0.164 m -1.207,4.478 v -3.93 c 0.137,0.178 0.319,0.362 0.548,0.552 0.229,0.19 0.51,0.34 0.846,0.45 0.336,0.11 0.732,0.165 1.189,0.165 0.374,0 0.754,-0.062 1.141,-0.187 0.386,-0.125 0.73,-0.343 1.033,-0.655 0.303,-0.312 0.541,-0.703 0.713,-1.171 0.136,-0.362 0.237,-0.789 0.303,-1.279 0.065,-0.49 0.098,-1.064 0.098,-1.724 0,-0.742 -0.042,-1.395 -0.125,-1.956 -0.083,-0.561 -0.229,-1.053 -0.437,-1.475 -0.511,-1.009 -1.41,-1.514 -2.699,-1.514 -0.636,0 -1.171,0.129 -1.608,0.388 -0.437,0.258 -0.789,0.602 -1.056,1.029 l -0.044,-1.131 h -1.693 v 12.438 h 1.791 z m -7.95,-4.478 c -0.252,-0.11 -0.468,-0.266 -0.646,-0.468 -0.179,-0.202 -0.316,-0.444 -0.415,-0.726 -0.099,-0.282 -0.147,-0.595 -0.147,-0.94 v -2.263 c 0,-0.38 0.058,-0.714 0.173,-1.002 0.116,-0.288 0.269,-0.529 0.459,-0.722 0.19,-0.193 0.411,-0.337 0.663,-0.432 0.252,-0.095 0.513,-0.142 0.78,-0.142 0.285,0 0.551,0.052 0.797,0.156 0.246,0.104 0.448,0.264 0.606,0.481 0.157,0.217 0.28,0.498 0.37,0.842 0.065,0.255 0.111,0.547 0.138,0.873 0.027,0.327 0.04,0.674 0.04,1.042 0,0.285 -0.013,0.603 -0.04,0.953 -0.027,0.351 -0.061,0.639 -0.103,0.864 -0.101,0.517 -0.3,0.92 -0.597,1.212 -0.297,0.291 -0.712,0.436 -1.247,0.436 -0.3,0.001 -0.578,-0.054 -0.831,-0.164 m -1.207,4.478 v -3.93 c 0.136,0.178 0.319,0.362 0.548,0.552 0.229,0.19 0.511,0.34 0.846,0.45 0.336,0.11 0.732,0.165 1.189,0.165 0.375,0 0.754,-0.062 1.14,-0.187 0.386,-0.125 0.731,-0.343 1.034,-0.655 0.303,-0.312 0.541,-0.703 0.712,-1.171 0.137,-0.362 0.238,-0.789 0.303,-1.279 0.066,-0.49 0.099,-1.064 0.099,-1.724 0,-0.742 -0.042,-1.395 -0.125,-1.956 -0.083,-0.561 -0.229,-1.053 -0.437,-1.475 -0.511,-1.009 -1.411,-1.514 -2.699,-1.514 -0.636,0 -1.172,0.129 -1.608,0.388 -0.437,0.258 -0.789,0.602 -1.056,1.029 l -0.045,-1.131 h -1.692 v 12.438 h 1.791 z m -6.497,-3.168 c 0.46,-0.27 0.851,-0.628 1.171,-1.073 l 0.018,1.185 h 1.692 V 98.642 H 113 v 5.532 c 0,0.315 -0.068,0.661 -0.205,1.038 -0.137,0.377 -0.379,0.711 -0.726,1.002 -0.347,0.291 -0.741,0.436 -1.18,0.436 -0.535,0 -0.933,-0.135 -1.194,-0.405 -0.261,-0.27 -0.392,-0.693 -0.392,-1.27 v -6.334 h -1.791 v 6.824 c 0,0.546 0.08,1.002 0.24,1.368 0.161,0.365 0.37,0.658 0.628,0.877 0.258,0.22 0.549,0.376 0.873,0.468 0.324,0.092 0.648,0.138 0.975,0.138 0.662,0 1.221,-0.135 1.682,-0.405 m -8.539,0.111 v -4.321 c 0,-0.392 0.05,-0.846 0.151,-1.363 0.101,-0.517 0.346,-0.97 0.735,-1.359 0.389,-0.389 0.913,-0.583 1.572,-0.583 0.22,0 0.383,0.012 0.49,0.036 v -1.809 h -0.231 c -0.606,0 -1.152,0.176 -1.639,0.526 -0.487,0.35 -0.874,0.84 -1.158,1.47 l -0.018,-1.978 h -1.692 v 9.381 h 1.79 z m -8.65,0 v -3.76 l 1.238,-1.256 2.458,5.016 h 2.031 l -3.181,-6.352 2.976,-3.029 h -2.129 l -3.394,3.465 v -6.78 h -1.79 v 12.696 h 1.791 z m -9.36,0 v -5.533 c 0,-0.32 0.07,-0.673 0.209,-1.06 0.14,-0.386 0.381,-0.721 0.726,-1.006 0.344,-0.285 0.742,-0.428 1.194,-0.428 0.534,0 0.923,0.137 1.167,0.41 0.243,0.273 0.365,0.694 0.365,1.265 v 6.352 h 1.791 v -6.824 c 0,-0.552 -0.1,-1.051 -0.298,-1.497 -0.199,-0.445 -0.505,-0.781 -0.918,-1.007 -0.413,-0.225 -0.895,-0.338 -1.447,-0.338 -0.665,0 -1.229,0.134 -1.693,0.401 -0.463,0.268 -0.855,0.624 -1.176,1.069 L 85.263,98.641 H 83.57 v 9.381 h 1.791 z m -9.1,-6.802 c 0.104,-0.359 0.242,-0.645 0.414,-0.855 0.172,-0.21 0.377,-0.359 0.615,-0.445 0.237,-0.086 0.499,-0.129 0.784,-0.129 0.303,0 0.604,0.059 0.904,0.178 0.3,0.119 0.541,0.392 0.722,0.819 0.181,0.427 0.272,1.021 0.272,1.782 h -3.884 c 0.011,-0.541 0.069,-0.99 0.173,-1.35 m 3.367,6.891 c 0.46,-0.136 0.85,-0.346 1.167,-0.628 0.317,-0.282 0.589,-0.637 0.815,-1.064 l -1.417,-0.73 c -0.077,0.13 -0.19,0.282 -0.338,0.454 -0.148,0.172 -0.361,0.322 -0.637,0.45 -0.276,0.128 -0.589,0.192 -0.94,0.192 -0.327,0 -0.625,-0.042 -0.895,-0.125 -0.271,-0.083 -0.503,-0.226 -0.7,-0.428 -0.196,-0.202 -0.347,-0.472 -0.454,-0.811 -0.107,-0.339 -0.161,-0.76 -0.161,-1.265 v -0.258 h 5.657 v -0.98 c 0,-0.422 -0.021,-0.864 -0.062,-1.328 -0.041,-0.464 -0.138,-0.896 -0.29,-1.296 -0.151,-0.401 -0.375,-0.756 -0.672,-1.065 -0.268,-0.267 -0.603,-0.479 -1.007,-0.637 -0.404,-0.157 -0.903,-0.236 -1.497,-0.236 -0.641,0 -1.185,0.082 -1.63,0.245 -0.445,0.164 -0.82,0.403 -1.123,0.718 -0.226,0.226 -0.429,0.518 -0.61,0.877 -0.181,0.36 -0.319,0.826 -0.414,1.399 -0.095,0.573 -0.143,1.219 -0.143,1.938 0,0.552 0.03,1.05 0.089,1.492 0.06,0.443 0.164,0.851 0.312,1.225 0.25,0.647 0.658,1.154 1.225,1.519 0.567,0.365 1.314,0.548 2.241,0.548 0.529,-10e-4 1.024,-0.069 1.484,-0.206 m -9.203,0.112 c 0.306,-0.062 0.576,-0.144 0.811,-0.245 0.235,-0.101 0.437,-0.212 0.606,-0.334 0.169,-0.121 0.301,-0.245 0.396,-0.369 0.184,-0.232 0.333,-0.482 0.445,-0.753 0.113,-0.27 0.169,-0.61 0.169,-1.021 0,-0.344 -0.039,-0.638 -0.116,-0.881 -0.078,-0.244 -0.167,-0.449 -0.268,-0.615 -0.143,-0.214 -0.348,-0.429 -0.615,-0.646 -0.267,-0.217 -0.79,-0.444 -1.568,-0.682 -0.392,-0.113 -0.739,-0.226 -1.042,-0.338 -0.303,-0.113 -0.56,-0.233 -0.771,-0.361 -0.211,-0.128 -0.37,-0.268 -0.477,-0.419 -0.106,-0.151 -0.16,-0.325 -0.16,-0.521 0,-0.404 0.127,-0.709 0.383,-0.917 0.154,-0.137 0.341,-0.232 0.561,-0.285 0.22,-0.054 0.478,-0.081 0.775,-0.081 0.439,0 0.811,0.094 1.114,0.281 0.303,0.187 0.541,0.477 0.712,0.869 l 1.435,-0.695 C 72.56,99.586 72.153,99.122 71.594,98.816 71.036,98.51 70.35,98.357 69.536,98.357 c -0.458,0 -0.898,0.057 -1.323,0.169 -0.425,0.113 -0.782,0.279 -1.07,0.499 -0.288,0.22 -0.506,0.475 -0.654,0.766 -0.131,0.231 -0.222,0.472 -0.272,0.721 -0.05,0.25 -0.076,0.479 -0.076,0.686 0,0.238 0.036,0.489 0.107,0.753 0.072,0.265 0.193,0.506 0.366,0.726 0.136,0.172 0.332,0.352 0.587,0.539 0.255,0.187 0.576,0.355 0.962,0.503 l 1.372,0.507 c 0.243,0.095 0.491,0.196 0.744,0.303 0.253,0.107 0.453,0.251 0.602,0.432 0.148,0.181 0.223,0.423 0.223,0.726 0,0.208 -0.047,0.385 -0.143,0.53 -0.095,0.145 -0.223,0.263 -0.383,0.352 -0.16,0.089 -0.347,0.153 -0.561,0.191 -0.214,0.039 -0.442,0.058 -0.686,0.058 -0.267,0 -0.505,-0.033 -0.712,-0.098 -0.208,-0.065 -0.395,-0.156 -0.562,-0.271 -0.167,-0.115 -0.312,-0.251 -0.437,-0.405 -0.125,-0.155 -0.235,-0.324 -0.33,-0.508 l -1.479,0.659 c 0.119,0.315 0.282,0.6 0.49,0.855 0.208,0.255 0.457,0.476 0.748,0.659 0.303,0.184 0.64,0.331 1.011,0.441 0.372,0.11 0.824,0.165 1.359,0.165 0.366,0.001 0.701,-0.03 1.006,-0.092 m -8.019,0 c 0.306,-0.062 0.576,-0.144 0.811,-0.245 0.235,-0.101 0.437,-0.212 0.606,-0.334 0.169,-0.121 0.301,-0.245 0.396,-0.369 0.185,-0.232 0.333,-0.482 0.446,-0.753 0.113,-0.27 0.169,-0.61 0.169,-1.021 0,-0.344 -0.039,-0.638 -0.116,-0.881 -0.077,-0.244 -0.166,-0.449 -0.267,-0.615 -0.143,-0.214 -0.347,-0.429 -0.615,-0.646 -0.268,-0.217 -0.79,-0.444 -1.568,-0.682 -0.392,-0.113 -0.739,-0.226 -1.042,-0.338 -0.303,-0.113 -0.56,-0.233 -0.771,-0.361 -0.211,-0.128 -0.37,-0.268 -0.477,-0.419 -0.107,-0.151 -0.16,-0.325 -0.16,-0.521 0,-0.404 0.127,-0.709 0.383,-0.917 0.155,-0.137 0.341,-0.232 0.561,-0.285 0.22,-0.054 0.479,-0.081 0.775,-0.081 0.439,0 0.811,0.094 1.113,0.281 0.303,0.187 0.541,0.477 0.713,0.869 l 1.434,-0.695 c -0.255,-0.624 -0.662,-1.088 -1.22,-1.394 -0.558,-0.306 -1.244,-0.459 -2.058,-0.459 -0.458,0 -0.898,0.057 -1.323,0.169 -0.425,0.112 -0.781,0.279 -1.069,0.499 -0.289,0.22 -0.506,0.475 -0.655,0.766 -0.13,0.231 -0.221,0.472 -0.271,0.721 -0.05,0.25 -0.076,0.479 -0.076,0.686 0,0.238 0.036,0.489 0.107,0.753 0.071,0.265 0.193,0.506 0.365,0.726 0.137,0.172 0.333,0.352 0.588,0.539 0.255,0.187 0.576,0.355 0.962,0.503 l 1.373,0.507 c 0.243,0.095 0.491,0.196 0.744,0.303 0.253,0.107 0.453,0.251 0.602,0.432 0.148,0.181 0.223,0.423 0.223,0.726 0,0.208 -0.048,0.385 -0.143,0.53 -0.095,0.145 -0.223,0.263 -0.383,0.352 -0.16,0.089 -0.348,0.153 -0.562,0.191 -0.213,0.039 -0.442,0.058 -0.686,0.058 -0.268,0 -0.505,-0.033 -0.713,-0.098 -0.208,-0.065 -0.395,-0.156 -0.561,-0.271 -0.167,-0.116 -0.312,-0.251 -0.437,-0.405 -0.125,-0.155 -0.235,-0.324 -0.33,-0.508 l -1.479,0.659 c 0.119,0.315 0.282,0.6 0.49,0.855 0.208,0.255 0.458,0.476 0.749,0.659 0.303,0.184 0.64,0.331 1.011,0.441 0.371,0.11 0.824,0.165 1.358,0.165 0.363,0.001 0.697,-0.03 1.003,-0.092 m -10.918,2.935 c 0.338,-0.095 0.668,-0.324 0.988,-0.686 0.321,-0.362 0.618,-0.9 0.891,-1.613 l 3.991,-10.218 h -1.782 l -2.45,6.495 -2.334,-6.495 h -1.826 l 3.234,8.944 -0.418,0.891 c -0.125,0.327 -0.298,0.615 -0.521,0.864 -0.223,0.25 -0.542,0.374 -0.958,0.374 -0.148,0 -0.288,-0.012 -0.419,-0.036 v 1.586 c 0.161,0.023 0.371,0.036 0.633,0.036 0.309,0.001 0.632,-0.047 0.971,-0.142 m -8.903,-3.136 v -5.533 c 0,-0.32 0.07,-0.673 0.21,-1.06 0.139,-0.386 0.381,-0.721 0.726,-1.006 0.345,-0.285 0.743,-0.428 1.194,-0.428 0.535,0 0.923,0.137 1.167,0.41 0.244,0.273 0.366,0.694 0.366,1.265 v 6.352 h 1.79 v -6.824 c 0,-0.552 -0.099,-1.051 -0.298,-1.497 -0.199,-0.445 -0.505,-0.781 -0.917,-1.007 -0.413,-0.225 -0.895,-0.338 -1.448,-0.338 -0.641,0 -1.186,0.122 -1.634,0.365 -0.449,0.244 -0.833,0.576 -1.154,0.998 v -4.393 h -1.79 v 12.696 h 1.788 z m -3.338,0 v -1.479 c -0.226,0.023 -0.452,0.036 -0.677,0.036 -0.279,0 -0.506,-0.036 -0.682,-0.107 -0.175,-0.071 -0.313,-0.178 -0.414,-0.32 -0.101,-0.143 -0.169,-0.321 -0.205,-0.535 -0.036,-0.214 -0.053,-0.463 -0.053,-0.749 v -4.82 h 1.933 v -1.407 h -1.933 v -3.314 h -1.782 v 3.314 h -1.212 v 1.407 h 1.212 v 4.838 c 0,0.481 0.04,0.919 0.12,1.314 0.08,0.395 0.226,0.73 0.437,1.007 0.21,0.276 0.5,0.489 0.868,0.641 0.368,0.152 0.84,0.228 1.417,0.228 0.344,0 0.668,-0.018 0.971,-0.054 z" style="fill:#0095d8"/>
    </g>
  </symbol>
  <symbol id="logo-grohe" viewBox="-0.62 -0.897 709 302">
    <g>
    <path d="M 687.772,187.258 C 676.285,189.121 669.798,189.775 663.558,189.775 C 648.394,189.775 626.808,185.442 604.144,177.731 L 570.165,166.235 C 552.224,160.147 525.45,155.137 510.753,155.137 C 496.205,155.137 469.346,160.158 451.434,166.235 L 417.496,177.731 C 394.792,185.424 373.165,189.775 358.019,189.775 C 342.906,189.775 321.304,185.424 298.63,177.731 L 264.608,166.235 C 246.725,160.147 219.943,155.126 205.349,155.137 C 190.654,155.137 163.824,160.147 145.911,166.235 L 111.903,177.731 C 89.258,185.442 67.687,189.775 52.53,189.775 C 46.243,189.775 39.811,189.122 28.293,187.258 L 29.764,189.59 C 32.995,195.06 34.766,197.412 39.101,202.504 C 45.056,203.289 47.465,203.515 52.232,203.515 C 67.387,203.515 92.117,198.769 111.904,192.063 L 145.912,180.573 C 168.991,172.757 190.089,168.497 205.35,168.497 C 218.203,168.497 240.637,172.634 256.225,177.851 L 298.631,192.063 C 318.698,198.798 343.263,203.515 358.049,203.515 C 372.936,203.515 397.496,198.798 417.497,192.063 L 459.861,177.851 C 475.475,172.633 497.939,168.497 510.81,168.497 C 526.058,168.497 547.106,172.757 570.165,180.573 L 604.144,192.063 C 623.972,198.769 648.664,203.515 663.924,203.515 C 668.655,203.515 671.023,203.289 677.055,202.504 C 681.833,196.829 683.24,194.893 686.412,189.59 L 687.772,187.258" style="fill:#323b95"/>
    <path d="M 637.121,235.036 L 587.656,219.857 C 565.481,212.999 556.851,210.693 544.991,207.995 C 532.455,205.209 519.892,203.647 510.754,203.647 C 496.4,203.647 469.068,208.756 451.435,214.695 L 417.497,226.235 C 394.504,233.981 373.34,238.288 357.857,238.288 C 342.401,238.288 321.42,234.008 298.346,226.235 L 264.306,214.695 C 246.725,208.768 219.24,203.647 204.945,203.647 C 195.878,203.647 183.18,205.209 170.747,207.995 C 159.034,210.617 149.707,213.21 128.015,219.857 L 78.645,235.036 C 83.902,239.876 85.316,240.963 91.228,244.965 L 118.678,236.615 L 141.357,229.929 L 150.482,227.216 C 174.62,220.068 191.042,217.018 204.976,217.018 C 217.587,217.018 240.551,221.225 255.851,226.34 L 298.348,240.616 C 318.16,247.302 342.818,252.004 357.873,252.004 C 372.899,252.004 397.737,247.246 417.498,240.616 L 459.862,226.34 C 475.12,221.231 498.199,217.018 510.811,217.018 C 524.789,217.018 541.055,220.068 565.242,227.216 L 574.304,229.929 L 597.044,236.615 L 624.53,244.965 C 630.447,240.942 631.83,239.846 637.121,235.036" style="fill:#323b95"/>
    <path d="M 581.767,267.198 L 578.699,266.061 L 570.166,263.284 C 545.548,255.837 525.799,252.11 510.754,252.11 C 498.17,252.11 476.832,255.76 459.861,260.782 L 451.434,263.284 C 447.105,264.676 444.279,265.61 442.902,266.061 L 434.398,269.014 L 425.97,271.92 L 417.496,274.776 C 391.656,283.146 373.339,286.832 358.019,286.832 C 344.931,286.832 325.441,283.272 307.114,277.451 L 298.63,274.776 L 290.154,271.92 L 281.684,269.014 L 273.257,266.061 L 264.607,263.284 C 240.053,255.837 220.284,252.11 205.348,252.11 C 192.617,252.11 171.312,255.749 154.382,260.782 L 145.911,263.284 C 139.899,265.215 138.661,265.61 134.314,267.198 L 151.36,276.095 L 155.233,274.941 C 175.137,268.756 192.294,265.54 205.378,265.54 C 216.364,265.54 233.578,268.37 247.706,272.448 L 256.224,274.941 L 264.607,277.616 L 273.257,280.493 L 281.684,283.426 L 290.154,286.294 L 298.63,289.083 C 324.161,296.935 342.864,300.532 358.048,300.532 C 371.106,300.532 390.982,297.046 408.953,291.643 L 417.496,289.082 L 425.97,286.293 L 434.398,283.425 L 442.902,280.492 L 451.434,277.615 L 459.861,274.94 C 481.584,268.503 497.535,265.539 510.81,265.539 C 523.932,265.56 540.998,268.756 560.892,274.94 L 564.702,276.094 L 581.767,267.198" style="fill:#323b95"/>
    <path d="M 96.738,66.58 L 96.738,103.733 C 88.311,107.293 79.788,109.062 71.332,109.062 C 49.553,109.062 34.219,92.251 34.219,68.295 C 34.219,42.54 52.531,24.597 78.793,24.597 C 93.516,24.597 108.053,28.725 125.696,37.71 L 125.696,13 C 103.17,3.839 92.03,1.201 75.368,1.201 C 29.351,1.201 0,27.214 0,67.938 C 0,106.648 28.519,132.42 71.361,132.42 C 90.496,132.42 113.141,126.358 129.64,116.67 L 129.64,66.58 L 96.738,66.58" style="fill:#323b95"/>
    <path d="M 156.883,4.84 L 156.883,128.846 L 189.284,128.846 L 189.284,28.197 L 203.247,28.197 C 221.536,28.197 229.708,34.036 229.708,47.061 C 229.708,60.404 220.55,67.938 204.426,67.938 L 197.307,67.73 L 193.718,67.73 L 238.674,128.846 L 280.059,128.846 L 238.803,78.956 C 254.137,72.092 262.252,59.764 262.252,43.722 C 262.252,17.389 245.252,4.839 209.755,4.839 L 156.883,4.839" style="fill:#323b95"/>
    <polyline fill="#323B95" points="458.082,4.84 458.082,128.846 490.474,128.846 490.474,75.795 547.645,75.795 547.645,128.846 580.015,128.846 580.015,4.84 547.645,4.84 547.645,50.697 490.474,50.697 490.474,4.84 458.082,4.84 " style="fill:#323b95"/>
    <polyline fill="#323B95" points="614.553,4.84 614.553,128.846 707.656,128.846 707.656,104.571 646.876,104.571 646.876,75.057 691.542,75.057 691.542,51.699 646.876,51.699 646.876,29.121 700.575,29.121 700.575,4.84 614.553,4.84 " style="fill:#323b95"/>
    <path d="M 282.445,66.85 C 282.445,105.397 314.733,133.628 358.765,133.628 C 402.757,133.628 435.081,105.398 435.023,66.837 C 435.023,28.214 402.795,0 358.765,0 C 314.695,0 282.445,28.214 282.445,66.85 L 282.445,66.85 z M 316.509,66.836 C 316.571,41.26 333.897,23.357 358.765,23.357 C 383.632,23.357 400.91,41.275 400.91,66.85 C 400.91,92.372 383.576,110.284 358.765,110.284 C 333.974,110.284 316.509,92.354 316.509,66.836" style="fill:#323b95;fill-rule:evenodd"/>
    </g>
  </symbol>
  <symbol id="icon-sparkles-solid" viewBox="0 0 24 24">
    <path d="m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275Z"/>
  </symbol>

  <symbol id="icon-ifmera-wortmarke" viewBox="0 0 620 170">
    <g transform="translate(-30,-35)">
      <path d="M276.02,87.2h-19.05c-3.31,0-6,2.69-6,6v13.43c0,.71-.57,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0-4.79-13.25-16.62-19.88-35.49-19.88h-19.05c-3.31,0-6,2.69-6,6v13.22c0,3.31-2.69,6-6,6h-18c-3.31,0-6,2.69-6,6v74.37c0,3.31,2.69,6,6,6h18c3.31,0,6-2.69,6-6v-74.37c0-3.31,2.68-5.99,5.99-6h13.49c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h13.48c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-69.97c0-23.81-12.64-35.71-37.95-35.71Z"/>
      <path d="M409.7,90.11c-8.41-4.99-18.11-7.48-29.12-7.48s-20.55,2.49-29.03,7.48c-8.48,4.99-15.1,11.98-19.85,20.98-4.78,9.01-7.16,19.31-7.16,30.92s2.49,22.13,7.48,31.14c4.98,9.01,11.97,15.97,20.98,20.87,9.01,4.91,19.38,7.37,31.14,7.37,13.99,0,25.78-3.34,35.39-10.05,7.3-5.09,12.3-11.4,15-18.91,1.33-3.71-1.31-7.66-5.24-7.95l-19.3-1.41c-2.18-.16-4.32.85-5.46,2.71-1.7,2.77-4.11,5.04-7.21,6.82-4.16,2.38-9.01,3.57-14.51,3.57-5.2,0-9.88-1.08-14.06-3.23-4.16-2.16-7.39-5.13-9.7-8.93s-3.47-8.15-3.47-13.06h74.82c3.31,0,6-2.69,6-6v-2.48c0-11.75-2.34-22.17-7.03-31.25-4.71-9.08-11.25-16.11-19.66-21.1ZM355.57,129.06c0-6.55,2.23-11.73,6.7-15.51,4.47-3.8,10.57-5.69,18.31-5.69,5.2,0,9.66.82,13.39,2.45,3.72,1.64,6.54,4.06,8.48,7.26,1.93,3.2,2.91,7.03,2.91,11.5h-49.79Z"/>
      <path d="M151.3,40.32h-19.05c-25.3,0-37.95,11.91-37.95,35.71v116.87c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-80.48h19.22c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6h-19.22v-8.27c0-7.39,5.99-13.39,13.39-13.39h13.48c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6Z"/>
      <path d="M637.41,173.57h-.48c-7.39,0-13.39-5.99-13.39-13.39v-30.92c0-.32-.03-.62-.08-.93v-3.3c0-8.63-2.02-16.1-6.03-22.43-4.01-6.32-9.7-11.24-17.08-14.73-7.36-3.49-15.95-5.24-25.78-5.24s-19.24,1.75-27.34,5.24c-8.12,3.5-14.44,8.37-18.98,14.62-3.27,4.5-5.36,9.43-6.28,14.77-.59,3.44,2,6.62,5.49,6.88l18.43,1.38c2.77.21,5.32-1.51,6.15-4.16.98-3.12,3.03-5.88,6.13-8.28,4.52-3.49,10.01-5.24,16.4-5.24,4.9,0,9.06,1.04,12.5,3.12,3.42,2.09,5.43,4.84,6.03,8.26.58,3.87-1.24,6.88-5.47,9.05-4.25,2.15-10.99,3.46-20.2,3.91-16.08.59-28.28,3.98-36.62,10.15-8.32,6.18-12.5,14.77-12.5,25.78,0,10.27,3.4,18.38,10.15,24.33,6.78,5.95,16.04,8.93,27.79,8.93,8.48,0,15.66-1.67,21.54-5.02,5.89-3.34,10.3-8.26,13.28-14.73,1.31-2.83,2.31-5.98,3.04-9.4,3,17.71,15.4,26.57,37.22,26.57h6.05c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6ZM589.53,159.97c-2.52,4.99-6.03,8.93-10.48,11.84-4.47,2.9-9.46,4.35-14.97,4.35-4.45,0-8.07-.96-10.83-2.9-2.74-1.93-4.12-4.91-4.12-8.93,0-4.61,1.67-7.7,5.01-9.26,3.36-1.56,7.94-2.57,13.73-3.02,1.2-.15,2.38-.3,3.58-.45,9.23-1.19,16.29-4.43,21.2-9.71.23-.25.45-.5.67-.76v2.43c0,5.96-1.27,11.43-3.8,16.4Z"/>
      <rect x="40.06" y="112.42" width="30" height="86.37" rx="6" ry="6"/>
      <rect x="40.06" y="65.55" width="30" height="30" rx="6" ry="6"/>
      <path d="M518.36,88.41c0-3.31-2.68-5.99-5.99-5.99h-18.02c-3.31,0-5.99,2.68-5.99,5.99v18.22c0,.71-.58,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0,0-.02-.02-.05-.03-.07-.27-.73-.56-1.44-.87-2.13-.05-.11-.1-.23-.15-.34-.33-.72-.69-1.42-1.07-2.09-.02-.03-.03-.05-.05-.08-.36-.64-.75-1.25-1.16-1.85-.07-.11-.15-.22-.22-.33-.43-.62-.88-1.22-1.36-1.79-.02-.03-.05-.05-.07-.08-.45-.54-.93-1.05-1.42-1.55-.1-.1-.2-.21-.31-.31-.53-.51-1.07-1.01-1.64-1.48-.03-.03-.07-.05-.1-.08-.54-.44-1.1-.85-1.67-1.25-.14-.09-.27-.19-.41-.28-.62-.41-1.25-.81-1.91-1.18-.05-.03-.1-.05-.15-.08-.62-.34-1.25-.66-1.91-.97-.17-.08-.35-.16-.53-.24-.71-.31-1.43-.62-2.17-.89-.07-.02-.14-.05-.2-.07-.69-.25-1.41-.48-2.13-.69-.22-.06-.43-.13-.65-.19-.79-.22-1.6-.43-2.43-.61-.08-.02-.17-.03-.25-.05-.77-.16-1.56-.3-2.36-.43-.26-.04-.51-.08-.77-.12-.86-.13-1.74-.24-2.64-.33-.11-.01-.23-.02-.34-.03-.86-.08-1.73-.14-2.62-.19-.29-.02-.59-.03-.88-.04-.92-.04-1.85-.06-2.81-.06-.07,0-.13,0-.2,0h-6.05c-3.31,0-6,2.69-6,6h0v13.22h0c0,3.32,2.69,6,6,6h.48c7.39,0,13.39,5.99,13.39,13.39v63.72s0,3.35,0,3.35c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h9.7s8.31,0,8.31,0c3.31,0,5.99-2.68,5.99-5.99v-18.02Z"/>
    </g>
  </symbol>
  <symbol id="icon-kuenstliche-intelligenz" viewBox="0.19 0.15 23.71 23.81"><path d="M6.23,15.79h1.52l-.76-2.46-.76,2.46ZM23.63,3.78l-2.42-.68c-.13-.04-.22-.13-.26-.26l-.68-2.42c-.1-.36-.62-.36-.72,0l-.68,2.42c-.04.13-.13.22-.26.26l-2.42.68c-.36.1-.36.62,0,.72l2.42.68c.13.04.22.13.26.26l.68,2.42c.1.36.62.36.72,0l.68-2.42c.04-.13.13-.22.26-.26l2.42-.68c.36-.1.36-.62,0-.72ZM14.75,6.34H3.24C1.56,6.34.19,7.7.19,9.39v11.52c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05v-11.52c0-1.68-1.36-3.05-3.05-3.05ZM8.57,18.43l-.41-1.32h-2.34l-.41,1.32h-1.82l2.6-7.08h1.61l2.62,7.08h-1.83ZM13.64,18.43h-1.7v-7.08h1.7v7.08Z"/></symbol>
  <symbol id="icon-ai-symbol" viewBox="0.645 1.89 22.8 20.315"><path d="M13.71,14.83l-4.09-1.16c-.21-.06-.38-.23-.44-.44l-1.16-4.09c-.17-.62-1.05-.62-1.22,0l-1.16,4.09c-.06.21-.23.38-.44.44l-4.09,1.16c-.62.17-.62,1.05,0,1.22l4.09,1.16c.21.06.38.23.44.44l1.16,4.09c.17.62,1.05.62,1.22,0l1.16-4.09c.06-.21.23-.38.44-.44l4.09-1.16c.62-.17.62-1.05,0-1.22ZM8.78,5.21l1.84.52c.1.03.17.1.2.2l.52,1.84c.08.28.47.28.55,0l.52-1.84c.03-.1.1-.17.2-.2l1.84-.52c.28-.08.28-.47,0-.55l-1.84-.52c-.1-.03-.17-.1-.2-.2l-.52-1.84c-.08-.28-.47-.28-.55,0l-.52,1.84c-.03.1-.1.17-.2.2l-1.84.52c-.28.08-.28.47,0,.55ZM23.1,10.17l-3.08-.87c-.16-.05-.29-.17-.33-.33l-.87-3.08c-.13-.46-.79-.46-.92,0l-.87,3.08c-.05.16-.17.29-.33.33l-3.08.87c-.46.13-.46.79,0,.92l3.08.87c.16.05.29.17.33.33l.87,3.08c.13.46.79.46.92,0l.87-3.08c.05-.16.17-.29.33-.33l3.08-.87c.46-.13.46-.79,0-.92Z"/></symbol>
  <symbol id="icon-anderes-thema" viewBox="0.48 3.327 23.132 17.463"><path d="M23.32,4.7l-1.08-1.08c-.39-.39-1.03-.39-1.43,0l-.67.67c-.77-.61-1.96-.57-2.66.14L7.33,14.58c-.27.27-.45.6-.54.97l-.64,2.78c-.03.15-.04.3-.05.45H1.23c-.41,0-.75.33-.75.75v.51c0,.41.33.75.75.75h6.83s0,0,.01,0c0,0,.02,0,.02,0,.15,0,.3-.02.46-.05l2.78-.64h0c.37-.09.7-.27.96-.54l10.15-10.15c.7-.7.76-1.81.2-2.59l.68-.68c.39-.39.39-1.03,0-1.43ZM10.88,18.13s0,0,0,0l-2.78.64.64-2.78,10.15-10.15,2.14,2.14-10.15,10.15Z"/></symbol>
  <symbol id="icon-burger-menu" viewBox="3.37 3.67 17.36 16.75"><rect x="3.37" y="16.92" width="17.36" height="3.5" rx="1.31" ry="1.31"/>
<rect x="3.37" y="3.67" width="17.36" height="3.5" rx="1.31" ry="1.31"/>
<rect x="3.37" y="10.3" width="17.36" height="3.5" rx="1.31" ry="1.31"/></symbol>
  <symbol id="icon-business-coaching" viewBox="3.79 2.14 16.53 19.81"><path d="M12.05,10.64c2.35,0,4.25-1.9,4.25-4.25s-1.9-4.25-4.25-4.25-4.25,1.9-4.25,4.25,1.9,4.25,4.25,4.25ZM15.54,12.29h-2.01v1.09c0,.55-.45,1-1,1h-.82c-.55,0-1-.45-1-1v-1.09h-2.16c-2.63,0-4.76,2.13-4.76,4.76v2.38c0,1.39,1.13,2.52,2.52,2.52h4.89v-5.73c0-.38.31-.7.7-.7h.61c.38,0,.7.31.7.7v5.73h4.59c1.39,0,2.52-1.13,2.52-2.52v-2.38c0-2.63-2.13-4.76-4.76-4.76Z"/></symbol>
  <symbol id="icon-firmenseminare" viewBox="1.43 0.336 21.24 23.224"><path d="M20.17,7.36h-4.86v-2.77c0-.84-.5-1.61-1.27-1.95L9.27.52c-.55-.24-1.18-.25-1.73,0L2.71,2.63c-.78.34-1.28,1.11-1.28,1.96v16.8c0,1.18.96,2.14,2.14,2.14h9.6s.03,0,.04,0c.1.01.21.03.32.03h6.65c1.37,0,2.49-1.12,2.49-2.49v-11.22c0-1.37-1.12-2.49-2.49-2.49ZM8.41,21.54H3.57c-.08,0-.14-.06-.14-.14V4.59c0-.06.03-.11.08-.13l4.84-2.12s.04-.01.06-.01c0,0,0,0,0,0v19.2ZM20.67,21.07c0,.27-.22.49-.49.49h-4.88c0-.06.02-.11.02-.17v-2.84h2.58c.38,0,.69-.31.69-.69v-.63c0-.38-.31-.69-.69-.69h-2.58v-2.35h2.53c.38,0,.69-.31.69-.69v-.63c0-.38-.31-.69-.69-.69h-2.53v-2.84h4.86c.27,0,.49.22.49.49v11.22Z"/></symbol>
  <symbol id="icon-consulting" viewBox="4.07 0.09 15.96 23.93"><path d="M10.29,14.66c0-1.45-1.18-2.63-2.63-2.63s-2.63,1.18-2.63,2.63,1.18,2.63,2.63,2.63,2.63-1.18,2.63-2.63ZM8.11,18.31h-.91c-1.73,0-3.13,1.4-3.13,3.13v.92c0,.91.74,1.66,1.66,1.66h3.86c.91,0,1.66-.74,1.66-1.66v-.92c0-1.73-1.4-3.13-3.13-3.13ZM14.78,9.95h3.22c1.06,0,1.92-.86,1.92-1.92V2.01c0-1.06-.86-1.92-1.92-1.92H6.1c-1.06,0-1.92.86-1.92,1.92v6.02c0,1.06.86,1.92,1.92,1.92h3.22c.31,0,.6.15.78.39l1.5,2.05c.22.31.68.31.91,0l1.5-2.05c.18-.25.47-.39.78-.39ZM14.65,4.9c0-.42.34-.75.75-.75h.55c.42,0,.75.34.75.75v.5c0,.42-.34.75-.75.75h-.55c-.42,0-.75-.34-.75-.75v-.5ZM9.44,5.4c0,.42-.34.75-.75.75h-.55c-.42,0-.75-.34-.75-.75v-.5c0-.42.34-.75.75-.75h.55c.42,0,.75.34.75.75v.5ZM13.08,5.4c0,.42-.34.75-.75.75h-.55c-.42,0-.75-.34-.75-.75v-.5c0-.42.34-.75.75-.75h.55c.42,0,.75.34.75.75v.5ZM13.8,14.66c0,1.45,1.18,2.63,2.63,2.63s2.63-1.18,2.63-2.63-1.18-2.63-2.63-2.63-2.63,1.18-2.63,2.63ZM16.89,18.31h-.91c-1.73,0-3.13,1.4-3.13,3.13v.92c0,.91.74,1.66,1.66,1.66h3.86c.91,0,1.66-.74,1.66-1.66v-.92c0-1.73-1.4-3.13-3.13-3.13Z"/></symbol>
  <symbol id="icon-datenschutz" viewBox="3.24 1.73 17.62 20.64"><path d="M17.81,7.33h-.37v-2.7c0-1.6-1.3-2.9-2.9-2.9h-4.97c-1.6,0-2.9,1.3-2.9,2.9v2.7h-.38c-1.68,0-3.05,1.36-3.05,3.05v8.94c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05v-8.94c0-1.68-1.36-3.05-3.05-3.05ZM13.8,16.58c0,.57-.46,1.03-1.03,1.03h-.96c-.57,0-1.03-.46-1.03-1.03v-3.46c0-.57.46-1.03,1.03-1.03h.96c.57,0,1.03.46,1.03,1.03v3.46ZM15.43,7.33h-6.77v-2.7c0-.5.4-.9.9-.9h4.97c.5,0,.9.4.9.9v2.7Z"/></symbol>
  <symbol id="icon-digitale-kompetenzen" viewBox="6.169 2.745 14.748 18.602"><path d="M6.55,20.14l-.38-16.12c-.03-1.07,1.23-1.67,2.05-.98l12.26,10.43c.89.76.33,2.22-.84,2.19l-6.07-.18c-.4-.01-.78.17-1.02.48l-3.77,4.9c-.71.93-2.2.44-2.23-.73Z"/></symbol>
  <symbol id="icon-einkauf" viewBox="0.6 0.95 22.903 22.19"><path d="M21.5,13.44l1.84-5.19c.31-.87.17-1.84-.36-2.59-.53-.75-1.4-1.2-2.32-1.2H6.32s0-.05,0-.07c-.27-2.12-1.69-3.44-3.72-3.44h-1.28c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h1.28c1.26,0,1.64.92,1.73,1.69.13,1.02.85,7.46,1.44,12.67.12,1.07.67,1.88,1.49,2.3-.82.16-1.44.88-1.44,1.75,0,.99.8,1.78,1.78,1.78s1.78-.8,1.78-1.78c0-.58-.28-1.08-.7-1.41.9,0,7.93-.1,10.94-.14-.54.31-.91.88-.91,1.55,0,.99.8,1.78,1.78,1.78s1.78-.8,1.78-1.78c0-.91-.68-1.65-1.56-1.76.15-.14.24-.33.24-.55v-.49c-.01-.42-.35-.75-.77-.74-2.53.04-10.63.15-11.53.15-.55,0-.85-.28-.92-.87-.05-.48-.11-.96-.16-1.45h10.79c1.4,0,2.65-.88,3.12-2.2ZM7.36,13.64c-.31-2.72-.61-5.38-.81-7.18h14.11c.28,0,.53.13.69.36.16.23.2.51.11.77l-1.84,5.19c-.18.52-.68.87-1.23.87H7.36Z"/></symbol>
  <symbol id="icon-fernlehrgaenge" viewBox="1.03 3.37 26.91 17.34"><path d="M14.49,6.72c-1.49,0-2.69,1.21-2.69,2.69s1.21,2.69,2.69,2.69,2.69-1.21,2.69-2.69-1.21-2.69-2.69-2.69ZM27.15,17.99h-1.31V7.14c0-2.08-1.69-3.77-3.77-3.77H6.92c-2.08,0-3.77,1.69-3.77,3.77v10.85h-1.32c-.44,0-.8.36-.8.8,0,1.06.86,1.92,1.92,1.92h23.07c1.06,0,1.92-.86,1.92-1.92,0-.44-.36-.8-.8-.8ZM23.92,17.99h-4.2v-1.07c0-2.09-1.69-3.78-3.78-3.78h-2.9c-2.09,0-3.78,1.69-3.78,3.78v1.07h-4.2V7.14c0-1.02.83-1.86,1.86-1.86h15.14c1.02,0,1.86.83,1.86,1.86v10.85Z"/></symbol>
  <symbol id="icon-fuehrungskompetenzen" viewBox="1.45 1.45 21.18 21.19"><path d="M12.05,1.45C6.21,1.45,1.45,6.2,1.45,12.05s4.75,10.59,10.59,10.59,10.59-4.75,10.59-10.59S17.89,1.45,12.05,1.45ZM12.05,20.64c-4.74,0-8.59-3.86-8.59-8.59S7.31,3.45,12.05,3.45s8.59,3.86,8.59,8.59-3.86,8.59-8.59,8.59ZM16.1,7.27l-5.07,2.4h0c-.3.13-.57.3-.81.53h0c-.25.25-.44.55-.57.87h0s-2.37,5.03-2.37,5.03c-.22.46.26.95.73.73l5.17-2.44h0c.26-.13.51-.29.73-.51.25-.25.44-.54.57-.85h0s2.37-5.03,2.37-5.03c.22-.46-.26-.95-.73-.73ZM12.63,12.62c-.32.32-.84.32-1.16,0-.15-.15-.24-.36-.24-.58s.09-.42.24-.58h0c.15-.15.36-.24.58-.24s.42.09.58.24c.15.15.24.36.24.58s-.09.42-.24.58Z"/></symbol>
  <symbol id="icon-gefoerderte-weiterbildung" viewBox="0.305 4.508 23.485 15.083"><path d="M11.75,15.25c-.31,0-.63-.05-.93-.14l-6.84-2.17v4.31c0,1.29,1.05,2.34,2.34,2.34h10.35c1.29,0,2.34-1.05,2.34-2.34v-4.15l-6.33,2c-.3.1-.62.14-.93.14ZM23.2,13.93v-5.01s0-.02,0-.03v-.04h0c-.02-.44-.28-.87-.79-1.03l-10.31-3.26c-.22-.07-.46-.07-.69,0L1.1,7.82c-1.06.34-1.06,1.84,0,2.17l10.31,3.26c.22.07.46.07.69,0l9.16-2.9v3.58c-.34.1-.6.41-.6.79v2.1c0,.46.37.83.83.83h1.47c.46,0,.83-.37.83-.83v-2.1c0-.38-.25-.68-.6-.79Z"/></symbol>
  <symbol id="icon-gesundheitsmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M14.58,8.11c-.86-.11-1.64.19-2.2.73-.19.18-.48.18-.67,0-.55-.54-1.34-.84-2.2-.73-1.24.15-2.22,1.19-2.32,2.43-.07.86.27,1.63.84,2.16l3.64,3.64c.2.2.54.2.74,0l3.66-3.66h0c.56-.54.89-1.31.82-2.16-.1-1.24-1.08-2.26-2.31-2.41ZM2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67Z"/></symbol>
  <symbol id="icon-immobilienmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M9.04,16.54h6.01c.64,0,1.16-.52,1.16-1.16v-4.1h.51c.41,0,.6-.52.28-.78l-4.68-3.91c-.16-.14-.4-.14-.57,0l-4.68,3.91c-.32.26-.13.78.28.78h.51v4.1c0,.64.52,1.16,1.16,1.16ZM2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67Z"/></symbol>
  <symbol id="icon-avgs-coaching" viewBox="1.97 2.99 20.14 18.12"><path d="M19.29,6.93h-1.86v-1.04c0-1.6-1.3-2.9-2.9-2.9h-4.97c-1.6,0-2.9,1.3-2.9,2.9v1.04h-1.86c-1.56,0-2.83,1.27-2.83,2.83v8.52c0,1.56,1.27,2.83,2.83,2.83h14.48c1.56,0,2.83-1.27,2.83-2.83v-8.52c0-1.56-1.27-2.83-2.83-2.83ZM15.43,6.93h-6.77v-1.04c0-.5.4-.9.9-.9h4.97c.5,0,.9.4.9.9v1.04Z"/></symbol>
  <symbol id="icon-kommunikation" viewBox="2.6 2.66 18.9 18.775"><path d="M18.62,2.66H5.48c-1.59,0-2.88,1.29-2.88,2.88v9.01c0,1.59,1.29,2.88,2.88,2.88h2.48c.46,0,.89.22,1.16.59l2.25,3.07c.34.46,1.02.46,1.36,0l2.25-3.07c.27-.37.7-.59,1.16-.59h2.48c1.59,0,2.88-1.29,2.88-2.88V5.54c0-1.59-1.29-2.88-2.88-2.88ZM17.22,12.36c0,.34-.28.62-.62.62H7.49c-.34,0-.62-.28-.62-.62v-.56c0-.34.28-.62.62-.62h9.11c.34,0,.62.28.62.62v.56ZM17.22,8.34c0,.34-.28.62-.62.62H7.49c-.34,0-.62-.28-.62-.62v-.56c0-.34.28-.62.62-.62h9.11c.34,0,.62.28.62.62v.56Z"/></symbol>
  <symbol id="icon-link" viewBox="1.22 7.29 21.66 9.51"><path d="M14.52,10.74h-.52c-.41,0-.74.33-.74.74v1.73c0,.88-.71,1.59-1.59,1.59h-6.86c-.88,0-1.59-.71-1.59-1.59v-2.33c0-.88.71-1.59,1.59-1.59h2.53c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-2.53c-1.98,0-3.59,1.61-3.59,3.59v2.33c0,1.98,1.61,3.59,3.59,3.59h6.86c1.98,0,3.59-1.61,3.59-3.59v-1.73c0-.41-.33-.74-.74-.74ZM19.29,7.29h-6.86c-1.98,0-3.59,1.61-3.59,3.59v1.76c0,.39.32.71.72.71h.57c.39,0,.71-.32.71-.71v-1.76c0-.88.71-1.59,1.59-1.59h6.86c.88,0,1.59.71,1.59,1.59v2.33c0,.88-.71,1.59-1.59,1.59h-2.49c-.42,0-.76.34-.76.76v.48c0,.42.34.76.76.76h2.49c1.98,0,3.59-1.61,3.59-3.59v-2.33c0-1.98-1.61-3.59-3.59-3.59Z"/></symbol>
  <symbol id="icon-nachhaltigkeitsmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM16.05,7.33c-1.38-.08-4.58-.04-6.48,1.85s-1.94,5.1-1.85,6.48c.02.39.33.7.72.72,1.38.08,4.58.04,6.48-1.85s1.94-5.1,1.85-6.48c-.02-.39-.33-.7-.72-.72ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67Z"/></symbol>
  <symbol id="icon-offene-seminare" viewBox="1.78 0.22 27.67 23.64"><path d="M11.83,10.88c0,2.02,1.64,3.66,3.66,3.66s3.66-1.64,3.66-3.66-1.64-3.66-3.66-3.66-3.66,1.64-3.66,3.66ZM23.73,9.05c-1.57,0-2.85,1.27-2.85,2.85s1.28,2.85,2.85,2.85,2.85-1.27,2.85-2.85-1.28-2.85-2.85-2.85ZM5.56,3.34h.7v3.77c0,.37.3.66.66.66h.61c.37,0,.66-.3.66-.66v-3.77h14.84v3.72c0,.39.32.71.71.71h.51c.39,0,.71-.32.71-.71v-3.72h.7c.39,0,.7-.31.7-.7v-.54c0-.39-.31-.7-.7-.7h-9.09v-.48c0-.39-.31-.7-.7-.7h-.54c-.39,0-.7.31-.7.7v.48H5.56c-.39,0-.7.31-.7.7v.54c0,.39.31.7.7.7ZM18.51,15.95h-6.02c-2.27,0-4.1,1.43-4.1,3.69v2.05c0,1.2.97,2.17,2.17,2.17h9.88c1.2,0,2.17-.97,2.17-2.17v-2.05c0-2.27-1.84-3.69-4.1-3.69ZM7.02,14.74c1.57,0,2.85-1.27,2.85-2.85s-1.28-2.85-2.85-2.85-2.85,1.27-2.85,2.85,1.28,2.85,2.85,2.85ZM26.26,15.84h-3.31c1.06,1.09,1.72,2.16,1.72,3.8v2.05c0,.07-.02.14-.02.21h3.11c.93,0,1.69-.76,1.69-1.69v-1.18c0-1.76-1.43-3.19-3.19-3.19ZM8.28,15.84h-3.31c-1.76,0-3.19,1.43-3.19,3.19v1.18c0,.93.76,1.69,1.69,1.69h3.11c0-.07-.02-.14-.02-.21v-2.05c0-1.64.66-2.71,1.72-3.8Z"/></symbol>
  <symbol id="icon-organisationsmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M16.44,14.65h-5.5c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h5.5c.41,0,.73-.33.73-.73v-.47c0-.41-.33-.73-.73-.73ZM17.17,11.73c0-.41-.33-.73-.73-.73h-5.5c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h5.5c.41,0,.73-.33.73-.73v-.47ZM2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM17.17,8.09c0-.41-.33-.73-.73-.73h-5.5c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h5.5c.41,0,.73-.33.73-.73v-.47ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67ZM8.95,8.09c0-.41-.33-.73-.73-.73h-.47c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h.47c.41,0,.73-.33.73-.73v-.47ZM8.22,14.65h-.47c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h.47c.41,0,.73-.33.73-.73v-.47c0-.41-.33-.73-.73-.73ZM8.95,11.73c0-.41-.33-.73-.73-.73h-.47c-.41,0-.73.33-.73.73v.47c0,.41.33.73.73.73h.47c.41,0,.73-.33.73-.73v-.47Z"/></symbol>
  <symbol id="icon-personalmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM7.27,15.18v.49c0,.98.79,1.77,1.77,1.77h6.02c.98,0,1.77-.79,1.77-1.77v-.49c0-1.84-1.49-3.33-3.33-3.33h-2.89c-1.84,0-3.33,1.49-3.33,3.33ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67ZM14.51,8.44c0-1.36-1.1-2.46-2.46-2.46s-2.46,1.1-2.46,2.46,1.1,2.46,2.46,2.46,2.46-1.1,2.46-2.46Z"/></symbol>
  <symbol id="icon-logistik-und-produktionsmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM9.57,8.36l-2.93,2.11c-.16.11-.25.29-.25.49v3.89c0,.33.27.6.6.6h9.82c.33,0,.6-.27.6-.6v-6c0-.49-.55-.77-.95-.49l-2.62,1.89v-1.4c0-.49-.55-.77-.95-.49l-2.37,1.7v-1.22c0-.49-.55-.77-.95-.49ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67Z"/></symbol>
  <symbol id="icon-projektmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67ZM2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM6.6,14.37c0,.96.78,1.74,1.74,1.74h7.62c.96,0,1.74-.78,1.74-1.74v-4.29c0-.96-.78-1.74-1.74-1.74h-3.54c-.26-.29-.64-.69-.88-.94-.14-.15-.33-.23-.54-.23h-3.01c-.77,0-1.39.62-1.39,1.39v1.48s0,.01,0,.02c0,0,0,.01,0,.02v4.29Z"/></symbol>
  <symbol id="icon-prozess-und-qualitaetsmanagement" viewBox="1.778 0.076 20.555 23.959"><path d="M2.47,16.73h.61c.37,0,.67-.3.67-.67V6.61c0-1.6,1.3-2.9,2.9-2.9h11.88v1.14c0,.54.63.84,1.04.49l2.53-2.07c.31-.26.31-.73,0-.99L19.56.22c-.42-.34-1.04-.04-1.04.49v1.07H6.64C3.97,1.77,1.8,3.94,1.8,6.61v9.44c0,.37.3.67.67.67ZM21.59,7.41h-.6c-.37,0-.67.3-.67.67v9.32c0,1.6-1.3,2.9-2.9,2.9H5.58v-1.05c0-.54-.63-.84-1.04-.49l-2.53,2.07c-.31.26-.31.73,0,.99l2.53,2.07c.42.34,1.04.04,1.04-.49v-1.15h11.84c2.67,0,4.84-2.17,4.84-4.84v-9.32c0-.37-.3-.67-.67-.67ZM17.31,12.95c.22-.04.38-.24.38-.46v-.87c0-.23-.16-.42-.38-.46l-1.05-.21c-.1-.38-.25-.75-.45-1.08l.59-.9c.12-.19.1-.44-.06-.6l-.62-.62c-.16-.16-.41-.18-.6-.06l-.9.59c-.34-.2-.7-.35-1.08-.45l-.21-1.05c-.04-.22-.24-.38-.46-.38h-.87c-.23,0-.42.16-.46.38l-.21,1.05c-.38.1-.75.25-1.08.45l-.9-.59c-.19-.12-.44-.1-.6.06l-.62.62c-.16.16-.18.41-.06.6l.59.9c-.2.34-.35.7-.45,1.08l-1.05.21c-.22.04-.38.24-.38.46v.87c0,.23.16.42.38.46l1.05.21c.1.38.25.75.45,1.08l-.59.9c-.12.19-.1.44.06.6l.62.62c.16.16.41.18.6.06l.9-.59c.34.2.7.35,1.08.45l.21,1.05c.04.22.24.38.46.38h.87c.23,0,.42-.16.46-.38l.21-1.05c.38-.1.75-.25,1.08-.45l.9.59c.19.12.44.1.6-.06l.62-.62c.16-.16.18-.41.06-.6l-.59-.9c.2-.34.35-.7.45-1.08l1.05-.21ZM12.05,14.48c-1.34,0-2.44-1.09-2.44-2.44s1.09-2.44,2.44-2.44,2.44,1.09,2.44,2.44-1.09,2.44-2.44,2.44Z"/></symbol>
  <symbol id="icon-rechnungswesen-und-controlling" viewBox="3.24 3.24 17.62 17.62"><path d="M17.81,3.24H6.29c-1.68,0-3.05,1.36-3.05,3.05v11.52c0,1.68,1.36,3.05,3.05,3.05h11.52c1.68,0,3.05-1.36,3.05-3.05V6.29c0-1.68-1.36-3.05-3.05-3.05ZM15.37,7.78c0,.26-.21.46-.46.46h-3.22c-.99,0-1.79.8-1.79,1.79h0s2.85,0,2.85,0c.25,0,.46.21.46.46v.4c0,.25-.21.46-.46.46h-2.85v1.38h2.85c.25,0,.46.21.46.46v.4c0,.25-.21.46-.46.46h-2.85c0,.99.8,1.79,1.79,1.79h3.23c.25,0,.46.21.46.46v.4c0,.25-.21.46-.46.46h-3.23c-1.72,0-3.11-1.39-3.11-3.11h0s-.7,0-.7,0c-.25,0-.46-.21-.46-.46v-.4c0-.25.21-.46.46-.46h.7v-1.38h-.7c-.25,0-.46-.21-.46-.46v-.4c0-.25.21-.46.46-.46h.7c0-1.72,1.39-3.11,3.11-3.11h3.22c.26,0,.46.21.46.46v.39Z"/></symbol>
  <symbol id="icon-recht" viewBox="0.482 1.972 23.127 20.158"><path d="M21.91,9.83h.66c1.07,0,1.44-1.43.5-1.95L12.55,2.1c-.31-.17-.69-.17-1,0L1.02,7.88c-.94.52-.57,1.95.5,1.95h.66c.57,0,1.04.47,1.04,1.04v6.21c0,.57-.47,1.04-1.04,1.04h-.39c-.57,0-1.04.47-1.04,1.04v1.93c0,.57.47,1.04,1.04,1.04h20.13c.57,0,1.04-.47,1.04-1.04v-1.93c0-.57-.47-1.04-1.04-1.04h0c-.57,0-1.04-.47-1.04-1.04v-6.21c0-.57.47-1.04,1.04-1.04ZM9.23,18.12h-1.42c-.57,0-1.04-.47-1.04-1.04v-6.21c0-.57.47-1.04,1.04-1.04h1.42c.57,0,1.04.47,1.04,1.04v6.21c0,.57-.47,1.04-1.04,1.04ZM16.28,18.12h-1.42c-.57,0-1.04-.47-1.04-1.04v-6.21c0-.57.47-1.04,1.04-1.04h1.42c.57,0,1.04.47,1.04,1.04v6.21c0,.57-.47,1.04-1.04,1.04Z"/></symbol>
  <symbol id="icon-sap" viewBox="2.06 2.63 19.98 18.84"><path d="M17.53,8.27h-.85v1.53h.84c.25,0,.44-.06.57-.19s.2-.3.2-.53c0-.25-.07-.45-.2-.59-.13-.15-.32-.22-.55-.23ZM11.51,10.6h1.14l-.57-1.84-.57,1.84ZM18.99,2.63H5.11c-1.68,0-3.05,1.36-3.05,3.05v8.51c0,1.68,1.36,3.05,3.05,3.05h4.96v2.23h-3.21c-.4,0-.72.32-.72.72v.56c0,.4.32.72.72.72h10.38c.4,0,.72-.32.72-.72v-.56c0-.4-.32-.72-.72-.72h-3.21v-2.23h4.96c1.68,0,3.05-1.36,3.05-3.05V5.68c0-1.68-1.36-3.05-3.05-3.05ZM6.53,9.08c.15.11.4.22.77.34.37.12.67.24.9.38.57.33.86.79.86,1.37,0,.46-.17.83-.52,1.09s-.83.4-1.44.4c-.43,0-.82-.08-1.17-.23s-.61-.37-.79-.63c-.18-.27-.26-.58-.26-.93h1.28c0,.28.07.49.22.63.15.13.39.2.72.2.21,0,.38-.05.5-.14.12-.09.18-.22.18-.38,0-.19-.07-.33-.2-.44-.13-.1-.37-.21-.7-.32-.33-.11-.6-.22-.82-.32-.69-.34-1.03-.8-1.03-1.39,0-.29.08-.55.26-.78.17-.22.41-.4.73-.53.31-.12.67-.19,1.06-.19s.72.07,1.03.2c.3.14.54.33.71.58.17.25.25.54.25.86h-1.27c0-.22-.07-.38-.2-.5-.13-.12-.31-.18-.54-.18s-.41.05-.54.15-.2.23-.2.38c0,.14.07.26.22.37ZM13.27,12.58l-.31-.99h-1.75l-.31.99h-1.37l1.95-5.3h1.2l1.96,5.3h-1.37ZM19.02,10.32c-.37.31-.88.46-1.52.46h-.82v1.8h-1.28v-5.3h2.12c.41,0,.76.07,1.08.22.31.15.55.36.72.64.17.28.26.59.26.94,0,.52-.19.93-.56,1.24Z"/></symbol>
  <symbol id="icon-soft-skills" viewBox="0.62 1.63 25.14 20.83"><path d="M12.67,5.42v1.63c0,.23.19.43.43.43h.17c.23,0,.43-.19.43-.43v-1.63c.82-.23,1.42-.97,1.42-1.86,0-1.07-.87-1.93-1.93-1.93s-1.93.87-1.93,1.93c0,.89.61,1.63,1.43,1.86ZM13.17,2.63c.51,0,.93.42.93.93s-.42.93-.93.93-.93-.42-.93-.93.42-.93.93-.93ZM13.19,14.97c1.56,0,2.82-1.26,2.82-2.82s-1.26-2.82-2.82-2.82-2.82,1.26-2.82,2.82,1.26,2.82,2.82,2.82ZM23.83,12.27c-.89,0-1.63.61-1.86,1.43h-1.5c-.23,0-.43.19-.43.43v.17c0,.23.19.43.43.43h1.5c.22.82.97,1.43,1.86,1.43,1.07,0,1.93-.87,1.93-1.93s-.87-1.93-1.93-1.93ZM23.83,15.14c-.52,0-.93-.42-.93-.93s.42-.93.93-.93.93.42.93.93-.42.93-.93.93ZM14.94,16.06h-3.5c-2.06,0-3.72,1.67-3.72,3.72v.71c0,1.09.88,1.97,1.97,1.97h7c1.09,0,1.97-.88,1.97-1.97v-.71c0-2.06-1.67-3.72-3.72-3.72ZM22.08,8.05c.75-.75.75-1.98,0-2.74-.75-.75-1.98-.75-2.73,0-.63.63-.73,1.6-.3,2.34l-1.06,1.06c-.17.17-.17.44,0,.6l.12.12c.17.17.44.17.6,0l1.07-1.07c.29.16.61.25.94.25.5,0,.99-.19,1.37-.57ZM20.06,6.02c.36-.36.96-.36,1.32,0,.36.36.36.96,0,1.32-.36.36-.96.36-1.32,0-.36-.36-.36-.96,0-1.32ZM8.32,9.43l.12-.12c.17-.17.17-.44,0-.6l-1.09-1.09c.41-.74.31-1.68-.31-2.31-.75-.75-1.98-.75-2.73,0-.75.75-.75,1.98,0,2.74.38.38.87.57,1.37.57.34,0,.67-.09.97-.27l1.09,1.09c.17.17.44.17.6,0ZM6.33,7.34c-.36.36-.96.36-1.32,0-.36-.36-.36-.96,0-1.32.36-.36.96-.36,1.32,0,.36.36.36.96,0,1.32ZM5.96,13.69h-1.55c-.23-.82-.97-1.42-1.86-1.42-1.07,0-1.93.87-1.93,1.93s.87,1.93,1.93,1.93c.89,0,1.63-.61,1.86-1.42h1.55c.23,0,.43-.19.43-.43v-.17c0-.23-.19-.43-.43-.43ZM2.55,15.14c-.51,0-.93-.42-.93-.93s.42-.93.93-.93.93.42.93.93-.42.93-.93.93Z"/></symbol>
  <symbol id="icon-train-the-trainer" viewBox="1.08 4.4 25.73 15.3"><path d="M5.55,10.96c1.81,0,3.28-1.47,3.28-3.28s-1.47-3.28-3.28-3.28-3.28,1.47-3.28,3.28,1.47,3.28,3.28,3.28ZM23.67,12.23h-2.68c-1.73,0-3.13,1.4-3.13,3.13v2.68c0,.91.74,1.66,1.66,1.66h5.63c.91,0,1.66-.74,1.66-1.66v-2.68c0-1.73-1.4-3.13-3.13-3.13ZM22.34,10.96c1.81,0,3.28-1.47,3.28-3.28s-1.47-3.28-3.28-3.28-3.28,1.47-3.28,3.28,1.47,3.28,3.28,3.28ZM17.91,10.67l-2.81-2.29c-.39-.32-.99-.04-.99.47v1.28h-3.26c-.37,0-.66.3-.66.66v.7c0,.37.3.66.66.66h3.26v1.28c0,.51.59.79.99.47l2.81-2.29c.3-.24.3-.69,0-.94ZM6.89,12.23h-2.68c-1.73,0-3.13,1.4-3.13,3.13v2.68c0,.91.74,1.66,1.66,1.66h5.63c.91,0,1.66-.74,1.66-1.66v-2.68c0-1.73-1.4-3.13-3.13-3.13Z"/></symbol>
  <symbol id="icon-vertrieb" viewBox="0.21 3.57 23.66 16.96"><path d="M23.27,12.02l-4.04-5.36c-.35-.5-.76-.61-1.47-.61h-2.12v-.07c0-1.33-1.08-2.41-2.41-2.41H2.62C1.29,3.57.21,4.65.21,5.98v9.78c0,1.33,1.07,2.4,2.4,2.41,0,0,0,.01,0,.02,0,1.29,1.05,2.34,2.34,2.34s2.34-1.05,2.34-2.34c0,0,0-.01,0-.02h5.94c.07,0,.14-.02.21-.02h2.27s0,.03,0,.04c0,1.29,1.05,2.34,2.34,2.34s2.34-1.05,2.34-2.34c0-.01,0-.03,0-.04h1.4c1.15,0,2.08-.93,2.08-2.08v-2.58c0-.55-.28-1.07-.61-1.47ZM19.85,12.08h-3.41c-.29,0-.53-.24-.53-.53v-2.95c0-.29.24-.53.53-.53h1.18c.17,0,.32.08.42.21l2.23,2.95c.26.35.02.85-.42.85Z"/></symbol>
  <symbol id="icon-marketing-und-pr" viewBox="1.39 2.718 21.3 18.662"><path d="M21.28,8.36h-.13v-2.91c0-.97-.5-1.84-1.33-2.34-.83-.5-1.83-.52-2.69-.07l-7.03,3.76s-.08.06-.13.09H3.26c-1.03,0-1.87.84-1.87,1.87v11.21c0,.92.91,1.55,1.77,1.24l1.83-.67c.52-.19.87-.69.87-1.24v-2.1h4.11s.08.07.12.09l7.03,3.76c.41.22.85.33,1.29.33.48,0,.97-.13,1.4-.39.83-.5,1.33-1.37,1.33-2.34v-2.91h.13c.78,0,1.42-.64,1.42-1.42v-4.54c0-.78-.64-1.42-1.42-1.42ZM19.14,18.65c0,.37-.25.56-.35.63-.11.06-.39.19-.72.02l-7.03-3.76c-.24-.13-.38-.37-.38-.64v-5.68c0-.27.15-.52.38-.64l7.03-3.76c.12-.07.24-.09.34-.09.17,0,.31.07.38.11.11.06.35.25.35.62v13.2Z"/></symbol>
</svg>
</div>
<div class="cms-print-head" aria-hidden="true"><span class="cms-print-logo"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 980 372" fill="currentColor" role="img" aria-label="ifmera academy Logo">
<g>
<path d="M104.69,299.14c-.64-.74-.96-1.99-.96-3.77v-32.35c0-9.95-2.66-17.75-7.98-23.42-5.32-5.66-13-8.5-23.05-8.5-8.86,0-16.13,2.29-21.79,6.87-5.67,4.58-9.23,10.56-10.71,17.95l13.15,1.03c1.18-4.53,3.35-8,6.5-10.42,3.15-2.41,7.44-3.62,12.85-3.62,6.21,0,10.86,1.62,13.96,4.88,3.1,3.25,4.65,8.18,4.65,14.77l-27.77,5.17c-8.57,1.58-14.82,4.28-18.76,8.13-3.94,3.84-5.91,9.11-5.91,15.81s2.39,11.92,7.17,15.66c4.78,3.74,11.2,5.61,19.28,5.61,4.43,0,8.62-.76,12.56-2.29,3.94-1.53,7.24-3.64,9.9-6.35,1.62-1.65,2.86-3.41,3.75-5.29.23,2.11.65,3.93,1.27,5.44.98,2.41,2.59,4.19,4.8,5.32,2.22,1.13,5.1,1.7,8.64,1.7.98,0,1.92-.03,2.81-.07.89-.05,1.53-.12,1.92-.22v-10.93h-3.1c-1.48,0-2.54-.37-3.18-1.11ZM79.87,298.99c-3.69,2.02-8.15,3.03-13.37,3.03-4.53,0-8.1-1.01-10.71-3.03-2.61-2.02-3.92-4.85-3.92-8.5,0-3.25,1.01-5.88,3.03-7.9,2.02-2.02,5.69-3.52,11.01-4.51l25.41-4.73v5.61c0,4.33-.99,8.25-2.95,11.75-1.97,3.5-4.8,6.26-8.5,8.27Z"/>
<path d="M155.29,242.92c5.32,0,9.8,1.4,13.44,4.21,3.64,2.81,5.91,6.82,6.8,12.04l13-.89c-.89-5.81-2.81-10.73-5.76-14.77-2.96-4.04-6.77-7.11-11.45-9.23-4.68-2.12-10.02-3.18-16.03-3.18-7.29,0-13.62,1.7-18.98,5.1-5.37,3.4-9.53,8.15-12.48,14.26-2.95,6.11-4.43,13.3-4.43,21.57s1.48,15.49,4.43,21.64c2.96,6.16,7.11,10.91,12.48,14.26,5.37,3.35,11.69,5.02,18.98,5.02,6.01,0,11.35-1.18,16.03-3.54,4.68-2.36,8.49-5.69,11.45-9.97,2.95-4.28,4.88-9.33,5.76-15.14l-13-.89c-.89,5.91-3.15,10.34-6.8,13.3-3.65,2.96-8.13,4.43-13.44,4.43-7.19,0-12.8-2.59-16.84-7.76-4.04-5.17-6.06-12.29-6.06-21.35s2.02-16.18,6.06-21.35c4.04-5.17,9.65-7.76,16.84-7.76Z"/>
<path d="M266.46,299.14c-.64-.74-.96-1.99-.96-3.77v-32.35c0-9.95-2.66-17.75-7.98-23.42-5.32-5.66-13-8.5-23.05-8.5-8.86,0-16.13,2.29-21.79,6.87-5.66,4.58-9.23,10.56-10.71,17.95l13.15,1.03c1.18-4.53,3.35-8,6.5-10.42,3.15-2.41,7.44-3.62,12.85-3.62,6.21,0,10.86,1.62,13.96,4.88,3.1,3.25,4.65,8.18,4.65,14.77l-27.78,5.17c-8.57,1.58-14.82,4.28-18.76,8.13-3.94,3.84-5.91,9.11-5.91,15.81s2.39,11.92,7.17,15.66c4.78,3.74,11.2,5.61,19.28,5.61,4.43,0,8.62-.76,12.56-2.29,3.94-1.53,7.24-3.64,9.9-6.35,1.62-1.65,2.86-3.41,3.75-5.29.23,2.11.65,3.93,1.27,5.44.98,2.41,2.58,4.19,4.8,5.32,2.22,1.13,5.1,1.7,8.64,1.7.98,0,1.92-.03,2.81-.07.89-.05,1.53-.12,1.92-.22v-10.93h-3.1c-1.48,0-2.54-.37-3.18-1.11ZM241.64,298.99c-3.69,2.02-8.15,3.03-13.37,3.03-4.53,0-8.1-1.01-10.71-3.03-2.61-2.02-3.92-4.85-3.92-8.5,0-3.25,1.01-5.88,3.03-7.9,2.02-2.02,5.69-3.52,11.01-4.51l25.41-4.73v5.61c0,4.33-.99,8.25-2.96,11.75-1.97,3.5-4.8,6.26-8.5,8.27Z"/>
<path d="M338.34,243.81c-2.17-4.04-5.42-7.17-9.75-9.38-4.34-2.22-9.11-3.32-14.33-3.32-6.8,0-12.68,1.68-17.66,5.02-4.97,3.35-8.79,8.08-11.45,14.18-2.66,6.11-3.99,13.35-3.99,21.72s1.33,15.61,3.99,21.72c2.66,6.11,6.48,10.84,11.45,14.18,4.97,3.35,10.86,5.02,17.66,5.02,5.51,0,10.49-1.21,14.92-3.62s7.73-5.74,9.9-9.97l.44,11.82h11.23v-100.73h-12.41v33.36ZM335.83,287.46c-1.68,4.38-4.11,7.76-7.31,10.12-3.2,2.36-7.12,3.55-11.75,3.55-6.9,0-12.39-2.61-16.47-7.83-4.09-5.22-6.13-12.31-6.13-21.27s2.04-16.18,6.13-21.35c4.09-5.17,9.58-7.76,16.47-7.76,4.63,0,8.54,1.16,11.75,3.47,3.2,2.32,5.64,5.64,7.31,9.97,1.67,4.33,2.51,9.55,2.51,15.66s-.84,11.06-2.51,15.44Z"/>
<path d="M420.92,235.9c-5.22-3.2-11.23-4.8-18.02-4.8-7.19,0-13.42,1.7-18.69,5.1-5.27,3.4-9.36,8.15-12.26,14.26-2.91,6.11-4.36,13.3-4.36,21.57s1.45,15.49,4.36,21.64c2.9,6.16,7.04,10.91,12.41,14.26,5.37,3.35,11.75,5.02,19.13,5.02,8.27,0,15.29-2.24,21.05-6.72,5.76-4.48,9.68-10.22,11.75-17.21l-13.3-1.03c-1.28,3.94-3.57,7.12-6.87,9.53-3.3,2.42-7.51,3.62-12.63,3.62-6.8,0-12.19-2.12-16.18-6.35-3.99-4.23-6.23-10.54-6.72-18.91h56.88v-3.69c0-8.77-1.45-16.2-4.36-22.31-2.91-6.11-6.97-10.76-12.19-13.96ZM380.59,264.93c1.08-7.29,3.57-12.78,7.46-16.47,3.89-3.69,8.84-5.54,14.85-5.54s10.61,1.77,14.4,5.32c3.79,3.55,5.98,9.11,6.57,16.7h-43.29Z"/>
<path d="M548.57,234.57c-3.84-2.31-8.57-3.47-14.18-3.47-4.34,0-8.18.84-11.52,2.51-3.35,1.68-6.08,4.06-8.2,7.17-1.32,1.93-2.38,4.15-3.19,6.64-1.42-4.37-3.7-7.94-6.86-10.7-4.28-3.74-9.82-5.61-16.62-5.61-3.94,0-7.53.86-10.78,2.59-3.25,1.72-5.98,4.14-8.2,7.24-1.21,1.69-2.21,3.56-3.02,5.61l-.31-13.67h-11.38v78.3h12.41v-46.83c0-4.63.76-8.62,2.29-11.97,1.53-3.35,3.64-5.91,6.35-7.68,2.71-1.77,5.88-2.66,9.53-2.66,5.81,0,9.95,1.97,12.41,5.91,2.46,3.94,3.69,9.41,3.69,16.4v46.83h12.41v-46.83c0-4.73.74-8.74,2.22-12.04,1.48-3.3,3.57-5.84,6.28-7.61,2.71-1.77,5.88-2.66,9.53-2.66,5.42,0,9.5,1.8,12.26,5.39,2.76,3.6,4.14,8.94,4.14,16.03v47.72h12.41v-50.38c0-6.3-.99-11.67-2.96-16.1-1.97-4.43-4.88-7.81-8.72-10.12Z"/>
<path d="M629.53,232.88l-22.31,65.3-23.34-65.3h-13.59l27.21,72.92c.88,2.35,3.12,3.9,5.62,3.9h.12s-2.81,7.39-2.81,7.39c-.69,1.87-1.7,3.23-3.03,4.06-1.33.83-3.38,1.26-6.13,1.26h-9.01v10.93h10.19c5.22,0,9.31-.99,12.26-2.96,2.96-1.97,5.17-5.07,6.65-9.31l31.76-88.2h-13.59Z"/>
</g>
<rect x="864.16" y="49.66" width="75.09" height="75.09" rx="15" ry="15"/>
<g>
<path d="M276.02,87.2h-19.05c-3.31,0-6,2.69-6,6v13.43c0,.71-.57,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0-4.79-13.25-16.62-19.88-35.49-19.88h-19.05c-3.31,0-6,2.69-6,6v13.22c0,3.31-2.69,6-6,6h-18c-3.31,0-6,2.69-6,6v74.37c0,3.31,2.69,6,6,6h18c3.31,0,6-2.69,6-6v-74.37c0-3.31,2.68-5.99,5.99-6h13.49c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h13.48c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-69.97c0-23.81-12.64-35.71-37.95-35.71Z"/>
<path d="M409.7,90.11c-8.41-4.99-18.11-7.48-29.12-7.48s-20.55,2.49-29.03,7.48c-8.48,4.99-15.1,11.98-19.85,20.98-4.78,9.01-7.16,19.31-7.16,30.92s2.49,22.13,7.48,31.14c4.98,9.01,11.97,15.97,20.98,20.87,9.01,4.91,19.38,7.37,31.14,7.37,13.99,0,25.78-3.34,35.39-10.05,7.3-5.09,12.3-11.4,15-18.91,1.33-3.71-1.31-7.66-5.24-7.95l-19.3-1.41c-2.18-.16-4.32.85-5.46,2.71-1.7,2.77-4.11,5.04-7.21,6.82-4.16,2.38-9.01,3.57-14.51,3.57-5.2,0-9.88-1.08-14.06-3.23-4.16-2.16-7.39-5.13-9.7-8.93s-3.47-8.15-3.47-13.06h74.82c3.31,0,6-2.69,6-6v-2.48c0-11.75-2.34-22.17-7.03-31.25-4.71-9.08-11.25-16.11-19.66-21.1ZM355.57,129.06c0-6.55,2.23-11.73,6.7-15.51,4.47-3.8,10.57-5.69,18.31-5.69,5.2,0,9.66.82,13.39,2.45,3.72,1.64,6.54,4.06,8.48,7.26,1.93,3.2,2.91,7.03,2.91,11.5h-49.79Z"/>
<path d="M151.3,40.32h-19.05c-25.3,0-37.95,11.91-37.95,35.71v116.87c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-80.48h19.22c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6h-19.22v-8.27c0-7.39,5.99-13.39,13.39-13.39h13.48c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6Z"/>
<path d="M637.41,173.57h-.48c-7.39,0-13.39-5.99-13.39-13.39v-30.92c0-.32-.03-.62-.08-.93v-3.3c0-8.63-2.02-16.1-6.03-22.43-4.01-6.32-9.7-11.24-17.08-14.73-7.36-3.49-15.95-5.24-25.78-5.24s-19.24,1.75-27.34,5.24c-8.12,3.5-14.44,8.37-18.98,14.62-3.27,4.5-5.36,9.43-6.28,14.77-.59,3.44,2,6.62,5.49,6.88l18.43,1.38c2.77.21,5.32-1.51,6.15-4.16.98-3.12,3.03-5.88,6.13-8.28,4.52-3.49,10.01-5.24,16.4-5.24,4.9,0,9.06,1.04,12.5,3.12,3.42,2.09,5.43,4.84,6.03,8.26.58,3.87-1.24,6.88-5.47,9.05-4.25,2.15-10.99,3.46-20.2,3.91-16.08.59-28.28,3.98-36.62,10.15-8.32,6.18-12.5,14.77-12.5,25.78,0,10.27,3.4,18.38,10.15,24.33,6.78,5.95,16.04,8.93,27.79,8.93,8.48,0,15.66-1.67,21.54-5.02,5.89-3.34,10.3-8.26,13.28-14.73,1.31-2.83,2.31-5.98,3.04-9.4,3,17.71,15.4,26.57,37.22,26.57h6.05c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6ZM589.53,159.97c-2.52,4.99-6.03,8.93-10.48,11.84-4.47,2.9-9.46,4.35-14.97,4.35-4.45,0-8.07-.96-10.83-2.9-2.74-1.93-4.12-4.91-4.12-8.93,0-4.61,1.67-7.7,5.01-9.26,3.36-1.56,7.94-2.57,13.73-3.02,1.2-.15,2.38-.3,3.58-.45,9.23-1.19,16.29-4.43,21.2-9.71.23-.25.45-.5.67-.76v2.43c0,5.96-1.27,11.43-3.8,16.4Z"/>
<rect x="40.06" y="112.42" width="30" height="86.37" rx="6" ry="6"/>
<rect x="40.06" y="65.55" width="30" height="30" rx="6" ry="6"/>
<path d="M518.36,88.41c0-3.31-2.68-5.99-5.99-5.99h-18.02c-3.31,0-5.99,2.68-5.99,5.99v18.22c0,.71-.58,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0,0-.02-.02-.05-.03-.07-.27-.73-.56-1.44-.87-2.13-.05-.11-.1-.23-.15-.34-.33-.72-.69-1.42-1.07-2.09-.02-.03-.03-.05-.05-.08-.36-.64-.75-1.25-1.16-1.85-.07-.11-.15-.22-.22-.33-.43-.62-.88-1.22-1.36-1.79-.02-.03-.05-.05-.07-.08-.45-.54-.93-1.05-1.42-1.55-.1-.1-.2-.21-.31-.31-.53-.51-1.07-1.01-1.64-1.48-.03-.03-.07-.05-.1-.08-.54-.44-1.1-.85-1.67-1.25-.14-.09-.27-.19-.41-.28-.62-.41-1.25-.81-1.91-1.18-.05-.03-.1-.05-.15-.08-.62-.34-1.25-.66-1.91-.97-.17-.08-.35-.16-.53-.24-.71-.31-1.43-.62-2.17-.89-.07-.02-.14-.05-.2-.07-.69-.25-1.41-.48-2.13-.69-.22-.06-.43-.13-.65-.19-.79-.22-1.6-.43-2.43-.61-.08-.02-.17-.03-.25-.05-.77-.16-1.56-.3-2.36-.43-.26-.04-.51-.08-.77-.12-.86-.13-1.74-.24-2.64-.33-.11-.01-.23-.02-.34-.03-.86-.08-1.73-.14-2.62-.19-.29-.02-.59-.03-.88-.04-.92-.04-1.85-.06-2.81-.06-.07,0-.13,0-.2,0h-6.05c-3.31,0-6,2.69-6,6h0v13.22h0c0,3.32,2.69,6,6,6h.48c7.39,0,13.39,5.99,13.39,13.39v63.72s0,3.35,0,3.35c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h9.7s8.31,0,8.31,0c3.31,0,5.99-2.68,5.99-5.99v-18.02Z"/>
</g>
<g>
<path d="M886.7,161.86h-44.66c-8.28,0-15-6.72-15-15v-44.66c0-8.28-6.72-15-15-15h-119.32c-8.28,0-15,6.72-15,15v193.97c0,8.28,6.72,15,15,15h193.97c8.28,0,15-6.72,15-15v-119.32c0-8.28-6.72-15-15-15Z"/>
</g>
</svg>
</span><span></span></div><div class="cms-print-foot" aria-hidden="true"><span></span></div><header class="nav-fixed-wrapper">
<!-- Hidden checkbox-State-Carrier für Mobile-Drawer: JS toggelt .checked, CSS reagiert via :has() -->
<input type="checkbox" id="burgerToggle" class="burger-checkbox" aria-hidden="true" tabindex="-1">
<nav class="nav" aria-label="Hauptnavigation">
  <a href="/de/" class="nav-logo" aria-label="ifmera academy – Zur Startseite">
    <!-- ifmera academy Logo – with gradient fill matching background style -->
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 980 372">
      <defs>
        <filter id="logo-grain" x="0" y="0" width="100%" height="100%">
          <feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="4" stitchTiles="stitch" result="noise"/>
          <feColorMatrix type="saturate" values="0" in="noise" result="grayNoise"/>
          <feComponentTransfer in="grayNoise" result="subtleNoise">
            <feFuncR type="linear" slope="0.12" intercept="0.44"/>
            <feFuncG type="linear" slope="0.12" intercept="0.44"/>
            <feFuncB type="linear" slope="0.12" intercept="0.44"/>
          </feComponentTransfer>
          <feComposite in="subtleNoise" in2="SourceGraphic" operator="in" result="clippedNoise"/>
          <feBlend in="SourceGraphic" in2="clippedNoise" mode="overlay"/>
        </filter>
        <style>.lg{fill:var(--color-primary);filter:url(#logo-grain);transition:fill 0.35s ease}.nav-scrolled .nav-logo .lg{fill:var(--color-light)}</style>
      </defs>
      <g id="logo-academy">
        <path class="lg" d="M104.69,299.14c-.64-.74-.96-1.99-.96-3.77v-32.35c0-9.95-2.66-17.75-7.98-23.42-5.32-5.66-13-8.5-23.05-8.5-8.86,0-16.13,2.29-21.79,6.87-5.67,4.58-9.23,10.56-10.71,17.95l13.15,1.03c1.18-4.53,3.35-8,6.5-10.42,3.15-2.41,7.44-3.62,12.85-3.62,6.21,0,10.86,1.62,13.96,4.88,3.1,3.25,4.65,8.18,4.65,14.77l-27.77,5.17c-8.57,1.58-14.82,4.28-18.76,8.13-3.94,3.84-5.91,9.11-5.91,15.81s2.39,11.92,7.17,15.66c4.78,3.74,11.2,5.61,19.28,5.61,4.43,0,8.62-.76,12.56-2.29,3.94-1.53,7.24-3.64,9.9-6.35,1.62-1.65,2.86-3.41,3.75-5.29.23,2.11.65,3.93,1.27,5.44.98,2.41,2.59,4.19,4.8,5.32,2.22,1.13,5.1,1.7,8.64,1.7.98,0,1.92-.03,2.81-.07.89-.05,1.53-.12,1.92-.22v-10.93h-3.1c-1.48,0-2.54-.37-3.18-1.11ZM79.87,298.99c-3.69,2.02-8.15,3.03-13.37,3.03-4.53,0-8.1-1.01-10.71-3.03-2.61-2.02-3.92-4.85-3.92-8.5,0-3.25,1.01-5.88,3.03-7.9,2.02-2.02,5.69-3.52,11.01-4.51l25.41-4.73v5.61c0,4.33-.99,8.25-2.95,11.75-1.97,3.5-4.8,6.26-8.5,8.27Z"/>
        <path class="lg" d="M155.29,242.92c5.32,0,9.8,1.4,13.44,4.21,3.64,2.81,5.91,6.82,6.8,12.04l13-.89c-.89-5.81-2.81-10.73-5.76-14.77-2.96-4.04-6.77-7.11-11.45-9.23-4.68-2.12-10.02-3.18-16.03-3.18-7.29,0-13.62,1.7-18.98,5.1-5.37,3.4-9.53,8.15-12.48,14.26-2.95,6.11-4.43,13.3-4.43,21.57s1.48,15.49,4.43,21.64c2.96,6.16,7.11,10.91,12.48,14.26,5.37,3.35,11.69,5.02,18.98,5.02,6.01,0,11.35-1.18,16.03-3.54,4.68-2.36,8.49-5.69,11.45-9.97,2.95-4.28,4.88-9.33,5.76-15.14l-13-.89c-.89,5.91-3.15,10.34-6.8,13.3-3.65,2.96-8.13,4.43-13.44,4.43-7.19,0-12.8-2.59-16.84-7.76-4.04-5.17-6.06-12.29-6.06-21.35s2.02-16.18,6.06-21.35c4.04-5.17,9.65-7.76,16.84-7.76Z"/>
        <path class="lg" d="M266.46,299.14c-.64-.74-.96-1.99-.96-3.77v-32.35c0-9.95-2.66-17.75-7.98-23.42-5.32-5.66-13-8.5-23.05-8.5-8.86,0-16.13,2.29-21.79,6.87-5.66,4.58-9.23,10.56-10.71,17.95l13.15,1.03c1.18-4.53,3.35-8,6.5-10.42,3.15-2.41,7.44-3.62,12.85-3.62,6.21,0,10.86,1.62,13.96,4.88,3.1,3.25,4.65,8.18,4.65,14.77l-27.78,5.17c-8.57,1.58-14.82,4.28-18.76,8.13-3.94,3.84-5.91,9.11-5.91,15.81s2.39,11.92,7.17,15.66c4.78,3.74,11.2,5.61,19.28,5.61,4.43,0,8.62-.76,12.56-2.29,3.94-1.53,7.24-3.64,9.9-6.35,1.62-1.65,2.86-3.41,3.75-5.29.23,2.11.65,3.93,1.27,5.44.98,2.41,2.58,4.19,4.8,5.32,2.22,1.13,5.1,1.7,8.64,1.7.98,0,1.92-.03,2.81-.07.89-.05,1.53-.12,1.92-.22v-10.93h-3.1c-1.48,0-2.54-.37-3.18-1.11ZM241.64,298.99c-3.69,2.02-8.15,3.03-13.37,3.03-4.53,0-8.1-1.01-10.71-3.03-2.61-2.02-3.92-4.85-3.92-8.5,0-3.25,1.01-5.88,3.03-7.9,2.02-2.02,5.69-3.52,11.01-4.51l25.41-4.73v5.61c0,4.33-.99,8.25-2.96,11.75-1.97,3.5-4.8,6.26-8.5,8.27Z"/>
        <path class="lg" d="M338.34,243.81c-2.17-4.04-5.42-7.17-9.75-9.38-4.34-2.22-9.11-3.32-14.33-3.32-6.8,0-12.68,1.68-17.66,5.02-4.97,3.35-8.79,8.08-11.45,14.18-2.66,6.11-3.99,13.35-3.99,21.72s1.33,15.61,3.99,21.72c2.66,6.11,6.48,10.84,11.45,14.18,4.97,3.35,10.86,5.02,17.66,5.02,5.51,0,10.49-1.21,14.92-3.62s7.73-5.74,9.9-9.97l.44,11.82h11.23v-100.73h-12.41v33.36ZM335.83,287.46c-1.68,4.38-4.11,7.76-7.31,10.12-3.2,2.36-7.12,3.55-11.75,3.55-6.9,0-12.39-2.61-16.47-7.83-4.09-5.22-6.13-12.31-6.13-21.27s2.04-16.18,6.13-21.35c4.09-5.17,9.58-7.76,16.47-7.76,4.63,0,8.54,1.16,11.75,3.47,3.2,2.32,5.64,5.64,7.31,9.97,1.67,4.33,2.51,9.55,2.51,15.66s-.84,11.06-2.51,15.44Z"/>
        <path class="lg" d="M420.92,235.9c-5.22-3.2-11.23-4.8-18.02-4.8-7.19,0-13.42,1.7-18.69,5.1-5.27,3.4-9.36,8.15-12.26,14.26-2.91,6.11-4.36,13.3-4.36,21.57s1.45,15.49,4.36,21.64c2.9,6.16,7.04,10.91,12.41,14.26,5.37,3.35,11.75,5.02,19.13,5.02,8.27,0,15.29-2.24,21.05-6.72,5.76-4.48,9.68-10.22,11.75-17.21l-13.3-1.03c-1.28,3.94-3.57,7.12-6.87,9.53-3.3,2.42-7.51,3.62-12.63,3.62-6.8,0-12.19-2.12-16.18-6.35-3.99-4.23-6.23-10.54-6.72-18.91h56.88v-3.69c0-8.77-1.45-16.2-4.36-22.31-2.91-6.11-6.97-10.76-12.19-13.96ZM380.59,264.93c1.08-7.29,3.57-12.78,7.46-16.47,3.89-3.69,8.84-5.54,14.85-5.54s10.61,1.77,14.4,5.32c3.79,3.55,5.98,9.11,6.57,16.7h-43.29Z"/>
        <path class="lg" d="M548.57,234.57c-3.84-2.31-8.57-3.47-14.18-3.47-4.34,0-8.18.84-11.52,2.51-3.35,1.68-6.08,4.06-8.2,7.17-1.32,1.93-2.38,4.15-3.19,6.64-1.42-4.37-3.7-7.94-6.86-10.7-4.28-3.74-9.82-5.61-16.62-5.61-3.94,0-7.53.86-10.78,2.59-3.25,1.72-5.98,4.14-8.2,7.24-1.21,1.69-2.21,3.56-3.02,5.61l-.31-13.67h-11.38v78.3h12.41v-46.83c0-4.63.76-8.62,2.29-11.97,1.53-3.35,3.64-5.91,6.35-7.68,2.71-1.77,5.88-2.66,9.53-2.66,5.81,0,9.95,1.97,12.41,5.91,2.46,3.94,3.69,9.41,3.69,16.4v46.83h12.41v-46.83c0-4.73.74-8.74,2.22-12.04,1.48-3.3,3.57-5.84,6.28-7.61,2.71-1.77,5.88-2.66,9.53-2.66,5.42,0,9.5,1.8,12.26,5.39,2.76,3.6,4.14,8.94,4.14,16.03v47.72h12.41v-50.38c0-6.3-.99-11.67-2.96-16.1-1.97-4.43-4.88-7.81-8.72-10.12Z"/>
        <path class="lg" d="M629.53,232.88l-22.31,65.3-23.34-65.3h-13.59l27.21,72.92c.88,2.35,3.12,3.9,5.62,3.9h.12s-2.81,7.39-2.81,7.39c-.69,1.87-1.7,3.23-3.03,4.06-1.33.83-3.38,1.26-6.13,1.26h-9.01v10.93h10.19c5.22,0,9.31-.99,12.26-2.96,2.96-1.97,5.17-5.07,6.65-9.31l31.76-88.2h-13.59Z"/>
      </g>
      <rect class="lg" id="logo-dot" x="864.16" y="49.66" width="75.09" height="75.09" rx="15" ry="15"/>
      <g id="logo-ifmera">
        <path class="lg" d="M276.02,87.2h-19.05c-3.31,0-6,2.69-6,6v13.43c0,.71-.57,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0-4.79-13.25-16.62-19.88-35.49-19.88h-19.05c-3.31,0-6,2.69-6,6v13.22c0,3.31-2.69,6-6,6h-18c-3.31,0-6,2.69-6,6v74.37c0,3.31,2.69,6,6,6h18c3.31,0,6-2.69,6-6v-74.37c0-3.31,2.68-5.99,5.99-6h13.49c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h13.48c7.39,0,13.39,5.99,13.39,13.39v67.07c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-69.97c0-23.81-12.64-35.71-37.95-35.71Z"/>
        <path class="lg" d="M409.7,90.11c-8.41-4.99-18.11-7.48-29.12-7.48s-20.55,2.49-29.03,7.48c-8.48,4.99-15.1,11.98-19.85,20.98-4.78,9.01-7.16,19.31-7.16,30.92s2.49,22.13,7.48,31.14c4.98,9.01,11.97,15.97,20.98,20.87,9.01,4.91,19.38,7.37,31.14,7.37,13.99,0,25.78-3.34,35.39-10.05,7.3-5.09,12.3-11.4,15-18.91,1.33-3.71-1.31-7.66-5.24-7.95l-19.3-1.41c-2.18-.16-4.32.85-5.46,2.71-1.7,2.77-4.11,5.04-7.21,6.82-4.16,2.38-9.01,3.57-14.51,3.57-5.2,0-9.88-1.08-14.06-3.23-4.16-2.16-7.39-5.13-9.7-8.93s-3.47-8.15-3.47-13.06h74.82c3.31,0,6-2.69,6-6v-2.48c0-11.75-2.34-22.17-7.03-31.25-4.71-9.08-11.25-16.11-19.66-21.1ZM355.57,129.06c0-6.55,2.23-11.73,6.7-15.51,4.47-3.8,10.57-5.69,18.31-5.69,5.2,0,9.66.82,13.39,2.45,3.72,1.64,6.54,4.06,8.48,7.26,1.93,3.2,2.91,7.03,2.91,11.5h-49.79Z"/>
        <path class="lg" d="M151.3,40.32h-19.05c-25.3,0-37.95,11.91-37.95,35.71v116.87c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-80.48h19.22c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6h-19.22v-8.27c0-7.39,5.99-13.39,13.39-13.39h13.48c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6Z"/>
        <path class="lg" d="M637.41,173.57h-.48c-7.39,0-13.39-5.99-13.39-13.39v-30.92c0-.32-.03-.62-.08-.93v-3.3c0-8.63-2.02-16.1-6.03-22.43-4.01-6.32-9.7-11.24-17.08-14.73-7.36-3.49-15.95-5.24-25.78-5.24s-19.24,1.75-27.34,5.24c-8.12,3.5-14.44,8.37-18.98,14.62-3.27,4.5-5.36,9.43-6.28,14.77-.59,3.44,2,6.62,5.49,6.88l18.43,1.38c2.77.21,5.32-1.51,6.15-4.16.98-3.12,3.03-5.88,6.13-8.28,4.52-3.49,10.01-5.24,16.4-5.24,4.9,0,9.06,1.04,12.5,3.12,3.42,2.09,5.43,4.84,6.03,8.26.58,3.87-1.24,6.88-5.47,9.05-4.25,2.15-10.99,3.46-20.2,3.91-16.08.59-28.28,3.98-36.62,10.15-8.32,6.18-12.5,14.77-12.5,25.78,0,10.27,3.4,18.38,10.15,24.33,6.78,5.95,16.04,8.93,27.79,8.93,8.48,0,15.66-1.67,21.54-5.02,5.89-3.34,10.3-8.26,13.28-14.73,1.31-2.83,2.31-5.98,3.04-9.4,3,17.71,15.4,26.57,37.22,26.57h6.05c3.31,0,6-2.69,6-6v-13.22c0-3.31-2.69-6-6-6ZM589.53,159.97c-2.52,4.99-6.03,8.93-10.48,11.84-4.47,2.9-9.46,4.35-14.97,4.35-4.45,0-8.07-.96-10.83-2.9-2.74-1.93-4.12-4.91-4.12-8.93,0-4.61,1.67-7.7,5.01-9.26,3.36-1.56,7.94-2.57,13.73-3.02,1.2-.15,2.38-.3,3.58-.45,9.23-1.19,16.29-4.43,21.2-9.71.23-.25.45-.5.67-.76v2.43c0,5.96-1.27,11.43-3.8,16.4Z"/>
        <rect class="lg" x="40.06" y="112.42" width="30" height="86.37" rx="6" ry="6"/>
        <rect class="lg" x="40.06" y="65.55" width="30" height="30" rx="6" ry="6"/>
        <path class="lg" d="M518.36,88.41c0-3.31-2.68-5.99-5.99-5.99h-18.02c-3.31,0-5.99,2.68-5.99,5.99v18.22c0,.71-.58,1.28-1.28,1.28-.55,0-1.02-.34-1.2-.83,0,0,0,0,0,0,0-.02-.02-.05-.03-.07-.27-.73-.56-1.44-.87-2.13-.05-.11-.1-.23-.15-.34-.33-.72-.69-1.42-1.07-2.09-.02-.03-.03-.05-.05-.08-.36-.64-.75-1.25-1.16-1.85-.07-.11-.15-.22-.22-.33-.43-.62-.88-1.22-1.36-1.79-.02-.03-.05-.05-.07-.08-.45-.54-.93-1.05-1.42-1.55-.1-.1-.2-.21-.31-.31-.53-.51-1.07-1.01-1.64-1.48-.03-.03-.07-.05-.1-.08-.54-.44-1.1-.85-1.67-1.25-.14-.09-.27-.19-.41-.28-.62-.41-1.25-.81-1.91-1.18-.05-.03-.1-.05-.15-.08-.62-.34-1.25-.66-1.91-.97-.17-.08-.35-.16-.53-.24-.71-.31-1.43-.62-2.17-.89-.07-.02-.14-.05-.2-.07-.69-.25-1.41-.48-2.13-.69-.22-.06-.43-.13-.65-.19-.79-.22-1.6-.43-2.43-.61-.08-.02-.17-.03-.25-.05-.77-.16-1.56-.3-2.36-.43-.26-.04-.51-.08-.77-.12-.86-.13-1.74-.24-2.64-.33-.11-.01-.23-.02-.34-.03-.86-.08-1.73-.14-2.62-.19-.29-.02-.59-.03-.88-.04-.92-.04-1.85-.06-2.81-.06-.07,0-.13,0-.2,0h-6.05c-3.31,0-6,2.69-6,6h0v13.22h0c0,3.32,2.69,6,6,6h.48c7.39,0,13.39,5.99,13.39,13.39v63.72s0,3.35,0,3.35c0,3.26,2.64,5.9,5.9,5.9h18.33c3.26,0,5.9-2.64,5.9-5.9v-68.85h.03v-5.62c0-3.31,2.69-6,6-6h9.7s8.31,0,8.31,0c3.31,0,5.99-2.68,5.99-5.99v-18.02Z"/>
      </g>
      <g id="logo-form">
        <path class="lg" d="M886.7,161.86h-44.66c-8.28,0-15-6.72-15-15v-44.66c0-8.28-6.72-15-15-15h-119.32c-8.28,0-15,6.72-15,15v193.97c0,8.28,6.72,15,15,15h193.97c8.28,0,15-6.72,15-15v-119.32c0-8.28-6.72-15-15-15Z"/>
      </g>
    </svg>
  </a>

  <ul class="nav-center" id="primaryNav" role="list">
    <li class="nav-close-item">
      <button type="button" class="nav-close" id="navClose" aria-label="Menü schließen" data-no-tooltip>
        <svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg>
      </button>
    </li>
    <li class="nav-item nav-item--mega">
      <a class="nav-trigger" id="trig-weiterbildung" href="/de/weiterbildung/" aria-haspopup="true" aria-expanded="false" aria-controls="mega-weiterbildung" aria-current="page">
        <span>Weiterbildungen</span>
        <svg class="nav-chevron" viewBox="0 0 12 12" aria-hidden="true"><use href="#icon-chevron-right-solid" transform="rotate(90 6 6)"/></svg>
      </a>
      <div class="mega-panel" id="mega-weiterbildung" role="region" aria-labelledby="trig-weiterbildung" hidden>
        <!-- Hidden Radios als State-Carrier für Stage-Switch (CSS :has()-Selector) -->
        <input type="radio" name="weiterbildung-stage" id="wb-stage-1" class="stage-radio" checked aria-hidden="true" tabindex="-1">
        <input type="radio" name="weiterbildung-stage" id="wb-stage-2" class="stage-radio" aria-hidden="true" tabindex="-1">
        <div class="mega-panel-inner">
          <div class="mega-stages">
            <!-- Stage 1: Hauptbereiche + Wissenswelten-Card + Promo -->
            <div class="mega-stage mega-stage--1">
              <nav class="mega-weiterbildung-layout" aria-label="Weiterbildung – Formate">
                <div class="mega-weiterbildung-main">
<section class="mega-card has-notch is-bottom-right"><a href="/de/weiterbildung/offene-seminare/" class="mega-card-link" aria-label="Offene Seminare ansehen"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">Offene Seminare</h3><p class="mega-card-desc">Offene Seminare sind Weiterbildungsveranstaltungen zu festgelegten Terminen, die für Teilnehmende aus unterschiedlichen Unternehmen und Organisationen zugänglich sind.</p></section>
<section class="mega-card has-notch is-bottom-right"><a href="/de/weiterbildung/gefoerderte-weiterbildung/" class="mega-card-link" aria-label="Fördermöglichkeiten prüfen"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">Geförderte Weiterbildung</h3><p class="mega-card-desc">Geförderte Weiterbildung ist eine berufliche Fortbildung, deren Kosten von staatlichen Stellen (wie der Agentur für Arbeit) übernommen werden, um die Jobchancen zu verbessern.</p></section>
<section class="mega-card has-notch is-bottom-right"><a href="/de/weiterbildung/individuelle-firmenseminare/" class="mega-card-link" aria-label="Angebot für Firmenseminare anfragen"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">Individuelle Firmenseminare</h3><p class="mega-card-desc">Individuelle Firmenseminare sind exklusiv auf die Bedürfnisse eines Unternehmens zugeschnittene Weiterbildungen, die oft als Inhouse-Schulung direkt vor Ort stattfinden.</p></section>
<section class="mega-card has-notch is-bottom-right"><a href="/de/weiterbildung/fernlehrgaenge/" class="mega-card-link" aria-label="Fernlehrgänge entdecken"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">Fernlehrgänge</h3><p class="mega-card-desc">Fernlehrgänge sind staatlich zugelassene Weiterbildungen mit flexiblem Lerntempo – ortsunabhängig per Selbststudium und tutorieller Begleitung, ideal neben Beruf und Familie.</p></section>
                  <button type="button" class="mega-wissenswelten-card" data-stage-target="stage2" aria-haspopup="true" aria-expanded="false">
                    <span class="mega-wissenswelten-card-text">
                      <strong>Wissenswelten entdecken</strong>
                      <span>Alle Themen und Kategorien auf einen Blick</span>
                    </span>
                    <svg class="mega-wissenswelten-card-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg>
                  </button>
                  <aside class="mega-promo" aria-label="Aktuelle Empfehlungen">
<a class="mega-promo-banner" href="/de/weiterbildung/offene-seminare/trend-seminare/"><span class="mega-promo-banner-eyebrow">Neu 2026</span><span class="mega-promo-banner-title">Trend-Seminare 2026</span><span class="mega-promo-banner-cta">Jetzt entdecken<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></span></a>
<a class="mega-promo-banner" href="/de/foerderung/kurzarbeit-weiterbildung/"><span class="mega-promo-banner-eyebrow">Tipp</span><span class="mega-promo-banner-title">Kurzarbeit zur Weiterbildung nutzen</span><span class="mega-promo-banner-cta">Mehr erfahren<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></span></a>
                  </aside>
                </div>
              </nav>
            </div>
            <!-- Stage 2: Wissenswelten Themen-Grid -->
            <div class="mega-stage mega-stage--2">
              <div class="mega-stage-2-head">
                <button type="button" class="mega-back" data-stage-target="stage1" aria-label="Zur&uuml;ck zur Weiterbildungs&uuml;bersicht">
                  <svg viewBox="0 0 14 14" aria-hidden="true"><use href="#icon-chevron-right-solid" transform="rotate(180 7 7)"/></svg>
                  <span>Zur&uuml;ck</span>
                </button>
                <h3 class="mega-stage-2-title">Wissenswelten</h3>
              </div>
              <nav aria-label="Wissenswelten – alle Themen">
                <ul class="mega-themen-grid" role="list">
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/datenschutz/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-datenschutz"/></svg>Datenschutz</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/digitale-kompetenzen/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-digitale-kompetenzen"/></svg>Digitale Kompetenzen</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/edv-kenntnisse/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-link"/></svg>EDV Kenntnisse</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/einkauf/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-einkauf"/></svg>Einkauf</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/fuehrungskompetenzen/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-fuehrungskompetenzen"/></svg>Führungskompetenzen</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/gesundheitsmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-gesundheitsmanagement"/></svg>Gesundheitsmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/immobilienmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-immobilienmanagement"/></svg>Immobilienwirtschaft und -management</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/kommunikation/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-kommunikation"/></svg>Kommunikation</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/kuenstliche-intelligenz/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-kuenstliche-intelligenz"/></svg>Künstliche Intelligenz</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/logistik-und-produktionsmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-logistik-und-produktionsmanagement"/></svg>Logistik- und Produktionsmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/marketing-und-pr/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-marketing-und-pr"/></svg>Marketing und PR</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/modul-kombinationen/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-link"/></svg>Modulkombinationen</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/nachhaltigkeitsmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-nachhaltigkeitsmanagement"/></svg>Nachhaltigkeitsmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/organisationsmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-organisationsmanagement"/></svg>Organisationsmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/personalmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-personalmanagement"/></svg>Personalmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/projektmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-projektmanagement"/></svg>Projektmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/prozess-und-qualitaetsmanagement/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-prozess-und-qualitaetsmanagement"/></svg>Prozess- und Qualitätsmanagement</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/rechnungswesen-und-controlling/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-rechnungswesen-und-controlling"/></svg>Rechnungswesen und Controlling</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/recht/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-recht"/></svg>Recht</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/sap/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-sap"/></svg>SAP</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/soft-skills/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-soft-skills"/></svg>Soft Skills</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/train-the-trainer/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-train-the-trainer"/></svg>Train the Trainer</a></li>
                  <li><a class="mega-thema-tile" href="/de/weiterbildung/vertrieb/"><svg class="mega-thema-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-vertrieb"/></svg>Vertrieb</a></li>
                </ul>
              </nav>
            </div>
          </div>
        </div>
      </div>
    </li>
    <li class="nav-item nav-item--mega">
      <a class="nav-trigger" id="trig-coaching" href="/de/coaching/" aria-haspopup="true" aria-expanded="false" aria-controls="mega-coaching">
        <span>Coaching</span>
        <svg class="nav-chevron" viewBox="0 0 12 12" aria-hidden="true"><use href="#icon-chevron-right-solid" transform="rotate(90 6 6)"/></svg>
      </a>
      <div class="mega-panel" id="mega-coaching" role="region" aria-labelledby="trig-coaching" hidden>
        <div class="mega-panel-inner">
          <nav class="mega-coaching-layout" aria-label="Coaching-Untermenü">
            <div class="mega-coaching-main">
<section class="mega-card">
  <h3 class="mega-card-title">Business Coaching</h3>
  <p class="mega-card-desc">Business Coaching ist die lösungs- und zielorientierte Begleitung von Menschen im beruflichen Umfeld.</p>
  <ul class="mega-link-list">
<li><a class="link" href="/de/coaching/business-coaching/fachkraeftecoaching/">Fachkräftecoaching</a></li>
<li><a class="link" href="/de/coaching/business-coaching/fuehrungskraeftecoaching/">Führungskräftecoaching</a></li>
<li><a class="link" href="/de/coaching/business-coaching/executive-coaching/">Executive Coaching</a></li>
<li><a class="link" href="/de/coaching/business-coaching/teamcoaching/">Teamcoaching</a></li>
  </ul>
  <a class="link mega-card-cta" href="/de/coaching/business-coaching/">Alle Business Coaching-Angebote<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></a>
</section>
<section class="mega-card">
  <h3 class="mega-card-title">AVGS Coaching</h3>
  <ul class="mega-link-list">
<li><a class="link" href="/de/coaching/avgs-coaching/jobcoaching-berufliche-neuorientierung-nach-burnout/">Jobcoaching – Berufliche Neuorientierung nach Burnout</a></li>
<li><a class="link" href="/de/coaching/avgs-coaching/jobcoaching-beruflicher-einstieg-nach-dem-studium/">Jobcoaching – Beruflicher Einstieg nach dem Studium</a></li>
<li><a class="link" href="/de/coaching/avgs-coaching/jobcoaching-mit-power-bis-zur-rente/">Jobcoaching – Mit Power bis zur Rente</a></li>
<li><a class="link" href="/de/coaching/avgs-coaching/karrierecoaching/">Karrierecoaching</a></li>
<li><a class="link" href="/de/coaching/avgs-coaching/speedcoaching-erfolgreich-durch-das-bewerbungsgespraech/">Speedcoaching – Erfolgreich durch das Bewerbungsgespräch</a></li>
<li><a class="link" href="/de/coaching/avgs-coaching/speedcoaching-fuer-fastentschlossene/">Speedcoaching für Fastentschlossene</a></li>
  </ul>
  <a class="link mega-card-cta" href="/de/coaching/avgs-coaching/">Alle AVGS Coaching-Angebote<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></a>
</section>
            </div>
            <aside class="mega-promo" aria-label="Coaching-Angebote">
<a class="mega-promo-banner" href="/de/foerderung/avgs/"><span class="mega-promo-banner-eyebrow">100 % gefördert</span><span class="mega-promo-banner-title">Kostenloses Coaching mit AVGS-Gutschein</span><span class="mega-promo-banner-cta">Voraussetzungen prüfen<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></span></a>
<a class="mega-promo-banner" href="/de/coaching/business-coaching/"><span class="mega-promo-banner-eyebrow">Nachbetreuung</span><span class="mega-promo-banner-title">Coaching im Anschluss an Ihr Seminar</span><span class="mega-promo-banner-cta">Angebot ansehen<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></span></a>
            </aside>
          </nav>
        </div>
      </div>
    </li>
    <li class="nav-item nav-item--mega">
      <a class="nav-trigger" id="trig-consulting" href="/de/consulting/" aria-haspopup="true" aria-expanded="false" aria-controls="mega-consulting">
        <span>Consulting</span>
        <svg class="nav-chevron" viewBox="0 0 12 12" aria-hidden="true"><use href="#icon-chevron-right-solid" transform="rotate(90 6 6)"/></svg>
      </a>
      <div class="mega-panel" id="mega-consulting" role="region" aria-labelledby="trig-consulting" hidden>
        <div class="mega-panel-inner">
          <nav class="mega-consulting-layout" aria-label="Consulting-Untermenü">
<section class="mega-card has-notch is-bottom-right"><a href="/de/consulting/" class="mega-card-link" aria-label="Consulting ansehen"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">Consulting</h3><p class="mega-card-desc">Strategische Beratung für Veränderungsprozesse, Kompetenzentwicklung und zukunftsfähige Organisationen – von der Analyse bis zur erfolgreichen Umsetzung.</p></section>
<section class="mega-card has-notch is-bottom-right"><a href="/de/consulting/ki-consulting/" class="mega-card-link" aria-label="KI Consulting ansehen"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><h3 class="mega-card-title">KI Consulting</h3><p class="mega-card-desc">KI strategisch nutzen: Wir begleiten Unternehmen bei der Auswahl, Einführung und dem produktiven Einsatz von KI im Arbeitsalltag.</p></section>
<aside class="mega-card mega-card--explainer" aria-label="Was ist Consulting?"><h3 class="mega-card-title">Was ist Consulting?</h3><p class="mega-card-desc">Consulting bedeutet, dass externe Expert:innen Sie strategisch begleiten – bei der Analyse, Konzeption und Umsetzung komplexer Vorhaben.</p><p class="mega-card-desc">Unsere Berater:innen verstehen die Anforderungen unterschiedlichster Unternehmen und entwickeln Maßnahmen, die nachhaltige Veränderungen wirksam unterstützen.</p></aside>
          </nav>
        </div>
      </div>
    </li>
    <li class="nav-item nav-item--mega">
      <a class="nav-trigger" id="trig-info" href="/de/faq/" aria-haspopup="true" aria-expanded="false" aria-controls="mega-info">
        <span>Info &amp; Services</span>
        <svg class="nav-chevron" viewBox="0 0 12 12" aria-hidden="true"><use href="#icon-chevron-right-solid" transform="rotate(90 6 6)"/></svg>
      </a>
      <div class="mega-panel" id="mega-info" role="region" aria-labelledby="trig-info" hidden>
        <div class="mega-panel-inner">
          <nav class="mega-info-layout" aria-label="Info & Services Untermenü">
            <div class="mega-info-col">
              <section class="mega-card">
                <h3 class="mega-card-title">Support</h3>
                <ul class="mega-link-list">
<li><a class="link" href="/de/faq/">FAQ</a></li>
<li><a class="link" href="/de/kontakt/">Kontakt</a></li>
<li><a class="link" href="/de/foerderung/">Fördermöglichkeiten</a></li>
                </ul>
              </section>
              <a class="mega-wissenswelten-card" href="tel:+49302325352">
                <span class="mega-wissenswelten-card-text">
                  <strong>+49 (30) 232 535 2</strong>
                  <span>Jetzt anrufen &mdash; direkter Draht ins Office</span>
                </span>
                <svg class="mega-wissenswelten-card-icon" viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-phone-solid"/></svg>
              </a>
            </div>
            <div class="mega-info-col">
              <section class="mega-card">
                <h3 class="mega-card-title">Wissen</h3>
                <ul class="mega-link-list">
<li><a class="link" href="/de/wissen/blog/">Blog</a></li>
<li><a class="link" href="/de/wissen/pressemitteilungen/">Pressemitteilungen</a></li>
<li><a class="link" href="/de/wissen/trendkompass/">Trendkompass</a></li>
                </ul>
              </section>
<a class="mega-promo-banner" href="/de/wissen/blog/ki-im-personalwesen-5-beispiele-die-im-hr-alltag-wirklich-funktionieren/"><span class="mega-promo-banner-eyebrow">Neuer Beitrag</span><span class="mega-promo-banner-title">KI im Personalwesen: 5 Beispiele, die im HR-Alltag wirklich funktionieren</span><span class="mega-promo-banner-cta">Beitrag lesen<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg></span></a>
            </div>
            <div class="mega-info-col">
              <section class="mega-card">
                <h3 class="mega-card-title">Über ifmera</h3>
                <ul class="mega-link-list">
<li><a class="link" href="/de/ueber-ifmera/">Über ifmera</a></li>
<li><a class="link" href="/de/ueber-ifmera/referenzen/">Referenzen</a></li>
<li><a class="link" href="/de/ueber-ifmera/karriere/">Karriere</a></li>
<li><a class="link" href="/de/ueber-ifmera/presse/">Presse</a></li>
<li><a class="link" href="/de/ueber-ifmera/soziale-verantwortung/">Soziale Verantwortung</a></li>
<li><a class="link" href="/de/standorte/">Standorte</a></li>
<li><a class="link" href="/de/raumvermietung/">Raumvermietung</a></li>
                </ul>
              </section>
            </div>
          </nav>
        </div>
      </div>
    </li>
  </ul>

  <button type="button" class="nav-burger" id="navBurger" aria-label="Men&uuml; &ouml;ffnen" aria-expanded="false" aria-controls="primaryNav">
    <svg viewBox="0 0 24.09 24.09" aria-hidden="true"><use href="#icon-burger-menu"/></svg>
  </button>

  <div class="nav-right">
    <!-- Search: verlinkt auf die Kurs-Suche -->
    <a href="/de/suche/" class="nav-icon-btn" aria-label="Suche" data-tooltip="Suche">
      <svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-search-solid"/></svg>
    </a>
    <!-- Heart / Merkliste -->
    <div class="merkliste-wrap nav-merkliste" data-merkliste-menu>
      <button type="button" class="nav-icon-btn merkliste-trigger" aria-haspopup="dialog" aria-expanded="false" aria-label="Merkliste anzeigen" data-tooltip="Merkliste" data-merkliste-open>
        <svg class="nav-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-solid"/></svg>
        <span class="merkliste-badge" data-merkliste-count hidden>0</span>
      </button>
      <div class="merkliste-panel" role="dialog" aria-label="Gemerkte Kurse" data-merkliste-panel>
        <div class="merkliste-panel-head">
          <strong>Meine Merkliste</strong>
          <button type="button" class="merkliste-panel-close" aria-label="Merkliste schließen" data-tooltip="Schließen" data-merkliste-close><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg></button>
        </div>
        <ul class="merkliste-list" data-merkliste-list></ul>
        <p class="merkliste-empty" data-merkliste-empty>Sie haben noch keine Kurse gemerkt. Fügen Sie diese Seite über den Button unten hinzu.</p>
        <div class="merkliste-panel-foot">
          <button type="button" class="merkliste-add" aria-pressed="false" data-merkliste-toggle data-course-id="home" data-course-title="">
            <svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg>
            <span data-merkliste-label>Diese Seite merken</span>
          </button>
        </div>
      </div>
    </div>
    <!-- Profile/Login: ausgeblendet, bis der Login-Bereich kommt (Betreiberwunsch 2026-06-15) -->
    <a class="btn-cta-wrap cta-secondary" href="/de/kontakt/" aria-label="Kostenlose Beratung">
      <svg class="btn-cta-icon" viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-phone-solid"/></svg>
      <div class="btn-cta-text">
        <span class="btn-cta-label">Kostenlose Beratung</span>
      </div>
    </a>
  </div>
</nav>
</header><!-- /nav-fixed-wrapper -->
<main class="content-wrap">
<section class="hero ki-disclaimer" id="top"><img src="https://ifmera.com/media/ifmera-teaser.webp" alt="" srcset="https://ifmera.com/media/ifmera-teaser-480.webp 480w, https://ifmera.com/media/ifmera-teaser-960.webp 960w, https://ifmera.com/media/ifmera-teaser-1600.webp 1600w, https://ifmera.com/media/ifmera-teaser.webp 2172w" sizes="100vw" fetchpriority="high" decoding="async"><div class="hero-card"><h1 class="hero-title">Weiterbildung<br>Coaching &amp; Consulting</h1><div class="badge-row"><div class="badge"><svg class="badge-icon" viewBox="0 0 24 24"><use href="#icon-podium-solid"/></svg> Based on Competence</div></div><div class="hero-card-extra"><div class="cms-grid"  style="--cms-grid-cols:2;--cms-grid-gap:2rem;--cms-grid-template:32rem 1fr;margin-top:1.5rem"><div class="suche-tags-field" style="width:100%"><form class="suche-input-wrap" role="search" action="/de/suche/" method="get"><div class="form-field form-field--inline-cta"><label class="form-field-label visually-hidden">Weiterbildungssuche</label><div class="form-field-control"><span class="form-field-icon-slot form-field-icon-slot--leading" aria-hidden="true"><svg viewBox="0 0 640 640"><use href="#icon-search-solid"/></svg></span><input class="form-field-input" type="search" name="q" placeholder="" autocomplete="off" aria-label="Weiterbildungssuche" data-suche-animate="1" data-suche-ph="Projektmanagement|KI"><button class="form-field-cta-btn" type="submit">Weiterbildung finden</button></div></div></form></div><a class="cta-secondary" href="/de/kontakt/"><svg viewBox="0 0 24 24"><use href="#icon-user-solid"/></svg> Gratis Beratung</a></div></div></div></section><section style="margin-top:4rem"><div class="cms-grid" style="--cms-grid-cols:2;--cms-grid-gap:2rem;--cms-grid-template:2fr 1fr;align-items:center;"><div><div class="cms-carousel" id="cmscby6lps474" style="--cms-pv:3;--cms-pv-m:1;--carousel-gap:2rem;"><div class="carousel-viewport"><div class="carousel-track" id="cmsctby6lps474"><div class="carousel-slide"><span class="cms-icon-block is-center"><svg class="cms-icon-block-svg is-wide" viewBox="0 0 709 302" aria-hidden="true" style="height:4rem;"><use href="#logo-grohe"/></svg></span></div><div class="carousel-slide"><span class="cms-icon-block is-center"><svg class="cms-icon-block-svg" viewBox="0 0 24 24" aria-hidden="true" style="width:4rem;height:4rem;"><use href="#logo-thyssenkrupp"/></svg></span></div><div class="carousel-slide"><span class="cms-icon-block is-center"><svg class="cms-icon-block-svg" viewBox="0 0 24 24" aria-hidden="true" style="width:4rem;height:4rem;"><use href="#logo-deutsche-bahn"/></svg></span></div><div class="carousel-slide"><span class="cms-icon-block is-center"><svg class="cms-icon-block-svg" viewBox="0 0 24 24" aria-hidden="true" style="width:4rem;height:4rem;"><use href="#logo-volkswagen"/></svg></span></div><div class="carousel-slide"><span class="cms-icon-block is-center"><svg class="cms-icon-block-svg" viewBox="0 0 24 24" aria-hidden="true" style="width:4rem;height:4rem;"><use href="#logo-verbraucherzentrale"/></svg></span></div></div></div><div class="carousel-dots" id="cmscdby6lps474"></div></div><script>document.addEventListener("DOMContentLoaded",function(){if(window.initCarousel){window.initCarousel({root:"#cmscby6lps474",track:"cmsctby6lps474",dots:"cmscdby6lps474",slideSelector:".carousel-slide",perViewDesktop:3,perViewMobile:1,autoplay:3000,mobileQuery:"(max-width: 900px)",gap:"2rem"});}});</script><p class="notch-subtitle"  style="text-align:center;margin-top:1rem">Sie sind in bester Gesellschaft, wenn Sie sich für&nbsp;<svg class="cms-inline-icon" viewBox="0 0 620 170" style="height:1.1em;width:auto;fill:var(--color-primary);position:relative;top:-0.1rem;" aria-hidden="true"><use href="#icon-ifmera-wortmarke"></use></svg>​ entscheiden.</p></div><div class="cms-notch has-notch" style="background:var(--color-primary);"><div class="notch"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-heart-solid"/></svg></div></div><div class="cms-stars is-center"  style="--cms-star-size:1.6rem;margin:1rem 0"><div class="stars"><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star" viewBox="0 0 24 24"><use href="#icon-star-half-solid"/></svg></div><span class="cms-stars-value">4,5</span></div><p style="text-align:center;color:var(--color-light);">Ermittelt aus 18005 Bewertungen</p></div></div></section><section><div class="cms-blogposts" style="--cms-blog-cols:3"><div class="cms-blogposts-grid"><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/weiterbildung/offene-seminare/" aria-label="Offene Seminare"><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/weiterbildung/weiterbildung-teaser.webp" alt="" srcset="https://ifmera.com/media/weiterbildung/weiterbildung-teaser-480.webp 480w, https://ifmera.com/media/weiterbildung/weiterbildung-teaser-960.webp 960w, https://ifmera.com/media/weiterbildung/weiterbildung-teaser-1600.webp 1600w, https://ifmera.com/media/weiterbildung/weiterbildung-teaser.webp 2172w" sizes="(max-width: 700px) 100vw, 33vw" style="object-position:right center" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">Offene Seminare</h3></div></a><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/weiterbildung/gefoerderte-weiterbildung/" aria-label="Geförderte Weiterbildung"><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/weiterbildung/gefoerderte-weiterbildung/gefoerderte-weiterbildung-teaser.webp" alt="" srcset="https://ifmera.com/media/weiterbildung/gefoerderte-weiterbildung/gefoerderte-weiterbildung-teaser-480.webp 480w, https://ifmera.com/media/weiterbildung/gefoerderte-weiterbildung/gefoerderte-weiterbildung-teaser-960.webp 960w, https://ifmera.com/media/weiterbildung/gefoerderte-weiterbildung/gefoerderte-weiterbildung-teaser-1600.webp 1600w, https://ifmera.com/media/weiterbildung/gefoerderte-weiterbildung/gefoerderte-weiterbildung-teaser.webp 2172w" sizes="(max-width: 700px) 100vw, 33vw" style="object-position:right center" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">Geförderte Weiterbildung</h3></div></a><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/coaching/" aria-label="Coaching"><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/coaching/coaching-teaser.webp" alt="" srcset="https://ifmera.com/media/coaching/coaching-teaser-480.webp 480w, https://ifmera.com/media/coaching/coaching-teaser-960.webp 960w, https://ifmera.com/media/coaching/coaching-teaser-1600.webp 1600w, https://ifmera.com/media/coaching/coaching-teaser.webp 2172w" sizes="(max-width: 700px) 100vw, 33vw" style="object-position:right center" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">Coaching</h3></div></a></div></div></section><section><h2  style="text-align:center;display:block">Entdecken Sie unsere Wissenswelten</h2><div class="icon-tile-grid cms-kategorien" style="--cms-kat-cols:4"><a class="icon-tile" href="/de/weiterbildung/datenschutz/" data-tooltip="Zur Wissenswelt Datenschutz"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-datenschutz"/></svg><span class="icon-tile-title">Datenschutz</span><span class="icon-tile-meta">6 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/digitale-kompetenzen/" data-tooltip="Zur Wissenswelt Digitale Kompetenzen"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-digitale-kompetenzen"/></svg><span class="icon-tile-title">Digitale Kompetenzen</span><span class="icon-tile-meta">11 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/edv-kenntnisse/" data-tooltip="Zur Wissenswelt EDV Kenntnisse"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-link"/></svg><span class="icon-tile-title">EDV Kenntnisse</span><span class="icon-tile-meta">4 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/einkauf/" data-tooltip="Zur Wissenswelt Einkauf"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-einkauf"/></svg><span class="icon-tile-title">Einkauf</span><span class="icon-tile-meta">10 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/fuehrungskompetenzen/" data-tooltip="Zur Wissenswelt Führungskompetenzen"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-fuehrungskompetenzen"/></svg><span class="icon-tile-title">Führungskompetenzen</span><span class="icon-tile-meta">65 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/gesundheitsmanagement/" data-tooltip="Zur Wissenswelt Gesundheitsmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-gesundheitsmanagement"/></svg><span class="icon-tile-title">Gesundheitsmanagement</span><span class="icon-tile-meta">14 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/immobilienmanagement/" data-tooltip="Zur Wissenswelt Immobilienwirtschaft und -management"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-immobilienmanagement"/></svg><span class="icon-tile-title">Immobilienwirtschaft und -management</span><span class="icon-tile-meta">22 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/kommunikation/" data-tooltip="Zur Wissenswelt Kommunikation"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-kommunikation"/></svg><span class="icon-tile-title">Kommunikation</span><span class="icon-tile-meta">36 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/kuenstliche-intelligenz/" data-tooltip="Zur Wissenswelt Künstliche Intelligenz"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-kuenstliche-intelligenz"/></svg><span class="icon-tile-title">Künstliche Intelligenz</span><span class="icon-tile-meta">38 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/logistik-und-produktionsmanagement/" data-tooltip="Zur Wissenswelt Logistik- und Produktionsmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-logistik-und-produktionsmanagement"/></svg><span class="icon-tile-title">Logistik- und Produktionsmanagement</span><span class="icon-tile-meta">8 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/marketing-und-pr/" data-tooltip="Zur Wissenswelt Marketing und PR"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-marketing-und-pr"/></svg><span class="icon-tile-title">Marketing und PR</span><span class="icon-tile-meta">53 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/modul-kombinationen/" data-tooltip="Zur Wissenswelt Modulkombinationen"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-link"/></svg><span class="icon-tile-title">Modulkombinationen</span><span class="icon-tile-meta">109 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/nachhaltigkeitsmanagement/" data-tooltip="Zur Wissenswelt Nachhaltigkeitsmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-nachhaltigkeitsmanagement"/></svg><span class="icon-tile-title">Nachhaltigkeitsmanagement</span><span class="icon-tile-meta">12 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/organisationsmanagement/" data-tooltip="Zur Wissenswelt Organisationsmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-organisationsmanagement"/></svg><span class="icon-tile-title">Organisationsmanagement</span><span class="icon-tile-meta">40 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/personalmanagement/" data-tooltip="Zur Wissenswelt Personalmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-personalmanagement"/></svg><span class="icon-tile-title">Personalmanagement</span><span class="icon-tile-meta">51 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/projektmanagement/" data-tooltip="Zur Wissenswelt Projektmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-projektmanagement"/></svg><span class="icon-tile-title">Projektmanagement</span><span class="icon-tile-meta">32 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/prozess-und-qualitaetsmanagement/" data-tooltip="Zur Wissenswelt Prozess- und Qualitätsmanagement"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-prozess-und-qualitaetsmanagement"/></svg><span class="icon-tile-title">Prozess- und Qualitätsmanagement</span><span class="icon-tile-meta">10 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/rechnungswesen-und-controlling/" data-tooltip="Zur Wissenswelt Rechnungswesen und Controlling"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-rechnungswesen-und-controlling"/></svg><span class="icon-tile-title">Rechnungswesen und Controlling</span><span class="icon-tile-meta">28 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/recht/" data-tooltip="Zur Wissenswelt Recht"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-recht"/></svg><span class="icon-tile-title">Recht</span><span class="icon-tile-meta">37 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/sap/" data-tooltip="Zur Wissenswelt SAP"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-sap"/></svg><span class="icon-tile-title">SAP</span><span class="icon-tile-meta">44 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/soft-skills/" data-tooltip="Zur Wissenswelt Soft Skills"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-soft-skills"/></svg><span class="icon-tile-title">Soft Skills</span><span class="icon-tile-meta">21 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/train-the-trainer/" data-tooltip="Zur Wissenswelt Train the Trainer"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-train-the-trainer"/></svg><span class="icon-tile-title">Train the Trainer</span><span class="icon-tile-meta">9 Weiterbildungen</span></a><a class="icon-tile" href="/de/weiterbildung/vertrieb/" data-tooltip="Zur Wissenswelt Vertrieb"><svg class="icon-tile-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-vertrieb"/></svg><span class="icon-tile-title">Vertrieb</span><span class="icon-tile-meta">31 Weiterbildungen</span></a></div></section><section><div class="cms-blogposts" style="--cms-blog-cols:3"><h2 class="section-heading">Unser neuestes Wissen</h2><div class="cms-blogposts-grid"><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/wissen/blog/ki-im-personalwesen-5-beispiele-die-im-hr-alltag-wirklich-funktionieren/" aria-label="KI im Personalwesen: 5 Beispiele, die im HR-Alltag wirklich funktionieren"><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/blog/2026/03/hr-praesentation-ki-daten.jpg" alt="" srcset="https://ifmera.com/media/blog/2026/03/hr-praesentation-ki-daten-300x150.jpg 300w, https://ifmera.com/media/blog/2026/03/hr-praesentation-ki-daten-500x250.jpg 500w, https://ifmera.com/media/blog/2026/03/hr-praesentation-ki-daten-1024x512.jpg 1024w, https://ifmera.com/media/blog/2026/03/hr-praesentation-ki-daten.jpg 1200w" sizes="(max-width: 700px) 100vw, 33vw" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">KI im Personalwesen: 5 Beispiele, die im HR-Alltag wirklich funktionieren</h3></div></a><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/wissen/blog/hybride-fuehrung-warum-moderne-fuehrungskraefte-heute-zwei-welten-verbinden-muessen/" aria-label="Hybride Führung: Warum moderne Führungskräfte heute zwei Welten verbinden müssen"><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/blog/2026/03/hybride-fuehrung-meeting.png" alt="" srcset="https://ifmera.com/media/blog/2026/03/hybride-fuehrung-meeting-300x150.png 300w, https://ifmera.com/media/blog/2026/03/hybride-fuehrung-meeting-500x250.png 500w, https://ifmera.com/media/blog/2026/03/hybride-fuehrung-meeting-1024x512.png 1024w, https://ifmera.com/media/blog/2026/03/hybride-fuehrung-meeting.png 1200w" sizes="(max-width: 700px) 100vw, 33vw" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">Hybride Führung: Warum moderne Führungskräfte heute zwei Welten verbinden müssen</h3></div></a><a class="cms-blog-card has-notch is-bottom-right has-teaser" href="/de/wissen/blog/weiterbildungen-die-auf-dem-arbeitsmarkt-gefragt-sind/" aria-label="Weiterbildungen, die auf dem Arbeitsmarkt gefragt sind."><div class="notch" aria-hidden="true"><div class="dot"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><img class="cms-blog-card-bg" src="https://ifmera.com/media/blog/2023/05/katze-suche.jpg" alt="" srcset="https://ifmera.com/media/blog/2023/05/katze-suche-300x150.jpg 300w, https://ifmera.com/media/blog/2023/05/katze-suche-500x250.jpg 500w, https://ifmera.com/media/blog/2023/05/katze-suche-1024x512.jpg 1024w, https://ifmera.com/media/blog/2023/05/katze-suche.jpg 1200w" sizes="(max-width: 700px) 100vw, 33vw" loading="lazy" decoding="async" aria-hidden="true"><span class="cms-blog-card-shade" aria-hidden="true"></span><div class="cms-blog-card-body"><h3 class="cms-blog-card-title">Weiterbildungen, die auf dem Arbeitsmarkt gefragt sind.</h3></div></a></div></div></section><section class="cms-kurssuche" id="kurssuche" data-ks-endpoint="/api/search.php" data-ks-perpage="10" data-ks-chat="/api/search-chat.php"><h2 class="section-heading">Ihre Weiterbildung finden</h2><form class="ks-form" id="ks-form" role="search" method="get" action="/de/" data-ks-form><div class="ks-layout"><div class="ks-topbar"><div class="ks-searchbar"><div class="form-field form-field--search ks-searchfield"><label class="form-field-label visually-hidden" for="ks-q">Suchbegriff</label><div class="form-field-control"><span class="form-field-icon-slot form-field-icon-slot--leading"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-search-solid"/></svg></span><input class="form-field-input" type="search" id="ks-q" name="q" value="" placeholder="Thema, Titel, Stichwort …" autocomplete="off" data-ks-input role="combobox" aria-expanded="false" aria-autocomplete="list" aria-controls="ks-suggest-list"><span class="form-field-icon-slot"><button type="button" class="form-field-icon-btn ks-q-clear" data-ks-clear aria-label="Suche leeren" hidden><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg></button></span></div><ul class="ks-suggest" id="ks-suggest-list" role="listbox" data-ks-suggest hidden></ul></div><button type="button" class="ks-ai-btn" data-ks-chat-open aria-expanded="false" title="Mit der KI-Beratung den passenden Kurs finden"><svg class="ks-ai-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-sparkles-solid"/></svg> KI-Beratung</button></div><div class="ks-chat" data-ks-chat-panel hidden role="dialog" aria-label="KI-Beratung"><div class="ks-chat-head"><span><svg class="ks-ai-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-sparkles-solid"/></svg> KI-Beratung</span><button type="button" class="ks-chat-close" data-ks-chat-close aria-label="Schließen">✕</button></div><div class="ks-chat-log" data-ks-chat-log aria-live="polite"></div><div class="ks-chat-form" data-ks-chat-form><input type="text" class="ks-chat-input" data-ks-chat-input placeholder="Wonach suchen Sie?" autocomplete="off" maxlength="500"><button type="button" class="ks-chat-send" data-ks-chat-send>Senden</button></div><div class="ks-chat-foot"><span class="ks-chat-ai-note">KI-Assistent — Angaben ohne Gewähr.</span><a class="ks-chat-handoff" href="/de/kontakt/">Lieber persönlich? Zur Beratung →</a></div></div></div><input type="checkbox" id="ks-filter-b9w7jxxq4" class="ks-filter-cb" data-ks-filter-cb><label class="ks-filter-toggle" for="ks-filter-b9w7jxxq4"><svg viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-filter-solid"/></svg><span class="ks-filter-toggle-label">Filter</span><svg class="ks-filter-chev" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevron-right-solid"/></svg></label><aside class="ks-sidebar has-notch is-left"><div class="notch"><div class="dot ks-filter-dot"><svg viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-filter-solid"/></svg><span>Filter</span></div></div><div class="ks-foerder-field"><fieldset class="form-field-fieldset"><legend>Förderung</legend><div class="form-field-fieldset-body"><label class="form-field-check"><input type="checkbox" name="funding[]" value="full"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">100 % gefördert</span></label><label class="form-field-check"><input type="checkbox" name="funding[]" value="none"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">ohne Förderung</span></label></div></fieldset><small class="form-field-helper ks-foerder-hint">Über Bildungsgutschein oder AVGS komplett förderbar. <button type="button" class="tooltip-icon" data-tooltip="Mehr zur Förderung über Bildungsgutschein und AVGS: &lt;a href=&quot;/de/weiterbildung/gefoerderte-weiterbildung/&quot;&gt;Zu den Fördermöglichkeiten&lt;/a&gt;" aria-label="Mehr zur Förderung — zu den Fördermöglichkeiten"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-info-circle"/></svg></button></small></div><div class="ks-filters"><fieldset class="form-field-fieldset"><legend>Art</legend><div class="form-field-fieldset-body"><label class="form-field-check"><input type="checkbox" name="typ[]" value="Seminar"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">Offenes Seminar</span></label><label class="form-field-check"><input type="checkbox" name="typ[]" value="Weiterbildung"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">geförderte Weiterbildung</span></label><label class="form-field-check"><input type="checkbox" name="typ[]" value="Jobcoaching"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">AVGS Coaching</span></label><label class="form-field-check"><input type="checkbox" name="typ[]" value="Coaching"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">Business Coaching</span></label><label class="form-field-check"><input type="checkbox" name="typ[]" value="Fernlehrgang"><span class="form-field-check-box" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></span><span class="form-field-check-label">Fernlehrgang</span></label></div></fieldset><div class="form-field"><label class="form-field-label" for="f_kat_2e00">Kategorie</label><div class="form-field-combobox" data-combobox data-multiple data-searchable data-placeholder="Alle Kategorien"><select id="f_kat_2e00" name="kat[]" class="form-field-native-select" multiple><option value="4044" data-permalink="datenschutz">Datenschutz</option><option value="19817" data-permalink="digitale-kompetenzen">Digitale Kompetenzen</option><option value="4590" data-permalink="edv-kenntnisse">EDV Kenntnisse</option><option value="19821" data-permalink="einkauf">Einkauf</option><option value="3518" data-permalink="fuehrungskompetenzen">Führungskompetenzen</option><option value="3717" data-permalink="gesundheitsmanagement">Gesundheitsmanagement</option><option value="3745" data-permalink="immobilienmanagement">Immobilienwirtschaft und -management</option><option value="4060" data-permalink="kommunikation">Kommunikation</option><option value="19823" data-permalink="kuenstliche-intelligenz">Künstliche Intelligenz</option><option value="3679" data-permalink="logistik-und-produktionsmanagement">Logistik- und Produktionsmanagement</option><option value="3792" data-permalink="marketing-und-pr">Marketing und PR</option><option value="6884" data-permalink="modul-kombinationen">Modulkombinationen</option><option value="19819" data-permalink="nachhaltigkeitsmanagement">Nachhaltigkeitsmanagement</option><option value="3062" data-permalink="organisationsmanagement">Organisationsmanagement</option><option value="3595" data-permalink="personalmanagement">Personalmanagement</option><option value="3653" data-permalink="projektmanagement">Projektmanagement</option><option value="3675" data-permalink="prozess-und-qualitaetsmanagement">Prozess- und Qualitätsmanagement</option><option value="3901" data-permalink="rechnungswesen-und-controlling">Rechnungswesen und Controlling</option><option value="3951" data-permalink="recht">Recht</option><option value="4136" data-permalink="sap">SAP</option><option value="4097" data-permalink="soft-skills">Soft Skills</option><option value="4123" data-permalink="train-the-trainer">Train the Trainer</option><option value="19822" data-permalink="vertrieb">Vertrieb</option></select></div></div><div class="form-field"><label class="form-field-label" for="f_ort_f3b6">Ort</label><div class="form-field-combobox" data-combobox data-multiple data-searchable data-placeholder="Alle Orte"><select id="f_ort_f3b6" name="ort[]" class="form-field-native-select" multiple><option value="online">Live-Online</option><option value="Berlin">Berlin</option><option value="Düsseldorf">Düsseldorf</option><option value="Frankfurt am Main">Frankfurt am Main</option><option value="Hamburg">Hamburg</option><option value="Hannover">Hannover</option><option value="Leipzig">Leipzig</option><option value="München">München</option><option value="Nürnberg">Nürnberg</option><option value="Potsdam">Potsdam</option><option value="Stuttgart">Stuttgart</option><option value="Wien">Wien</option></select></div></div><div class="form-field form-field--daterange" data-daterange><label class="form-field-label" for="f_zeitraum_cc2a">Terminzeitraum</label><div class="form-field-control"><button type="button" class="form-field-input form-field-daterange-trigger" data-daterange-trigger aria-haspopup="dialog" aria-expanded="false"><span class="form-field-daterange-value" data-daterange-label data-placeholder="Beliebig">Beliebig</span></button><span class="form-field-icon-slot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg></span><div class="form-field-daterange-pop" data-daterange-pop hidden role="dialog" aria-label="Zeitraum wählen"><div class="form-field-daterange-presets"><button type="button" class="form-field-daterange-preset" data-daterange-preset="week">Diese Woche</button><button type="button" class="form-field-daterange-preset" data-daterange-preset="month">Dieser Monat</button><button type="button" class="form-field-daterange-preset" data-daterange-preset="year">Dieses Jahr</button><button type="button" class="form-field-daterange-preset" data-daterange-preset="next30">Nächste 30 Tage</button><button type="button" class="form-field-daterange-preset" data-daterange-preset="next90">Nächste 3 Monate</button></div><div class="form-field-daterange-inputs"><label class="form-field-daterange-in"><span>Von</span><input type="date" id="f_zeitraum_cc2a_from" name="von" data-daterange-from></label><label class="form-field-daterange-in"><span>Bis</span><input type="date" id="f_zeitraum_cc2a_to" name="bis" data-daterange-to></label></div><div class="form-field-daterange-actions"><button type="button" class="form-field-daterange-clear" data-daterange-clear>Zurücksetzen</button><button type="button" class="form-field-daterange-apply" data-daterange-apply>Übernehmen</button></div></div></div></div><div class="form-field"><label class="form-field-label" for="f_dauer_a94e">Dauer</label><div class="form-field-combobox" data-combobox><select id="f_dauer_a94e" name="dauer" class="form-field-native-select"><option value="">Beliebig</option><option value="1">1 Tag</option><option value="2-3">2–3 Tage</option><option value="4-10">4–10 Tage</option><option value="11">11+ Tage</option></select></div></div><div class="form-field form-field--range ks-field--preis"><label class="form-field-label">Preis</label><div class="form-field-control"><div class="form-field-range-track"><input class="form-field-range ks-range" type="range" name="preis_max" min="0" max="7972" step="50" value="7972" data-ks-price data-ks-pricemax="7972" aria-label="Höchstpreis"></div><div class="ks-price-scale"><span class="ks-price-min">0 €</span><span class="ks-price-cap">max. Kurskosten</span><span class="ks-price-max"><output data-ks-price-out>7.972 €</output></span></div></div></div><div class="form-field"><label class="form-field-label" for="f_abschluss_a564">Abschluss</label><div class="form-field-combobox" data-combobox data-multiple data-searchable data-placeholder="Alle Abschlüsse"><select id="f_abschluss_a564" name="abschluss[]" class="form-field-native-select" multiple><option value="15764">Diplom</option><option value="15762">GPM-Zertifikat</option><option value="3027">ICDL</option><option value="3020">ifmera - Diplom</option><option value="3022">IHK - Abschluss</option><option value="3026">LCCI-Zertifikat</option><option value="3024">SAP - Anwenderzertifizierung</option><option value="15761">Teilnahmebescheinigung</option><option value="3025">TÜV-Zertifikat</option><option value="3023">Zertifikat</option></select></div></div></div><noscript><button type="submit" class="cta-main ks-apply">Filter anwenden</button></noscript><div class="ks-sidebar-foot"><a class="cta-secondary ks-reset-btn" href="/de/" data-ks-reset>Alle Filter zurücksetzen</a></div></aside><div class="ks-main"><div class="ks-toolbar"><div class="ks-count" role="status" aria-live="polite" data-ks-count>1–10 von 708 Treffer</div><div class="form-field ks-sort"><label class="form-field-label" for="ks-sort-sel">Sortieren</label><div class="form-field-combobox" data-combobox><select id="ks-sort-sel" name="sort" class="form-field-native-select" data-ks-sort data-ks-default="relevanz"><option value="relevanz" selected>Relevanz</option><option value="neuste">Neueste</option><option value="naechster-termin">Nächster Termin</option><option value="preis-auf">Preis aufsteigend</option><option value="preis-ab">Preis absteigend</option><option value="bewertung">Beste Bewertung</option><option value="zufall">Zufällig</option></select></div></div></div><div class="ks-results" data-ks-results aria-busy="false"><div class="folgekurse-grid ks-grid" data-ks-grid><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="absentismus-praesentismus-reduzieren" data-course-title="Absentismus und Präsentismus reduzieren – Gesund bleiben, smart arbeiten" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/absentismus-praesentismus-reduzieren/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/fuehrungskompetenzen/absentismus-praesentismus-reduzieren/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-spezial"/></svg>Spezial</div></div><a href="/de/weiterbildung/fuehrungskompetenzen/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Führungskompetenzen</a><div class="kurs-card-title">Absentismus und Präsentismus reduzieren – Gesund bleiben, smart arbeiten</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Leistung und Wohlbefinden im Gleichgewicht zu halten, ist eine zentrale Aufgabe für zukunftsfähige Organisationen. Wenn Mitarbeitende jedoch häufig fehlen (Absentismus) oder trotz…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>70 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="rechtssichere-arbeitsvertragsgestaltung" data-course-title="Arbeitsverträge gestalten – Rechtliche Anforderungen und aktuelle Entwicklungen" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/recht/rechtssichere-arbeitsvertragsgestaltung/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/recht/rechtssichere-arbeitsvertragsgestaltung/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-spezial"/></svg>Spezial</div><div class="kurs-card-rating"><div class="stars"><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star" viewBox="0 0 24 24"><use href="#icon-star-half-solid"/></svg></div></div></div><a href="/de/weiterbildung/recht/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Recht</a><div class="kurs-card-title">Arbeitsverträge gestalten – Rechtliche Anforderungen und aktuelle Entwicklungen</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Der Arbeitsvertrag bildet die Grundlage jedes Arbeitsverhältnisses und schafft den Rahmen für die Zusammenarbeit zwischen Arbeitgeber:innen und Arbeitnehmenden. Gesetzliche Vorgab…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 900 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>6 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="betriebsvereinbarungen-rechtssicher-verhandeln" data-course-title="Betriebsvereinbarungen – gestalten, verhandeln und umsetzen " data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/recht/betriebsvereinbarungen-rechtssicher-verhandeln/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/recht/betriebsvereinbarungen-rechtssicher-verhandeln/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-basic"/></svg>Basic</div><div class="kurs-card-rating"><div class="stars"><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg></div></div></div><a href="/de/weiterbildung/recht/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Recht</a><div class="kurs-card-title">Betriebsvereinbarungen – gestalten, verhandeln und umsetzen </div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Betriebsvereinbarungen sind ein zentrales Instrument zur Gestaltung moderner Arbeitsbedingungen und für die Zusammenarbeit zwischen Arbeitgeber und Betriebsrat. Neue Arbeitsformen…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>6 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="wirtschaftsausschuss-fuer-fuehrungskraefte" data-course-title="Der Wirtschaftsausschuss für Führungskräfte – Rechte, Pflichten und Praxis" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/recht/wirtschaftsausschuss-fuer-fuehrungskraefte/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/recht/wirtschaftsausschuss-fuer-fuehrungskraefte/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-kompakt"/></svg>Kompakt</div></div><a href="/de/weiterbildung/recht/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Recht</a><div class="kurs-card-title">Der Wirtschaftsausschuss für Führungskräfte – Rechte, Pflichten und Praxis</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Der Wirtschaftsausschuss (WA) ist ein wichtiges Gremium zur Wahrung der wirtschaftlichen Interessen der Belegschaft. Für Führungskräfte bedeutet dies die Pflicht, das Gremium rech…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 900 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>6 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="eu-ai-act-ki-verordnung-einfuehrung" data-course-title="EU AI Act – Einführung in die neue KI-Verordnung" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/kuenstliche-intelligenz/eu-ai-act-ki-verordnung-einfuehrung/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/kuenstliche-intelligenz/eu-ai-act-ki-verordnung-einfuehrung/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-spezial"/></svg>Spezial</div></div><a href="/de/weiterbildung/kuenstliche-intelligenz/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Künstliche Intelligenz</a><div class="kurs-card-title">EU AI Act – Einführung in die neue KI-Verordnung</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Künstliche Intelligenz ist längst kein Zukunftsthema mehr, sondern bereits Teil unserer Arbeitswelt. Mit dem EU AI Act hat die Europäische Union nun den weltweit ersten umfassende…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 900 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>6 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="leadership-in-unsicheren-zeiten" data-course-title="Leadership in unsicheren Zeiten – Souverän durch den Wandel führen" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/leadership-in-unsicheren-zeiten/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/fuehrungskompetenzen/leadership-in-unsicheren-zeiten/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-advanced"/></svg>Advanced</div></div><a href="/de/weiterbildung/fuehrungskompetenzen/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Führungskompetenzen</a><div class="kurs-card-title">Leadership in unsicheren Zeiten – Souverän durch den Wandel führen</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Die VUKA-Welt ist keine Zukunftsmusik, sie ist die neue Normalität. Klassisches Management stößt hier an seine Grenzen. Was jetzt zählt, sind Leadership-Skills, die Ihr Team auch…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>71 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="male-allyship" data-course-title="Male Allyship – Gleichstellung als Wettbewerbsvorteil " data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/male-allyship/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/fuehrungskompetenzen/male-allyship/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-spezial"/></svg>Spezial</div></div><a href="/de/weiterbildung/fuehrungskompetenzen/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Führungskompetenzen</a><div class="kurs-card-title">Male Allyship – Gleichstellung als Wettbewerbsvorteil </div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Gleichstellung und Chancengerechtigkeit sind zentrale Erfolgsfaktoren für moderne Organisationen. Dabei kommt Männern als Verbündeten eine entscheidende Rolle zu, um gemeinsam ein…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>71 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="programm-management-strategische-ziele-erfolgreich-umsetzen" data-course-title="Programmmanagement – Strategische Ziele erfolgreich umsetzen" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/projektmanagement/programm-management-strategische-ziele-erfolgreich-umsetzen/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/projektmanagement/programm-management-strategische-ziele-erfolgreich-umsetzen/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-expert"/></svg>Expert</div><div class="kurs-card-rating"><div class="stars"><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg></div></div></div><a href="/de/weiterbildung/projektmanagement/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Projektmanagement</a><div class="kurs-card-title">Programmmanagement – Strategische Ziele erfolgreich umsetzen</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Professionelles Programmmanagement verbindet Projekte mit den strategischen Zielen eines Unternehmens und schafft die Grundlage für eine koordinierte Umsetzung komplexer Vorhaben.…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>72 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="qualitaetsmanagement-die-neue-din-iso-90012015" data-course-title="Qualitätsmanagement nach ISO 9001:2015 – Anforderungen verstehen und umsetzen" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/prozess-und-qualitaetsmanagement/qualitaetsmanagement-die-neue-din-iso-90012015/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/prozess-und-qualitaetsmanagement/qualitaetsmanagement-die-neue-din-iso-90012015/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-advanced"/></svg>Advanced</div><div class="kurs-card-rating"><div class="stars"><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star star-filled" viewBox="0 0 24 24"><use href="#icon-star-solid"/></svg><svg class="star" viewBox="0 0 24 24"><use href="#icon-star-half-solid"/></svg></div></div></div><a href="/de/weiterbildung/prozess-und-qualitaetsmanagement/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Prozess- und Qualitätsmanagement</a><div class="kurs-card-title">Qualitätsmanagement nach ISO 9001:2015 – Anforderungen verstehen und umsetzen</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Die ISO 9001:2015 beschreibt Anforderungen an Qualitätsmanagementsysteme und bildet in vielen Unternehmen die Grundlage für strukturierte Prozesse und Qualitätsstandards. Ein syst…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 900 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>6 Termine</span></div></div></div></div><div class="card has-notch is-bottom-right" style="--card-bg:var(--color-primary);"><button type="button" class="kurs-card-merk" aria-pressed="false" aria-label="Zur Merkliste hinzufügen" data-tooltip="Zur Merkliste hinzufügen" data-merkliste-toggle data-course-id="scanner-persoenlichkeit" data-course-title="Scanner-Persönlichkeit – Stärken erkennen und Potenziale entfalten" data-course-kind="seminar" data-course-type="Offenes Seminar" data-course-url="https://ifmera.com/de/weiterbildung/soft-skills/scanner-persoenlichkeit/"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-heart-plus"/></svg></button><a href="/de/weiterbildung/soft-skills/scanner-persoenlichkeit/" class="kurs-card-link"></a><div class="notch"><div class="dot" aria-hidden="true"><svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></div></div><div class="kurs-card-level-group"><div class="kurs-card-type kurs-card-type--seminar">Offenes Seminar</div><div class="kurs-card-level"><svg viewBox="0 0 24 24" style="width:16px;height:16px;flex-shrink:0;"><use href="#icon-level-spezial"/></svg>Spezial</div></div><a href="/de/weiterbildung/soft-skills/" class="kurs-card-category"><svg viewBox="0 0 24 24"><use href="#icon-folder-solid"/></svg>Soft Skills</a><div class="kurs-card-title">Scanner-Persönlichkeit – Stärken erkennen und Potenziale entfalten</div><div class="kurs-card-body"><div class="kurs-card-content"><div class="kurs-card-summary" style="color:var(--color-light);">Sie interessieren sich für vieles, starten ständig neue Projekte und brennen für Ideen? Dann gehören Sie vermutlich zu den Menschen, die als Scanner-Persönlichkeiten bezeichnet we…</div><div class="kurs-card-meta"><span class="kurs-card-meta-item kurs-card-price">ab 1.400 €</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>ab 04.08.2026</span><span class="kurs-card-meta-item"><svg viewBox="0 0 24 24"><use href="#icon-calendar-solid"/></svg>72 Termine</span></div></div></div></div></div><nav class="ks-pagination" aria-label="Seiten" data-ks-pagination><div class="ks-pages"><span class="ks-page-num is-current" aria-current="page">1</span><button type="button" class="ks-page-num" data-ks-page="2" aria-label="Seite 2">2</button><button type="button" class="ks-page-num" data-ks-page="3" aria-label="Seite 3">3</button><span class="ks-page-ellipsis" aria-hidden="true">…</span><button type="button" class="ks-page-num" data-ks-page="71" aria-label="Seite 71">71</button></div><button type="button" class="cta-secondary ks-page ks-page-next" data-ks-page="2" aria-label="Nächste Seite">Weiter</button></nav></div><script type="application/ld+json" data-ks-jsonld>{"@context":"https://schema.org","@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@type":"Course","name":"Absentismus und Präsentismus reduzieren – Gesund bleiben, smart arbeiten","url":"https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/absentismus-praesentismus-reduzieren/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Leistung und Wohlbefinden im Gleichgewicht zu halten, ist eine zentrale Aufgabe für zukunftsfähige Organisationen. Wenn Mitarbeitende jedoch häufig fehlen (Absentismus) oder trotz…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"}}},{"@type":"ListItem","position":2,"item":{"@type":"Course","name":"Arbeitsverträge gestalten – Rechtliche Anforderungen und aktuelle Entwicklungen","url":"https://ifmera.com/de/weiterbildung/recht/rechtssichere-arbeitsvertragsgestaltung/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Der Arbeitsvertrag bildet die Grundlage jedes Arbeitsverhältnisses und schafft den Rahmen für die Zusammenarbeit zwischen Arbeitgeber:innen und Arbeitnehmenden. Gesetzliche Vorgab…","offers":{"@type":"Offer","price":"900","priceCurrency":"EUR"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.4","reviewCount":30,"bestRating":"5"}}},{"@type":"ListItem","position":3,"item":{"@type":"Course","name":"Betriebsvereinbarungen – gestalten, verhandeln und umsetzen ","url":"https://ifmera.com/de/weiterbildung/recht/betriebsvereinbarungen-rechtssicher-verhandeln/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Betriebsvereinbarungen sind ein zentrales Instrument zur Gestaltung moderner Arbeitsbedingungen und für die Zusammenarbeit zwischen Arbeitgeber und Betriebsrat. Neue Arbeitsformen…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.7","reviewCount":2,"bestRating":"5"}}},{"@type":"ListItem","position":4,"item":{"@type":"Course","name":"Der Wirtschaftsausschuss für Führungskräfte – Rechte, Pflichten und Praxis","url":"https://ifmera.com/de/weiterbildung/recht/wirtschaftsausschuss-fuer-fuehrungskraefte/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Der Wirtschaftsausschuss (WA) ist ein wichtiges Gremium zur Wahrung der wirtschaftlichen Interessen der Belegschaft. Für Führungskräfte bedeutet dies die Pflicht, das Gremium rech…","offers":{"@type":"Offer","price":"900","priceCurrency":"EUR"}}},{"@type":"ListItem","position":5,"item":{"@type":"Course","name":"EU AI Act – Einführung in die neue KI-Verordnung","url":"https://ifmera.com/de/weiterbildung/kuenstliche-intelligenz/eu-ai-act-ki-verordnung-einfuehrung/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Künstliche Intelligenz ist längst kein Zukunftsthema mehr, sondern bereits Teil unserer Arbeitswelt. Mit dem EU AI Act hat die Europäische Union nun den weltweit ersten umfassende…","offers":{"@type":"Offer","price":"900","priceCurrency":"EUR"}}},{"@type":"ListItem","position":6,"item":{"@type":"Course","name":"Leadership in unsicheren Zeiten – Souverän durch den Wandel führen","url":"https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/leadership-in-unsicheren-zeiten/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Die VUKA-Welt ist keine Zukunftsmusik, sie ist die neue Normalität. Klassisches Management stößt hier an seine Grenzen. Was jetzt zählt, sind Leadership-Skills, die Ihr Team auch…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"}}},{"@type":"ListItem","position":7,"item":{"@type":"Course","name":"Male Allyship – Gleichstellung als Wettbewerbsvorteil ","url":"https://ifmera.com/de/weiterbildung/fuehrungskompetenzen/male-allyship/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Gleichstellung und Chancengerechtigkeit sind zentrale Erfolgsfaktoren für moderne Organisationen. Dabei kommt Männern als Verbündeten eine entscheidende Rolle zu, um gemeinsam ein…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"}}},{"@type":"ListItem","position":8,"item":{"@type":"Course","name":"Programmmanagement – Strategische Ziele erfolgreich umsetzen","url":"https://ifmera.com/de/weiterbildung/projektmanagement/programm-management-strategische-ziele-erfolgreich-umsetzen/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Professionelles Programmmanagement verbindet Projekte mit den strategischen Zielen eines Unternehmens und schafft die Grundlage für eine koordinierte Umsetzung komplexer Vorhaben.…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.8","reviewCount":1,"bestRating":"5"}}},{"@type":"ListItem","position":9,"item":{"@type":"Course","name":"Qualitätsmanagement nach ISO 9001:2015 – Anforderungen verstehen und umsetzen","url":"https://ifmera.com/de/weiterbildung/prozess-und-qualitaetsmanagement/qualitaetsmanagement-die-neue-din-iso-90012015/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Die ISO 9001:2015 beschreibt Anforderungen an Qualitätsmanagementsysteme und bildet in vielen Unternehmen die Grundlage für strukturierte Prozesse und Qualitätsstandards. Ein syst…","offers":{"@type":"Offer","price":"900","priceCurrency":"EUR"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.5","reviewCount":25,"bestRating":"5"}}},{"@type":"ListItem","position":10,"item":{"@type":"Course","name":"Scanner-Persönlichkeit – Stärken erkennen und Potenziale entfalten","url":"https://ifmera.com/de/weiterbildung/soft-skills/scanner-persoenlichkeit/","provider":{"@type":"Organization","name":"ifmera academy"},"description":"Sie interessieren sich für vieles, starten ständig neue Projekte und brennen für Ideen? Dann gehören Sie vermutlich zu den Menschen, die als Scanner-Persönlichkeiten bezeichnet we…","offers":{"@type":"Offer","price":"1400","priceCurrency":"EUR"}}}]}</script></div></div></form></section><section style="background:transparent;"><div class="cms-notch has-notch is-left"><div class="notch"><h2 class="dot" data-toc="Über ifmera academy">Über ifmera academy</h2></div><p class="notch-subtitle">Ihr Kompetenzpartner für berufliche Wirksamkeit</p><div class="cms-grid cms-grid--plain" style="--cms-grid-cols:2;--cms-grid-gap:2rem;--cms-grid-template:1.8fr 0.55fr;"><div><p>Die<b> ifmera academy,</b> ehemals IFM Institut für Managementberatung, wurde 1993 gegründet und zählt heute zu den führenden Weiterbildungsanbietern im DACH-Raum. Als Kompetenzpartner mit europäischem Anspruch begleiten wir Fach- und Führungskräfte sowie Unternehmen dabei, berufliche Kompetenzen aufzubauen und wirksam einzusetzen.<br></p><p>Unser Angebot umfasst über <b>600 Seminare, geförderte Weiterbildungen, Coaching und Consulting</b> – auch auf Englisch. Jedes Format ist darauf ausgerichtet, marktrelevantes Wissen in anwendbare Kompetenz zu übersetzen.<br></p><p>Mit <b>12 Standorten</b> in Deutschland, Österreich und der Schweiz und einem internationalen Team von über <b>400 Expert:innen</b> aus Wirtschaft und Wissenschaft bieten wir <b>hochwertige Weiterbildung</b> dort, wo unsere Kund:innen sie brauchen: vor Ort, Live-Online oder individuell zugeschnitten.<br></p><p><b>Based on Competence.</b> Dafür steht die ifmera academy.<br></p><p><a href="/de/ueber-ifmera/" class="link">Mehr über ifmera academy erfahren</a></p></div><div><div class="info-tile info-tile--dark" style="margin-bottom: 2rem"><div class="info-tile-headline">30 Jahre Erfahrung</div><div class="info-tile-title">Weiterbildung, Coaching und Consulting seit 1993.</div><svg class="info-tile-bg-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-podium-solid"/></svg></div><div class="info-tile" style="margin-bottom:2rem"><div class="info-tile-headline">400+ Expert:innen</div><div class="info-tile-title">Trainer:innen & Coach:innen aus Wirtschaft & Wissenschaft.</div><svg class="info-tile-bg-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-award-solid"/></svg></div><div class="info-tile" style="margin-bottom:2rem"><div class="info-tile-headline">12 Standorte</div><div class="info-tile-title">In Deutschland, Österreich und der Schweiz – sowie online.</div><svg class="info-tile-bg-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-location-solid"/></svg></div></div></div></div></section>
</main>
<footer class="site-footer" role="contentinfo">
      <div class="footer-map-widget">
        <svg class="footer-map-svg" viewBox="375 120 250 323" xmlns="http://www.w3.org/2000/svg"
             aria-label="Standorte in DACH und Live Online">
          <use href="#dach-path-de" class="map-country de"/>
          <use href="#dach-path-ch" class="map-country ch"/>
          <use href="#dach-path-at" class="map-country at"/>
          <a href="/de/standorte/hamburg-alter-wall/" class="footer-pin" data-location="hamburg-alter-wall"><circle cx="468" cy="183" r="4"/><text x="468" y="175">Hamburg</text></a>
          <a href="/de/standorte/berlin-charlottenburg/" class="footer-pin" data-location="berlin-charlottenburg"><circle cx="539" cy="219" r="4"/><text x="539" y="211">Berlin</text></a>
          <a href="/de/standorte/potsdam/" class="footer-pin" data-location="potsdam"><circle cx="532" cy="223" r="4"/><text x="532" y="234">Potsdam</text></a>
          <a href="/de/standorte/hannover-alter-flughafen/" class="footer-pin" data-location="hannover-alter-flughafen"><circle cx="463" cy="224" r="4"/><text x="463" y="216">Hannover</text></a>
          <a href="/de/standorte/leipzig-listhaus/" class="footer-pin" data-location="leipzig-listhaus"><circle cx="518" cy="259" r="4"/><text x="518" y="251">Leipzig</text></a>
          <a href="/de/standorte/duesseldorf-koe-quartier/" class="footer-pin" data-location="duesseldorf-koe-quartier"><circle cx="401" cy="262" r="4"/><text x="401" y="254">Düsseldorf</text></a>
          <a href="/de/standorte/frankfurt-am-main-winx-tower/" class="footer-pin" data-location="frankfurt-am-main-winx-tower"><circle cx="441" cy="299" r="4"/><text x="441" y="291">Frankfurt</text></a>
          <a href="/de/standorte/nuernberg-airport/" class="footer-pin" data-location="nuernberg-airport"><circle cx="491" cy="321" r="4"/><text x="491" y="313">Nürnberg</text></a>
          <a href="/de/standorte/stuttgart-kronprinzenpalais/" class="footer-pin" data-location="stuttgart-kronprinzenpalais"><circle cx="451" cy="342" r="4"/><text x="451" y="334">Stuttgart</text></a>
          <a href="/de/standorte/muenchen-theresienhof/" class="footer-pin" data-location="muenchen-theresienhof"><circle cx="501" cy="362" r="4"/><text x="501" y="354">München</text></a>
          <a href="/de/standorte/wien-kohlmarkt/" class="footer-pin" data-location="wien-kohlmarkt"><circle cx="601" cy="360" r="4"/><text x="601" y="352">Wien</text></a>
          <a href="/de/standorte/basel-schweiz/" class="footer-pin" data-location="basel-schweiz"><circle cx="418" cy="380" r="4"/><text x="418" y="391">Basel</text></a>
          <a href="/de/standorte/online/" class="footer-pin-online" data-location="online"
             aria-label="Live Online: Seminare per Videokonferenz">
            <rect class="footer-pin-online-bg" x="530" y="299" width="70" height="22" rx="4" ry="4"/>
            <text class="footer-pin-online-label" x="565" y="310">Live Online</text>
          </a>
        </svg>
      </div>

      <!-- Linker Spalten-Stapel: frei pflegbare Karten (Standard: Unternehmen, Social, Zertifikat) -->
      <div class="footer-side footer-side--left">
      <nav class="footer-col" aria-labelledby="footer-col-l0">
        <h3 id="footer-col-l0" class="footer-col-title">Unternehmen</h3>
        <ul class="footer-list">
          <li><a href="/de/ueber-ifmera/">Über uns</a></li>
          <li><a href="/de/ueber-ifmera/karriere/">Karriere</a></li>
          <li><a href="/de/fakten/">Fakten</a></li>
          <li><a href="/de/ueber-ifmera/presse/">Presse</a></li>
          <li><a href="/de/ueber-ifmera/referenzen/">Referenzen</a></li>
        </ul>
      </nav>
      <div class="footer-col footer-col-social" aria-labelledby="footer-col-l1">
        <h3 id="footer-col-l1" class="footer-col-title">Folgen Sie uns</h3>
        <ul class="footer-social">
          <li><a href="https://www.linkedin.com/company/ifmera-academy" class="footer-social-link" rel="noopener" aria-label="ifmera academy auf LinkedIn">
            <svg viewBox="0 0 16 16" aria-hidden="true"><use href="#icon-linkedin"/></svg></a></li>
          <li><a href="https://www.instagram.com/ifmera_academy/" class="footer-social-link" rel="noopener" aria-label="ifmera academy auf Instagram">
            <svg viewBox="0 0 16 16" aria-hidden="true"><use href="#icon-instagram"/></svg></a></li>
          <li><a href="https://www.facebook.com/ifmera/" class="footer-social-link" rel="noopener" aria-label="ifmera academy auf Facebook">
            <svg viewBox="0 0 16 16" aria-hidden="true"><use href="#icon-facebook"/></svg></a></li>
        </ul>
      </div>
      <div class="footer-col footer-col-trust" aria-labelledby="footer-col-l2">
        <h3 id="footer-col-l2" class="footer-col-title">Zertifiziert</h3>
        <div class="footer-tuev">
          <img src="/assets/europanozert.webp" alt="Europäisches Zertifikat — geprüfte Qualität" class="footer-tuev-logo" width="100" height="99" loading="lazy" decoding="async">
        </div>
      </div>
      </div><!-- /.footer-side--left -->

      <!-- Rechter Spalten-Stapel: frei pflegbare Karten (Standard: Kontakt, Top Themen) -->
      <div class="footer-side footer-side--right">
      <div class="footer-col footer-col-contact" aria-labelledby="footer-col-r0">
        <h3 id="footer-col-r0" class="footer-col-title">Kontakt</h3>
        <address class="footer-contact">
          <a class="footer-contact-row" href="tel:+49302325352">
            <svg class="footer-contact-icon" viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-phone-solid"/></svg>
            <span>+49 (30) 232 535 2</span>
          </a>
          <a class="footer-contact-row" href="mailto:info@ifmera.com">
            <svg class="footer-contact-icon" viewBox="0 0 640 640" aria-hidden="true"><use href="#icon-mail-solid"/></svg>
            <span>info@ifmera.com</span>
          </a>
          <span class="footer-contact-row footer-contact-row--static">
            <svg class="footer-contact-icon" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-location-solid"/></svg>
            <span>Hohenzollerndamm 183<br />
10713 Berlin</span>
          </span>
        </address>
      </div>
      <nav class="footer-col" aria-labelledby="footer-col-r1">
        <h3 id="footer-col-r1" class="footer-col-title">Top Themen</h3>
        <ul class="footer-list">
          <li><a href="/de/weiterbildung/projektmanagement/">Projektmanagement</a></li>
          <li><a href="/de/weiterbildung/kuenstliche-intelligenz/">Künstliche Intelligenz</a></li>
          <li><a href="/de/weiterbildung/personalmanagement/">Personalmanagement</a></li>
          <li><a href="/de/weiterbildung/soft-skills/">Soft Skills</a></li>
          <li><a href="/de/weiterbildung/rechnungswesen-und-controlling/">Rechnungswesen und Controlling</a></li>
          <li><a href="/de/weiterbildung/marketing-und-pr/">Marketing und PR</a></li>
        </ul>
      </nav>
      </div><!-- /.footer-side--right -->

      <!-- Bottom-Bar: spannt alle Cols in der untersten Zeile; Legal-Links oben, Copyright darunter, beides zentriert -->
      <div class="footer-bottom">
        <nav class="footer-legal" aria-label="Rechtliche Hinweise">
          <ul>
            <li><a href="/de/agb/">AGB</a></li>
            <li><a href="/de/datenschutz/">Datenschutz</a></li>
            <li><a href="/de/impressum/">Impressum</a></li>
            <li><button type="button" class="footer-prefs-btn" data-prefs-trigger>Privatsphäre-Einstellungen</button></li>
          </ul>
        </nav>
        <p class="footer-copyright">&copy; 2026 ifmera academy GmbH. Alle Rechte vorbehalten.</p>
      </div>
</footer>
<button type="button" class="scroll-top" aria-label="Nach oben scrollen" data-scroll-top><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid" transform="rotate(-90 12 12)"/></svg></button>
<script>window.__ifmEnablePrefs=true;window.__ifmPrefsLinks={"datenschutz":"/de/datenschutz/","impressum":"/de/impressum/"};</script><script>;/* ===== JS Block 1 (orig. Zeilen 8562-8616) ===== */
(function() {
  const toggle = document.getElementById('tocToggle');
  if (!toggle) return;
  const dropdown = toggle.closest('.toc-dropdown');
  const panel = document.getElementById('tocPanel');

  // Toggle
  toggle.addEventListener('click', function(e) {
    e.stopPropagation();
    dropdown.classList.toggle('open');
  });

  // Klick auf Link -> schließen
  panel.addEventListener('click', function(e) {
    if (e.target.closest('a')) {
      dropdown.classList.remove('open');
    }
  });

  // Klick außerhalb -> schließen
  document.addEventListener('click', function(e) {
    if (!dropdown.contains(e.target)) {
      dropdown.classList.remove('open');
    }
  });

  // Sticky-Verhalten: pure CSS (.toc-section { position: sticky; top: var(--nav-height) }).
  // "Stuck"-Styling: in Chrome/Edge pure CSS via @container scroll-state(stuck: top).
  // Firefox (kein scroll-state CQ) bekam zuvor einen ungenauen .nav-scrolled-Proxy,
  // der den teal Hintergrund schon bei scrollY > 50 — lange vor dem Andocken — zeigte.
  // Stattdessen hier präzise Detection des echten Dock-Punkts: is-stuck wird gesetzt,
  // sobald die toc-section ihre sticky-top-Position erreicht. Nur als Fallback, wenn
  // scroll-state nicht unterstützt wird — in Chrome/Edge läuft dieser Block nicht.
  const tocSection = dropdown.closest('.toc-section');
  const supportsScrollState = window.CSS && CSS.supports && CSS.supports('container-type', 'scroll-state');
  if (tocSection && !supportsScrollState) {
    let stickyTopPx = 0;
    const measureTop = function() {
      stickyTopPx = parseFloat(getComputedStyle(tocSection).top) || 0;
    };
    let ticking = false;
    const evalStuck = function() {
      tocSection.classList.toggle('is-stuck', tocSection.getBoundingClientRect().top <= stickyTopPx + 0.5);
      ticking = false;
    };
    window.addEventListener('scroll', function() {
      if (!ticking) { requestAnimationFrame(evalStuck); ticking = true; }
    }, { passive: true });
    window.addEventListener('resize', function() { measureTop(); evalStuck(); }, { passive: true });
    measureTop();
    evalStuck();
  }
})();

;/* ===== JS Block 2 (orig. Zeilen 8619-8903) ===== */
(function() {
  'use strict';

  var OPEN_DELAY = 150;
  var CLOSE_DELAY = 200;
  var isTouch = window.matchMedia('(pointer: coarse)').matches;
  // Desktop/Mobile-Erkennung über matchMedia statt window.innerWidth: Letzteres in den
  // Hover-/Stage-Hotpaths (hoverAllowed/isDesktop werden bei jedem Hover + Stage-Switch
  // aufgerufen) flusht das Layout → Forced Reflow. matchMedia().matches ist browser-gecacht
  // und triggert kein Reflow. Gleiche Breiten-Basis wie die CSS-Drawer-Query
  // @media (max-width: 900px) (ohne Scrollbar) → JS und CSS sind am Breakpoint deckungsgleich.
  var mobileMQ = window.matchMedia('(max-width: 900px)');
  // Hover-Open nur Desktop ≥901px (Mobile-Drawer braucht expliziten Klick)
  var hoverAllowed = function() {
    return !isTouch && !mobileMQ.matches;
  };
  // Inert nur auf Desktop relevant — im Mobile-Drawer sind beide Stages inline sichtbar
  var isDesktop = function() { return !mobileMQ.matches; };
  // Setzt inert auf der gerade inaktiven Stage (nur Desktop). Mobile: alle inert weg.
  function applyStageInertness(panel, activeStage) {
    var s1 = panel.querySelector('.mega-stage--1');
    var s2 = panel.querySelector('.mega-stage--2');
    if (!s1 || !s2) return;
    if (!isDesktop()) {
      s1.removeAttribute('inert');
      s2.removeAttribute('inert');
      return;
    }
    s1.toggleAttribute('inert', activeStage === 'stage2');
    s2.toggleAttribute('inert', activeStage !== 'stage2');
  }

  var triggers = Array.prototype.slice.call(document.querySelectorAll('.nav-item--mega .nav-trigger'));
  var panels = {};
  triggers.forEach(function(t) {
    var id = t.getAttribute('aria-controls');
    var panel = document.getElementById(id);
    if (panel) panels[id] = { trigger: t, panel: panel };
  });

  var state = { openId: null, lastFocusedTrigger: null };
  var timers = { open: null, close: null };

  function clearTimers() {
    if (timers.open) { clearTimeout(timers.open); timers.open = null; }
    if (timers.close) { clearTimeout(timers.close); timers.close = null; }
  }

  function openPanel(id) {
    if (state.openId === id) return;
    if (state.openId) closePanel(state.openId, false);
    var entry = panels[id];
    if (!entry) return;
    entry.panel.hidden = false;
    // Force reflow to enable transition
    void entry.panel.offsetWidth;
    entry.panel.setAttribute('data-open', 'true');
    entry.trigger.setAttribute('aria-expanded', 'true');
    state.openId = id;
  }

  function closePanel(id, restoreFocus) {
    var entry = panels[id];
    if (!entry) return;
    entry.panel.removeAttribute('data-open');
    entry.trigger.setAttribute('aria-expanded', 'false');
    // Reset stage view to stage1 on close (via Radio statt data-view-Attribut)
    var resetRadio = entry.panel.querySelector('#wb-stage-1');
    if (resetRadio) resetRadio.checked = true;
    applyStageInertness(entry.panel, 'stage1');
    var wwBtn = entry.panel.querySelector('.mega-wissenswelten-card');
    if (wwBtn) wwBtn.setAttribute('aria-expanded', 'false');
    // Hide after transition for SR (keep DOM for crawlers).
    // 360ms covers both desktop (200ms opacity/transform) and mobile (350ms max-height).
    setTimeout(function() {
      if (!entry.panel.hasAttribute('data-open')) entry.panel.hidden = true;
    }, 360);
    if (state.openId === id) state.openId = null;
    if (restoreFocus && state.lastFocusedTrigger) {
      state.lastFocusedTrigger.focus();
    }
  }

  function closeAll(restoreFocus) {
    Object.keys(panels).forEach(function(id) {
      if (panels[id].panel.hasAttribute('data-open')) closePanel(id, restoreFocus);
    });
  }

  // Initial inert-State setzen (Desktop: stage2 inert; Mobile: nichts inert).
  // Bei Resize zwischen Desktop/Mobile neu evaluieren.
  function syncAllStagesInertness() {
    Object.keys(panels).forEach(function(id) {
      var radio2 = panels[id].panel.querySelector('#wb-stage-2');
      var active = (radio2 && radio2.checked) ? 'stage2' : 'stage1';
      applyStageInertness(panels[id].panel, active);
    });
  }
  syncAllStagesInertness();
  window.addEventListener('resize', syncAllStagesInertness, { passive: true });

  // Hover handlers (skipped on touch AND auf Mobile-Drawer-Viewport <=900px)
  if (!isTouch) {
    triggers.forEach(function(t) {
      var id = t.getAttribute('aria-controls');
      var li = t.closest('.nav-item');
      var panel = panels[id].panel;

      li.addEventListener('mouseenter', function() {
        if (!hoverAllowed()) return;
        clearTimers();
        timers.open = setTimeout(function() { openPanel(id); }, OPEN_DELAY);
      });
      li.addEventListener('mouseleave', function() {
        if (!hoverAllowed()) return;
        if (timers.open) { clearTimeout(timers.open); timers.open = null; }
        timers.close = setTimeout(function() { closePanel(id, false); }, CLOSE_DELAY);
      });
      panel.addEventListener('mouseenter', function() {
        if (!hoverAllowed()) return;
        if (timers.close) { clearTimeout(timers.close); timers.close = null; }
      });
      panel.addEventListener('mouseleave', function() {
        if (!hoverAllowed()) return;
        timers.close = setTimeout(function() { closePanel(id, false); }, CLOSE_DELAY);
      });
    });
  }

  // Click toggle (works for hover+click and touch-only)
  triggers.forEach(function(t) {
    var id = t.getAttribute('aria-controls');
    t.addEventListener('click', function(e) {
      // CMS-Abweichung (2026-06-15): Die Menü-Wörter sind jetzt echte Links (<a href>,
      // Ziel konfigurierbar über Einstellungen → Header). Auf hover-fähigem Desktop öffnet
      // das Mega-Menü bereits beim Hovern → ein Klick navigiert zur Bereichsseite (native
      // <a>-Navigation zulassen). Auf Touch/Mobile-Drawer (kein Hover) bleibt der Klick der
      // Menü-Öffner (toggle), sonst wären die Untermenüs dort unerreichbar.
      var href = t.getAttribute('href');
      if (hoverAllowed() && href && href !== '#' && href !== '') {
        clearTimers();
        return; // native Navigation zur konfigurierten Zielseite
      }
      e.preventDefault();
      e.stopPropagation();
      clearTimers();
      state.lastFocusedTrigger = t;
      if (state.openId === id) {
        closePanel(id, true);
      } else {
        openPanel(id);
      }
    });
    // Keyboard: ArrowDown opens + focuses first link
    t.addEventListener('keydown', function(e) {
      if (e.key === 'ArrowDown') {
        e.preventDefault();
        state.lastFocusedTrigger = t;
        openPanel(id);
        setTimeout(function() {
          var firstLink = panels[id].panel.querySelector('a, button');
          if (firstLink) firstLink.focus();
        }, 30);
      }
    });
  });

  // Stage-switch handlers (Wissenswelten forward + back)
  // Stage-Sichtbarkeit läuft CSS-only via .mega-panel:has(#wb-stage-N:checked) Selektoren.
  // JS toggelt das Radio + die inactive Stage bekommt `inert` (a11y-hidden + non-focusable).
  document.querySelectorAll('[data-stage-target]').forEach(function(btn) {
    btn.addEventListener('click', function(e) {
      e.preventDefault();
      var target = btn.getAttribute('data-stage-target');
      var panel = btn.closest('.mega-panel');
      if (!panel) return;
      var radio = panel.querySelector(target === 'stage2' ? '#wb-stage-2' : '#wb-stage-1');
      if (radio) radio.checked = true;
      applyStageInertness(panel, target);
      var wwBtn = panel.querySelector('.mega-wissenswelten-card');
      if (wwBtn) wwBtn.setAttribute('aria-expanded', target === 'stage2' ? 'true' : 'false');
      // Focus management
      setTimeout(function() {
        if (target === 'stage2') {
          var firstTile = panel.querySelector('.mega-stage--2 .mega-thema-tile');
          if (firstTile) firstTile.focus();
        } else if (target === 'stage1') {
          if (wwBtn) wwBtn.focus();
        }
      }, 30);
    });
  });

  // Outside click
  document.addEventListener('click', function(e) {
    if (!state.openId) return;
    var wrapper = document.querySelector('.nav-fixed-wrapper');
    if (wrapper && !wrapper.contains(e.target)) {
      closeAll(false);
    }
  });

  // Escape
  document.addEventListener('keydown', function(e) {
    if (e.key === 'Escape' && state.openId) {
      closeAll(true);
    }
  });

  // Close on link click inside panel
  Object.keys(panels).forEach(function(id) {
    panels[id].panel.addEventListener('click', function(e) {
      var link = e.target.closest('a[href]');
      if (link) closePanel(id, false);
    });
  });

  // ─── Mobile Mode: Burger toggles .nav-center as drawer ───
  // Drawer-Sichtbarkeit, Backdrop und Body-Scroll-Lock laufen CSS-only via
  // :has(.burger-checkbox:checked). JS toggelt nur .checked am hidden Checkbox-State-Carrier
  // und übernimmt Focus-Management, ESC, Auto-Close (Link/Resize), Scrollbar-Padding-Komp.
  var burger = document.getElementById('navBurger');
  var burgerCheckbox = document.getElementById('burgerToggle');
  var navCenter = document.querySelector('.nav-center');
  var wrapper = document.querySelector('.nav-fixed-wrapper');
  if (burger && burgerCheckbox && navCenter && wrapper) {
    var lastFocusBeforeMobile = null;

    function isMobileOpen() { return burgerCheckbox.checked; }

    function openMobileNav() {
      lastFocusBeforeMobile = document.activeElement;
      burgerCheckbox.checked = true;
      burger.setAttribute('aria-expanded', 'true');
      burger.setAttribute('aria-label', 'Menü schließen');
      // Dismiss any open tooltip (burger aria-label tooltip stays otherwise)
      var tooltipEl = document.getElementById('ifmera-tooltip-singleton');
      if (tooltipEl) {
        tooltipEl.classList.remove('is-visible', 'is-touch-active', 'is-interactive');
        tooltipEl.setAttribute('aria-hidden', 'true');
      }
      // Scrollbar-Padding-Komp: CSS macht overflow:hidden, JS gleicht Scrollbar-Breite aus
      var scrollbarComp = window.innerWidth - document.documentElement.clientWidth;
      if (scrollbarComp > 0) document.documentElement.style.paddingRight = scrollbarComp + 'px';
    }

    function closeMobileNav() {
      burgerCheckbox.checked = false;
      burger.setAttribute('aria-expanded', 'false');
      burger.setAttribute('aria-label', 'Menü öffnen');
      document.documentElement.style.paddingRight = '';
      // Also collapse any open mega panels when leaving mobile drawer
      closeAll(false);
      if (lastFocusBeforeMobile) lastFocusBeforeMobile.focus();
    }

    burger.addEventListener('click', function() {
      if (isMobileOpen()) closeMobileNav(); else openMobileNav();
    });

    // Close button inside drawer
    var navCloseBtn = document.getElementById('navClose');
    if (navCloseBtn) {
      navCloseBtn.addEventListener('click', closeMobileNav);
    }

    // Backdrop click closes drawer (backdrop is wrapper::after pseudo;
    // clicks on it bubble with the wrapper itself as event.target).
    wrapper.addEventListener('click', function(e) {
      if (!isMobileOpen()) return;
      if (e.target === wrapper) closeMobileNav();
    });

    // Close on link click inside nav-center (mobile only — desktop uses panel link handler)
    navCenter.addEventListener('click', function(e) {
      if (!isMobileOpen()) return;
      var link = e.target.closest('a[href]');
      if (link) closeMobileNav();
    });

    // Escape closes mobile drawer (panel-Escape stays handled by mega controller above)
    document.addEventListener('keydown', function(e) {
      if (e.key === 'Escape' && isMobileOpen() && !state.openId) {
        closeMobileNav();
      }
    });

    // Auto-close drawer when resizing to 800px or wider (CSS drawer breakpoint = <800)
    window.addEventListener('resize', function() {
      if (window.innerWidth >= 800 && isMobileOpen()) closeMobileNav();
    }, { passive: true });
  }
})();

;/* ===== JS Block 3 (orig. Zeilen 10177-10189) ===== */
// Folgekurse: Show-More-Toggle. Sichtbarkeits-Logik (Mobile 2, Desktop 4) und Stagger-Animation
// laufen CSS-only via :nth-child + .is-expanded. JS triggert nur den Klassen-Wechsel.
(function() {
  var grid = document.getElementById('folgekurseGrid');
  var btn = document.getElementById('folgekurseMoreBtn');
  if (!grid || !btn) return;
  btn.addEventListener('click', function() {
    grid.classList.add('is-expanded');
    btn.setAttribute('aria-expanded', 'true');
  });
})();

;/* ===== JS Block 4 (orig. Zeilen 10546-10600) ===== */
/* FAQ-Notch-Sync: Chromium re-evaluiert keine Styles für <summary>-Kinder
   nach <details>-Toggle (Klassen-Toggle propagiert nicht). Workaround:
   Notch-Element bei jedem Toggle neu erstellen — der initiale Render
   eines frischen Elements ist nicht vom Bug betroffen, der Endzustand
   ist sofort korrekt. Da aber neu erstellte Elemente keine CSS-Transition
   von einem "vorherigen" Zustand haben, animieren wir die Dot-Rotation
   per Web Animations API (läuft unabhängig vom Style-Cascade).
   FAQ-Scroll-Anchor: Native <details name="..."> Exklusiv-Accordion macht
   kein Scroll-Anchoring — schließt ein offenes Item ÜBER dem geklickten,
   springt der Inhalt um dessen Höhe nach oben. Wir messen die Position des
   geklickten Items vor und nach dem Toggle und gleichen die Differenz per
   scrollBy aus. */
document.querySelectorAll('.faq-item').forEach(function(d) {
  d.addEventListener('toggle', function() {
    var old = d.querySelector('.notch');
    if (old) old.remove();
    var n = document.createElement('div');
    n.className = 'notch' + (d.open ? ' is-active' : '');
    n.setAttribute('aria-hidden', 'true');
    n.innerHTML = '<div class="dot"><svg viewBox="0 0 262 262"><use href="#icon-logo-form-dot"/></svg></div>';
    d.querySelector('summary').appendChild(n);
    // Dot-Rotation animieren: von Start- zum Zielzustand. Element ist bereits
    // im Zielzustand, die Animation visualisiert nur den Übergang.
    var svg = n.querySelector('.dot svg');
    if (svg && !matchMedia('(prefers-reduced-motion: reduce)').matches) {
      svg.animate(
        [
          { transform: d.open ? 'rotate(0deg)' : 'rotate(45deg)' },
          { transform: d.open ? 'rotate(45deg)' : 'rotate(0deg)' }
        ],
        { duration: 350, easing: 'ease' }
      );
    }
  });
  d.querySelector('summary').addEventListener('click', function() {
    var topBefore = d.getBoundingClientRect().top;
    requestAnimationFrame(function() {
      var delta = d.getBoundingClientRect().top - topBefore;
      if (delta) window.scrollBy({ top: delta, behavior: 'instant' });
    });
  });
});

/* Auf Smartphone (≤414px) alle FAQ initial eingeklappt starten.
   Das `open`-Attribut (Default auf FAQ 1) lässt sich nicht per CSS entfernen,
   daher viewport-abhängiges Schließen beim Laden. `d.open = false` feuert den
   `toggle`-Listener oben → die Notch wird automatisch auf „inaktiv" gesetzt.
   Nur Initial-State (Wunsch: „am Anfang eingeklappt"); Desktop bleibt offen. */
if (matchMedia('(max-width: 414px)').matches) {
  document.querySelectorAll('.faq-item[open]').forEach(function(d) {
    d.open = false;
  });
}

;/* ===== JS Block 5 (orig. Zeilen 10632-10726) ===== */
/* CMS-Abweichung (2026-06-14): datengetriebene Suche-Sektion(en).
   Die Testseiten-Variante war an feste IDs (#sucheInput/#sucheKeywords/#sucheForm) +
   JS-erzeugte Tags + Redirect auf /kurse gebunden \u2014 auf CMS-Markup inert. Diese Version
   aktiviert sich am CMS-Markup der zerlegten Suche-Sektion (Blocks\SearchField .suche-input-wrap +
   Blocks\SearchTags .suche-keywords) und enhanced als PROGRESSIVE ENHANCEMENT:
   \u2022 Tag-Klick (.suche-keywords button.filter-button) \u2014 KEINE crawlbaren Links mehr (SEO,
     2026-06-27): die Tags sind <button data-suche-href="\u2026?q=Tag">. Bei data-suche-fill="1"
     f\u00fcllt der Klick das Suchfeld (wie Demo), sonst navigiert er per JS zu data-suche-href.
   \u2022 Animierter Schreibmaschinen-Platzhalter \u2014 nur bei .form-field-input[data-suche-animate];
     Phrasen aus data-suche-ph (\u201ea|b|c") ODER abgeleitet aus den Tags der Sektion (\u201ez.B. <Tag> \u2026").
   \u2022 Ohne JS passiert beim Tag-Klick NICHTS (kein <a>) \u2014 bewusst, weil diese Tags nie
     indexiert/gefolgt werden sollen; das Suchfeld selbst sendet weiter nativ per GET.
     Mehrere Sektionen werden unterst\u00fctzt.
   Bei einem erneuten 1:1-Asset-Sync aus test\design diese Abweichung erhalten! */
(function() {
  function animatePlaceholder(input, phrases) {
    if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
    var i = 0, c = 0, del = false, timer = null;
    function tick() {
      if (input.value !== '') { timer = setTimeout(tick, 600); return; }
      var cur = phrases[i] || '';
      if (!del) {
        c++;
        if (c > cur.length) { del = true; timer = setTimeout(tick, 2000); return; }
      } else {
        c--;
        if (c < 0) { del = false; i = (i + 1) % phrases.length; c = 0; timer = setTimeout(tick, 400); return; }
      }
      input.setAttribute('placeholder', cur.substring(0, c));
      timer = setTimeout(tick, del ? 40 : 80);
    }
    timer = setTimeout(tick, 1200);
    input.addEventListener('focus', function() { clearTimeout(timer); });
    input.addEventListener('blur', function() {
      if (input.value === '') { i = 0; c = 0; del = false; timer = setTimeout(tick, 800); }
    });
  }

  // Tag-Wolke: Klick f\u00fcllt das Suchfeld (data-suche-fill) ODER navigiert per JS
  // zu data-suche-href. Idempotent; l\u00e4uft auch ohne Suchfeld in der Sektion.
  function initTagCloud(cloud) {
    if (cloud.getAttribute('data-suche-tags-init') === '1') return;
    cloud.setAttribute('data-suche-tags-init', '1');
    var fill  = cloud.getAttribute('data-suche-fill') === '1';
    var scope = cloud.closest('section') || cloud.closest('.suche-inner') || document;
    var input = fill ? scope.querySelector('.suche-input-wrap .form-field-input') : null;
    cloud.querySelectorAll('button.filter-button, a.filter-button').forEach(function(el) {
      el.addEventListener('click', function(e) {
        e.preventDefault();
        if (fill && input) {
          input.value = el.textContent.trim();
          input.focus();
          input.dispatchEvent(new Event('input'));
          return;
        }
        var href = el.getAttribute('data-suche-href') || el.getAttribute('href');
        if (href) window.location.href = href;
      });
    });
  }

  function initSuche(field) {
    var input = field.querySelector('.form-field-input');
    if (!input) return;
    var scope = field.closest('section') || field.closest('.suche-inner') || document;
    var cloud = scope.querySelector('.suche-keywords');
    if (cloud) initTagCloud(cloud);

    // Animierter Schreibmaschinen-Platzhalter.
    if (input.getAttribute('data-suche-animate') === '1') {
      var phrases = [];
      var raw = input.getAttribute('data-suche-ph');
      if (raw) phrases = raw.split('|').map(function(s) { return s.trim(); }).filter(Boolean);
      if (!phrases.length && cloud) {
        phrases = Array.prototype.map.call(cloud.querySelectorAll('a.filter-button, button.filter-button'), function(el) {
          return 'z.B. ' + el.textContent.trim() + ' \u2026';
        });
      }
      if (!phrases.length) {
        var ph = input.getAttribute('placeholder');
        if (ph) phrases = [ph];
      }
      if (phrases.length) animatePlaceholder(input, phrases);
    }
  }

  function run() {
    document.querySelectorAll('.suche-input-wrap').forEach(initSuche);
    // Tag-Wolken auch ohne eigenes Suchfeld in der Sektion verdrahten (Navigation).
    document.querySelectorAll('.suche-keywords').forEach(initTagCloud);
  }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', run);
  else run();
})();

;/* ===== JS Block 6 (orig. Zeilen 10995-11366) ===== */
/* ─────────────────────────────────────────────────────────────────────
   initCarousel(config) — wiederverwendbares Karussell (Single-Source).
   Genutzt von #empfehlungen (1 sichtbar) und #team (3 sichtbar / 1 mobil).

   Features:
   • perViewDesktop / perViewMobile — Anzahl gleichzeitig sichtbarer Slides
     pro Breakpoint; Navigation immer Advance-by-1 (es wird je Swipe/Klick
     nur EINE Karte ausgetauscht).
   • Infinite-Loop via Klone: perView Klone je Seite, Offset = perView.
   • "engaged" nur wenn total > perView des aktiven Breakpoints
     (z.B. Team Desktop erst ab >3 Karten; mobil ab >1). Sonst statisch,
     ohne Dots/Drag/Autoplay.
   • Rebuild beim Breakpoint-Wechsel (perView ändert sich → Klonzahl/Offset
     neu); current bleibt erhalten.
   • Drag (Maus) + Touch-Swipe, generierte Dots, Autoplay mit Hover-Pause
     (Autoplay respektiert prefers-reduced-motion).
   • A11y: Klone sind immer aria-hidden + tabindex=-1; optional werden
     inaktive Real-Slides aus dem A11y-Baum genommen (hideInactiveFromA11y).

   Position rein über CSS-Variable --slide-index (cqw-basiert im CSS der
   Instanz) → kein offsetWidth-Read, kein Reflow. JS setzt nur den Index;
   die Transform-Formel (Slide-Breite/Zentrierung) liegt im Instanz-CSS.

   config = {
     root, track, dots               // Selector-String oder Element/Id
     slideSelector,                  // z.B. '.team-slide'
     perViewDesktop, perViewMobile,  // Default 1
     mobileQuery,                    // matchMedia-String (Breakpoint-Wechsel)
     autoplay,                       // ms (0 = aus)
     swipeThreshold,                 // px (Default 50)
     hideInactiveFromA11y,           // Bool (Default false)
     dotClass,                       // Default 'carousel-dot'
     dotLabel                        // i => aria-label-String
   }
   ───────────────────────────────────────────────────────────────────── */
window.initCarousel = function(cfg) {
  var track = typeof cfg.track === 'string' ? document.getElementById(cfg.track) : cfg.track;
  if (!track) return;
  var root = typeof cfg.root === 'string' ? document.querySelector(cfg.root) : (cfg.root || track.parentElement);
  // Viewport (= direkter Track-Parent / nächste .carousel-viewport): Hover hier
  // pausiert das Autoplay — NICHT die ganze Sektion (root).
  var viewport = track.closest('.carousel-viewport') || track.parentElement;
  var dotsWrap = typeof cfg.dots === 'string' ? document.getElementById(cfg.dots) : cfg.dots;
  var slideSelector = cfg.slideSelector || '.carousel-slide';
  var perViewDesktop = cfg.perViewDesktop || 1;
  var perViewMobile = cfg.perViewMobile || 1;
  var mobileMQ = cfg.mobileQuery ? matchMedia(cfg.mobileQuery) : null;
  var autoplayMs = cfg.autoplay || 0;
  var swipeThreshold = cfg.swipeThreshold || 50;
  var hideInactiveFromA11y = !!cfg.hideInactiveFromA11y;
  var dotClass = cfg.dotClass || 'carousel-dot';
  var dotLabel = cfg.dotLabel || function(i) { return 'Element ' + (i + 1) + ' anzeigen'; };
  var reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;

  // Optionale Layout-Konfiguration als CSS-Variable: gap (Lücke zwischen Slides bei
  // Multi-per-View). Wird auf root gesetzt → vom Instanz-CSS via var(--carousel-gap)
  // gelesen (z.B. Team-Row-Breite). Empfehlungen ignoriert das (1 sichtbar, kein gap).
  if (cfg.gap && root) root.style.setProperty('--carousel-gap', cfg.gap);

  // Externe Navigations-Buttons (optional): vorhandene Buttons mit data-slide="N",
  // die das Karussell von außen bedienen (z.B. Logo-/Stimmen-Buttons bei #bewertungen).
  // Klick → goTo(N); ihr .active wird mit der aktiven Slide synchronisiert. Buttons,
  // deren data-slide außerhalb des aktuellen Index liegt, bleiben einfach inaktiv.
  var navSelectors = cfg.navGroups ? (Array.isArray(cfg.navGroups) ? cfg.navGroups : [cfg.navGroups]) : [];
  var navScrollIntoView = !!cfg.navScrollIntoView;
  var navButtons = [];

  // Autoplay-Fortschritt im aktiven Dot: CSS-Animation läuft über --carousel-autoplay;
  // .carousel-has-autoplay schaltet die Füllung scharf (sonst statisch volle Pille).
  var hasAutoFill = autoplayMs && !reduceMotion;
  if (hasAutoFill && root) {
    root.classList.add('carousel-has-autoplay');
    root.style.setProperty('--carousel-autoplay', autoplayMs + 'ms');
  }

  var origSlides = Array.from(track.querySelectorAll(slideSelector));
  var totalReal = origSlides.length;
  if (!totalReal) return;

  var current = 0;
  var perView = 1;
  var offset = 0;          // = Anzahl Front-Klone, Track-Pos von Real-Slide 0
  var engaged = false;
  var total = totalReal;
  var allSlides = origSlides.slice();
  var dots = [];
  var isTransitioning = false;
  // Autoplay-Timer-State (selbst-planender Timeout statt setInterval → echtes Pause/Resume)
  var autoTimer = null;       // aktueller setTimeout-Handle
  var cycleStart = 0;         // performance.now() beim Start des laufenden Zyklus
  var cycleRemaining = 0;     // verbleibende ms (beim Pausieren gemerkt)
  var autoPaused = false;     // true = per Viewport-Hover eingefroren
  var pointerInside = false;  // Zeiger aktuell im Viewport?

  function activePerView() {
    return (mobileMQ && mobileMQ.matches) ? perViewMobile : perViewDesktop;
  }
  function wrap(i) { return ((i % total) + total) % total; }

  function buildDots(count) {
    if (!dotsWrap) return;
    dotsWrap.innerHTML = '';
    dots = [];
    if (!count) { dotsWrap.hidden = true; return; }
    dotsWrap.hidden = false;
    for (var i = 0; i < count; i++) {
      var b = document.createElement('button');
      b.type = 'button';
      b.className = dotClass;
      b.setAttribute('data-slide', i);
      b.setAttribute('aria-label', dotLabel(i));
      // Track + Fill für die aktive Pillen-Fortschrittsanzeige
      b.innerHTML = '<span class="carousel-dot-track"><span class="carousel-dot-fill"></span></span>';
      (function(idx) {
        b.addEventListener('click', function() { stopAuto(); goTo(idx); startAuto(); });
      })(i);
      dotsWrap.appendChild(b);
      dots.push(b);
    }
  }

  function setPosition(trackIndex, animate) {
    if (animate) { track.classList.add('is-animating'); }
    else { track.classList.remove('is-animating'); }
    track.style.setProperty('--slide-index', trackIndex);
  }

  function updateClasses(skipTransition) {
    if (skipTransition) { allSlides.forEach(function(s) { s.style.transition = 'none'; }); }
    // Visuelles "is-active"-Fenster: Slides nach Track-Position (Klone an den
    // Wrap-Kanten sehen optisch korrekt aus). Bei nicht-engaged: erste perView.
    var startPos = current + offset;
    allSlides.forEach(function(s, i) {
      var inView = engaged ? (i >= startPos && i < startPos + perView) : (i < perView);
      s.classList.toggle('is-active', inView);
    });
    // A11y nur auf Real-Slides (Klone sind dauerhaft aria-hidden, s. build()):
    // logisches Fenster current..current+perView-1.
    if (hideInactiveFromA11y) {
      var visible = {};
      for (var k = 0; k < perView; k++) visible[wrap(current + k)] = 1;
      origSlides.forEach(function(s, idx) {
        var on = !engaged || visible[idx];
        if (on) { s.removeAttribute('aria-hidden'); } else { s.setAttribute('aria-hidden', 'true'); }
        s.querySelectorAll('a, button, [tabindex]').forEach(function(el) {
          if (on) { el.removeAttribute('tabindex'); } else { el.setAttribute('tabindex', '-1'); }
        });
      });
    }
    dots.forEach(function(d, i) {
      var on = i === wrap(current);
      d.classList.toggle('active', on);
      if (on) { d.setAttribute('aria-current', 'true'); } else { d.removeAttribute('aria-current'); }
    });
    // Externe Nav-Buttons (Logos/Stimmen) mit der aktiven Slide syncen
    navButtons.forEach(function(b) { b.classList.toggle('active', parseInt(b.dataset.slide, 10) === wrap(current)); });
    if (skipTransition) {
      track.offsetHeight; // Reflow erzwingen, dann Transitions wiederherstellen
      allSlides.forEach(function(s) { s.style.transition = ''; });
    }
  }

  function goTo(idx, animate) {
    if (!engaged || isTransitioning) return;
    current = idx;
    updateClasses();
    if (animate !== false) { isTransitioning = true; }
    setPosition(current + offset, animate !== false);
  }

  // Nach der Transition nahtlos zurückspringen, wenn auf einem Klon gelandet.
  track.addEventListener('transitionend', function(e) {
    if (e.target !== track) return;
    isTransitioning = false;
    if (current >= total) { current -= total; setPosition(current + offset, false); updateClasses(true); }
    else if (current < 0) { current += total; setPosition(current + offset, false); updateClasses(true); }
  });

  function next() { goTo(current + 1); }

  function autoplayActive() { return autoplayMs && engaged && !reduceMotion; }

  // Dot-Füllung des aktiven Dots von 0 neu starten (Reflow-Restart der CSS-Animation),
  // damit sie bei einem FRISCHEN Zyklus mit dem Timer synchron läuft (nicht beim Resume).
  function restartActiveFill() {
    if (!hasAutoFill || !dotsWrap) return;
    var f = dotsWrap.querySelector('.carousel-dot.active .carousel-dot-fill');
    if (!f) return;
    f.style.animation = 'none';
    f.offsetHeight; // Reflow erzwingen
    f.style.animation = '';
  }

  // Selbst-planender Timeout: merkt Start-Zeit + Restzeit, damit Hover ECHT
  // pausieren/fortsetzen kann (statt setInterval, das nur neu startbar wäre).
  function scheduleNext(delay) {
    clearTimeout(autoTimer);
    cycleStart = performance.now();
    cycleRemaining = delay;
    autoTimer = setTimeout(function() { next(); scheduleNext(autoplayMs); }, delay);
  }
  function stopAuto() { clearTimeout(autoTimer); autoTimer = null; }

  // Frischer Voll-Zyklus (Init / nach Klick/Swipe/Drag). Liegt der Zeiger noch im
  // Viewport, sofort wieder einfrieren — Autoplay läuft nur außerhalb des Viewports.
  function startAuto() {
    if (!autoplayActive()) return;
    stopAuto();
    autoPaused = false;
    if (dotsWrap) dotsWrap.classList.remove('is-paused');
    restartActiveFill();
    if (pointerInside) { pauseAuto(); return; }
    scheduleNext(autoplayMs);
  }

  // Einfrieren (Viewport-Hover): Timer anhalten, Restzeit merken, Füllung pausieren.
  function pauseAuto() {
    if (!autoplayActive() || autoPaused) return;
    autoPaused = true;
    if (autoTimer) {
      clearTimeout(autoTimer); autoTimer = null;
      cycleRemaining = autoplayMs - (performance.now() - cycleStart);
      if (cycleRemaining < 0) cycleRemaining = 0;
    }
    if (dotsWrap) dotsWrap.classList.add('is-paused');
  }

  // Fortsetzen (Viewport verlassen): angefangenen Zyklus zu Ende laufen lassen —
  // KEIN Neustart, KEIN restartActiveFill (die Füllung läuft per CSS einfach weiter).
  function resumeAuto() {
    if (!autoPaused) return;
    autoPaused = false;
    if (dotsWrap) dotsWrap.classList.remove('is-paused');
    if (autoplayActive()) scheduleNext(cycleRemaining);
  }

  // Autoplay pausiert NUR, solange der Zeiger im Viewport ist.
  if (viewport) {
    viewport.addEventListener('mouseenter', function() { pointerInside = true; pauseAuto(); });
    viewport.addEventListener('mouseleave', function() { pointerInside = false; resumeAuto(); });
  }

  // Touch-Swipe
  var startX = 0, deltaX = 0;
  track.addEventListener('touchstart', function(e) { startX = e.touches[0].clientX; stopAuto(); }, { passive: true });
  track.addEventListener('touchmove', function(e) { deltaX = e.touches[0].clientX - startX; }, { passive: true });
  track.addEventListener('touchend', function() {
    if (Math.abs(deltaX) > swipeThreshold) goTo(current + (deltaX < 0 ? 1 : -1));
    deltaX = 0; startAuto();
  });

  // Maus-Drag
  var isDragging = false, dragStartX = 0, dragDelta = 0;
  track.addEventListener('mousedown', function(e) {
    if (!engaged) return;
    isDragging = true; dragStartX = e.clientX; dragDelta = 0; stopAuto(); e.preventDefault();
  });
  document.addEventListener('mousemove', function(e) { if (isDragging) dragDelta = e.clientX - dragStartX; });
  document.addEventListener('mouseup', function() {
    if (!isDragging) return;
    isDragging = false;
    if (Math.abs(dragDelta) > swipeThreshold) goTo(current + (dragDelta < 0 ? 1 : -1));
    dragDelta = 0; startAuto();
  });

  // (Re)Build: Klone/Offset/Dots passend zum aktiven perView aufbauen.
  function build() {
    stopAuto();
    track.querySelectorAll('.is-clone').forEach(function(c) { c.remove(); });
    perView = activePerView();
    total = totalReal;
    engaged = totalReal > perView;
    if (current > total - 1) current = total - 1;
    if (current < 0) current = 0;
    if (engaged) {
      offset = perView;
      var i, clone;
      // erste perView Slides als Klone ans Ende
      for (i = 0; i < perView; i++) {
        clone = origSlides[i].cloneNode(true);
        prepClone(clone);
        track.appendChild(clone);
      }
      // letzte perView Slides als Klone an den Anfang (in Originalreihenfolge)
      for (i = perView - 1; i >= 0; i--) {
        clone = origSlides[totalReal - perView + i].cloneNode(true);
        prepClone(clone);
        track.insertBefore(clone, track.firstChild);
      }
    } else {
      offset = 0;
      // Statisch (z.B. Team-Desktop mit ≤perView Karten): immer ab Position 0 zeigen.
      // Sonst bliebe ein `current` aus einer vorherigen engaged-Phase (Mobil-Swipe)
      // stehen und würde das statische Grid via --slide-index verschoben rendern
      // (nur n-1 Karten sichtbar nach Resize Mobil→Desktop).
      current = 0;
    }
    allSlides = Array.from(track.querySelectorAll(slideSelector));
    buildDots(engaged ? total : 0);
    setPosition(current + offset, false);
    updateClasses(true);
    startAuto();
  }
  function prepClone(clone) {
    clone.classList.add('is-clone');
    clone.setAttribute('aria-hidden', 'true');
    clone.querySelectorAll('a, button, [tabindex]').forEach(function(el) { el.setAttribute('tabindex', '-1'); });
  }

  // Rebuild nur wenn sich perView wirklich ändert (Breakpoint-Wechsel).
  var lastPerView = null;
  function maybeRebuild() {
    var pv = activePerView();
    if (pv !== lastPerView) { lastPerView = pv; build(); }
  }
  if (mobileMQ) {
    if (mobileMQ.addEventListener) mobileMQ.addEventListener('change', maybeRebuild);
    else mobileMQ.addListener(maybeRebuild);
  }

  // Externe Nav-Buttons verdrahten (vor build(), damit updateClasses sie kennt).
  if (navSelectors.length) {
    var navScope = root || document;
    navSelectors.forEach(function(sel) {
      Array.prototype.forEach.call(navScope.querySelectorAll(sel), function(btn) {
        if (navButtons.indexOf(btn) === -1) navButtons.push(btn);
        btn.addEventListener('click', function() {
          var idx = parseInt(btn.dataset.slide, 10);
          if (isNaN(idx)) return;
          stopAuto(); goTo(idx); startAuto();
          if (navScrollIntoView && viewport) viewport.scrollIntoView({ behavior: reduceMotion ? 'auto' : 'smooth', block: 'start' });
        });
      });
    });
  }

  lastPerView = activePerView();
  build();
};

// #bewertungen: Testimonial-Karussell (1 sichtbar, schlicht). Steht hier — nach der
// Factory-Definition —, weil die Sektion im DOM VOR der Factory liegt; ein Inline-Aufruf
// dort würde "initCarousel is not a function" werfen. Das #bewertungen-DOM ist hier längst
// geparst. Dots = Füll-Pillen; Logo-/Stimmen-Buttons bedienen es als externe Navigation.
window.initCarousel({
  root: '#bewertungen',
  track: 'bewertungTrack',
  slideSelector: '.bewertung-slide',
  dots: 'bewertungDots',
  perViewDesktop: 1,
  perViewMobile: 1,
  autoplay: 6000,
  hideInactiveFromA11y: true,
  navGroups: ['.bewertung-logo-btn', '.bewertung-voice'],
  navScrollIntoView: true,
  dotLabel: function(i) { return 'Bewertung ' + (i + 1) + ' anzeigen'; }
});

// #empfehlungen: 1 Karte zentriert (Peek/Scale via eigenem CSS).
window.initCarousel({
  root: '#empfehlungen',
  track: 'empfehlungenTrack',
  slideSelector: '.empfehlungen-slide',
  dots: 'empfehlungenDots',
  perViewDesktop: 1,
  perViewMobile: 1,
  autoplay: 2750,
  hideInactiveFromA11y: true,
  dotLabel: function(i) { return 'Empfehlung ' + (i + 1) + ' anzeigen'; }
});

;/* ===== JS Block 7 (orig. Zeilen 11411-11426) ===== */
// Team-Karussell aufsetzen: 3 sichtbar (Desktop), 1 sichtbar ≤1280px, Advance-by-1.
window.initCarousel({
  root: '#team',
  track: 'teamTrack',
  slideSelector: '.team-slide',
  dots: 'teamDots',
  perViewDesktop: 3,
  perViewMobile: 1,
  mobileQuery: '(max-width: 1279.98px)',
  autoplay: 3000,
  gap: '1.5rem',          // Lücke zwischen den 3 Karten (Desktop) — hier anpassen
  hideInactiveFromA11y: false,
  dotLabel: function(i) { return 'Teammitglied ' + (i + 1) + ' anzeigen'; }
});

;/* ===== JS Block 8 (orig. Zeilen 11428-11441) ===== */
// Team-Card: Video startet bei Hover (Frame 0), pausiert bei Leave (Reset zu Frame 0).
// prefers-reduced-motion deaktiviert den Effekt; play().catch() fängt iOS-Reject ab.
// Läuft NACH dem Karussell-Init, damit auch geklonte Karten (Infinite-Loop) Handler erhalten.
(function() {
  if (matchMedia('(prefers-reduced-motion: reduce)').matches) return;
  document.querySelectorAll('.team-card').forEach(function(card) {
    var v = card.querySelector('video');
    if (!v) return;
    card.addEventListener('pointerenter', function() { v.play().catch(function() {}); });
    card.addEventListener('pointerleave', function() { v.pause(); v.currentTime = 0; });
  });
})();

;/* ===== JS Block 9 (orig. Zeilen 11445-12388) ===== */
(function () {
  // Index-spezifisch: nur ausführen, wenn der Termine-Bereich vorhanden ist.
  // Macht main.js sicher auf Seiten OHNE #participants-slider (z.B. dem Checkout
  // weiterbildung-buchen.php): ohne diesen Guard würde slider.addEventListener
  // werfen und ALLE nachfolgenden Blöcke (Form-Fields, Privacy) nicht mehr laufen.
  if (!document.getElementById('participants-slider')) return;
  // ─── Termine: participants slider ───
  var currentBasePrice = 1400;
  var currentIsOnline = false;
  // CMS-Abweichung (2026-06-10, bei Asset-Sync erhalten!): Basispreis/Typ aus der initial
  // gewählten Termin-Karte statt der Testseiten-Konstante 1400 — auf CMS-Seminarseiten ist
  // der Preis dynamisch. Auf der Testseite ändert das nichts (selected-Karte = 1.400/Präsenz).
  var initCard = document.querySelector('.termin-card.selected') || document.querySelector('.termin-card');
  if (initCard && initCard.dataset && initCard.dataset.price) {
    var initPrice = parseFloat(initCard.dataset.price.replace(/\./g, '').replace(',', '.'));
    if (initPrice > 0) currentBasePrice = initPrice;
    currentIsOnline = initCard.dataset.type === 'online';
  }
  var slider = document.getElementById('participants-slider');
  var countEl = document.getElementById('participants-count');
  var discountEl = document.getElementById('participants-discount');
  var priceEl = document.getElementById('sidebar-price');
  var detailEl = document.getElementById('sidebar-price-detail');
  var origEl = document.getElementById('sidebar-price-orig');
  // CMS-Abweichung (2026-06-25, bei Asset-Sync erhalten!): data-price-lock/-price-hide (Blocks\Termine
  // priceMode=custom|hide) → PHP-Festpreis/Förder-Text NICHT durch die Teilnehmer-/Karten-Logik überschreiben.
  var _termSb = document.querySelector('.termine-sidebar');
  var priceLocked = !!(_termSb && (_termSb.dataset.priceLock || _termSb.dataset.priceHide));

  // Inklusivleistungen: „Getränke & Mittagessen" entfällt bei Live-Online-Terminen.
  // Single-Source `currentIsOnline` steuert die .is-online-Klasse, CSS blendet [data-presence-only] aus.
  var keynotesTeaserEl = document.querySelector('.termine-keynotes-teaser');
  function syncKeynotesInclusions() {
    if (keynotesTeaserEl) keynotesTeaserEl.classList.toggle('is-online', currentIsOnline);
  }
  syncKeynotesInclusions();

  function fmtPrice(n) {
    return n.toFixed(2).replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, '.');
  }

  function parsePrice(str) {
    return parseFloat(str.replace(/[^\d,]/g, '').replace('.', '').replace(',', '.')) || 0;
  }

  function calcDisplayPrice() {
    var count = parseInt(slider.value);
    var groupDiscount = count >= 3;
    var onlineDiscount = currentIsOnline;
    var factor = 1;
    if (onlineDiscount) factor -= 0.1;
    if (groupDiscount) factor -= 0.1;
    var unitPrice = currentBasePrice * factor;
    return count > 1 ? unitPrice * count : unitPrice;
  }

  function updateParticipantsWithoutPrice() {
    var count = parseInt(slider.value);
    countEl.textContent = count;
    var groupDiscount = count >= 3;
    var onlineDiscount = currentIsOnline;
    var hasDiscount = groupDiscount || onlineDiscount;
    discountEl.classList.toggle('active', hasDiscount);
    // Teal-Box nur bei AKTIVEM Rabatt (Online und/oder Gruppe ab 3) zeigen.
    discountEl.classList.toggle('hidden', !hasDiscount);

    var hintEl = document.getElementById('group-discount-hint');
    if (onlineDiscount && groupDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Online-Rabatt</strong> +<br><strong>10% Gruppenrabatt</strong>!';
    } else if (onlineDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Online-Rabatt</strong>!';
    } else if (groupDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Gruppenrabatt</strong>!';
    }
    // Gruppenrabatt-Teaser direkt unter dem Schieberegler — Präsenz UND Online,
    // solange der Gruppenrabatt (ab 3 Teilnehmer:innen) noch nicht greift.
    hintEl.classList.toggle('hidden', groupDiscount);

    var discountFactor = 1;
    if (onlineDiscount) discountFactor -= 0.1;
    if (groupDiscount) discountFactor -= 0.1;

    if (priceLocked) return;
    var unitPrice = currentBasePrice * discountFactor;
    var total = unitPrice * count;
    var savings = currentBasePrice * count - total;

    // Durchgestrichener Originalpreis über dem Gesamtpreis (nur bei Rabatt).
    if (origEl) origEl.innerHTML = hasDiscount ? '&euro; ' + fmtPrice(currentBasePrice * count) : '';

    if (count > 1) {
      if (hasDiscount) {
        detailEl.innerHTML = count + ' &times; &euro; ' + fmtPrice(unitPrice) + ' <span class="sidebar-price-saved">&ndash; Sie sparen &euro; ' + fmtPrice(savings) + '</span>';
      } else {
        detailEl.innerHTML = count + ' &times; &euro; ' + fmtPrice(unitPrice);
      }
    } else {
      if (hasDiscount) {
        detailEl.innerHTML = '<span class="sidebar-price-saved">Sie sparen &euro; ' + fmtPrice(savings) + '</span>';
      } else {
        detailEl.innerHTML = '';
      }
    }
  }

  var _priceAnimTimer = 0;
  function animatePrice(from, to, duration) {
    clearInterval(_priceAnimTimer);
    if (priceLocked) return;
    if (Math.abs(from - to) < 0.01) {
      priceEl.innerHTML = '&euro; ' + fmtPrice(to);
      return;
    }
    var start = Date.now();
    _priceAnimTimer = setInterval(function() {
      var elapsed = Date.now() - start;
      var progress = Math.min(elapsed / duration, 1);
      var eased = 1 - Math.pow(1 - progress, 3);
      var current = from + (to - from) * eased;
      priceEl.innerHTML = '&euro; ' + fmtPrice(current);
      if (progress >= 1) {
        clearInterval(_priceAnimTimer);
        priceEl.innerHTML = '&euro; ' + fmtPrice(to);
      }
    }, 16);
  }

  function updateParticipants() {
    var count = parseInt(slider.value);
    countEl.textContent = count;
    var groupDiscount = count >= 3;
    var onlineDiscount = currentIsOnline;
    var hasDiscount = groupDiscount || onlineDiscount;
    discountEl.classList.toggle('active', hasDiscount);
    // Teal-Box nur bei AKTIVEM Rabatt (Online und/oder Gruppe ab 3) zeigen.
    discountEl.classList.toggle('hidden', !hasDiscount);

    var hintEl = document.getElementById('group-discount-hint');
    if (onlineDiscount && groupDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Online-Rabatt</strong> +<br><strong>10% Gruppenrabatt</strong>!';
    } else if (onlineDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Online-Rabatt</strong>!';
    } else if (groupDiscount) {
      discountEl.querySelector('span').innerHTML = '<strong>10% Gruppenrabatt</strong>!';
    }
    // Gruppenrabatt-Teaser direkt unter dem Schieberegler — Präsenz UND Online,
    // solange der Gruppenrabatt (ab 3 Teilnehmer:innen) noch nicht greift.
    hintEl.classList.toggle('hidden', groupDiscount);

    var discountFactor = 1;
    if (onlineDiscount) discountFactor -= 0.1;
    if (groupDiscount) discountFactor -= 0.1;

    if (priceLocked) return;
    var unitPrice = currentBasePrice * discountFactor;
    var total = unitPrice * count;
    var savings = currentBasePrice * count - total;

    // Durchgestrichener Originalpreis über dem Gesamtpreis (nur bei Rabatt).
    if (origEl) origEl.innerHTML = hasDiscount ? '&euro; ' + fmtPrice(currentBasePrice * count) : '';

    if (count > 1) {
      priceEl.innerHTML = '&euro; ' + fmtPrice(total);
      if (hasDiscount) {
        detailEl.innerHTML = count + ' &times; &euro; ' + fmtPrice(unitPrice) + ' <span class="sidebar-price-saved">&ndash; Sie sparen &euro; ' + fmtPrice(savings) + '</span>';
      } else {
        detailEl.innerHTML = count + ' &times; &euro; ' + fmtPrice(unitPrice);
      }
    } else {
      priceEl.innerHTML = '&euro; ' + fmtPrice(unitPrice);
      if (hasDiscount) {
        detailEl.innerHTML = '<span class="sidebar-price-saved">Sie sparen &euro; ' + fmtPrice(savings) + '</span>';
      } else {
        detailEl.innerHTML = '';
      }
    }
  }

  slider.addEventListener('input', updateParticipants);
  updateParticipants();

  // ─── Termine: card selection & sidebar update (animated) ───
  var _sbAnimId = 0;

  document.querySelectorAll('.termin-card').forEach(card => {
    card.addEventListener('click', () => {
      if (card.classList.contains('selected')) return;

      var prevType = document.getElementById('sidebar-type').textContent;
      var prevDate = document.getElementById('sidebar-date').textContent;
      var prevLocation = document.getElementById('sidebar-location').textContent;
      var prevPrice = currentBasePrice;

      var isOnline = card.dataset.type === 'online';
      var newType = isOnline ? 'Live Online' : 'Präsenz';
      var newDate = card.dataset.date;
      var newLocation = isOnline ? 'Videokonferenz' : card.dataset.locationLabel;
      var newPrice = parseFloat(card.dataset.price.replace('.', '').replace(',', '.'));

      // CMS-Abweichung (2026-06-10, bei Asset-Sync erhalten!): Dauer + Uhrzeit sind pro Termin
      // verschieden → wie Typ/Datum/Ort animiert aktualisieren. Nur CMS-Karten tragen data-duration/
      // data-time; Original-Testseiten-Karten haben sie NICHT → newX = prevX → kein Change, kein Target.
      var durEl = document.getElementById('sidebar-duration');
      var timeEl = document.getElementById('sidebar-time');
      var prevDuration = durEl ? durEl.textContent : '';
      var prevTime = timeEl ? timeEl.textContent : '';
      var newDuration = (card.dataset.duration !== undefined) ? card.dataset.duration : prevDuration;
      var newTime = (card.dataset.time !== undefined) ? card.dataset.time : prevTime;

      var typeChanged = (newType !== prevType);
      var dateChanged = (newDate !== prevDate);
      var locationChanged = (newLocation !== prevLocation);
      var priceChanged = (newPrice !== prevPrice);
      var durationChanged = durEl && (newDuration !== prevDuration);
      var timeChanged = timeEl && (newTime !== prevTime);
      var anythingChanged = typeChanged || dateChanged || locationChanged || priceChanged || durationChanged || timeChanged;

      document.querySelectorAll('.termin-card').forEach(c => c.classList.remove('selected'));
      card.classList.add('selected');

      // Mobile (≤900px): Sidebar steht unter der Liste → zu "Mein Seminar" scrollen,
      // damit Updates sichtbar werden. Desktop: Sidebar ist rechts neben der Liste, kein Scroll nötig.
      if (window.matchMedia('(max-width: 900px)').matches) {
        var sidebarEl = document.querySelector('.termine-sidebar');
        if (sidebarEl) {
          var navEl = document.querySelector('.nav-fixed-wrapper');
          var navH = navEl ? navEl.offsetHeight : 0;
          var targetTop = sidebarEl.getBoundingClientRect().top + window.pageYOffset - navH - 16;
          window.scrollTo({ top: targetTop, behavior: 'smooth' });
        }
      }

      if (!anythingChanged) {
        currentIsOnline = isOnline;
        currentBasePrice = newPrice;
        syncKeynotesInclusions();
        updateParticipants();
        return;
      }

      var myId = ++_sbAnimId;
      var cancelled = function() { return _sbAnimId !== myId; };

      var targets = [];
      if (typeChanged) {
        targets.push({
          labelEl: document.getElementById('sidebar-type'),
          newValue: newType,
          delay: 0
        });
        var typeIcon = document.getElementById('sidebar-type-icon');
        typeIcon.innerHTML = isOnline
          ? '<use href="#icon-monitor-solid"></use>'
          : '<use href="#icon-users-solid"></use>';
      }
      if (dateChanged) {
        targets.push({
          labelEl: document.getElementById('sidebar-date'),
          newValue: newDate,
          delay: typeChanged ? 40 : 0
        });
      }
      if (locationChanged) {
        targets.push({
          labelEl: document.getElementById('sidebar-location'),
          newValue: newLocation,
          delay: (typeChanged ? 40 : 0) + (dateChanged ? 40 : 0)
        });
      }
      // Dauer/Uhrzeit nach Ort einreihen; `row` → bei leerem Wert wird die ganze Detail-Zeile aus-/eingeblendet.
      if (durationChanged) {
        targets.push({
          labelEl: durEl,
          newValue: newDuration,
          row: durEl.closest('.sidebar-detail'),
          delay: (typeChanged ? 40 : 0) + (dateChanged ? 40 : 0) + (locationChanged ? 40 : 0)
        });
      }
      if (timeChanged) {
        targets.push({
          labelEl: timeEl,
          newValue: newTime,
          row: timeEl.closest('.sidebar-detail'),
          delay: (typeChanged ? 40 : 0) + (dateChanged ? 40 : 0) + (locationChanged ? 40 : 0) + (durationChanged ? 40 : 0)
        });
      }

      var totalDuration = 0;

      targets.forEach(function(t) {
        var outDur = 250;
        var inDur = 200;

        setTimeout(function() {
          if (cancelled()) return;

          t.labelEl.classList.remove('sb-animating-in', 'sb-date-flash');
          t.labelEl.classList.add('sb-animating-out');

          setTimeout(function() {
            if (cancelled()) return;
            t.labelEl.textContent = t.newValue;
            // Dauer/Uhrzeit-Zeile: leerer Wert → Zeile ausblenden, sonst einblenden (zeitgleich mit dem In-Flash).
            if (t.row) t.row.style.display = t.newValue ? '' : 'none';
            t.labelEl.classList.remove('sb-animating-out');
            t.labelEl.classList.add('sb-animating-in');
            t.labelEl.classList.add('sb-date-flash');

            setTimeout(function() {
              t.labelEl.classList.remove('sb-animating-in');
            }, inDur + 50);
          }, outDur);
        }, t.delay);

        totalDuration = Math.max(totalDuration, t.delay + outDur + inDur);
      });

      var oldDisplayedPrice = parsePrice(priceEl.textContent);
      currentIsOnline = isOnline;
      currentBasePrice = newPrice;
      syncKeynotesInclusions();

      if (priceChanged || typeChanged) {
        setTimeout(function() {
          if (cancelled()) return;
          updateParticipantsWithoutPrice();
          var newDisplayedPrice = calcDisplayPrice();
          animatePrice(oldDisplayedPrice, newDisplayedPrice, 400);
        }, targets.length > 0 ? 100 : 0);
      } else {
        updateParticipants();
      }

      setTimeout(function() {
        if (cancelled()) return;
        var cta = document.querySelector('.sidebar-cta');
        cta.classList.remove('sb-nudge');
        void cta.offsetWidth;
        cta.classList.add('sb-nudge');
        cta.addEventListener('animationend', function handler() {
          cta.classList.remove('sb-nudge');
          cta.removeEventListener('animationend', handler);
        });
      }, totalDuration + 80);
    });
  });

  // ─── Termine: Wochentage unter Daten einfügen ───
  var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
  document.querySelectorAll('.termin-date').forEach(el => {
    var text = el.textContent.trim();
    var parts = text.split(/\s*[\u2013\-]\s*/);
    var dates = parts.map(function(d) {
      var m = d.match(/(\d{2})\.(\d{2})\.(\d{4})/);
      return m ? new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1])) : null;
    });
    var first = dates[0], last = dates[dates.length - 1];
    // Spanne \u00fcber mehr als eine Woche \u2192 mehrw\u00f6chige Weiterbildung (Betreiberwunsch 2026-07-01) \u2192 keine Wochentage
    if (first && last && Math.round((last - first) / 86400000) > 7) return;
    var dayNames = dates.map(function(d) { return d ? tage[d.getDay()] : ''; });
    // CMS-Abweichung: auch 1-Tages-Seminare bekommen ihren Wochentag (Testseite zeigte ihn nur bei Bereichen)
    var dayText = '';
    if (dayNames.length >= 2 && dayNames[0] && dayNames[1]) {
      dayText = dayNames[0] + ' \u2013 ' + dayNames[1];
    } else if (dayNames.length === 1 && dayNames[0]) {
      dayText = dayNames[0];
    }
    if (dayText) {
      var wrapper = document.createElement('div');
      wrapper.className = 'termin-date-wrap';
      el.parentNode.insertBefore(wrapper, el);
      wrapper.appendChild(el);
      var span = document.createElement('span');
      span.className = 'termin-days';
      span.textContent = dayText;
      wrapper.appendChild(span);
    }
  });

  // ─── Termine: filter chips ───
  // Nur die echten Filter-Chips in .termine-filters — NICHT die CTA-Buttons in .termine-more
  // (die tragen die Klasse .filter-button nur fürs Styling und sind jetzt echte Links).
  document.querySelectorAll('.termine-filters .filter-button').forEach(btn => {
    btn.addEventListener('click', () => {
      document.querySelectorAll('.termine-filters .filter-button').forEach(b => b.classList.remove('active'));
      btn.classList.add('active');
      const filter = btn.dataset.filter;

      document.querySelectorAll('.termin-card').forEach(card => {
        if (card.classList.contains('termin-card-cta')) {
          card.style.display = '';
          return;
        }
        if (filter === 'alle') {
          card.style.display = '';
        } else if (filter === 'online') {
          card.style.display = card.dataset.type === 'online' ? '' : 'none';
        } else if (filter === 'inhouse') {
          card.style.display = card.dataset.type === 'inhouse' ? '' : 'none';
        } else {
          card.style.display = card.dataset.location === filter ? '' : 'none';
        }
      });
    });
  });

  // ─── Termine: 4 Ansichten (Liste / Jahr / Karte / Stepper) ───
  (function() {
    const layout  = document.querySelector('.termine-left');
    const listEl  = document.querySelector('.termine-list');
    if (!layout || !listEl) return;

    const cards = Array.from(listEl.querySelectorAll('.termin-card'));

    // Gewählte Termin-Ansicht in ifm.ui persistieren (Single-Source mit initUiPrefs/
    // Block 16, das denselben Key + Merge-Muster nutzt). Eigene defensive Helfer, da
    // readJSON/writeJSON im Privacy-IIFE gekapselt und hier nicht erreichbar sind.
    const UI_KEY = 'ifm.ui';
    const VIEWS  = ['list', 'year', 'map', 'stepper'];
    function readUiPref(k) {
      try { var o = JSON.parse(localStorage.getItem(UI_KEY) || '{}'); return o && o[k]; }
      catch (e) { return undefined; }
    }
    function writeUiPref(k, v) {
      try {
        var o = {};
        try { o = JSON.parse(localStorage.getItem(UI_KEY) || '{}') || {}; } catch (e) {}
        o[k] = v;
        localStorage.setItem(UI_KEY, JSON.stringify(o));
      } catch (e) {}
    }

    const MONTHS_DE = ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'];

    const LOCATIONS = {
      basel:       { label: 'Basel',       country: 'ch' },
      berlin:      { label: 'Berlin',      country: 'de' },
      duesseldorf: { label: 'Düsseldorf',  country: 'de' },
      frankfurt:   { label: 'Frankfurt',   country: 'de' },
      hamburg:     { label: 'Hamburg',     country: 'de' },
      hannover:    { label: 'Hannover',    country: 'de' },
      leipzig:     { label: 'Leipzig',     country: 'de' },
      muenchen:    { label: 'München',     country: 'de' },
      nuernberg:   { label: 'Nürnberg',    country: 'de' },
      potsdam:     { label: 'Potsdam',     country: 'de' },
      stuttgart:   { label: 'Stuttgart',   country: 'de' },
      wien:        { label: 'Wien',        country: 'at' },
      online:      { label: 'Live Online', country: '' }
    };

    // Coordinates in shared DACH viewBox "0 0 500 520"
    // Formula: x = (lon - 5.87) * 42,  y = (55.06 - lat) * 56
    const CITY_COORDS = {
      hamburg:     [468, 183],
      berlin:      [539, 219],
      potsdam:     [532, 223],
      hannover:    [463, 224],
      leipzig:     [518, 259],
      duesseldorf: [401, 262],
      frankfurt:   [441, 299],
      nuernberg:   [491, 321],
      stuttgart:   [451, 342],
      muenchen:    [501, 362],
      wien:        [601, 360],
      basel:       [418, 380],
      online:      [565, 310]
    };
    const LABEL_BELOW = { potsdam: true, basel: true };

    // Assign view-transition-names + parse date
    cards.forEach((c, i) => {
      c.style.viewTransitionName = 'tn-' + i;
      const first = c.dataset.date.split(/[\u2013\-]/)[0].trim();
      const m = first.match(/(\d{2})\.(\d{2})\.(\d{4})/);
      if (m) {
        c.dataset.month = String(parseInt(m[2], 10));
        c.dataset.day   = String(parseInt(m[1], 10));
        c.dataset.year  = m[3];
      }
    });

    const countByLocation = k => cards.filter(c => c.dataset.location === k).length;
    const countByType     = t => cards.filter(c => c.dataset.type === t).length;

    // Reset inline filter styles and return cards to the list
    function returnToList() {
      cards.forEach(c => { c.style.display = ''; listEl.appendChild(c); });
      // Reset filter chip
      const alleBtn = document.querySelector('.filter-button[data-filter="alle"]');
      document.querySelectorAll('.filter-button').forEach(b => b.classList.remove('active'));
      if (alleBtn) alleBtn.classList.add('active');
    }

    // FLIP fallback for browsers without View Transitions
    function flipAnimate(mutate) {
      const firstRects = new Map();
      cards.forEach(el => { if (el.offsetParent) firstRects.set(el, el.getBoundingClientRect()); });
      mutate();
      cards.forEach(el => {
        if (!el.isConnected || !el.offsetParent) return;
        const first = firstRects.get(el);
        if (!first) return;
        const last = el.getBoundingClientRect();
        const dx = first.left - last.left;
        const dy = first.top  - last.top;
        if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) return;
        el.animate(
          [{ transform: `translate(${dx}px, ${dy}px)`, opacity: 0.75 },
           { transform: 'none',                       opacity: 1 }],
          { duration: 420, easing: 'cubic-bezier(0.25, 0.8, 0.25, 1)' }
        );
      });
    }

    function switchView(nextView) {
      if (layout.dataset.view === nextView) return;
      const prevView = layout.dataset.view;
      // Per-card morph only makes sense when cards are layout items in BOTH views
      // (list ↔ map, list ↔ stepper). Year hides cards, so skip to avoid flash.
      const keepCardMorph =
        (prevView === 'list'    && (nextView === 'map' || nextView === 'stepper')) ||
        (nextView === 'list'    && (prevView === 'map' || prevView === 'stepper')) ||
        (prevView === 'map'     && nextView === 'stepper') ||
        (prevView === 'stepper' && nextView === 'map');

      const apply = () => {
        returnToList();
        if (nextView === 'year')    buildYear();
        if (nextView === 'map')     buildMap();
        if (nextView === 'stepper') buildStepper();
        layout.dataset.view = nextView;
      };

      if (!keepCardMorph) cards.forEach(c => { c.style.viewTransitionName = ''; });

      if (document.startViewTransition && !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
        const t = document.startViewTransition(apply);
        t.finished.finally(() => {
          if (!keepCardMorph) cards.forEach((c, i) => { c.style.viewTransitionName = 'tn-' + i; });
        });
      } else {
        flipAnimate(apply);
        if (!keepCardMorph) cards.forEach((c, i) => { c.style.viewTransitionName = 'tn-' + i; });
      }
    }

    // ─── YEAR VIEW (full calendar) ────────────
    function activeFilter() {
      const b = document.querySelector('.filter-button.active');
      return b ? b.dataset.filter : 'alle';
    }

    function matchesFilter(card, f) {
      if (f === 'alle') return true;
      if (f === 'online') return card.dataset.type === 'online';
      if (f === 'inhouse') return card.dataset.type === 'inhouse';
      return card.dataset.location === f;
    }

    function yearsWithTermine(filterFn) {
      return [...new Set(cards.filter(filterFn || (() => true)).map(c => parseInt(c.dataset.year)))].filter(Boolean).sort();
    }

    function buildYear() {
      const root = layout.querySelector('.termine-year-scaffold');
      root.innerHTML = '';

      const f = activeFilter();
      const availableYears = yearsWithTermine(c => matchesFilter(c, f));
      const today = new Date();
      const todayYMD = today.getFullYear() * 10000 + (today.getMonth() + 1) * 100 + today.getDate();
      const yearsToRender = availableYears.length ? availableYears : [today.getFullYear()];

      const hidePastRows = grid => {
        const raw = getComputedStyle(grid).gridTemplateColumns;
        if (!raw || raw === 'none') return;
        const repeatMatch = raw.match(/repeat\((\d+)/);
        const cols = repeatMatch ? parseInt(repeatMatch[1], 10) : raw.split(' ').filter(Boolean).length;
        if (!cols) return;
        const months = Array.from(grid.querySelectorAll('.year-month'));
        months.forEach(m => m.classList.remove('is-row-past'));
        for (let i = 0; i + cols <= months.length; i += cols) {
          const row = months.slice(i, i + cols);
          if (row.every(m => m.dataset.monthPast === '1')) row.forEach(m => m.classList.add('is-row-past'));
        }
      };

      yearsToRender.forEach(year => {
        const terminMap = new Map();
        cards.filter(c => matchesFilter(c, f)).forEach(c => {
          const parts = c.dataset.date.split(/[\u2013\-]/).map(s => s.trim());
          const dates = parts.map(p => {
            const m = p.match(/(\d{2})\.(\d{2})\.(\d{4})/);
            return m ? { y: +m[3], mo: +m[2], d: +m[1] } : null;
          }).filter(Boolean);
          if (dates.length === 0) return;
          const [start, end] = dates.length === 2 ? dates : [dates[0], dates[0]];
          const cardIdx = cards.indexOf(c);
          let cur = new Date(start.y, start.mo - 1, start.d);
          const endDate = new Date(end.y, end.mo - 1, end.d);
          while (cur <= endDate) {
            if (cur.getFullYear() === year) {
              const key = (cur.getMonth() + 1) + '-' + cur.getDate();
              if (!terminMap.has(key)) terminMap.set(key, []);
              terminMap.get(key).push({ card: c, idx: cardIdx });
            }
            cur.setDate(cur.getDate() + 1);
          }
        });

        const yearSection = document.createElement('section');
        yearSection.className = 'year-section';
        if (yearsToRender.length > 1) {
          const h = document.createElement('div');
          h.className = 'year-section-head';
          h.textContent = year;
          yearSection.appendChild(h);
        }

        const grid = document.createElement('div');
        grid.className = 'termine-year-grid';
        for (let m = 1; m <= 12; m++) grid.appendChild(buildMonth(year, m, terminMap, todayYMD));
        yearSection.appendChild(grid);
        root.appendChild(yearSection);
        hidePastRows(grid);
        window.addEventListener('resize', () => hidePastRows(grid));
      });
    }

    function buildMonth(year, month, terminMap, todayYMD) {
      const el = document.createElement('div');
      el.className = 'year-month';
      const firstWeekday = (new Date(year, month - 1, 1).getDay() + 6) % 7;
      const daysInMonth = new Date(year, month, 0).getDate();
      const totalCells = Math.ceil((firstWeekday + daysInMonth) / 7) * 7;
      if (year * 10000 + month * 100 + daysInMonth < todayYMD) el.dataset.monthPast = '1';

      let cells = '';
      for (let i = 0; i < totalCells; i++) {
        const col = i % 7;
        const d = i - firstWeekday + 1;
        if (d < 1 || d > daysInMonth) {
          cells += `<div class="month-day is-empty" data-col="${col}"></div>`;
          continue;
        }
        const ymd = year * 10000 + month * 100 + d;
        const isWeekend = col >= 5;
        const terms = terminMap.get(month + '-' + d);
        const classes = ['month-day'];
        if (isWeekend) classes.push('is-weekend');
        if (ymd < todayYMD) classes.push('is-past');
        if (ymd === todayYMD) classes.push('is-today');
        let terminAttr = '';
        if (terms && terms.length) {
          classes.push('has-termin');
          const first = terms[0];
          terminAttr = ` data-termin-id="${first.idx}"`;
          const dot = first.card.querySelector('.termin-dot');
          if (dot) {
            if      (dot.classList.contains('frei'))       classes.push('termin-frei');
            else if (dot.classList.contains('wenig'))      classes.push('termin-wenig');
            else if (dot.classList.contains('ausgebucht')) classes.push('termin-ausgebucht');
          }
        }
        cells += `<div class="${classes.join(' ')}" data-month="${month}" data-day="${d}" data-col="${col}"${terminAttr}>${d}</div>`;
      }
      el.innerHTML = `
        <div class="month-head">${MONTHS_DE[month - 1]} ${year}</div>
        <div class="month-grid">${cells}</div>`;

      // Merge consecutive termin days of the same termin
      el.querySelectorAll('.month-day.has-termin').forEach(cell => {
        const id   = cell.dataset.terminId;
        const col  = parseInt(cell.dataset.col, 10);
        const prev = cell.previousElementSibling;
        const next = cell.nextElementSibling;
        if (col > 0 && prev && prev.dataset.terminId === id) cell.classList.add('continues-left');
        if (col < 6 && next && next.dataset.terminId === id) cell.classList.add('continues-right');
      });

      el.querySelectorAll('.month-day.has-termin').forEach(dayEl => {
        dayEl.addEventListener('click', () => {
          const key = dayEl.dataset.month + '-' + dayEl.dataset.day;
          const terms = terminMap.get(key);
          if (!terms || !terms[0]) return;
          const terminId = dayEl.dataset.terminId;
          layout.querySelectorAll('.month-day.is-selected').forEach(x => x.classList.remove('is-selected'));
          el.querySelectorAll(`.month-day[data-termin-id="${terminId}"]`).forEach(x => x.classList.add('is-selected'));
          terms[0].card.click();
        });
        dayEl.addEventListener('mouseenter', () => {
          const id = dayEl.dataset.terminId;
          if (!id) return;
          el.querySelectorAll(`.month-day[data-termin-id="${id}"]`).forEach(x => {
            if (x !== dayEl) x.classList.add('is-hover-group');
          });
        });
        dayEl.addEventListener('mouseleave', () => {
          el.querySelectorAll('.is-hover-group').forEach(x => x.classList.remove('is-hover-group'));
        });
      });
      return el;
    }

    // ─── MAP VIEW ──────────────────────────────
    function buildMap() {
      const root = layout.querySelector('.termine-map-scaffold');
      root.classList.remove('is-city-open');
      delete root.dataset.activeCity;

      const pinsHtml = Object.entries(CITY_COORDS).map(([key, xy]) => {
        const c = countByLocation(key);
        const label = LOCATIONS[key].label;
        const below = LABEL_BELOW[key];
        if (key === 'online') {
          const cls = c > 0 ? 'has-termine' : 'is-empty';
          const w = 54, h = 16;
          const boxRight = xy[0] + w / 2;
          const boxTop = xy[1] - h / 2;
          const cntStr = String(c);
          const bw = cntStr.length > 1 ? 14 : 12;
          const bh = 9;
          const bx = boxRight;
          const by = boxTop - bh / 2;
          const badge = c > 0
            ? `<rect class="map-pin-count-bg" x="${bx - bw / 2}" y="${by}" width="${bw}" height="${bh}" rx="2" ry="2"/><text class="map-pin-count" x="${bx}" y="${by + bh - 2}">${c}</text>`
            : '';
          return `<g class="map-pin map-pin-online ${cls}" data-location="${key}" data-count="${c}" tabindex="0" role="button" aria-label="${label}: ${c === 0 ? 'keine Termine' : c + ' Termine'}">
            <rect class="map-pin-online-bg" x="${xy[0] - w / 2}" y="${boxTop}" width="${w}" height="${h}" rx="3" ry="3"/>
            <text class="map-pin-online-label" x="${xy[0]}" y="${xy[1]}">${label}</text>
            ${badge}
          </g>`;
        }
        const ty = below ? xy[1] + 14 : xy[1] - 8;
        if (c === 0) {
          return `<g class="map-pin is-empty" data-location="${key}" tabindex="0" role="button" aria-label="${label}: keine Termine">
            <circle class="map-pin-dot" cx="${xy[0]}" cy="${xy[1]}" r="3"/>
            <text class="map-pin-label" x="${xy[0]}" y="${ty}">${label}</text>
          </g>`;
        }
        return `<g class="map-pin has-termine" data-location="${key}" data-count="${c}" tabindex="0" role="button" aria-label="${label}: ${c} Termine">
          <circle class="map-pin-dot" cx="${xy[0]}" cy="${xy[1]}" r="3"/>
          <text class="map-pin-label" x="${xy[0]}" y="${ty}">${label}</text>
        </g>`;
      }).join('');

      root.innerHTML = `
        <div class="map-wrap">
          <svg class="map-svg" viewBox="375 120 250 323" xmlns="http://www.w3.org/2000/svg" aria-label="Karte der Seminar-Standorte">
            <use href="#dach-path-de" class="map-country de"/>
            <use href="#dach-path-ch" class="map-country ch"/>
            <use href="#dach-path-at" class="map-country at"/>
            ${pinsHtml}
          </svg>
        </div>
        <aside class="map-city-panel" aria-live="polite">
          <div class="map-city-panel-head">
            <button type="button" class="map-city-back" aria-label="Zurück zur Karte">
              <svg viewBox="0 0 24 24"><use href="#icon-chevron-right-solid"/></svg>
            </button>
            <div class="map-city-title"></div>
            <div class="map-city-count"></div>
          </div>
          <div class="map-city-list"></div>
        </aside>`;

      root.querySelectorAll('.map-pin.has-termine').forEach(pin => {
        const handler = () => openCity(pin.dataset.location);
        pin.addEventListener('click', handler);
        pin.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handler(); } });
      });
      root.querySelector('.map-city-back').addEventListener('click', closeCity);

      setTimeout(() => {
        const gap = 2;
        const bh = 9;
        root.querySelectorAll('.map-pin.has-termine').forEach(pin => {
          const labelEl = pin.querySelector('.map-pin-label');
          if (!labelEl) return;
          const c = pin.dataset.count;
          const bw = c.length > 1 ? 14 : 12;
          const textW = labelEl.getComputedTextLength();
          const lx = parseFloat(labelEl.getAttribute('x'));
          const ly = parseFloat(labelEl.getAttribute('y'));
          const bx = lx + textW / 2 + gap + bw / 2;
          const by = ly - bh + 1.5;
          const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
          rect.setAttribute('class', 'map-pin-count-bg');
          rect.setAttribute('x', bx - bw / 2);
          rect.setAttribute('y', by);
          rect.setAttribute('width', bw);
          rect.setAttribute('height', bh);
          rect.setAttribute('rx', '2');
          rect.setAttribute('ry', '2');
          pin.appendChild(rect);
          const txt = document.createElementNS('http://www.w3.org/2000/svg', 'text');
          txt.setAttribute('class', 'map-pin-count');
          txt.setAttribute('x', bx);
          txt.setAttribute('y', by + bh - 2);
          txt.textContent = c;
          pin.appendChild(txt);
        });
      }, 50);
    }

    function openCity(key) {
      const root    = layout.querySelector('.termine-map-scaffold');
      const title   = root.querySelector('.map-city-title');
      const count   = root.querySelector('.map-city-count');
      const list    = root.querySelector('.map-city-list');
      const info    = LOCATIONS[key];
      const picks   = cards.filter(c => c.dataset.location === key);

      const run = () => {
        title.textContent = info.label;
        count.textContent = picks.length + ' Termin' + (picks.length === 1 ? '' : 'e');
        list.innerHTML = '';
        if (picks.length === 0) {
          list.innerHTML = '<div class="map-city-empty">Noch keine offenen Termine in dieser Stadt.<br>Gerne als <a href="#termine">Wunschtermin</a> anfragen.</div>';
        } else {
          picks.forEach(c => list.appendChild(c));
        }
        root.classList.add('is-city-open');
        root.dataset.activeCity = key;

        // ≤1279.98px (Kompakt): Map und City-Panel stapeln (Panel unter der Karte) →
        // zum Panel scrollen, damit die Termine sichtbar werden. Desktop: Panel rechts daneben, kein Scroll.
        // Inside run() so the layout mutation (display: none → flex via .is-city-open) is already applied
        // when we read getBoundingClientRect — outside, View-Transition's snapshot phase returns top=0.
        if (window.matchMedia('(max-width: 1279.98px)').matches) {
          var panelEl = root.querySelector('.map-city-panel');
          if (panelEl) {
            var navEl = document.querySelector('.nav-fixed-wrapper');
            var navH = navEl ? navEl.offsetHeight : 0;
            var targetTop = panelEl.getBoundingClientRect().top + window.pageYOffset - navH - 16;
            window.scrollTo({ top: targetTop, behavior: 'smooth' });
          }
        }
      };
      if (document.startViewTransition) document.startViewTransition(run);
      else flipAnimate(run);
    }

    function closeCity() {
      const root = layout.querySelector('.termine-map-scaffold');
      const run = () => {
        cards.filter(c => c.parentElement && c.parentElement.classList.contains('map-city-list'))
             .forEach(c => listEl.appendChild(c));
        root.classList.remove('is-city-open');
        delete root.dataset.activeCity;
      };
      if (document.startViewTransition) document.startViewTransition(run);
      else flipAnimate(run);
    }

    // ─── STEPPER VIEW ──────────────────────────
    function buildStepper() {
      const root = layout.querySelector('.termine-stepper-scaffold');
      root.innerHTML = `
        <div class="stepper-progress">
          <div class="stepper-step is-active" data-step="1">
            <span class="stepper-circle">1</span><span class="stepper-label">Format</span>
          </div>
          <div class="stepper-connector"></div>
          <div class="stepper-step" data-step="2">
            <span class="stepper-circle">2</span><span class="stepper-label">Ort</span>
          </div>
          <div class="stepper-connector"></div>
          <div class="stepper-step" data-step="3">
            <span class="stepper-circle">3</span><span class="stepper-label">Termin</span>
          </div>
        </div>

        <div class="stepper-panel is-active" data-panel="1">
          <div class="stepper-title">Wie möchten Sie teilnehmen?</div>
          <div class="stepper-subtitle">Wählen Sie zwischen Live Online oder Präsenz vor Ort.</div>
          <div class="stepper-tiles">
            <button type="button" class="stepper-tile" data-format="online">
              <svg viewBox="0 0 24 24"><use href="#icon-monitor-solid"/></svg>
              Live Online
              <span class="stepper-tile-count">${countByType('online')} Termine · 10% Rabatt</span>
            </button>
            <button type="button" class="stepper-tile" data-format="praesenz">
              <svg viewBox="0 0 24 24"><use href="#icon-users-solid"/></svg>
              Präsenz
              <span class="stepper-tile-count">${countByType('praesenz')} Termine in 7 Städten</span>
            </button>
          </div>
        </div>

        <div class="stepper-panel" data-panel="2">
          <div class="stepper-title">An welchem Ort?</div>
          <div class="stepper-subtitle">Wählen Sie Ihre Wunschstadt.</div>
          <div class="stepper-tiles">
            ${Object.entries(LOCATIONS).filter(([k]) => countByLocation(k) > 0).map(([k, info]) => {
              const c = countByLocation(k);
              return `<button type="button" class="stepper-tile" data-location-pick="${k}">
                ${info.label}
                <span class="stepper-tile-count">${c} Termin${c === 1 ? '' : 'e'}</span>
              </button>`;
            }).join('')}
          </div>
        </div>

        <div class="stepper-panel" data-panel="3">
          <div class="stepper-title">Ihr Wunschtermin</div>
          <div class="stepper-subtitle" data-step3-sub>Wählen Sie einen konkreten Termin.</div>
          <div class="stepper-list"></div>
        </div>

        <div class="stepper-nav">
          <button type="button" class="stepper-btn cta-secondary" data-nav="back" disabled><svg viewBox="0 0 24 24" style="transform:rotate(180deg)"><use href="#icon-chevrons-right-solid"/></svg> Zurück</button>
          <button type="button" class="stepper-btn cta-main" data-nav="next" disabled>Weiter <svg viewBox="0 0 24 24"><use href="#icon-chevrons-right-solid"/></svg></button>
        </div>`;

      const state = { step: 1, format: null, location: null };

      function render() {
        root.querySelectorAll('.stepper-step').forEach(el => {
          const n = parseInt(el.dataset.step);
          el.classList.toggle('is-active', n === state.step);
          el.classList.toggle('is-done',   n < state.step);
        });
        root.querySelectorAll('.stepper-panel').forEach(el => {
          el.classList.toggle('is-active', parseInt(el.dataset.panel) === state.step);
        });
        root.querySelector('[data-nav="back"]').disabled = state.step === 1;
        const nextBtn = root.querySelector('[data-nav="next"]');
        nextBtn.style.display = state.step === 3 ? 'none' : '';
        let canAdvance = false;
        if (state.step === 1) canAdvance = !!state.format;
        if (state.step === 2) canAdvance = !!state.location;
        nextBtn.disabled = !canAdvance;

        if (state.step === 3) populateStep3();
      }

      function populateStep3() {
        const list = root.querySelector('.stepper-list');
        const sub  = root.querySelector('[data-step3-sub]');
        let filter;
        if (state.format === 'online') {
          filter = c => c.dataset.type === 'online';
          sub.textContent = 'Live Online – folgende Termine stehen zur Auswahl:';
        } else if (state.location) {
          filter = c => c.dataset.location === state.location;
          sub.textContent = `Präsenz in ${LOCATIONS[state.location].label} – folgende Termine stehen zur Auswahl:`;
        } else {
          filter = () => true;
          sub.textContent = 'Folgende Termine stehen zur Auswahl:';
        }
        const picks = cards.filter(filter);
        list.innerHTML = '';
        if (picks.length === 0) {
          list.innerHTML = '<div class="map-city-empty">Keine passenden Termine. Bitte <a href="#termine">Wunschtermin</a> anfragen.</div>';
        } else {
          picks.forEach(c => list.appendChild(c));
        }
      }

      function stepperNav(dir) {
        const run = () => {
          if (dir === 'back') {
            if (state.step > 1) {
              state.step--;
              if (state.step === 2 && state.format === 'online') state.step = 1;
            }
          } else {
            if (state.step === 1 && state.format === 'online') state.step = 3;
            else if (state.step < 3) state.step++;
          }
          // Move cards back when leaving step 3
          if (state.step !== 3) {
            cards.filter(c => c.parentElement && c.parentElement.classList.contains('stepper-list'))
                 .forEach(c => listEl.appendChild(c));
          }
          render();
        };
        if (document.startViewTransition) document.startViewTransition(run);
        else flipAnimate(run);
      }

      root.querySelectorAll('[data-format]').forEach(btn => {
        btn.addEventListener('click', () => {
          root.querySelectorAll('[data-format]').forEach(b => b.classList.remove('is-selected'));
          btn.classList.add('is-selected');
          state.format = btn.dataset.format;
          state.location = null;
          root.querySelectorAll('[data-location-pick]').forEach(b => b.classList.remove('is-selected'));
          state.step = state.format === 'online' ? 3 : 2;
          render();
        });
      });
      root.querySelectorAll('[data-location-pick]').forEach(btn => {
        btn.addEventListener('click', () => {
          if (btn.disabled) return;
          root.querySelectorAll('[data-location-pick]').forEach(b => b.classList.remove('is-selected'));
          btn.classList.add('is-selected');
          state.location = btn.dataset.locationPick;
          state.step = 3;
          render();
        });
      });
      root.querySelector('[data-nav="back"]').addEventListener('click', () => stepperNav('back'));
      root.querySelector('[data-nav="next"]').addEventListener('click', () => stepperNav('next'));

      render();
    }

    // Rebuild year view when filter changes (filter bar is visible there)
    document.querySelectorAll('.filter-button').forEach(btn => {
      btn.addEventListener('click', () => {
        if (layout.dataset.view !== 'year') return;
        const run = () => buildYear();
        if (document.startViewTransition) document.startViewTransition(run);
        else run();
      });
    });

    // Hook up view switcher
    document.querySelectorAll('.view-btn').forEach(btn => {
      btn.addEventListener('click', () => {
        document.querySelectorAll('.view-btn').forEach(b => {
          b.classList.remove('active');
          b.setAttribute('aria-selected', 'false');
        });
        btn.classList.add('active');
        btn.setAttribute('aria-selected', 'true');
        switchView(btn.dataset.view);
        writeUiPref('termineView', btn.dataset.view);
      });
    });

    layout.dataset.view = 'list';

    // Gemerkte Ansicht aus dem letzten Besuch wiederherstellen (ohne Morph-Animation
    // beim Laden — direkt anwenden + Button-States synchronisieren). NUR wenn diese
    // Seite den Ansichts-Umschalter überhaupt hat (Termine-Block mit views≠false):
    // sonst zeigte eine Weiterbildung (nur Listen-Ansicht, kein .view-btn) die vom
    // letzten Seminar-Besuch gespeicherte Jahr-/Karte-/Schritte-Ansicht an, ohne dass
    // der Nutzer zurück zur Liste wechseln könnte (Betreiberbug 2026-06-26).
    const hasSwitcher = !!document.querySelector('.view-btn');
    let savedView = readUiPref('termineView');
    if (hasSwitcher && VIEWS.indexOf(savedView) !== -1 && savedView !== 'list') {
      returnToList();
      if (savedView === 'year')    buildYear();
      if (savedView === 'map')     buildMap();
      if (savedView === 'stepper') buildStepper();
      layout.dataset.view = savedView;
      document.querySelectorAll('.view-btn').forEach(b => {
        const on = b.dataset.view === savedView;
        b.classList.toggle('active', on);
        b.setAttribute('aria-selected', on ? 'true' : 'false');
      });
    }
  })();
})(); /* Ende Block 9 (Termine) — index-spezifischer Guard (s. Block-9-Anfang) */


;/* ===== JS Block 10 (orig. Zeilen 12979-13043) ===== */
// Clone only #logo-ifmera from nav logo into footer
(function() {
  const ifmeraGroup = document.querySelector('.nav-logo svg #logo-ifmera');
  const target = document.getElementById('footer-logo-target');
  if (ifmeraGroup && target) {
    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svg.setAttribute('viewBox', '30 35 620 170');
    svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
    svg.classList.add('footer-logo-inline');
    const clone = ifmeraGroup.cloneNode(true);
    clone.querySelectorAll('.lg').forEach(el => {
      el.classList.remove('lg');
      el.setAttribute('fill', 'var(--color-primary)');
    });
    svg.appendChild(clone);
    target.appendChild(svg);
  }
})();

// Footer: Privatsphäre-Einstellungen-Trigger → öffnet den Consent-Dialog (Block 16).
// data-prefs-trigger ist der neue, neutrale Hook (Tarnung gegen Cookie-Filterlisten);
// data-cookie-trigger bleibt als Alias rückwärtskompatibel.
(function() {
  document.querySelectorAll('[data-prefs-trigger], [data-cookie-trigger]').forEach(btn => {
    btn.addEventListener('click', (e) => {
      e.preventDefault();
      if (typeof window.ifmeraOpenCookieSettings === 'function') {
        window.ifmeraOpenCookieSettings();
        return;
      }
      document.dispatchEvent(new CustomEvent('ifmera:cookie-settings', { bubbles: true }));
    });
  });
})();

// Auto-aria-label für Karten-Overlay-Links (.kurs-card-link) aus geschwister .kurs-card-title
(function() {
  document.querySelectorAll('.kurs-card-link').forEach(link => {
    if (link.hasAttribute('aria-label')) return;
    const card = link.closest('.card');
    if (!card) return;
    const title = card.querySelector('.kurs-card-title');
    if (title && title.textContent.trim()) {
      link.setAttribute('aria-label', `Kurs ansehen: ${title.textContent.trim()}`);
    }
  });
})();

// Clone #logo-ifmera into bewertungen-headline (icon-color)
(function() {
  const ifmeraGroup = document.querySelector('.nav-logo svg #logo-ifmera');
  const target = document.getElementById('bewertung-headline-logo-target');
  if (ifmeraGroup && target) {
    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svg.setAttribute('viewBox', '30 35 620 170');
    svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
    const clone = ifmeraGroup.cloneNode(true);
    clone.querySelectorAll('.lg').forEach(el => {
      el.classList.remove('lg');
      el.setAttribute('fill', 'var(--color-icon)');
    });
    svg.appendChild(clone);
    target.appendChild(svg);
  }
})();

;/* ===== JS Block 11 (orig. Zeilen 13045-13092) ===== */
(function() {
  const navWrapper = document.querySelector('.nav-fixed-wrapper');
  const infoBarWrapper = document.querySelector('.info-bar-wrapper');
  if (!navWrapper) return;

  // nav-scrolled: Sentinel 10px hoch am Body-Anfang — sobald er aus dem
  // Viewport scrollt, ist scrollY > 10. Kein Scroll-Listener, kein Reflow.
  const navSentinel = document.createElement('div');
  navSentinel.style.cssText = 'position:absolute;top:10px;height:1px;width:1px;pointer-events:none;';
  document.body.prepend(navSentinel);
  new IntersectionObserver(function(entries) {
    navWrapper.classList.toggle('nav-scrolled', !entries[0].isIntersecting);
  }, { threshold: 0 }).observe(navSentinel);

  // Sticky Info-Bar-CTA (body.cta-stuck): wird aktiv, sobald die Info-Bar
  // komplett unter die Nav scrollt.
  // Beobachtet wird die STABILE .info-bar-wrapper (wird nie selbst fixiert →
  // kein Feedback-Loop, anders als beim früheren direkten Beobachten des CTA).
  // rootMargin = -nav-height blendet den Nav-Streifen oben aus → sobald der
  // Unterrand der Info-Bar die Nav-Unterkante passiert, ist isIntersecting=false
  // → der aktive CTA dockt via CSS an --nav-height an. rootMargin ist statisch,
  // daher bei Breakpoint-Wechsel (nav-height ändert sich) Observer neu aufbauen.
  if (infoBarWrapper) {
    let io = null;
    const navHeightPx = function() {
      const cs = getComputedStyle(document.documentElement);
      const rem = parseFloat(cs.getPropertyValue('--nav-height')) || 3.25;
      return rem * (parseFloat(cs.fontSize) || 16);
    };
    const build = function() {
      if (io) io.disconnect();
      io = new IntersectionObserver(function(entries) {
        const gone = !entries[0].isIntersecting;
        document.body.classList.toggle('cta-stuck', gone);
      }, { threshold: 0, rootMargin: (-navHeightPx()) + 'px 0px 0px 0px' });
      io.observe(infoBarWrapper);
    };
    build();
    // navHeight ändert sich nur an Breakpoints → Observer mit neuem rootMargin neu bauen
    let rafId = 0;
    window.addEventListener('resize', function() {
      if (rafId) cancelAnimationFrame(rafId);
      rafId = requestAnimationFrame(build);
    });
  }
})();

;/* ===== JS Block 12 (orig. Zeilen 13094-13113) ===== */
function buildToc() {
  const tocList = document.getElementById('toc-list');
  if (!tocList) return;
  tocList.innerHTML = '';
  // CMS-Abweichung: Auto-Anker fürs Inhaltsverzeichnis. Ein Block mit „Eintrag im
  // Inhaltsverzeichnis" (data-toc) braucht KEINEN manuell gesetzten Anker mehr — fehlt
  // in der Nähe ein Element mit id, wird hier automatisch eine stabile id (Slug des
  // Labels) am nächstgelegenen Sektions-/Karten-Container vergeben (sonst am data-toc-
  // Element selbst). Vorhandene Anker (z.B. <section id> der KI-Vorlagen/Default-Blöcke)
  // bleiben unangetastet → keine Regression. Selektor [data-toc] statt h2[data-toc],
  // damit auch Text-/Icon-Notch-Dots (<div class="dot" data-toc>) im TOC erscheinen.
  // Bei einem erneuten 1:1-Sync der Assets aus test\design erhalten.
  const tocUsedIds = new Set();
  document.querySelectorAll('[id]').forEach(el => { if (el.id) tocUsedIds.add(el.id); });
  const tocSlug = (s) => {
    s = (s || '').toLowerCase()
      .replace(/ä/g, 'ae').replace(/ö/g, 'oe').replace(/ü/g, 'ue').replace(/ß/g, 'ss')
      .replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
    return s || 'abschnitt';
  };
  const tocUniqueId = (base) => {
    let id = base, n = 2;
    while (tocUsedIds.has(id)) { id = base + '-' + n; n++; }
    tocUsedIds.add(id);
    return id;
  };
  document.querySelectorAll('[data-toc]').forEach(el => {
    const label = el.getAttribute('data-toc') || el.textContent.trim();
    let target = el.closest('[id]');
    if (!target || !target.id) {
      // Kein Anker in der Nähe → automatisch erzeugen. scroll-padding-top (main.css)
      // sorgt unabhängig vom Ziel-Element für den korrekten Versatz unter dem Header.
      target = el.closest('section, article, .has-notch, .cms-timeline, .cms-section, .termine-content') || el;
      target.id = tocUniqueId('abschnitt-' + tocSlug(label));
    }
    const li = document.createElement('li');
    const a = document.createElement('a');
    a.href = '#' + target.id;
    a.textContent = label;
    li.appendChild(a);
    tocList.appendChild(li);
  });
  // CMS-Abweichung: TOC-Sektion ausblenden, wenn kein data-toc-Eintrag existiert
  // (inline display:none, da .toc-section per Autoren-Regel display:inline-flex hat
  // und das [hidden]-Attribut sonst nicht greift). Bei einem erneuten 1:1-Sync der
  // Assets aus test\design erhalten.
  const tocSection = tocList.closest('.toc-section');
  if (tocSection) tocSection.style.display = tocList.children.length ? '' : 'none';
}
buildToc();

;/* ===== JS Block 12b: Hash-Sprung beim Seitenaufruf nachkorrigieren ===== */
// CMS-Abweichung: Beim Aufruf MIT #anker von AUSSEN landet der native Fragment-
// Sprung oft nur ungefähr — die TOC-Anker (abschnitt-…) werden erst von buildToc()
// per JS vergeben (im Roh-HTML existieren sie NICHT), und lazy ladende Bilder/
// Schriften oberhalb verschieben nach dem ersten Scroll das Layout. Daher den Sprung
// nach dem Laden (Bilder fertig) + bei spät eintreffendem Layout erneut nachholen,
// mit demselben Header-Versatz wie ein interner Link (scroll-padding-top, main.css).
// Bricht ab, sobald der Nutzer selbst scrollt (nicht gegen ihn arbeiten).
// Bei einem erneuten 1:1-Sync der Assets aus test\design erhalten.
(function () {
  if (!location.hash || location.hash.length < 2) return;
  var userMoved = false;
  function hashTarget() {
    var id;
    try { id = decodeURIComponent(location.hash.slice(1)); } catch (e) { id = location.hash.slice(1); }
    return id ? document.getElementById(id) : null;
  }
  function jumpToHash() {
    if (userMoved) return;
    var el = hashTarget();
    if (el) el.scrollIntoView({ block: 'start' }); // 'auto'/instant; scroll-padding-top liefert den Offset
  }
  ['wheel', 'touchstart', 'keydown', 'pointerdown'].forEach(function (ev) {
    window.addEventListener(ev, function () { userMoved = true; }, { passive: true, once: true });
  });
  requestAnimationFrame(jumpToHash);              // nach JS-Aufbau (IDs vergeben)
  window.addEventListener('load', function () {   // nach Bildern/Schriften
    jumpToHash();
    setTimeout(jumpToHash, 250);
    setTimeout(jumpToHash, 700);                  // spätes Layout (verzögerte Bilder)
  });
})();


;/* ===== JS Block 13 (orig. Zeilen 13118-13359) ===== */
(function() {
  var SHOW_DELAY = 120;
  var HIDE_DELAY = 150;
  var VIEWPORT_PADDING = 24; // Mindestabstand zu allen Viewport-Rändern (sah bei 8 zu knapp aus)
  var ARROW_GAP = 10;
  var INTERACTIVE_RE = /<(a|button)[\s>]/i;

  // Singleton-Element erzeugen
  var tip = document.createElement('div');
  tip.className = 'ifmera-tooltip';
  tip.setAttribute('role', 'tooltip');
  tip.setAttribute('aria-hidden', 'true');
  tip.id = 'ifmera-tooltip-singleton';
  tip.innerHTML = '<div class="ifmera-tooltip-inner"></div><span class="ifmera-tooltip-arrow" aria-hidden="true"></span>';
  document.body.appendChild(tip);
  var inner = tip.querySelector('.ifmera-tooltip-inner');

  // Helper: Plain Text aus HTML extrahieren
  var tmp = document.createElement('div');
  function htmlToText(html) {
    tmp.innerHTML = html;
    return tmp.textContent.trim().replace(/\s+/g, ' ');
  }

  // Init: title → data-tooltip migrieren, aria-label auto-setzen
  document.querySelectorAll('[title]:not([data-keep-title])').forEach(function(el) {
    var t = el.getAttribute('title');
    if (!t) return;
    if (!el.hasAttribute('data-tooltip') && !el.hasAttribute('aria-label')) {
      el.setAttribute('data-tooltip', t);
    }
    el.removeAttribute('title');
  });
  document.querySelectorAll('[data-tooltip]:not([aria-label])').forEach(function(el) {
    var plain = htmlToText(el.getAttribute('data-tooltip'));
    if (plain) el.setAttribute('aria-label', plain);
  });

  // State
  var currentTrigger = null;
  var showTimer = null;
  var hideTimer = null;
  var isTouch = false;

  function cancelShow() { clearTimeout(showTimer); showTimer = null; }
  function cancelHide() { clearTimeout(hideTimer); hideTimer = null; }

  function getContent(el) {
    return el.getAttribute('data-tooltip') ||
           el.getAttribute('aria-label') ||
           '';
  }

  function isTriggerCandidate(el) {
    if (!el || el.nodeType !== 1) return false;
    if (el === tip || tip.contains(el)) return false;
    // Opt-out: Container mit Landmark-Label sollen keinen Tooltip zeigen
    if (el.hasAttribute('data-no-tooltip')) return false;
    if (el.hasAttribute('data-tooltip')) return true;
    // aria-label nur als Tooltip-Quelle, wenn Element interaktiv ist
    if (el.hasAttribute('aria-label')) {
      var tag = el.tagName;
      if (tag === 'BUTTON' || tag === 'A' || tag === 'INPUT' ||
          tag === 'SELECT' || tag === 'TEXTAREA' ||
          el.hasAttribute('tabindex') || el.hasAttribute('role')) {
        return getContent(el).length > 0;
      }
    }
    return false;
  }

  function findTrigger(el) {
    while (el && el !== document.body) {
      if (isTriggerCandidate(el)) return el;
      el = el.parentElement;
    }
    return null;
  }

  function position(trigger) {
    var rect = trigger.getBoundingClientRect();
    var override = trigger.getAttribute('data-tooltip-placement');
    // Erst messen
    tip.style.visibility = 'hidden';
    tip.style.left = '0px';
    tip.style.top = '0px';
    tip.setAttribute('data-placement', 'top');
    tip.classList.add('is-visible');
    var tw = tip.offsetWidth;
    var th = tip.offsetHeight;
    tip.classList.remove('is-visible');
    tip.style.visibility = '';

    var vw = window.innerWidth;
    var vh = window.innerHeight;

    var placement = override || 'top';
    if (!override) {
      if (rect.top < th + ARROW_GAP + VIEWPORT_PADDING) placement = 'bottom';
    }

    var left, top;
    if (placement === 'top' || placement === 'bottom') {
      left = rect.left + rect.width / 2 - tw / 2;
      left = Math.max(VIEWPORT_PADDING, Math.min(vw - tw - VIEWPORT_PADDING, left));
      top = placement === 'top'
        ? rect.top - th - ARROW_GAP
        : rect.bottom + ARROW_GAP;
    } else {
      top = rect.top + rect.height / 2 - th / 2;
      top = Math.max(VIEWPORT_PADDING, Math.min(vh - th - VIEWPORT_PADDING, top));
      left = placement === 'left'
        ? rect.left - tw - ARROW_GAP
        : rect.right + ARROW_GAP;
    }

    tip.setAttribute('data-placement', placement);
    tip.style.left = Math.round(left) + 'px';
    tip.style.top = Math.round(top) + 'px';

    var MIN_ARROW_INSET = 12;
    if (placement === 'top' || placement === 'bottom') {
      var ax = rect.left + rect.width / 2 - left;
      ax = Math.max(MIN_ARROW_INSET, Math.min(tw - MIN_ARROW_INSET, ax));
      tip.style.setProperty('--arrow-x', Math.round(ax) + 'px');
    } else {
      var ay = rect.top + rect.height / 2 - top;
      ay = Math.max(MIN_ARROW_INSET, Math.min(th - MIN_ARROW_INSET, ay));
      tip.style.setProperty('--arrow-y', Math.round(ay) + 'px');
    }
  }

  function show(trigger) {
    if (!trigger) return;
    var content = getContent(trigger);
    if (!content) return;
    cancelHide();
    currentTrigger = trigger;
    // HTML, wenn data-tooltip; sonst textContent
    var isHtml = trigger.hasAttribute('data-tooltip');
    if (isHtml) {
      inner.innerHTML = content;
    } else {
      inner.textContent = content;
    }
    // Interaktiv, wenn HTML-Content Links/Buttons enthält
    tip.classList.toggle('is-interactive', isHtml && INTERACTIVE_RE.test(content));
    position(trigger);
    tip.classList.add('is-visible');
    tip.setAttribute('aria-hidden', 'false');
    if (isTouch) tip.classList.add('is-touch-active');
  }

  function hide() {
    cancelShow();
    cancelHide();
    if (!currentTrigger) return;
    tip.classList.remove('is-visible', 'is-touch-active', 'is-interactive');
    tip.setAttribute('aria-hidden', 'true');
    currentTrigger = null;
  }

  function scheduleShow(trigger, delay) {
    cancelShow();
    if (currentTrigger === trigger) return;
    if (currentTrigger) {
      // Wechsel sofort, kein Flash
      show(trigger);
      return;
    }
    showTimer = setTimeout(function() { show(trigger); }, delay);
  }

  function scheduleHide() {
    cancelHide();
    hideTimer = setTimeout(hide, HIDE_DELAY);
  }

  // Mouse-Events
  document.addEventListener('mouseover', function(e) {
    // Maus betritt Tooltip → Hide abbrechen, offen halten
    if (tip.contains(e.target)) {
      cancelHide();
      return;
    }
    var trigger = findTrigger(e.target);
    if (!trigger) return;
    isTouch = false;
    cancelHide();
    scheduleShow(trigger, SHOW_DELAY);
  });
  document.addEventListener('mouseout', function(e) {
    var to = e.relatedTarget;
    // Verlassen aus dem Tooltip
    if (tip.contains(e.target)) {
      if (to && (tip.contains(to) || (currentTrigger && currentTrigger.contains(to)))) return;
      scheduleHide();
      return;
    }
    // Verlassen aus dem Trigger
    if (!currentTrigger) {
      cancelShow();
      return;
    }
    if (to && (currentTrigger.contains(to) || tip.contains(to))) return;
    scheduleHide();
  });

  // Focus für Keyboard
  document.addEventListener('focusin', function(e) {
    var trigger = findTrigger(e.target);
    if (!trigger) return;
    show(trigger);
  });
  document.addEventListener('focusout', function(e) {
    if (currentTrigger && currentTrigger === e.target) hide();
  });

  // Touch
  document.addEventListener('touchstart', function(e) {
    var trigger = findTrigger(e.target);
    if (trigger) {
      isTouch = true;
      if (currentTrigger === trigger) {
        hide();
      } else {
        show(trigger);
      }
    } else if (currentTrigger && !tip.contains(e.target)) {
      hide();
    }
  }, { passive: true });

  // Globale Hide-Trigger
  document.addEventListener('keydown', function(e) {
    if (e.key === 'Escape') hide();
  });
  window.addEventListener('scroll', hide, { passive: true });
  window.addEventListener('resize', hide);

  // Sicherheitsnetz: Wird der aktuelle Trigger aus dem DOM entfernt (z.B. Consent-Banner nach „Akzeptieren",
  // gelöschter Merkliste-Eintrag, ausgetauschtes Embed-Placeholder), feuert KEIN mouseout/blur → der Tooltip
  // bliebe sichtbar hängen. Beim Entfernen von Knoten prüfen, ob der Trigger noch im Dokument ist; sonst ausblenden.
  if (typeof MutationObserver === 'function') {
    new MutationObserver(function () {
      if (currentTrigger && !document.contains(currentTrigger)) hide();
    }).observe(document.body, { childList: true, subtree: true });
  }
})();

;/* ===== JS Block 14 (orig. Zeilen 13361-14551) ===== */
// ─── Form-Field System: Auto-Enhancement ───
(function() {
  'use strict';

  // ===== Utilities =====
  function debounce(fn, ms) {
    let t;
    return function(...args) {
      clearTimeout(t);
      t = setTimeout(() => fn.apply(this, args), ms);
    };
  }
  function reducedMotion() {
    return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  }
  function escapeHtml(s) {
    return String(s).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[c]);
  }
  function formatBytes(b) {
    if (b < 1024) return b + ' B';
    if (b < 1048576) return (b / 1024).toFixed(1) + ' KB';
    return (b / 1048576).toFixed(1) + ' MB';
  }

  // ===== Favicon Resolver (Email + URL) =====
  // Shared cache across all fields — same domain only probed once per page load
  const FAVICON_PATHS = ['/favicon.ico', '/favicon.svg', '/favicon.png', '/apple-touch-icon.png', '/apple-touch-icon-precomposed.png'];
  const FAVICON_CACHE = new Map();
  const DOMAIN_RE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;

  // Pre-mapped favicons for big providers whose root /favicon.ico is missing,
  // redirects to a login wall, or returns a 1×1 pixel. Avoids the dynamic chain
  // entirely → instant icon, no wasted requests.
  const KNOWN_PROVIDERS = {
    // Google (gmail.com itself does NOT host favicon.ico — Google's CDN does)
    'gmail.com':         'https://ssl.gstatic.com/ui/v1/icons/mail/rfr/gmail.ico',
    'googlemail.com':    'https://ssl.gstatic.com/ui/v1/icons/mail/rfr/gmail.ico',
    'google.com':        'https://www.google.com/favicon.ico',
    'google.de':         'https://www.google.com/favicon.ico',
    'youtube.com':       'https://www.youtube.com/s/desktop/favicon.ico',
    // Microsoft
    'outlook.com':       'https://outlook.live.com/favicon.ico',
    'outlook.de':        'https://outlook.live.com/favicon.ico',
    'hotmail.com':       'https://outlook.live.com/favicon.ico',
    'hotmail.de':        'https://outlook.live.com/favicon.ico',
    'live.com':          'https://outlook.live.com/favicon.ico',
    'live.de':           'https://outlook.live.com/favicon.ico',
    'msn.com':           'https://outlook.live.com/favicon.ico',
    // Apple
    'icloud.com':        'https://www.icloud.com/favicon.ico',
    'me.com':            'https://www.icloud.com/favicon.ico',
    'mac.com':           'https://www.icloud.com/favicon.ico',
    // Yahoo
    'yahoo.com':         'https://s.yimg.com/rz/l/favicon.ico',
    'yahoo.de':          'https://s.yimg.com/rz/l/favicon.ico',
    // German consumer providers
    'gmx.de':            'https://www.gmx.net/favicon.ico',
    'gmx.net':           'https://www.gmx.net/favicon.ico',
    'gmx.at':            'https://www.gmx.at/favicon.ico',
    'gmx.ch':            'https://www.gmx.ch/favicon.ico',
    'web.de':            'https://web.de/favicon.ico',
    't-online.de':       'https://www.t-online.de/favicon.ico',
    'freenet.de':        'https://www.freenet.de/favicon.ico',
    'arcor.de':          'https://www.arcor.de/favicon.ico',
    // Privacy-focused EU
    'mailbox.org':       'https://mailbox.org/favicon.ico',
    'posteo.de':         'https://posteo.de/favicon.ico',
    'proton.me':         'https://proton.me/favicon.ico',
    'protonmail.com':    'https://proton.me/favicon.ico',
    'pm.me':             'https://proton.me/favicon.ico',
    'tutanota.com':      'https://tuta.com/favicon.ico',
    'tutanota.de':       'https://tuta.com/favicon.ico',
    'tuta.com':          'https://tuta.com/favicon.ico',
    // Pro / business
    'fastmail.com':      'https://www.fastmail.com/favicon.ico',
    'aol.com':           'https://www.aol.com/favicon.ico',
    'aol.de':            'https://www.aol.com/favicon.ico',
    // Own brand — aktuelle Firmen-Domains auf das kanonische, funktionierende ifmera.com-Favicon (200).
    // (ifmera.de/favicon.ico würde selbst 301 auf eine kaputte URL leiten → daher fester Map-Wert.)
    'ifmera.com':        'https://ifmera.com/favicon.ico',
    'ifmera.de':         'https://ifmera.com/favicon.ico'
  };

  // Alt-/umleitende Domains: KEIN Favicon, KEIN Netz-Probe. ifm-business.de ist die ALTE
  // Domain und 301-leitet domainweit auf ifmera.com (favicon.ico → ifmera.com/de/favicon.ico → 404).
  // Ohne diese Sperre würde die dynamische Probe-Kette (tryChain) den 404 erneut auslösen.
  const FAVICON_SKIP = new Set(['ifm-business.de', 'ifm-business.com', 'www.ifm-business.de']);

  function extractEmailDomain(val) {
    const at = val.indexOf('@');
    if (at < 1) return null;
    const d = val.slice(at + 1).toLowerCase().trim();
    return DOMAIN_RE.test(d) ? d : null;
  }
  function extractUrlDomain(val) {
    let raw = val.trim();
    if (!raw) return null;
    if (!/^[a-z]+:\/\//i.test(raw)) raw = 'http://' + raw;
    try {
      const host = new URL(raw).hostname.toLowerCase();
      return DOMAIN_RE.test(host) ? host : null;
    } catch (e) {
      return null;
    }
  }

  // Ordered list of hosts to probe for a favicon. Many country-TLD domains
  // (apple.de, nike.de, …) host NO favicon themselves — they 301-redirect the
  // whole domain to the canonical .com (apple.com/de/). The www. + .com retries
  // catch that without any third-party lookup (GDPR: stays first-party).
  function buildFaviconHosts(domain) {
    const hosts = [domain];
    if (!domain.startsWith('www.')) hosts.push('www.' + domain);
    // ccTLD → .com fallback, only for a bare brand label (apple.de, not mail.x.de)
    const m = domain.match(/^([a-z0-9-]{2,})\.(?:de|at|ch|co\.uk|fr|it|es|nl|be|lu|dk|se|no|fi|pl|cz|pt|ie|eu)$/);
    if (m) {
      const com = m[1] + '.com';
      if (!hosts.includes(com)) { hosts.push(com); hosts.push('www.' + com); }
    }
    return hosts;
  }

  function initFaviconResolver(field) {
    const input = field.querySelector('input[type="email"], input[type="url"]');
    if (!input) return;
    const slot = field.querySelector('.form-field-icon-slot');
    if (!slot) return;
    const faviconImg = slot.querySelector('.form-field-favicon');
    if (!faviconImg) return;

    const isEmail = input.type === 'email';
    const extractDomain = isEmail ? extractEmailDomain : extractUrlDomain;
    const minTriggerChar = isEmail ? '@' : '.';

    const TLD_TYPOS = { '.con': '.com', '.cmo': '.com', '.ckm': '.com', '.dde': '.de', '.dee': '.de', '.atr': '.at' };
    const DOMAIN_TYPOS = {
      'gmial.com': 'gmail.com', 'gmal.com': 'gmail.com', 'gnail.com': 'gmail.com',
      'gmail.con': 'gmail.com', 'hotnail.com': 'hotmail.com', 'outlok.com': 'outlook.com',
      'yaho.com': 'yahoo.com', 'wbeb.de': 'web.de', 'gmc.de': 'gmx.de'
    };

    function applyTypoFix(email) {
      const at = email.indexOf('@');
      if (at < 1) return email;
      const local = email.slice(0, at);
      const domain = email.slice(at + 1).toLowerCase();
      if (DOMAIN_TYPOS[domain]) return local + '@' + DOMAIN_TYPOS[domain];
      for (const wrong in TLD_TYPOS) {
        if (domain.endsWith(wrong)) return local + '@' + domain.slice(0, -wrong.length) + TLD_TYPOS[wrong];
      }
      return email;
    }

    function clearSuggestion() {
      const s = field.querySelector('.form-field-suggest');
      if (s) s.remove();
    }
    function showSuggestion(fixed) {
      clearSuggestion();
      const s = document.createElement('div');
      s.className = 'form-field-suggest';
      s.innerHTML = `Meinten Sie <button type="button" class="form-field-suggest-btn">${escapeHtml(fixed)}</button>?`;
      const errorEl = field.querySelector('.form-field-error');
      field.insertBefore(s, errorEl || null);
      s.querySelector('.form-field-suggest-btn').addEventListener('click', () => {
        input.value = fixed;
        input.dispatchEvent(new Event('input', { bubbles: true }));
        input.focus();
        clearSuggestion();
      });
    }

    function clearFavicon() {
      faviconImg.classList.remove('is-loaded');
      faviconImg.removeAttribute('src');
    }
    function setFavicon(url) {
      faviconImg.onload = () => faviconImg.classList.add('is-loaded');
      faviconImg.onerror = () => clearFavicon();
      faviconImg.src = url;
    }
    // Probe FAVICON_PATHS across each host in `hosts` (domain → www. → .com fallback)
    function tryChain(originalDomain, hosts, hostIdx, pathIdx) {
      if (hostIdx >= hosts.length) {
        FAVICON_CACHE.set(originalDomain, null);
        clearFavicon();
        return;
      }
      if (pathIdx >= FAVICON_PATHS.length) {
        return tryChain(originalDomain, hosts, hostIdx + 1, 0);
      }
      const url = `https://${hosts[hostIdx]}${FAVICON_PATHS[pathIdx]}`;
      const probe = new Image();
      let done = false;
      const next = () => tryChain(originalDomain, hosts, hostIdx, pathIdx + 1);
      const timer = setTimeout(() => { if (!done) { done = true; next(); } }, 2500);
      probe.onload = () => {
        if (done) return; done = true; clearTimeout(timer);
        if (probe.naturalWidth >= 8) { FAVICON_CACHE.set(originalDomain, url); setFavicon(url); }
        else next();
      };
      probe.onerror = () => { if (done) return; done = true; clearTimeout(timer); next(); };
      probe.src = url;
    }

    function resolve() {
      const domain = extractDomain(input.value);
      if (!domain) { clearFavicon(); if (isEmail) clearSuggestion(); return; }
      // Alt-/umleitende Domains stumm ausblenden (kein Icon, kein Netz-Probe → kein 404).
      if (FAVICON_SKIP.has(domain)) { FAVICON_CACHE.set(domain, null); clearFavicon(); if (isEmail) clearSuggestion(); return; }
      if (isEmail) {
        const fixed = applyTypoFix(input.value);
        if (fixed !== input.value) showSuggestion(fixed); else clearSuggestion();
      }
      // 1. Hard-coded known providers — instant, no network probe
      if (KNOWN_PROVIDERS[domain]) {
        FAVICON_CACHE.set(domain, KNOWN_PROVIDERS[domain]);
        setFavicon(KNOWN_PROVIDERS[domain]);
        return;
      }
      // 2. Cache hit (success or known-null)
      if (FAVICON_CACHE.has(domain)) {
        const url = FAVICON_CACHE.get(domain);
        if (url) setFavicon(url); else clearFavicon();
        return;
      }
      // 3. Dynamic chain across domain → www. → .com fallback (apple.de → apple.com)
      tryChain(domain, buildFaviconHosts(domain), 0, 0);
    }

    const debounced = debounce(resolve, 600);
    input.addEventListener('input', () => {
      if (!input.value.includes(minTriggerChar)) { clearFavicon(); if (isEmail) clearSuggestion(); }
      debounced();
    });
    input.addEventListener('blur', resolve);
  }

  // ===== Password Toggle + Strength =====
  function initPassword(field) {
    const input = field.querySelector('input[type="password"]');
    if (!input) return;
    const toggle = field.querySelector('[data-password-toggle]');
    const strength = field.querySelector('.form-field-strength');

    if (toggle) {
      let isHolding = false;
      function show() {
        input.type = 'text';
        toggle.setAttribute('aria-pressed', 'true');
        toggle.setAttribute('aria-label', 'Passwort verbergen');
        const u = toggle.querySelector('use');
        if (u) u.setAttribute('href', '#icon-eye-off-solid');
      }
      function hide() {
        input.type = 'password';
        toggle.setAttribute('aria-pressed', 'false');
        toggle.setAttribute('aria-label', 'Passwort anzeigen');
        const u = toggle.querySelector('use');
        if (u) u.setAttribute('href', '#icon-eye-solid');
      }
      toggle.addEventListener('pointerdown', e => {
        if (e.pointerType === 'mouse' || e.pointerType === 'touch' || e.pointerType === 'pen') {
          isHolding = true; show();
        }
      });
      const release = () => { if (isHolding) { isHolding = false; hide(); } };
      toggle.addEventListener('pointerup', release);
      toggle.addEventListener('pointerleave', release);
      toggle.addEventListener('pointercancel', release);
      toggle.addEventListener('keydown', e => {
        if (e.key === ' ' || e.key === 'Enter') {
          e.preventDefault();
          if (input.type === 'password') show(); else hide();
        }
      });
      toggle.addEventListener('click', e => { e.preventDefault(); });
    }

    if (strength) {
      const label = strength.querySelector('.form-field-strength-label');
      const labels = ['–', 'schwach', 'okay', 'gut', 'stark'];
      const rules = {
        length:  pw => pw.length >= 8,
        upper:   pw => /[A-Z]/.test(pw),
        lower:   pw => /[a-z]/.test(pw),
        number:  pw => /[0-9]/.test(pw),
        special: pw => /[^a-zA-Z0-9]/.test(pw),
      };
      const ruleLabels = {
        length:  'Mindestens 8 Zeichen',
        upper:   'einen Großbuchstaben',
        lower:   'einen Kleinbuchstaben',
        number:  'eine Zahl',
        special: 'ein Sonderzeichen',
      };
      const ruleItems = Array.from(strength.querySelectorAll('.form-field-strength-rules li'));
      function applyRules(pw) {
        const failed = [];
        for (const li of ruleItems) {
          const key = li.dataset.rule;
          const passed = rules[key] ? rules[key](pw) : false;
          li.dataset.passed = passed ? 'true' : 'false';
          if (!passed) failed.push(key);
        }
        if (!pw) {
          // Empty: rely on `required` validity only — no custom message
          input.setCustomValidity('');
        } else if (failed.length) {
          const parts = failed.map(k => ruleLabels[k]);
          input.setCustomValidity('Das Passwort braucht noch: ' + parts.join(', ') + '.');
        } else {
          input.setCustomValidity('');
        }
      }
      input.addEventListener('focus', () => strength.classList.add('is-rules-visible'));
      input.addEventListener('blur',  () => strength.classList.remove('is-rules-visible'));
      function score(pw) {
        if (!pw) return 0;
        const len = pw.length;
        if (len < 4) return 0;

        // Character-class diversity
        let div = 0;
        if (/[a-z]/.test(pw)) div++;
        if (/[A-Z]/.test(pw)) div++;
        if (/[0-9]/.test(pw)) div++;
        if (/[^a-zA-Z0-9]/.test(pw)) div++;

        // Low-entropy guard: <30 % unique chars (e.g. "aaaaaaaa") → cap at 1
        const uniqueRatio = new Set(pw).size / len;
        if (uniqueRatio < 0.3) return 1;

        // Base score driven by length (NIST guidance prefers length over class diversity)
        let s;
        if (len < 6) s = 0;
        else if (len < 8) s = 1;
        else if (len < 12) s = 2;
        else if (len < 16) s = 3;
        else s = 4;

        // Diversity boost: 3+ classes adds 1, clamp later
        if (div >= 3) s += 1;
        // Single-class-only knocks 1 off (still ok for 16+ chars)
        if (div === 1 && s > 1) s -= 1;

        const pwl = pw.toLowerCase();

        // Sequence/repetition penalty: -1 (cap floor at 1, never below)
        if (/12345|qwert|abcdef|aaaa|0000|9876/.test(pwl)) s = Math.max(1, s - 1);

        // Weak-word penalty — graduated:
        //   • If the word dominates the password (len ≤ word × 1.5) → -2
        //   • Else, if password is short-ish AND not diverse → -1
        //   • Else, long + diverse password tolerates the embedded word (no penalty)
        const weakWords = ['password', 'passwort', 'admin', 'welcome', 'letmein', 'login'];
        for (const w of weakWords) {
          if (pwl.includes(w)) {
            if (len <= w.length * 1.5) s = Math.max(0, s - 2);
            else if (div < 3 && len < w.length * 3) s = Math.max(0, s - 1);
            break;
          }
        }

        return Math.max(0, Math.min(4, s));
      }
      input.addEventListener('input', () => {
        const sc = score(input.value);
        strength.dataset.score = sc;
        if (label) label.textContent = labels[sc];
        applyRules(input.value);
      });
      applyRules(input.value);
    }
  }

  // ===== Phone Auto-Format =====
  // Country wird aus dem Input-Präfix erkannt (kein Pflicht-Select).
  // DACH-Formate sind hinterlegt; alle anderen `+XX`-Nummern bekommen 3er-Gruppen.
  function initPhone(field) {
    const input = field.querySelector('input[type="tel"]');
    if (!input) return;

    const FORMATS = {
      '49': { template: d => /^1[5-7]/.test(d) ? 'XXX XXXXXXXX' : 'XX XXXXXXXX', max: 11 },
      '43': { template: () => 'XXX XXXXXXX', max: 10 },
      '41': { template: () => 'XX XXX XX XX', max: 9 },
    };

    function applyTemplate(digits, template) {
      let out = '', di = 0;
      for (let i = 0; i < template.length && di < digits.length; i++) {
        if (template[i] === 'X') { out += digits[di++]; } else { out += template[i]; }
      }
      return out;
    }

    function detectKnownCountry(raw) {
      // raw enthält nur Ziffern und maximal ein führendes '+'
      let start = 0;
      if (raw.startsWith('+')) start = 1;
      else if (raw.startsWith('00')) start = 2;
      else if (raw.startsWith('0')) return { code: '49', national: raw.slice(1) };
      else return null;

      const code = raw.slice(start, start + 2);
      if (FORMATS[code]) return { code, national: raw.slice(start + 2) };
      return null;
    }

    function format(value) {
      // Erlaube Ziffern, '+', '-', '/', '(', ')', Leerzeichen, '.'
      let raw = value.replace(/[^0-9+\-/().\s]/g, '');
      // '+' nur am Anfang
      if (raw.includes('+')) {
        const first = raw.indexOf('+');
        raw = (first === 0 ? '+' : '') + raw.replace(/\+/g, '');
      }
      if (!raw.trim()) return '';

      // Nur für bekannte DACH-Codes wird umformatiert — alles andere lässt der
      // User wie er es tippt (Tolerance für internationale Nummern)
      const cleanDigits = raw.replace(/[^\d+]/g, '');
      const detected = detectKnownCountry(cleanDigits);
      if (detected) {
        const cfg = FORMATS[detected.code];
        const national = detected.national.slice(0, cfg.max);
        if (!national) return `+${detected.code} `;
        return `+${detected.code} ${applyTemplate(national, cfg.template(national))}`.trimEnd();
      }

      // Unbekannte Vorwahl / internationale Nummer: User-Input erhalten,
      // nur mehrfache Leerzeichen kollabieren
      return raw.replace(/\s+/g, ' ');
    }

    function reformat() {
      const oldVal = input.value;
      const oldCursor = input.selectionStart ?? oldVal.length;
      const wasAtEnd = oldCursor === oldVal.length;
      const newVal = format(oldVal);
      if (newVal === oldVal) return;
      input.value = newVal;
      // Beim Tippen (Cursor am Ende) → neuer Cursor ans neue Ende.
      // Beim Editieren in der Mitte → Cursor an gleiche Digit-Position
      // (zählt nur echte Ziffern, NICHT das eingefügte '+').
      let newCursor = newVal.length;
      if (!wasAtEnd) {
        const digitsBefore = oldVal.slice(0, oldCursor).replace(/\D/g, '').length;
        let count = 0;
        for (let i = 0; i < newVal.length; i++) {
          if (/\d/.test(newVal[i])) count++;
          if (count === digitsBefore) { newCursor = i + 1; break; }
        }
      }
      try { input.setSelectionRange(newCursor, newCursor); } catch(e) {}
    }

    input.addEventListener('input', reformat);
  }

  // ===== Money / Currency Auto-Format (German notation: 1.234,56) =====
  function initMoneyFormat(field) {
    const input = field.querySelector('input');
    if (!input) return;

    function formatDuringInput(raw) {
      // Keep only digits and (first) comma
      let cleaned = raw.replace(/[^0-9,]/g, '');
      const firstComma = cleaned.indexOf(',');
      if (firstComma !== -1) {
        cleaned = cleaned.slice(0, firstComma + 1) + cleaned.slice(firstComma + 1).replace(/,/g, '');
      }
      let [whole, decimal] = cleaned.split(',');
      whole = (whole || '').replace(/^0+(?=\d)/, '');
      if (decimal !== undefined) decimal = decimal.slice(0, 2);
      const wholeFmt = whole ? whole.replace(/\B(?=(\d{3})+(?!\d))/g, '.') : (cleaned.startsWith(',') ? '0' : '');
      if (decimal === undefined) return wholeFmt;
      return `${wholeFmt || '0'},${decimal}`;
    }

    function reformat() {
      const oldVal = input.value;
      const oldCursor = input.selectionStart ?? oldVal.length;
      // Count digits/commas to the left of cursor (the bits we'll preserve)
      const sigBefore = oldVal.slice(0, oldCursor).replace(/[^0-9,]/g, '').length;
      const newVal = formatDuringInput(oldVal);
      if (newVal === oldVal) return;
      input.value = newVal;
      // Restore cursor by counting forward through sig chars
      let newCursor = newVal.length;
      let count = 0;
      for (let i = 0; i < newVal.length; i++) {
        if (/[0-9,]/.test(newVal[i])) count++;
        if (count === sigBefore) { newCursor = i + 1; break; }
      }
      try { input.setSelectionRange(newCursor, newCursor); } catch (e) {}
    }

    function padOnBlur() {
      const raw = input.value.replace(/[^0-9,]/g, '');
      if (!raw) return;
      const [w, d = ''] = raw.split(',');
      const whole = (w || '0').replace(/^0+(?=\d)/, '') || '0';
      const decimal = d.padEnd(2, '0').slice(0, 2);
      input.value = whole.replace(/\B(?=(\d{3})+(?!\d))/g, '.') + ',' + decimal;
      input.dispatchEvent(new Event('input', { bubbles: true }));
    }

    input.addEventListener('input', reformat);
    input.addEventListener('blur', padOnBlur);
  }

  // ===== URL Auto-Prefix =====
  function initUrl(field) {
    const input = field.querySelector('input[type="url"]');
    if (!input) return;
    input.addEventListener('blur', () => {
      const v = input.value.trim();
      if (v && !/^[a-z]+:\/\//i.test(v) && /\./.test(v)) {
        input.value = 'https://' + v;
      }
    });
  }

  // ===== Search Clear =====
  // Sichtbarkeit per CSS via :has(input:not(:placeholder-shown)) — kein input-Listener nötig.
  function initSearch(field) {
    const input = field.querySelector('input[type="search"]');
    const btn = field.querySelector('[data-search-clear-btn]');
    if (!input || !btn) return;
    btn.addEventListener('click', () => {
      input.value = '';
      input.dispatchEvent(new Event('input', { bubbles: true }));
      input.focus();
    });
  }

  // ===== Number Stepper =====
  function initNumberStepper(field) {
    const input = field.querySelector('input[type="number"]');
    const down = field.querySelector('[data-step-down]');
    const up = field.querySelector('[data-step-up]');
    if (!input) return;
    function step(dir) {
      const cur = parseFloat(input.value || input.min || 0);
      const stepVal = parseFloat(input.step || 1);
      const min = input.min !== '' ? parseFloat(input.min) : -Infinity;
      const max = input.max !== '' ? parseFloat(input.max) : Infinity;
      let next = cur + dir * stepVal;
      next = Math.max(min, Math.min(max, next));
      if (next !== cur) {
        input.value = next;
        input.dispatchEvent(new Event('input', { bubbles: true }));
        input.dispatchEvent(new Event('change', { bubbles: true }));
      }
    }
    function bindHold(btn, dir) {
      if (!btn) return;
      let initT, repT;
      const start = () => {
        step(dir);
        initT = setTimeout(() => { repT = setInterval(() => step(dir), 60); }, 250);
      };
      const stop = () => { clearTimeout(initT); clearInterval(repT); };
      btn.addEventListener('pointerdown', e => { e.preventDefault(); start(); });
      btn.addEventListener('pointerup', stop);
      btn.addEventListener('pointerleave', stop);
      btn.addEventListener('pointercancel', stop);
      btn.addEventListener('keydown', e => {
        if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); step(dir); }
      });
    }
    bindHold(down, -1);
    bindHold(up, 1);
  }

  // ===== Color Display =====
  // Default = "Keine Farbe gewählt". Bei erster Interaktion: Wert + Check-Dot.
  function initColorDisplay(field) {
    const input = field.querySelector('input[type="color"]');
    const display = field.querySelector('[data-color-value]');
    const control = field.querySelector('.form-field-control');
    if (!input || !display) return;
    let interacted = false;
    const markInteracted = () => {
      if (!interacted) {
        interacted = true;
        field.classList.add('is-interacted');
        if (control) control.classList.add('is-filled');
      }
      display.textContent = input.value.toUpperCase();
    };
    input.addEventListener('input', markInteracted);
    input.addEventListener('change', markInteracted);
  }

  // ===== Range Display =====
  function initRangeDisplay(field) {
    const input = field.querySelector('input[type="range"]');
    const display = field.querySelector('[data-range-value]');
    const control = field.querySelector('.form-field-control');
    if (!input || !display) return;
    let interacted = false;
    display.textContent = '—';
    const markInteracted = () => {
      if (!interacted) {
        interacted = true;
        field.classList.add('is-interacted');
        if (control) control.classList.add('is-filled');
      }
      display.textContent = input.value;
    };
    input.addEventListener('input', markInteracted);
    input.addEventListener('change', markInteracted);
  }

  // ===== File Upload (Drag-Drop + Previews) =====
  function initFileUpload(field) {
    const input = field.querySelector('input[type="file"]');
    const control = field.querySelector('.form-field-control');
    const list = field.querySelector('[data-file-list]');
    if (!input || !list || !control) return;
    const maxSize = parseInt(input.dataset.maxSize || '0', 10);
    let files = [];

    function syncToInput() {
      try {
        const dt = new DataTransfer();
        files.forEach(f => dt.items.add(f));
        input.files = dt.files;
      } catch(e) {}
    }
    function render() {
      list.innerHTML = '';
      files.forEach((file, idx) => {
        const li = document.createElement('li');
        li.className = 'form-field-file';
        const thumb = document.createElement('span');
        thumb.className = 'form-field-file-thumb';
        if (file.type.startsWith('image/')) {
          const img = document.createElement('img');
          img.alt = '';
          img.style.cssText = 'width:100%;height:100%;object-fit:cover;border-radius:0.3rem;';
          const reader = new FileReader();
          reader.onload = () => { img.src = reader.result; };
          reader.readAsDataURL(file);
          thumb.appendChild(img);
        } else {
          thumb.innerHTML = '<svg viewBox="0 0 640 640" aria-hidden="true" style="width:18px;height:18px;fill:currentColor"><use href="#icon-file-text-solid"/></svg>';
        }
        const name = document.createElement('span');
        name.className = 'form-field-file-name';
        name.textContent = file.name;
        const size = document.createElement('span');
        size.className = 'form-field-file-size';
        size.textContent = formatBytes(file.size);
        const rm = document.createElement('button');
        rm.type = 'button';
        rm.className = 'form-field-file-remove';
        rm.setAttribute('aria-label', `${file.name} entfernen`);
        rm.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg>';
        rm.addEventListener('click', () => {
          files.splice(idx, 1);
          syncToInput();
          render();
        });
        li.append(thumb, name, size, rm);
        list.appendChild(li);
      });
    }
    function addFiles(newFiles) {
      let rejected = 0;
      Array.from(newFiles).forEach(f => {
        if (maxSize && f.size > maxSize) { rejected++; return; }
        files.push(f);
      });
      if (rejected) console.warn(`${rejected} Datei(en) übersprungen: zu groß.`);
      syncToInput();
      render();
    }
    input.addEventListener('change', () => addFiles(input.files));
    ['dragenter', 'dragover'].forEach(ev => {
      control.addEventListener(ev, e => {
        e.preventDefault(); e.stopPropagation();
        control.classList.add('is-dragover');
      });
    });
    ['dragleave', 'drop'].forEach(ev => {
      control.addEventListener(ev, e => {
        e.preventDefault(); e.stopPropagation();
        if (ev === 'dragleave' && e.relatedTarget && control.contains(e.relatedTarget)) return;
        control.classList.remove('is-dragover');
      });
    });
    control.addEventListener('drop', e => { if (e.dataTransfer?.files) addFiles(e.dataTransfer.files); });
  }

  // ===== Combobox (ARIA pattern) =====
  function initCombobox(field) {
    const combo = field.querySelector('[data-combobox]');
    if (!combo || combo.dataset.enhanced) return;
    const select = combo.querySelector('select.form-field-native-select');
    if (!select) return;
    combo.dataset.enhanced = '1';
    const multiple = combo.hasAttribute('data-multiple') || select.multiple;
    const searchable = combo.hasAttribute('data-searchable');
    const placeholderText = (select.options[0]?.value === '') ? select.options[0].text : (combo.dataset.placeholder || 'Auswählen …');

    const trigger = document.createElement('button');
    trigger.type = 'button';
    trigger.className = 'form-field-combobox-trigger';
    trigger.setAttribute('role', 'combobox');
    trigger.setAttribute('aria-haspopup', 'listbox');
    trigger.setAttribute('aria-expanded', 'false');
    trigger.id = (select.id || 'combo') + '-trigger';
    // Accessible Name: an das sichtbare Field-Label binden (axe: button-name).
    // Bei role="combobox" ist der Trigger-Subtree (Placeholder-Text/Chips/Chevron) kein
    // verlässlicher Name — aria-labelledby hat in der Name-Computation höchste Priorität
    // und überstimmt auch den durch den verschachtelten Clear-Button verursachten Edge-Case.
    const fieldLabel = field.querySelector('.form-field-label');
    if (fieldLabel) {
      if (!fieldLabel.id) fieldLabel.id = (select.id || 'combo') + '-label';
      trigger.setAttribute('aria-labelledby', fieldLabel.id);
    }

    const valueSpan = document.createElement('span');
    valueSpan.className = 'form-field-combobox-value is-placeholder';
    valueSpan.textContent = placeholderText;
    trigger.appendChild(valueSpan);
    // Clear-Button für Single-Select: sichtbar wenn etwas gewählt ist (auf "Standort wählen …" zurücksetzen).
    // Nur wenn es eine leere Platzhalter-Option gibt, auf die zurückgesetzt werden kann — sonst (z.B.
    // Sortierung: hat immer einen Wert, keine leere Option) ergibt ein „x" keinen Sinn.
    let clearBtn = null;
    const hasEmptyOption = Array.prototype.some.call(select.options, function (o) { return o.value === ''; });
    if (!multiple && hasEmptyOption) {
      clearBtn = document.createElement('button');
      clearBtn.type = 'button';
      clearBtn.className = 'form-field-combobox-clear';
      clearBtn.setAttribute('aria-label', 'Auswahl zurücksetzen');
      clearBtn.hidden = true;
      clearBtn.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg>';
      clearBtn.addEventListener('click', e => {
        e.stopPropagation();
        options.forEach(o => { o.opt.selected = false; o.li.setAttribute('aria-selected', 'false'); });
        const placeholder = Array.from(select.options).find(o => o.value === '');
        if (placeholder) placeholder.selected = true;
        select.dispatchEvent(new Event('change', { bubbles: true }));
        renderValue();
        trigger.focus();
      });
      trigger.appendChild(clearBtn);
    }
    const chevWrap = document.createElement('span');
    chevWrap.style.flex = '0 0 auto';
    chevWrap.innerHTML = '<svg class="form-field-combobox-chevron" viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg>';
    trigger.appendChild(chevWrap.firstChild);

    combo.appendChild(trigger);

    // Popup-Wrapper: Search-Input + Listbox als Geschwister. Die <ul role="listbox">
    // enthält ausschließlich <li role="option"> (+ ggf. role="presentation" für Empty-State) —
    // ARIA-konform (axe-required-children), Search bleibt im selben Animationskontext.
    const popup = document.createElement('div');
    popup.className = 'form-field-combobox-popup';

    let searchInput = null;
    if (searchable) {
      searchInput = document.createElement('input');
      searchInput.type = 'text';
      searchInput.className = 'form-field-combobox-search';
      searchInput.placeholder = 'Suchen …';
      searchInput.setAttribute('aria-label', 'In Optionen suchen');
      popup.appendChild(searchInput);
    }

    const listbox = document.createElement('ul');
    listbox.className = 'form-field-combobox-listbox';
    listbox.setAttribute('role', 'listbox');
    if (multiple) listbox.setAttribute('aria-multiselectable', 'true');
    listbox.id = (select.id || 'combo') + '-listbox';
    trigger.setAttribute('aria-controls', listbox.id);
    popup.appendChild(listbox);
    combo.appendChild(popup);

    const options = [];
    Array.from(select.options).forEach((opt, i) => {
      if (opt.value === '' && !multiple) return;
      const li = document.createElement('li');
      li.className = 'form-field-combobox-option';
      li.setAttribute('role', 'option');
      li.id = `${listbox.id}-opt-${i}`;
      li.dataset.value = opt.value;
      li.textContent = opt.text;
      li.setAttribute('aria-selected', opt.selected ? 'true' : 'false');
      listbox.appendChild(li);
      options.push({ li, opt });
    });

    let activeIndex = -1;
    let open = false;

    function renderValue() {
      const selected = options.filter(o => o.opt.selected);
      // Haken-Dot ein-/ausblenden basierend auf Auswahl (Placeholder-Option mit value="" zählt nicht)
      const hasRealSelection = selected.some(o => o.opt.value !== '');
      combo.classList.toggle('is-filled', hasRealSelection);
      if (clearBtn) clearBtn.hidden = !hasRealSelection;
      valueSpan.innerHTML = '';
      if (selected.length === 0) {
        valueSpan.textContent = placeholderText;
        valueSpan.classList.add('is-placeholder');
        return;
      }
      valueSpan.classList.remove('is-placeholder');
      if (multiple) {
        const chips = document.createElement('span');
        chips.className = 'form-field-combobox-chips';
        selected.forEach(({ opt }) => {
          const chip = document.createElement('span');
          chip.className = 'form-field-combobox-chip';
          chip.appendChild(document.createTextNode(opt.text));
          const x = document.createElement('button');
          x.type = 'button';
          x.className = 'form-field-combobox-chip-remove';
          x.setAttribute('aria-label', `${opt.text} entfernen`);
          x.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg>';
          x.addEventListener('click', e => {
            e.stopPropagation();
            opt.selected = false;
            const target = options.find(o => o.opt === opt);
            if (target) target.li.setAttribute('aria-selected', 'false');
            select.dispatchEvent(new Event('change', { bubbles: true }));
            renderValue();
          });
          chip.appendChild(x);
          chips.appendChild(chip);
        });
        valueSpan.appendChild(chips);
      } else {
        valueSpan.textContent = selected[0].opt.text;
      }
    }

    function setActive(idx) {
      const visible = options.filter(o => !o.li.hidden);
      if (visible.length === 0) { activeIndex = -1; return; }
      activeIndex = Math.max(0, Math.min(visible.length - 1, idx));
      options.forEach(o => o.li.classList.remove('is-active'));
      visible[activeIndex].li.classList.add('is-active');
      trigger.setAttribute('aria-activedescendant', visible[activeIndex].li.id);
      visible[activeIndex].li.scrollIntoView({ block: 'nearest' });
    }

    function openList() {
      if (open) return;
      open = true;
      trigger.setAttribute('aria-expanded', 'true');
      const selIdx = options.findIndex(o => o.opt.selected && !o.li.hidden);
      setActive(selIdx >= 0 ? options.filter(o => !o.li.hidden).findIndex(o => o.opt.selected) : 0);
      if (searchInput) setTimeout(() => searchInput.focus(), 50);
    }
    function closeList() {
      if (!open) return;
      open = false;
      trigger.setAttribute('aria-expanded', 'false');
      trigger.removeAttribute('aria-activedescendant');
      if (searchInput) { searchInput.value = ''; filterOptions(''); }
    }
    function selectOption(o) {
      if (multiple) {
        o.opt.selected = !o.opt.selected;
        o.li.setAttribute('aria-selected', o.opt.selected ? 'true' : 'false');
      } else {
        options.forEach(x => { x.opt.selected = (x === o); x.li.setAttribute('aria-selected', x.opt.selected ? 'true' : 'false'); });
        closeList();
        trigger.focus();
      }
      select.dispatchEvent(new Event('change', { bubbles: true }));
      renderValue();
    }
    function filterOptions(q) {
      const ql = q.toLowerCase();
      options.forEach(o => { o.li.hidden = ql && !o.opt.text.toLowerCase().includes(ql); });
      const visCount = options.filter(o => !o.li.hidden).length;
      let empty = listbox.querySelector('.form-field-combobox-empty');
      if (visCount === 0) {
        if (!empty) {
          empty = document.createElement('li');
          empty.className = 'form-field-combobox-empty';
          empty.setAttribute('role', 'presentation');
          empty.textContent = 'Keine Treffer';
          listbox.appendChild(empty);
        }
      } else if (empty) {
        empty.remove();
      }
      setActive(0);
    }

    trigger.addEventListener('click', () => { open ? closeList() : openList(); });
    trigger.addEventListener('keydown', e => {
      if (!open && (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ')) {
        e.preventDefault();
        openList();
      } else if (e.key === 'Escape' && open) {
        e.preventDefault(); closeList();
      }
    });
    listbox.addEventListener('click', e => {
      const li = e.target.closest('.form-field-combobox-option');
      if (!li) return;
      const o = options.find(x => x.li === li);
      if (o) selectOption(o);
    });
    function navKey(e) {
      if (!open) return;
      const visible = options.filter(o => !o.li.hidden);
      if (e.key === 'ArrowDown') { e.preventDefault(); setActive(activeIndex + 1); }
      else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(activeIndex - 1); }
      else if (e.key === 'Home') { e.preventDefault(); setActive(0); }
      else if (e.key === 'End') { e.preventDefault(); setActive(visible.length - 1); }
      else if (e.key === 'Enter') { e.preventDefault(); if (visible[activeIndex]) selectOption(visible[activeIndex]); }
      else if (e.key === 'Escape') { e.preventDefault(); closeList(); trigger.focus(); }
      else if (e.key === 'Tab') { closeList(); }
    }
    if (searchInput) {
      searchInput.addEventListener('keydown', navKey);
      searchInput.addEventListener('input', () => filterOptions(searchInput.value));
    } else {
      trigger.addEventListener('keydown', navKey);
    }
    document.addEventListener('click', e => { if (open && !combo.contains(e.target)) closeList(); });

    // Externe (programmatische) Wertänderungen am nativen Select spiegeln: z.B. die Kurssuche setzt
    // select.value direkt (KI-Filter, URL-Sync/Back-Button, Reset) → Trigger-Anzeige aktualisieren.
    // Idempotent (selectOption ruft renderValue ohnehin auf), daher global unbedenklich.
    select.addEventListener('change', renderValue);

    renderValue();
  }

  // ===== Textarea Counter =====
  // Auto-Grow läuft CSS-only via `field-sizing: content` (Baseline 2024).
  function initTextareaAutogrow(field) {
    const textarea = field.querySelector('textarea');
    const counter = field.querySelector('[data-counter]');
    if (!textarea) return;
    if (counter && textarea.maxLength > 0) {
      const max = textarea.maxLength;
      const update = () => {
        const len = textarea.value.length;
        counter.textContent = `${len} / ${max}`;
        counter.classList.toggle('is-near-limit', len / max > 0.9);
      };
      textarea.addEventListener('input', update);
      update();
    }
  }

  // ===== Magnetic CTA =====
  function initMagnetic(container) {
    if (reducedMotion()) return;
    const btn = container.querySelector('[data-magnetic]');
    if (!btn) return;
    const range = 90;
    container.addEventListener('pointermove', e => {
      const r = btn.getBoundingClientRect();
      const cx = r.left + r.width / 2, cy = r.top + r.height / 2;
      const dx = e.clientX - cx, dy = e.clientY - cy;
      const dist = Math.hypot(dx, dy);
      if (dist < range + Math.max(r.width, r.height) / 2) {
        const pull = Math.max(0, 1 - dist / (range * 2));
        btn.style.transform = `translate(${dx * pull * 0.28}px, ${dy * pull * 0.28}px)`;
      } else {
        btn.style.transform = '';
      }
    });
    container.addEventListener('pointerleave', () => { btn.style.transform = ''; });
  }

  // ===== Field Validation: German messages + consistent error display =====
  // HTML5-Spec-Quirk: tooShort/patternMismatch reflektieren nur nach User-Input,
  // nicht bei programmatischen value-Setzungen — daher zusätzlich manuelle Checks.
  function manualValidate(el) {
    const val = (el.value || '');
    if (el.minLength > 0 && val.length > 0 && val.length < el.minLength) {
      return 'Bitte mindestens ' + el.minLength + ' Zeichen eingeben (aktuell: ' + val.length + ').';
    }
    if (el.pattern && val.length > 0) {
      try {
        const re = new RegExp('^(?:' + el.pattern + ')$');
        if (!re.test(val)) return el.dataset.errorPattern || 'Bitte prüfen Sie das Format.';
      } catch (e) {}
    }
    return null;
  }
  // Deutsche Fehlermeldungen aus ValidityState ableiten. Native Browser-Messages
  // wären englisch/inkonsistent, daher hier eigene.
  function messageForElement(el) {
    const v = el.validity;
    if (v.valid) {
      // Manuelle Fallback-Checks für Spec-Quirks (tooShort, patternMismatch)
      const manual = manualValidate(el);
      if (manual) return manual;
      return '';
    }
    if (v.customError) return el.validationMessage;
    if (v.valueMissing) {
      if (el.type === 'checkbox') return 'Bitte aktivieren, um fortzufahren.';
      if (el.type === 'radio') return 'Bitte eine Option auswählen.';
      if (el.tagName === 'SELECT') return 'Bitte eine Option auswählen.';
      return 'Dieses Feld ist erforderlich.';
    }
    if (v.typeMismatch) {
      if (el.type === 'email') return 'Bitte eine gültige E-Mail-Adresse eingeben (z.B. name@beispiel.de).';
      if (el.type === 'url') return 'Bitte eine gültige URL eingeben (z.B. https://beispiel.de).';
      return 'Ungültiges Format.';
    }
    if (v.tooShort) return 'Bitte mindestens ' + el.minLength + ' Zeichen eingeben (aktuell: ' + (el.value || '').length + ').';
    if (v.tooLong) return 'Höchstens ' + el.maxLength + ' Zeichen erlaubt.';
    if (v.rangeUnderflow) {
      if (el.type === 'date' || el.type === 'datetime-local') return 'Datum darf nicht vor ' + el.min + ' liegen.';
      return 'Wert muss mindestens ' + el.min + ' sein.';
    }
    if (v.rangeOverflow) {
      if (el.type === 'date' || el.type === 'datetime-local') return 'Datum darf nicht nach ' + el.max + ' liegen.';
      return 'Wert darf höchstens ' + el.max + ' sein.';
    }
    if (v.stepMismatch) return 'Bitte ein gültiges Vielfaches von ' + (el.step || 1) + ' eingeben.';
    if (v.patternMismatch) return el.dataset.errorPattern || 'Bitte prüfen Sie das Format.';
    if (v.badInput) return 'Bitte prüfen Sie Ihre Eingabe.';
    return el.validationMessage || 'Ungültige Eingabe.';
  }

  // Auto-Injektion eines .form-field-error-Elements am Ende jedes .form-field
  function ensureFieldError(field) {
    let err = field.querySelector(':scope > .form-field-error');
    if (err) return err;
    err = document.createElement('small');
    err.className = 'form-field-error';
    err.hidden = true;
    err.setAttribute('role', 'alert');
    err.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-info-circle"/></svg><span></span>';
    field.appendChild(err);
    return err;
  }

  function showFieldError(field, msg) {
    const err = ensureFieldError(field);
    if (!msg) {
      err.hidden = true;
      field.classList.remove('has-error');
      return;
    }
    const span = err.querySelector('span');
    if (span) span.textContent = msg;
    err.hidden = false;
    field.classList.add('has-error');
  }

  function bindFieldValidation(scope) {
    // Alle Felder im Demo-Form (kann später erweitert werden auf form.form-field-style)
    scope.querySelectorAll('.form-field, .form-field-fieldset').forEach(field => {
      const controls = field.querySelectorAll('input, textarea, select');
      if (!controls.length) return;
      // Auto-Injekt Error-Element
      ensureFieldError(field);

      controls.forEach(el => {
        // Skip Custom-Combobox-Trigger (hat eigene Logik)
        if (el.classList.contains('form-field-native-select') && el.closest('.form-field-combobox')) {
          // Native Select hinter Combobox — Validation hängt am hidden Select
        }

        const onBlurOrChange = () => {
          // Optionales leeres Feld: Fehler clearen
          const isEmpty = el.type === 'checkbox' || el.type === 'radio'
            ? !el.checked
            : !(el.value || '').trim();
          if (isEmpty && !el.required) {
            showFieldError(field, '');
            el.removeAttribute('aria-invalid');
            return;
          }
          const msg = el.checkValidity() ? manualValidate(el) : messageForElement(el);
          if (msg) {
            showFieldError(field, msg);
            el.setAttribute('aria-invalid', 'true');
          } else {
            showFieldError(field, '');
            el.removeAttribute('aria-invalid');
          }
        };

        // Blur für Texteingaben, Change für Selects/Checkboxes/Radios/Date
        if (el.type === 'checkbox' || el.type === 'radio' || el.tagName === 'SELECT'
            || ['date', 'time', 'datetime-local', 'color', 'file', 'range'].includes(el.type)) {
          el.addEventListener('change', onBlurOrChange);
        } else {
          el.addEventListener('blur', onBlurOrChange);
        }

        // Während des Tippens: nur clearen wenn der Fehler bereits sichtbar war
        el.addEventListener('input', () => {
          if (field.classList.contains('has-error') && el.checkValidity() && !manualValidate(el)) {
            showFieldError(field, '');
            el.removeAttribute('aria-invalid');
          }
        });
      });
    });
  }

  // ===== Form Submit / Shake =====
  // Shake-Animation läuft per CSS via `.is-submitted .form-field:has(:user-invalid)`.
  // JS muss nur die Klasse setzen (mit Reflow-Trick zum Re-Triggern) und Error-Messages rendern.
  function initFormShake(form) {
    form.addEventListener('submit', e => {
      e.preventDefault();
      // Alle Form-Controls prüfen (nicht nur [required] — auch pattern/minlength/etc.)
      const allControls = form.querySelectorAll('input, textarea, select');
      let firstInvalid = null;
      allControls.forEach(el => {
        const field = el.closest('.form-field, .form-field-fieldset');
        const msg = el.checkValidity() ? manualValidate(el) : messageForElement(el);
        if (msg) {
          el.setAttribute('aria-invalid', 'true');
          if (!firstInvalid) firstInvalid = el;
          if (field) showFieldError(field, msg);
        } else {
          el.removeAttribute('aria-invalid');
          if (field) showFieldError(field, '');
        }
      });
      // Re-trigger der CSS-Shake-Animation via Reflow-Trick
      form.classList.remove('is-submitted');
      void form.offsetWidth;
      form.classList.add('is-submitted');
      if (firstInvalid) {
        firstInvalid.focus();
      } else {
        const btn = form.querySelector('[type="submit"]');
        if (btn) {
          const orig = btn.textContent;
          btn.textContent = '✓ Demo-Form gültig';
          btn.style.background = 'var(--color-icon)';
          btn.style.color = 'var(--color-primary)';
          setTimeout(() => {
            btn.textContent = orig;
            btn.style.background = '';
            btn.style.color = '';
          }, 2500);
        }
      }
    });
    // Clear aria-invalid on subsequent input
    form.addEventListener('input', e => {
      if (e.target.hasAttribute('aria-invalid') && e.target.checkValidity()) {
        e.target.removeAttribute('aria-invalid');
      }
    }, true);
  }

  // ===== Fill-State: toggle .is-filled on .form-field-control on BLUR =====
  // Während des Tippens passiert nichts (focus zeigt eh primary-ring). Erst beim
  // Verlassen des Fokus wird der Wert geprüft → ring wechselt auf Icon-Gelb.
  function bindFillState(scope) {
    scope.querySelectorAll('.form-field-control').forEach(control => {
      const fields = control.querySelectorAll(
        'input:not([type="file"]):not([type="range"]):not([type="color"]):not([type="checkbox"]):not([type="radio"]), textarea'
      );
      if (!fields.length) return;
      const update = () => {
        const hasValue = Array.from(fields).some(f => {
          const v = (f.value || '').trim();
          if (!v) return false;
          if (f.type === 'number' && parseFloat(v) === 0) return false;
          return true;
        });
        control.classList.toggle('is-filled', hasValue);
      };
      fields.forEach(f => {
        // Nur Blur + Change (Autofill/Datepicker) — kein 'input', damit das Triggern
        // erst beim Verlassen des Fokus passiert
        f.addEventListener('blur', update);
        f.addEventListener('change', update);
      });
      // Initial pass for pre-filled values (autofill, default values)
      update();
    });
  }

  // ===== Main init =====
  // Zeitraum-Feld (ftype=daterange): Trigger öffnet ein Popover mit Schnellauswahl-Presets
  // (Diese Woche/Monat/Jahr/Nächste 30 Tage/3 Monate) + zwei nativen Datums-Pickern (Von/Bis).
  // Die zwei <input type=date> sind die echten Felder (Namen von/bis bzw. <name>_von/_bis) → senden
  // sich normal mit dem Formular; ein bubbelndes change-Event triggert die Live-Suche (initKurssuche).
  // Nur von ODER nur bis ist erlaubt. Mobil: natives Datumspicker-Overlay + responsives Popover.
  function initDateRange(field) {
    if (field.dataset.drInit === '1') return;
    field.dataset.drInit = '1';
    var trigger = field.querySelector('[data-daterange-trigger]');
    var pop = field.querySelector('[data-daterange-pop]');
    var fromI = field.querySelector('[data-daterange-from]');
    var toI = field.querySelector('[data-daterange-to]');
    var labelEl = field.querySelector('[data-daterange-label]');
    if (!trigger || !pop || !fromI || !toI || !labelEl) return;
    var ph = labelEl.getAttribute('data-placeholder') || 'Beliebig';
    var presetBtns = pop.querySelectorAll('[data-daterange-preset]');

    function fmt(iso) { var m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(iso); return m ? m[3] + '.' + m[2] + '.' + m[1] : iso; }
    function pad(n) { return (n < 10 ? '0' : '') + n; }
    function iso(d) { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); }
    function computePreset(key) {
      var now = new Date(); now.setHours(0, 0, 0, 0);
      var from, to;
      if (key === 'week') { var day = (now.getDay() + 6) % 7; from = new Date(now); from.setDate(now.getDate() - day); to = new Date(from); to.setDate(from.getDate() + 6); }
      else if (key === 'month') { from = new Date(now.getFullYear(), now.getMonth(), 1); to = new Date(now.getFullYear(), now.getMonth() + 1, 0); }
      else if (key === 'year') { from = new Date(now.getFullYear(), 0, 1); to = new Date(now.getFullYear(), 11, 31); }
      else if (key === 'next30') { from = new Date(now); to = new Date(now); to.setDate(now.getDate() + 30); }
      else if (key === 'next90') { from = new Date(now); to = new Date(now); to.setMonth(now.getMonth() + 3); }
      else return null;
      return { from: iso(from), to: iso(to) };
    }
    function syncPresetActive() {
      var f = (fromI.value || '').trim(), t = (toI.value || '').trim();
      presetBtns.forEach(function (btn) { var r = computePreset(btn.getAttribute('data-daterange-preset')); btn.classList.toggle('is-active', !!r && r.from === f && r.to === t); });
    }
    function updateLabel() {
      var f = (fromI.value || '').trim(), t = (toI.value || '').trim();
      var txt = ph;
      if (f && t) txt = fmt(f) + ' – ' + fmt(t); else if (f) txt = 'ab ' + fmt(f); else if (t) txt = 'bis ' + fmt(t);
      labelEl.textContent = txt;
      field.classList.toggle('is-set', !!(f || t));
      syncPresetActive();
    }
    function open() { pop.hidden = false; trigger.setAttribute('aria-expanded', 'true'); }
    function close() { pop.hidden = true; trigger.setAttribute('aria-expanded', 'false'); }

    trigger.addEventListener('click', function (e) { e.preventDefault(); pop.hidden ? open() : close(); });
    document.addEventListener('click', function (e) { if (!pop.hidden && !field.contains(e.target)) close(); });
    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !pop.hidden) close(); });

    // Native Datumsauswahl: change/input → Label + (durch Bubbling) Live-Suche.
    fromI.addEventListener('change', updateLabel);
    toI.addEventListener('change', updateLabel);
    fromI.addEventListener('input', updateLabel);
    toI.addEventListener('input', updateLabel);

    // Klick IRGENDWO auf das Von/Bis-Feld öffnet den nativen Kalender zum Selber-Picken (nicht nur das
    // kleine Kalender-Icon). showPicker() braucht eine Nutzergeste (Klick ist eine) → wir öffnen den
    // Kalender direkt; ist er durch den Icon-Klick schon offen, wirft showPicker → abgefangen.
    function openPicker(inp) { if (inp && typeof inp.showPicker === 'function') { try { inp.showPicker(); } catch (e) {} } }
    fromI.addEventListener('click', function () { openPicker(fromI); });
    toI.addEventListener('click', function () { openPicker(toI); });

    presetBtns.forEach(function (btn) {
      btn.addEventListener('click', function () {
        var r = computePreset(btn.getAttribute('data-daterange-preset')); if (!r) return;
        fromI.value = r.from; toI.value = r.to; updateLabel();
        fromI.dispatchEvent(new Event('change', { bubbles: true })); // EINE Suche (Form-Change-Handler)
      });
    });
    var clearBtn = field.querySelector('[data-daterange-clear]');
    if (clearBtn) clearBtn.addEventListener('click', function () { fromI.value = ''; toI.value = ''; updateLabel(); fromI.dispatchEvent(new Event('change', { bubbles: true })); });
    var applyBtn = field.querySelector('[data-daterange-apply]');
    if (applyBtn) applyBtn.addEventListener('click', close);

    updateLabel();
  }

  function initFormFields(scope) {
    scope = scope || document;
    scope.querySelectorAll('[data-favicon-resolver]').forEach(initFaviconResolver);
    scope.querySelectorAll('[data-password-enhanced]').forEach(initPassword);
    scope.querySelectorAll('[data-phone-format]').forEach(initPhone);
    scope.querySelectorAll('[data-url-prefix]').forEach(initUrl);
    scope.querySelectorAll('[data-money-format]').forEach(initMoneyFormat);
    scope.querySelectorAll('[data-search-clear]').forEach(initSearch);
    scope.querySelectorAll('[data-number-stepper]').forEach(initNumberStepper);
    scope.querySelectorAll('[data-color-display]').forEach(initColorDisplay);
    scope.querySelectorAll('[data-range-display]').forEach(initRangeDisplay);
    scope.querySelectorAll('[data-file-upload]').forEach(initFileUpload);
    scope.querySelectorAll('[data-textarea-autogrow]').forEach(initTextareaAutogrow);
    scope.querySelectorAll('[data-combobox]').forEach(el => initCombobox(el.parentElement));
    scope.querySelectorAll('[data-daterange]').forEach(initDateRange);
    scope.querySelectorAll('[data-magnetic-container]').forEach(initMagnetic);
    bindFillState(scope);
    bindFieldValidation(scope);
    scope.querySelectorAll('.dev-demo-form-grid').forEach(initFormShake);
  }

  window.initFormFields = initFormFields;

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', () => initFormFields());
  } else {
    initFormFields();
  }
})();

;/* ===== JS Block 15 (orig. Zeilen 14553-14583) ===== */
  /* ─── Scroll-to-Top Button ─── */
  (function () {
    const btn = document.querySelector('[data-scroll-top]');
    if (!btn) return;

    const SHOW_AT = 600; // px Scroll-Distanz, ab der der Button auftaucht

    /* Sichtbarkeit via IntersectionObserver-Sentinel statt scroll-Listener +
       window.scrollY-Read: Letzteres ist ein Layout-Read und erzwang pro Scroll-
       Frame einen Forced Reflow (auf Mobile ~126ms, da die Seite viele scroll-
       getriebene Updates hat). Ein SHOW_AT px hoher, unsichtbarer Sentinel sitzt
       am Dokument-Anfang; sobald seine Unterkante (y=SHOW_AT) über den oberen
       Viewport-Rand scrollt, ist er nicht mehr „intersecting" → Button sichtbar.
       Entspricht exakt `scrollY >= SHOW_AT` (unabhängig von der Viewport-Höhe),
       läuft aber off-main-thread ohne Reflow. */
    const sentinel = document.createElement('div');
    sentinel.setAttribute('aria-hidden', 'true');
    sentinel.style.cssText = 'position:absolute;top:0;left:0;width:1px;height:' + SHOW_AT + 'px;pointer-events:none;';
    document.body.appendChild(sentinel);

    new IntersectionObserver(function (entries) {
      btn.classList.toggle('is-visible', !entries[0].isIntersecting);
    }, { threshold: 0 }).observe(sentinel);

    btn.addEventListener('click', () => {
      const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
      window.scrollTo({ top: 0, behavior: reduce ? 'auto' : 'smooth' });
    });
  })();

;/* ===== JS Block 15b (Conversion-Tracking: Google Ads + GA4-Event — SSOT window.ifmTrackConversion) ===== */
/* Geteilter Helfer für buchung.js (Seminarbuchung), kontakt.js (Kontaktanfrage) und die
   Schritt-Formulare (JS Block 22). Macht ZWEIERLEI:
   1) dataLayer.push des GA4-Events (event: data.event, z.B. 'seminar_buchung'/'kontakt_anfrage'
      inkl. value/currency/bereich/…) → im GTM-Container als GA4-Ereignis abgreifbar.
   2) Google-Ads-Conversion via gtag('event','conversion',{send_to:'AW-…/<label>'}) — NUR wenn
      window.__ifmAds (PHP cms_ads_head(), Settings ads_id + ads_label_*) das Label für `kind`
      liefert. Respektiert Consent Mode v2 automatisch: ohne Marketing-Einwilligung sendet
      gtag.js nur einen cookielosen Ping (modellierte Conversion), mit Einwilligung volle
      Messung. Wirft nie (try/catch); ohne Ads-Konfiguration bleibt nur der dataLayer-Push. */
window.ifmTrackConversion = function (kind, data) {
  try {
    data = data || {};
    var ev = { event: data.event || ('ifm_' + kind) };
    for (var k in data) { if (Object.prototype.hasOwnProperty.call(data, k) && k !== 'event') ev[k] = data[k]; }
    if (!ev.currency) ev.currency = 'EUR';
    if (window.dataLayer && typeof window.dataLayer.push === 'function') window.dataLayer.push(ev);
    var ads = window.__ifmAds || {};
    var label = (ads.labels || {})[kind] || '';
    if (ads.id && label && typeof window.gtag === 'function') {
      var p = { send_to: ads.id + '/' + label, currency: ev.currency };
      if (ev.value != null && ev.value !== '') p.value = Number(ev.value) || 0;
      if (ev.transaction_id) p.transaction_id = ev.transaction_id;
      window.gtag('event', 'conversion', p);
    }
  } catch (e) { /* Tracking darf nie den Ablauf brechen */ }
};

;/* ===== JS Block 16 (Privatsphäre-Einstellungen: Consent-Banner + Dialog + Click-to-load + lokale Komfortfunktionen) ===== */
/* Architektur s. CLAUDE.md „Privatsphäre/Consent“. Kurz:
   - Banner + Dialog werden HIER per JS gerendert (nicht in index.php) und tragen
     neutrale Klassen (ifm-prefs-*) → Tarnung gegen Cookie-Filterlisten ("I don't
     care about cookies", uBlock), ohne Adblocker aktiv zu bekämpfen.
   - KEIN Content-Gate: Der Banner ist nur Overlay; der Seiteninhalt steht immer im
     HTML. Für erkannte Crawler setzt index.php window.__ifmEnablePrefs gar nicht
     → kein Banner (aber voller Inhalt). Interaktive KI-Agenten (echter Browser-UA)
     bekommen das Flag und damit den voll bedienbaren Banner (role=region / <dialog>).
   - Consent steuert NUR echte Tracker/Embeds via Google Consent Mode v2. Die lokalen
     Komfortfunktionen (Merkliste, Prefill, zuletzt-gesehen/Vergleich, UI-Prefs) sind
     rein clientseitig + nur bei aktiver Nutzerhandlung → einwilligungsfrei (§25 (2)
     TDDDG), laufen also ohne Banner-Zustimmung. */
(function () {
  'use strict';

  /* Neutrale localStorage-Keys (kein "cookie/consent" im Namen). */
  var KEY_PREFS   = 'ifm.prefs.v1';
  var KEY_MERK    = 'ifm.merkliste';
  var KEY_CONTACT = 'ifm.contact';
  var KEY_RECENT  = 'ifm.recent';
  var KEY_COMPARE = 'ifm.compare';
  var KEY_UI      = 'ifm.ui';
  var CONSENT_VERSION = 2; /* 2 (2026-06-17): Kategorie „KI-Beratung" ergänzt → einmalige Re-Consent-Abfrage bei Bestandsbesuchern */
  var RECONSENT_DAYS  = 365; /* Re-Consent nach 12 Monaten */
  var RECENT_MAX = 10;

  /* Consent-Kategorien (Notwendig ist immer aktiv und NICHT in dieser Liste). */
  var CATEGORIES = [
    { id: 'statistik', name: 'Statistik',
      desc: 'Hilft uns zu verstehen, wie die Seite genutzt wird, um sie zu verbessern (z. B. Google Analytics 4). Anbieter: Google Ireland Ltd. / Google LLC. Mögliche Datenübermittlung in die USA (EU-US Data Privacy Framework). Speicherdauer bis zu 14 Monate. Hinweis: Unser Matomo läuft cookielos und anonymisiert – dafür ist keine Einwilligung nötig.' },
    { id: 'marketing', name: 'Marketing',
      desc: 'Misst den Erfolg unserer Anzeigen und ermöglicht relevante Werbung (Google Ads über den Google Tag Manager). Anbieter: Google. Mögliche Datenübermittlung in die USA. Speicherdauer bis zu 90 Tage.' },
    { id: 'medien', name: 'Externe Medien',
      desc: 'Lädt eingebettete Inhalte von YouTube und Google Maps. Erst beim Laden werden Daten (u. a. Ihre IP-Adresse) an YouTube/Google in die USA übertragen.' },
    { id: 'ki', name: 'KI-Beratung',
      desc: 'Aktiviert den KI-Berater in der Kurssuche. Ihre Chat-Eingaben sowie die aktuell gewählten Filter werden zur Beantwortung an einen KI-Dienst von Google (Vertex AI / Gemini) übertragen – dabei können Daten in die USA übermittelt werden (EU-US Data Privacy Framework). Anbieter: Google Ireland Ltd. / Google LLC. Ohne diese Einwilligung steht der KI-Berater nicht zur Verfügung; die Kurssuche selbst funktioniert uneingeschränkt.' }
  ];

  /* ── Defensive localStorage-Wrapper (privater Modus / deaktiviert / Quota) ── */
  function lsGet(k){ try { return window.localStorage.getItem(k); } catch (e) { return null; } }
  function lsSet(k, v){ try { window.localStorage.setItem(k, v); return true; } catch (e) { return false; } }
  function lsDel(k){ try { window.localStorage.removeItem(k); } catch (e) {} }
  function readJSON(k, fb){ var r = lsGet(k); if (r == null) return fb; try { return JSON.parse(r); } catch (e) { return fb; } }
  function writeJSON(k, v){ return lsSet(k, JSON.stringify(v)); }

  /* GA-/Tracking-Cookies aktiv entfernen, wenn die Einwilligung fehlt/widerrufen wird.
     Consent Mode stellt beim Widerruf nur das Tracking ein, löscht die bereits gesetzten
     _ga*-Cookies aber NICHT (Ablauf sonst erst nach ~2 Jahren) → hier für sauberen Opt-out
     selbst aufräumen. Über alle relevanten Domain-Varianten (host-only + Punkt-Domain +
     registrierbare Domain), weil GA das _ga-Cookie auf der registrierbaren Domain setzt. */
  function ifmDelCookie(name){
    var host = location.hostname, parts = host.split('.'), domains = [host, '.' + host], i;
    for (i = 1; i < parts.length - 1; i++) domains.push('.' + parts.slice(i).join('.'));
    var tail = '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';
    document.cookie = name + tail; /* host-only (kein domain-Attribut) */
    for (i = 0; i < domains.length; i++) document.cookie = name + tail + '; domain=' + domains[i];
  }
  function ifmClearCookies(re){
    var all = (document.cookie || '').split(';'), i, n;
    for (i = 0; i < all.length; i++) { n = all[i].split('=')[0].trim(); if (n && re.test(n)) ifmDelCookie(n); }
  }

  /* ───────────────────────── Consent-State ───────────────────────── */
  function getConsent() {
    var c = readJSON(KEY_PREFS, null);
    if (!c || c.v !== CONSENT_VERSION || !c.ts) return null;
    var ageDays = (Date.now() - Date.parse(c.ts)) / 86400000;
    if (isFinite(ageDays) && ageDays > RECONSENT_DAYS) return null; /* abgelaufen → erneut fragen */
    return c;
  }
  function saveConsent(state) {
    var c = {
      v: CONSENT_VERSION,
      ts: new Date().toISOString(),
      statistik: !!state.statistik,
      marketing: !!state.marketing,
      medien: !!state.medien,
      ki: !!state.ki
    };
    writeJSON(KEY_PREFS, c);
    applyConsent(c);
    return c;
  }
  /* Übersetzt den Consent-State in Google Consent Mode v2 + schaltet Embeds frei. */
  function applyConsent(c) {
    if (typeof window.gtag === 'function') {
      window.gtag('consent', 'update', {
        'analytics_storage':  c.statistik ? 'granted' : 'denied',
        'ad_storage':         c.marketing ? 'granted' : 'denied',
        'ad_user_data':       c.marketing ? 'granted' : 'denied',
        'ad_personalization': c.marketing ? 'granted' : 'denied'
      });
    }
    if (window.dataLayer && typeof window.dataLayer.push === 'function') {
      window.dataLayer.push({ event: 'ifm_consent_update', ifm_consent: c });
    }
    /* Opt-out-Aufräumen: Consent Mode löscht keine Cookies → bei Widerruf selbst entfernen.
       Statistik aus → GA4-Cookies (_ga, _ga_, _gid, _gat, _gac); Marketing aus → Ads (_gcl). */
    if (!c.statistik) ifmClearCookies(/^(_ga($|_)|_gid$|_gat|_gac)/);
    if (!c.marketing) ifmClearCookies(/^_gcl/);
    document.documentElement.classList.toggle('ifm-consent-medien', !!c.medien);
    document.documentElement.classList.toggle('ifm-consent-ki', !!c.ki);
    if (c.medien) loadAllEmbeds();
    /* KI-Berater (JS Block 19) + andere Einwilligungs-Gates reagieren hierauf:
       Gate ↔ Inhalt umschalten, ohne dass die Seite neu geladen werden muss. */
    try { document.dispatchEvent(new CustomEvent('ifmera:consent-change', { detail: c })); } catch (e) {}
  }

  /* ───────────────────────── Banner (nicht modal) ───────────────────────── */
  var card = null, dialog = null, lastFocus = null;

  function buildBanner() {
    if (card) return card;
    card = document.createElement('section');
    card.className = 'ifm-prefs-card has-notch';
    card.setAttribute('role', 'region');
    card.setAttribute('aria-label', 'Datenschutz-Einstellungen');
    card.setAttribute('data-prefs-card', '');
    // Die aria-label-Landmark NICHT als Tooltip-Quelle behandeln (Block 13): sonst zeigt das Tooltip-
    // System beim Überfahren des Banners „Datenschutz-Einstellungen" an, und beim Entfernen des Banners
    // (nach „Alle akzeptieren") bleibt dieser Tooltip sichtbar hängen (Betreiberbug 2026-06-17).
    card.setAttribute('data-no-tooltip', '');
    // Datenschutz-/Impressum-Links basis-/sprachpräfix-sicher (PHP cms_url → /de via window.__ifmPrefsLinks);
    // Fallback auf die rohen Pfade, falls das Boot-Skript sie nicht setzt.
    var prefsLinks = window.__ifmPrefsLinks || {};
    var dsHref = prefsLinks.datenschutz || '/datenschutz/';
    var imHref = prefsLinks.impressum || '/impressum/';
    card.innerHTML =
      '<span class="notch"><span class="dot"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-check-shield-solid"/></svg></span></span>' +
      '<h2 class="ifm-prefs-title">Cookies? Nur die nachhaltigen.</h2>' +
      '<p class="ifm-prefs-text">Wir gehen mit Daten so sparsam um wie mit Ressourcen. Entscheide selbst, was wir nutzen dürfen – jederzeit änderbar über „Privatsphäre-Einstellungen“ im Footer. Details in der <a class="link" href="' + dsHref + '">Datenschutzerklärung</a> &amp; im <a class="link" href="' + imHref + '">Impressum</a>.</p>' +
      '<div class="ifm-prefs-actions">' +
        '<button type="button" class="cta-main" data-prefs-action="accept-all">Alle akzeptieren</button>' +
        '<button type="button" class="cta-secondary" data-prefs-action="reject-all">Alle ablehnen</button>' +
        '<button type="button" class="ifm-prefs-link" data-prefs-action="open">Einstellungen</button>' +
      '</div>';
    document.body.appendChild(card);
    return card;
  }
  function showBanner() { buildBanner(); }
  function hideBanner() { if (card) { card.remove(); card = null; } }

  /* ───────────────────────── Dialog (natives <dialog>, modal) ───────────────────────── */
  function buildDialog() {
    if (dialog) return dialog;
    dialog = document.createElement('dialog');
    dialog.className = 'ifm-prefs-dialog';
    dialog.setAttribute('aria-labelledby', 'ifm-prefs-dialog-title');

    var catHTML = CATEGORIES.map(function (cat) {
      return '<div class="ifm-prefs-cat">' +
          '<div class="ifm-prefs-cat-head">' +
            '<span class="ifm-prefs-cat-name">' + cat.name + '</span>' +
            '<label class="form-field-switch">' +
              '<input type="checkbox" data-cat="' + cat.id + '" aria-label="' + cat.name + ' erlauben">' +
              '<span class="form-field-switch-track"><span class="form-field-switch-thumb"></span></span>' +
            '</label>' +
          '</div>' +
          '<p class="ifm-prefs-cat-desc">' + cat.desc + '</p>' +
        '</div>';
    }).join('');

    dialog.innerHTML =
      '<div class="ifm-prefs-dialog-inner">' +
        '<div class="ifm-prefs-dialog-head">' +
          '<div>' +
            '<h2 class="ifm-prefs-dialog-title" id="ifm-prefs-dialog-title">Privatsphäre-Einstellungen</h2>' +
            '<p class="ifm-prefs-dialog-intro">Wählen Sie, welche Dienste wir nutzen dürfen. Notwendige Funktionen sind für den Betrieb der Seite erforderlich. Externe Dienste (Google, YouTube) können Daten in die USA übertragen. Sie können Ihre Wahl jederzeit über den Footer ändern.</p>' +
          '</div>' +
          '<button type="button" class="ifm-prefs-close" data-prefs-action="close" aria-label="Schließen"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6 L18 18 M18 6 L6 18" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg></button>' +
        '</div>' +
        '<div class="ifm-prefs-cats">' +
          '<div class="ifm-prefs-cat ifm-prefs-cat--locked">' +
            '<div class="ifm-prefs-cat-head">' +
              '<span class="ifm-prefs-cat-name">Notwendig</span>' +
              '<label class="form-field-switch">' +
                '<input type="checkbox" checked disabled aria-label="Notwendige Funktionen sind immer aktiv">' +
                '<span class="form-field-switch-track"><span class="form-field-switch-thumb"></span></span>' +
              '</label>' +
            '</div>' +
            '<p class="ifm-prefs-cat-desc">Immer aktiv. Technisch erforderlich: Ihre Datenschutz-Einstellungen, Sitzung &amp; Sicherheit sowie lokale Komfortfunktionen (Merkliste, Formular-Vorausfüllung, zuletzt angesehene Kurse, gewähltes Format/Standort). Diese Daten bleiben auf Ihrem Gerät und werden nicht an Dritte übertragen.</p>' +
          '</div>' +
          catHTML +
        '</div>' +
        '<div class="ifm-prefs-tools"><button type="button" class="ifm-prefs-clear" data-prefs-action="clear-data">Auf diesem Gerät gespeicherte Komfort-Daten löschen</button></div>' +
        '<div class="ifm-prefs-dialog-foot">' +
          '<button type="button" class="ifm-prefs-save" data-prefs-action="save">Auswahl speichern</button>' +
          '<button type="button" class="cta-secondary" data-prefs-action="reject-all">Alle ablehnen</button>' +
          '<button type="button" class="cta-main" data-prefs-action="accept-all">Alle akzeptieren</button>' +
        '</div>' +
      '</div>';

    document.body.appendChild(dialog);
    dialog.addEventListener('close', restoreFocus);
    /* Klick auf den Backdrop (= das dialog-Element selbst, außerhalb des Inhalts) schließt. */
    dialog.addEventListener('click', function (e) { if (e.target === dialog) closeDialog(); });
    return dialog;
  }

  function syncTogglesFromConsent() {
    var c = getConsent() || {};
    CATEGORIES.forEach(function (cat) {
      var input = dialog.querySelector('input[data-cat="' + cat.id + '"]');
      if (input) input.checked = !!c[cat.id];
    });
  }
  function readToggles() {
    var s = {};
    CATEGORIES.forEach(function (cat) {
      var input = dialog && dialog.querySelector('input[data-cat="' + cat.id + '"]');
      s[cat.id] = !!(input && input.checked);
    });
    return s;
  }

  function openDialog() {
    buildDialog();
    syncTogglesFromConsent();
    lastFocus = document.activeElement;
    if (typeof dialog.showModal === 'function') {
      if (!dialog.open) dialog.showModal();
    } else {
      dialog.setAttribute('open', ''); /* Uralt-Fallback ohne Top-Layer */
    }
    /* Scrollbar-Breiten-Kompensation (konsistent mit dem Mega-Drawer). */
    var comp = window.innerWidth - document.documentElement.clientWidth;
    if (comp > 0) document.documentElement.style.paddingRight = comp + 'px';
  }
  function closeDialog() {
    if (!dialog) return;
    if (typeof dialog.close === 'function' && dialog.open) dialog.close();
    else dialog.removeAttribute('open');
    document.documentElement.style.paddingRight = '';
  }
  function restoreFocus() {
    document.documentElement.style.paddingRight = '';
    if (lastFocus && typeof lastFocus.focus === 'function') { try { lastFocus.focus(); } catch (e) {} }
  }

  /* ───────────────────────── Click-to-load (externe Medien) ─────────────────────────
     Markup-Vertrag (statisch in der Seite):
       <div class="ifm-embed" data-embed="youtube"
            data-embed-src="https://www.youtube-nocookie.com/embed/VIDEO_ID"
            data-embed-title="…">
         <span class="ifm-embed-provider">YouTube-Video</span>
         <p class="ifm-embed-note">…</p>
         <button type="button" class="cta-main" data-embed-load>Video laden</button>
       </div>
     Wird geladen bei Klick auf [data-embed-load] ODER automatisch, sobald die
     Kategorie „Externe Medien“ erlaubt ist. */
  function loadEmbed(el) {
    if (!el || el.getAttribute('data-embed-loaded') === '1') return;
    var src = el.getAttribute('data-embed-src');
    if (!src) return;
    var iframe = document.createElement('iframe');
    iframe.src = src;
    iframe.title = el.getAttribute('data-embed-title') || 'Eingebetteter Inhalt';
    iframe.loading = 'lazy';
    iframe.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin');
    iframe.setAttribute('allow', 'fullscreen; picture-in-picture; encrypted-media');
    iframe.setAttribute('allowfullscreen', '');
    el.innerHTML = '';
    el.appendChild(iframe);
    el.setAttribute('data-embed-loaded', '1');
  }
  function loadAllEmbeds() {
    document.querySelectorAll('[data-embed][data-embed-src]').forEach(loadEmbed);
  }

  /* ───────────────────────── Delegierte Klicks ───────────────────────── */
  document.addEventListener('click', function (e) {
    var t = e.target.closest ? e.target.closest('[data-prefs-action]') : null;
    if (t) {
      var action = t.getAttribute('data-prefs-action');
      if (action === 'accept-all')      { saveConsent({ statistik: true,  marketing: true,  medien: true,  ki: true  }); hideBanner(); closeDialog(); }
      else if (action === 'reject-all') { saveConsent({ statistik: false, marketing: false, medien: false, ki: false }); hideBanner(); closeDialog(); }
      else if (action === 'save')       { saveConsent(readToggles()); hideBanner(); closeDialog(); }
      else if (action === 'open')       { openDialog(); }
      else if (action === 'close')      { closeDialog(); }
      else if (action === 'clear-data') { clearFunctionalData(t); }
      return;
    }
    var load = e.target.closest ? e.target.closest('[data-embed-load]') : null;
    if (load) {
      var wrap = load.closest('[data-embed]');
      if (wrap) loadEmbed(wrap);
    }
  });

  /* ───────────────────────── Lokale Komfortfunktionen (einwilligungsfrei) ─────────────────────────
     Werden NUR durch aktive Nutzerhandlung (Klick/Eingabe/Auswahl) ausgelöst und
     bleiben rein auf dem Gerät → §25 Abs. 2 TDDDG (technisch notwendig / ausdrücklich
     gewünscht), keine Cookie-Einwilligung erforderlich. */

  /* Merkliste (Herz-Icon + Panel) — speichert Einträge {id,title,url,ts}.
     Top-Toolbar: Panel listet alle gemerkten Kurse (entfernbar). Unten:
     „Diese Seite merken"-Toggle. Alle Trigger + Panel + Badge syncen über das
     CustomEvent „ifmera:merkliste-change". Rein lokal + nutzer-ausgelöst → §25
     Abs. 2 TDDDG (keine Einwilligung nötig). Legacy-String-Einträge werden
     beim Lesen zu Objekten normalisiert (rückwärtskompatibel). */
  function normMerk(a) {
    if (!Array.isArray(a)) return [];
    return a.map(function (x) {
      if (x && typeof x === 'object') {
        return { id: x.id || '', title: x.title || x.id || '', url: x.url || '', ts: x.ts || '', kind: x.kind || '', type: x.type || '' };
      }
      return { id: String(x), title: String(x), url: '', ts: '', kind: '', type: '' };
    }).filter(function (x) { return x.id; });
  }
  function getMerk() { return normMerk(readJSON(KEY_MERK, [])); }
  function emitMerkChange() {
    try { document.dispatchEvent(new CustomEvent('ifmera:merkliste-change')); } catch (e) {}
  }
  function setMerk(a) { writeJSON(KEY_MERK, a); emitMerkChange(); }
  function merkIndex(list, id) {
    for (var i = 0; i < list.length; i++) { if (list[i].id === id) return i; }
    return -1;
  }
  function merkHas(id) { return merkIndex(getMerk(), id) !== -1; }
  function reflectMerk(btn, on) {
    btn.setAttribute('aria-pressed', on ? 'true' : 'false');
    btn.classList.toggle('is-merkt', on);
    /* Icon wechseln: gemerkt = gefülltes Herz, sonst das „Herz +"-Add-Icon. */
    var use = btn.querySelector('use');
    if (use) use.setAttribute('href', on ? '#icon-heart-solid' : '#icon-heart-plus');
    var label = btn.querySelector('[data-merkliste-label]');
    if (label) {
      /* „Diese Seite merken"-Variante mit Textlabel */
      label.textContent = on ? 'Gemerkt ✓' : 'Diese Seite merken';
      btn.setAttribute('data-tooltip', on ? 'Aus der Merkliste entfernen' : 'Zur Merkliste hinzufügen');
      btn.setAttribute('aria-label', on ? 'Diese Seite ist gemerkt – zum Entfernen klicken' : 'Diese Seite merken');
    } else {
      btn.setAttribute('data-tooltip', on ? 'Gemerkt' : 'Merken');
      btn.setAttribute('aria-label', on ? 'Kurs ist gemerkt – zum Entfernen klicken' : 'Kurs merken');
    }
  }

  /* Header-Zähler: Der Wert wird beim Merken NICHT sofort aktualisiert, sondern
     erst wenn das geflogene Herz „ankommt" (merkBadgeHold = true hält ihn so
     lange auf dem alten Stand). renderMerkBadge() respektiert den Hold; beim
     Entfernen/normalen Render aktualisiert er sofort. */
  var merkBadgeHold = false;
  function merkBadgeEl() { return document.querySelector('.nav-merkliste [data-merkliste-count]'); }
  function renderMerkBadge() {
    var badge = merkBadgeEl();
    if (!badge || merkBadgeHold) return; /* Hold → alten Zählerstand stehen lassen */
    var n = getMerk().length;
    if (n) { badge.textContent = String(n); badge.hidden = false; }
    else { badge.hidden = true; }
  }
  /* Kurze Pulse-Animation am Header-Zähler (wenn das geflogene Herz „ankommt"). */
  function bumpMerkBadge() {
    var badge = merkBadgeEl();
    if (!badge || badge.hidden) return;
    badge.classList.remove('is-bump');
    void badge.offsetWidth; /* Reflow → Animation neu starten */
    badge.classList.add('is-bump');
    setTimeout(function () { badge.classList.remove('is-bump'); }, 450);
  }
  /* Hold lösen + Zähler auf den neuen Stand setzen (+ optional pulsen). */
  function settleMerkBadge(bump) {
    merkBadgeHold = false;
    renderMerkBadge();
    if (bump) bumpMerkBadge();
  }

  /* „Fly to header": beim Merken schwebt eine Herz-Kopie vom geklickten Button
     hoch ins Header-Herz; ERST bei Ankunft wird der Zähler aktualisiert + pulst
     (settleMerkBadge). Transiente Klon-Animation mit berechneten Quell-/Ziel-
     koordinaten → Web Animations API (CSS-First deckt das nicht ab). Settle läuft
     IMMER (onfinish ODER Fallback-Timeout), damit der Zähler nie hängen bleibt,
     falls die WAA im Hintergrund-Tab gedrosselt ist. */
  function flyHeartToHeader(sourceBtn) {
    var headerSvg = document.querySelector('.nav-merkliste [data-merkliste-open] svg');
    var srcSvg = sourceBtn && sourceBtn.querySelector('svg');
    var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    /* Kein Flug möglich (kein Header-Herz / reduced-motion) → Zähler sofort setzen
       (bei reduced-motion ohne Pulse). */
    if (!headerSvg || !srcSvg || reduce) { settleMerkBadge(!reduce); return; }

    var s = srcSvg.getBoundingClientRect();
    var t = headerSvg.getBoundingClientRect();
    var fly = document.createElement('span');
    fly.className = 'merkliste-fly';
    fly.setAttribute('aria-hidden', 'true');
    fly.innerHTML = '<svg viewBox="0 0 24 24"><use href="#icon-heart-solid"/></svg>';
    fly.style.left = s.left + 'px';
    fly.style.top = s.top + 'px';
    fly.style.width = s.width + 'px';
    fly.style.height = s.height + 'px';
    document.body.appendChild(fly);

    var dx = (t.left + t.width / 2) - (s.left + s.width / 2);
    var dy = (t.top + t.height / 2) - (s.top + s.height / 2);
    var done = false;
    function finish() {
      if (done) return; done = true;
      if (fly.parentNode) fly.parentNode.removeChild(fly);
      settleMerkBadge(true); /* Zähler erst JETZT (bei Ankunft) hochzählen + pulsen */
    }
    try {
      var anim = fly.animate([
        { transform: 'translate(0,0) scale(1)', opacity: 1, offset: 0 },
        { transform: 'translate(' + (dx * 0.25) + 'px,' + (dy * 0.5 - 50) + 'px) scale(1.3)', opacity: 1, offset: 0.45 },
        { transform: 'translate(' + dx + 'px,' + dy + 'px) scale(0.4)', opacity: 0.4, offset: 1 }
      ], { duration: 1150, easing: 'cubic-bezier(0.45, 0, 0.7, 0.35)' });
      anim.onfinish = finish;
      anim.oncancel = finish;
    } catch (e) { /* kein WAA → sofort aufräumen */ }
    setTimeout(finish, 1500); /* Fallback (WAA gedrosselt/fehlt) */
  }
  function refreshMerkToggles() {
    document.querySelectorAll('[data-merkliste-toggle]').forEach(function (btn) {
      reflectMerk(btn, merkHas(btn.getAttribute('data-course-id') || ''));
    });
  }
  /* Anzeigetitel für die Merkliste, wenn der Block keinen liefert: H1 der Seite
     (Hero-/Seitenüberschrift), sonst document.title, sonst der Pfad. */
  function pageMerkTitle() {
    var h1 = document.querySelector('main h1, .hero-title, h1');
    var t = h1 && h1.textContent ? h1.textContent.replace(/\s+/g, ' ').trim() : '';
    if (t) return t;
    t = (document.title || '').replace(/\s+/g, ' ').trim();
    return t || location.pathname.replace(/\/index\.php$/i, '/');
  }
  function initMerkliste(scope) {
    (scope || document).querySelectorAll('[data-merkliste-toggle]').forEach(function (btn) {
      if (btn.getAttribute('data-merk-init') === '1') return;
      btn.setAttribute('data-merk-init', '1');
      var id = btn.getAttribute('data-course-id') || '';
      reflectMerk(btn, merkHas(id));
      btn.addEventListener('click', function (e) {
        e.preventDefault();
        var list = getMerk(); var i = merkIndex(list, id);
        var add = i === -1;
        if (add) {
          /* Titel: bevorzugt der vom Block gelieferte (aufgelöste) Kurstitel; fehlt er
             (z.B. Kategorie-/statische Seite ohne Seminar-Bindung), die H1 der Seite
             statt der ID/des Pfads anzeigen. */
          var title = (btn.getAttribute('data-course-title') || '').trim() || pageMerkTitle();
          /* Live-URL statt hartem „index.php": ein evtl. „/index.php"-Suffix wird
             entfernt → saubere Seiten-URL (in Produktion ohnehin pro Seite eigen). */
          var url = btn.getAttribute('data-course-url') ||
            (location.pathname.replace(/\/index\.php$/i, '/') + location.search);
          var kind = btn.getAttribute('data-course-kind') || '';
          var type = btn.getAttribute('data-course-type') || '';
          list.push({ id: id, title: title, url: url, ts: new Date().toISOString(), kind: kind, type: type });
          recordRecent(id, title);
        } else {
          list.splice(i, 1);
        }
        /* Flug nur vom Toggle AUSSERHALB des Panels (der Panel-Button sitzt direkt
           unter dem Header-Herz → Flugstrecke winzig/unschön). */
        var fly = add && !btn.closest('[data-merkliste-panel]');
        /* Nur beim Flug den Zähler einfrieren — er springt erst bei Ankunft hoch. */
        merkBadgeHold = fly;
        setMerk(list); /* feuert ifmera:merkliste-change → reflect + Panel-Render */
        if (fly) flyHeartToHeader(btn);      /* Herz-Kopie schwebt ins Header-Herz */
        else if (add) bumpMerkBadge();       /* ohne Flug: Zähler ist schon aktuell → nur pulsen */
      });
    });
  }

  /* Merkliste-Panel (Top-Toolbar-Dropdown: alle gemerkten Kurse ansehen/entfernen) */
  function initMerklistePanel() {
    var wrap = document.querySelector('[data-merkliste-menu]');
    if (!wrap || wrap.getAttribute('data-merk-panel-init') === '1') return;
    wrap.setAttribute('data-merk-panel-init', '1');
    var trigger = wrap.querySelector('[data-merkliste-open]');
    var panel   = wrap.querySelector('[data-merkliste-panel]');
    var listEl  = wrap.querySelector('[data-merkliste-list]');
    var emptyEl = wrap.querySelector('[data-merkliste-empty]');
    var badge   = wrap.querySelector('[data-merkliste-count]');
    if (!trigger || !panel || !listEl) return;

    function buildItem(it) {
      var li = document.createElement('li');
      li.className = 'merkliste-item';
      var a = document.createElement('a');
      a.className = 'merkliste-item-link';
      a.href = it.url || '#';
      a.textContent = it.title || it.id; /* textContent → injektionssicher */
      var rm = document.createElement('button');
      rm.type = 'button';
      rm.className = 'merkliste-item-remove';
      rm.setAttribute('data-merkliste-remove', it.id);
      rm.setAttribute('aria-label', (it.title || it.id) + ' aus der Merkliste entfernen');
      rm.setAttribute('data-tooltip', 'Entfernen');
      rm.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg>';
      li.appendChild(a);
      li.appendChild(rm);
      return li;
    }
    function render() {
      var items = getMerk();
      renderMerkBadge(); /* respektiert merkBadgeHold (Zähler wartet aufs Herz) */
      listEl.textContent = '';
      /* Nach ART gruppieren: jede Fortbildungsart (z.B. „Offenes Seminar", „Jobcoaching
         (AVGS)") bekommt eine eigene dezente Überschrift, in der Reihenfolge ihres ersten
         Auftretens. Seminare ohne gespeicherte Art (Altbestand) fallen unter „Weiterbildungen",
         Nicht-Seminar-Seiten unter „Weitere Seiten" (nur falls auch Seminare vorkommen). */
      function heading(text) {
        var h = document.createElement('li');
        h.className = 'merkliste-group';
        h.setAttribute('role', 'presentation');
        h.textContent = text;
        listEl.appendChild(h);
      }
      var groups = [], byKey = {}, pages = [];
      function bucket(key) {
        if (!byKey[key]) { byKey[key] = { key: key, items: [] }; groups.push(byKey[key]); }
        return byKey[key];
      }
      items.forEach(function (it) {
        if (it.kind === 'seminar') bucket((it.type || '').trim() || 'Weiterbildungen').items.push(it);
        else pages.push(it);
      });
      groups.forEach(function (g) {
        heading(g.key);
        g.items.forEach(function (it) { listEl.appendChild(buildItem(it)); });
      });
      if (pages.length) {
        if (groups.length) heading('Weitere Seiten');
        pages.forEach(function (it) { listEl.appendChild(buildItem(it)); });
      }
      if (emptyEl) emptyEl.hidden = items.length > 0;
    }

    function onOutside(e) { if (!wrap.contains(e.target)) close(); }
    function onKey(e) { if (e.key === 'Escape') { close(); trigger.focus(); } }
    function open() {
      /* Sichtbarkeit über CSS-visibility (kein rAF/hidden-Toggle — rAF fällt aus,
         wenn der Tab/Renderer im Hintergrund läuft → Panel bliebe unsichtbar). */
      wrap.classList.add('is-open');
      trigger.setAttribute('aria-expanded', 'true');
      document.addEventListener('click', onOutside, true);
      document.addEventListener('keydown', onKey);
    }
    function close() {
      if (!wrap.classList.contains('is-open')) return;
      wrap.classList.remove('is-open');
      trigger.setAttribute('aria-expanded', 'false');
      document.removeEventListener('click', onOutside, true);
      document.removeEventListener('keydown', onKey);
    }

    trigger.addEventListener('click', function (e) {
      e.preventDefault();
      if (wrap.classList.contains('is-open')) close(); else open();
    });
    wrap.querySelectorAll('[data-merkliste-close]').forEach(function (b) {
      b.addEventListener('click', function () { close(); });
    });
    listEl.addEventListener('click', function (e) {
      var rm = e.target.closest && e.target.closest('[data-merkliste-remove]');
      if (!rm) return;
      var id = rm.getAttribute('data-merkliste-remove');
      setMerk(getMerk().filter(function (x) { return x.id !== id; }));
    });

    document.addEventListener('ifmera:merkliste-change', function () { render(); refreshMerkToggles(); });
    render();
  }

  /* Kontaktdaten-Prefill: füllt leere Name/E-Mail/Telefon-Felder aus zuvor selbst
     eingegebenen Werten (nur in <form>s). */
  function contactKeyFor(el) {
    var ac = (el.getAttribute('autocomplete') || '').toLowerCase();
    var nm = (el.name || '').toLowerCase();
    var ty = (el.type || '').toLowerCase();
    if (ty === 'email' || ac.indexOf('email') > -1 || nm.indexOf('mail') > -1) return 'email';
    if (ty === 'tel' || ac.indexOf('tel') > -1 || nm.indexOf('tel') > -1 || nm.indexOf('phone') > -1) return 'tel';
    if (ac === 'name' || ac.indexOf('given-name') > -1 || ac.indexOf('family-name') > -1 || nm.indexOf('name') > -1) return 'name';
    return null;
  }
  function initContactPrefill(scope) {
    var data = readJSON(KEY_CONTACT, {}) || {};
    (scope || document).querySelectorAll('form input').forEach(function (el) {
      var key = contactKeyFor(el);
      if (!key) return;
      if (!el.value && data[key]) el.value = data[key]; /* nur LEERE Felder vorbelegen */
      if (el.getAttribute('data-contact-init') === '1') return;
      el.setAttribute('data-contact-init', '1');
      el.addEventListener('change', function () {
        var v = (el.value || '').trim();
        if (!v) return;
        var d = readJSON(KEY_CONTACT, {}) || {};
        d[key] = v;
        writeJSON(KEY_CONTACT, d);
      });
    });
  }

  /* UI-Präferenzen: gewähltes Info-Bar-Format merken + beim nächsten Besuch wiederherstellen
     (rein über aktive Tab-Auswahl). Zusätzlich generischer [data-pref-key]-Hook. */
  function initUiPrefs(scope) {
    var root = scope || document;
    var ui = readJSON(KEY_UI, {}) || {};
    var tabs = root.querySelectorAll('.info-tab-radio');
    if (tabs.length) {
      if (ui.format) {
        var saved = root.querySelector('#' + (window.CSS && CSS.escape ? CSS.escape(ui.format) : ui.format));
        if (saved && saved.classList.contains('info-tab-radio')) saved.checked = true;
      }
      tabs.forEach(function (r) {
        if (r.getAttribute('data-ui-init') === '1') return;
        r.setAttribute('data-ui-init', '1');
        r.addEventListener('change', function () {
          if (!r.checked || !r.id) return;
          var d = readJSON(KEY_UI, {}) || {};
          d.format = r.id;
          writeJSON(KEY_UI, d);
        });
      });
    }
    root.querySelectorAll('[data-pref-key]').forEach(function (el) {
      if (el.getAttribute('data-ui-init') === '1') return;
      el.setAttribute('data-ui-init', '1');
      var k = el.getAttribute('data-pref-key');
      var d0 = readJSON(KEY_UI, {}) || {};
      if (k in d0) {
        if (el.type === 'checkbox' || el.type === 'radio') el.checked = !!d0[k];
        else el.value = d0[k];
      }
      el.addEventListener('change', function () {
        var d = readJSON(KEY_UI, {}) || {};
        d[k] = (el.type === 'checkbox' || el.type === 'radio') ? el.checked : el.value;
        writeJSON(KEY_UI, d);
      });
    });
  }

  /* Zuletzt angesehen + Vergleich: Storage + API. „recent“ wird nur bei aktiver
     Handlung gefüllt (z. B. beim Merken eines Kurses, s. initMerkliste, oder über
     [data-recent-log]-Elemente). Eine sichtbare „Zuletzt angesehen“-/Vergleichs-UI
     ist ein Folge-Schritt, sobald es mehrere Kursseiten gibt. */
  function recordRecent(id, title) {
    if (!id) return;
    var list = readJSON(KEY_RECENT, []); if (!Array.isArray(list)) list = [];
    list = list.filter(function (x) { return x && x.id !== id; });
    list.unshift({ id: id, title: title || id, ts: new Date().toISOString() });
    if (list.length > RECENT_MAX) list = list.slice(0, RECENT_MAX);
    writeJSON(KEY_RECENT, list);
  }
  function initRecentLogging(scope) {
    (scope || document).querySelectorAll('[data-recent-log]').forEach(function (el) {
      if (el.getAttribute('data-recent-init') === '1') return;
      el.setAttribute('data-recent-init', '1');
      el.addEventListener('click', function () {
        recordRecent(el.getAttribute('data-course-id') || '', el.getAttribute('data-course-title') || '');
      });
    });
  }
  function compareList() { var a = readJSON(KEY_COMPARE, []); return Array.isArray(a) ? a : []; }
  function compareSet(a) { writeJSON(KEY_COMPARE, a); }

  /* „Komfort-Daten löschen“ — leert die funktionalen Stores (NICHT den Consent-State). */
  function clearFunctionalData(btn) {
    [KEY_MERK, KEY_CONTACT, KEY_RECENT, KEY_COMPARE, KEY_UI].forEach(lsDel);
    emitMerkChange(); /* Panel/Badge neu rendern + alle Toggle-Buttons zurücksetzen */
    if (btn) {
      var old = btn.textContent;
      btn.textContent = 'Gelöscht ✓';
      btn.disabled = true;
      setTimeout(function () { btn.textContent = old; btn.disabled = false; }, 2000);
    }
  }

  /* ───────────────────────── Boot ───────────────────────── */
  function initPrivacyPrefs(scope) {
    /* Komfortfunktionen laufen immer (einwilligungsfrei). */
    initMerkliste(scope);
    initMerklistePanel();
    initContactPrefill(scope);
    initUiPrefs(scope);
    initRecentLogging(scope);

    /* Bereits erteilten Consent anwenden (Tags scharf schalten / Embeds laden). */
    var c = getConsent();
    if (c) applyConsent(c);

    /* Banner nur für echte Besucher + interaktive KI-Agenten (Flag aus index.php,
       NICHT für erkannte Crawler) und nur, solange keine Wahl getroffen wurde. */
    if (window.__ifmEnablePrefs && !c) showBanner();
  }

  /* Öffentliche API (z. B. für künftige Merkliste-/Vergleichs-Widgets). */
  window.initPrivacyPrefs = initPrivacyPrefs;
  window.ifmeraOpenCookieSettings = openDialog; /* Andockpunkt des Footer-Triggers */
  window.ifmPrefs = {
    getConsent: getConsent,
    openSettings: openDialog,
    loadEmbeds: loadAllEmbeds,
    merkliste: {
      get: getMerk,
      has: merkHas,
      init: initMerkliste, /* Andockpunkt: Merken-Buttons in nachgeladenem Markup (z.B. Such-AJAX) binden */
      refresh: refreshMerkToggles,
      add: function (id, title, url) {
        var l = getMerk();
        if (merkIndex(l, id) === -1) {
          l.push({ id: id, title: title || id, url: url || '', ts: new Date().toISOString() });
          setMerk(l);
        }
      },
      remove: function (id) { setMerk(getMerk().filter(function (x) { return x.id !== id; })); }
    },
    recent: { get: function () { return readJSON(KEY_RECENT, []); }, record: recordRecent },
    compare: {
      get: compareList,
      has: function (id) { return compareList().indexOf(id) !== -1; },
      add: function (id) { var l = compareList(); if (l.indexOf(id) === -1) { l.push(id); compareSet(l); } },
      remove: function (id) { compareSet(compareList().filter(function (x) { return x !== id; })); }
    },
    contact: { get: function () { return readJSON(KEY_CONTACT, {}); }, clear: function () { lsDel(KEY_CONTACT); } },
    clearFunctionalData: function () { clearFunctionalData(null); }
  };

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', function () { initPrivacyPrefs(); });
  } else {
    initPrivacyPrefs();
  }
})();

;/* ===== JS Block 17: Termine → Buchung Handoff =====
   Gehört zur Termine-Sektion: übergibt den im Sidebar „Mein Seminar" gewählten
   Termin (Datum/Format/Ort/Preis/Teilnehmer) per URL-Parametern an die
   Buchungsseite. Reiner Navigations-Trigger — keine Booking-Page-Logik hier. */
(function () {
  var ctas = document.querySelectorAll('.sidebar-cta');
  if (!ctas.length) return;
  function buildUrl(a) {
    var card = document.querySelector('.termin-card.selected') || document.querySelector('.termin-card');
    var slider = document.getElementById('participants-slider');
    var p = new URLSearchParams();
    // CMS-Abweichung (2026-06-10, bei Asset-Sync erhalten!): Kurs-Permalink/-Titel kommen vom
    // CMS als data-Attribute der Sidebar (Blocks\Termine); Testseiten-Werte nur als Fallback.
    var sb = document.querySelector('.termine-sidebar');
    // CMS-Abweichung (2026-06-25, bei Asset-Sync erhalten!): kontakt-Modus (Blocks\Termine ctaMode)
    // → statt Buchung ins Kontaktformular; Titel→produkt + gewählter Termin→nachricht; Schritt
    // #kontaktdaten umgeht den Beratungs-Kalender. base = PHP-seitig cms_url('/kontakt/') (lang-/basis-sicher).
    if (sb && sb.dataset.ctaMode === 'kontakt') {
      var kbase = (sb.dataset.contactUrl || (a && a.getAttribute('href')) || '/kontakt/').split('#')[0].split('?')[0];
      var kp = new URLSearchParams();
      kp.set('bereich', sb.dataset.contactBereich || 'gefoerderte-weiterbildung');
      var ktitle = sb.dataset.courseTitle || '';
      if (ktitle) kp.set('produkt', ktitle);
      var kmsg = 'Interesse an „' + (ktitle || 'diesem Angebot') + '“';
      if (card) {
        var kort = card.dataset.type === 'online' ? 'Live Online' : (card.dataset.locationLabel || '');
        if (card.dataset.date) kmsg += ' – Wunschtermin: ' + card.dataset.date + (kort ? ' (' + kort + ')' : '');
      }
      kp.set('nachricht', kmsg + '.');
      return kbase + '?' + kp.toString() + '#kontaktdaten';
    }
    p.set('course', (sb && sb.dataset.course) || 'csr-nachhaltigkeitsmanagement');
    p.set('courseTitle', (sb && sb.dataset.courseTitle) || 'CSR und Nachhaltigkeitsmanagement');
    if (card) {
      var ds = card.dataset;
      p.set('dateIso', ds.dateIso || '');
      p.set('date', ds.date || '');
      p.set('format', ds.type === 'online' ? 'online' : 'praesenz');
      p.set('location', ds.type === 'online' ? 'Live Online' : (ds.locationLabel || ''));
      p.set('country', ds.country || 'de');
      p.set('price', String(parseFloat((ds.price || '0').replace(/\./g, '').replace(',', '.')) || 1400));
      if (ds.projektId) p.set('projekt', ds.projektId); // gewählte Termin-/Projekt-ID (→ Mail {$projekt_id})
      // CMS-Abweichung (2026-06-30, bei Asset-Sync erhalten!): Uhrzeit des GEWÄHLTEN Termins
      // (data-time, von/bis pro Termin) an den Buchungsfunnel weiterreichen → buchung.js seminarTime()
      // nutzt sie statt des festen Defaults '8:00–16:00'/'9:00–17:00'. Leer (Original-Testkarten /
      // Termin ohne von/bis) → kein Param → Funnel-Default greift (graceful).
      if (ds.time) p.set('time', ds.time);
    }
    if (slider) p.set('participants', slider.value || '1');
    // CMS-Abweichung (bei Asset-Sync erhalten!): Basis-URL = href des Buchungs-CTAs. Blocks\Termine
    // setzt sie absolut/basis-präfix-sicher (Default cms_url('/seminar-buchen/'), per bookingUrl
    // überschreibbar) → kein hartkodierter Dateiname, korrekt auch auf CMS-Unterpfaden.
    var base = (a && a.getAttribute('href')) || 'seminar-buchen.php';
    base = base.split('#')[0].split('?')[0];
    return base + '?' + p.toString();
  }
  Array.prototype.forEach.call(ctas, function (a) {
    a.addEventListener('click', function (e) { e.preventDefault(); window.location.href = buildUrl(a); });
  });
})();

;/* ===== JS Block 18: „Buchung fortsetzen“-Erinnerung =====
   Zeigt auf ALLEN Seiten AUSSER der Buchungsseite selbst eine schwebende
   Notch-Bubble unten links, sobald im localStorage (ifm.booking.v1) eine
   NICHT abgeschlossene Buchung liegt UND der Nutzer dort bereits Daten
   eingegeben hat. Klick auf „Weiter“ führt an den zuletzt erreichten Schritt
   zurück (state.step → Hash; ohne URL-Parameter, damit buchung.js den
   gespeicherten Termin behält und NICHT zurücksetzt). Nach 2× Wegklicken
   bleibt sie verborgen (resumeDismissed im Booking-State; buchung.js setzt
   den Zähler beim Start einer neuen Buchung — anderer Termin — zurück, sodass
   die Erinnerung dann wieder erscheint). Reine lokale, nutzer-ausgelöste
   Komfortfunktion → einwilligungsfrei (TDDDG §25 Abs. 2, wie ifm.contact). */
(function () {
  // Nicht auf der Buchungsseite selbst (man ist dort bereits im Funnel).
  // CMS: neue URL /seminar-buchen/ (+ Legacy weiterbildung-buchen.php).
  if (/(seminar-buchen|weiterbildung-buchen)/i.test(location.pathname)) return;

  var KEY = 'ifm.booking.v1';
  var DISMISS_LIMIT = 2;   // nach 2× Wegklicken nicht mehr zeigen
  var SHOW_DELAY = 6000;   // „nach kurzer Zeit“

  var STEP_LABELS = {
    kundentyp: 'Kundentyp', kontakt: 'Kontaktdaten', adresse: 'Rechnungsadresse',
    teilnehmer: 'Teilnehmer:innen', zusammenfassung: 'Zusammenfassung'
  };

  function read() { try { return JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) { return null; } }
  function write(s) { try { localStorage.setItem(KEY, JSON.stringify(s)); } catch (e) {} }

  var state = read();
  if (!state || state.bookingComplete) return;
  if ((state.resumeDismissed || 0) >= DISMISS_LIMIT) return;

  // Nur zeigen, wenn der Nutzer wirklich schon Daten eingegeben hat
  // (Kontaktfelder belegt oder Kontaktschritt bereits abgeschlossen).
  var c = state.contact || {};
  var hasData = !!(c.email || c.given || c.family) || (state.maxReached || 0) >= 2;
  if (!hasData) return;

  // Der erste Schritt (Kundentyp) wird beim Fortsetzen übersprungen: der
  // Kundentyp ist hier bereits gewählt (steckt im State, wird von buchung.js
  // restored) → Resume startet frühestens bei „kontakt". maxReached ist beim
  // Anzeigen der Bubble ≥ 1, also ist „kontakt" stets ein erlaubtes Ziel.
  var step = (state.step && STEP_LABELS[state.step]) ? state.step : 'kontakt';
  if (step === 'kundentyp') step = 'kontakt';
  var courseTitle = (state.termin && state.termin.courseTitle) || 'Ihre Weiterbildung';
  // ?resume=1 signalisiert buchung.js, die History mit den vorherigen Wizard-
  // Schritten aufzufüllen (sonst verlässt „Zurück" direkt die Seite). Der Parameter
  // löst KEINEN Termin-Reset aus (readTerminFromUrl prüft nur dateIso/price) und wird
  // beim Init wieder aus der URL entfernt.
  // CMS: Buchungs-URL aus dem gespeicherten State (buchung.js persistiert location.pathname →
  // basis-präfix-sicher); Fallback auf die saubere URL. Die Legacy-URL bleibt geroutet.
  var bookPath = state.bookPath || '/seminar-buchen/';
  var resumeUrl = bookPath + (bookPath.indexOf('?') >= 0 ? '&' : '?') + 'resume=1#' + step;

  // Persönliche Anrede aus den gespeicherten Kontaktdaten (gesiezt; spiegelt
  // personSalutation() aus buchung.js): „Frau/Herr Nachname", sonst Vorname,
  // sonst Nachname, sonst leer → Satz bleibt unpersönlich.
  function salutation() {
    var a = c.anrede, fam = (c.family || '').trim(), giv = (c.given || '').trim();
    if ((a === 'Herr' || a === 'Frau') && fam) return a + ' ' + fam;
    return giv || fam || '';
  }
  var greeting = salutation();

  function bumpDismiss() {
    var s = read(); if (!s) return;
    s.resumeDismissed = (s.resumeDismissed || 0) + 1;
    write(s);
  }

  function build() {
    var card = document.createElement('aside');
    card.className = 'ifm-resume-card';
    card.setAttribute('role', 'dialog');
    card.setAttribute('aria-label', 'Buchung fortsetzen');
    card.innerHTML =
      '<div class="ifm-resume-head">' +
        '<p class="ifm-resume-title">Buchung fortsetzen?</p>' +
        '<button type="button" class="ifm-resume-close" aria-label="Hinweis schließen">' +
          '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-x-solid"/></svg></button>' +
      '</div>' +
      '<p class="ifm-resume-text"><span class="ifm-resume-greeting"></span>Ihre Anmeldung zu <strong></strong> ist noch nicht abgeschlossen. ' +
        'Sie waren zuletzt bei „<span class="ifm-resume-step"></span>“.</p>' +
      '<a class="cta-main ifm-resume-cta" href="' + resumeUrl + '">' +
        '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-chevrons-right-solid"/></svg>Weiter zur Buchung</a>';
    // Texte injektionssicher setzen (kein innerHTML mit Storage-Werten)
    // Anrede mit Komma voranstellen → „Frau Mustermann, Ihre Anmeldung …"
    // (ohne Name bleibt der Satz „Ihre Anmeldung …").
    card.querySelector('.ifm-resume-greeting').textContent = greeting ? (greeting + ', ') : '';
    card.querySelector('.ifm-resume-text strong').textContent = courseTitle;
    card.querySelector('.ifm-resume-step').textContent = STEP_LABELS[step];

    function close() {
      card.classList.add('is-leaving');
      bumpDismiss();
      setTimeout(function () { card.remove(); }, 350);
    }
    card.querySelector('.ifm-resume-close').addEventListener('click', close);
    // Klick auf „Weiter“: der Nutzer setzt die Buchung fort → die Bubble hat ihren
    // Zweck erfüllt und darf bei Rückkehr zur Seminarseite nicht weiter nerven →
    // als erledigt markieren (resumeDismissed auf das Limit). Schreibt synchron in
    // den Storage vor der Link-Navigation.
    card.querySelector('.ifm-resume-cta').addEventListener('click', function () {
      var s = read(); if (s) { s.resumeDismissed = DISMISS_LIMIT; write(s); }
    });

    // Einblendung läuft per CSS-Mount-Animation (kein rAF → robust auch wenn
    // der Tab beim Anhängen noch nicht sichtbar/fokussiert ist).
    document.body.appendChild(card);
  }

  setTimeout(function () {
    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', build);
    else build();
  }, SHOW_DELAY);
})();

;/* ===== JS Block 19: KI-Bild-Kennzeichnung — Auto-Inject =====
   Es genügt überall die Klasse `ki-disclaimer` — die Info-Badge + Tooltip werden
   automatisch eingesetzt. Zwei Fälle, EINE Logik:
   • `.ki-disclaimer` an einem <img> → der <img> kann keine Kinder tragen (ersetztes/
     leeres Element), also wird er in `<span class="ki-disclaimer-wrap">` gefasst und
     die Badge dort eingesetzt; die echte Bildbreite kommt als --ki-img-w (s.u.).
   • `.ki-disclaimer` an einem CONTAINER (z.B. .hero, .card-visual — dort ist das <img>
     absolut positioniert und darf NICHT umwickelt werden) → die Badge wird direkt in
     den (ohnehin positionierten) Container injiziert, eine Ebene über dem Bild.
   Bereits vorhandenes (hand-geschriebenes) Badge-Markup wird respektiert (Guard) →
   kein Doppel-Icon. CSS-First-Ausnahme (ein <img> kann kein CSS-Overlay tragen).
   Tooltip läuft per Delegation (Block 13) → injizierte Badges funktionieren ohne Re-Init. */
(function () {
  var TIP = 'Dieses Bild wurde mit <b>künstlicher<br>Intelligenz&nbsp;(KI)</b> erstellt.';
  var ARIA = 'Hinweis: Dieses Bild wurde mit künstlicher Intelligenz (KI) erstellt.';

  function makeBadge() {
    var btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'ki-disclaimer-badge';
    btn.setAttribute('aria-label', ARIA);
    btn.setAttribute('data-tooltip', TIP);
    // Betreiberwunsch 2026-06-19: statt des Info-„i" das Kürzel „KI" als Badge-Text.
    btn.innerHTML = '<span class="ki-disclaimer-badge-text" aria-hidden="true">KI</span>';
    return btn;
  }

  // Echte Bildbreite als CSS-Var → Badge-Größe (8 % der Breite, gecappt).
  // Container-Query scheidet beim Wrapper aus: ein content-breiter inline-block kann
  // kein Size-Container sein (kollabiert auf 0). ResizeObserver hält den Wert bei
  // responsiven (max-width:100%) Bildern aktuell.
  function trackWidth(img, wrap) {
    var setW = function () {
      var w = img.clientWidth || img.naturalWidth || 0;
      if (w) wrap.style.setProperty('--ki-img-w', w + 'px');
    };
    setW();
    if (!img.complete) img.addEventListener('load', setW, { once: true });
    if (typeof ResizeObserver === 'function') {
      try { new ResizeObserver(setW).observe(img); } catch (e) {}
    }
  }

  function enhance(el) {
    if (el.dataset.kiDone) return;
    el.dataset.kiDone = '1';

    var host;
    if (el.tagName === 'IMG') {
      if (!el.parentNode) return;
      var wrap = document.createElement('span');
      wrap.className = 'ki-disclaimer-wrap';
      el.parentNode.insertBefore(wrap, el);
      wrap.appendChild(el);
      trackWidth(el, wrap);
      host = wrap;
    } else {
      // Schon ein positionierter Container → Badge eine Ebene über dem Bild einsetzen.
      // (Größe via Container-Query: .ki-disclaimer:not(img) { container-type: inline-size })
      host = el;
    }

    // Nicht doppelt: bereits vorhandenes manuelles Badge-Markup bleibt unangetastet.
    if (!host.querySelector(':scope > .ki-disclaimer-badge')) {
      host.appendChild(makeBadge());
    }
  }

  function run(scope) {
    (scope || document).querySelectorAll('.ki-disclaimer:not([data-ki-done])')
      .forEach(enhance);
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', function () { run(); });
  } else {
    run();
  }
  // Andockpunkt, falls später Inhalte nachgeladen werden (z.B. CMS-AJAX).
  window.initKiDisclaimer = run;
})();

/* JS Block 19 — Mega-Suche (Block KursSuche): Live-Filterung OHNE Button, Autovervollständigung,
   URL-Sync, Merken auf den Ergebniskarten. CMS-Abweichung.
   (Die frühere localStorage-Filterspeicherung wurde auf Betreiberwunsch 2026-06-17 entfernt —
    Filter starten bei jedem Aufruf leer; geteilte URLs mit Query-Params bleiben maßgeblich.) */
(function () {
  function debounce(fn, ms) { var t; return function () { var a = arguments, c = this; clearTimeout(t); t = setTimeout(function () { fn.apply(c, a); }, ms); }; }
  // Trefferzahl + aktuell angezeigter Bereich (z.B. „21–40 von 513 Treffer").
  function ksCountLabel(total, pg, pp, cnt) {
    if (total <= 0) return '0 Treffer';
    if (total === 1) return '1 Treffer';
    var tot = total.toLocaleString('de-DE');
    if (cnt <= 0) return tot + ' Treffer';
    var from = (pg - 1) * pp + 1, to = from + cnt - 1;
    return from.toLocaleString('de-DE') + '–' + to.toLocaleString('de-DE') + ' von ' + tot + ' Treffer';
  }

  function initKurssuche(section) {
    if (section.dataset.ksInit === '1') return;
    section.dataset.ksInit = '1';
    // „Allgemeine Seiten"-Modus: kein AJAX-Hijack — die native GET-Suche lädt die Seite neu (behält ?seiten=1).
    // Nur den „x"-Leeren-Button verdrahten: Feld leeren + Formular abschicken (zeigt wieder alle Seiten).
    if (section.getAttribute('data-ks-mode') === 'seiten') {
      // Seiten-Modus: LIVE-Suche per AJAX (wie die Kurssuche) statt Voll-Reload — sonst muss man Enter
      // drücken und die Seite springt durch das Neuladen nach oben. Tauscht nur den Inhalt von
      // .ks-pagehits--only, hält den Scroll, aktualisiert die URL per pushState (Back-Button/teilbar).
      var pForm = section.querySelector('[data-ks-form]');
      var pInput = pForm && pForm.querySelector('[data-ks-input]');
      var pClear = section.querySelector('[data-ks-clear]');
      var pBox = section.querySelector('.ks-pagehits--only');
      var pEndpoint = section.getAttribute('data-ks-endpoint') || '';
      // Ansichts-Konfiguration der „Allgemeinen Seiten" (versteckter Eltern-Pfad-Filter + Karten-/Listen-
      // Darstellung) aus den Section-Attributen → an den AJAX-Endpoint durchreichen, damit die Live-Suche
      // dieselbe Darstellung/Scope liefert wie das SSR (sonst springt sie beim Tippen von Karten auf Liste).
      var pCfg = '';
      ['parent', 'layout', 'cols', 'teaser', 'date', 'icon'].forEach(function (k) {
        var v = section.getAttribute('data-ks-pages-' + k);
        if (v != null && v !== '') pCfg += '&pages_' + k + '=' + encodeURIComponent(v);
      });
      var pPerPage = parseInt(section.getAttribute('data-ks-perpage') || '12', 10) || 12;
      // Aktuelle Seite (Pagination). Initial aus der URL (?seite=N), sonst 1.
      var pPage = 1;
      try { pPage = Math.max(1, parseInt(new URLSearchParams(location.search).get('seite') || '1', 10) || 1); } catch (e) {}
      var pCtrl = null, pTmr = null;
      var pReflect = function () { if (pClear && pInput) pClear.hidden = !pInput.value; };
      var pFetch = function (push) {
        var q = (pInput && pInput.value || '').trim();
        if (push) {
          var qs = '?seiten=1' + (q ? '&q=' + encodeURIComponent(q) : '') + (pPage > 1 ? '&seite=' + pPage : '');
          try { history.pushState({ ksq: q, kspage: pPage }, '', location.pathname + qs); } catch (e) {}
        }
        if (!pBox || !pEndpoint) return;
        if (pCtrl) pCtrl.abort();
        pCtrl = (typeof AbortController !== 'undefined') ? new AbortController() : null;
        pBox.setAttribute('aria-busy', 'true');
        fetch(pEndpoint + '?seiten=1&q=' + encodeURIComponent(q) + '&perPage=' + pPerPage + '&seite=' + pPage + pCfg, { signal: pCtrl ? pCtrl.signal : undefined, headers: { 'X-Requested-With': 'fetch' } })
          .then(function (r) { return r.json(); })
          .then(function (j) { if (j && j.ok && j.mode === 'seiten' && typeof j.html === 'string') pBox.innerHTML = j.html; pBox.setAttribute('aria-busy', 'false'); })
          .catch(function () { pBox.setAttribute('aria-busy', 'false'); });
      };
      if (pInput) {
        pReflect();
        // Tippen/Leeren = zurück auf Seite 1.
        pInput.addEventListener('input', function () { pReflect(); pPage = 1; clearTimeout(pTmr); pTmr = setTimeout(function () { pFetch(true); }, 250); });
      }
      if (pForm) pForm.addEventListener('submit', function (e) { e.preventDefault(); pPage = 1; clearTimeout(pTmr); pFetch(true); });
      if (pClear && pInput) pClear.addEventListener('click', function () { pInput.value = ''; pReflect(); pPage = 1; clearTimeout(pTmr); pFetch(true); });
      // Pagination: die data-ks-page-Buttons liegen im (per AJAX getauschten) pBox → am Section delegieren.
      section.addEventListener('click', function (e) {
        var btn = e.target.closest && e.target.closest('[data-ks-page]');
        if (!btn || !section.contains(btn)) return;
        e.preventDefault();
        var n = Math.max(1, parseInt(btn.getAttribute('data-ks-page') || '1', 10) || 1);
        if (n === pPage) return;
        pPage = n;
        pFetch(true);
        try { section.scrollIntoView({ behavior: 'smooth', block: 'start' }); } catch (e2) {}
      });
      window.addEventListener('popstate', function () {
        var u = new URLSearchParams(location.search);
        if (pInput) pInput.value = u.get('q') || '';
        pPage = Math.max(1, parseInt(u.get('seite') || '1', 10) || 1);
        pReflect(); pFetch(false);
      });
      if (pInput && pInput.hasAttribute('autofocus')) { try { pInput.focus(); } catch (e) {} }
      return;
    }
    var form = section.querySelector('[data-ks-form]');
    var grid = section.querySelector('[data-ks-grid]');
    var results = section.querySelector('[data-ks-results]');
    var countEl = section.querySelector('[data-ks-count]');
    var endpoint = section.getAttribute('data-ks-endpoint') || '';
    var perPage = parseInt(section.getAttribute('data-ks-perpage') || '12', 10) || 12;
    if (!form || !grid || !results || !endpoint) return;
    var page = 1, ctrl = null, applying = false;
    // Zufalls-Sortierung: ein Seed hält die zufällige Reihenfolge über die Pagination stabil. Initial aus
    // dem SSR-Attribut (vom KursSuche-Renderer erzeugt); wechselt bei frischer Auswahl von „Zufällig".
    var seed = section.getAttribute('data-ks-seed') || '';
    function genSeed() { return String(Math.floor(Math.random() * 1e9) + 1); }
    var sug = section.querySelector('[data-ks-suggest]');
    var qInput = form.querySelector('[data-ks-input]');
    var sortSel = form.querySelector('[data-ks-sort]');
    // „x"-Button im Suchfeld: zeigt sich sobald etwas eingegeben ist, leert das Feld + Suche.
    var clearBtn = section.querySelector('[data-ks-clear]');
    function reflectClear() { if (clearBtn) clearBtn.hidden = !(qInput && qInput.value); }
    if (clearBtn && qInput) {
      reflectClear();
      qInput.addEventListener('input', reflectClear);
      clearBtn.addEventListener('click', function () {
        qInput.value = ''; reflectClear(); hideSug(); qInput.focus(); page = 1; apply(true);
      });
    }
    var sugCtrl = null, sugIndex = -1;

    // Fokus beim Seitenaufruf ins Suchfeld, wenn der Block es vorsieht (autofocus-Attribut am Input, vom
    // KursSuche-Renderer gesetzt). Das HTML-autofocus greift nicht zuverlässig (z.B. bei programmatischer
    // Navigation / wenn der Tab nicht im Vordergrund ist) → hier explizit nachziehen.
    if (qInput && qInput.hasAttribute('autofocus')) { try { qInput.focus(); } catch (e) {} }

    function reflectPill(input) { var p = input.closest && input.closest('.ks-pill'); if (p) p.classList.toggle('is-on', input.checked); }
    // Select-Wert programmatisch setzen UND die Combobox-Anzeige aktualisieren (Change-Event), ohne
    // dabei eine zusätzliche Suche auszulösen (applying-Guard fängt den Form-Change-Handler ab).
    function setSelVal(sel, val) {
      if (!sel || sel.disabled) return;
      sel.value = val;
      applying = true;
      sel.dispatchEvent(new Event('change', { bubbles: true }));
      applying = false;
    }
    function updatePriceOut(range) {
      var out = section.querySelector('[data-ks-price-out]'); if (!out) return;
      var v = parseInt(range.value, 10);
      out.textContent = v.toLocaleString('de-DE') + ' €';
    }
    function serialize() {
      var usp = new URLSearchParams();
      new FormData(form).forEach(function (v, k) { if (String(v).trim() !== '') usp.append(k, v); });
      usp.set('perPage', String(perPage));
      if (page > 1) usp.set('seite', String(page));
      // Zufalls-Sortierung: Seed mitsenden (lazy erzeugen, falls noch keiner gesetzt ist) → stabile
      // Reihenfolge über die Pagination; bei jeder anderen Sortierung keinen Seed führen.
      if (sortSel && sortSel.value === 'zufall') { if (!seed) seed = genSeed(); usp.set('seed', seed); }
      else seed = '';
      return usp;
    }
    function setBusy(b) { results.setAttribute('aria-busy', b ? 'true' : 'false'); }

    /* Gefensterte Seitenliste — MUSS mit KursSuche::pageList() (PHP) identisch sein. 0 = „…". */
    function pageList(cur, pages) {
      var delta = 2, keep = [], i;
      for (i = 1; i <= pages; i++) {
        if (i === 1 || i === pages || (i >= cur - delta && i <= cur + delta)) keep.push(i);
      }
      var out = [], prev = 0;
      keep.forEach(function (n) {
        if (prev) { if (n - prev === 2) out.push(prev + 1); else if (n - prev > 2) out.push(0); }
        out.push(n); prev = n;
      });
      return out;
    }
    function rebuildPagination(total) {
      var old = results.querySelector('[data-ks-pagination]'); if (old) old.parentNode.removeChild(old);
      var pages = Math.ceil(total / perPage); if (pages < 2) return;
      var cur = Math.min(Math.max(1, page), pages);
      var nav = document.createElement('nav');
      nav.className = 'ks-pagination'; nav.setAttribute('aria-label', 'Seiten'); nav.setAttribute('data-ks-pagination', '');
      var html = '';
      // Pagination als <button> (nicht crawlbar) — SSOT mit KursSuche::pagination (SEO, 2026-06-27).
      if (cur > 1) html += '<button type="button" class="cta-secondary ks-page ks-page-prev" data-ks-page="' + (cur - 1) + '" aria-label="Vorherige Seite">Zurück</button>';
      html += '<div class="ks-pages">';
      pageList(cur, pages).forEach(function (it) {
        if (it === 0) html += '<span class="ks-page-ellipsis" aria-hidden="true">…</span>';
        else if (it === cur) html += '<span class="ks-page-num is-current" aria-current="page">' + cur + '</span>';
        else html += '<button type="button" class="ks-page-num" data-ks-page="' + it + '" aria-label="Seite ' + it + '">' + it + '</button>';
      });
      html += '</div>';
      if (cur < pages) html += '<button type="button" class="cta-secondary ks-page ks-page-next" data-ks-page="' + (cur + 1) + '" aria-label="Nächste Seite">Weiter</button>';
      nav.innerHTML = html; results.appendChild(nav);
    }

    function apply(push, skipUrl) {
      var usp = serialize();
      if (ctrl) ctrl.abort();
      ctrl = (typeof AbortController !== 'undefined') ? new AbortController() : null;
      setBusy(true);
      fetch(endpoint + '?' + usp.toString(), { signal: ctrl ? ctrl.signal : undefined, headers: { 'X-Requested-With': 'fetch' } })
        .then(function (r) { return r.json(); })
        .then(function (j) {
          if (!j || !j.ok) { setBusy(false); return; }
          grid.innerHTML = j.html || '';
          if (countEl) countEl.textContent = ksCountLabel(j.total || 0, j.page || page, j.perPage || perPage, (j.count != null ? j.count : 0));
          var empty = results.querySelector('[data-ks-empty]'); if (empty) empty.parentNode.removeChild(empty);
          if ((j.total || 0) === 0) {
            var d = document.createElement('div'); d.className = 'ks-empty'; d.setAttribute('data-ks-empty', '');
            d.innerHTML = '<p class="ks-empty-title">Keine Treffer für diese Kombination.</p><p class="ks-empty-hint">Versuchen Sie weniger Filter oder einen anderen Suchbegriff.</p><button type="button" class="cta-secondary" data-ks-reset>Filter zurücksetzen</button>';
            grid.parentNode.insertBefore(d, grid.nextSibling);
          }
          var ph = results.querySelector('.ks-pagehits'); if (ph) ph.parentNode.removeChild(ph);
          if (j.pagesHtml) { var pd = document.createElement('div'); pd.className = 'ks-pagehits'; pd.innerHTML = '<h3 class="ks-pagehits-head">Weitere Seiten</h3>' + j.pagesHtml; results.appendChild(pd); }
          rebuildPagination(j.total || 0);
          var ld = section.querySelector('[data-ks-jsonld]');
          if (j.jsonld) { var tmp = document.createElement('div'); tmp.innerHTML = j.jsonld; var s = tmp.querySelector('script'); if (s) { if (ld) ld.textContent = s.textContent; else { var ns = document.createElement('script'); ns.type = 'application/ld+json'; ns.setAttribute('data-ks-jsonld', ''); ns.textContent = s.textContent; section.appendChild(ns); } } }
          else if (ld) ld.textContent = '[]';
          if (window.ifmPrefs && window.ifmPrefs.merkliste && window.ifmPrefs.merkliste.init) window.ifmPrefs.merkliste.init(grid);
          setBusy(false);
          // skipUrl: Grid aktualisieren, aber die Adresszeile NICHT anfassen (für die parameterfreie
          // Referrer-Voreinstellung — der Link/die URL bleibt ohne ?typ=). Sonst URL wie gehabt syncen.
          if (!skipUrl) {
            var url = location.pathname + (usp.toString() ? '?' + usp.toString() : '');
            try { if (push) history.pushState(null, '', url); else history.replaceState(null, '', url); } catch (e) {}
          }
        })
        .catch(function (e) { if (e && e.name === 'AbortError') return; setBusy(false); });
    }
    var applyDebounced = debounce(function () { apply(false); }, 320);

    form.addEventListener('change', function (e) {
      if (applying) return; // programmatische Bulk-Sets (KI/Sync/Reset) lösen nur EINE Suche aus
      var t = e.target; if (!t) return;
      if (t.closest && t.closest('[data-ks-chat-panel]')) return; // Berater-Eingaben sind keine Suchfilter
      if (t.classList && t.classList.contains('ks-filter-cb')) return; // Mobil-Filter-Umschalter ist kein Suchfilter
      if (t.classList && t.classList.contains('ks-range')) return;
      if (t.type === 'checkbox') reflectPill(t);
      // Sortierung „Zufällig" gewählt → frischen Seed würfeln (neue Reihenfolge); andere Sortierung → kein Seed.
      if (t === sortSel) seed = (sortSel.value === 'zufall') ? genSeed() : '';
      page = 1; apply(true);
    });
    form.addEventListener('input', function (e) {
      var t = e.target; if (!t) return;
      if (t.classList && t.classList.contains('ks-range')) { updatePriceOut(t); page = 1; applyDebounced(); return; }
      if (t.matches && t.matches('[data-ks-input]')) { page = 1; applyDebounced(); suggestDebounced(t); }
    });
    form.addEventListener('submit', function (e) { e.preventDefault(); page = 1; apply(true); });

    section.addEventListener('click', function (e) {
      var pg = e.target.closest && e.target.closest('[data-ks-page]');
      if (pg) { e.preventDefault(); page = parseInt(pg.getAttribute('data-ks-page'), 10) || 1; apply(true); if (results.scrollIntoView) results.scrollIntoView({ behavior: 'smooth', block: 'start' }); return; }
      var rs = e.target.closest && e.target.closest('[data-ks-reset]');
      if (rs) { e.preventDefault(); resetFilters(); }
    });

    function resetFilters() {
      applying = true;
      form.querySelectorAll('input[type=checkbox]').forEach(function (c) { if (c.disabled) return; c.checked = false; reflectPill(c); });
      // Filter-Selects leeren; die Sortierung (kein Filter) NICHT leeren, sondern auf Standard (Relevanz) zurück.
      form.querySelectorAll('select').forEach(function (s) { if (s.disabled || s.hasAttribute('data-ks-sort')) return; s.value = ''; s.dispatchEvent(new Event('change', { bubbles: true })); });
      if (sortSel) { sortSel.value = sortSel.getAttribute('data-ks-default') || (sortSel.options[0] && sortSel.options[0].value) || ''; sortSel.dispatchEvent(new Event('change', { bubbles: true })); }
      seed = (sortSel && sortSel.value === 'zufall') ? genSeed() : ''; // Reset auf Standard → i.d.R. kein Seed (Zufall nur falls Default = Zufall)
      form.querySelectorAll('input[type=search], input[type=date], input[type=text]').forEach(function (i) { if (i.disabled) return; i.value = ''; if (i.type === 'date') i.dispatchEvent(new Event('change', { bubbles: true })); });
      applying = false;
      var range = form.querySelector('.ks-range'); if (range && !range.disabled) { range.value = range.max; updatePriceOut(range); }
      reflectClear();
      page = 1; hideSug(); apply(true);
    }

    // ── Autovervollständigung ──
    function hideSug() { if (sug) { sug.hidden = true; sug.innerHTML = ''; sugIndex = -1; if (qInput) qInput.setAttribute('aria-expanded', 'false'); } }
    function showSug(list) {
      if (!sug) return;
      if (!list || !list.length) { hideSug(); return; }
      sug.innerHTML = list.map(function (n, i) { return '<li class="ks-suggest-item" role="option" id="ks-sug-' + i + '" data-val="' + String(n).replace(/"/g, '&quot;') + '">' + String(n).replace(/</g, '&lt;') + '</li>'; }).join('');
      sug.hidden = false; sugIndex = -1; if (qInput) qInput.setAttribute('aria-expanded', 'true');
    }
    function fetchSug(q) {
      if (!sug || !qInput) return;
      if (!q || q.length < 2) { hideSug(); return; }
      if (sugCtrl) sugCtrl.abort();
      sugCtrl = (typeof AbortController !== 'undefined') ? new AbortController() : null;
      // Den AKTUELLEN Filterzustand mitsenden (serialize() = das ganze Filterformular) → die Vorschläge
      // beachten dieselben Filter wie die Trefferliste, sonst schlägt man Kurse vor, die rausgefiltert sind.
      var usp = serialize(); usp.set('suggest', '1'); usp.set('q', q); usp.delete('seite');
      fetch(endpoint + '?' + usp.toString(), { signal: sugCtrl ? sugCtrl.signal : undefined })
        .then(function (r) { return r.json(); }).then(function (j) { showSug(j && j.suggestions ? j.suggestions : []); }).catch(function () {});
    }
    var suggestDebounced = debounce(function (t) { fetchSug(t.value.trim()); }, 220);
    if (sug && qInput) {
      sug.addEventListener('mousedown', function (e) { var li = e.target.closest('[data-val]'); if (!li) return; e.preventDefault(); qInput.value = li.getAttribute('data-val'); hideSug(); page = 1; apply(true); });
      qInput.addEventListener('keydown', function (e) {
        if (sug.hidden) return;
        var items = sug.querySelectorAll('.ks-suggest-item');
        if (e.key === 'ArrowDown') { e.preventDefault(); sugIndex = Math.min(sugIndex + 1, items.length - 1); }
        else if (e.key === 'ArrowUp') { e.preventDefault(); sugIndex = Math.max(sugIndex - 1, 0); }
        else if (e.key === 'Enter') { if (sugIndex >= 0 && items[sugIndex]) { e.preventDefault(); qInput.value = items[sugIndex].getAttribute('data-val'); hideSug(); page = 1; apply(true); } return; }
        else if (e.key === 'Escape') { hideSug(); return; } else return;
        items.forEach(function (it, i) { it.classList.toggle('is-active', i === sugIndex); if (i === sugIndex) { qInput.setAttribute('aria-activedescendant', it.id); } });
      });
      qInput.addEventListener('blur', function () { setTimeout(hideSug, 150); });
    }

    function syncFromQuery(usp) {
      applying = true;
      form.querySelectorAll('input, select').forEach(function (el) {
        if (el.type === 'hidden' || el.disabled) return;
        if (el.type === 'checkbox') { el.checked = usp.getAll(el.name).indexOf(el.value) !== -1; reflectPill(el); }
        else if (el.tagName === 'SELECT' && el.multiple) {
          var vals = usp.getAll(el.name); // Mehrfachauswahl (kat[]/ort[]): alle passenden Optionen setzen
          Array.prototype.forEach.call(el.options, function (o) { o.selected = vals.indexOf(o.value) !== -1; });
          el.dispatchEvent(new Event('change', { bubbles: true }));
        }
        else if (el.name) {
          var v = usp.get(el.name); el.value = (v !== null) ? v : '';
          // SELECT → Combobox-Anzeige spiegeln; date → Zeitraum-Feld-Label aktualisieren
          // (applying-Guard verhindert eine zusätzliche Suche durch das Bubbling).
          if (el.tagName === 'SELECT' || el.type === 'date') el.dispatchEvent(new Event('change', { bubbles: true }));
        }
      });
      applying = false;
      // Zufalls-Seed aus der URL übernehmen (Zurück-Button) → dieselbe zufällige Reihenfolge wiederherstellen.
      seed = (sortSel && sortSel.value === 'zufall') ? (usp.get('seed') || '') : '';
      var range = form.querySelector('.ks-range');
      if (range) { var pm = usp.get('preis_max'); if (pm !== null) range.value = pm; updatePriceOut(range); }
      reflectClear();
    }
    window.addEventListener('popstate', function () { syncFromQuery(new URLSearchParams(location.search)); page = 1; apply(false); });

    // ── Art-Filter nach Herkunftsseite (Referrer) vorbelegen — OHNE ?art=-Parameter im Link (Betreiberwunsch
    // 2026-06-30). Kommt der Besucher von einer im Block konfigurierten Seite derselben Domain (data-ks-ref-type,
    // z.B. „/weiterbildung/offene-seminare/" → Art „Seminar"), wird der sichtbare, noch ungesetzte Art-Filter
    // automatisch gesetzt und einmal gesucht. Greift NICHT, wenn die URL bereits eine Art trägt (geteilter Link /
    // Zurück / Reload mit Filter) oder schon eine Art-Checkbox aktiv ist. Parameterfrei: apply(false, true)
    // filtert das Grid, lässt die Adresszeile aber unverändert (kein ?typ= im Link/in der URL). Folge: nach
    // einem Reload (Referrer = die Seite selbst) wird nicht mehr vorbelegt → es zeigt wieder alle Arten. ──
    (function () {
      var raw = section.getAttribute('data-ks-ref-type');
      if (!raw) return;
      var map; try { map = JSON.parse(raw); } catch (e) { return; }
      if (!map || !map.length) return;
      var hasTyp = false;
      try { new URLSearchParams(location.search).forEach(function (v, k) { if (k === 'typ' || k === 'typ[]') hasTyp = true; }); } catch (e) {}
      if (hasTyp) return; // Art schon in der URL → Besucherwahl/geteilter Link nicht überschreiben
      var boxes = form.querySelectorAll('input[name="typ[]"]');
      if (!boxes.length) return;
      var already = false; boxes.forEach(function (b) { if (b.checked) already = true; });
      if (already) return;
      var ref = '';
      try { var u = new URL(document.referrer); if (u.host !== location.host) return; ref = u.pathname.toLowerCase(); } catch (e) { return; }
      if (!ref) return; // kein (gleicher-Domain-)Referrer → alle Arten zeigen (Fallback)
      var typ = '';
      for (var i = 0; i < map.length; i++) {
        var frag = String((map[i] && map[i][0]) || '').toLowerCase();
        if (frag && ref.indexOf(frag) !== -1) { typ = String(map[i][1] || ''); break; } // erster Treffer gewinnt
      }
      if (!typ) return;
      var hit = null; boxes.forEach(function (b) { if (b.value === typ && !b.disabled) hit = b; });
      if (!hit) return;
      hit.checked = true; reflectPill(hit);
      page = 1; apply(false, true); // skipUrl=true → parameterfrei: Grid filtern, URL NICHT verändern
    })();

    // ── KI-Berater-Chat — reiner Beratungs-Dialog (empfiehlt Kurse). Ändert die Suche/Filter NICHT; der
    // aktuelle Filterstand wird der KI nur als Orientierung mitgegeben (kein Persona-Gate, kein „Übernehmen"-
    // Button mehr, Betreiberwunsch 2026-06-17). ──
    var chatUrl = section.getAttribute('data-ks-chat');
    var openBtn = section.querySelector('[data-ks-chat-open]');
    var panel = section.querySelector('[data-ks-chat-panel]');
    // Aktuellen Filterstand kompakt einsammeln → der KI als Orientierung mitgeben (sie ändert die Suche nicht).
    function collectFilters() {
      var f = {};
      if (qInput && qInput.value.trim()) f.q = qInput.value.trim();
      var typ = []; form.querySelectorAll('input[name="typ[]"]:checked').forEach(function (c) { typ.push(c.value); }); if (typ.length) f.typ = typ;
      var fund = []; form.querySelectorAll('input[name="funding[]"]:checked').forEach(function (c) { fund.push(c.value); }); if (fund.length) f.funding = fund;
      var kat = []; form.querySelectorAll('select[name="kat[]"] option:checked').forEach(function (o) { if (o.value) kat.push(o.getAttribute('data-permalink') || o.value); }); if (kat.length) f.kategorie = kat.join(', ');
      var ort = []; form.querySelectorAll('select[name="ort[]"] option:checked').forEach(function (o) { if (o.value) ort.push(o.value); }); if (ort.length) f.ort = ort.join(', ');
      var range = form.querySelector('.ks-range'); if (range && parseInt(range.value, 10) < parseInt(range.max, 10)) f.preis_max = parseInt(range.value, 10);
      var dauerSel = form.querySelector('select[name="dauer"]'); if (dauerSel && dauerSel.value) f.dauer = dauerSel.value;
      var von = form.querySelector('input[name="von"]'); if (von && von.value) f.von = von.value;
      var bis = form.querySelector('input[name="bis"]'); if (bis && bis.value) f.bis = bis.value;
      return f;
    }

    if (chatUrl && openBtn && panel) {
      var chatLog = panel.querySelector('[data-ks-chat-log]');
      var chatInput = panel.querySelector('[data-ks-chat-input]');
      var sendBtn = panel.querySelector('[data-ks-chat-send]');
      var chatForm = panel.querySelector('[data-ks-chat-form]');
      var hist = [], greeted = false, chatBusy = false, gateEl = null;
      // Datenschutz-Gate: der Berater sendet Eingaben an Google (Vertex AI) → er wird erst nach
      // Einwilligung in die Kategorie „KI-Beratung" gezeigt. Ohne Zustimmung erscheint statt des
      // Beraters ein Hinweis mit Link zu den Datenschutz-Einstellungen (Betreiberwunsch 2026-06-17).
      function kiConsent() {
        var c = (window.ifmPrefs && typeof window.ifmPrefs.getConsent === 'function') ? window.ifmPrefs.getConsent() : null;
        return !!(c && c.ki);
      }
      var cesc = function (s) { return String(s).replace(/[&<>]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;' }[c]; }); };
      function addMsg(role, html) { var d = document.createElement('div'); d.className = 'ks-chat-msg ks-chat-msg--' + role; d.innerHTML = html; chatLog.appendChild(d); chatLog.scrollTop = chatLog.scrollHeight; return d; }
      // Leichte Formatierung der KI-Antwort: escapen, **fett**, Aufzählungen (- / * / •) → <ul>, Zeilenumbrüche → <br>.
      // Nur eine kleine, sichere Tag-Allowlist wird in den ESCAPETEN Text injiziert (kein roher Modell-HTML).
      function fmtChat(s) {
        var esc = cesc(String(s || '')).replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
        var lines = esc.split('\n'), html = '', listBuf = [], paraBuf = [];
        function flushList() { if (listBuf.length) { html += '<ul class="ks-chat-ul">' + listBuf.join('') + '</ul>'; listBuf = []; } }
        function flushPara() { if (paraBuf.length) { html += '<p class="ks-chat-p">' + paraBuf.join('<br>') + '</p>'; paraBuf = []; } }
        function flushAll() { flushList(); flushPara(); }
        // Seminar-Kopf = beginnt mit <strong>, dessen Text NICHT mit ":" endet (Detail-Labels wie „Preis:" enden mit ":").
        // So wird jeder Kurs zu einem eigenen, klar abgetrennten Block — auch wenn mehrere Seminare aufgelistet werden.
        function isHead(c) { var m = c.match(/^\s*<strong>([\s\S]*?)<\/strong>/); return !!m && !/[:：]\s*$/.test(m[1]); }
        for (var i = 0; i < lines.length; i++) {
          var raw = lines[i];
          if (raw.trim() === '') { flushAll(); continue; }
          var bm = raw.match(/^\s*(?:[-*•])\s+([\s\S]*)$/);
          var content = bm ? bm[1] : raw;
          if (isHead(content)) { flushAll(); html += '<div class="ks-chat-seminar">' + content + '</div>'; }
          else if (bm) { flushPara(); listBuf.push('<li>' + content + '</li>'); }
          else { flushList(); paraBuf.push(raw); }
        }
        flushAll();
        return html;
      }
      // Klickbare Kurs-Chips mit Mehrwert: Art · ab <nächster Termin> · <Preis> (alle optional).
      function courseChips(courses) {
        return '<div class="ks-chat-courses">' + courses.map(function (c) {
          var meta = [c.art, c.naechster_termin ? 'ab ' + c.naechster_termin : '', c.preis].filter(Boolean).map(cesc).join(' · ');
          return '<a class="ks-chat-course" href="' + cesc(c.url) + '"><span class="ks-chat-course-name">' + cesc(c.name) + '</span>'
            + (meta ? '<span class="ks-chat-course-meta">' + meta + '</span>' : '') + '</a>';
        }).join('') + '</div>';
      }
      var STARTERS = ['Welche Kurse passen zu Projektmanagement?', 'Zeig mir Termine in Berlin', 'Welche Weiterbildungen sind förderbar?'];
      function renderGreeting() {
        if (greeted) return;
        greeted = true;
        addMsg('bot', 'Hallo! Ich bin die KI-Beratung der ifmera academy. Ich finde den passenden Kurs für Sie und kenne aktuelle Termine, Preise und Fördermöglichkeiten. Wonach suchen Sie?'
          + '<div class="ks-chat-starters">' + STARTERS.map(function (s) { return '<button type="button" class="ks-chat-starter">' + cesc(s) + '</button>'; }).join('') + '</div>');
      }
      // Einwilligungs-Hinweis statt des Beraters: erklärt die Datenübertragung an Google + verlinkt
      // die Datenschutz-Einstellungen, in denen der Nutzer „KI-Beratung" aktivieren kann.
      function showConsentGate() {
        if (chatForm) chatForm.hidden = true;
        // Etwaige bestehende Unterhaltung entfernen (z.B. bei Widerruf mitten in der Sitzung):
        // keine alten KI-Antworten sichtbar lassen + verhindern, dass bei erneuter Einwilligung
        // alte Historie wieder an Google gesendet wird. Frischer Start beim nächsten Öffnen.
        Array.prototype.forEach.call(chatLog.querySelectorAll('.ks-chat-msg'), function (n) { n.remove(); });
        hist = []; greeted = false;
        if (!gateEl) {
          gateEl = document.createElement('div');
          gateEl.className = 'ks-chat-gate';
          gateEl.innerHTML =
            '<p class="ks-chat-gate-text">Für den KI-Berater nutzen wir einen KI-Dienst von Google (Vertex AI). '
            + 'Ihre Eingaben werden dabei zur Beantwortung an Google übertragen – dabei können Daten in die USA '
            + 'übermittelt werden. Bitte stimmen Sie der Kategorie <strong>„KI-Beratung"</strong> zu, um den Berater zu nutzen.</p>'
            + '<button type="button" class="cta-main ks-chat-gate-btn">KI-Beratung aktivieren</button>'
            + '<p class="ks-chat-gate-hint">Sie können dies jederzeit über die Datenschutz-Einstellungen widerrufen. Die Kurssuche selbst funktioniert auch ohne Einwilligung uneingeschränkt.</p>';
          chatLog.appendChild(gateEl);
          var gb = gateEl.querySelector('.ks-chat-gate-btn');
          if (gb) gb.addEventListener('click', function () {
            if (typeof window.ifmeraOpenCookieSettings === 'function') window.ifmeraOpenCookieSettings();
            else document.dispatchEvent(new CustomEvent('ifmera:cookie-settings', { bubbles: true }));
          });
        }
        gateEl.hidden = false;
      }
      function clearConsentGate() { if (gateEl) { gateEl.remove(); gateEl = null; } if (chatForm) chatForm.hidden = false; }
      function showChat() { clearConsentGate(); renderGreeting(); if (chatInput) chatInput.focus(); }
      function openChat() {
        panel.hidden = false; openBtn.setAttribute('aria-expanded', 'true');
        if (!kiConsent()) { showConsentGate(); return; } // ohne Einwilligung: kein Berater, nur der Hinweis
        showChat();
      }
      function closeChat() { panel.hidden = true; openBtn.setAttribute('aria-expanded', 'false'); }
      openBtn.addEventListener('click', function () { panel.hidden ? openChat() : closeChat(); });
      // Live auf Einwilligungs-Änderungen reagieren (Dialog aus dem Gate geöffnet + gespeichert):
      // bei offenem Panel Gate ↔ Berater umschalten, ohne dass neu geladen werden muss.
      document.addEventListener('ifmera:consent-change', function () {
        if (panel.hidden) return;
        if (kiConsent()) showChat(); else showConsentGate();
      });
      var cClose = panel.querySelector('[data-ks-chat-close]'); if (cClose) cClose.addEventListener('click', closeChat);
      // Vorschlags-Chips in der Begrüßung: Klick füllt das Feld und schickt ab (gegen das „leere-Seite"-Problem).
      chatLog.addEventListener('click', function (e) { var b = e.target.closest && e.target.closest('.ks-chat-starter'); if (b) { chatInput.value = b.textContent; sendChat(); } });

      function sendChat() {
        if (chatBusy) return;
        if (!kiConsent()) { showConsentGate(); return; } // keine Übertragung an Google ohne Einwilligung
        var txt = chatInput.value.trim(); if (!txt) return;
        chatInput.value = '';
        hist.push({ role: 'user', content: txt }); addMsg('user', cesc(txt));
        var typing = addMsg('bot', '<em>…</em>'); chatBusy = true;
        fetch(chatUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages: hist, filters: collectFilters() }) })
          .then(function (r) { return r.json(); }).then(function (j) {
            typing.remove(); chatBusy = false;
            if (!j || !j.ok) { addMsg('bot', (j && j.error === 'rate-limited') ? 'Zu viele Anfragen — bitte kurz warten.' : 'Die Beratung ist gerade nicht verfügbar.'); return; }
            hist.push({ role: 'assistant', content: j.message || '' });
            var html = fmtChat(j.message || '');
            if (j.courses && j.courses.length) html += courseChips(j.courses);
            addMsg('bot', html);
          }).catch(function () { typing.remove(); chatBusy = false; addMsg('bot', 'Verbindungsfehler.'); });
      }
      if (sendBtn) sendBtn.addEventListener('click', sendChat);
      if (chatInput) chatInput.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); sendChat(); } });
    }

    var range0 = form.querySelector('.ks-range'); if (range0) updatePriceOut(range0);
  }

  function run(scope) { (scope || document).querySelectorAll('.cms-kurssuche').forEach(initKurssuche); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { run(); });
  else run();
  window.initKursSuche = run;
})();

;/* ===== JS Block 20: Timeline — Scroll-Einblendung (Stagger) + Fortschritts-Linie + Detail (CMS) ===== */
(function () {
  var progressRoots = []; // vertikale Timelines mit Fortschritts-Linie (eine geteilte Scroll-Schleife)

  function updateProgress(root) {
    var r = root.getBoundingClientRect();
    var vh = window.innerHeight || document.documentElement.clientHeight;
    var total = r.height || 1;
    // 0, solange die Timeline-Oberkante unter der Viewport-Mitte ist; 1, sobald die Unterkante sie passiert.
    var p = (vh * 0.5 - r.top) / total;
    p = p < 0 ? 0 : (p > 1 ? 1 : p);
    root.style.setProperty('--tl-progress', p.toFixed(4));
  }
  var progScheduled = false;
  function scheduleProgress() {
    if (progScheduled) return;
    progScheduled = true;
    requestAnimationFrame(function () { progScheduled = false; for (var i = 0; i < progressRoots.length; i++) updateProgress(progressRoots[i]); });
  }
  // Eintrag schließen: is-open weg + Maus-Folge-Inline-Styles aufräumen (verankert wieder).
  function closeEntry(el) {
    el.classList.remove('is-open');
    var t = el.querySelector('[data-tl-toggle]'); if (t) t.setAttribute('aria-expanded', 'false');
    if (el._tlUnfollow) el._tlUnfollow();
  }
  if (typeof window !== 'undefined') {
    window.addEventListener('scroll', function () { if (progressRoots.length) scheduleProgress(); }, { passive: true });
    window.addEventListener('resize', function () { if (progressRoots.length) scheduleProgress(); }, { passive: true });
    // Klick außerhalb schließt ein angepinntes Detail-Overlay (modal-artiges Verhalten); Esc auch.
    document.addEventListener('click', function (e) {
      var open = document.querySelectorAll('.cms-timeline-entry.is-open');
      for (var i = 0; i < open.length; i++) { if (!open[i].contains(e.target)) closeEntry(open[i]); }
    });
    document.addEventListener('keydown', function (e) {
      if (e.key !== 'Escape') return;
      document.querySelectorAll('.cms-timeline-entry.is-open').forEach(closeEntry);
    });
  }

  function initTimeline(root) {
    if (root.dataset.tlInit === '1') return; // idempotent (Doppel-Init / Re-Render-Schutz)
    root.dataset.tlInit = '1';

    var entries = Array.prototype.slice.call(root.querySelectorAll('.cms-timeline-entry'));

    // „Immer sichtbar"-Modus zeigt das Detail in-flow → kein Maus-Folgen / kein Aufklappen.
    var followable = !root.classList.contains('cms-timeline--detail-always');

    entries.forEach(function (el) {
      var toggle = el.querySelector('[data-tl-toggle]');
      var detail = el.querySelector('.tl-detail');

      // Detail-Panel folgt der Maus (Hover-Vorschau): position:fixed am Cursor, viewport-geklemmt;
      // pointer-events bleiben none (CSS) → der Eintrag behält sein :hover. Beim Anpinnen (Klick)
      // friert es ein und wird interaktiv (.is-open → pointer-events:auto). Direkt positioniert
      // (kein rAF) → robust; Panelgröße wird je Hover-Sitzung nur EINMAL gemessen (kein Layout-Thrash).
      if (detail && followable) {
        var fw = 0, fh = 0;
        var place = function (cx, cy) {
          var pad = 14, vw = window.innerWidth, vh = window.innerHeight;
          var x = cx + 18; if (x + fw + pad > vw) x = cx - fw - 18; if (x < pad) x = pad;
          var y = cy + 18; if (y + fh + pad > vh) y = vh - fh - pad; if (y < pad) y = pad;
          detail.style.left = x + 'px'; detail.style.top = y + 'px';
          detail.style.right = 'auto'; detail.style.bottom = 'auto'; detail.style.transform = 'none';
        };
        el._tlUnfollow = function () {
          detail.classList.remove('tl-following');
          detail.style.left = detail.style.top = detail.style.right = detail.style.bottom = detail.style.transform = '';
        };
        el.addEventListener('mousemove', function (e) {
          if (el.classList.contains('is-open')) return; // angepinnt → eingefroren, nicht folgen
          if (!detail.classList.contains('tl-following')) {
            detail.classList.add('tl-following');           // → position:fixed (CSS); jetzt messen
            fw = detail.offsetWidth; fh = detail.offsetHeight;
          }
          place(e.clientX, e.clientY);
        });
        el.addEventListener('mouseleave', function () {
          if (!el.classList.contains('is-open')) el._tlUnfollow();
        });
      }

      // Klick-Toggle (Touch/Tastatur/Klick) — pinnt das Detail offen; beim Schließen aufräumen.
      if (toggle) {
        toggle.addEventListener('click', function (e) {
          e.preventDefault();
          var open = el.classList.toggle('is-open');
          toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
          if (!open && el._tlUnfollow) el._tlUnfollow(); // geschlossen → Folge-Styles weg (verankert)
        });
      }
    });

    // Fortschritts-Linie (nur vertikal, wenn vorhanden) registrieren.
    if (root.querySelector('.tl-progress')) { progressRoots.push(root); updateProgress(root); }

    // Scroll-Einblendung. Bei reduzierter Bewegung / ohne IntersectionObserver: nichts „scharf"
    // schalten → Einträge bleiben sofort sichtbar (No-JS-/No-Motion-sicher).
    var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    if (reduce || typeof IntersectionObserver !== 'function') return;

    root.classList.add('tl-anim'); // ab jetzt sind noch nicht eingeblendete Einträge per CSS versteckt
    // Bereits (nahezu) sichtbare Einträge SOFORT (gestaffelt) einblenden → kein Aufflackern.
    var vh = window.innerHeight || document.documentElement.clientHeight, shown = 0;
    entries.forEach(function (el) {
      if (el.getBoundingClientRect().top < vh * 0.92) { el.style.transitionDelay = (shown * 90) + 'ms'; el.classList.add('is-revealed'); shown++; }
    });
    // Restliche per IO einblenden; gemeinsam eintreffende Einträge gestaffelt (Stagger).
    var io = new IntersectionObserver(function (obs) {
      var i = 0;
      obs.forEach(function (e) {
        if (e.isIntersecting) { e.target.style.transitionDelay = (i * 90) + 'ms'; e.target.classList.add('is-revealed'); io.unobserve(e.target); i++; }
      });
    }, { threshold: 0, rootMargin: '0px 0px -10% 0px' });
    entries.forEach(function (el) { if (!el.classList.contains('is-revealed')) io.observe(el); });
  }

  function run(scope) { (scope || document).querySelectorAll('.cms-timeline').forEach(initTimeline); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { run(); });
  else run();
  window.initTimeline = run; // Andockpunkt für CMS-AJAX-nachgeladene Inhalte
})();
;/* ===== JS Block 21: Teilen-Aktionen — „Seite drucken" (Share-Block) =====
   Der Drucken-Button des Share-Blocks trägt data-share-action="print" (Blocks\Share erkennt das
   href-Token #print). Klick → window.print() (Browser-Druckdialog → „Als PDF speichern"). Das
   Druck-Layout liefert print.css (@media print: Web-Chrome aus + konfigurierbarer Lauf-Kopf/-Fuß).
   Der „Als PDF / Exposé"-Button trägt data-share-action="export" + data-export-url (Blocks\Share, href-Token
   #export): href="#" → NICHT crawlbar (sonst crawlt Screaming Frog/Google je Seminar eine eigene Exposé-URL,
   alle noindex → Crawl-Verschwendung). Klick öffnet public/export.php in einem neuen Tab. SEO 2026-06-27.
   CMS-Abweichung — bei einem Asset-Resync aus test\design erhalten. */
(function () {
  document.addEventListener('click', function (e) {
    var t = e.target.closest ? e.target.closest('[data-share-action]') : null;
    if (!t) return;
    var act = t.getAttribute('data-share-action');
    if (act === 'print') { e.preventDefault(); window.print(); }
    else if (act === 'export') {
      e.preventDefault();
      var u = t.getAttribute('data-export-url');
      if (u) window.open(u, '_blank', 'noopener');
    }
  });
})();
;/* ===== JS Block 22: Mehrseitige CMS-Formulare (Formular-Editor, Blocks\Form Schritt-Modus) =====
   Selbst-erkennend über form[data-form-steps] (läuft auf /formular/<slug>/ UND auf normalen
   CMS-Seiten mit eingebettetem Schritt-Formular). Übernimmt: Schritt-Navigation (Zurück/Weiter)
   mit Pflichtfeld-Validierung je Schritt, Fortschrittsanzeige, Absenden als multipart-FormData
   (inkl. Datei-Uploads) an data-endpoint (/api/formular-submit.php), Danke-Schritt + Konfetti
   (wie der Kontakt-Funnel; data-confetti="hover,done"), Zeitfalle (_t = verstrichene ms) und
   die Vorbefüllung gleichnamiger Felder aus URL-Parametern (?feld=wert — Formular-Start-Block).
   Im Editor-Canvas läuft main.js nicht (dort stapelt cms-form--steps-editor alle Schritte).
   CMS-eigen — bei einem Asset-Resync aus test\design erhalten. */
(function () {
  var prefersReduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;

  /* Konfetti (verbatim aus kontakt.js/buchung.js — .confetti-piece-CSS liegt in cms-blocks.css) */
  var CONFETTI_COLORS = ['#FF7758', '#E6FF2A', '#00444A', '#1f5b60', '#FAF5EB'];
  function confettiBurst(target, count, opts) {
    if (prefersReduced) return;
    opts = opts || {};
    var rect;
    if (opts.viewport) rect = { left: 0, top: 0, width: window.innerWidth, height: window.innerHeight };
    else { if (!target) return; rect = target.getBoundingClientRect(); if (!rect.width) return; }
    var spreadX = opts.spreadX || 120;
    var cx = rect.left + rect.width / 2;
    var spawnLeft = opts.center ? cx : rect.left;
    var spawnW = opts.center ? 0 : rect.width;
    var originY = rect.top + rect.height * (opts.originY != null ? opts.originY : 0.35);
    var pieces = [];
    for (var i = 0; i < count; i++) {
      var p = document.createElement('span');
      p.className = 'confetti-piece';
      p.style.left = (spawnLeft + Math.random() * spawnW).toFixed(0) + 'px';
      p.style.top = originY.toFixed(0) + 'px';
      p.style.background = CONFETTI_COLORS[i % CONFETTI_COLORS.length];
      if (Math.random() > 0.5) p.style.borderRadius = '50%';
      var peak = -(140 + Math.random() * 180);
      var end = peak + (80 + Math.random() * 160);
      p.style.setProperty('--cf-x', ((Math.random() * 2 - 1) * spreadX).toFixed(0) + 'px');
      p.style.setProperty('--cf-peak', peak.toFixed(0) + 'px');
      p.style.setProperty('--cf-end', end.toFixed(0) + 'px');
      p.style.setProperty('--cf-rot', (Math.random() * 720 + 180).toFixed(0) + 'deg');
      p.style.setProperty('--cf-dur', (1.6 + Math.random() * 1.1).toFixed(2) + 's');
      p.style.setProperty('--cf-delay', (Math.random() * 0.12).toFixed(2) + 's');
      document.body.appendChild(p);
      pieces.push(p);
    }
    setTimeout(function () { pieces.forEach(function (p) { p.remove(); }); }, 3600);
  }

  function initFormSteps(form) {
    if (!form || form.getAttribute('data-fsteps-init')) return;
    if (form.classList.contains('cms-form--steps-editor')) return; // Editor-Canvas: gestapelt, inert
    form.setAttribute('data-fsteps-init', '1');

    var steps = [].slice.call(form.querySelectorAll('[data-fstep]:not([data-fstep-thanks])'));
    var thanks = form.querySelector('[data-fstep-thanks]');
    var dots = [].slice.call(form.querySelectorAll('[data-fstep-dot]'));
    var backBtn = form.querySelector('[data-fstep-back]');
    var nextBtn = form.querySelector('[data-fstep-next]');
    var submitBtn = form.querySelector('[data-fstep-submit]');
    var submitLbl = form.querySelector('[data-fstep-submit-label]');
    var msg = form.querySelector('.cms-form-msg');
    var tInput = form.querySelector('input[name="_t"]');
    if (!steps.length || !submitBtn) return;

    var confetti = (form.getAttribute('data-confetti') || '').split(',');
    var cfHover = confetti.indexOf('hover') >= 0;
    var cfDone = confetti.indexOf('done') >= 0;
    var cur = 0, submitting = false, done = false;
    var t0 = Date.now();
    var submitText = submitLbl ? submitLbl.textContent : 'Absenden';

    function show(i, scroll) {
      cur = Math.max(0, Math.min(i, steps.length - 1));
      steps.forEach(function (s, n) { s.classList.toggle('is-active', n === cur); });
      dots.forEach(function (d, n) {
        d.classList.toggle('is-current', n === cur);
        d.classList.toggle('is-done', n < cur);
      });
      var last = cur === steps.length - 1;
      if (backBtn) backBtn.hidden = cur === 0;
      if (nextBtn) nextBtn.hidden = last;
      submitBtn.hidden = !last;
      if (scroll) {
        var top = form.getBoundingClientRect().top;
        if (top < 0 || top > 120) form.scrollIntoView({ behavior: prefersReduced ? 'auto' : 'smooth', block: 'start' });
      }
    }

    // Pflichtfelder des AKTIVEN Schritts validieren — mit sichtbarer Markierung wie im
    // Kontakt-Funnel (kontakt.js validateStep): rote Meldung unter dem Feld (.form-field-error),
    // has-error + aria-invalid (→ Highlight-Ring aus main.css) + Shake. NICHT nur die native
    // reportValidity-Blase (die verschwindet sofort und markiert nichts — Betreiberbug 2026-07-02).
    function ensureErrorEl(field) {
      var err = field.querySelector(':scope > .form-field-error');
      if (!err) {
        err = document.createElement('small');
        err.className = 'form-field-error';
        err.setAttribute('role', 'alert');
        err.hidden = true;
        err.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><use href="#icon-info-circle"/></svg><span></span>';
        field.appendChild(err);
      }
      return err;
    }
    function showError(field, msgText) {
      if (!field) return;
      var err = ensureErrorEl(field);
      if (msgText) {
        err.querySelector('span').textContent = msgText;
        err.hidden = false;
        field.classList.add('has-error');
        var ctl = field.querySelector('.form-field-control, .form-field-fieldset-body') || field;
        ctl.classList.remove('is-shaking'); void ctl.offsetWidth; ctl.classList.add('is-shaking');
      } else {
        err.hidden = true;
        field.classList.remove('has-error');
      }
    }
    document.addEventListener('animationend', function (e) {
      if (e.target.classList && e.target.classList.contains('is-shaking')) e.target.classList.remove('is-shaking');
    });
    function msgFor(el) {
      if (el.validity.valueMissing) {
        if (el.type === 'checkbox') return 'Bitte bestätigen, um fortzufahren.';
        if (el.type === 'radio') return 'Bitte eine Auswahl treffen.';
        return 'Bitte ausfüllen.';
      }
      if (el.validity.typeMismatch && el.type === 'email') return 'Bitte eine gültige E-Mail-Adresse eingeben.';
      if (el.validity.patternMismatch) return el.getAttribute('data-error-pattern') || 'Bitte das Format prüfen.';
      if (el.validity.tooShort) return 'Mindestens ' + el.minLength + ' Zeichen.';
      return 'Bitte Eingabe prüfen.';
    }
    function validateStep() {
      var stepEl = steps[cur];
      var controls = [].slice.call(stepEl.querySelectorAll('input, select, textarea')).filter(function (el) {
        if (el.disabled || el.type === 'button' || el.type === 'submit' || !el.willValidate) return false;
        if (el.closest('.cms-hp')) return false;                           // Honeypot ignorieren
        // Unsichtbare Felder überspringen — AUSSER Radios (unsichtbare native Inputs im
        // Custom-Look) und den sr-only Combobox-Selects (sonst nie geprüft).
        if (el.offsetParent === null && el.type !== 'radio' && !el.closest('.form-field-combobox')) return false;
        return true;
      });
      var firstInvalid = null, seen = [];
      controls.forEach(function (el) {
        var field = el.closest('.form-field, .form-field-fieldset');
        if (!el.checkValidity()) {
          el.setAttribute('aria-invalid', 'true');                         // main.css-Highlight-Ring
          if (field && seen.indexOf(field) === -1) { showError(field, msgFor(el)); seen.push(field); }
          if (!firstInvalid) firstInvalid = el;
        } else {
          el.removeAttribute('aria-invalid');
          if (field && seen.indexOf(field) === -1) showError(field, '');
        }
      });
      if (firstInvalid) {
        var f = firstInvalid.closest('.form-field, .form-field-fieldset');
        var fe = f ? (f.querySelector('.form-field-combobox-trigger') || firstInvalid) : firstInvalid;
        try { fe.focus({ preventScroll: true }); } catch (e2) {}
        var target = f || fe;
        if (target && target.scrollIntoView) {
          var r = target.getBoundingClientRect();
          if (r.top < 0 || r.bottom > (window.innerHeight || 0)) target.scrollIntoView({ behavior: prefersReduced ? 'auto' : 'smooth', block: 'center' });
        }
        return false;
      }
      return true;
    }
    // Fehler live zurücknehmen, sobald das Feld gültig ausgefüllt wird: Meldung + has-error
    // + aria-invalid (der Highlight-Ring hängt daran — der initFormFields-Cleaner greift hier
    // nicht zuverlässig, daher selbst aufräumen).
    function clearFieldError(e) {
      var el = e.target;
      if (!el || !el.checkValidity || !el.closest) return;
      if (!el.checkValidity()) return;
      el.removeAttribute('aria-invalid');
      var field = el.closest('.form-field, .form-field-fieldset');
      if (field && field.classList.contains('has-error')) showError(field, '');
    }
    form.addEventListener('input', clearFieldError, true);
    form.addEventListener('change', clearFieldError, true);

    function showMsg(text, ok) {
      if (!msg) return;
      msg.hidden = false;
      msg.textContent = text;
      msg.className = 'cms-form-msg ' + (ok ? 'ok' : 'err');
    }
    function hideMsg() { if (msg) { msg.hidden = true; msg.textContent = ''; } }

    if (nextBtn) nextBtn.addEventListener('click', function () { hideMsg(); if (validateStep()) show(cur + 1, true); });
    if (backBtn) backBtn.addEventListener('click', function () { hideMsg(); show(cur - 1, true); });

    // Konfetti am Absenden-Button (Hover, gedrosselt) — wie kontakt.js.
    if (cfHover) {
      var lastHover = 0;
      submitBtn.addEventListener('pointerenter', function () {
        var now = (window.performance && performance.now) ? performance.now() : Date.now();
        if (now - lastHover < 800 || done) return;
        lastHover = now;
        confettiBurst(submitBtn, 16);
      });
    }

    form.addEventListener('submit', function (e) {
      e.preventDefault();
      if (submitting || done) return;
      if (!validateStep()) return;
      hideMsg();
      if (tInput) tInput.value = String(Date.now() - t0); // Zeitfalle: verstrichene ms
      submitting = true;
      submitBtn.disabled = true;
      if (submitLbl) submitLbl.textContent = 'Wird gesendet …';

      var fd = new FormData(form);
      fd.set('_page', form.getAttribute('data-page') || location.pathname);
      fd.set('_key', form.getAttribute('data-key') || 'formular');
      fd.set('_ref', document.referrer || '');   // Herkunftsseite → „Aufgerufen von" in der Betreiber-Mail
      fd.set('_url', location.href);             // die Formular-URL selbst (inkl. evtl. ?vorbefüllung)

      fetch(form.getAttribute('data-endpoint') || '/api/formular-submit.php', { method: 'POST', body: fd })
        .then(function (r) { return r.json(); })
        .then(function (res) {
          if (res && res.ok) {
            done = true;
            // Conversion „Kontaktanfrage" (50 €) — bereich = Formular-Slug (letztes Pfad-Segment).
            if (typeof window.ifmTrackConversion === 'function') {
              var pg = form.getAttribute('data-page') || location.pathname;
              window.ifmTrackConversion('kontakt', {
                event: 'kontakt_anfrage', value: 50, currency: 'EUR',
                bereich: pg.replace(/\/+$/, '').split('/').pop() || 'formular'
              });
            }
            form.classList.add('is-submitted');
            steps.forEach(function (s) { s.classList.remove('is-active'); });
            if (thanks) thanks.classList.add('is-active');
            else showMsg('Vielen Dank! Ihre Anfrage ist eingegangen.', true);
            if (cfDone) {
              document.querySelectorAll('.confetti-piece').forEach(function (p) { p.remove(); });
              confettiBurst(null, 110, { viewport: true, center: true, spreadX: 460, originY: 0.5 });
            }
            var top = form.getBoundingClientRect().top;
            if (top < 0) form.scrollIntoView({ behavior: prefersReduced ? 'auto' : 'smooth', block: 'start' });
            return;
          }
          showMsg((res && res.message) || 'Senden fehlgeschlagen — bitte versuchen Sie es erneut.', false);
          submitting = false;
          submitBtn.disabled = false;
          if (submitLbl) submitLbl.textContent = submitText;
        })
        .catch(function () {
          showMsg('Senden fehlgeschlagen — bitte prüfen Sie Ihre Verbindung und versuchen Sie es erneut.', false);
          submitting = false;
          submitBtn.disabled = false;
          if (submitLbl) submitLbl.textContent = submitText;
        });
    });

    // Vorbefüllung aus URL-Parametern (?feldname=wert — z.B. vom Formular-Start-Block):
    // gleichnamige Text-/Textarea-/Select-/Radio-Felder werden gefüllt (input/change für
    // Autogrow/Fill-State/Combobox-Anzeige).
    try {
      var params = new URLSearchParams(location.search);
      params.forEach(function (v, k) {
        if (!v || k.charAt(0) === '_') return;
        var el = form.querySelector('[name="' + CSS.escape(k) + '"], [name="' + CSS.escape(k) + '[]"]');
        if (!el) return;
        var type = (el.type || '').toLowerCase();
        if (type === 'radio' || type === 'checkbox') {
          var pick = form.querySelector('[name="' + CSS.escape(el.name) + '"][value="' + CSS.escape(v) + '"]');
          if (pick) { pick.checked = true; pick.dispatchEvent(new Event('change', { bubbles: true })); }
          return;
        }
        if (type === 'file' || type === 'hidden') return;
        el.value = v;
        el.dispatchEvent(new Event('input', { bubbles: true }));
        el.dispatchEvent(new Event('change', { bubbles: true }));
      });
    } catch (e) { /* ältere Browser ohne URLSearchParams/CSS.escape: keine Vorbefüllung */ }

    show(0, false);
  }

  /* Bedingte Formularfelder (Formular-Editor): ein Feld mit data-cond-field wird nur
     angezeigt und/oder Pflicht, wenn das Steuer-Feld (gleicher Form) den geforderten Wert hat
     (data-cond-value; leer = irgendein Wert/angehakt; mehrere Werte kommagetrennt).
     data-cond-mode: show | require | both. Ausgeblendete Felder werden DISABLED (→ nicht
     gesendet, nicht validiert — validateStep filtert disabled ohnehin). Bei bedingter Pflicht
     toggelt das required-Attribut + der Pflicht-Stern (PHP rendert dann ohne required).
     Serverseitiges Gegenstück: api/formular-submit.php (fs_cond_met). */
  function initFieldConditions(form) {
    if (!form || form.getAttribute('data-fcond-init')) return;
    // Editor-Canvas: Felder immer sichtbar lassen (Blöcke tragen dort data-cms-id;
    // canvas.php zeigt stattdessen eine Bedingungs-Badge am Feld).
    if (form.hasAttribute('data-cms-id') || form.closest('#cms-canvas-root') || form.classList.contains('cms-form--steps-editor')) return;
    var condEls = [].slice.call(form.querySelectorAll('[data-cond-field]'));
    if (!condEls.length) return;
    form.setAttribute('data-fcond-init', '1');

    function nameSel(name) {
      var n = String(name).replace(/(["\\])/g, '\\$1');
      return '[name="' + n + '"], [name="' + n + '[]"]';
    }
    function controllerValues(name) {
      var out = [];
      [].forEach.call(form.querySelectorAll(nameSel(name)), function (el) {
        var t = (el.type || '').toLowerCase();
        if (t === 'radio' || t === 'checkbox') { if (el.checked) out.push(el.value || 'on'); return; }
        if (el.tagName === 'SELECT' && el.multiple) {
          [].forEach.call(el.selectedOptions || [], function (o) { if (o.value) out.push(o.value); });
          return;
        }
        if (el.value) out.push(el.value);
      });
      return out.map(function (v) { return String(v).trim(); }).filter(Boolean);
    }
    function conditionMet(wrap) {
      var vals = controllerValues(wrap.getAttribute('data-cond-field') || '');
      var want = (wrap.getAttribute('data-cond-value') || '').trim();
      if (!want) return vals.length > 0; // leer = irgendein Wert/angehakt
      var accept = want.split(',').map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);
      return vals.some(function (v) { return accept.indexOf(v.toLowerCase()) >= 0; });
    }
    function clearErrors(wrap) {
      wrap.classList.remove('has-error');
      var err = wrap.querySelector('.form-field-error');
      if (err) err.hidden = true;
      [].forEach.call(wrap.querySelectorAll('[aria-invalid]'), function (el) { el.removeAttribute('aria-invalid'); });
    }
    function toggleStar(wrap, on) {
      var label = wrap.querySelector('.form-field-label') || wrap.querySelector('legend') || wrap.querySelector('.form-field-check-label');
      if (!label) return;
      var star = label.querySelector('.form-field-required');
      if (on && !star) {
        star = document.createElement('span');
        star.className = 'form-field-required';
        star.setAttribute('aria-hidden', 'true');
        star.textContent = '*';
        label.appendChild(document.createTextNode(' '));
        label.appendChild(star);
      }
      if (star) star.hidden = !on;
    }
    // Eingaben, die das required-Attribut tragen (Muster wie Blocks\FormField/PHP):
    // Checkbox-GRUPPEN und das Zeitraum-Feld haben kein natives required (Server prüft).
    function requirables(wrap) {
      return [].filter.call(wrap.querySelectorAll('input, select, textarea'), function (el) {
        var t = (el.type || '').toLowerCase();
        if (t === 'button' || t === 'submit' || t === 'hidden') return false;
        if (el.closest('[data-daterange]') || el.closest('.form-field-daterange-static')) return false;
        if (t === 'checkbox' && /\[\]$/.test(el.name || '')) return false; // Gruppe
        return true;
      });
    }
    function apply() {
      condEls.forEach(function (wrap) {
        var mode = wrap.getAttribute('data-cond-mode') || 'show';
        var ok = conditionMet(wrap);
        if (mode === 'show' || mode === 'both') {
          wrap.classList.toggle('cms-cond-field-off', !ok);
          [].forEach.call(wrap.querySelectorAll('input, select, textarea, button'), function (el) {
            if (!ok) { if (!el.disabled) { el.disabled = true; el.setAttribute('data-cond-disabled', '1'); } }
            else if (el.getAttribute('data-cond-disabled')) { el.disabled = false; el.removeAttribute('data-cond-disabled'); }
          });
          if (!ok) clearErrors(wrap);
        }
        if (mode === 'require' || mode === 'both') {
          requirables(wrap).forEach(function (el) { el.required = ok; });
          toggleStar(wrap, ok);
          if (!ok) clearErrors(wrap);
        }
      });
    }
    form.addEventListener('input', apply, true);
    form.addEventListener('change', apply, true);
    apply();
  }

  function run(scope) {
    var root = scope || document;
    root.querySelectorAll('form[data-form-steps]').forEach(initFormSteps);
    // Bedingte Felder gelten auch in einfachen (nicht-Schritt) CMS-Formularen.
    [].forEach.call(root.querySelectorAll('form'), function (f) {
      if (f.querySelector('[data-cond-field]')) initFieldConditions(f);
    });
  }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { run(); });
  else run();
  window.initFormSteps = run; // Andockpunkt für nachgeladene Inhalte
})();
</script>
</body>
</html>