@charset "UTF-8";
/* ============================================================================
   refresh.css — Subtil-modern Design-Refresh
   WP International Trade GmbH
   ----------------------------------------------------------------------------
   Diese Datei wird NACH style.css geladen und enthält alle Modernisierungs-
   Schichten. Sie ist additiv aufgebaut — bei Entfernen aus inc_head.php
   verhält sich die Seite wieder exakt wie das Original.
   ============================================================================ */


/* ============================================================================
   1) Design-Tokens (CSS Custom Properties)
   ============================================================================ */
:root {
  /* Brand */
  --brand-primary: #13447a;
  --brand-primary-dark: #0e2f56;
  --brand-primary-light: color-mix(in oklab, var(--brand-primary) 70%, white);
  --brand-primary-soft: color-mix(in oklab, var(--brand-primary) 12%, white);
  --brand-accent: color-mix(in oklab, var(--brand-primary) 60%, #2aa6e0);
  /* Akzent-Goldton fuer CTAs und wichtige Highlights (Briefing 2026-04-27 §12) -
     Bernstein/Gold gibt deutlich besseren Kontrast gegen blaues Hero-Video als
     Cyan-Blau und passt zu seriosem Handelsunternehmen statt SaaS-Startup-Look. */
  --brand-amber: #d4a017;

  /* WP-Farbsystem fuer das Trade-Hub-Subsystem (Session 23, 2026-05-09).
     Dokumentiert die Brand-Werte als Single-Source-of-Truth, sodass spaetere
     Trade-Hub-Komponenten konsistent darauf zugreifen koennen. Werte halten
     sich nah an --brand-* aus dem Theme-Refresh. */
  --wp-blue-deep:  #0a2540;
  --wp-blue-mid:   #1a3a5c;
  --wp-blue-light: #2563a8;
  --wp-accent:     #f5b942;
  --wp-text-light: rgba(255,255,255,0.85);

  /* Section-Spacing-Token fuer Trade-Hub-Sektionen */
  --tradehub-section-pad: clamp(4rem, 8vw, 7rem);
  --brand-amber-dark: #b08410;
  --brand-amber-light: color-mix(in oklab, var(--brand-amber) 75%, white);

  /* Neutrals — feines Off-White, kein hartes #fff */
  --surface-base: oklch(99% 0.005 240);
  --surface-elevated: oklch(100% 0 0);
  --surface-muted: oklch(96.5% 0.008 240);
  --surface-glass: color-mix(in oklab, white 78%, transparent);
  --surface-glass-dark: color-mix(in oklab, var(--brand-primary) 8%, transparent);

  --text-primary: oklch(22% 0.02 240);
  --text-secondary: oklch(40% 0.015 240);
  --text-muted: oklch(58% 0.01 240);
  --border-subtle: oklch(90% 0.005 240);

  /* Spacing — 4px grid (Tailwind-Skala) */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.25rem;
  --space-6: 1.5rem;
  --space-7: 1.75rem;
  --space-8: 2rem;
  --space-9: 2.25rem;
  --space-10: 2.5rem;
  --space-12: 3rem;
  --space-16: 4rem;
  --space-20: 5rem;
  --space-24: 6rem;

  /* Radius */
  --radius-sm: 6px;
  --radius-md: 12px;
  --radius-lg: 20px;
  --radius-xl: 28px;
  --radius-pill: 999px;

  /* Shadows — soft, layered */
  --shadow-soft: 0 1px 2px oklch(0% 0 0 / 0.04), 0 4px 12px oklch(0% 0 0 / 0.06);
  --shadow-medium: 0 2px 4px oklch(0% 0 0 / 0.05), 0 12px 28px oklch(0% 0 0 / 0.10);
  --shadow-glow: 0 0 0 1px var(--brand-primary-soft), 0 8px 32px color-mix(in oklab, var(--brand-primary) 25%, transparent);

  /* Typography — fluide Skalierung */
  --fs-body: clamp(1rem, 0.95rem + 0.2vw, 1.125rem);
  --fs-h6: clamp(1rem, 0.95rem + 0.3vw, 1.15rem);
  --fs-h5: clamp(1.125rem, 1rem + 0.5vw, 1.35rem);
  --fs-h4: clamp(1.35rem, 1.1rem + 1vw, 1.75rem);
  --fs-h3: clamp(1.6rem, 1.2rem + 1.6vw, 2.25rem);
  --fs-h2: clamp(2rem, 1.4rem + 2.4vw, 3rem);
  --fs-h1: clamp(2.5rem, 1.6rem + 4vw, 4.5rem);
  --leading-tight: 1.15;
  --leading-normal: 1.6;

  /* Easing & Timing */
  --ease-smooth: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --duration-fast: 180ms;
  --duration-base: 320ms;
  --duration-slow: 600ms;

  /* Layering */
  --z-nav: 100;
  --z-modal: 1000;
}


/* ============================================================================
   2) Reduced-Motion: alle Animationen deaktivieren
   ============================================================================ */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}


/* ============================================================================
   3) Globale Verfeinerungen
   ============================================================================ */
html {
  scroll-behavior: smooth;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

body {
  background: var(--surface-base);
}

/* Selektion in Brand-Farbe */
::selection {
  background: var(--brand-primary);
  color: white;
}

/* Modern Focus-Ring statt outline:none */
:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 3px;
  border-radius: var(--radius-sm);
}

/* Scrollbar in Brand-Tönen (WebKit/Blink) */
@supports selector(::-webkit-scrollbar) {
  ::-webkit-scrollbar { width: 12px; height: 12px; }
  ::-webkit-scrollbar-track { background: var(--surface-muted); }
  ::-webkit-scrollbar-thumb {
    background: color-mix(in oklab, var(--brand-primary) 35%, transparent);
    border-radius: var(--radius-pill);
    border: 3px solid var(--surface-muted);
  }
  ::-webkit-scrollbar-thumb:hover {
    background: var(--brand-primary);
  }
}


/* ============================================================================
   4) IE-Panel ausblenden (Sicherheitsnetz, falls noch irgendwo Markup steckt)
   ============================================================================ */
.ie-panel { display: none !important; }


/* ============================================================================
   5) Navigation — kontextsensitiv: transparent über Hero, Glass beim Scrollen
   ----------------------------------------------------------------------------
   Override für vorhandenes RD-Navbar-Markup. Wir verändern das Markup nicht,
   damit die jQuery-Bindings nicht brechen.

   - Startseite, oben (über Hero):     komplett transparent, Text weiß
   - Beim Scrollen (.rd-navbar--is-stuck): Glassmorphism weiß + blur, Text dunkel
   - Subpages (.subpage):              solides Brand-Blau (style.css mit !important)
   ============================================================================ */

/* Default: transparente Navi auf Hauptseiten — keine Hintergrundfarbe */
.rd-navbar.rd-navbar-static:not(.subpage),
.rd-navbar.rd-navbar-fixed:not(.subpage) {
  background: transparent;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-bottom: 1px solid transparent;
  transition: background var(--duration-base) var(--ease-smooth),
              backdrop-filter var(--duration-base) var(--ease-smooth),
              box-shadow var(--duration-base) var(--ease-smooth),
              border-color var(--duration-base) var(--ease-smooth);
}

/* Über Hero: Links weiß lesbar machen */
.rd-navbar.rd-navbar-static:not(.subpage):not(.rd-navbar--is-stuck) .rd-nav-link,
.rd-navbar.rd-navbar-fixed:not(.subpage):not(.rd-navbar--is-stuck) .rd-nav-link {
  color: #ffffff;
  text-shadow: 0 1px 12px rgba(0, 0, 0, 0.35);
}

/* Beim Scrollen: Brand-Blau (wie im Original) — Logo bekommt Kontrast */
.rd-navbar.rd-navbar--is-stuck:not(.subpage) {
  background: var(--brand-primary);
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-bottom-color: color-mix(in oklab, white 12%, transparent);
  box-shadow: 0 4px 20px oklch(0% 0 0 / 0.18);
}

/* Beim Scrollen: Text weiß und ohne Shadow */
.rd-navbar.rd-navbar--is-stuck:not(.subpage) .rd-nav-link {
  color: #ffffff;
  text-shadow: none;
}
.rd-navbar.rd-navbar--is-stuck:not(.subpage) .rd-nav-item.active .rd-nav-link {
  color: #ffffff !important;
}

/* Brand-Logo — sanftes Hover-Glow */
.rd-navbar-brand .brand img {
  transition: filter var(--duration-base) var(--ease-smooth),
              transform var(--duration-base) var(--ease-spring);
}
.rd-navbar-brand .brand:hover img {
  transform: translateY(-1px);
  filter: drop-shadow(0 4px 8px color-mix(in oklab, var(--brand-primary) 30%, transparent));
}

/* Nav-Links — animierter Underline-Indikator */
.rd-navbar .rd-nav-link {
  position: relative;
  transition: color var(--duration-fast) var(--ease-smooth);
}
.rd-navbar .rd-nav-link::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -6px;
  height: 2px;
  width: 0;
  background: currentColor;
  border-radius: var(--radius-pill);
  transform: translateX(-50%);
  transition: width var(--duration-base) var(--ease-spring),
              background-color var(--duration-fast);
}
.rd-navbar .rd-nav-item:hover .rd-nav-link::after,
.rd-navbar .rd-nav-item.active .rd-nav-link::after,
.rd-navbar .rd-nav-item.focus .rd-nav-link::after {
  width: 70%;
}

/* Mobile-Sidebar (rd-navbar-fixed): animierte Underline unter Menue-Items
   ausblenden. Im aufklappbaren Hamburger-Menue stehen die Eintraege als
   vertikale Liste mit eigenem Active-State (orange-gelber Hintergrund) —
   die Underline-Linie passt dazu visuell nicht. (Bug 2026-05-07) */
.rd-navbar.rd-navbar-fixed .rd-nav-link::after {
  display: none;
}

/* Aktiver Link kontext-sensitiv einfärben — weiß auf solider Subpage-Navi,
   Brand-Cyan-Hellblau auf transparenter Hauptseiten-Navi (gut sichtbar auf Hero-Video). */
.rd-navbar:not(.subpage):not(.rd-navbar--is-stuck) .rd-nav-item.active .rd-nav-link {
  color: #068ed6 !important;
  font-weight: 700;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.45);
}
.rd-navbar.subpage .rd-nav-item.active .rd-nav-link,
.rd-navbar-static.subpage .rd-nav-item.active .rd-nav-link {
  color: #ffffff !important;
  font-weight: 700;
}

/* Mobile-Sidebar (rd-navbar-fixed) auf der HAUPTSEITE: aktiver Link soll
   weiss sein, nicht den Cyan-Hero-Style oben erben. Auf der transparenten
   Desktop-Hauptseiten-Navi (Hero-Video) macht Brand-Cyan-Hellblau Sinn —
   im aufklappbaren Mobile-Menue liegt der Link aber auf orangem Bg, dort
   wirkt Cyan + Schatten wie ein verwaschener Filter ueber dem aktiven
   Eintrag. Auf Subpages greift bereits die .subpage-Regel oben.
   (Bug 2026-05-07) */
.rd-navbar.rd-navbar-fixed:not(.subpage) .rd-nav-item.active .rd-nav-link {
  color: #ffffff !important;
  text-shadow: none !important;
}

/* Sprach-Flaggen-Dropdown — sanfte Hover-Effekte */
.rd-navbar-submenu .rd-dropdown-link img {
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-fast);
}
.rd-navbar-submenu .rd-dropdown-link:hover img {
  transform: scale(1.12);
  box-shadow: 0 4px 12px oklch(0% 0 0 / 0.15);
}


/* ============================================================================
   5b) Swiper-Fade Sicherung
   ----------------------------------------------------------------------------
   Bei Swiper-Fade-Slidern müssen alle nicht-aktiven Slides opacity:0 sein,
   sonst überlappen sie. Wenn das Swiper-JS verspätet (defer) lädt oder hängt,
   stellen wir das hier nochmal explizit per CSS sicher.
   ============================================================================ */
.swiper-container-fade .swiper-slide {
  opacity: 0 !important;
  transition: opacity var(--duration-base) var(--ease-smooth);
}
.swiper-container-fade .swiper-slide.swiper-slide-active,
.swiper-container-fade .swiper-slide:only-child {
  opacity: 1 !important;
}


/* ============================================================================
   6) Hero — Gradient-Mesh + fluide Typografie
   ----------------------------------------------------------------------------
   Wir lassen die bestehende Swiper-Struktur unangetastet und legen einen
   Mesh-Gradient als zusätzlichen Layer drüber sowie modernere Typo + Buttons.
   ============================================================================ */
.swiper-slider .swiper-slide {
  position: relative;
  isolation: isolate;
  /* Fix: das Inline-Style "background-size: cover" wird vom alten CSS-Default
     "background-repeat: repeat" begleitet, was bei manchen Browser-/Viewport-
     Verhältnissen zu einem sichtbaren Tile-Split im Hero führt. */
  background-repeat: no-repeat !important;
  background-position: center center !important;
}

/* Subtile Vignette für besseren Text-Kontrast — nur dezent unten dunkler,
   kein Mesh-Gradient mehr (der erzeugte sichtbare Kanten beim Bild) */
.swiper-slider .swiper-slide::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(
    180deg,
    transparent 0%,
    transparent 55%,
    color-mix(in oklab, var(--brand-primary-dark) 30%, transparent) 100%
  );
  pointer-events: none;
}

.swiper-slider .swiper-slide-caption {
  position: relative;
  z-index: 1;
}
/* .video-wrapper bleibt absolute (style.css:482) — sonst kollabiert die
   Hälfte des Hero-Containers. */

/* Dual-Video-Loop: zwei .hero-video Elemente uebereinander, eines aktiv,
   eines passiv. Der Switch passiert via JS (timeupdate kurz vor dem Ende
   des aktiven Videos) durch Toggle der is-passive Klasse. So gibt es keinen
   Decoder-Reset auf dem sichtbaren Stream und der Loop ist wirklich nahtlos.
   Crossfade-Dauer 1.0s = gleiche Laenge wie die internen Segment-Crossfades
   im Video, sodass der Loop-Wechsel optisch wie ein weiterer Segment-Wechsel
   aussieht (Handshake → Skyline-Anfang). Das Video selbst hat KEINEN xfade
   am Ende mehr (zurueck auf Pre-Loopfix-Version) — der Uebergang ist allein
   durch CSS-Opacity gemacht, sodass der User keine Doppel-Crossfades sieht. */
.video-wrapper > .hero-video {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity 1s linear;
  will-change: opacity;
}
.video-wrapper > .hero-video.is-passive {
  opacity: 0;
}

/* Headline — fluide Typo, klarere Hierarchie */
.swiper-slider .jumbotron h2 {
  font-size: var(--fs-h1);
  line-height: var(--leading-tight);
  font-weight: 700;
  letter-spacing: -0.02em;
  margin-bottom: var(--space-4);
  text-shadow: 0 2px 24px color-mix(in oklab, var(--brand-primary-dark) 50%, transparent);

  /* Scroll-driven entry */
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) both;
  animation-delay: 100ms;
}

.swiper-slider .jumbotron > p {
  font-size: var(--fs-h5);
  font-weight: 300;
  letter-spacing: 0.02em;
  opacity: 0.95;
  margin-bottom: var(--space-8);
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) both;
  animation-delay: 250ms;
}

@keyframes hero-fade-up {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* Hero-Buttons — modernisiert mit subtle Lift on Hover */
.swiper-slider .jumbotron .button {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-6);
  border-radius: var(--radius-pill);
  font-weight: 600;
  letter-spacing: 0.02em;
  background: var(--brand-primary);
  color: white;
  border: 1px solid color-mix(in oklab, white 25%, transparent);
  box-shadow: var(--shadow-soft);
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-base) var(--ease-smooth),
              background var(--duration-fast);
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) both;
  animation-delay: 400ms;
}
.swiper-slider .jumbotron .button:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-medium);
  background: var(--brand-primary-light);
}
.swiper-slider .jumbotron .button:active {
  transform: translateY(0);
}

/* Play-Icon im Video-Button — leichtes Bouncing on Hover */
.swiper-slider .jumbotron .button .play {
  width: 14px;
  height: 14px;
  transition: transform var(--duration-fast) var(--ease-spring);
}
.swiper-slider .jumbotron .button:hover .play {
  transform: scale(1.15);
}

/* Floating-Akzente — animierter Glow-Pulse als dezenter Eyecatcher */
.swiper-slider .swiper-slide .swiper-slide-caption::before {
  content: "";
  position: absolute;
  top: 20%;
  right: 8%;
  width: 380px;
  height: 380px;
  background: radial-gradient(circle, color-mix(in oklab, var(--brand-accent) 40%, transparent) 0%, transparent 70%);
  filter: blur(40px);
  z-index: -1;
  pointer-events: none;
  animation: hero-glow-pulse 8s var(--ease-smooth) infinite;
}

@keyframes hero-glow-pulse {
  0%, 100% { transform: scale(1) translate(0, 0); opacity: 0.6; }
  50% { transform: scale(1.15) translate(-20px, 30px); opacity: 0.9; }
}


/* ============================================================================
   7) WOW.js-Replacement: Page-Load + Scroll-driven Reveal-Animationen
   ----------------------------------------------------------------------------
   Strategie:
   - Above-the-fold (.wow-Markup oben auf der Seite): KLASSISCHE Page-Load-
     Animation mit kräftigem Translate, immer sichtbar beim Seitenwechsel
   - Below-the-fold (gleiche .wow-Klassen, aber bereits ausgelaufen): keine
     erneute Animation, statisch dargestellt
   - Cards / Embeds zusätzlich Scroll-Reveal (siehe §8c)
   ============================================================================ */

/* Reveal-Keyframes — wiederverwendbar, größere Distanzen für spürbaren Effekt */
@keyframes rf-fade-up {
  from { opacity: 0; transform: translateY(60px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes rf-fade-down {
  from { opacity: 0; transform: translateY(-60px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes rf-fade-left {
  from { opacity: 0; transform: translateX(-80px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes rf-fade-right {
  from { opacity: 0; transform: translateX(80px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes rf-zoom-in {
  from { opacity: 0; transform: scale(0.88); }
  to   { opacity: 1; transform: scale(1); }
}

/* Klassische Page-Load Animation für ALLE Browser */
@media (prefers-reduced-motion: no-preference) {
  /* Inline-Style "visibility: hidden; animation-name: none;" überschreiben */
  .wow {
    visibility: visible !important;
    opacity: 0;
    animation-duration: 900ms;
    animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
    animation-fill-mode: both;
  }

  .wow.fadeIn,
  .wow.fadeInUp     { animation-name: rf-fade-up; }
  .wow.fadeInDown   { animation-name: rf-fade-down; }
  .wow.fadeInLeft   { animation-name: rf-fade-left; }
  .wow.fadeInRight  { animation-name: rf-fade-right; }
  .wow.zoomIn       { animation-name: rf-zoom-in; }

  /* Sequentieller Stagger nach Position in der Row — jedes Item kommt
     leicht nach dem vorherigen rein. Das wirkt wie das ursprüngliche
     WOW.js-Verhalten und ergibt ein "Storytelling": Headline → Bild →
     Über uns → Mission/Werte (von rechts) → Untertext → ... */
  .row > [class*="col-"].wow:nth-child(1)  { animation-delay: 0ms;  }
  .row > [class*="col-"].wow:nth-child(2)  { animation-delay: 90ms; }
  .row > [class*="col-"].wow:nth-child(3)  { animation-delay: 180ms; }
  .row > [class*="col-"].wow:nth-child(4)  { animation-delay: 270ms; }
  .row > [class*="col-"].wow:nth-child(5)  { animation-delay: 360ms; }
  .row > [class*="col-"].wow:nth-child(6)  { animation-delay: 450ms; }
  .row > [class*="col-"].wow:nth-child(7)  { animation-delay: 540ms; }
  .row > [class*="col-"].wow:nth-child(8)  { animation-delay: 630ms; }
  .row > [class*="col-"].wow:nth-child(9)  { animation-delay: 720ms; }
  .row > [class*="col-"].wow:nth-child(10) { animation-delay: 810ms; }
  .row > [class*="col-"].wow:nth-child(11) { animation-delay: 900ms; }
  .row > [class*="col-"].wow:nth-child(12) { animation-delay: 990ms; }
  .row > [class*="col-"].wow:nth-child(n+13) { animation-delay: 1080ms; }

  /* Service-Pakete Tab-Inhalte: Ziel / Leistungen / Vorteile bauen sich
     gestaffelt von oben nach unten auf — auch beim Tab-Wechsel.
     CSS-only Stagger (unabhaengig von WOW.js' data-wow-delay-Handling,
     das auf inaktive Tab-Panes nicht zuverlaessig greift). */
  #service-pakete .tab-pane .icon-list > li.wow.fadeInUp:nth-of-type(1) { animation-delay: 0ms; }
  #service-pakete .tab-pane .icon-list > li.wow.fadeInUp:nth-of-type(2) { animation-delay: 200ms; }
  #service-pakete .tab-pane .icon-list > li.wow.fadeInUp:nth-of-type(3) { animation-delay: 400ms; }
}


/* ============================================================================
   8) Section-Polish — sanftere Übergänge & größere Atmungsabstände
   ============================================================================ */
.section-xl,
.section-lg {
  position: relative;
  isolation: isolate;
}

/* Subtile Section-Trennung über Gradient-Border statt harter Kante */
.section-xl + .section-xl::before,
.bg-default + .bg-primary::before,
.bg-primary + .bg-default::before {
  content: "";
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(80%, 600px);
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    color-mix(in oklab, var(--brand-primary) 25%, transparent) 50%,
    transparent 100%
  );
  pointer-events: none;
}

/* Background-Primary: hellblauer Brand-Cyan (#068ed6) — gibt der Service-Card-
   Sektion auf der Startseite einen freundlich-hellen Look, der den Kontrast
   zur darunterliegenden dunklen Ansprechpartner-Sektion erzeugt. */
.bg-primary {
  background:
    radial-gradient(circle at 8% 12%, color-mix(in oklab, white 18%, transparent) 0%, transparent 45%),
    radial-gradient(circle at 92% 88%, color-mix(in oklab, var(--brand-primary-dark) 22%, transparent) 0%, transparent 55%),
    linear-gradient(135deg, #068ed6 0%, #0a7ec0 100%);
}

/* Headline-Veredelung — ".text-decorate" Klasse
   Wir übernehmen das vorhandene ::before-Pseudoelement aus style.css und
   ersetzen den schwarzen 4-px-Balken durch einen Gradient-Underline.
   So entsteht KEIN doppelter Strich. */
.text-decorate {
  position: relative;
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: var(--leading-tight);
}
.text-decorate::before {
  /* Override gegen style.css:828 */
  max-width: 96px !important;
  width: 96px !important;
  height: 3px !important;
  background: linear-gradient(
    90deg,
    var(--brand-primary) 0%,
    var(--brand-accent) 100%
  ) !important;
  border-radius: var(--radius-pill);
  transform-origin: left center;
}
.context-dark .text-decorate::before {
  background: linear-gradient(
    90deg,
    white 0%,
    color-mix(in oklab, white 70%, var(--brand-accent)) 100%
  ) !important;
}

/* Mobile (≤ 991.98px): .text-decorate-Headline linksbuendig statt zentriert.
   style.css:886 setzt im Default `text-align: center` + Underline `left: 50%;
   transform: translateX(-50%)` und schaltet erst ab 992px auf links um —
   auf Mobile steht der Underline daher halb-mittig unter dem zentrierten
   Text statt am Anfang der Headline. Wir gleichen das Mobile-Verhalten an
   das Desktop-Verhalten an: Text und Underline beide linksbuendig.
   (Bug 2026-05-07) */
@media (max-width: 991.98px) {
  .text-decorate {
    text-align: left;
  }
  .text-decorate::before {
    left: 0 !important;
    transform: translateX(0) !important;
  }
}


/* ============================================================================
   8c) Page-Load- und Scroll-Reveal-Animationen ("Apple-Style")
   ----------------------------------------------------------------------------
   - Beim Seitenaufruf: Underline wächst von links rein, Headline fadet up
   - Beim Scrollen: nachfolgende Inhalte (Cards, Bilder, Sektionen) faden auf
   - prefers-reduced-motion: alles deaktiviert (oben in §2 global geregelt)
   ============================================================================ */

/* Keyframes — wiederverwendbar */
@keyframes rf-headline-reveal {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes rf-underline-grow {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

@keyframes rf-fade-rise {
  from { opacity: 0; transform: translateY(60px) scale(0.96); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes rf-fade-soft {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* PAGE-LOAD: alle Browser, alle .text-decorate Headlines bekommen Reveal
   Reihenfolge bei Page-Load:
   0ms:    Headline (nth-child 1) erscheint
   90ms:   Item 2 erscheint, dann +90ms pro weiterem Item
   ~900ms: Headline-Animation endet (duration 900ms, delay 0)
   1200ms: Underline wächst von links rein (bewusst nach Headline-Reveal)
   ~1900ms: Underline fertig */
@media (prefers-reduced-motion: no-preference) {
  .text-decorate {
    animation: rf-headline-reveal 700ms cubic-bezier(0.22, 1, 0.36, 1) both;
  }
  .text-decorate::before {
    animation: rf-underline-grow 700ms 1200ms cubic-bezier(0.22, 1, 0.36, 1) both;
  }
}

/* SCROLL-REVEAL: nur moderne Browser mit View-Timeline-Support
   (Chrome 115+, Edge 115+, Firefox 124+. Safari fällt zurück auf Page-Load)
   Wenn ein Element beim Scrollen NEU in den Viewport kommt, läuft die
   Animation progressiv durch. */
@supports (animation-timeline: view()) {
  /* Cards, Bilder, Embeds — spürbarer Reveal */
  .thumbnail,
  .embed-responsive,
  .row > [class*="col-"] > .thumbnail {
    animation: rf-fade-rise linear both;
    animation-timeline: view();
    animation-range: entry 0% cover 35%;
  }

  /* Numbered List Items in Dienstleistungen — sanftes Stagger */
  ul.numbered-list li {
    animation: rf-fade-soft linear both;
    animation-timeline: view();
    animation-range: entry 10% cover 30%;
  }

  /* HubSpot-Formular-Felder (Produktanfrage, Kontakt) — von oben nach unten
     reveal'en wenn man im Formular runterscrollt. Greift auf die zur Laufzeit
     erzeugten Form-Field-Container. */
  .hs-form .hs-form-field,
  .hs-form .hs-richtext,
  .hs-form .hs-submit {
    animation: rf-fade-rise linear both;
    animation-timeline: view();
    animation-range: entry 0% cover 30%;
  }

  /* Listen-Items in Produktgruppen / Service-Paketen — bauen sich von
     oben nach unten auf wenn man die Sektion runterscrollt. Jedes <li>
     erscheint einzeln beim Eintreten ins Viewport. */
  ul.icon-list2 > li,
  ul.icon-list > li,
  ul.noicon-list > li {
    animation: rf-fade-rise linear both;
    animation-timeline: view();
    animation-range: entry 0% cover 35%;
  }
  /* Innerhalb von #service-pakete nur die INNEREN Bullet-Listen
     (ul.noicon-list > li) deaktivieren. Die OUTER-Items (Ziel/Leistungen/
     Vorteile) sind <li class="wow fadeInUp"> und behalten ihre
     Stagger-Tab-Wechsel-Animation. Die view()-Animation auf den inneren
     Bullets liess sonst Items bei 0.6 opacity haengen, wenn der Container
     nicht weit genug im Viewport "covered" war (typisch bei kurzen
     Tab-Inhalten wie "Vorteile" im Tab Full Sourcing). */
  #service-pakete ul.noicon-list > li {
    animation: none !important;
    animation-timeline: auto !important;
    animation-range: normal !important;
    opacity: 1 !important;
    transform: none !important;
  }

  /* Ansprechpartner-Karten (Unternehmen + Scor): scroll-driven Reveal hier
     deaktivieren. Auf Mobile (gestapeltes Layout) erreicht die LETZTE Karte
     (Johnny Wan) den "cover 35%"-Trigger nicht mehr — die Section endet zu
     kurz nach ihr, die Animation haengt dauerhaft bei opacity ~0.5x und
     wirkt dadurch wie ein blau-grauer Filter ueber Foto und Beschreibung.
     Gleiche Mechanik wie #service-pakete-Block oben. (Bug 2026-05-07) */
  .team-bg-section .thumbnail {
    animation: none !important;
    animation-timeline: auto !important;
    animation-range: normal !important;
    opacity: 1 !important;
    transform: none !important;
  }

  /* Bilder direkt in einer wow-Spalte (z. B. Produktgruppen-Bild rechts,
     Service-Paket-Bilder links) — scroll-driven Reveal damit sie auch
     dann animieren, wenn der Container schon ausgeblendet ist (Page-Load
     bereits abgelaufen) */
  .row > [class*="col-"].wow > img,
  .row > [class*="col-"].wow > a > img {
    animation: rf-fade-rise linear both;
    animation-timeline: view();
    animation-range: entry 0% cover 30%;
  }

  /* Service-Pakete Tab-Inhalte: scroll-driven Animation hier deaktivieren —
     die <li>-Items (Ziel/Leistungen/Vorteile) und das Bild bekommen ihre
     gestaffelte Reveal-Animation gebunden an .active.show des Tab-Panes.
     Bootstrap haelt inaktive Panes nur mit visibility:hidden/opacity:0 im
     DOM, daher wuerden CSS-Animationen sonst beim Page-Load in ALLEN Panes
     gleichzeitig durchlaufen — beim Tab-Klick waere dann nichts mehr zu
     sehen. Mit der :not(.show)-Regel laeuft die Animation erst beim
     Aktivieren des Panes neu. */
  /* Default: alle Reveal-Items im Service-Pakete-Bereich starten unsichtbar.
     Animation laeuft erst, wenn die Sektion via IntersectionObserver die
     `is-revealed`-Klasse bekommt UND (fuer Pane-Inhalt) der Pane `.active.show`
     ist. So wirkt der Reveal beim Sichtkontakt (Scroll von Startseite oder
     Tab-Klick), nicht schon beim Page-Load weit oben in der Seite.

     Wichtig: Die Bild-Spalte (.col-lg-5.wow) wird hier per `animation: none`
     ausgeschaltet, weil die globale `.wow.fadeInLeft`-Regel sonst beim
     Page-Load alle Bilder gleichzeitig animiert — danach bleiben die
     Bilder in inaktiven Panes auf opacity:0 + translateX(-80px) stehen
     und werden beim Tab-Klick nicht mehr neu animiert. (Bug 2026-05-08) */
  #service-pakete .tab-pane ul.icon-list > li.wow.fadeInUp,
  #service-pakete .tab-pane .col-lg-5.wow,
  #service-pakete .tab-pane .paket-pane-subtitle,
  #service-pakete .tab-pane .paket-pane-cta,
  #service-pakete .nav-tabs .nav-link {
    animation: none !important;
    visibility: visible !important;
    opacity: 0;
    transform: none !important;
  }

  /* Stagger-Choreographie:
     Phase 1 — Tab-Buttons gestaffelt von links nach rechts:
       0 ms — Tab 1 (Basis Sourcing)
      80 ms — Tab 2 (Premium Sourcing)
     160 ms — Tab 3 (Full Sourcing Import)
     240 ms — Tab 4 (Ihr China-Office)
     320 ms — Tab 5 (Qualitaetskontrolle)
     Phase 2 — Inhalt des aktiven Panes:
     400 ms — paket-pane-subtitle (fade-up)
     530 ms — Bild (fade-left) und icon-list li 1 "Ziel" (fade-up) parallel
     730 ms — icon-list li 2 "Leistungen" (fade-up)
     930 ms — icon-list li 3 "Vorteile" (fade-up)
    1120 ms — paket-pane-cta (fade-up)
     Gesamt-Dauer ~2 s. */

  /* Phase 1: Tab-Buttons gestaffelt einsteigen */
  #service-pakete.is-revealed .nav-tabs .nav-link {
    animation: rf-fade-up 700ms cubic-bezier(0.22, 1, 0.36, 1) forwards !important;
    visibility: visible !important;
  }
  #service-pakete.is-revealed .nav-tabs .nav-item:nth-of-type(1) .nav-link { animation-delay: 0ms !important; }
  #service-pakete.is-revealed .nav-tabs .nav-item:nth-of-type(2) .nav-link { animation-delay: 80ms !important; }
  #service-pakete.is-revealed .nav-tabs .nav-item:nth-of-type(3) .nav-link { animation-delay: 160ms !important; }
  #service-pakete.is-revealed .nav-tabs .nav-item:nth-of-type(4) .nav-link { animation-delay: 240ms !important; }
  #service-pakete.is-revealed .nav-tabs .nav-item:nth-of-type(5) .nav-link { animation-delay: 320ms !important; }

  /* Phase 2: Pane-Inhalt nach den Tabs */
  #service-pakete.is-revealed .tab-pane.active.show ul.icon-list > li.wow.fadeInUp,
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-subtitle,
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-cta {
    animation: rf-fade-up 900ms cubic-bezier(0.22, 1, 0.36, 1) forwards !important;
    visibility: visible !important;
  }
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-subtitle { animation-delay: 400ms !important; }
  #service-pakete.is-revealed .tab-pane.active.show ul.icon-list > li.wow.fadeInUp:nth-of-type(1) { animation-delay: 530ms !important; }
  #service-pakete.is-revealed .tab-pane.active.show ul.icon-list > li.wow.fadeInUp:nth-of-type(2) { animation-delay: 730ms !important; }
  #service-pakete.is-revealed .tab-pane.active.show ul.icon-list > li.wow.fadeInUp:nth-of-type(3) { animation-delay: 930ms !important; }
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-cta      { animation-delay: 1120ms !important; }
  #service-pakete.is-revealed .tab-pane.active.show .col-lg-5.wow {
    animation: rf-fade-left 900ms cubic-bezier(0.22, 1, 0.36, 1) forwards !important;
    animation-delay: 530ms !important;
    visibility: visible !important;
  }
}

/* Mobile (≤ 991.98px): Service-Pakete-Stagger-Animation deaktivieren UND
   Bootstrap-fade-Transition aushebeln. Der eigentliche Bug ist, dass die
   `.fade`-Transition beim Tab-Wechsel manchmal in einem Limbo haengen
   bleibt — Pane hat zwar `.show.active`, aber computed opacity bleibt 0
   bis zum naechsten Reflow (= leichtes Scrollen). Mit `transition: none`
   ist der Wechsel instantan, mit explicitem `opacity: 1` auf dem aktiven
   Pane laesst sich kein Limbo-Zustand mehr halten. Items werden parallel
   sofort sichtbar (kein Stagger). Desktop behaelt Bootstrap-Fade + Stagger.
   (Bug 2026-05-07) */
@media (max-width: 991.98px) {
  /* ALLE Tab-Panes auf opacity:1 forcieren + GPU-Layer erzwingen.
     iOS-Safari hat einen Compositing-Bug bei Tab-Klick: der Pane wird
     zwar `.show.active`, aber der Browser rendert das neue Layout erst
     beim naechsten echten Scroll-Event. Mit `translateZ(0)` und
     `will-change: opacity` zwingen wir einen eigenen GPU-Layer pro Pane —
     der Compositor weiss dann, dass der Pane sich aendern wird, und
     rendert ihn beim Klassen-Wechsel sofort. Inaktive Panes bleiben
     durch `height:0; visibility:hidden` (style.css:6347) trotzdem
     unsichtbar, opacity:1 ist daher fuer sie risikofrei. */
  #service-pakete .tab-pane,
  #service-pakete .tab-pane.fade,
  #service-pakete .tab-pane.fade.show,
  #service-pakete .tab-pane.active,
  #service-pakete .tab-pane.active.show {
    transition: none !important;
    opacity: 1 !important;
    transform: translateZ(0);
    will-change: opacity;
  }
  #service-pakete .tab-pane ul.icon-list > li.wow.fadeInUp,
  #service-pakete .tab-pane .col-lg-5.wow,
  #service-pakete .tab-pane .paket-pane-subtitle,
  #service-pakete .tab-pane .paket-pane-cta,
  #service-pakete .nav-tabs .nav-link,
  #service-pakete.is-revealed .tab-pane.active.show ul.icon-list > li.wow.fadeInUp,
  #service-pakete.is-revealed .tab-pane.active.show .col-lg-5.wow,
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-subtitle,
  #service-pakete.is-revealed .tab-pane.active.show .paket-pane-cta,
  #service-pakete.is-revealed .nav-tabs .nav-link {
    animation: none !important;
    visibility: visible !important;
    opacity: 1 !important;
    transform: none !important;
    animation-delay: 0s !important;
  }
}


/* ============================================================================
   8b) Container & Navigation — auf großen Monitoren mehr Platz nutzen
   ----------------------------------------------------------------------------
   Bootstrap-Default ist 1140px max, das Navi sogar 1200px hard. Auf 1920er-
   Monitoren wirkt das schmal. Wir gehen einheitlich auf 1700px hoch.
   ============================================================================ */
@media (min-width: 1280px) {
  .container {
    max-width: 1400px;
  }
  /* Navi-Inner mitziehen — sonst sitzt das Menü weiterhin in 1200px-Bereich */
  .rd-navbar-classic.rd-navbar-static .rd-navbar-aside,
  .rd-navbar-classic.rd-navbar-static .rd-navbar-main {
    max-width: 1400px !important;
  }
}


/* ============================================================================
   9) Service-Karten (.thumbnail.thumbnail4)
   ----------------------------------------------------------------------------
   Glassmorphism + 3D-Tilt + Hover-Lift
   - Alle Karten EINHEITLICH hoch (Flex-Stretch)
   - Bilder in fester Aspect-Ratio (kein vertikales Springen)
   - Title mit min-height (auch bei 2- vs. 3-zeilig identische Block-Höhe)
   ============================================================================ */

/* Row mit Flex-Stretch + reduzierter Gutter, damit Cards in der Höhe gleich
   werden UND zusammen die volle Container-Breite ausfüllen (von Logo-links
   bis Flagge-rechts in der Navi). */
.row:has(> [class*="col-"] .thumbnail.thumbnail4) {
  align-items: stretch;
  /* Standard-Bootstrap-Gutter (15px je Seite) auf 8px halbieren */
  margin-left: -8px !important;
  margin-right: -8px !important;
}
[class*="col-"]:has(> .thumbnail.thumbnail4) {
  display: flex;
  padding-left: 8px !important;
  padding-right: 8px !important;
}

.thumbnail.thumbnail4 {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  /* Override gegen style.css:3396 — max-width:370px begrenzt die Cards */
  max-width: none !important;
  /* Override gegen style.css:3340 — margin:auto zentriert die Card im Col */
  margin-left: 0 !important;
  margin-right: 0 !important;
  padding: var(--space-6);
  text-align: left;
  border-radius: var(--radius-lg);
  background: color-mix(in oklab, white 15%, transparent);
  -webkit-backdrop-filter: blur(14px) saturate(120%);
  backdrop-filter: blur(14px) saturate(120%);
  border: 1px solid color-mix(in oklab, white 18%, transparent);
  box-shadow: var(--shadow-soft);

  transform-style: preserve-3d;
  perspective: 1200px;
  transition: transform var(--duration-base) var(--ease-spring),
              box-shadow var(--duration-base) var(--ease-smooth),
              background var(--duration-base) var(--ease-smooth);
  will-change: transform;
}

.context-dark .thumbnail.thumbnail4 {
  background: color-mix(in oklab, white 7%, transparent);
  border-color: color-mix(in oklab, white 18%, transparent);
}

.thumbnail.thumbnail4:hover {
  transform: translateY(-10px) rotateX(2deg) rotateY(-2deg);
  background: color-mix(in oklab, white 16%, transparent) !important;
  border-color: color-mix(in oklab, white 38%, transparent);
  box-shadow:
    0 18px 44px color-mix(in oklab, var(--brand-primary-dark) 40%, transparent),
    0 0 0 1px color-mix(in oklab, white 30%, transparent);
}

/* Karten-Titel — min-height für 2 Zeilen reserviert */
.thumbnail.thumbnail4 .thumbnail-title {
  font-size: var(--fs-h4);
  font-weight: 700;
  line-height: var(--leading-tight);
  letter-spacing: -0.01em;
  margin-top: 0;
  margin-bottom: var(--space-4);
  /* Reserviert Platz für 2 Zeilen — verhindert Springen zwischen Karten */
  min-height: calc(var(--fs-h4) * var(--leading-tight) * 2);
  display: flex;
  align-items: flex-start;
}

/* Thumbnail-Bilder — feste Aspect-Ratio + sanfte Skalierung */
.thumbnail.thumbnail4 .thumbnail-img {
  overflow: hidden;
  border-radius: var(--radius-md);
  margin-bottom: var(--space-6);
  margin-top: 0;
  aspect-ratio: 16 / 10;
  background: color-mix(in oklab, var(--brand-primary-dark) 30%, transparent);
}
.thumbnail.thumbnail4 .thumbnail-img img,
.thumbnail.thumbnail4 .thumbnail-img video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: var(--radius-md);
  display: block;
  position: static; /* override globalen `video { position: absolute }` aus style.css:473 */
  transition: transform var(--duration-slow) var(--ease-smooth);
}
.thumbnail.thumbnail4:hover .thumbnail-img img,
.thumbnail.thumbnail4:hover .thumbnail-img video {
  transform: scale(1.04);
}

/* Caption — füllt den restlichen Platz, damit alle Karten gleich hoch sind */
.thumbnail.thumbnail4 .caption {
  flex: 1 1 auto;
}
.thumbnail.thumbnail4 .caption p,
.thumbnail.thumbnail4 .caption p.blocksatz {
  font-size: var(--fs-body);
  line-height: var(--leading-normal);
  color: inherit;
  opacity: 0.95;
  /* Texte sind kurz und mit Bullet-Liste strukturiert — text-align:left
     ist sauberer als Blocksatz, der bei umbrechenden Bullet-Zeilen
     unschöne Wortabstände erzeugt. hyphens:auto trennt weiterhin
     lange Wörter wenn nötig. */
  text-align: left !important;
  hyphens: auto;
}

/* Wrapper um Karten-Titel auf konstante Mindesthöhe — Karte 1 hat 3-zeiligen
   Titel, Karten 2/3 haben 2-zeilige. Min-height auf dem Wrapper (statt auf
   dem h2) lässt den h2 natürlich rendern, sodass die ::before-Linie direkt
   unter dem Text bleibt — der zusätzliche Raum wird zwischen Linie und
   nachfolgender Animation gepuffert. */
.thumbnail.thumbnail4 .thumbnail-title-wrap {
  min-height: 9em;
}

/* Hauptsatz auf konstante Mindesthöhe, damit der erste Bullet aller drei
   Karten bündig auf gleicher Y-Position startet, auch wenn ein Hauptsatz
   nur 2 Zeilen hat und ein anderer 3. */
.thumbnail.thumbnail4 .caption p.blocksatz {
  min-height: 5em;
}

/* Echte Bullet-Liste mit Hanging-Indent: bricht die Zeile um, beginnt die
   Folgezeile unter dem ersten Wort, nicht unter dem Bullet-Punkt. */
.thumbnail.thumbnail4 .caption ul.thumbnail-bullets {
  list-style: none;
  padding: 0;
  margin: 0.75rem 0 0 0;
}
.thumbnail.thumbnail4 .caption ul.thumbnail-bullets li {
  position: relative;
  padding-left: 1.25rem;
  margin: 0 0 0.45rem 0;
  font-size: var(--fs-body);
  line-height: 1.45;
  text-align: left;
}
.thumbnail.thumbnail4 .caption ul.thumbnail-bullets li::before {
  content: "•";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--brand-amber, #d4a017);
  font-weight: 700;
}

/* Team-Karten (Unternehmen-Seite + Ansprechpartner-Block) bewusst im
   Blocksatz lassen wie im Original — die langen Bio-Texte kommen damit
   besser zur Geltung. hyphens:auto trennt lange Wörter sauber, was die
   "Rivers" minimiert. */
.parallax-container .thumbnail .caption p,
.parallax-container .thumbnail .caption p.blocksatz {
  hyphens: auto;
  -webkit-hyphens: auto;
}

/* Rollen-Untertitel auf Team-Karten (Ansprechpartner-Block + Unternehmen-
   Seite). Auf der Unternehmen-Seite folgt direkt der Bio-Blocksatz, daher
   etwas Abstand. Auf anderen Seiten kein nachfolgendes Element, dann ist
   margin-bottom unschädlich. */
.team-bg-section .thumbnail .caption .team-role {
  margin-top: 0;
  margin-bottom: 12px;
  font-size: 1.125rem;
  font-weight: 700;
}


/* ============================================================================
   10) Buttons — generelle Modernisierung (zusätzlich zu Hero-Buttons)
   ============================================================================ */
.button.button-primary,
.button-primary {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-6);
  border-radius: var(--radius-pill);
  font-weight: 600;
  letter-spacing: 0.02em;
  border: 1px solid transparent;
  background: var(--brand-primary);
  color: white;
  box-shadow: var(--shadow-soft);
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-base) var(--ease-smooth),
              background var(--duration-fast);
  text-decoration: none;
}
.button.button-primary:hover,
.button-primary:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-medium);
  background: var(--brand-primary-light);
  color: white;
}
.button.button-primary:active,
.button-primary:active {
  transform: translateY(0);
}


/* ============================================================================
   11) HubSpot-Formular (Kontakt) — Floating-Labels & Modern Inputs
   ----------------------------------------------------------------------------
   HubSpot generiert das Formular zur Laufzeit — wir stylen mit gezielten
   Selektoren auf die generierten Klassen.
   ============================================================================ */
.hbspt-form,
.hs-form {
  --hs-input-border: var(--border-subtle);
  --hs-input-focus: var(--brand-primary);
}

.hs-form .hs-form-field {
  position: relative;
  margin-bottom: var(--space-6);
}

.hs-form .hs-form-field label:not(.hs-error-msg) {
  display: block;
  font-size: 0.92em;
  font-weight: 500;
  color: var(--text-secondary);
  margin-bottom: var(--space-2);
  letter-spacing: 0.01em;
}

.hs-form input[type="text"],
.hs-form input[type="email"],
.hs-form input[type="tel"],
.hs-form input[type="number"],
.hs-form input[type="url"],
.hs-form select,
.hs-form textarea {
  width: 100%;
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-md);
  border: 1.5px solid var(--border-subtle);
  background: var(--surface-elevated);
  color: var(--text-primary);
  font-size: var(--fs-body);
  font-family: inherit;
  transition: border-color var(--duration-fast),
              box-shadow var(--duration-fast),
              background var(--duration-fast);
}

.hs-form input:hover,
.hs-form select:hover,
.hs-form textarea:hover {
  border-color: color-mix(in oklab, var(--brand-primary) 35%, var(--border-subtle));
}

.hs-form input:focus,
.hs-form select:focus,
.hs-form textarea:focus {
  outline: none;
  border-color: var(--brand-primary);
  box-shadow: 0 0 0 4px color-mix(in oklab, var(--brand-primary) 15%, transparent);
  background: white;
}

.hs-form .hs-button.primary,
.hs-form input[type="submit"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-3) var(--space-8);
  border-radius: var(--radius-pill);
  background: var(--brand-primary);
  color: white !important;
  font-weight: 600;
  letter-spacing: 0.02em;
  border: 1px solid transparent;
  cursor: pointer;
  box-shadow: var(--shadow-soft);
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-base),
              background var(--duration-fast);
}

.hs-form .hs-button.primary:hover,
.hs-form input[type="submit"]:hover {
  transform: translateY(-2px);
  background: var(--brand-primary-light);
  box-shadow: var(--shadow-medium);
}

.hs-form .hs-error-msg {
  color: oklch(55% 0.18 25);
  font-size: 0.85em;
  margin-top: var(--space-1);
}


/* ============================================================================
   12) Floating-Action-Buttons (Login, Kalender, Cookie) — fixed bottom-right
   ----------------------------------------------------------------------------
   Diese Buttons existieren bereits in index.php. Wir polishen sie auf:
   - Softere Schatten
   - Hover-Lift
   - Brand-konsistente Farben
   ============================================================================ */
a.login,
a.kalender,
a.cookie {
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-base);
  border-radius: var(--radius-pill);
  box-shadow: var(--shadow-medium);
}
a.login:hover,
a.kalender:hover,
a.cookie:hover {
  transform: translateY(-3px) scale(1.03);
  box-shadow: var(--shadow-glow);
}


/* ============================================================================
   13) Numbered List (Dienstleistungen) — modernisierte Zahlenmarker
   ----------------------------------------------------------------------------
   WICHTIG: Wir nutzen den "list-counter" wie im Original (style.css:287),
   damit die HTML-Inline `counter-reset: list-counter X` pro Liste greift.
   Sonst zeigen alle Listen "01".
   ============================================================================ */
ul.numbered-list {
  list-style: none;
  padding-left: 0;
  /* Kein eigenes counter-reset — das HTML setzt es inline pro <ul> */
}
ul.numbered-list li {
  position: relative;
  padding-left: var(--space-12);
  padding-bottom: var(--space-2);
  counter-increment: list-counter;
  font-weight: 500;
}
ul.numbered-list li::before {
  content: counter(list-counter, decimal-leading-zero);
  position: absolute;
  left: 0;
  top: -4px;
  font-size: var(--fs-h4);
  font-weight: 700;
  background: linear-gradient(
    135deg,
    var(--brand-primary),
    var(--brand-accent)
  );
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  letter-spacing: -0.02em;
}


/* ============================================================================
   14) Embed-Video (Infografik) — Schöner Frame statt nackt
   ============================================================================ */
.embed-responsive.embed-responsive-16by9 {
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-medium);
  border: 1px solid var(--border-subtle);
  background: var(--surface-muted);
}


/* ============================================================================
   15) View Transitions — jetzt INLINE in content/inc_head.php (Session 48
   Teil 16): persistente Navi (view-transition-name: wpit-nav) + Inhalt instant
   (animation:none auf root). Der alte Root-Crossfade hier wurde entfernt, weil
   er auf Safari beim Reiterwechsel den "doppelten Aufbau" verursachte.
   ============================================================================ */


/* ============================================================================
   16) Print-Stylesheet — schlanker für PDF-Export der Seite
   ============================================================================ */
@media print {
  .rd-navbar,
  a.login,
  a.kalender,
  a.cookie,
  .ie-panel,
  .swiper-slider .video-wrapper {
    display: none !important;
  }
  body {
    background: white !important;
  }
}


/* ============================================================================
   12) HubSpot-Formular Skeleton-Loader
   ----------------------------------------------------------------------------
   Reserviert beim ersten Paint den Platz, den das HubSpot-Formular spaeter
   einnimmt. Verhindert Cumulative Layout Shift, blendet das echte Formular mit
   Cross-Fade ein, sobald onFormReady gefeuert hat.
   ============================================================================ */

.hs-form-shell {
  position: relative;
  width: 100%;
  contain: layout;
  transition: min-height 480ms var(--ease-smooth);
}

.hs-form-shell--contact { min-height: 880px; }
.hs-form-shell--inquiry { min-height: 1200px; }

@media (min-width: 768px) {
  .hs-form-shell--contact { min-height: 600px; }
  .hs-form-shell--inquiry { min-height: 900px; }
}

.hs-form-shell.is-ready {
  min-height: 0;
}

/* Skeleton-Inhalt -------------------------------------------------------- */
.hs-form-skeleton {
  position: absolute;
  inset: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-4);
  padding: var(--space-2) 0;
  pointer-events: none;
  transition: opacity 320ms var(--ease-smooth);
}

@media (min-width: 768px) {
  .hs-form-skeleton {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-4) var(--space-6);
  }
}

.hs-form-skeleton > span {
  display: block;
  height: 56px;
  border-radius: var(--radius-md);
  background: color-mix(in oklab, var(--brand-primary) 8%, white);
  border: 1px solid color-mix(in oklab, var(--brand-primary) 12%, transparent);
  animation: hsSkeletonPulse 1600ms var(--ease-smooth) infinite;
}

.hs-form-skeleton > span:nth-child(2) { animation-delay: 120ms; }
.hs-form-skeleton > span:nth-child(3) { animation-delay: 240ms; }
.hs-form-skeleton > span:nth-child(4) { animation-delay: 360ms; }
.hs-form-skeleton > span:nth-child(5) { animation-delay: 480ms; }
.hs-form-skeleton > span:nth-child(6) { animation-delay: 600ms; }
.hs-form-skeleton > span:nth-child(7) { animation-delay: 720ms; }

.hs-form-skeleton .hs-form-skeleton__textarea {
  grid-column: 1 / -1;
  height: 140px;
  animation-delay: 840ms;
}

.hs-form-skeleton .hs-form-skeleton__button {
  grid-column: 1 / -1;
  justify-self: start;
  width: min(220px, 60%);
  height: 52px;
  border-radius: var(--radius-pill);
  background: color-mix(in oklab, var(--brand-primary) 22%, white);
  border-color: color-mix(in oklab, var(--brand-primary) 28%, transparent);
  animation-delay: 960ms;
  margin-top: var(--space-2);
}

@keyframes hsSkeletonPulse {
  0%, 100% { opacity: 0.55; }
  50%      { opacity: 1; }
}

/* Cross-Fade beim Form-Ready -------------------------------------------- */
.hs-form-shell .hs-form-target {
  opacity: 0;
  transition: opacity 400ms var(--ease-smooth) 80ms;
}

.hs-form-shell.is-ready .hs-form-target {
  opacity: 1;
}

.hs-form-shell.is-ready .hs-form-skeleton {
  opacity: 0;
  pointer-events: none;
}

/* Fallback bei Lade-Fehler ---------------------------------------------- */
.hs-form-fallback {
  position: relative;
  z-index: 2;
  padding: var(--space-6);
  border-radius: var(--radius-md);
  background: color-mix(in oklab, var(--brand-primary) 6%, white);
  border: 1px solid color-mix(in oklab, var(--brand-primary) 14%, transparent);
  color: var(--text-secondary);
  font-size: var(--fs-body);
  line-height: var(--leading-normal);
}

.hs-form-shell.is-failed .hs-form-skeleton {
  opacity: 0;
  pointer-events: none;
}

/* Reduced Motion: keine Pulsation, kein Cross-Fade ---------------------- */
@media (prefers-reduced-motion: reduce) {
  .hs-form-skeleton > span,
  .hs-form-skeleton .hs-form-skeleton__textarea,
  .hs-form-skeleton .hs-form-skeleton__button {
    animation: none !important;
    opacity: 0.7;
  }
  .hs-form-shell,
  .hs-form-shell .hs-form-target,
  .hs-form-shell .hs-form-skeleton {
    transition: none !important;
  }
}


/* ============================================================================
   13) Hauptnavigation — Akzent-Gewicht ueber Manrope-Weight statt eigener Font.
   ----------------------------------------------------------------------------
   Frueher: DM Sans als zweite Akzent-Schrift fuer Navigation, Hero-Eyebrow,
   Hero-CTA, Hero-Stat-Zahlen etc. Konsolidiert auf eine einzige Schrift
   (Manrope, geladen via Google Fonts mit font-display: swap). Hierarchie
   wird ausschliesslich ueber Weight (400/500/600/700/800), Letter-Spacing
   und Groesse erzeugt — keine zweite Font-Datei mehr.
   ============================================================================ */
.rd-nav-link {
  font-weight: 600;
  letter-spacing: 0.01em;
}


/* ============================================================================
   14) Ansprechpartner / Team — Animated Mesh Background
   ----------------------------------------------------------------------------
   Ersetzt das vorherige Hintergrund-Video (wp_team.mp4) durch einen reinen
   CSS-Effekt: drei weiche, langsam treibende Brand-Lichthoefe ueber einem
   tiefen Brand-Blau-Verlauf, ein dezentes Grid-Overlay aus Spider-Web-Linien.
   Wirkt edel, modern und ruhig — keinerlei Netzwerk-Last, GPU-billig.
   ============================================================================ */

.team-bg-section {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  /* Fallback-Color falls auf iOS-Safari/aelteren Mobile-Browsern das
     radial-gradient nicht greift — sonst weisser Body-BG mit weisser
     Schrift = unlesbar (User-Bug iPhone, 2026-04-30). */
  background-color: #0a2545 !important;
  background-image: radial-gradient(ellipse at top, #14528f 0%, #0a2545 70%) !important;
}

/* JS-generierter Parallax-Wrapper neutralisieren */
.team-bg-section > .material-parallax {
  display: none !important;
}

.team-bg-section .parallax-content {
  position: relative;
  z-index: 1;
}

.team-bg-mesh {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

/* Drei weiche Brand-Lichthoefe — wandern dezent durch die Sektion (reine Translate-Bewegung, keine Pulsation). */
.team-bg-mesh__orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(80px);
  mix-blend-mode: screen;
  will-change: transform, opacity;
}

.team-bg-mesh__orb--1 {
  width: 55vw;
  height: 55vw;
  top: -10%;
  left: -5%;
  background: radial-gradient(circle, rgba(42, 166, 224, 0.85) 0%, transparent 65%);
  animation: teamMeshDrift1 28s ease-in-out infinite;
}

.team-bg-mesh__orb--2 {
  width: 50vw;
  height: 50vw;
  bottom: -15%;
  right: -5%;
  background: radial-gradient(circle, rgba(98, 164, 255, 0.75) 0%, transparent 65%);
  animation: teamMeshDrift2 36s ease-in-out infinite;
}

.team-bg-mesh__orb--3 {
  width: 40vw;
  height: 40vw;
  top: 25%;
  left: 30%;
  background: radial-gradient(circle, rgba(180, 220, 255, 0.45) 0%, transparent 65%);
  animation: teamMeshDrift3 32s ease-in-out infinite;
}

@keyframes teamMeshDrift1 {
  0%, 100% { transform: translate(0, 0); }
  25%      { transform: translate(16vw, 5vh); }
  50%      { transform: translate(22vw, 14vh); }
  75%      { transform: translate(7vw, 8vh); }
}

@keyframes teamMeshDrift2 {
  0%, 100% { transform: translate(0, 0); }
  33%      { transform: translate(-18vw, -7vh); }
  66%      { transform: translate(-9vw, -16vh); }
}

@keyframes teamMeshDrift3 {
  0%, 100% { transform: translate(0, 0); }
  25%      { transform: translate(-13vw, 7vh); }
  50%      { transform: translate(9vw, 13vh); }
  75%      { transform: translate(-5vw, -5vh); }
}

@media (prefers-reduced-motion: reduce) {
  .team-bg-mesh__orb {
    animation: none !important;
  }
}

/* Mobile: Mesh-Lichthoefe ausblenden — Orb #2 (unten rechts, screen-blend)
   ueberlagert auf gestapelten Mobile-Layouts das letzte Foto sichtbar
   (wirkt wie ein blau-grauer Filter ueber Johnny). Brand-Blau-Verlauf
   der Sektion bleibt erhalten. (Bug 2026-05-07) */
@media (max-width: 991.98px) {
  .team-bg-section .team-bg-mesh {
    display: none;
  }
}


/* ============================================================================
   15) Ansprechpartner-Karten — dezenter Hover-Lift mit Foto-Zoom
   ----------------------------------------------------------------------------
   Mitarbeiter-Bilder auf der Team-Sektion bekommen beim Hover einen sanften
   Lift, leichten Foto-Zoom und einen weichen Brand-Glow — wirkt lebendiger.
   ============================================================================ */
.team-bg-section .thumbnail {
  transition: transform var(--duration-base) var(--ease-smooth);
}
.team-bg-section .thumbnail .thumbnail-img {
  overflow: hidden;
  border-radius: 5px;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.18);
  transition: box-shadow var(--duration-base) var(--ease-smooth);
}
.team-bg-section .thumbnail .thumbnail-img img {
  transition: transform 600ms var(--ease-smooth), filter 400ms var(--ease-smooth);
}
.team-bg-section .thumbnail:hover {
  transform: translateY(-6px);
}
.team-bg-section .thumbnail:hover .thumbnail-img {
  box-shadow:
    0 14px 36px rgba(0, 0, 0, 0.32),
    0 0 0 1px color-mix(in oklab, var(--brand-accent) 30%, transparent);
}
.team-bg-section .thumbnail:hover .thumbnail-img img {
  transform: scale(1.04);
  filter: brightness(1.06) saturate(1.05);
}

@media (prefers-reduced-motion: reduce) {
  .team-bg-section .thumbnail,
  .team-bg-section .thumbnail .thumbnail-img,
  .team-bg-section .thumbnail .thumbnail-img img {
    transition: none !important;
  }
  .team-bg-section .thumbnail:hover {
    transform: none !important;
  }
  .team-bg-section .thumbnail:hover .thumbnail-img img {
    transform: none !important;
    filter: none !important;
  }
}


/* ============================================================================
   16) Floating-Buttons (Login / Termin / Cookie / Up-Arrow) — Farbe je nach Scroll-Sektion
   ----------------------------------------------------------------------------
   Jeder Button bekommt INDIVIDUELL die Klasse `.is-on-light` per scroll-toggles.js,
   sobald seine Mitte ueber einer hellblauen Sektion liegt. So faerben sich die
   Buttons nacheinander ein, je nachdem wie weit der hellblaue Bereich beim
   Scrollen jeden einzelnen Button erreicht hat.
   ============================================================================ */
a.login.is-on-light,
a.kalender.is-on-light,
a.cookie.is-on-light,
.ui-to-top.is-on-light {
  background-color: var(--brand-primary) !important;
  border-color: var(--brand-primary) !important;
}
a.login.is-on-light:hover,
a.kalender.is-on-light:hover,
a.cookie.is-on-light:hover,
.ui-to-top.is-on-light:hover {
  background-color: var(--brand-primary-dark) !important;
  border-color: var(--brand-primary-dark) !important;
}

/* Mobile-Menue offen (rd-navbar-toggle hat .active): Sidebar ist dunkelblau —
   die .is-on-light-Variante (Brand-Dunkelblau) wuerde darin verschwinden.
   Solange das Menue offen ist, FABs auf Default-Hellblau (#068ed6) zwingen,
   damit sie auch auf dunklem Sidebar-Background sichtbar sind. Schliesst
   sich das Menue, greift wieder die normale scroll-toggles-Logik.
   (Bug 2026-05-07) */
@media (max-width: 991.98px) {
  body:has(.rd-navbar-toggle.active) a.login.is-on-light,
  body:has(.rd-navbar-toggle.active) a.kalender.is-on-light,
  body:has(.rd-navbar-toggle.active) a.cookie.is-on-light,
  body:has(.rd-navbar-toggle.active) .ui-to-top.is-on-light {
    background-color: #068ed6 !important;
    border-color: #068ed6 !important;
  }
}

a.login,
a.kalender,
a.cookie,
.ui-to-top {
  transition:
    transform var(--duration-fast) var(--ease-spring),
    box-shadow var(--duration-base),
    background-color 350ms var(--ease-smooth),
    border-color 350ms var(--ease-smooth);
}

/* Mobile: Up-Arrow auf gleiche x-Position wie die anderen 3 Floating-Buttons.
   Theme-Default (style.css) hat .ui-to-top auf left:15px unter 768px und ab
   768px auf left:40px. Login/Kalender/Cookie liegen unter <=991.98px bei
   left:8px (siehe Mobile-Block weiter unten), daher zogen wir den Up-Arrow
   2026-05-10 ebenfalls nach links auf left:8px, damit alle vier Floating-
   Buttons auf einer vertikalen Linie sitzen. */
@media (max-width: 991.98px) {
  .ui-to-top {
    left: 8px;
  }
}

/* Mobile (echtes Geraet): Theme-Default in style.css:4087 blendet den
   Up-Arrow auf echten Mobile-/Tablet-Geraeten via `html.mobile .ui-to-top
   { display: none !important }` aus — die Klassen werden vom RD-Theme-JS
   per User-Agent-Sniffing gesetzt. Auf einem iPhone war der Button damit
   beim Runterscrollen unsichtbar; in Chrome-DevTools-Mobile-Mode greift
   die Klasse nicht, daher fiel das vorher nicht auf. Wir machen den Button
   wieder sichtbar — er ist auf Touch-Geraeten genauso nuetzlich wie auf
   Desktop, gerade auf langen Seiten wie Dienstleistungen oder Datenschutz.
   (Bug 2026-05-07) */
html.mobile .ui-to-top,
html.tablet .ui-to-top {
  display: flex !important;
}


/* ============================================================================
   17) Hero-Statement — Repositionierung "kein Spediteur, sondern Einkaufsbüro"
   ----------------------------------------------------------------------------
   Asymmetrische, magazin-artige Anordnung: Statement-Block links, Stats-Bar
   als Streifen am Hero-Boden. Video bleibt Vollbild-Hintergrund. Linker
   Verdunkelungs-Gradient gibt dem Text seinen Kontrast, ohne das Video
   komplett zu schlucken.

   Greift nur wenn die Swiper-Section die Klasse `.hero-statement` trägt —
   andere Hero-Setups (z. B. Subpages) bleiben unangetastet.
   ============================================================================ */

/* Vertikales Zentrieren + linke Ausrichtung — überschreibt das alte
   .text-center / .text-right Layout aus dem Original-Markup */
.hero-statement.swiper-slider .swiper-wrapper {
  text-align: left;
}

.hero-statement.swiper-slider .swiper-slide-caption {
  display: flex;
  /* Content sitzt im oberen Drittel — verhindert Kollision mit dem
     fixed-positioned ProvenExpert-Badge in der linken unteren Ecke.
     padding-top deutlich groesser (vorher 96/14vh/220), damit Eyebrow +
     Headline genug Atmungsabstand zum Logo / Navigation oben haben und
     nicht "gequetscht" wirken. */
  align-items: flex-start;
  min-height: 100%;
  padding-top: clamp(150px, 19vh, 280px);
  padding-bottom: 200px; /* Platz für Stats-Bar am unteren Rand */
}

.hero-statement.swiper-slider .swiper-slide-caption .row {
  width: 100%;
  margin-left: 0;
  margin-right: 0;
}

/* Linker Verdunkelungs-Gradient für Text-Kontrast — überschreibt die
   globale Vignette aus §6 für diesen Hero-Typ */
.hero-statement.swiper-slider .swiper-slide::after {
  background: linear-gradient(
    100deg,
    color-mix(in oklab, var(--brand-primary-dark) 80%, transparent) 0%,
    color-mix(in oklab, var(--brand-primary-dark) 45%, transparent) 50%,
    transparent 80%
  );
}

.hero-statement__inner {
  position: relative;
  color: white;
  max-width: 760px;
}

/* Eyebrow — kleine Pill oben drüber, definiert die Kategorie */
.hero-eyebrow {
  display: inline-block;
  font-size: 0.78rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: 600;
  color: color-mix(in oklab, var(--brand-accent) 30%, white);
  margin: 0 0 var(--space-6);
  padding: var(--space-2) var(--space-4);
  border: 1px solid color-mix(in oklab, white 28%, transparent);
  border-radius: var(--radius-pill);
  background: color-mix(in oklab, var(--brand-primary-dark) 40%, transparent);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) both;
}

/* Headline — zwei Zeilen mit Kontrast-Pattern (durchgestrichen + positiv) */
.hero-headline {
  font-size: var(--fs-h1);
  line-height: 1.05;
  font-weight: 700;
  letter-spacing: -0.025em;
  margin: 0 0 var(--space-6);
  color: white;
  text-shadow: 0 2px 24px color-mix(in oklab, var(--brand-primary-dark) 70%, transparent);
}

/* Akzent auf "Einkaufsbüro in China": warmer Goldton statt Cyan-Blau,
   damit der Kontrast gegen das blaue Hero-Video tragfaehig ist und der
   Begriff visuell als Statement-Kern funktioniert. */
.hero-headline__accent {
  color: var(--brand-amber);
  font-style: normal;
  filter: drop-shadow(0 2px 18px color-mix(in oklab, var(--brand-amber) 55%, transparent));
}

/* Subline — die konkreten Leistungen aufgezählt */
.hero-subline {
  font-size: var(--fs-h5);
  font-weight: 400;
  line-height: var(--leading-normal);
  color: color-mix(in oklab, white 95%, var(--brand-accent));
  margin: 0 0 var(--space-8);
  max-width: 660px;
  text-shadow: 0 1px 12px color-mix(in oklab, var(--brand-primary-dark) 60%, transparent);
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) 400ms both;
}

/* CTA-Reihe - primary + ghost nebeneinander, gleiche Hoehe.
   align-items: stretch sorgt dafuer dass der einzeilige primary auf die
   Hoehe des zweizeiligen stacked-buttons mitwaechst. */
.hero-cta-row {
  display: flex;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: var(--space-3);
  max-width: 580px;
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) 550ms both;
}

.hero-cta {
  /* Beide Buttons gleich breit, gleich hoch. height:5rem (80px) explizit
     gesetzt damit der einzeilige primary nicht durch alte Theme-Regeln
     ungleich gross wird gegenueber dem zweizeiligen stacked.
     min-width:0 verhindert Subpixel-Wrap.
     margin:0 ueberschreibt den 30px-margin-top von style.css `* + .button`,
     der sonst den zweiten Button um 30px nach unten verschiebt. */
  flex: 1 1 0;
  min-width: 0;
  height: 5rem;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-6);
  border-radius: var(--radius-pill);
  font-weight: 700;
  letter-spacing: 0.01em;
  font-size: var(--fs-body);
  line-height: 1.2;
  text-decoration: none;
  text-align: center;
  border: 1.5px solid transparent;
  cursor: pointer;
  transition: transform var(--duration-fast) var(--ease-spring),
              box-shadow var(--duration-base) var(--ease-smooth),
              background var(--duration-fast),
              border-color var(--duration-fast),
              color var(--duration-fast);
}
/* Primary - Bernstein/Gold mit dunklem Text, hoechstmoeglicher Kontrast
   gegen blauen Hero-Hintergrund (Briefing §12 Farbschema-Vorschlag).
   "Atmet" dezent: ein ::after-Pseudo-Layer mit transform+opacity-Animation
   pulsiert als Aura ausserhalb des Buttons. transform und opacity sind
   COMPOSITOR-only Properties — laufen auf der GPU, kein Style+Layout-Repaint
   pro Frame. Frueher animierten wir box-shadow direkt auf dem Button selbst
   (Performance-Recovery v18: das war non-composited und kostete Hauptthread). */
.hero-cta--primary {
  background: var(--brand-amber);
  color: #1a1a1a;
  position: relative;
  isolation: isolate;
  box-shadow:
    0 6px 18px color-mix(in oklab, var(--brand-amber) 50%, transparent),
    inset 0 0 0 1px color-mix(in oklab, white 22%, transparent);
}

.hero-cta--primary::after {
  content: '';
  position: absolute;
  inset: -2px;
  border-radius: inherit;
  pointer-events: none;
  z-index: -1;
  background: radial-gradient(
    circle at center,
    color-mix(in oklab, var(--brand-amber) 38%, transparent) 0%,
    color-mix(in oklab, var(--brand-amber) 14%, transparent) 60%,
    transparent 85%
  );
  transform: scale(0.96);
  opacity: 0.55;
  animation: hero-cta-breathe 3600ms ease-in-out infinite;
  will-change: transform, opacity;
}

.hero-cta--primary:hover,
.hero-cta--primary:focus-visible {
  background: var(--brand-amber-light);
  color: #1a1a1a;
  transform: translateY(-2px);
  box-shadow:
    0 14px 32px color-mix(in oklab, var(--brand-amber) 70%, transparent),
    inset 0 0 0 1px color-mix(in oklab, white 35%, transparent);
}
.hero-cta--primary:hover::after,
.hero-cta--primary:focus-visible::after {
  animation-play-state: paused;
  opacity: 0;
}

/* Atemschlag-Animation: nur transform + opacity (Compositor-only).
   Visuell identisch zu vorher — Aura waechst und verstaerkt sich, dann
   schrumpft sie wieder. Aber GPU-only, null Hauptthread-Last. */
@keyframes hero-cta-breathe {
  0%, 100% { transform: scale(0.96); opacity: 0.5; }
  50%      { transform: scale(1.10); opacity: 0.95; }
}

/* Reduced-Motion: keine Atmung, Button bleibt sichtbar gold */
@media (prefers-reduced-motion: reduce) {
  .hero-cta--primary {
    animation: none !important;
    transform: none !important;
  }
}
/* Ghost - durchsichtig mit weisser Outline, gleiche Groesse wie primary */
.hero-cta--ghost {
  background: color-mix(in oklab, var(--brand-primary-dark) 40%, transparent);
  color: white;
  border-color: color-mix(in oklab, white 45%, transparent);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
.hero-cta--ghost:hover,
.hero-cta--ghost:focus-visible {
  background: color-mix(in oklab, white 16%, transparent);
  color: white;
  border-color: color-mix(in oklab, white 70%, transparent);
  transform: translateY(-2px);
}
.hero-cta__arrow {
  display: inline-block;
  transition: transform var(--duration-base) var(--ease-spring);
}
.hero-cta--ghost:hover .hero-cta__arrow,
.hero-cta--ghost:focus-visible .hero-cta__arrow {
  transform: translateX(4px);
}

/* Zweizeilige Variante - "Unsere Service-Pakete" stapelt
   visuell hat der Button damit mehr Hoehe und passt besser neben den
   einzeiligen Primary-CTA, ohne dass der Text rechts/links am Rand klebt. */
.hero-cta--stacked .hero-cta__lines {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
  line-height: 1.15;
}
.hero-cta--stacked .hero-cta__lines > span:first-child {
  font-weight: 500;
  font-size: 0.85em;
  letter-spacing: 0.04em;
  opacity: 0.85;
}
.hero-cta--stacked .hero-cta__lines > span:last-child {
  font-weight: 700;
}
.hero-cta--stacked {
  line-height: 1.15;
}

/* Stats-Bar — schmaler Streifen am unteren Hero-Rand */
.hero-statement .hero-stats {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  padding: var(--space-6) 0;
  background: linear-gradient(
    180deg,
    transparent 0%,
    color-mix(in oklab, var(--brand-primary-dark) 70%, transparent) 30%,
    color-mix(in oklab, var(--brand-primary-dark) 92%, transparent) 100%
  );
  -webkit-backdrop-filter: blur(10px) saturate(120%);
  backdrop-filter: blur(10px) saturate(120%);
  /* Kein border-top — Glas-Effekt fadet sauber per Gradient ins Video,
     keine sichtbare Trennlinie. */
  border-top: none;
  animation: hero-fade-up var(--duration-slow) var(--ease-smooth) 700ms both;
}

/* Stats verteilen sich über die volle Container-Breite:
   - erste Stat sitzt linksbündig zum Container-Rand (passt zum Logo darüber)
   - letzte Stat sitzt rechtsbündig zum Container-Rand (passt zur Sprachflagge)
   - die mittleren zwei verteilen sich gleichmäßig dazwischen
   Statt fester 1fr-Spalten nutzen wir Flex mit space-between - so wachsen
   die Abstände mit der Container-Breite mit. */
.hero-stats__grid {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-4);
  margin: 0;
  padding: 0;
  text-align: left;
}

.hero-stat {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  padding-left: var(--space-4);
  border-left: 2px solid color-mix(in oklab, var(--brand-accent) 75%, transparent);
  flex: 0 1 auto;
}

/* Letzte Stat: gespiegelt - Border, Padding und Inhalt rechts statt links,
   damit "300+" optisch am rechten Container-Rand klebt (wie die Sprachflagge). */
@media (min-width: 992px) {
  .hero-stat:last-child {
    text-align: right;
    padding-left: 0;
    padding-right: var(--space-4);
    border-left: none;
    border-right: 2px solid color-mix(in oklab, var(--brand-accent) 75%, transparent);
  }
  .hero-stat:last-child .hero-stat__number {
    justify-content: flex-end;
  }
}
.hero-stat__number {
  display: flex;
  align-items: baseline;
  margin: 0;
  font-size: clamp(1.85rem, 1.2rem + 1.6vw, 2.75rem);
  font-weight: 700;
  letter-spacing: -0.03em;
  color: white;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}
.hero-stat__suffix {
  margin-left: 0.05em;
  font-size: 0.6em;
  color: var(--brand-accent);
  font-weight: 700;
}
.hero-stat__label {
  font-size: 0.85rem;
  font-weight: 500;
  color: color-mix(in oklab, white 85%, transparent);
  letter-spacing: 0.01em;
  line-height: 1.3;
  margin: 0;
}

/* Tablet & Mobile — Layout-Anpassungen
   Auf Tablet/Mobile lösen wir die Stats-Bar aus dem absolute-Wrapper,
   damit sie nicht mit den fixed Floating-Buttons (Login/Kalender) und
   dem ProvenExpert-Badge im linken unteren Hero-Bereich kollidiert.

   Wichtig: .swiper-slide hat von Swiper aus display:flex / flex-direction:row.
   Damit die statische Stats-Bar UNTER dem Caption-Block landet (nicht daneben),
   zwingen wir das Slide hier auf flex-direction:column und lösen die starre
   Höhe. */
@media (max-width: 991.98px) {
  .hero-statement.swiper-slider .swiper-slide {
    flex-direction: column;
    height: auto !important;
    min-height: 100vh;
  }

  .hero-statement.swiper-slider .swiper-slide-caption {
    min-height: 0;
    padding-bottom: var(--space-16);
    flex: 1 1 auto;
  }

  .hero-statement .hero-stats {
    position: static;
    background: var(--brand-primary-dark);
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    border-top: none;
    padding: var(--space-8) 0;
    animation: none;
    flex: 0 0 auto;
  }

  .hero-stats__grid {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-4);
    padding: 0 var(--space-4);
  }
  .hero-stat {
    padding-left: var(--space-4);
    flex-direction: row;
    align-items: baseline;
    gap: var(--space-4);
    width: 100%;
    flex: 0 0 auto;
  }
  .hero-stat__number {
    font-size: 1.85rem;
    flex: 0 0 auto;
    min-width: 96px;
  }
  .hero-stat__label {
    font-size: 0.85rem;
    flex: 1 1 auto;
  }
}

@media (max-width: 575.98px) {
  .hero-statement.swiper-slider .swiper-slide-caption {
    padding-top: clamp(80px, 10vh, 140px);
    padding-bottom: var(--space-12);
  }
  .hero-headline__line--negate {
    font-size: 0.65em;
  }
  /* Auf Mobile alle Hero-Buttons (Erstgespraech, Service-Pakete,
     Erklaervideo-Trigger) untereinander gestapelt UND mittig zentriert
     darstellen. Die Floating-Icons (Login/Kalender/Cookie) liegen
     fixed-position dahinter, ueberlappen visuell aber kaum, weil sie klein
     und in der unteren Bildschirmhaelfte fixiert sind. */
  .hero-cta-row {
    padding-left: 0;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    max-width: none;
    width: 100%;
  }
  .hero-cta {
    width: 100%;
    max-width: 280px;
    flex: 0 0 auto;
    height: auto;
    min-height: 64px;
    justify-content: center;
    /* Mobile: vertical padding 16px statt 12px, damit der Inhalt nicht
       direkt am Border-Radius klebt. Horizontal bleibt 20px. */
    padding: var(--space-4) var(--space-5);
    font-size: 0.95rem;
    margin-left: auto;
    margin-right: auto;
  }
  /* Stacked-Button bleibt auch auf Mobile flex-direction:row (Default) —
     der Pfeil hero-cta__arrow sitzt rechts neben den Lines (UNSERE über
     SERVICE-PAKETE), nicht als dritte Zeile darunter. Frueherer Bug:
     `flex-direction: column` hier hat den Pfeil unter den Text gequetscht. */
  .hero-cta--stacked {
    line-height: 1.15;
  }
  .hero-cta--stacked .hero-cta-eyebrow {
    margin-bottom: 2px;
  }
  /* Floating-Action-Buttons (Login/Kalender/Cookie) auf Mobile naeher an
     den linken Rand, damit sie die zentrierte Hero-CTA-Row (max-width 280)
     nicht ueberdecken. Theme-Default in style.css ist left:40px — bei
     375px Viewport wuerde das 40-90px ueberlappen mit dem CTA, der bei
     ca. x=47 anfaengt. Mit left:8px nur noch ~10px Schnitt mit dem CTA-
     Linksrand, akzeptabel. */
  a.login,
  a.kalender,
  a.cookie {
    left: 8px;
  }
  /* Erklaervideo-Trigger-Reihe gleich breit zentrieren wie die CTAs. */
  .hero-video-trigger-row {
    max-width: 280px !important;
    margin-left: auto !important;
    margin-right: auto !important;
    padding-left: 0 !important;
  }
  .hero-video-trigger {
    width: 100% !important;
    justify-content: center !important;
  }
  .hero-eyebrow {
    font-size: 0.7rem;
    padding: var(--space-1) var(--space-3);
  }
}


/* ============================================================================
   18) Trust-Bar — direkt unter dem Hero, vor den Content-Sektionen
   ----------------------------------------------------------------------------
   Verstärkt die Repositionierung: hier stehen die Mitgliedschaften &
   Kooperationen (AHK, BNI, SCOR, Grüner Punkt) — Vertrauenssignale, die
   einem reinen Spediteur fehlen.
   ============================================================================ */
.trust-bar {
  padding: var(--space-6) 0;
  background: linear-gradient(
    180deg,
    var(--surface-base) 0%,
    var(--surface-muted) 100%
  );
  border-bottom: 1px solid var(--border-subtle);
}

.trust-bar__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-8);
  flex-wrap: wrap;
}

.trust-bar__claim {
  margin: 0;
  font-size: var(--fs-body);
  line-height: 1.45;
  color: var(--text-secondary);
  flex: 1 1 480px;
}
.trust-bar__claim-strong {
  display: block;
  font-weight: 700;
  color: var(--text-primary);
  font-size: 1.05em;
  letter-spacing: -0.005em;
  margin-bottom: var(--space-2);
}
/* Jede Aussage als eigene Zeile - klar lesbar, scanbar */
.trust-bar__claim-line {
  display: block;
}

.trust-bar__badges {
  display: flex;
  align-items: center;
  gap: var(--space-6);
  list-style: none;
  margin: 0;
  padding: 0;
  flex-wrap: wrap;
}
.trust-bar__badge {
  display: flex;
  align-items: center;
}
.trust-bar__badge img {
  max-height: 72px;
  width: auto;
  transition: opacity var(--duration-base) var(--ease-smooth),
              transform var(--duration-base) var(--ease-spring),
              filter var(--duration-base) var(--ease-smooth);
}
/* BNI-Logo: BNI-Mitgliedschaft, querformatige Wortmarke */
.trust-bar__badge--bni img {
  max-height: 64px;
  width: auto;
}
/* AHK-Logo: deutlich groesser anzeigen, weil das Logo querformatig ist */
.trust-bar__badge--ahk img {
  max-height: 64px;
  width: auto;
}
/* Drittlogos (z. B. Gruener Punkt): leichter Grayscale, beim Hover poppt es.
   Gruener Punkt ist quadratisch und wirkt bei gleicher max-height kleiner als
   die querformatigen BNI/AHK. Per transform: scale skalieren wir ihn visuell
   um ~35 %, ohne dass die Box-Hoehe der Trust-Bar dadurch waechst. */
.trust-bar__badge:not(.trust-bar__badge--ahk):not(.trust-bar__badge--bni) img {
  filter: grayscale(0.2);
  opacity: 0.9;
  transform: scale(1.35);
  transform-origin: center;
}
.trust-bar__badge:not(.trust-bar__badge--ahk):not(.trust-bar__badge--bni) a:hover img,
.trust-bar__badge:not(.trust-bar__badge--ahk):not(.trust-bar__badge--bni):hover img {
  transform: scale(1.35) translateY(-2px);
}
.trust-bar__badge a:hover img,
.trust-bar__badge:hover img {
  filter: grayscale(0);
  opacity: 1;
  transform: translateY(-2px);
}

@media (max-width: 767.98px) {
  /* Mobile: Trust-Bar kompakt halten. Vorher (24 px Trust-Bar-Padding +
     16 px gap zwischen Claim und Badges + grosszuegige Badge-Abstaende)
     liess optisch zu viel weissen Raum zwischen Text und Logos entstehen.
     Padding reduziert auf 12 px, gap auf 8 px, Badges enger gestapelt.
     (Bug 2026-05-10) */
  .trust-bar {
    padding: var(--space-3) 0;
  }
  .trust-bar__inner {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-2);
    text-align: left;
  }
  .trust-bar__badges {
    gap: var(--space-4);
    margin-top: 0;
  }
  .trust-bar__badge img {
    max-height: 56px;
  }
}

/* Trust-Bar Reveal beim Hinscrollen — Claim-Zeilen gestaffelt von oben nach
   unten, Logos parallel von rechts. JS setzt .is-revealed via
   IntersectionObserver (siehe js/script.js). */
.trust-bar .trust-bar__claim > *,
.trust-bar .trust-bar__badge {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
.trust-bar .trust-bar__badge {
  transform: translateX(30px);
}
.trust-bar.is-revealed .trust-bar__claim > * {
  opacity: 1;
  transform: none;
}
.trust-bar.is-revealed .trust-bar__claim > :nth-child(1) { transition-delay: 0ms; }
.trust-bar.is-revealed .trust-bar__claim > :nth-child(2) { transition-delay: 120ms; }
.trust-bar.is-revealed .trust-bar__claim > :nth-child(3) { transition-delay: 240ms; }
.trust-bar.is-revealed .trust-bar__claim > :nth-child(4) { transition-delay: 360ms; }
.trust-bar.is-revealed .trust-bar__badge {
  opacity: 1;
  transform: none;
}
.trust-bar.is-revealed .trust-bar__badge:nth-child(1) { transition-delay: 200ms; }
.trust-bar.is-revealed .trust-bar__badge:nth-child(2) { transition-delay: 350ms; }
.trust-bar.is-revealed .trust-bar__badge:nth-child(3) { transition-delay: 500ms; }
@media (prefers-reduced-motion: reduce) {
  .trust-bar .trust-bar__claim > *,
  .trust-bar .trust-bar__badge {
    opacity: 1;
    transform: none;
    transition: none;
  }
}


/* ============================================================================
   19) Footer-Disclaimer + Compliance-Block - Trust durch konkrete Registrierungen
   ----------------------------------------------------------------------------
   Schmaler Streifen zwischen den Footer-Spalten und der Bottom-Bar.
   Raeumt das Missverstaendnis "Spedition" explizit aus und zeigt die echten
   Compliance-Registrierungen (Briefing §9, §10).
   ============================================================================ */

/* Footer-Container auf dieselbe Inhaltsbreite wie der Rest der Webseite —
   die Content-Sektionen (Hero-Stats, Kontaktformular, Service-Bloecke etc.)
   nutzen `.container { max-width: 1400px; padding: 0 15px }`. Das alte
   Bootstrap-Default 960px wirkte gegen diese 1400px sichtbar eingeklemmt;
   1320px war ebenfalls zu schmal; `none` zog den Footer auf volle Browser-
   Breite und passte nicht mehr zur Webseiten-Optik. 1400px matcht exakt. */
footer.bg-default > .container,
.footer-compliance .container,
.footer-disclaimer .container,
footer .bottom .container {
  max-width: 1400px;
  width: 100%;
  padding-left: 15px;
  padding-right: 15px;
}

/* Footer-Karten-Spalte: zwei kompakte, klickbare Karten-Thumbnails
   (Dresden + Guangzhou) als lokal gehostete OSM-PNGs. DSGVO-clean — kein
   externer Request, kein Consent-Banner. Der Klick oeffnet Google Maps in
   einem neuen Tab. Groesse so gewaehlt, dass beide Karten zusammen die Hoehe
   der Sitemap-Liste in Spalte 1 (Startseite -> Datenschutz) nicht ueberschreiten.
   Inhalt linksbuendig zur Spaltenkante — gleiche Logik wie Sitemap-Liste,
   Kontakt-Daten, Adressblocks: jede Spalte richtet ihren Inhalt links unter
   der Ueberschrift aus. */

/* Lage-Spalte auf Desktop nach rechts gesetzt, sodass die linke Kante des
   Inhalts (h3, Karten, Attribution) exakt auf der linken Kante der 5. Compliance-
   Spalte (REBAT) im Block darunter sitzt. Das Footer-Spalten-Raster (4er Bootstrap-
   Grid) und das Compliance-Raster (5 gleiche Spalten) haben unterschiedliche
   Breiten — der zusaetzliche padding-left holt die Lage-Spalte optisch auf
   die Achse von REBAT. Auf Tablet/Mobile bleibt Bootstrap-Default. */
@media (min-width: 992px) {
  .footer-maps-col {
    padding-left: 80px;
  }
}

.footer-maps-col .footer-map-cards {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  /* 50px = Gap zwischen h3-Decor-Linie und erstem Inhalt der anderen Spalten
     (Sitemap-Liste, Telefon-Eintrag, erste Adresszeile). Ohne diesen Abstand
     starten die Karten optisch hoeher als die "Startseite"/"Telefon:"-Zeile
     in den linken Spalten — die erste Karten-Oberkante muss exakt auf der
     Linie sitzen, auf der links der erste Listen-Eintrag beginnt. */
  margin-top: 50px;
}

.footer-map-card {
  display: block;
  /* Volle Spaltenbreite — die Karten dehnen sich exakt bis zur rechten Kante
     der virtuellen "REBAT-Spalte", da die Lage-Spalte per padding-left genau
     dort beginnt. Ergebnis: Karten linke + rechte Kante deckungsgleich mit
     REBAT. Hoehe ueber `aspect-ratio` am Bild gesteuert. */
  width: 100%;
  max-width: 100%;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  padding: 4px;
  text-decoration: none;
  cursor: pointer;
  transition:
    transform 220ms cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 220ms cubic-bezier(0.22, 1, 0.36, 1),
    border-color 220ms ease;
}

.footer-map-card:hover,
.footer-map-card:focus-visible {
  transform: translateY(-2px);
  border-color: color-mix(in oklab, var(--brand-amber) 45%, #e5e7eb);
  box-shadow: 0 6px 18px color-mix(in oklab, var(--brand-amber) 25%, transparent);
}

.footer-map-card:focus-visible {
  outline: 2px solid var(--brand-amber);
  outline-offset: 2px;
}

.footer-map-card img {
  display: block;
  width: 100%;
  height: auto;
  /* Rechteckiges 2:1-Format statt quadratisch — nutzt die ganze Spalten-
     Breite (255px = REBAT-Breite) und haelt beide Karten zusammen knapp
     unter der Hoehe der Sitemap-Liste in Spalte 1 (Datenschutz-Linie). */
  aspect-ratio: 2 / 1;
  border-radius: 4px;
  object-fit: cover;
  transition: filter 220ms ease;
}

.footer-map-card:hover img,
.footer-map-card:focus-visible img {
  filter: saturate(1.1) brightness(1.02);
}

/* OSM-Pflicht-Attribution unter der Karten-Spalte — bewusst dezent in
   max-width der Karten gehalten, damit die Optik der Karten-Spalte ruhig bleibt. */
.footer-map-attribution {
  max-width: 100%;
  margin: var(--space-2) 0 0;
  font-size: 0.65rem;
  line-height: 1.3;
  color: var(--text-muted);
}

.footer-map-attribution a {
  color: inherit;
  text-decoration: underline;
  text-decoration-color: color-mix(in oklab, var(--text-muted) 50%, transparent);
}

.footer-map-attribution a:hover {
  color: var(--brand-amber);
  text-decoration-color: var(--brand-amber);
}

/* Compliance-Daten als Definition-List-Grid - klar lesbar, scanbar.
   Konkrete Nummern (EORI, USt-ID, WEEE etc.) wirken vertrauenstiftend, weil
   sie nachpruefbar sind. */
.footer-compliance {
  /* Weissraum (Footer-Hintergrund) ueber dem farbigen Block per margin-top:
     so entsteht eine klare 2-Zeilen-Pause unter "Datenschutz" bevor der
     beige Compliance-Bereich beginnt. Das innere padding-top kann dadurch
     wieder kleiner sein. */
  margin-top: var(--space-12);
  padding: var(--space-8) 0;
  background: color-mix(in oklab, var(--brand-primary) 5%, var(--surface-base));
  border-top: 1px solid var(--border-subtle);
}

.footer-compliance__title {
  margin: 0 0 var(--space-6);
  font-size: 0.85rem;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-weight: 700;
  color: var(--text-secondary);
}

.footer-compliance__grid {
  /* Festes 5-Spalten-Raster auf Desktop, damit beide Zeilen exakt gleich
     ausgerichtet sind. Auf Tablet auf 3, auf Mobile auf 2 Spalten umbrechen,
     damit lange Werte (USCC, EORI) nicht abgeschnitten werden. */
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--space-4) var(--space-6);
  margin: 0;
  padding: 0;
}

@media (max-width: 991px) {
  .footer-compliance__grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

@media (max-width: 575px) {
  .footer-compliance__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.footer-compliance__item {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--space-3) 0;
  border-top: 1px solid var(--border-subtle);
}

.footer-compliance__item dt {
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

.footer-compliance__item dd {
  margin: 0;
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
  word-break: break-word;
}

/* Footer-Compliance Reveal beim Hinscrollen — Title fade-in, danach die
   10 Item-Kacheln gestaffelt von oben nach unten. JS setzt .is-revealed via
   IntersectionObserver (siehe js/script.js). */
.footer-compliance .footer-compliance__title,
.footer-compliance .footer-compliance__item {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
.footer-compliance.is-revealed .footer-compliance__title {
  opacity: 1;
  transform: none;
  transition-delay: 0ms;
}
.footer-compliance.is-revealed .footer-compliance__item {
  opacity: 1;
  transform: none;
}
.footer-compliance.is-revealed .footer-compliance__item:nth-child(1)  { transition-delay: 150ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(2)  { transition-delay: 220ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(3)  { transition-delay: 290ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(4)  { transition-delay: 360ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(5)  { transition-delay: 430ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(6)  { transition-delay: 500ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(7)  { transition-delay: 570ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(8)  { transition-delay: 640ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(9)  { transition-delay: 710ms; }
.footer-compliance.is-revealed .footer-compliance__item:nth-child(10) { transition-delay: 780ms; }
@media (prefers-reduced-motion: reduce) {
  .footer-compliance .footer-compliance__title,
  .footer-compliance .footer-compliance__item {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ============================================================================
   19b) PDF-Modal — Inline-Anzeige des Grüner-Punkt-Beteiligungszertifikats
   ----------------------------------------------------------------------------
   Native <dialog>-Element fuer Accessibility (Focus-Trap, ESC, ARIA).
   Animation per @starting-style + transition (Chromium 117+, Firefox 129+),
   in alteren Browsern oeffnet das Modal ohne Animation aber funktional.
   ============================================================================ */
.pdf-modal {
  /* PDF passt A4 hoch — Modal nimmt das Aspect-Ratio mit. width wird aus
     aspect-ratio + height ausgerechnet. Glas-Effekt-Rim: layered Box-
     Shadow gibt einen halbtransparenten Brand-Rim mit innerem Highlight
     und weichem ausserem Glow — wirkt wie eine glaeserne Kante statt
     eines harten Borders. */
  width: auto;
  height: 95vh;
  aspect-ratio: 210 / 297;
  max-width: 95vw;
  max-height: 95vh;
  padding: 0;
  border: none;
  border-radius: var(--radius-lg, 12px);
  background: white;
  box-shadow:
    /* feine Top-Lichtkante (Glasreflex) */
    inset 0 1px 0 rgba(255, 255, 255, 0.85),
    /* schmaler, transparent-weisser Glas-Rim */
    0 0 0 1.5px rgba(255, 255, 255, 0.45),
    /* Tiefenschatten */
    0 30px 80px rgba(0, 0, 0, 0.55);
  overflow: hidden;
  /* Animations-Endzustand */
  opacity: 1;
  transform: scale(1) translateY(0);
  transition:
    opacity 280ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 280ms cubic-bezier(0.22, 1, 0.36, 1),
    overlay 280ms allow-discrete,
    display 280ms allow-discrete;
}
.pdf-modal:not([open]) {
  opacity: 0;
  transform: scale(0.96) translateY(12px);
}
@starting-style {
  .pdf-modal[open] {
    opacity: 0;
    transform: scale(0.96) translateY(12px);
  }
}
.pdf-modal::backdrop {
  background: rgba(8, 16, 32, 0.55);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  opacity: 1;
  transition:
    opacity 280ms cubic-bezier(0.22, 1, 0.36, 1),
    overlay 280ms allow-discrete,
    display 280ms allow-discrete;
}
.pdf-modal:not([open])::backdrop {
  opacity: 0;
}
@starting-style {
  .pdf-modal[open]::backdrop {
    opacity: 0;
  }
}
.pdf-modal__close {
  position: absolute;
  top: var(--space-3, 12px);
  right: var(--space-3, 12px);
  width: 40px;
  height: 40px;
  border-radius: 999px;
  border: none;
  /* Dunkler Brand-Hintergrund mit weissem X — kontrastiert sicher gegen
     ein weisses PDF-Dokument dahinter. */
  background: var(--brand-primary, #13447a);
  color: white;
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.32),
    0 0 0 2px rgba(255, 255, 255, 0.85);
  transition: transform 160ms var(--ease-spring, cubic-bezier(0.5, 1.5, 0.5, 1)),
              background 160ms,
              box-shadow 160ms;
}
.pdf-modal__close:hover,
.pdf-modal__close:focus-visible {
  background: var(--brand-primary-dark, #0a2545);
  transform: scale(1.06);
  outline: none;
  box-shadow:
    0 4px 14px rgba(0, 0, 0, 0.4),
    0 0 0 2px rgba(255, 255, 255, 0.95);
}
.pdf-modal__close:active {
  transform: scale(0.96);
}
.pdf-modal__viewer {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  border: none;
  background: white;
  overflow: auto;
  scrollbar-width: thin;
}
.pdf-modal__viewer canvas {
  display: block;
  width: 100%;
  height: auto;
}
.pdf-modal__viewer canvas + canvas {
  /* trenner zwischen mehrseitigen PDFs */
  margin-top: 1px;
  border-top: 1px solid rgba(0, 0, 0, 0.06);
}
/* Loading-Overlay mit Spinner, waehrend PDF.js die Seiten rendert */
.pdf-modal__loading {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: white;
  opacity: 1;
  transition: opacity 220ms ease-out;
  pointer-events: none;
  z-index: 1;
}
.pdf-modal__loading[data-hidden="true"] {
  opacity: 0;
}
.pdf-modal__spinner {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 3px solid color-mix(in oklab, var(--brand-primary, #13447a) 18%, transparent);
  border-top-color: var(--brand-primary, #13447a);
  animation: pdf-modal-spin 0.9s linear infinite;
}
@keyframes pdf-modal-spin {
  to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
  .pdf-modal__spinner {
    animation: none;
  }
}
/* Body-Scroll-Lock waehrend Modal offen ist (Backup zum nativen <dialog>-
   Verhalten, das in alteren Browsern schwankt). */
body.is-modal-open {
  overflow: hidden;
}
@media (prefers-reduced-motion: reduce) {
  .pdf-modal,
  .pdf-modal::backdrop {
    transition-duration: 0ms;
    transform: none !important;
  }
}

/* Disclaimer - schmal und dezent, gleiche Hintergrundfarbe wie Compliance
   damit beide Blöcke optisch zu einem Bereich verschmelzen */
.footer-disclaimer {
  padding: var(--space-4) 0;
  background: color-mix(in oklab, var(--brand-primary) 5%, var(--surface-base));
  border-top: 1px solid var(--border-subtle);
  border-bottom: 1px solid var(--border-subtle);
}
.footer-disclaimer__text {
  margin: 0 auto;
  font-size: 0.85rem;
  line-height: var(--leading-normal);
  color: var(--text-muted);
  text-align: center;
  max-width: 1080px;
}
.footer-disclaimer__text strong {
  color: var(--text-secondary);
  font-weight: 600;
}


/* ============================================================================
   20) HubSpot-Meeting-Skeleton ENTFERNT (Session 32, 2026-05-10)
   ----------------------------------------------------------------------------
   Ersetzt durch Eigenbau-Buchungswizard auf Terminvereinbarung.html
   (siehe css/booking.css mit Praefix .wpit-book-*).
   ============================================================================ */


/* ============================================================================
   21) Service-Pakete Tabs (page_Dienstleistungen) - Klick-Affordance
   ----------------------------------------------------------------------------
   User-Feedback: Tabs werden oft uebersehen, Nutzer wissen nicht dass sie
   klicken koennen. Wir geben den nav-tabs eine deutliche Button-Optik mit
   Border, Hover-Lift, Cursor-Hint und einem deutlichen Active-State in
   Brand-Blau.
   ============================================================================ */
#service-pakete .tabs-custom .nav-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  margin-bottom: var(--space-8);
  padding: 0;
  list-style: none;
  border-bottom: none;
  justify-content: flex-start;
  text-align: left;
}

#service-pakete .tabs-custom .nav-item {
  flex: 0 1 auto;
  margin: 0;
}

#service-pakete .tabs-custom .nav-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 14px 24px;
  border-radius: var(--radius-pill);
  border: 2px solid color-mix(in oklab, var(--brand-primary) 20%, transparent);
  background: white;
  color: var(--brand-primary);
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: transform var(--duration-fast) var(--ease-spring),
              background var(--duration-fast),
              color var(--duration-fast),
              border-color var(--duration-fast),
              box-shadow var(--duration-base);
  box-shadow: var(--shadow-soft);
}

/* Subtiler "Klick-Hinweis" als Pfeil-Icon nach dem Text - optisch klar als CTA */
#service-pakete .tabs-custom .nav-link::after {
  content: "";
  width: 6px;
  height: 6px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(-45deg);
  margin-left: 4px;
  opacity: 0.55;
  transition: transform var(--duration-fast) var(--ease-spring), opacity var(--duration-fast);
}

#service-pakete .tabs-custom .nav-link:hover,
#service-pakete .tabs-custom .nav-link:focus-visible {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: white;
  transform: translateY(-2px);
  box-shadow:
    0 6px 18px color-mix(in oklab, var(--brand-primary) 35%, transparent),
    inset 0 0 0 1px color-mix(in oklab, white 22%, transparent);
  outline: none;
}
#service-pakete .tabs-custom .nav-link:hover::after,
#service-pakete .tabs-custom .nav-link:focus-visible::after {
  opacity: 1;
  transform: rotate(-45deg) translate(2px, 2px);
}

/* Eckiges ::before-Rechteck aus style.css:6587 (alte tabs-corporate-Optik)
   ueberlagert die Pille hinter dem aktiven Button. Hier abschalten, sonst
   sieht der aktive Tab eckig aus statt rund. */
#service-pakete .tabs-custom .nav-link::before,
#service-pakete .tabs-custom .nav-link.active::before,
#service-pakete .tabs-custom .nav-link:hover::before {
  display: none !important;
  content: none !important;
}

#service-pakete .tabs-custom .nav-link.active {
  background: var(--brand-primary);
  color: white;
  border-color: var(--brand-primary);
  box-shadow:
    0 6px 18px color-mix(in oklab, var(--brand-primary) 35%, transparent),
    inset 0 0 0 1px color-mix(in oklab, white 22%, transparent);
  animation: service-tab-breathe 3.6s ease-in-out infinite;
}

/* Sanfter Pulsation als Klick-Affordance — aktiver Button atmet leicht.
   Scale 1 -> 1.025 plus mitwachsender Halo-Schatten. Kein Sprung am Ende
   (symmetrische Sinuskurve), pausiert bei Hover/Focus, deaktiviert bei
   prefers-reduced-motion. */
@keyframes service-tab-breathe {
  0%, 100% {
    transform: scale(1);
    box-shadow:
      0 6px 18px color-mix(in oklab, var(--brand-primary) 35%, transparent),
      inset 0 0 0 1px color-mix(in oklab, white 22%, transparent);
  }
  50% {
    transform: scale(1.025);
    box-shadow:
      0 10px 26px color-mix(in oklab, var(--brand-primary) 45%, transparent),
      inset 0 0 0 1px color-mix(in oklab, white 30%, transparent);
  }
}
#service-pakete .tabs-custom .nav-link.active:hover,
#service-pakete .tabs-custom .nav-link.active:focus-visible {
  animation-play-state: paused;
}
@media (prefers-reduced-motion: reduce) {
  #service-pakete .tabs-custom .nav-link.active {
    animation: none;
  }
}
/* Active: Pfeil zeigt "ausgewaehlt" - dreht zu Haken-aehnlicher Form */
#service-pakete .tabs-custom .nav-link.active::after {
  opacity: 1;
  transform: rotate(45deg) translate(0, -1px);
}

#service-pakete .tabs-custom .nav-link.active:hover {
  background: var(--brand-primary);
  color: white;
}

@media (max-width: 575.98px) {
  #service-pakete .tabs-custom .nav-link {
    padding: var(--space-3) var(--space-5);
    font-size: 0.9rem;
  }
  #service-pakete .tabs-custom .nav-tabs {
    flex-direction: column;
  }
  #service-pakete .tabs-custom .nav-item {
    width: 100%;
  }
  #service-pakete .tabs-custom .nav-link {
    width: 100%;
    justify-content: center;
  }
}


/* ============================================================================
   20) ProvenExpert-Sektion — Live-Aggregate-Header + Brand-Slider mit
       kuratierten Kunden-Stimmen auf der Unternehmen-Seite.
   ----------------------------------------------------------------------------
   Loest den alten statischen Bootstrap-Carousel `#testimonial4` ab. Live-Score
   und Anzahl kommen aus der ProvenExpert-API (siehe inc_provenexpert_rating.php),
   die einzelnen Stimmen werden in `content/data/testimonials.php` gepflegt.
   Brand-Amber-Sterne (#d4a017) werden inline als SVG gerendert, damit wir die
   Farbe per CSS-Variable steuern und keine `stern.png`-Bitmaps mehr brauchen.
   ============================================================================ */
.provenexpert-section {
  --pe-star-color: var(--brand-amber);
  --pe-star-shadow: 0 1px 0 rgba(133, 100, 14, 0.18);
}

.provenexpert-section .pe-eyebrow {
  margin: 0 0 var(--space-3, 12px);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--brand-primary, #13447a);
}

/* SVG-Stern - eine einzige Klasse, beide Stellen nutzen sie:
   .pe-aggregate__stars (gross, im Header) und .pe-quote__stars (kleiner, im Slider) */
.provenexpert-section .pe-star {
  display: inline-block;
  width: 22px;
  height: 22px;
  fill: var(--pe-star-color);
  filter: drop-shadow(var(--pe-star-shadow));
  vertical-align: middle;
}

/* ----- Aggregate-Header mit Live-Daten ----- */
.pe-aggregate {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-6, 24px);
  padding: var(--space-6, 24px) var(--space-8, 32px);
  margin: 0 0 var(--space-8, 32px);
  background: linear-gradient(180deg, #ffffff 0%, #fafafa 100%);
  border: 1px solid var(--border-subtle, #e6ebf1);
  border-radius: 16px;
  box-shadow: 0 2px 16px rgba(0, 0, 0, 0.05);
}

.pe-aggregate__stars {
  display: inline-flex;
  gap: 2px;
}
.pe-aggregate__stars .pe-star {
  width: 32px;
  height: 32px;
}

.pe-aggregate__text {
  display: flex;
  flex-direction: column;
  line-height: 1.2;
  font-size: 1rem;
  color: var(--text-secondary, #4b5b6b);
}
.pe-aggregate__score {
  font-size: 2.4rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
  letter-spacing: -0.01em;
}
.pe-aggregate__score-of {
  font-size: 1rem;
  color: #6b7280;
  font-weight: 500;
}
.pe-aggregate__count {
  margin-top: 4px;
  font-size: 0.92rem;
  color: #6b7280;
}

.pe-aggregate__meta {
  margin-left: auto;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 4px;
  font-size: 0.82rem;
  color: var(--text-muted, #7a8694);
}
.pe-aggregate__updated::before {
  content: "";
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--brand-amber, #d4a017);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--brand-amber) 20%, transparent);
  margin-right: 8px;
  vertical-align: middle;
  animation: pe-pulse 2.4s ease-in-out infinite;
}
@keyframes pe-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.45; }
}
.pe-aggregate__source {
  color: var(--brand-primary, #13447a);
  text-decoration: underline;
  text-decoration-color: color-mix(in oklab, var(--brand-primary) 35%, transparent);
  text-underline-offset: 3px;
}
.pe-aggregate__source:hover {
  text-decoration-color: var(--brand-primary, #13447a);
}

@media (max-width: 767.98px) {
  .pe-aggregate {
    flex-direction: column;
    align-items: flex-start;
    padding: var(--space-5, 20px);
    gap: var(--space-4, 16px);
  }
  .pe-aggregate__meta {
    margin-left: 0;
    align-items: flex-start;
  }
  .pe-aggregate__stars .pe-star {
    width: 26px;
    height: 26px;
  }
}

/* ----- Source-Chip ueber dem Slider (Live vs. Auswahl) ----- */
.pe-source-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 var(--space-4, 16px);
  padding: 6px 12px 6px 10px;
  background: var(--surface-elevated, #fff);
  border: 1px solid var(--border-subtle, #e6ebf1);
  border-radius: 999px;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--text-secondary, #4b5b6b);
  letter-spacing: 0.005em;
}
.pe-source-chip__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
.pe-source-chip--live .pe-source-chip__dot {
  background: #16a34a; /* gruen, "live" */
  box-shadow: 0 0 0 3px rgba(22, 163, 74, 0.18);
  animation: pe-pulse 2.4s ease-in-out infinite;
}
.pe-source-chip--curated .pe-source-chip__dot {
  background: var(--brand-amber, #d4a017);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--brand-amber) 20%, transparent);
}

/* ----- Slider-Karten (Bootstrap-Carousel-basiert, neu gestylt) -----
   Karten-Hoehe ist DYNAMISCH (Inhalt bestimmt). Damit der CTA-Button und die
   Indicator-Striche unten beim Slide-Wechsel NICHT springen, setzt
   js/script.js zur Laufzeit die min-height des Carousel-Inner-Containers auf
   die Hoehe des hoechsten Slides — siehe Block "ProvenExpert-Slider Heights"
   in script.js. CSS gibt nur einen sehr kleinen Minimal-Fallback fuer den
   Fall, dass das JS nicht laeuft. */
.pe-slider {
  position: relative;
}
.pe-slider .carousel-inner {
  overflow: hidden;
}
.pe-slider .carousel-item {
  transition: transform 0.7s ease, opacity 0.5s ease;
}
.pe-slider .carousel-item .row {
  align-items: stretch; /* gepaarte Quotes nehmen gleiche Hoehe an */
}
.pe-slider .carousel-item .row > [class*="col-"] {
  display: flex;
}
.pe-quote {
  display: flex;
  flex-direction: column;
  width: 100%;
  padding: var(--space-6, 24px) var(--space-7, 28px);
  background: var(--surface-elevated, #fff);
  border: 1px solid var(--border-subtle, #e6ebf1);
  border-left: 3px solid var(--brand-amber, #d4a017);
  border-radius: 12px;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
  position: relative;
  cursor: default;
  transition: transform 0.3s ease, box-shadow 0.3s ease, border-left-width 0.3s ease;
}
.pe-quote:hover {
  transform: translateY(-3px);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
  border-left-width: 5px;
}
@media (prefers-reduced-motion: reduce) {
  .pe-quote,
  .pe-quote:hover {
    transition: none;
    transform: none;
  }
}
.pe-quote__stars {
  display: inline-flex;
  gap: 1px;
  margin-bottom: var(--space-3, 12px);
}
.pe-quote__stars .pe-star {
  width: 16px;
  height: 16px;
}
.pe-quote__text {
  margin: 0 0 var(--space-4, 16px);
  font-size: 1rem;
  line-height: 1.55;
  color: var(--text-primary, #1a232e);
  quotes: "„" """ "‚" "'";
  font-style: normal;
}
.pe-quote__text::before { content: open-quote; }
.pe-quote__text::after  { content: close-quote; }

.pe-quote__footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3, 12px);
  margin-top: auto;
  padding-top: var(--space-3, 12px);
  border-top: 1px solid var(--border-subtle, #e6ebf1);
}
.pe-quote__person {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
}
.pe-quote__avatar {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--brand-amber, #d4a017);
  color: #fff;
  font-weight: 700;
  font-size: 16px;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  text-transform: uppercase;
  letter-spacing: 0;
}
.pe-quote__person-text {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
  min-width: 0;
}
.pe-quote__name {
  font-weight: 700;
  color: var(--text-primary, #1a232e);
}
.pe-quote__role {
  font-size: 0.88rem;
  color: var(--text-secondary, #4b5b6b);
}
.pe-quote__date {
  margin-left: auto;
  font-size: 0.8rem;
  color: var(--text-muted, #7a8694);
}
@media (max-width: 575.98px) {
  .pe-quote__date {
    margin-left: 48px; /* unter Name ausgerichtet (Avatar 36 + Gap 12) */
    flex-basis: 100%;
  }
}

/* Indicators - Bootstrap-Standard ueberschrieben fuer Brand-Look */
.pe-slider__indicators {
  position: static;
  margin: var(--space-5, 20px) 0 0;
  padding: 0;
  list-style: none;
  display: flex;
  justify-content: center;
  gap: 8px;
}
.pe-slider__indicators li {
  width: 28px;
  height: 4px;
  border-radius: 2px;
  background: color-mix(in oklab, var(--brand-primary) 18%, transparent);
  border: none;
  text-indent: 0;
  cursor: pointer;
  transition: background 220ms ease, width 220ms ease;
}
.pe-slider__indicators li.active {
  background: var(--brand-amber, #d4a017);
  width: 44px;
}

/* ----- CTA-Reihe ----- */
.pe-cta-row {
  margin-top: var(--space-8, 32px);
  text-align: center;
}
.pe-cta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: var(--brand-primary, #13447a);
  color: #fff !important;
  padding: 14px 28px;
  border-radius: 999px;
  font-weight: 600;
  text-decoration: none;
  letter-spacing: 0.005em;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.18) inset,
    0 12px 24px -16px rgba(19, 68, 122, 0.45);
  transition: transform 220ms ease, box-shadow 220ms ease, background 220ms ease;
}
.pe-cta::after {
  content: "→";
  font-size: 1.1em;
  transition: transform 220ms ease;
}
.pe-cta:hover {
  transform: translateY(-1px);
  background: var(--brand-primary-dark, #0e2f56);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.18) inset,
    0 16px 32px -16px rgba(19, 68, 122, 0.55);
}
.pe-cta:hover::after {
  transform: translateX(3px);
}
.pe-cta-note {
  margin: var(--space-3, 12px) auto 0;
  max-width: 720px;
  font-size: 0.85rem;
  color: var(--text-muted, #7a8694);
  line-height: 1.5;
}

/* ----- Reveal-Animation, gestaffelt analog .footer-compliance ----- */
.provenexpert-section .pe-eyebrow,
.provenexpert-section h2,
.provenexpert-section .pe-aggregate,
.provenexpert-section .pe-slider,
.provenexpert-section .pe-cta-row {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
.provenexpert-section.is-revealed .pe-eyebrow,
.provenexpert-section.is-revealed h2 {
  opacity: 1;
  transform: none;
  transition-delay: 0ms;
}
.provenexpert-section.is-revealed .pe-aggregate {
  opacity: 1;
  transform: none;
  transition-delay: 150ms;
}
.provenexpert-section.is-revealed .pe-slider {
  opacity: 1;
  transform: none;
  transition-delay: 280ms;
}
.provenexpert-section.is-revealed .pe-cta-row {
  opacity: 1;
  transform: none;
  transition-delay: 420ms;
}
@media (prefers-reduced-motion: reduce) {
  .provenexpert-section .pe-eyebrow,
  .provenexpert-section h2,
  .provenexpert-section .pe-aggregate,
  .provenexpert-section .pe-slider,
  .provenexpert-section .pe-cta-row {
    opacity: 1;
    transform: none;
    transition: none;
  }
  .pe-aggregate__updated::before {
    animation: none;
  }
}

/* ============================================================================
   21) "Unsere Kunden" — Bento-Grid mit asymmetrischer Logo-Verteilung +
       Stagger-Animation beim Scroll-In.
   ----------------------------------------------------------------------------
   Pflege:
     - Neuer Kunde   = neues <li class="logo-cell"> in page_Unternehmen.php.
     - Modifier      = .span-2-cols (2x1), .span-2-rows (1x2), .span-large (2x2).
     - Modifier wirken NUR auf Desktop (>=1024px); Tablet/Mobile fallen auf 1x1.
     - .logo-cell startet unsichtbar; js/script.js (Block "Kunden-Grid Stagger")
       hat den IntersectionObserver, der nach Eintritt ins Viewport gestaffelt
       .is-visible setzt (80ms pro Logo).
   ============================================================================ */
.kunden-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, 1fr);   /* Mobile */
  grid-auto-rows: 100px;                   /* Mobile-Cell-Hoehe */
  grid-auto-flow: dense;
  gap: 16px;
  align-items: stretch;
}
@media (min-width: 768px) {
  .kunden-grid {
    grid-template-columns: repeat(4, 1fr); /* Tablet */
    grid-auto-rows: 110px;
  }
}
@media (min-width: 1024px) {
  .kunden-grid {
    grid-template-columns: repeat(6, 1fr); /* Desktop */
    grid-auto-rows: 120px;
  }
}

/* Bento-Spans nur Desktop. Mobile/Tablet -> alle Boxen 1x1, Grid bleibt sauber. */
@media (min-width: 1024px) {
  .logo-cell.span-2-cols { grid-column: span 2; }
  .logo-cell.span-2-rows { grid-row:    span 2; }
  .logo-cell.span-large  { grid-column: span 2; grid-row: span 2; }
}

/* Cell-Container: Boxen-Optik + Stagger-Pre-State.
   Reihenfolge der :hover-Regel ist wichtig: sie wird nach .is-visible
   definiert UND als .is-visible:hover spezifiziert, damit (a) Hover erst nach
   Sichtbar-Werden greift und (b) :hover gegen .is-visible-Specificity gewinnt. */
.logo-cell {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: #f8fafc;
  border-radius: 16px;

  /* Stagger-Pre-State (von JS via .is-visible aufgehoben) */
  opacity: 0;
  transform: translateY(15px);
  transition:
    opacity 400ms cubic-bezier(0.16, 1, 0.3, 1),
    transform 400ms cubic-bezier(0.16, 1, 0.3, 1),
    background-color 0.3s ease,
    box-shadow 0.3s ease;
  will-change: opacity, transform;
}
.logo-cell.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Groessere Innenabstaende fuer breite/grosse Boxen (Desktop). */
@media (min-width: 1024px) {
  .logo-cell.span-2-cols,
  .logo-cell.span-2-rows,
  .logo-cell.span-large {
    padding: 32px;
  }
}

.logo-cell__img {
  display: block;
  max-width: 100%;
  max-height: 70px;     /* 1x1 default */
  width: auto;
  height: auto;
  object-fit: contain;
  filter: grayscale(100%);
  opacity: 0.55;
  transition: filter 0.3s ease, opacity 0.3s ease;
  cursor: default;
}
@media (min-width: 1024px) {
  .logo-cell.span-2-cols .logo-cell__img,
  .logo-cell.span-2-rows .logo-cell__img { max-height: 90px; }
  .logo-cell.span-large  .logo-cell__img { max-height: 110px; }
}

/* Mobile: Logos kompakter, Padding kleiner */
@media (max-width: 767.98px) {
  .logo-cell { padding: 16px; }
  .logo-cell__img { max-height: 56px; }
}

/* Hover (nur Maus / nur sichtbare Cells) */
@media (hover: hover) and (pointer: fine) {
  .logo-cell.is-visible:hover {
    background: #ffffff;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
    transform: translateY(-2px);
  }
  .logo-cell.is-visible:hover .logo-cell__img {
    filter: grayscale(0%);
    opacity: 1;
  }
}

/* Reduced-Motion: Stagger ueberspringen, Hover-Bewegung deaktivieren.
   JS setzt zusaetzlich .is-visible sofort, damit hover-Regeln greifen. */
@media (prefers-reduced-motion: reduce) {
  .logo-cell {
    opacity: 1;
    transform: none;
    transition: background-color 0.3s ease, box-shadow 0.3s ease;
    will-change: auto;
  }
  .logo-cell.is-visible:hover {
    transform: none;
  }
}

/* ============================================================================
   22) Manrope-Feintuning — Headlines etwas straffer ziehen.
   ----------------------------------------------------------------------------
   Manrope wirkt von Haus aus etwas weiter als Trebuchet MS, daher kommt ein
   leicht negatives Letter-Spacing auf alle h1-h4. Der Effekt ist dezent
   (-0.01em); Body und sonstiger Fliesstext bleiben unveraendert.
   ============================================================================ */
h1, h2, h3, h4 {
  letter-spacing: -0.01em;
}

/* ============================================================================
   23) Icon-System — Lucide-Inline-SVGs (ersetzt FontAwesome + Material Design
       Icons). .icon ist die einheitliche Helper-Klasse fuer alle Inline-SVGs.
   ----------------------------------------------------------------------------
   Verwendung in HTML:
     <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
          stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
          aria-hidden="true">…lucide path…</svg>
   - width/height = 1em laesst Icons mit der umgebenden Schriftgroesse skalieren
   - stroke="currentColor" laesst Icons die Textfarbe erben (auch bei :hover)
   - flex-shrink: 0 verhindert, dass Icons in Flex-Containern zusammengedrueckt
     werden
   ============================================================================ */
/* Hinweis: das Theme nutzt `.icon` schon als Wrapper-Klasse (z.B. Footer-
   Anchor `<a class="icon icon-sm">`). Wir scopen unsere Helper-Regel daher
   auf `svg.icon`, sodass nur die Inline-SVGs angesprochen werden. font-size
   wird explizit auf inherit gesetzt, weil das Theme-`.icon { font-size:16px }`
   sonst 1em-Skalierung der Wrapper-Schriftgroesse blockiert. */
svg.icon {
  width: 1em;
  height: 1em;
  font-size: inherit;
  vertical-align: -0.125em;
  stroke-width: 2;
  flex-shrink: 0;
}

/* Fix-Groessen-Varianten fuer Komponenten, die nicht ueber font-size skalieren
   (Footer-Social-Icons, Back-to-Top, Submenu-Toggle). */
svg.icon.icon--md { width: 22px; height: 22px; }
svg.icon.icon--lg { width: 28px; height: 28px; }

/* Brand-Icons (Social Media): Lucide-Brand-SVGs werden mit fill statt stroke
   gerendert, damit das Icon als Wortmarke liest. */
svg.icon-social {
  fill: currentColor;
  stroke: none;
}

/* ============================================================================
   24) Prozess-Infografik (Code-Animation auf der Startseite, ersetzt das
       frueher hier laufende wp_infografik.mp4 / .webm). Markup aus
       page_Startseite.php, Animation in js/prozess-infografik.js.
   ----------------------------------------------------------------------------
   Layout-Konzept:
     - Stage 620 px hoch, Track scrollt horizontal mit den Schritten
     - Schiene (.prozess-rail) sitzt auf 50 % der Stage-Hoehe
     - Schritte alternieren: ungerade (1,3,5,...) UNTER der Schiene mit Pointer
       am Header oben; gerade (2,4,6,...) UEBER der Schiene mit Pointer am
       Body unten
     - Gradient-Bar mit Nummern 01-15 sitzt am unteren Track-Rand und scrollt
       zusammen mit den Dots (Bar gehoert zum Track, nicht zur Stage)
     - .prozess-conn ist die gestrichelte Verbindung Box <-> Dot
   Phasen:
     - Phase 1 (~30 s): Schritte erscheinen einzeln, Track scrollt ab Schritt 7
     - Phase 2 (~6 s):  Stage-inner skaliert via transform: scale auf 0.4-1.0,
       sodass alle 15 Schritte gleichzeitig zu sehen sind
   Mobile (<= 767 px): Vertikales Layout, alle Schritte untereinander, Bar aus.
   ============================================================================ */
.prozess-infografik {
  position: relative;
  width: 100%;
  background: #ffffff;
  overflow: hidden;
  /* Reveal-Pre-State: Sektion ist initial verblasst und leicht abgesenkt;
     wird beim Scroll-In via .is-revealed eingeblendet. Gleicher Stil wie
     die anderen Reveal-Sektionen (.provenexpert-section etc.). */
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
              transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
.prozess-infografik.is-revealed {
  opacity: 1;
  transform: none;
}

/* Stage = sichtbarer Viewport */
.prozess-stage {
  position: relative;
  width: 100%;
  height: 620px;
  overflow: hidden;
}
.prozess-stage-inner {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-origin: 50% 55%;
  will-change: transform;
  transition: transform 1100ms cubic-bezier(0.4, 0, 0.2, 1);
}

/* Track = horizontale Bahn aller Schritte (laenger als Stage; scrollt) */
.prozess-track {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  will-change: transform;
  transition: transform 1500ms cubic-bezier(0.4, 0, 0.2, 1);
}

/* Schiene mit Pfeil-Spitze am linken Anfang */
.prozess-rail {
  position: absolute;
  left: 0;
  top: 50%;
  height: 4px;
  background: #e6ebf1;
  border-radius: 2px;
  transform: translateY(-50%);
  z-index: 1;
}
.prozess-rail::before {
  content: "";
  position: absolute;
  left: -16px;
  top: 50%;
  width: 0;
  height: 0;
  border-top: 5px solid transparent;
  border-bottom: 5px solid transparent;
  border-right: 8px solid #c7d0db;
  transform: translateY(-50%);
}

/* Gradient-Bar mit Nummern 01-15, scrollt mit dem Track */
.prozess-timeline-bar {
  position: absolute;
  left: 0;
  bottom: 24px;
  height: 44px;
  background: linear-gradient(90deg,
              var(--brand-primary-dark, #0e2f56) 0%,
              var(--brand-primary, #13447a) 45%,
              #068ed6 100%);
  box-shadow: 0 4px 14px rgba(14, 47, 86, 0.20);
  z-index: 1;
  display: flex;
  align-items: center;
}
.prozess-tnum {
  position: absolute;
  top: 50%;
  transform: translate(-50%, -50%);
  color: #ffffff;
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 0.05em;
}

/* Dots auf der Schiene */
.prozess-dot {
  position: absolute;
  top: 50%;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #1e4178;
  transform: translate(-50%, -50%) scale(0);
  opacity: 0;
  transition: transform 500ms cubic-bezier(0.4, 0, 0.2, 1),
              opacity 500ms cubic-bezier(0.4, 0, 0.2, 1);
  z-index: 3;
}
.prozess-dot.active { transform: translate(-50%, -50%) scale(1); opacity: 1; }

/* Step-Boxen */
.prozess-step {
  position: absolute;
  width: 220px;
  background: #ffffff;
  border: 1px solid #e6ebf1;
  border-radius: 8px;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
  overflow: visible;
  opacity: 0;
  transform: translateY(15px);
  transition: opacity 700ms cubic-bezier(0.4, 0, 0.2, 1),
              transform 700ms cubic-bezier(0.4, 0, 0.2, 1);
  z-index: 4;
}
.prozess-step.visible { opacity: 1; transform: translateY(0); }

.prozess-step-header {
  background: var(--brand-primary, #13447a);
  color: #ffffff;
  padding: 9px 12px;
  border-radius: 7px 7px 0 0;
  position: relative;
}
.prozess-step-title {
  font-size: 14px;
  font-weight: 700;
  line-height: 1.2;
  margin: 0;
  color: #ffffff;
  letter-spacing: 0;
}

/* Pointer-Tail: ungerade Schritte (.below) Tail OBEN am Header (zeigt auf Schiene),
   gerade Schritte (.above) Tail UNTEN am Body. */
.prozess-step.below .prozess-step-header::after {
  content: "";
  position: absolute;
  top: -7px;
  left: 22px;
  width: 14px;
  height: 14px;
  background: var(--brand-primary, #13447a);
  transform: rotate(45deg);
  z-index: -1;
}
.prozess-step.above::after {
  content: "";
  position: absolute;
  bottom: -7px;
  left: 22px;
  width: 14px;
  height: 14px;
  background: #ffffff;
  border-right: 1px solid #e6ebf1;
  border-bottom: 1px solid #e6ebf1;
  transform: rotate(45deg);
}

.prozess-step-body {
  display: grid;
  grid-template-columns: 28px 1fr;
  gap: 9px;
  padding: 10px 12px 12px;
  align-items: start;
}
.prozess-step-icon {
  width: 28px;
  height: 28px;
  color: var(--brand-primary, #13447a);
  display: grid;
  place-items: center;
  flex-shrink: 0;
}
.prozess-step-icon svg { width: 22px; height: 22px; }
.prozess-step-desc {
  font-size: 11px;
  line-height: 1.45;
  color: #4b5b6b;
  margin: 0;
  text-align: left;
  hyphens: auto;
  display: -webkit-box;
  -webkit-line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Gestrichelte Verbindungslinie Box <-> Dot */
.prozess-conn {
  position: absolute;
  width: 1.5px;
  background-image: linear-gradient(to bottom, #c7d0db 50%, transparent 0%);
  background-size: 1.5px 6px;
  background-repeat: repeat-y;
  transform: scaleY(0);
  transition: transform 600ms cubic-bezier(0.4, 0, 0.2, 1);
  z-index: 2;
  pointer-events: none;
}
.prozess-conn.below { transform-origin: top center; }
.prozess-conn.above { transform-origin: bottom center; }
.prozess-conn.active { transform: scaleY(1); }

/* Reduced Motion: alle Transitions aus, Reveal-Pre-State sofort aufloesen */
@media (prefers-reduced-motion: reduce) {
  .prozess-infografik {
    opacity: 1;
    transform: none;
    transition: none;
  }
  .prozess-stage-inner,
  .prozess-track,
  .prozess-step,
  .prozess-dot,
  .prozess-conn {
    transition: none !important;
  }
}

/* Smartphone (<=575): Infografik komplett ausblenden — auf kleinen Screens
   nimmt sie zu viel Vertikalplatz und der Mehrwert vs. dem Kompromiss steht
   in keinem Verhaeltnis. iPad-Portrait (>=576) und groesser bleiben sichtbar. */
@media (max-width: 575.98px) {
  .prozess-infografik {
    display: none !important;
  }
}

/* Tablet (576-767): vertikales Layout, alle 15 Schritte untereinander mit
   kleinem Stagger beim Scroll-In. Bar wird ausgeblendet, Schiene wird vertikal. */
@media (max-width: 767px) {
  .prozess-stage {
    height: auto;
    min-height: 0;
  }
  .prozess-stage-inner {
    position: relative;
    top: auto;
    left: auto;
    transform: none !important;
    height: auto;
    padding: 8px 8px 8px 48px;
  }
  .prozess-track {
    position: relative;
    width: 100% !important;
    height: auto !important;
    transform: none !important;
  }
  /* JS setzt inline width: <trackWidth>px (Desktop ~1108) auf rail/track/bar.
     Auf Mobile mit !important auf width zwingen, sonst bleibt die rail
     horizontal und sprengt den Viewport. */
  .prozess-rail {
    position: absolute;
    top: 16px;
    bottom: 16px;
    left: 22px;
    width: 4px !important;
    height: auto;
    transform: none !important;
    background: linear-gradient(180deg,
                var(--brand-primary-dark, #0e2f56) 0%,
                var(--brand-primary, #13447a) 50%,
                #068ed6 100%);
  }
  .prozess-rail::before { display: none; }
  .prozess-timeline-bar { display: none; }
  .prozess-dot {
    left: 22px !important;
    top: auto !important;
    transform: translate(-50%, -50%) scale(1) !important;
    opacity: 1 !important;
  }
  .prozess-step {
    position: relative !important;
    left: auto !important;
    top: auto !important;
    width: 100%;
    max-width: 100%;
    margin: 0 0 12px 0;
    transform: translateY(20px);
  }
  .prozess-step.visible { transform: translateY(0); }
  .prozess-step.below::after,
  .prozess-step.above::after,
  .prozess-step.below .prozess-step-header::after { display: none; }
  .prozess-conn { display: none; }
}

/* Headline ueber der Prozess-Timeline (Startseite).
   Stile spiegeln .wpl-h2 (unternehmen-locations.css), die hier nicht nutzbar
   ist, weil das Stylesheet nur auf Unternehmen.html geladen wird. Reveal
   koppelt an den IntersectionObserver der .prozess-infografik (in
   js/prozess-infografik.js wird .is-revealed gesetzt) und triggert mit
   100 ms Stagger-Vorlauf gegenueber dem Section-Fade. */
.prozess-heading {
  font-family: "Manrope", system-ui, -apple-system, "Segoe UI", sans-serif;
  font-size: 36px;
  line-height: 1.1;
  font-weight: 800;
  letter-spacing: -0.02em;
  color: var(--wp-blue-mid);
  text-align: center;
  text-transform: none;
  margin: 0 auto 32px;
  max-width: 920px;

  opacity: 0;
  transform: translateY(10px);
  transition:
    opacity 700ms cubic-bezier(0.22, 1, 0.36, 1) 100ms,
    transform 700ms cubic-bezier(0.22, 1, 0.36, 1) 100ms;
}

.prozess-infografik.is-revealed .prozess-heading {
  opacity: 1;
  transform: none;
}

@media (max-width: 980px) {
  .prozess-heading { font-size: 30px; margin-bottom: 24px; }
}
@media (max-width: 768px) {
  .prozess-heading { font-size: 26px; margin-bottom: 20px; }
}

@media (prefers-reduced-motion: reduce) {
  .prozess-heading {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ============================================================================
   Block 22: Navbar — Layout-Shift-Prävention + Home-Stagger
   ----------------------------------------------------------------------------
   (1) Das Sprach-Dropdown-`<li>` hat im Server-HTML nur die 30px Flagge.
       RDNavbar haengt nach Init `<span class="rd-navbar-submenu-toggle">` mit
       dem Lucide-Chevron-SVG dran (~16px breit). Das verursachte einen
       sichtbaren horizontalen Sprung der Navi-Leiste beim ersten Render.
       Fix: `min-width: 46px` auf dem `<li>` reserviert direkt im Server-Render
       die finale Breite, der Chevron schiebt sich dann lautlos in den schon
       reservierten Raum.
   (2) Auf der Startseite (PHP setzt `.home-stagger` auf `.rd-navbar`) faden
       die 7 Menue-Items von links nach rechts gestaffelt ein (80ms Versatz,
       350ms ease-out), gefolgt von der Sprach-Pille als Slot 8. Auf Subpages
       bleibt die Navbar stabil.
   ============================================================================ */
.rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu {
  min-width: 46px;
}

.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item {
  opacity: 0;
  transform: translateY(-6px);
  animation: navStaggerIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(1) { animation-delay: 120ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(2) { animation-delay: 200ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(3) { animation-delay: 280ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(4) { animation-delay: 360ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(5) { animation-delay: 440ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(6) { animation-delay: 520ms; }
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item:nth-child(7) { animation-delay: 600ms; }

@keyframes navStaggerIn {
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* ============================================================================
   Block 23: Hero-Video-Trigger + Video-Modal (Erklärvideo, nur DE-Site)
   ----------------------------------------------------------------------------
   Sekundärer Trigger unter den Hero-CTAs öffnet ein Modal mit youtube-nocookie-
   Embed. Das iframe wird erst beim Klick injiziert (siehe js/video-modal.js),
   sodass vor User-Interaktion keine YouTube-Cookies geladen werden.
   ============================================================================ */

/* Wrapper-Row matcht die Breite der hero-cta-row (580px) und zentriert den
   Trigger horizontal. Eigene Zeile unter den beiden CTAs, sodass der Trigger
   nicht linksbuendig am Rand klebt. Reveal-Animation faded den Wrapper mit
   ein - mit hoeherem Delay (700ms) als die hero-cta-row (550ms), sodass der
   Stagger-Reveal weiterlaeuft (Eyebrow -> Headline -> Subline -> CTAs -> Trigger). */
.hero-video-trigger-row {
  max-width: 580px;
  margin-top: 18px;
  text-align: center;
  animation: hero-fade-up var(--duration-slow, 0.7s) var(--ease-smooth, cubic-bezier(0.16, 1, 0.3, 1)) 700ms both;
}

.hero-video-trigger {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 10px 14px 10px 12px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.18);
  border-radius: 999px;
  color: rgba(255, 255, 255, 0.92);
  font-family: inherit;
  font-size: 14px;
  line-height: 1.2;
  text-align: left;
  cursor: pointer;
  transition: background-color 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
  -webkit-tap-highlight-color: transparent;
}
.hero-video-trigger:hover,
.hero-video-trigger:focus-visible {
  background: rgba(255, 255, 255, 0.12);
  border-color: rgba(255, 255, 255, 0.45);
  transform: translateY(-1px);
  outline: none;
}
.hero-video-trigger:focus-visible {
  box-shadow: 0 0 0 2px var(--brand-amber, #d4a017);
}
.hero-video-trigger:active {
  transform: translateY(0);
}

.hero-video-trigger__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.hero-video-trigger__icon svg {
  display: block;
}

.hero-video-trigger__text {
  display: inline-flex;
  flex-direction: column;
  gap: 1px;
}
.hero-video-trigger__lead {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--brand-amber, #d4a017);
}
.hero-video-trigger__main {
  font-size: 14px;
  font-weight: 600;
  letter-spacing: -0.005em;
}

/* ----------------------------------------------------------------------------
   Video-Modal — verwendet das native <dialog>-Element.
   ---------------------------------------------------------------------------- */
.video-modal {
  width: min(960px, 92vw);
  max-width: 960px;
  border: 0;
  padding: 0;
  background: transparent;
  color: #fff;
  overflow: visible;
}
.video-modal::backdrop {
  background: rgba(7, 26, 56, 0.86);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}

.video-modal__frame {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  background: #000;
  border-radius: 14px;
  overflow: hidden;
  box-shadow:
    0 20px 60px rgba(0, 0, 0, 0.55),
    0 0 0 1.5px rgba(255, 255, 255, 0.18) inset;
}
.video-modal__frame iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}
/* Fallback-Link unter dem iframe — sichtbar besonders auf Safari mit ITP,
   wo YouTube im iframe Bot-Detection trigern kann. Sitzt absolute am unteren
   Rand des Frames mit halbtransparenter Pille — dezent, stoert die meisten
   User die das Video normal sehen koennen nicht. */
.video-modal__fallback {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  bottom: 14px;
  z-index: 2;
  pointer-events: auto;
}
.video-modal__fallback a {
  display: inline-block;
  padding: 8px 18px;
  background: rgba(0, 0, 0, 0.65);
  color: #ffffff;
  border-radius: 999px;
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, 0.18);
  transition: background 0.2s, transform 0.2s;
}
.video-modal__fallback a:hover,
.video-modal__fallback a:focus-visible {
  background: rgba(212, 160, 23, 0.95);
  color: #13447a;
  transform: translateY(-1px);
  text-decoration: none;
}

.video-modal__close {
  position: absolute;
  top: -52px;
  right: -4px;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, 0.12);
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: 50%;
  color: #fff;
  font-size: 28px;
  font-weight: 300;
  line-height: 1;
  cursor: pointer;
  transition: background-color 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
  -webkit-tap-highlight-color: transparent;
}
.video-modal__close:hover,
.video-modal__close:focus-visible {
  background: rgba(255, 255, 255, 0.22);
  border-color: rgba(255, 255, 255, 0.55);
  outline: none;
}
.video-modal__close:focus-visible {
  box-shadow: 0 0 0 2px var(--brand-amber, #d4a017);
}

@media (max-width: 575px) {
  .video-modal {
    width: 94vw;
  }
  .video-modal__close {
    top: -48px;
    right: 0;
    width: 40px;
    height: 40px;
    font-size: 24px;
  }
  .hero-video-trigger-row {
    margin-top: 14px;
  }
}

/* Body-Lock waehrend Modal offen ist (verhindert Background-Scroll) */
body.video-modal-open {
  overflow: hidden;
}

/* ============================================================================
   24b) Mobile horizontaler Overflow-Schutz
   ----------------------------------------------------------------------------
   Theme-Parallax-Container mit absolut positionierten 1500+px Background-Images
   loesen auf Mobile horizontalen Page-Scroll aus, weil deren overflow:hidden
   nicht ueberall greift. Globaler overflow-x:hidden auf html/body verhindert
   das ohne andere Layouts zu brechen — vertikales Scroll bleibt unberuehrt.
   ============================================================================ */
@media (max-width: 991px) {
  html, body {
    overflow-x: hidden;
    max-width: 100vw;
  }
}

/* ============================================================================
   24a) ProSeal-Widget auf Phones (Portrait + Landscape) verstecken
   ----------------------------------------------------------------------------
   js/lazy-third-party.js injiziert das ProSeal-Widget nicht, wenn der Viewport
   beim Page-Load schon klein ist. ABER: wenn der User in Portrait laed und
   dann zu Landscape dreht, ist das Widget noch im DOM. CSS-Fallback verhindert
   es trotzdem auf Phones (auch Querformat-iPhone), nicht aber auf iPads.
   ============================================================================ */
@media (max-width: 575.98px),
       (max-height: 575.98px) and (orientation: landscape) {
  iframe[src*="provenexpert"],
  iframe[id*="proSeal"],
  div[class*="pe-banner"],
  div[class*="pe-pro-seal"]:not(.pe-pro-seal-more-infos),
  div[id*="proSeal"]:not(script),
  .pe-pro-seal-bottom-left {
    display: none !important;
    visibility: hidden !important;
    pointer-events: none !important;
  }
}

/* ============================================================================
   24c) Service-Pakete: "IDEAL FUER"-Banner unter dem Foto
   ----------------------------------------------------------------------------
   Bilder motiv_paket{1,2,3}.jpg sind als reine Foto-Versionen ohne
   eingebrannten Text neu generiert. Der frueher in den Bildern enthaltene
   blaue "IDEAL FUER"-Text-Banner wird jetzt per HTML/CSS unter dem Foto
   gerendert und kann damit pflegeleicht in DE/EN/CN i18n'd werden.
   ============================================================================ */
.paket-image {
  margin: 0;
  border-radius: 5px;
  overflow: hidden;
  /* Premium-Vier-Layer-Shadow uebernommen vom Unternehmen-Panorama-Block
     (.wpl-band): gibt den Service-Paket-Karten dieselbe Tiefenwirkung. */
  box-shadow:
    0 1px 2px rgba(26, 58, 92, 0.06),
    0 8px 18px -8px rgba(26, 58, 92, 0.22),
    0 28px 48px -18px rgba(19, 40, 63, 0.32),
    0 60px 110px -40px rgba(13, 28, 48, 0.45);
}
.paket-image > img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 5px 5px 0 0 !important;
}
.paket-image__banner {
  background: #13447a !important;
  color: #ffffff;
  padding: 14px 28px !important;
  display: flex !important;
  align-items: center !important;
  gap: 20px;
  border-radius: 0 0 5px 5px;
  /* Fixe Mindesthoehe, damit alle vier Pakete gleich grosse Bildfelder
     ergeben unabhaengig von Textlaenge — kuerzester Text (Full Sourcing)
     wuerde sonst das Bildfeld verkuerzen.
     Schrittweise reduziert von 200 → 160 → 140 px (Session 22 Teil 7),
     damit der CTA-Block "Termin vereinbaren" auf typischen Desktop-
     Viewports (1080 px) komplett im View bleibt. */
  min-height: 140px !important;
  box-sizing: border-box;
}
.paket-image__icon {
  width: 56px;
  height: 56px;
  flex: 0 0 56px;
  color: #d4a017 !important;
  opacity: 0.95;
}
.paket-image__text {
  flex: 1 1 auto;
  min-width: 0;
}
.paket-image .paket-image__eyebrow {
  font-size: 14px !important;
  letter-spacing: 0.16em !important;
  text-transform: uppercase !important;
  margin: 0 0 6px 0 !important;
  font-weight: 700 !important;
  color: #d4a017 !important;
  font-family: inherit !important;
}
.paket-image .paket-image__desc {
  font-size: 15px !important;
  line-height: 1.55 !important;
  margin: 0 !important;
  color: #ffffff !important;
  font-weight: 400 !important;
  font-family: inherit !important;
}
@media (max-width: 991.98px) {
  .paket-image__banner {
    min-height: 140px;
  }
}
@media (max-width: 575.98px) {
  .paket-image__banner {
    padding: 16px 22px !important;
    gap: 16px;
    min-height: 140px !important;
    align-items: flex-start !important;
  }
  .paket-image__icon {
    width: 44px;
    height: 44px;
    flex-basis: 44px;
    margin-top: 2px;
  }
  .paket-image__desc {
    font-size: 14px;
  }
}

/* ============================================================================
   25) Mobile-Menue Lesbarkeit
   ----------------------------------------------------------------------------
   style.css 5029-5034 setzt color:#fff UND background:#fff auf dem
   .rd-navbar-nav-wrap im fixed-Mode (Mobile/Tablet) — weisse Schrift auf
   weissem Hintergrund, unlesbar. Hier override mit Brand-Blue-Drawer und
   weisser Schrift (analog zum Hero-Look). Gold-Akzent fuer aktiven/Hover.
   ============================================================================ */
.rd-navbar-fixed .rd-navbar-nav-wrap {
  background: #13447a !important;
  color: #ffffff !important;
  border: none !important;
}
.rd-navbar-fixed .rd-nav-item > a,
.rd-navbar-fixed .rd-navbar-nav > li > a,
.rd-navbar-fixed .rd-nav-link {
  color: #ffffff !important;
}
.rd-navbar-fixed .rd-nav-item.active > a,
.rd-navbar-fixed .rd-nav-item.active .rd-nav-link,
.rd-navbar-fixed .rd-nav-item:hover > a,
.rd-navbar-fixed .rd-nav-item:hover .rd-nav-link,
.rd-navbar-fixed .rd-nav-item:focus > a,
.rd-navbar-fixed .rd-nav-item.focus .rd-nav-link,
.rd-navbar-fixed .rd-nav-item.opened > a,
.rd-navbar-fixed .rd-nav-item.opened .rd-nav-link {
  background: #d4a017 !important;
  color: #13447a !important;
}
.rd-navbar-fixed .rd-navbar-submenu-toggle,
.rd-navbar-fixed .rd-navbar-submenu-toggle::after {
  color: #ffffff !important;
}
/* style.css 4858 setzt content: '\f107' (FontAwesome chevron-down) als
   ::after auf den Submenu-Toggle. FontAwesome haben wir in Session 6
   komplett aus dem Theme entfernt → Browser rendert das Glyph als Tofu (□).
   Den Submenu-Pfeil zeichnen wir jetzt als Lucide-SVG inline im Toggle-
   Element selbst (script.js fuegt das ein). Daher das Pseudo-Element
   abdrehen. */
.rd-navbar-fixed .rd-navbar-submenu-toggle::after,
.rd-navbar-fixed .rd-navbar-submenu-toggle::before,
.rd-navbar-fixed li.opened > .rd-navbar-submenu-toggle::after {
  content: none !important;
  display: none !important;
}
/* Sprach-Switcher-Submenu-Toggle (V-Pfeil unter Fahne) — wird per JS
   default UNTER den nav-link gesetzt. Wir positionieren ihn absolut
   RECHTS neben der Fahne, sonst sieht es ungeordnet aus. */
.rd-navbar-fixed .rd-nav-item.rd-navbar-submenu {
  position: relative;
}
.rd-navbar-fixed .rd-nav-item.rd-navbar-submenu > .rd-navbar-submenu-toggle {
  position: absolute !important;
  right: 18px !important;
  top: 14px !important;
  display: flex !important;
  align-items: center;
  justify-content: center;
  width: 24px !important;
  height: 24px !important;
  padding: 0 !important;
  font-size: 16px !important;
  z-index: 2;
}
.rd-navbar-fixed .rd-navbar-dropdown,
.rd-navbar-fixed .rd-megamenu {
  background: rgba(0, 0, 0, 0.18);
}
.rd-navbar-fixed .rd-navbar-dropdown > li > a,
.rd-navbar-fixed .rd-megamenu-list > li > a {
  color: #ffffff !important;
}

/* ============================================================================
   28) Card-Flip-Animation — Startseiten-Karten mit Vorder- und Rückseite
   ============================================================================
   Klick auf "Mehr erfahren" dreht die Karte 180° um die Y-Achse.
   Vorderseite zeigt kompakte Übersicht (Hauptsatz + Bullets).
   Rückseite zeigt ausführliche SEO-relevante Inhalte mit Brand-Cyan-Hintergrund.
   ============================================================================ */
.thumbnail.thumbnail4.card-flip {
  position: relative;
  background: transparent !important;
  padding: 0 !important;
  border-radius: 8px;
  overflow: visible;
  /* perspective auf der Karte selbst, damit der innere 3D-Flip korrekt
     gerendert wird. preserve-3d sitzt auf .card-flip-inner und stapelt
     die beiden Faces — Inhalt rotiert physikalisch mit der Karte. */
  perspective: 1500px;
  -webkit-perspective: 1500px;
  transition: none !important;
}
.thumbnail.thumbnail4.card-flip:hover {
  /* Standard-Hover-Drehung der thumbnail4 deaktivieren — würde mit der
     Card-Flip-Animation konfligieren. */
  transform: none !important;
}

.thumbnail.thumbnail4.card-flip .card-flip-inner {
  position: relative;
  width: 100%;
  min-height: 860px;
  transform-style: preserve-3d;
  -webkit-transform-style: preserve-3d;
}

/* Initial-State Two-Face-3D-Flip ist obsolet — Container-Rotation +
   display-Swap macht das überflüssig. Kein transform auf den Faces selbst. */

.thumbnail.thumbnail4.card-flip .card-flip-face {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  border-radius: 8px;
  box-sizing: border-box;
  padding: 24px;
}
.thumbnail.thumbnail4.card-flip .card-flip-face--back {
  padding: 40px 20px 30px;
}

.thumbnail.thumbnail4.card-flip .card-flip-face--front {
  background: var(--brand-blue, #064a8b);
}

.thumbnail.thumbnail4.card-flip .card-flip-face--back-styles {
  /* superseded by .card-flip-face--back rotation block above */
}
.thumbnail.thumbnail4.card-flip .card-flip-face--back {
  background: linear-gradient(135deg, #064a8b 0%, #0a6bb8 100%);
  color: #fff;
  text-align: left;
  overflow-y: auto;
}

.card-flip-back__title {
  font-size: 1.5rem;
  margin: 0 0 1rem 0;
  font-weight: 700;
  color: #fff;
  position: relative;
  padding-bottom: 0.6rem;
}
.card-flip-back__title::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 60px;
  height: 3px;
  background: var(--brand-amber, #d4a017);
}

.card-flip-back__content {
  flex-grow: 1;
  overflow-y: auto;
  font-size: 0.95rem;
  line-height: 1.55;
  margin-bottom: 1rem;
}

.card-flip-back__content p {
  margin: 0 0 0.75rem 0;
}

.card-flip-back__content h4 {
  margin: 1rem 0 0.4rem 0;
  font-size: 1rem;
  font-weight: 700;
  color: var(--brand-amber, #d4a017);
}

.card-flip-back__content ul {
  list-style: none;
  padding: 0;
  margin: 0.5rem 0 1rem 0;
}

.card-flip-back__content li {
  position: relative;
  padding-left: 1.25rem;
  margin-bottom: 0.4rem;
  line-height: 1.45;
}

.card-flip-back__content li::before {
  content: "•";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--brand-amber, #d4a017);
  font-weight: 700;
}

.card-flip-trigger {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.65rem 1.25rem;
  margin-top: auto;
  background: rgba(255, 255, 255, 0.12);
  border: 1px solid rgba(255, 255, 255, 0.45);
  border-radius: 6px;
  color: #fff;
  cursor: pointer;
  font-size: 0.9rem;
  font-weight: 600;
  font-family: inherit;
  align-self: flex-start;
  transition: background 0.2s, border-color 0.2s, transform 0.2s;
}

.card-flip-trigger:hover {
  background: rgba(255, 255, 255, 0.22);
  border-color: rgba(255, 255, 255, 0.7);
  transform: translateY(-1px);
}

.card-flip-trigger:active {
  transform: translateY(0);
}

.card-flip-close {
  background: var(--brand-amber, #d4a017);
  border-color: var(--brand-amber, #d4a017);
  color: #1a1a1a;
}

.card-flip-close:hover {
  background: #b88812;
  border-color: #b88812;
}

/* Reduced motion: kein Drehen, sondern Crossfade */
@media (prefers-reduced-motion: reduce) {
  .thumbnail.thumbnail4.card-flip .card-flip-inner {
    transition: none;
  }
  .thumbnail.thumbnail4.card-flip.is-flipped .card-flip-inner {
    transform: none;
  }
  .thumbnail.thumbnail4.card-flip.is-flipped .card-flip-face--front {
    visibility: hidden;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-face--back {
    transform: none;
    visibility: hidden;
  }
  .thumbnail.thumbnail4.card-flip.is-flipped .card-flip-face--back {
    visibility: visible;
  }
}
/* Scroll-driven Animation rf-fade-rise auf den Karten der Startseite ausschalten —
   sie animiert transform und überschreibt unsere Card-Flip-Rotation. */
@supports (animation-timeline: view()) {
  .thumbnail.thumbnail4.card-flip {
    animation: none !important;
    animation-timeline: auto !important;
    animation-range: normal !important;
    opacity: 1 !important;
    transform: none !important;
  }
}
/* Card-Flip Layout-Lock: figure darf NICHT schrumpfen wenn die Bullets variieren,
   plus mehr Atemraum für den "Mehr erfahren"-Button. */
.thumbnail.thumbnail4.card-flip .card-flip-face--front .thumbnail-img {
  flex-shrink: 0;
}
.thumbnail.thumbnail4.card-flip .card-flip-face--front .thumbnail-bullets {
  flex-shrink: 0;
}
.thumbnail.thumbnail4.card-flip .card-flip-face--front .card-flip-trigger {
  margin-top: auto;
}
/* ============================================================================
   29) Card-Flip Mobile-Optimierung
   ============================================================================
   Auf schmalen Viewports passen viele Werte nicht mehr: title-wrap min-height
   ist zu groß (Titel sind auf breiter Mobile-Spalte oft 1-2 zeilig),
   inner min-height macht Karten unnötig hoch (>Viewport), Padding der Faces
   frisst Inhalt-Platz, und der 90°-Reveal wirkt auf kleinem Bildschirm zu
   krass — wir nehmen dort nur einen sanften Translate+Fade. */
@media (max-width: 991.98px) and (min-width: 768px) {
  /* Tablet 3-spaltig (Bootstrap md): Karten ~219 px schmal, Titel werden
     3- oder 4-zeilig — daher mehr min-height für Titel + Inner. */
  .thumbnail.thumbnail4 .thumbnail-title-wrap {
    min-height: 7em;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-inner {
    min-height: 960px;
  }
}

@media (max-width: 767.98px) and (min-width: 576px) {
  /* Tablet 2-spaltig / Phablet (Bootstrap sm): Karten ~340 px breit */
  .thumbnail.thumbnail4 .thumbnail-title-wrap {
    min-height: 5em;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-inner {
    min-height: 740px;
  }
}

@media (max-width: 575.98px) {
  /* Mobile (single column, volle Breite) */
  .thumbnail.thumbnail4 .thumbnail-title-wrap {
    min-height: 4em;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-inner {
    min-height: 680px;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-face {
    padding: 20px 18px;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-face--back {
    padding: 28px 18px 22px;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-back__title {
    font-size: 1.3rem;
    margin-bottom: 0.75rem;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-back__content {
    font-size: 0.92rem;
    line-height: 1.5;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-back__content h4 {
    margin-top: 0.85rem;
  }
  .thumbnail.thumbnail4.card-flip .card-flip-trigger {
    padding: 0.75rem 1.4rem;
    font-size: 1rem;
    min-height: 44px;
  }
}
/* === Card-Flip Mobile-Polish (Session 13 Teil 15) ===
   - Auf Mobile/Tablet die ::before-Linie unter dem Karten-Titel ausblenden
     (sie rutschte in das Animations-Video rein und wirkte unsauber).
   - pointer-events explizit steuern, weil backface-visibility:hidden auf
     manchen Mobile-Browsern nicht zuverlässig pointer-events blockt — 
     der Zurück-Button auf der Rückseite war dadurch nicht klickbar.
*/
@media (max-width: 991.98px) {
  .thumbnail.thumbnail4.card-flip .thumbnail-title::before {
    display: none;
  }
  .thumbnail.thumbnail4.card-flip .thumbnail-title {
    padding-bottom: 0;
  }
}

/* === Echter Two-Face-3D-Flip (Session 15) ===
   Beide Faces sind permanent im DOM (display:flex) und mit transform:
   rotateY(0°/180°) fest verankert. backface-visibility:hidden versteckt
   automatisch die jeweils abgewandte Face. Der innere Container
   (.card-flip-inner) rotiert via WAAPI zwischen 0° und 180° und nimmt
   beide Faces mit — der Inhalt klebt physikalisch an der Karte und
   dreht synchron. perspective sitzt auf der .card-flip selbst (oben),
   preserve-3d auf .card-flip-inner. */
.thumbnail.thumbnail4.card-flip .card-flip-face--front {
  display: flex;
  transform: rotateY(0deg);
  -webkit-transform: rotateY(0deg);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  pointer-events: auto;
}
.thumbnail.thumbnail4.card-flip .card-flip-face--back {
  display: flex;
  transform: rotateY(180deg);
  -webkit-transform: rotateY(180deg);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  pointer-events: none;
}

/* ============================================================================
   30) Trust-Tile unter jeder Service-Karte (Session 18, 2026-05-08)
   ============================================================================
   Pro Karte ein einzelnes Tile mit Trust-Kennzahl. Sitzt direkt unter der
   jeweiligen Karte in derselben col-md-4-Spalte — Zahl in Brand-Amber,
   Label in 92 % Weiß. Eine sehr dünne Trennlinie oben grenzt vom Karten-
   block ab. Auto-zentriert in der Spalte. */
.key-stats-row {
  margin-top: 36px;
  margin-bottom: 12px;
}
.key-stat-tile {
  margin: 0 auto;
  max-width: 320px;
  padding: 18px 16px 6px;
  text-align: center;
  border-top: 1px solid rgba(255, 255, 255, 0.18);
}
.key-stat-tile__value {
  display: block;
  font-size: clamp(2rem, 3.6vw, 3rem);
  font-weight: 700;
  color: var(--brand-amber, #d4a017);
  line-height: 1.05;
  letter-spacing: -0.01em;
  font-feature-settings: "tnum" 1;
}
.key-stat-tile__unit {
  font-weight: 600;
  font-size: 0.7em;
  margin-left: 0.05em;
  letter-spacing: 0.01em;
}
.key-stat-tile__label {
  display: block;
  margin-top: 8px;
  font-size: 0.95rem;
  font-weight: 500;
  color: rgba(255, 255, 255, 0.92);
  line-height: 1.35;
  letter-spacing: 0.015em;
}
@media (max-width: 991.98px) {
  .key-stat-tile {
    margin-top: 22px;
    padding: 18px 14px 4px;
  }
}

/* ============================================================================
   31) Logistik-Routen-Karte (Session 17, 2026-05-08)
   ============================================================================
   Full-bleed Sektion mit interaktiver D3-Weltkarte und drei animierten
   Routen (See/Bahn/Luft) zwischen Guangzhou und Hamburg/Frankfurt.
   Geometrie und d3-geo + topojson-client werden zur Laufzeit von jsdelivr
   geladen. Markup + Script-Module sitzen pro Sprache in page_Startseite.php. */
.route-map {
  position: relative;
  display: block;
  width: 100%;
  background: #ffffff;
  padding: 56px 32px 64px;
  box-sizing: border-box;
  color: #1a2738;
  font-family: 'Manrope', system-ui, sans-serif;
}
.route-map__intro {
  max-width: 880px;
  margin: 0 auto 28px;
  text-align: center;
}
.route-map__intro .eyebrow {
  display: inline-block;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: #d4a017;
  margin-bottom: 14px;
}
.route-map__intro h2 {
  font-weight: 600;
  font-size: clamp(28px, 4vw, 46px);
  line-height: 1.08;
  letter-spacing: -0.02em;
  margin: 0 0 14px;
  color: #13447a;
}
.route-map__intro p {
  margin: 0 auto;
  max-width: 620px;
  color: #5a6678;
  line-height: 1.55;
  font-size: 16px;
}

/* Frame-Wrapper trägt Border, Border-Radius und Schatten — das SVG
   selbst bleibt unbearbeitet. So bleibt das interne rm-water-Rect
   sauber im viewBox geclippt, ohne den Rahmen visuell zu stören. */
.route-map__frame {
  display: block;
  width: 100%;
  max-width: 1400px;
  margin: 0 auto;
  background: #13447a;
  border: 1px solid rgba(19, 68, 122, 0.16);
  border-radius: 14px;
  overflow: hidden;
  /* line-height:0 verhindert ein paar px Whitespace unter dem inline-SVG */
  line-height: 0;
  box-shadow:
    0 2px 4px rgba(19, 68, 122, 0.10),
    0 14px 32px rgba(19, 68, 122, 0.16),
    0 38px 80px rgba(19, 68, 122, 0.18);
}

/* iPad-Landscape-Bezel um die Map (Session 25/27): visualisiert den Echtzeit-Tracking-
   Bezug zur Trade-Hub-Plattform mit einem Tablet-Look. Session 27 (2026-05-10):
   Aluminium-Bezel + Glassmorphism-Pille + schwebender drop-shadow nach Claude-Design v6.
   Wenn rueckgaengig gewuenscht: `.route-map__device`-Wrapper im PHP-Markup entfernen —
   `.route-map__frame` funktioniert ohne diesen Wrapper unveraendert weiter.
   max-width: 1100 px = schmaler als die Ansprechpartner-Fotoreihe darunter, damit der
   drop-shadow auf der weissen Sektion sichtbar wird. Padding 18 px oben/unten,
   20 px links/rechts (v6). */
.route-map__device {
  position: relative;
  max-width: 1100px;
  margin: 0 auto;
  padding: 18px 20px;
  border-radius: 38px;
  background:
    /* faint top sheen */
    linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0) 18%),
    /* aluminium body */
    linear-gradient(160deg, #2a2a2c 0%, #161618 45%, #0d0d0e 100%);
  box-shadow:
    inset 0 0 0 1.5px #3a3a3c,                  /* outer aluminium edge */
    inset 0 1px 0 rgba(255, 255, 255, 0.10),
    inset 0 -1px 0 rgba(0, 0, 0, 0.6);
  /* Schwebender drop-shadow auf weisser Sektion (filter statt box-shadow,
     damit der Schatten der gerundeten Bezel-Kante folgt). */
  filter:
    drop-shadow(0 28px 40px rgba(0, 0, 0, 0.45))
    drop-shadow(0 8px 14px rgba(0, 0, 0, 0.35));
}

/* Frontkamera oben mittig — kleiner glasartiger Punkt.
   Kein eigener z-index: vermeidet einen lokalen Stacking-Context, der das gesticktes
   Header-Klon (z-index: 1080) ueberlagern wuerde. */
.route-map__device-camera {
  position: absolute;
  top: 8px;
  left: 50%;
  transform: translateX(-50%);
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #2a3845 0%, #050709 70%);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}

/* Frame innerhalb des Bezels = Display-Glas-Flaeche.
   Border-radius gross genug fuer Tablet-Look, dunkelblauer Pre-Load-Hintergrund
   damit es waehrend des Bitmap-Generierens nicht weiss aufblitzt. */
.route-map__device .route-map__frame {
  position: relative;
  margin: 0;
  border: none;
  max-width: none;
  border-radius: 22px;
  overflow: hidden;
  background: #13447a;
  box-shadow:
    inset 0 0 0 1px rgba(0, 0, 0, 0.55),
    inset 0 0 0 2px rgba(255, 255, 255, 0.04);
}

/* Glas-Reflexions-Sweep ueber das Display, sehr subtil. */
.route-map__device .route-map__frame::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  background: linear-gradient(115deg,
    rgba(255, 255, 255, 0.10) 0%,
    rgba(255, 255, 255, 0.03) 22%,
    rgba(255, 255, 255, 0)    40%,
    rgba(255, 255, 255, 0)    70%,
    rgba(255, 255, 255, 0.04) 100%);
  mix-blend-mode: screen;
}

/* Glassmorphism-Tracking-Pille INNERHALB des Tablet-Screens (oben rechts).
   backdrop-filter blur fuer den Glaseffekt, leichte inset-border fuer Defition. */
.route-map__device-status {
  position: absolute;
  top: 14px;
  right: 14px;
  z-index: 5;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 12px 6px 9px;
  border-radius: 999px;
  background: rgba(10, 28, 50, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.10),
    0 1px 4px rgba(0, 0, 0, 0.25);
  color: #ffffff;
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.route-map__device-status-label {
  line-height: 1;
}

/* Doppel-Pulse-Dot: zwei Pseudo-Elemente, gleicher Pulse, 0.9 s versetzt — gibt
   einen lebendigen Live-Eindruck statt simplem Ring. */
.route-map__device-status-dot {
  position: relative;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #2ecc71;
  box-shadow: 0 0 6px rgba(46, 204, 113, 0.85);
}
.route-map__device-status-dot::before,
.route-map__device-status-dot::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: #2ecc71;
  opacity: 0;
  animation: route-map-status-pulse 1.8s ease-out infinite;
}
.route-map__device-status-dot::after { animation-delay: 0.9s; }

@keyframes route-map-status-pulse {
  0%   { transform: scale(1);   opacity: 0.55; }
  80%  { transform: scale(2.6); opacity: 0; }
  100% { transform: scale(2.6); opacity: 0; }
}

/* Mobile: Bezel kleiner und kompakter (Section ist <768 px ohnehin display:none,
   aber sicherheitshalber fuer alles drueber). */
@media (max-width: 767.98px) {
  .route-map__device {
    padding: 12px 14px;
    border-radius: 28px;
  }
  .route-map__device .route-map__frame {
    border-radius: 16px;
  }
  .route-map__device-camera {
    top: 5px;
    width: 5px;
    height: 5px;
  }
  .route-map__device-status {
    right: 12px;
    top: 10px;
    font-size: 10px;
    padding: 4px 10px 4px 8px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .route-map__device-status-dot::before,
  .route-map__device-status-dot::after { animation: none !important; }
}
.route-map .rm-svg {
  display: block;
  width: 100%;
  height: auto;
  margin: 0;
}

/* Route-line draw-on reveal */
.route-map .rm-line {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  transition: stroke-dashoffset 1.6s cubic-bezier(.6,.05,.2,1);
}
.route-map.is-revealed .rm-line--sea  { stroke-dashoffset: 0; transition-delay: 0s; }
.route-map.is-revealed .rm-line--cape { stroke-dashoffset: 0; transition-delay: .2s; }
.route-map.is-revealed .rm-line--rail { stroke-dashoffset: 0; transition-delay: .4s; }
.route-map.is-revealed .rm-line--air  { stroke-dashoffset: 0; transition-delay: .8s; }
.route-map.is-revealed .rm-line--sea  { stroke-dasharray: none; }
.route-map.is-revealed .rm-line--cape { stroke-dasharray: none; }
.route-map.is-revealed .rm-line--rail { stroke-dasharray: 6 4; }
.route-map.is-revealed .rm-line--air  { stroke-dasharray: 2 4; }

/* Markers / pulse */
.route-map .rm-halo {
  fill: #d4a017; opacity: 0;
  transform-box: fill-box; transform-origin: center;
}
.route-map.is-revealed .rm-halo {
  animation: rm-pulse 2.2s ease-out infinite;
}
@keyframes rm-pulse {
  0%   { transform: scale(.55); opacity: .55; }
  70%  { transform: scale(2.3);  opacity: 0; }
  100% { transform: scale(2.3);  opacity: 0; }
}
.route-map .rm-pin {
  transform-box: fill-box; transform-origin: center;
}
.route-map.is-revealed .rm-pin {
  animation: rm-breath 2.4s ease-in-out infinite;
}
@keyframes rm-breath {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.16); }
}

/* Vehicles hidden until lines have drawn */
.route-map .rm-vehicle {
  opacity: 0;
  transition: opacity .6s ease 2.4s;
}
.route-map.is-revealed .rm-vehicle {
  opacity: 1;
}

/* Labels */
.route-map .rm-label {
  font-family: 'Manrope', system-ui, sans-serif;
  font-weight: 600; font-size: 16px; fill: #ffffff;
  paint-order: stroke;
  stroke: rgba(19,68,122,.75); stroke-width: 3px; stroke-linejoin: round;
  opacity: 0;
  transition: opacity .5s ease 2s;
}
.route-map.is-revealed .rm-label { opacity: .96; }

/* === v9-Refresh: Narrows / Stations / Hub-Rings / Trail / Compass / Scalebar / ETA-Tags ===
   Session 28 (2026-05-10): zusaetzliche Detail-Layer auf der Karte. Engstellen
   (Suez/Bab/Malakka/Gibraltar) und Bahn-Stationen als kleine Diamanten mit Label,
   konzentrische Hub-Rings auf Guangzhou/Hamburg/Frankfurt, Schiff-Trail mit
   Gradient + Ghost-Schiffe, Compass-Rosette + Scale-Bar in den Map-Ecken,
   ETA-Tags die mit Vehicle mitziehen und Tage bis Ziel runter zaehlen. */
.route-map .rm-narrow__label {
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 11px; font-weight: 600;
  fill: #cfe1f7; opacity: 0.75;
  paint-order: stroke;
  stroke: rgba(10,28,50,0.7); stroke-width: 2.5px;
}

/* Hub-Rings: zwei konzentrische, pulsen mit Versatz */
.route-map .rm-hub__ring {
  fill: none; stroke: #EF9F27; stroke-width: 1.2;
  transform-box: fill-box; transform-origin: center;
  opacity: 0;
}
.route-map.is-revealed.is-active .rm-hub__ring {
  animation: rm-hub-pulse 2.6s ease-out infinite;
}
@keyframes rm-hub-pulse {
  0%   { transform: scale(0.35); opacity: 0; }
  20%  { opacity: 0.55; }
  100% { transform: scale(1.6); opacity: 0; }
}

/* Compass-Rosette unten links */
.route-map .rm-compass__bg {
  fill: rgba(8,24,46,0.55); stroke: rgba(255,255,255,0.15);
}
.route-map .rm-compass__ring {
  fill: none; stroke: rgba(255,255,255,0.10); stroke-width: 1;
  stroke-dasharray: 1 3;
}
.route-map .rm-compass__needle { fill: rgba(255,255,255,0.35); }
.route-map .rm-compass__needle--n { fill: #EF9F27; }
.route-map .rm-compass__lbl {
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 9px; font-weight: 700; letter-spacing: 0.12em;
  fill: #d4a017;
}

/* Scale-Bar unten rechts (1.000 km) */
.route-map .rm-scale__line,
.route-map .rm-scale__tick {
  stroke: rgba(255,255,255,0.55); stroke-width: 1.2;
  stroke-linecap: round;
}
.route-map .rm-scale__lbl {
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 13px; font-weight: 700; letter-spacing: 0.06em;
  fill: rgba(255,255,255,0.95);
  paint-order: stroke;
  stroke: rgba(8,24,46,0.85); stroke-width: 3px;
}

/* ETA-Tag — Box + Leader-Line, bewegt sich mit Vehicle, Tage zaehlen runter */
.route-map .rm-eta__leader {
  stroke: #fff; stroke-width: 1.6;
  stroke-linecap: round; opacity: 0.95;
  vector-effect: non-scaling-stroke;
}
.route-map .rm-eta__anchor { fill: #fff; stroke: rgba(8,24,46,0.9); stroke-width: 1; }
.route-map .rm-eta__bg {
  fill: rgba(8,24,46,0.9); stroke: rgba(255,255,255,0.45); stroke-width: 1;
}
.route-map .rm-eta__title {
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 9px; font-weight: 700; letter-spacing: 0.14em;
  fill: #d4a017;
}
.route-map .rm-eta__sub {
  font-family: 'Manrope', system-ui, sans-serif;
  font-size: 11px; font-weight: 600; fill: #fff;
}

/* ETA-Tags vor Reveal verstecken, nach Reveal mit gleichem Delay wie Vehicles */
.route-map .rm-eta-group { opacity: 0; transition: opacity .6s ease 2.4s; }
.route-map.is-revealed .rm-eta-group { opacity: 1; }

/* Schiff-Trail + Ghosts: gleiche Reveal-Behandlung wie Vehicles */
.route-map .rm-trail-group { opacity: 0; transition: opacity .6s ease 2.4s; }
.route-map.is-revealed .rm-trail-group { opacity: 1; }

/* Legend */
.route-map__legend {
  list-style: none;
  padding: 0;
  margin: 24px auto 0;
  max-width: 1400px;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 32px;
  justify-content: center;
  font-size: 13px;
  color: #5a6678;
}
.route-map__legend li {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 6px 0;
}
.route-map__legend svg { width: 32px; height: 12px; flex: none; }
.route-map__legend strong { color: #13447a; font-weight: 600; }

/* === Scroll-Reveal Stagger für Map-Sektion ===
   Beim Sichtbarwerden (IntersectionObserver setzt .is-revealed) blenden
   Intro, Map und Legend gestaffelt mit leichtem Slide-Up ein. Innerhalb
   der Map laufen anschließend die Routen-Lines, Pin-Halos und Vehicle-
   Animationen über die schon definierten .is-revealed-Regeln.

   Wichtig: wenn der iPad-Bezel-Wrapper `.route-map__device` da ist, fadet
   der KOMPLETTE Bezel + Map als Einheit ein (statt nur die Map innerhalb
   des statischen Bezels). Falls der Wrapper später revertiert wird, greift
   das Reveal direkt auf `.route-map > .route-map__frame`. */
.route-map .route-map__intro,
.route-map > .route-map__device,
.route-map > .route-map__frame,
.route-map .route-map__legend {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.9s ease-out,
    transform 0.9s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

/* Frame innerhalb des Bezels NICHT separat ausblenden — der Bezel-Wrapper
   uebernimmt das Reveal. Sonst saehe man den schwarzen Bezel statisch und
   die Map daring fadet getrennt rein. */
.route-map > .route-map__device .route-map__frame {
  opacity: 1;
  transform: none;
  transition: none;
}

.route-map.is-revealed .route-map__intro {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0s;
}
.route-map.is-revealed > .route-map__device,
.route-map.is-revealed > .route-map__frame {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.18s;
}
.route-map.is-revealed .route-map__legend {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.55s;
}

@media (prefers-reduced-motion: reduce) {
  .route-map .rm-line { stroke-dashoffset: 0; transition: none; }
  .route-map .rm-line--rail { stroke-dasharray: 6 4; }
  .route-map .rm-line--air  { stroke-dasharray: 2 4; }
  .route-map .rm-line--sea  { stroke-dasharray: none; }
  .route-map .rm-line--cape { stroke-dasharray: none; }
  .route-map .rm-halo { animation: none; opacity: .35; }
  .route-map .rm-pin  { animation: none; }
  .route-map .rm-hub__ring { animation: none !important; opacity: 0; }
  .route-map .rm-vehicle { display: none; }
  .route-map .rm-eta-group, .route-map .rm-trail-group { display: none; }
  .route-map .rm-label   { opacity: .95; transition: none; }
  .route-map .route-map__intro,
  .route-map .route-map__frame,
  .route-map .route-map__legend {
    opacity: 1;
    transform: none;
    transition: none;
  }
}
/* Map-Sektion auf Smartphone (<768 px) komplett ausblenden — auf so
   schmalem Display ist die Welt-Geometrie zu fein, um lesbar zu sein,
   und die D3/topojson-Runtime-Last lohnt sich dort nicht. iPad-Portrait
   (768 px) und größer bleibt sichtbar. */
@media (max-width: 767.98px) {
  .route-map { display: none; }
}

/* ============================================================================
   17) EU-Compliance-Badges (Dienstleistungen-Seite)
   ----------------------------------------------------------------------------
   Trust-Signal-Reihe zwischen Challenge-Lösung-Matrix und Service-Pakete.
   8-10 Badges in responsivem Grid. Hover/Focus zeigt Tooltip mit
   Kurzerklärung. Mobile: Tooltip dauerhaft sichtbar als Untertitel.
   Reveal-Stagger via `.is-revealed`-Klasse, gesetzt durch IntersectionObserver
   in script.js (#compliance-badges im revealSelectors-Array).
   ============================================================================ */

.compliance-section .compliance-intro {
  max-width: 720px;
  margin: var(--space-4) 0 var(--space-6) 0;
  text-align: left;
  color: var(--text-secondary);
  font-size: var(--fs-body);
  line-height: var(--leading-normal);
}

.compliance-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  gap: var(--space-4);
  list-style: none;
  padding: 0;
  margin: 0;
}

.compliance-badge {
  flex: 0 1 140px;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: var(--space-5) var(--space-4);
  min-height: 90px;
  background: var(--surface-elevated);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-soft);
  transition: transform var(--duration-base) var(--ease-smooth),
              border-color var(--duration-base) var(--ease-smooth),
              box-shadow var(--duration-base) var(--ease-smooth);
  cursor: help;
  outline: none;
}

.compliance-badge:hover,
.compliance-badge:focus-visible {
  transform: translateY(-3px);
  border-color: var(--brand-primary);
  box-shadow: var(--shadow-medium);
}

.compliance-badge:focus-visible {
  box-shadow: var(--shadow-medium), 0 0 0 3px color-mix(in oklab, var(--brand-amber) 45%, transparent);
}

.compliance-badge__label {
  font-weight: 700;
  font-size: 1.05rem;
  letter-spacing: 0.02em;
  color: var(--brand-primary);
  line-height: 1.2;
}

.compliance-badge__tooltip {
  position: absolute;
  bottom: calc(100% + 10px);
  left: 50%;
  transform: translateX(-50%) translateY(6px);
  width: max-content;
  max-width: 240px;
  padding: var(--space-3) var(--space-4);
  background: var(--brand-primary-dark);
  color: white;
  font-size: 0.82rem;
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: 0;
  text-transform: none;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-medium);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--duration-base) var(--ease-smooth),
              transform var(--duration-base) var(--ease-smooth);
  z-index: 5;
}

.compliance-badge__tooltip::after {
  content: '';
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  border: 6px solid transparent;
  border-top-color: var(--brand-primary-dark);
}

.compliance-badge:hover .compliance-badge__tooltip,
.compliance-badge:focus-visible .compliance-badge__tooltip,
.compliance-badge:focus-within .compliance-badge__tooltip {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
  pointer-events: auto;
}

/* Reveal: bis IntersectionObserver `.is-revealed` setzt, sind Badges hidden */
.compliance-section .compliance-badge {
  opacity: 0;
  transform: translateY(12px);
  transition: opacity var(--duration-base) var(--ease-smooth),
              transform var(--duration-base) var(--ease-smooth),
              border-color var(--duration-base) var(--ease-smooth),
              box-shadow var(--duration-base) var(--ease-smooth);
}

.compliance-section.is-revealed .compliance-badge {
  opacity: 1;
  transform: translateY(0);
}

.compliance-section.is-revealed .compliance-badge:nth-child(1)  { transition-delay: 0.05s; }
.compliance-section.is-revealed .compliance-badge:nth-child(2)  { transition-delay: 0.10s; }
.compliance-section.is-revealed .compliance-badge:nth-child(3)  { transition-delay: 0.15s; }
.compliance-section.is-revealed .compliance-badge:nth-child(4)  { transition-delay: 0.20s; }
.compliance-section.is-revealed .compliance-badge:nth-child(5)  { transition-delay: 0.25s; }
.compliance-section.is-revealed .compliance-badge:nth-child(6)  { transition-delay: 0.30s; }
.compliance-section.is-revealed .compliance-badge:nth-child(7)  { transition-delay: 0.35s; }
.compliance-section.is-revealed .compliance-badge:nth-child(8)  { transition-delay: 0.40s; }
.compliance-section.is-revealed .compliance-badge:nth-child(9)  { transition-delay: 0.45s; }
.compliance-section.is-revealed .compliance-badge:nth-child(10) { transition-delay: 0.50s; }
.compliance-section.is-revealed .compliance-badge:nth-child(n+11) { transition-delay: 0.55s; }

/* Mobile: Tooltip wird zu permanenter Caption unter dem Label,
   2-Spalten-Grid statt auto-fill. */
@media (max-width: 575.98px) {
  .compliance-grid {
    gap: var(--space-3);
  }
  .compliance-badge {
    flex: 0 1 calc(50% - var(--space-3) / 2);
    padding: var(--space-4) var(--space-3);
    min-height: auto;
  }
  .compliance-badge__tooltip {
    position: static;
    transform: none;
    background: transparent;
    color: var(--text-muted);
    box-shadow: none;
    padding: var(--space-2) 0 0;
    font-size: 0.75rem;
    opacity: 1;
    pointer-events: none;
    max-width: none;
    width: auto;
    border-radius: 0;
  }
  .compliance-badge__tooltip::after { display: none; }
  .compliance-badge:hover,
  .compliance-badge:focus-visible {
    transform: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .compliance-section .compliance-badge,
  .compliance-section.is-revealed .compliance-badge {
    opacity: 1;
    transform: none;
    transition: none;
  }
  .compliance-badge:hover,
  .compliance-badge:focus-visible {
    transform: none;
  }
}


/* ============================================================================
   18) Service-Pakete-Tabs — Header und CTA-Block (alle 4 Panes)
   ----------------------------------------------------------------------------
   Einheitliche Pane-Struktur für Basis Sourcing, Premium Sourcing,
   Full Sourcing Import und Ihr China-Office. Jedes Pane bekommt eine eigene
   Headline mit Untertitel oben und einen CTA-Block am Ende, der zur
   Terminvereinbarung verlinkt. Preise und konkrete Stundenzahlen werden
   bewusst nicht auf der Webseite gezeigt.
   ============================================================================ */

/* Section-Padding fuer #service-pakete reduziert (Default des Parallax-
   Containers waeren 155px oben/unten — beim Anchor-Sprung von der Startseite
   her wirkte das so hoch, dass der CTA ausserhalb des Viewports lag).
   Auf 64px gestaucht (Session 22 Teil 7), damit der Pane mit Header + Bild
   + Inhalt + CTA auf typischen Desktop-Viewports (≥1200 px Display) komplett
   sichtbar ist. */
#service-pakete .parallax-content.section-xl {
  padding-top: var(--space-12);
  padding-bottom: var(--space-12);
}

/* Anchor-Sprung-Puffer: Die Sticky-Navi (.rd-navbar fixed, 93 px hoch)
   wuerde sonst den oberen Rand jedes Anchor-Targets verdecken. Mit
   scroll-padding-top auf html landet jeder Anchor-Sprung 100 px unterhalb
   des Viewport-Tops, also knapp unter der Navi mit kleinem Atemraum.
   `scroll-behavior: auto` erzwingt einen instanten Sprung statt einer
   Smooth-Scroll-Animation — der User erwartet das klassische Anchor-
   Verhalten ohne sichtbares "Runterscrollen". (Session 22 Teil 8/9) */
html {
  scroll-padding-top: 100px;
  scroll-behavior: auto !important;
}
@media (max-width: 991.98px) {
  #service-pakete .parallax-content.section-xl {
    padding-top: var(--space-10);
    padding-bottom: var(--space-10);
  }
}

.paket-pane-header {
  margin: 0 0 var(--space-3);
  padding-bottom: var(--space-2);
  border-bottom: 1px solid var(--border-subtle);
}

/* Subtitle uebernimmt die Rolle der Pane-Headline. Tab-Buttons oben tragen
   den Paket-Namen, hier kommt der erklaerende Untertitel — groesser, blau,
   damit er als Sektions-Auftakt funktioniert. */
.paket-pane-subtitle {
  margin: 0;
  font-size: clamp(1.15rem, 1rem + 0.5vw, 1.5rem);
  font-weight: 600;
  color: var(--brand-primary);
  line-height: var(--leading-tight);
  letter-spacing: -0.005em;
}

.paket-pane-cta {
  margin-top: var(--space-4);
  padding: var(--space-3) var(--space-5);
  background: var(--surface-elevated);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-soft);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-5);
  flex-wrap: wrap;
}

.paket-pane-cta__text {
  margin: 0;
  flex: 1 1 320px;
  font-size: var(--fs-body);
  color: var(--text-primary);
  line-height: var(--leading-normal);
}

.paket-pane-cta__button {
  flex: 0 0 auto;
  margin-top: 0 !important;
  white-space: nowrap;
}

@media (max-width: 575.98px) {
  .paket-pane-cta {
    padding: var(--space-5) var(--space-5);
    flex-direction: column;
    align-items: stretch;
    text-align: center;
  }
  .paket-pane-cta__button {
    width: 100%;
  }
}

/* ============================================================================
   30) Trade-Hub-Sektion (Kundenbereich)
   ============================================================================
   Eigene Skin auf Basis der bestehenden .card-flip-Karten:
   - Vorderseite hat ein zentrales Icon (statt Video wie auf der Startseite)
   - Kompaktere min-height, weil ohne Video weniger Inhaltshoehe noetig ist
   - Eigene Hilfsklasse .tradehub-card legt sich ueber die Standard-Skin
   - Sicherheits-Trust-Block + FAQ-Block fuer die Detailseite
   ============================================================================ */

.tradehub-section {
  /* Default jetzt hellblauer Brand-Cyan-Gradient (identisch zur Startseiten-
     Service-Card-Sektion .bg-primary). Karten innen liefern den Kontrast in
     dunkelblau. */
  background:
    radial-gradient(circle at 8% 12%, color-mix(in oklab, white 18%, transparent) 0%, transparent 45%),
    radial-gradient(circle at 92% 88%, color-mix(in oklab, var(--brand-primary-dark) 22%, transparent) 0%, transparent 55%),
    linear-gradient(135deg, #068ed6 0%, #0a7ec0 100%);
  color: #fff;
  position: relative;
  overflow: hidden;
}

/* Light-Variant: heller Brand-Cyan-Hintergrund identisch zur Startseiten-
   Service-Card-Sektion (.bg-primary). Verwendet auf der Dienstleistungen-
   Teaser-Sektion, damit die dunkelblauen Karten genauso vor dem hellen
   Hintergrund stehen wie auf der Startseite. */
.tradehub-section--light {
  background:
    radial-gradient(circle at 8% 12%, color-mix(in oklab, white 18%, transparent) 0%, transparent 45%),
    radial-gradient(circle at 92% 88%, color-mix(in oklab, var(--brand-primary-dark) 22%, transparent) 0%, transparent 55%),
    linear-gradient(135deg, #068ed6 0%, #0a7ec0 100%);
}

.tradehub-section--light::before {
  display: none;
}

.tradehub-section--light .tradehub-section__lead {
  text-align: left;
  margin-left: 0;
  margin-right: 0;
  /* Abstand zur Headline-Linie vergroessern, Bottom-Margin entsprechend
     reduzieren, damit die Sektion insgesamt nicht hoeher wird. */
  margin-top: 1rem;
  margin-bottom: var(--space-7);
}

.tradehub-section--light .text-decorate {
  text-align: left;
}

.tradehub-section--light .tradehub-section__cta {
  justify-content: flex-start;
}

.tradehub-section--light .tradehub-section__included {
  margin-left: 0;
  margin-right: auto;
}

/* Glas-CTA-Bar fuer den Teaser: Inklusiv-Hinweis und Mehr-Erfahren-Button
   in einer Zeile, kompakt und modern. Auf Mobile vertikal gestapelt. */
.tradehub-cta-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1.25rem 2rem;
  padding: 1.2rem 1.6rem;
  margin-top: var(--space-9);
  background: rgba(255, 255, 255, 0.16);
  border: 1px solid rgba(255, 255, 255, 0.32);
  border-radius: 14px;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  box-shadow: 0 6px 24px rgba(13, 68, 122, 0.18);
}

.tradehub-cta-bar__check {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-size: 1rem;
  font-weight: 600;
  color: #fff;
  flex: 1 1 360px;
  line-height: 1.4;
}

.tradehub-cta-bar__check svg {
  width: 22px;
  height: 22px;
  stroke: var(--brand-amber, #d4a017);
  flex-shrink: 0;
  fill: none;
  stroke-width: 2.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.tradehub-cta-bar__button {
  flex: 0 0 auto;
  margin: 0 !important;
  white-space: nowrap;
}

/* Variante mit zwei Buttons rechts (z.B. CTA-Sektion am Ende). */
.tradehub-cta-bar__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  flex: 0 0 auto;
}
.tradehub-cta-bar__actions .button {
  margin: 0 !important;
  white-space: nowrap;
}

/* Sekundaerbutton "Zur Paketuebersicht" im Glas-Bar: profesioneller Look mit
   2 px Brand-Primary-Border, Pfeil-Icon, klarem Hover-Wechsel von weiss-auf-blau
   zu blau-auf-weiss + Pfeil wandert nach rechts. Override des generischen
   button-default-outline. */
.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary,
.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary:focus {
  background: #ffffff !important;
  color: var(--brand-primary, #13447a) !important;
  border: 2px solid var(--brand-primary, #13447a) !important;
  /* Pille-Form gleich wie der Primary-Button "Erstgespraech vereinbaren" */
  border-radius: 999px !important;
  box-shadow: 0 6px 18px rgba(13, 68, 122, 0.18);
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  padding-right: 1.6rem !important;
  padding-left: 1.6rem !important;
  font-weight: 700;
  letter-spacing: 0.01em;
  transition: background 0.3s cubic-bezier(0.22, 1, 0.36, 1),
              color 0.3s cubic-bezier(0.22, 1, 0.36, 1),
              border-color 0.3s cubic-bezier(0.22, 1, 0.36, 1),
              box-shadow 0.3s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}

.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary .tradehub-cta-secondary__arrow {
  display: inline-block;
  font-size: 1.05em;
  font-weight: 700;
  transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}

.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary:hover,
.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary:active {
  background: var(--brand-primary, #13447a) !important;
  color: #ffffff !important;
  border-color: var(--brand-primary, #13447a) !important;
  box-shadow: 0 12px 32px rgba(13, 68, 122, 0.4),
              0 0 0 4px rgba(13, 68, 122, 0.12);
  transform: translateY(-3px);
}

.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary:hover .tradehub-cta-secondary__arrow,
.tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary:active .tradehub-cta-secondary__arrow {
  transform: translateX(5px);
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary,
  .tradehub-cta-bar__actions .button-default-outline.tradehub-cta-secondary .tradehub-cta-secondary__arrow {
    transition: none !important;
  }
}

/* Intro-Text im Sicherheits-Block: linksbuendig mit Atemluft zur Headline-
   Linie, gleicher Top-Abstand wie bei den anderen linksbuendigen Lead-Texten. */
.tradehub-trust__intro {
  max-width: 740px;
  margin: 1rem 0 var(--space-7) 0;
  text-align: left;
  color: var(--text-primary, #2c3e50);
  line-height: 1.6;
}

@media (max-width: 991.98px) {
  /* Tablet und Mobile: Inhalt vertikal gestapelt, Button volle Breite.
     Verhindert haessliches Wrap mit halbbreitem Button auf Tablet. */
  .tradehub-cta-bar {
    flex-direction: column;
    align-items: stretch;
    padding: 1.1rem 1.3rem;
  }
  .tradehub-cta-bar__check {
    flex: 1 1 auto;
  }
  .tradehub-cta-bar__button {
    width: 100%;
    text-align: center;
    /* Mobile: Label „Mehr über den Kundenbereich erfahren" ist 36 chars und sprengt
       den Button mit dem globalen white-space:nowrap. Auf Mobile umbrechen erlauben. */
    white-space: normal;
    line-height: 1.25;
    padding-top: 14px;
    padding-bottom: 14px;
  }
  .tradehub-cta-bar__actions {
    flex-direction: column;
    width: 100%;
  }
  .tradehub-cta-bar__actions .button {
    width: 100%;
    text-align: center;
    white-space: normal;
    line-height: 1.25;
  }
}

.tradehub-section .text-decorate,
.tradehub-section h2,
.tradehub-section h3 {
  color: #fff;
}

.tradehub-section .text-decorate::after {
  background: var(--brand-amber, #d4a017);
}

.tradehub-section__lead {
  max-width: 820px;
  margin: 0 auto var(--space-10) auto;
  font-size: 1.075rem;
  line-height: 1.65;
  text-align: center;
  color: rgba(255,255,255,0.9);
}

.tradehub-section__included {
  display: inline-flex;
  align-items: center;
  gap: 0.85rem;
  margin: var(--space-9) auto 0 auto;
  padding: 1.1rem 2rem;
  background: rgba(255,255,255,0.16);
  border: 2px solid rgba(255, 255, 255, 0.45);
  border-radius: 999px;
  font-size: 1.15rem;
  font-weight: 700;
  color: #fff;
  letter-spacing: 0.01em;
  box-shadow:
    0 8px 24px rgba(13, 68, 122, 0.25),
    inset 0 1px 0 rgba(255, 255, 255, 0.25);
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}

.tradehub-section__included svg {
  width: 24px;
  height: 24px;
  stroke: var(--brand-amber, #d4a017);
  stroke-width: 3;
  flex-shrink: 0;
}

.tradehub-section__cta {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1rem;
  margin-top: var(--space-9);
}

/* Card-Skin fuer Trade-Hub: kompakter, Icon-zentriert, ohne Video.
   Hintergrund-Override entfernt: nutzt jetzt Standard --brand-blue (#064a8b)
   aus dem allgemeinen .card-flip-face--front-Block, identisch zur Startseite. */
.thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
  min-height: 560px;
}

/* Detail-Seite (#tradehub-cards) hat zentrierte Titles + zentrierte Mockups.
   Teaser-Sektion auf Dienstleistungen.html nutzt dieselben .tradehub-card-Klassen,
   soll aber linksbuendig bleiben — daher alle "centered + kompakt"-Overrides auf
   #tradehub-cards beschraenken. */
#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-face--front {
  align-items: center;
  text-align: center;
}

#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-face--front .thumbnail-title-wrap {
  width: 100%;
  /* Override des globalen 9em-Title-Pads: bei den 6 Cluster-Karten reichen 4em
     (~64 px) fuer max. zweizeilige Titel — keine kuenstliche Hoehen-Vorhaltung. */
  min-height: 4em;
}

#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-face--front .thumbnail-title {
  text-align: center;
  font-size: 1.25rem;
  line-height: 1.3;
  /* Akzentlinie naeher an den Text ruecken: 30 px Default war zu viel
     Leerraum zwischen Headline und Linie. */
  padding-bottom: 10px;
  min-height: 0;
}

/* Akzentlinie auf Detail-Seite linksbuendig (Standard fuer thumbnail4-Karten ab >=992 px),
   aber dezenter (96 x 3 px statt der 250 x 4 px Default-Linie). */
#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-title::before {
  left: 0;
  transform: translateX(0);
  max-width: 96px;
  height: 3px;
}

/* Teaser auf Dienstleistungen.html: kraeftige Headline (1.2rem) auf den schmalen
   col-lg-3-Karten — bei dieser Schriftgroesse wird jeder der vier Titles zwingend
   2-zeilig (auch der kuerzeste „Mobil, mehrsprachig, sicher"), sodass alle 4
   Headlines visuell auf gleicher Hoehe stehen. Akzentlinie linksbuendig 96 px wie
   auf der Detail-Seite. */
#tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-title {
  /* KEINE automatische Silbentrennung (16.09.2026). Vorher stand hier
     hyphens:auto, was in den schmalen Karten „AUF-TRAG“ und „DIGI-TAL“
     ergab. Zweizeilig ist erwuenscht, ein mitten im Wort getrenntes Wort
     nicht. overflow-wrap bleibt als Notnagel gegen ein Ueberlaufen stehen,
     greift bei den heutigen vier Titeln aber nachweislich nie. */
  font-size: 1.2rem;
  line-height: 1.3;
  padding-bottom: 10px;
  min-height: 0;
  word-break: normal;
  overflow-wrap: break-word;
  hyphens: none;
  -webkit-hyphens: none;
}

/* Nur im Vier-Spalten-Bereich schrumpft die Headline mit. Gemessen am
   16.09.2026: bei 992 px Fensterbreite ist der Titelkasten nur 171 px breit,
   die laengste Zweizeilen-Variante („Mobil, mehrsprachig,“) braucht bei voller
   1.2rem aber 222 px - ohne Verkleinerung waeren es drei Zeilen. 1.4vw ergibt
   bei 992 px rund 13.9 px (Bedarf 161 px, Kasten 171 px) und erreicht ab etwa
   1371 px wieder die vollen 1.2rem. Unterhalb 992 px greift die Regel bewusst
   NICHT: dort sind die Karten breiter (287 px bei 768 px Fenster) und die
   volle Groesse passt ohnehin. */
@media (min-width: 992px) {
  #tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-title {
    font-size: clamp(0.85rem, 1.4vw, 1.2rem);
  }
}

#tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-title::before {
  left: 0;
  transform: translateX(0);
  max-width: 96px;
  height: 3px;
}

/* title-wrap auf 5em — reicht fuer 2-zeilige 1.2rem-Titles (~62 px Inhalt + 10 px
   padding-bottom). Alle 4 Karten haben dadurch identische Title-Block-Hoehe. */
#tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-title-wrap {
  min-height: 5em;
}

/* Icon-Belebung auf den 4 Teaser-Karten: das Icon atmet dezent (scale 1 → 1.06) und
   bekommt einen sanft pulsierenden Gold-Glow-Halo. Auf Hover skaliert das Icon zusaetzlich
   leicht und der Halo wird intensiver. Verleiht den 4 Karten Lebendigkeit, ohne
   aufdringlich zu wirken. */
#tradehub-teaser .tradehub-card-icon {
  transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

#tradehub-teaser .tradehub-card-icon svg {
  animation: tradehub-icon-breathe 4.2s ease-in-out infinite;
  transform-origin: center;
  transition: filter 0.4s ease, transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

@keyframes tradehub-icon-breathe {
  0%, 100% {
    transform: scale(1);
    filter: drop-shadow(0 4px 16px rgba(212, 160, 23, 0.25));
  }
  50% {
    transform: scale(1.06);
    filter: drop-shadow(0 6px 22px rgba(212, 160, 23, 0.45));
  }
}

#tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card:hover .tradehub-card-icon {
  transform: translateY(-3px);
}

#tradehub-teaser .thumbnail.thumbnail4.card-flip.tradehub-card:hover .tradehub-card-icon svg {
  transform: scale(1.12);
  filter: drop-shadow(0 8px 26px rgba(212, 160, 23, 0.55));
}

/* Stagger der Icon-Atmungs-Phase, damit nicht alle 4 Karten synchron pulsen */
#tradehub-teaser .col-lg-3:nth-child(1) .tradehub-card-icon svg { animation-delay: 0s; }
#tradehub-teaser .col-lg-3:nth-child(2) .tradehub-card-icon svg { animation-delay: 0.5s; }
#tradehub-teaser .col-lg-3:nth-child(3) .tradehub-card-icon svg { animation-delay: 1s; }
#tradehub-teaser .col-lg-3:nth-child(4) .tradehub-card-icon svg { animation-delay: 1.5s; }

@media (prefers-reduced-motion: reduce) {
  #tradehub-teaser .tradehub-card-icon svg { animation: none !important; }
}

.tradehub-card-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  margin: 1.25rem 0 1.5rem 0;
}

.tradehub-card-icon svg {
  width: 88px;
  height: 88px;
  stroke: var(--brand-amber, #d4a017);
  stroke-width: 1.5;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
  filter: drop-shadow(0 4px 16px rgba(212,160,23,0.25));
}

.thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-bullets {
  width: 100%;
  text-align: left;
  /* flex-grow:1 (Default) bleibt auf dem Teaser, sodass die Buttons dort unten ankleben.
     Auf der Detail-Seite (#tradehub-cards) wird flex-grow:0 erzwungen, damit der
     "Mehr erfahren"-Button mit seinem expliziten margin-top sauber unter den Bullets sitzt. */
  flex-grow: 1;
}

#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-bullets {
  flex-grow: 0;
}

.thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-bullets ul {
  list-style: none;
  padding: 0;
  margin: 0 0 0.5rem 0;
}

.thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-bullets li {
  position: relative;
  padding-left: 1.5rem;
  margin-bottom: 0.3rem;
  font-size: 0.92rem;
  line-height: 1.4;
  color: rgba(255,255,255,0.92);
}

.thumbnail.thumbnail4.card-flip.tradehub-card .thumbnail-bullets li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55rem;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--brand-amber, #d4a017);
}

/* 4-Spalter (Teaser auf Dienstleistungen) und 3-Spalter (Detail) Hoehen-Anpassung */
@media (min-width: 992px) {
  .col-lg-3 .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
    min-height: 600px;
  }
  .col-lg-4 .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
    min-height: 580px;
  }
}

/* Sicherheits-Trust-Block (Detailseite) */
.tradehub-trust {
  background: #f6f9fc;
  position: relative;
}

.tradehub-trust__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 1.25rem;
  margin-top: var(--space-8);
}

.tradehub-trust__item {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  padding: 1.1rem 1.2rem;
  background: #fff;
  border: 1px solid rgba(13,68,122,0.12);
  border-radius: 10px;
  box-shadow: 0 4px 18px rgba(13,68,122,0.06);
  min-width: 0;
}

/* Text-Wrapper neben dem Icon: muss min-width: 0 bekommen, damit langer Text
   nicht ueber das Item-Limit hinausschreibt (sonst flex-default ist content). */
.tradehub-trust__item > div:not(.tradehub-trust__icon) {
  min-width: 0;
  flex: 1 1 0;
  word-break: break-word;
  overflow-wrap: anywhere;
}

.tradehub-trust__icon {
  flex: 0 0 auto;
  width: 38px;
  height: 38px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(13,68,122,0.08);
  border-radius: 8px;
}

.tradehub-trust__icon svg {
  width: 22px;
  height: 22px;
  stroke: var(--brand-primary, #13447a);
  stroke-width: 2;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.tradehub-trust__title {
  display: block;
  font-size: 1rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
  margin-bottom: 0.2rem;
}

.tradehub-trust__desc {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--text-primary, #2c3e50);
  margin: 0;
}

/* FAQ-Block (Detailseite) */
.tradehub-faq {
  margin: var(--space-9) 0 0 0;
  text-align: left;
  /* 2-Spalten-Grid: 3 Fragen links, 3 rechts. Auf Mobile auf 1 Spalte. */
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.85rem 1.25rem;
  align-items: start;
}

.tradehub-faq__item {
  text-align: left;
  margin-bottom: 0;
}

@media (max-width: 767.98px) {
  .tradehub-faq {
    grid-template-columns: 1fr;
  }
}

.tradehub-faq__item {
  background: #fff;
  border: 1px solid rgba(13,68,122,0.14);
  border-radius: 10px;
  margin-bottom: 0.85rem;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(13,68,122,0.05);
}

.tradehub-faq__item summary {
  list-style: none;
  cursor: pointer;
  padding: 1.1rem 1.4rem;
  font-weight: 700;
  font-size: 1.025rem;
  color: var(--brand-primary, #13447a);
  position: relative;
  padding-right: 3rem;
  user-select: none;
  text-align: left;
}

.tradehub-faq__answer {
  text-align: left;
}

.tradehub-faq__item summary::-webkit-details-marker {
  display: none;
}

.tradehub-faq__item summary::after {
  content: "+";
  position: absolute;
  right: 1.4rem;
  top: 50%;
  transform: translateY(-50%);
  font-size: 1.6rem;
  font-weight: 400;
  color: var(--brand-amber, #d4a017);
  transition: transform 0.25s ease;
  line-height: 1;
}

.tradehub-faq__item[open] summary::after {
  content: "−";
}

.tradehub-faq__answer {
  padding: 0 1.4rem 1.2rem 1.4rem;
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--text-primary, #2c3e50);
}

.tradehub-faq__answer p {
  margin: 0 0 0.65rem 0;
}

.tradehub-faq__answer p:last-child {
  margin-bottom: 0;
}

/* Stats-Bar im Hero (drei Kennzahlen unter der Headline) */
.tradehub-hero {
  /* Hellblauer Hero-Hintergrund identisch zur Service-Card-Sektion auf der
     Startseite und zur Trade-Hub-Teaser-Sektion. */
  background:
    radial-gradient(circle at 8% 12%, color-mix(in oklab, white 18%, transparent) 0%, transparent 45%),
    radial-gradient(circle at 92% 88%, color-mix(in oklab, var(--brand-primary-dark) 22%, transparent) 0%, transparent 55%),
    linear-gradient(135deg, #068ed6 0%, #0a7ec0 100%);
  color: #fff;
  /* Top-Padding deutlich groesser als Bottom, damit die Headline genug Atemluft
     unter dem Header bekommt und nicht angeschnitten wirkt. */
  padding-top: clamp(5rem, 9vw, 7rem);
  padding-bottom: clamp(2.5rem, 5vw, 4rem);
  position: relative;
  overflow: visible;
}

/* Hero zweispaltig: links Text, rechts Browser-Mockup mit Trade-Hub-Logo
   und reproduzierter Dashboard-Andeutung (kein echter Screenshot).
   Volle .container-Breite, damit Hero exakt so breit ist wie alle anderen
   Sektionen der Webseite (kein eigener max-width-Constraint). */
.tradehub-hero__inner {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: 3rem;
  width: 100%;
}

.tradehub-hero__text {
  flex: 1 1 50%;
  min-width: 0;
}

.tradehub-hero__visual {
  flex: 1 1 50%;
  min-width: 0;
  max-width: 560px;
  margin-top: 1rem;
}

.tradehub-hero h1 {
  color: #fff;
  font-size: clamp(2rem, 4vw, 3rem);
  margin-bottom: 0.75rem;
  font-weight: 800;
}

.tradehub-hero__subline {
  font-size: 1.15rem;
  color: rgba(255,255,255,0.88);
  line-height: 1.55;
  margin-bottom: var(--space-8);
}

.tradehub-hero__stats {
  /* Grid-Layout: Stat 1 + 2 in der ersten Zeile linksbuendig, Stat 3
     waehnt sich in der zweiten Zeile ueber beide Spalten und steht zentriert. */
  display: grid;
  grid-template-columns: repeat(2, auto);
  justify-content: start;
  gap: 1.4rem 2rem;
  margin-top: var(--space-7);
  padding: 1.4rem 0 0;
  border-top: 1px solid rgba(255,255,255,0.18);
}

.tradehub-hero__stat:nth-child(3) {
  grid-column: 1 / -1;
  justify-self: center;
  align-items: center;
}

.tradehub-hero__stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 140px;
}

.tradehub-hero__stat-value {
  font-size: 1.85rem;
  font-weight: 800;
  color: var(--brand-amber, #d4a017);
  line-height: 1;
  margin-bottom: 0.35rem;
}

.tradehub-hero__stat-label {
  font-size: 0.88rem;
  color: rgba(255,255,255,0.85);
  text-align: center;
  line-height: 1.35;
}

@media (max-width: 991.98px) {
  /* Tablet und Mobile: Hero stapelt sich, Mockup unter dem Text */
  .tradehub-hero__inner {
    flex-direction: column;
    gap: 2.5rem;
  }
  .tradehub-hero__text,
  .tradehub-hero__visual {
    flex: 1 1 auto;
    max-width: 100%;
    width: 100%;
  }
  .tradehub-hero__visual {
    max-width: 540px;
    margin: 0 auto;
  }
}

@media (max-width: 767.98px) {
  /* Mobile: clamp-Padding bleibt aktiv (asymmetrisch top>bottom).
     Hier nur Stats-Gap kompakter, Stat-Wert kleiner. */
  .tradehub-hero__stats {
    gap: 1.5rem;
  }
  .tradehub-hero__stat-value {
    font-size: 1.5rem;
  }
}

/* ============================================================================
   31) Trade-Hub-Mockup im Hero (Browser-Frame mit Dashboard-Andeutung)
   ============================================================================
   Reproduzierter Browser-Look mit Chrome-Bar, dunklem Trade-Hub-Header,
   KPI-Karten und Auftragsliste. Kein echter Screenshot — alles HTML/CSS,
   damit das Visual ohne Pflege immer aktuell bleibt und keine internen
   Daten preisgibt. Leichter 3D-Tilt fuer raeumliche Tiefe.
   ============================================================================ */

.tradehub-mockup {
  background: #ffffff;
  border-radius: 12px;
  /* Realistische Tiefe + Glassmorphism-Innenrand (Session 23 Polish 2026-05-09) */
  box-shadow:
    0 25px 50px -12px rgba(0, 0, 0, 0.4),
    inset 0 0 0 1px rgba(255, 255, 255, 0.5);
  overflow: hidden;
  max-height: 90%;
  transform: perspective(1500px) rotateY(-4deg) rotateX(2deg);
  transform-origin: center;
  transition: transform 0.6s ease;
}

.tradehub-mockup:hover {
  transform: perspective(1500px) rotateY(0deg) rotateX(0deg);
}

/* Echter Screenshot im Browser-Rahmen (statt gezeichnetem Dashboard) */
.tradehub-mockup__shot {
  display: block;
  line-height: 0;
  background: #ffffff;
}
.tradehub-mockup__shot-img {
  display: block;
  width: 100%;
  height: auto;
}

/* Browser-Chrome (Tab-Bar mit drei Dots und URL) */
.tradehub-mockup__chrome {
  background: #f0f2f5;
  border-bottom: 1px solid #e2e8f0;
  padding: 0.55rem 0.85rem;
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.tradehub-mockup__dot {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  flex-shrink: 0;
}
.tradehub-mockup__dot--red    { background: #ff5f57; }
.tradehub-mockup__dot--yellow { background: #febc2e; }
.tradehub-mockup__dot--green  { background: #28c840; }

.tradehub-mockup__url {
  flex: 1;
  margin-left: 0.5rem;
  background: #ffffff;
  border-radius: 6px;
  padding: 0.32rem 0.7rem;
  font-size: 0.72rem;
  color: #6b7280;
  border: 1px solid #e2e8f0;
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Dunkler Header mit Trade-Hub-Logo + User-Block */
.tradehub-mockup__topbar {
  background: linear-gradient(135deg, #0e2f56 0%, #064a8b 100%);
  padding: 0.85rem 1rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}

.tradehub-mockup__logo {
  height: 30px;
  width: auto;
  object-fit: contain;
  flex-shrink: 0;
}

.tradehub-mockup__user {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  color: rgba(255,255,255,0.92);
  font-size: 0.78rem;
}

.tradehub-mockup__user-name {
  font-weight: 600;
}

.tradehub-mockup__user-avatar {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--brand-amber, #d4a017);
  color: #1a1a1a;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 0.85rem;
}

/* Body mit hellgrauem Hintergrund */
.tradehub-mockup__body {
  padding: 1.05rem;
  background: #f8fafc;
}

.tradehub-mockup__kpis {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0.6rem;
  margin-bottom: 0.85rem;
}

.tradehub-mockup__kpi {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 0.7rem 0.7rem;
  display: flex;
  flex-direction: column;
  gap: 0.18rem;
  min-width: 0;
}

.tradehub-mockup__kpi-label {
  font-size: 0.62rem;
  color: #64748b;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tradehub-mockup__kpi-value {
  font-size: 1.55rem;
  font-weight: 800;
  color: var(--brand-primary, #13447a);
  line-height: 1;
}

.tradehub-mockup__kpi-trend {
  font-size: 0.6rem;
  color: #94a3b8;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tradehub-mockup__kpi-trend--up {
  color: #15a34a;
  font-weight: 600;
}

/* Liste mit Auftragsausschnitt */
.tradehub-mockup__list {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  overflow: hidden;
}

.tradehub-mockup__list-title {
  padding: 0.6rem 0.85rem;
  background: #f8fafc;
  border-bottom: 1px solid #e2e8f0;
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
}

.tradehub-mockup__list-item {
  display: flex;
  align-items: center;
  padding: 0.55rem 0.85rem;
  border-bottom: 1px solid #f1f5f9;
  font-size: 0.74rem;
  gap: 0.55rem;
}

.tradehub-mockup__list-item:last-child {
  border-bottom: none;
}

.tradehub-mockup__list-id {
  color: #64748b;
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: 0.68rem;
  flex-shrink: 0;
}

.tradehub-mockup__list-text {
  flex: 1;
  color: #1e293b;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}

.tradehub-mockup__list-status {
  font-size: 0.62rem;
  font-weight: 700;
  padding: 0.18rem 0.55rem;
  border-radius: 999px;
  flex-shrink: 0;
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

.tradehub-mockup__list-status--shipped {
  background: #dcfce7;
  color: #15803d;
}

.tradehub-mockup__list-status--inspection {
  background: #fef3c7;
  color: #b45309;
}

.tradehub-mockup__list-status--production {
  background: #dbeafe;
  color: #1d4ed8;
}

/* Mobile: Tilt aus, kompaktere Innenmasse */
@media (max-width: 991.98px) {
  .tradehub-mockup {
    transform: none;
  }
}

@media (max-width: 575.98px) {
  .tradehub-mockup__url {
    font-size: 0.62rem;
    padding: 0.25rem 0.45rem;
  }
  .tradehub-mockup__topbar {
    padding: 0.7rem 0.85rem;
  }
  .tradehub-mockup__user-name {
    display: none;
  }
  .tradehub-mockup__kpis {
    gap: 0.4rem;
  }
  .tradehub-mockup__kpi {
    padding: 0.55rem 0.55rem;
  }
  .tradehub-mockup__kpi-value {
    font-size: 1.25rem;
  }
  .tradehub-mockup__list-text {
    font-size: 0.7rem;
  }
}

/* Reduced motion: kein Tilt-Effekt */
@media (prefers-reduced-motion: reduce) {
  .tradehub-mockup,
  .tradehub-mockup:hover {
    transform: none;
    transition: none;
  }
}

/* ============================================================================
   32) Trade-Hub-Devices-Sektion (iPad + iPhone Mockup)
   ============================================================================
   Dedizierte Sektion mit Geraete-Komposition: iPad (Landscape) im Hintergrund,
   iPhone davor leicht ueberlappend. Beides als reine HTML/CSS-Frames mit
   reduzierter UI-Andeutung — verstaerkt die Botschaft "ueberall verfuegbar".
   ============================================================================ */

.tradehub-devices__lead {
  margin-top: 1rem;
  margin-bottom: var(--space-6);
  font-size: 1.05rem;
  line-height: 1.6;
  color: var(--text-primary, #2c3e50);
}

.tradehub-devices__points {
  list-style: none;
  padding: 0;
  margin: 0;
}

.tradehub-devices__points li {
  display: flex;
  align-items: flex-start;
  gap: 0.55rem;
  padding: 0.4rem 0;
  font-size: 0.98rem;
  color: var(--text-primary, #2c3e50);
  font-weight: 500;
}

.tradehub-devices__check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: rgba(212, 160, 23, 0.15);
  color: var(--brand-amber, #d4a017);
  font-weight: 700;
  font-size: 0.85rem;
  line-height: 1;
}

/* Stage-Container: relativer Wrapper, in dem iPad und iPhone positioniert sind.
   Hoehe gross genug fuer das hohe iPhone (aspect 9/19.5). */
.tradehub-devices__stage {
  position: relative;
  height: 520px;
  margin-top: 1rem;
}

/* iPad-Frame (Landscape, aspect-ratio 4/3, links zurueckgesetzt im Hintergrund).
   Bezel 12px, radius 24px, KEINE Notch, Frontkamera als 4px Punkt mittig oben. */
.tradehub-device--ipad {
  position: absolute;
  top: 20px;
  left: 0;
  width: min(510px, 100%);
  aspect-ratio: 4 / 3;
  background: #1a1a1a;
  border-radius: 24px;
  padding: 12px;
  box-shadow:
    0 30px 60px -15px rgba(0, 0, 0, 0.5),
    inset 0 0 0 1.5px rgba(255, 255, 255, 0.06);
  transform: rotate(-3deg);
  transform-origin: center;
  transition: transform 0.6s ease;
  z-index: 1;
}

.tradehub-device--ipad:hover {
  transform: rotate(0deg);
}

/* Frontkamera-Punkt in der oberen Bezel (statt Notch) */
.tradehub-device--ipad::before {
  content: "";
  position: absolute;
  top: 5px;
  left: 50%;
  transform: translateX(-50%);
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #2a2a2a;
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
  z-index: 2;
}

/* iPhone-Frame (Portrait, aspect-ratio 9/19.5, vorne rechts ueberlappend).
   Bezel 8px, radius aussen 44px, innen 36px, Dynamic Island 90x24 px. */
.tradehub-device--iphone {
  position: absolute;
  bottom: 0;
  right: 0;
  width: 220px;
  aspect-ratio: 9 / 19.5;
  background: #1a1a1a;
  border-radius: 44px;
  padding: 8px;
  box-shadow:
    0 30px 60px -15px rgba(0, 0, 0, 0.5),
    inset 0 0 0 1.5px rgba(255, 255, 255, 0.06);
  transform: rotate(4deg);
  transform-origin: center;
  transition: transform 0.6s ease;
  z-index: 2;
}

.tradehub-device--iphone:hover {
  transform: rotate(0deg);
}

/* Dynamic Island statt klassischer Notch */
.tradehub-device--iphone .tradehub-device__notch {
  position: absolute;
  top: 12px;
  left: 50%;
  transform: translateX(-50%);
  width: 90px;
  height: 24px;
  background: #1a1a1a;
  border-radius: 20px;
  z-index: 3;
}

/* Bildschirme */
.tradehub-device__screen {
  background: #ffffff;
  border-radius: 14px;
  overflow: hidden;
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
}

.tradehub-device--iphone .tradehub-device__screen {
  border-radius: 36px;
  padding-top: 30px; /* knapp unter der Dynamic Island, wie auf echtem iPhone */
}

.tradehub-device__topbar {
  background: linear-gradient(135deg, #0e2f56 0%, #064a8b 100%);
  padding: 10px 14px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.tradehub-device__topbar--phone {
  padding: 6px 8px;
}

/* Live-Indikator im iPad-Topbar: pulsierender gruener Dot rechts.
   Visuelles Signal "App ist live", wirkt zusammen mit der KPI-Animation. */
.tradehub-device__live {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-left: auto;
  font-size: 9px;
  color: rgba(255, 255, 255, 0.92);
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.tradehub-device__live-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #22c55e;
  position: relative;
  animation: tradehub-live-pulse 2s ease-in-out infinite;
}

@keyframes tradehub-live-pulse {
  0%   { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.65); }
  70%  { box-shadow: 0 0 0 6px rgba(34, 197, 94, 0); }
  100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-device__live-dot {
    animation: none;
  }
}

.tradehub-device__logo {
  height: 22px;
  width: auto;
  object-fit: contain;
}

.tradehub-device--iphone .tradehub-device__logo {
  height: 16px;
}

.tradehub-device__body {
  padding: 14px;
  background: #f8fafc;
  flex: 1 1 auto;
}

.tradehub-device--iphone .tradehub-device__body {
  padding: 10px 8px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* Multi-View Body: enthaelt mehrere absolut positionierte App-Views,
   die per JS zyklisch wechseln. Crossfade + Slide-In von rechts. */
.tradehub-device__body--multi {
  position: relative;
  padding: 0;
  overflow: hidden;
}

.tradehub-device--iphone .tradehub-device__body--multi {
  display: block;
  flex-direction: initial;
  gap: 0;
}

.tradehub-device__view {
  position: absolute;
  inset: 0;
  padding: 12px 14px;
  background: #f8fafc;
  opacity: 0;
  transform: translateX(20px);
  transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  pointer-events: none;
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow: hidden;
}

.tradehub-device__view.is-active {
  opacity: 1;
  transform: translateX(0);
  pointer-events: auto;
}

/* Echte Screenshots in den Geraeterahmen (statt gezeichneter Views) */
.tradehub-device__view--shot {
  padding: 0;
  background: #ffffff;
}
.tradehub-device__shot-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top center;
}
/* Login-Screen ist eine zentrierte Karte -> mittig ausrichten statt oben anschneiden */
.tradehub-device__view[data-view="login"] .tradehub-device__shot-img {
  object-position: center center;
}

.tradehub-device--iphone .tradehub-device__view {
  padding: 8px 8px 10px 8px;
  gap: 5px;
}

/* Screenshot-Views randlos: die geraete-spezifischen Paddings (0,2,0) ueberstimmen */
.tradehub-device--ipad .tradehub-device__view--shot,
.tradehub-device--iphone .tradehub-device__view--shot {
  padding: 0;
  gap: 0;
  background: #ffffff;
}
.tradehub-device--ipad .tradehub-device__body--shots,
.tradehub-device--iphone .tradehub-device__body--shots {
  padding: 0;
  background: #ffffff;
}

.tradehub-device__view-title {
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
  letter-spacing: 0.02em;
  margin-bottom: 2px;
}

.tradehub-device__phone-section-title {
  font-size: 0.7rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 4px 4px 2px 4px;
}

/* === iPad View: Auftrag mit Tracking-Pipeline === */
.tradehub-device__order-meta {
  font-size: 0.68rem;
  color: #64748b;
  font-weight: 500;
  margin-bottom: 6px;
}

.tradehub-device__order-stages {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 4px;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 8px 10px;
  position: relative;
}

.tradehub-device__stage {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  position: relative;
  z-index: 1;
}

.tradehub-device__stage-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #e2e8f0;
  border: 2px solid #ffffff;
  box-shadow: 0 0 0 1px #e2e8f0;
}

.tradehub-device__stage--done .tradehub-device__stage-dot {
  background: #15803d;
  box-shadow: 0 0 0 1px #15803d;
}

.tradehub-device__stage--active .tradehub-device__stage-dot {
  background: var(--brand-amber, #d4a017);
  box-shadow: 0 0 0 1px var(--brand-amber, #d4a017), 0 0 0 4px rgba(212, 160, 23, 0.25);
  animation: tradehub-stage-pulse 1.6s ease-in-out infinite;
}

@keyframes tradehub-stage-pulse {
  0%, 100% { box-shadow: 0 0 0 1px var(--brand-amber, #d4a017), 0 0 0 0 rgba(212, 160, 23, 0.4); }
  50%      { box-shadow: 0 0 0 1px var(--brand-amber, #d4a017), 0 0 0 6px rgba(212, 160, 23, 0); }
}

.tradehub-device__stage-label {
  font-size: 0.58rem;
  color: #475569;
  font-weight: 600;
}

.tradehub-device__stage--active .tradehub-device__stage-label {
  color: var(--brand-primary, #13447a);
}

.tradehub-device__order-track {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 6px 10px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.tradehub-device__order-track-row {
  display: flex;
  justify-content: space-between;
  font-size: 0.66rem;
  color: #1e293b;
}

.tradehub-device__order-track-row > span:first-child {
  color: #64748b;
  font-weight: 500;
}

.tradehub-device__order-track-row > span:last-child {
  font-weight: 600;
}

/* === iPad View: QC-Bericht === */
.tradehub-device__qc-meta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.68rem;
  font-weight: 600;
  color: #475569;
  margin-bottom: 4px;
}

.tradehub-device__qc-aql {
  background: #dcfce7;
  color: #15803d;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 0.6rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.tradehub-device__qc-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  gap: 4px;
  flex: 1 1 auto;
}

.tradehub-device__qc-photo {
  /* Fallback-Gradient + SVG-Background (zyklisch zugewiesen unten) */
  background: linear-gradient(135deg, #c7d8e9 0%, #94aabd 100%);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  border-radius: 4px;
  position: relative;
  min-height: 0;
}

/* Vier SVG-Inspektionsfotos (Mikrochip, Karton+Etikett, LED-Streifen,
   Werkzeug), zyklisch ueber alle Tiles verteilt. */
.tradehub-device__qc-photo:nth-child(4n+1) { background-image: url('../images/tradehub_qc_1.svg'); }
.tradehub-device__qc-photo:nth-child(4n+2) { background-image: url('../images/tradehub_qc_2.svg'); }
.tradehub-device__qc-photo:nth-child(4n+3) { background-image: url('../images/tradehub_qc_3.svg'); }
.tradehub-device__qc-photo:nth-child(4n+4) { background-image: url('../images/tradehub_qc_4.svg'); }

.tradehub-device__qc-photo::after {
  content: "";
  position: absolute;
  top: 4px;
  right: 4px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #15803d;
  box-shadow: 0 0 0 1.5px rgba(255, 255, 255, 0.9);
}

/* === iPad View: Compliance-Dossier === */
.tradehub-device__compliance-product {
  font-size: 0.68rem;
  color: #64748b;
  font-weight: 500;
  margin-bottom: 4px;
}

.tradehub-device__compliance-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 8px;
}

.tradehub-device__compliance-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.7rem;
  padding: 3px 4px;
  border-bottom: 1px solid #f1f5f9;
}

.tradehub-device__compliance-row:last-child {
  border-bottom: none;
}

.tradehub-device__compliance-label {
  color: #1e293b;
  font-weight: 600;
}

.tradehub-device__compliance-status {
  background: #dcfce7;
  color: #15803d;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 0.6rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  white-space: nowrap;
}

/* === iPhone Views === */
.tradehub-device__phone-order-meta {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 8px 10px;
  font-size: 0.7rem;
  color: #1e293b;
  text-align: center;
  font-weight: 600;
  line-height: 1.35;
}

.tradehub-device__phone-stages {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.tradehub-device__phone-stage {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 5px;
  padding: 4px 8px;
  font-size: 0.6rem;
  font-weight: 700;
  color: #475569;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  text-align: center;
}

.tradehub-device__phone-stage--done {
  background: #dcfce7;
  border-color: #86efac;
  color: #15803d;
}

.tradehub-device__phone-stage--active {
  background: #fef3c7;
  border-color: #fcd34d;
  color: #b45309;
  animation: tradehub-phone-stage-pulse 1.5s ease-in-out infinite;
}

@keyframes tradehub-phone-stage-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(212, 160, 23, 0.3); }
  50%      { box-shadow: 0 0 0 4px rgba(212, 160, 23, 0); }
}

.tradehub-device__phone-eta {
  background: var(--brand-primary, #13447a);
  color: #ffffff;
  border-radius: 5px;
  padding: 6px 8px;
  font-size: 0.65rem;
  text-align: center;
  font-weight: 600;
  line-height: 1.35;
  margin-top: auto;
}

.tradehub-device__phone-qc-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4px;
  flex: 1 1 auto;
}

.tradehub-device__phone-qc-photo {
  background: linear-gradient(135deg, #c7d8e9 0%, #94aabd 100%);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  border-radius: 4px;
  min-height: 35px;
  position: relative;
}

/* Auf 4 Tiles im 2x2-Grid alle vier SVGs einmal zeigen */
.tradehub-device__phone-qc-photo:nth-child(1) { background-image: url('../images/tradehub_qc_1.svg'); }
.tradehub-device__phone-qc-photo:nth-child(2) { background-image: url('../images/tradehub_qc_2.svg'); }
.tradehub-device__phone-qc-photo:nth-child(3) { background-image: url('../images/tradehub_qc_3.svg'); }
.tradehub-device__phone-qc-photo:nth-child(4) { background-image: url('../images/tradehub_qc_4.svg'); }

.tradehub-device__phone-qc-photo::after {
  content: "";
  position: absolute;
  top: 3px;
  right: 3px;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: #15803d;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.9);
}

.tradehub-device__phone-qc-pass {
  background: #dcfce7;
  color: #15803d;
  border-radius: 5px;
  padding: 4px 8px;
  font-size: 0.6rem;
  text-align: center;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* iPad-Inhalt: Tile-Reihe + Bars */
.tradehub-device__row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  margin-bottom: 12px;
}

.tradehub-device__tile {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 10px 8px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: flex-start;
}

.tradehub-device__tile-num {
  font-size: 1.4rem;
  font-weight: 800;
  color: var(--brand-primary, #13447a);
  line-height: 1;
}

.tradehub-device__tile-label {
  font-size: 0.7rem;
  color: #64748b;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-weight: 600;
}

.tradehub-device__bars {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.tradehub-device__bar {
  height: 6px;
  background: linear-gradient(90deg, var(--brand-primary, #13447a) 0%, var(--brand-amber, #d4a017) 100%);
  border-radius: 3px;
  opacity: 0.7;
}

/* iPhone-Inhalt: kompakte Status-Liste */
.tradehub-device__phone-item {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 7px 9px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
}

.tradehub-device__phone-id {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: 0.65rem;
  color: #64748b;
  font-weight: 600;
}

.tradehub-device__phone-pill {
  font-size: 0.6rem;
  font-weight: 700;
  padding: 2px 7px;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

.tradehub-device__phone-pill--green  { background: #dcfce7; color: #15803d; }
.tradehub-device__phone-pill--yellow { background: #fef3c7; color: #b45309; }
.tradehub-device__phone-pill--blue   { background: #dbeafe; color: #1d4ed8; }

/* Tablet (768-991): Stage zentriert in der Spalte, Layout bleibt ueberlappend */
@media (max-width: 991.98px) {
  .tradehub-devices__stage {
    margin: var(--space-7) auto 0 auto;
    max-width: 600px;
  }
}

/* Mobile (<768): Geraete untereinander statt ueberlappend, Tilt aus */
@media (max-width: 767.98px) {
  .tradehub-devices__stage {
    height: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2rem;
    padding: 1rem 0;
  }
  .tradehub-device--ipad,
  .tradehub-device--iphone {
    position: relative;
    top: auto;
    left: auto;
    right: auto;
    bottom: auto;
    transform: none;
  }
  .tradehub-device--ipad:hover,
  .tradehub-device--iphone:hover {
    transform: none;
  }
  .tradehub-device--ipad {
    width: 100%;
    max-width: 480px;
  }
  .tradehub-device--iphone {
    width: 200px;
  }
}

@media (max-width: 575.98px) {
  .tradehub-device__tile-num {
    font-size: 1.2rem;
  }
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-device--ipad,
  .tradehub-device--ipad:hover,
  .tradehub-device--iphone,
  .tradehub-device--iphone:hover {
    transform: none;
    transition: none;
  }
}

/* ============================================================================
   33) Mini-Mockups in den Cluster-Karten (ersetzen die zentralen Icons)
   ============================================================================
   Pro Cluster eine UI-Vorschau:
     status     → kompakte Auftragsliste mit Status-Pills
     qc         → drei Foto-Kacheln mit Haekchen + AQL-Tag
     compliance → Compliance-Badges-Grid
     calc       → Mini-Tabelle mit Importkalkulation
     mobile     → kleines iPhone mit Logo + Sprachen-Pills
     workflow   → 4-Stufen-Pipeline mit Pfeilen
   Alle nutzen die gemeinsame Basis-Klasse `.tradehub-card-mockup` mit weiss-
   hellem Hintergrund — sie heben sich von der dunkelblauen Karten-Vorderseite ab.
   ============================================================================ */

.tradehub-card-mockup {
  width: 100%;
  height: 200px;
  background: #ffffff;
  border-radius: 8px;
  padding: 14px;
  margin: 0.85rem 0 0.85rem 0;
  box-shadow:
    0 6px 18px rgba(0, 0, 0, 0.22),
    inset 0 0 0 1px rgba(255, 255, 255, 0.5);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  font-size: 13px;
  line-height: 1.3;
  position: relative;
}

/* Hover-Effekt: Karte hebt sich leicht an, staerkerer Schatten.
   Ueberschreibt das generische `transform: none !important` aus dem
   Card-Flip-Pattern, weil tradehub-card spezifischer ist und ein
   subtiles Lift-Erlebnis auf Hover erzielt — Card-Flip-Rotation
   bleibt unbeeintraechtigt, da sie auf .card-flip-inner sitzt. */
.thumbnail.thumbnail4.card-flip.tradehub-card {
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.thumbnail.thumbnail4.card-flip.tradehub-card:hover {
  transform: translateY(-4px) !important;
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.22);
}

/* === Variant: status (Auftragsliste) === */
.tradehub-card-mockup--status {
  gap: 0.35rem;
  justify-content: center;
}

.tradehub-card-mockup__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.4rem 0.55rem;
  background: #f8fafc;
  border-radius: 6px;
  border: 1px solid #e2e8f0;
}

.tradehub-card-mockup__id {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: 0.72rem;
  color: #475569;
  font-weight: 600;
}

.tradehub-card-mockup__pill {
  font-size: 0.62rem;
  font-weight: 700;
  padding: 0.18rem 0.55rem;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.tradehub-card-mockup__pill--green  { background: #dcfce7; color: #15803d; }
.tradehub-card-mockup__pill--yellow { background: #fef3c7; color: #b45309; }
.tradehub-card-mockup__pill--blue   { background: #dbeafe; color: #1d4ed8; }

/* === Variant: qc (Foto-Galerie) === */
.tradehub-card-mockup--qc {
  flex-direction: column;
  gap: 0.55rem;
}

.tradehub-card-mockup--qc::before {
  /* Drei Foto-Boxen oben */
  content: none;
}

.tradehub-card-mockup--qc {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr auto;
  gap: 0.4rem;
  padding: 0.65rem 0.7rem;
}

.tradehub-card-mockup__photo {
  position: relative;
  background: linear-gradient(135deg, #c7d8e9 0%, #94aabd 100%);
  border-radius: 6px;
  min-height: 70px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.tradehub-card-mockup__photo-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.tradehub-card-mockup__photo::after {
  content: "";
  position: absolute;
  top: 8px;
  right: 8px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #15803d;
  box-shadow: 0 0 0 2px rgba(255,255,255,0.9);
}

.tradehub-card-mockup__photo-check {
  font-size: 1.4rem;
  color: #fff;
  font-weight: 700;
  text-shadow: 0 1px 4px rgba(0,0,0,0.55), 0 0 12px rgba(21, 128, 61, 0.6);
  position: relative;
  z-index: 2;
  background: rgba(21, 128, 61, 0.85);
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 6px rgba(0,0,0,0.25);
}

.tradehub-card-mockup__qc-meta {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 0.32rem 0.55rem;
  font-size: 0.7rem;
}

.tradehub-card-mockup__qc-aql {
  color: #475569;
  font-weight: 600;
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
}

.tradehub-card-mockup__qc-pass {
  background: #dcfce7;
  color: #15803d;
  font-weight: 700;
  padding: 0.15rem 0.55rem;
  border-radius: 999px;
  text-transform: uppercase;
  font-size: 0.6rem;
  letter-spacing: 0.04em;
}

/* === Variant: compliance (Badge-Grid) === */
.tradehub-card-mockup--compliance {
  flex-direction: row;
  flex-wrap: wrap;
  align-content: center;
  justify-content: center;
  gap: 0.35rem;
  padding: 0.7rem;
}

.tradehub-card-mockup__badge {
  background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
  border: 1px solid #cbd5e1;
  color: var(--brand-primary, #13447a);
  font-size: 0.7rem;
  font-weight: 800;
  padding: 0.3rem 0.55rem;
  border-radius: 6px;
  letter-spacing: 0.03em;
  white-space: nowrap;
}

/* === Variant: calc (Mini-Tabelle) === */
.tradehub-card-mockup--calc {
  gap: 0;
  justify-content: center;
}

.tradehub-card-mockup__calc-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0.32rem 0.5rem;
  font-size: 0.78rem;
  color: #1e293b;
  border-bottom: 1px solid #e2e8f0;
  font-variant-numeric: tabular-nums;
}

.tradehub-card-mockup__calc-row:last-child {
  border-bottom: none;
}

.tradehub-card-mockup__calc-row > span:first-child {
  color: #475569;
}

.tradehub-card-mockup__calc-row > span:last-child {
  font-weight: 600;
  color: #1e293b;
}

.tradehub-card-mockup__calc-row--total {
  background: #f8fafc;
  margin-top: 0.25rem;
  border-top: 2px solid var(--brand-amber, #d4a017);
  border-bottom: none;
  border-radius: 0 0 6px 6px;
  padding: 0.45rem 0.5rem;
}

.tradehub-card-mockup__calc-row--total > span {
  font-weight: 800 !important;
  color: var(--brand-primary, #13447a) !important;
  font-size: 0.85rem;
}

/* === Variant: mobile (iPad + iPhone, beide mit eigener Animation) === */
.tradehub-card-mockup--mobile {
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: 0.7rem;
  padding: 0.6rem;
}

/* Mini-iPad (Landscape) — links, dominiert die Mockup-Box */
.tradehub-card-mockup__tablet {
  position: relative;
  background: #1a1a1a;
  border-radius: 12px;
  padding: 8px 10px 14px;
  width: 200px;
  flex-shrink: 0;
  box-shadow: 0 6px 14px rgba(0,0,0,0.4);
}

.tradehub-card-mockup__tablet-screen {
  background: linear-gradient(180deg, #0e2f56 0%, #064a8b 100%);
  border-radius: 6px;
  padding: 10px 8px 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 130px;
}

.tradehub-card-mockup__tablet-logo {
  height: 16px;
  width: auto;
  object-fit: contain;
}

.tradehub-card-mockup__tablet-home {
  position: absolute;
  bottom: 4px;
  left: 50%;
  transform: translateX(-50%);
  width: 36px;
  height: 3px;
  background: rgba(255,255,255,0.35);
  border-radius: 2px;
}

/* Sync-Indikator oben rechts im Tablet-Screen — pulsiert dezent in Cyan, andere Animation
   als der "Live"-Indikator auf Karte 1 (Status) */
.tradehub-card-mockup__tablet-sync {
  position: absolute;
  top: 14px;
  right: 14px;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 0.55rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.85);
}

.tradehub-card-mockup__tablet-sync-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #38bdf8;
  box-shadow: 0 0 0 0 rgba(56,189,248,0.7);
  animation: tradehub-tablet-sync 2.8s ease-in-out infinite;
}

@keyframes tradehub-tablet-sync {
  0%, 100% { box-shadow: 0 0 0 0 rgba(56,189,248,0.7); transform: scale(1); }
  50% { box-shadow: 0 0 0 5px rgba(56,189,248,0); transform: scale(1.25); }
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-card-mockup__tablet-sync-dot { animation: none !important; }
}

/* Sprach-Pills im Tablet-Screen — jetzt horizontal statt vertikal */
.tradehub-card-mockup--mobile .tradehub-card-mockup__lang {
  flex-direction: row;
  gap: 0.3rem;
  align-items: center;
  justify-content: center;
}

.tradehub-card-mockup__phone {
  position: relative;
  background: #1a1a1a;
  border-radius: 14px;
  padding: 6px;
  width: 64px;
  flex-shrink: 0;
  box-shadow: 0 4px 12px rgba(0,0,0,0.35);
}

/* Im 3-Spalter-Layout zwischen 992 und 1199 px sind die Karten so schmal, dass
   iPad (200) + iPhone (64) + gap die Mockup-Box (~220 px Inhalt) sprengen.
   Mockup-Box-Padding zusaetzlich reduzieren und beide Geraete proportional
   verkleinern, sodass alles sauber innerhalb passt. Ab 1200 px Standard-Layout. */
@media (min-width: 992px) and (max-width: 1199.98px) {
  .tradehub-card-mockup--mobile {
    gap: 0.3rem;
    padding: 0.4rem;
  }
  .tradehub-card-mockup__tablet {
    width: 150px;
    padding: 5px 7px 10px;
  }
  .tradehub-card-mockup__tablet-screen {
    min-height: 100px;
    padding: 7px 5px 5px;
    gap: 5px;
  }
  .tradehub-card-mockup__tablet-logo {
    height: 12px;
  }
  .tradehub-card-mockup__tablet-sync {
    top: 10px;
    right: 9px;
    font-size: 0.5rem;
    padding: 1px 6px;
  }
  .tradehub-card-mockup__tablet-sync-dot {
    width: 5px;
    height: 5px;
  }
  .tradehub-card-mockup__phone {
    width: 50px;
  }
  .tradehub-card-mockup--mobile .tradehub-card-mockup__lang-flag {
    padding: 0.16rem 0.34rem;
    font-size: 0.58rem;
  }
}

.tradehub-card-mockup__phone-notch {
  position: absolute;
  top: 6px;
  left: 50%;
  transform: translateX(-50%);
  width: 26px;
  height: 7px;
  background: #1a1a1a;
  border-radius: 0 0 4px 4px;
  z-index: 2;
}

.tradehub-card-mockup__phone-screen {
  background: linear-gradient(180deg, #0e2f56 0%, #064a8b 100%);
  border-radius: 9px;
  padding: 14px 4px 8px 4px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  min-height: 105px;
}

.tradehub-card-mockup__phone-logo {
  height: 14px;
  width: auto;
  object-fit: contain;
}

.tradehub-card-mockup__phone-lock {
  font-size: 1.1rem;
  margin-top: 4px;
}

.tradehub-card-mockup__phone-text {
  font-size: 0.5rem;
  color: rgba(255,255,255,0.85);
  font-weight: 600;
  text-align: center;
}

.tradehub-card-mockup__lang {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  align-items: stretch;
}

.tradehub-card-mockup__lang-flag {
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 0.22rem 0.5rem;
  font-size: 0.68rem;
  font-weight: 700;
  color: var(--brand-primary, #13447a);
  text-align: center;
  letter-spacing: 0.04em;
}

/* === Variant: workflow (4-Stage-Pipeline) === */
.tradehub-card-mockup--workflow {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 0.15rem;
  padding: 0.7rem 0.55rem;
}

.tradehub-card-mockup__step {
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 0.4rem 0.4rem;
  font-size: 0.66rem;
  font-weight: 700;
  color: #475569;
  text-align: center;
  flex: 1 1 0;
  white-space: nowrap;
  min-width: 0;
}

.tradehub-card-mockup__step--ok {
  background: #dcfce7;
  border-color: #86efac;
  color: #15803d;
}

.tradehub-card-mockup__arrow {
  color: var(--brand-amber, #d4a017);
  font-size: 1rem;
  font-weight: 700;
  flex-shrink: 0;
}

/* Card-Hoehe nur auf der Detail-Seite kompakt: blauer Leerraum unter den Bullets verschwindet,
   Trigger-Button sitzt mit ~20 px Abstand zur Bullet-Liste. Teaser auf Dienstleistungen behaelt
   die Default-Hoehen aus dem allgemeinen .tradehub-card-Block (560/580/600), sodass die Buttons
   dort weiterhin unten an der Karte ankleben (via flex-grow:1 auf den Bullets). */
#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
  min-height: 540px;
}

@media (min-width: 992px) {
  #tradehub-cards .col-lg-4 .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
    min-height: 520px;
  }
}

/* Auf Mobile (<576) sind die Karten col-xs-12 (volle Breite, ein Karten-Stack) und brauchen
   mehr Hoehe — die Titles mit 2-3 Zeilen plus Mockup (200) plus Bullets plus Button mit
   Atemraum brauchen ~540 px Inhalt. Bei den laengeren Titles (Live-Status / Compliance /
   Workflow) overflowte sonst der Trigger-Button um 21 px ueber die Karten-Unterkante. */
@media (max-width: 575.98px) {
  #tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-inner {
    min-height: 560px;
  }
}

/* Trigger-Button bekommt expliziten Abstand zur Bullet-Liste — `margin-top: auto` aus der
   generischen Card-Flip-Regel reicht hier nicht, weil die Bullets auf #tradehub-cards
   `flex-grow: 0` haben. Auf dem Teaser bleibt `margin-top: auto` (aus dem globalen
   thumbnail4.card-flip-Block) erhalten, sodass die Buttons dort unten an der Karte sitzen. */
#tradehub-cards .thumbnail.thumbnail4.card-flip.tradehub-card .card-flip-face--front .card-flip-trigger {
  margin-top: 1.25rem;
}

/* ============================================================================
   34) Trade-Hub-Section-Spacing + H2-Hierarchie + Akzentlinie (Polish v2)
   ============================================================================
   Kompakte Vereinheitlichung der Detail-Seite:
   - Einheitliches Section-Padding ueber alle Trade-Hub-Sektionen
   - H2-Schriftgroesse + letter-spacing analog Spec
   - Goldene Akzentlinie unter H2: 60x3 px in --wp-accent
   - Sanfte Gradient-Uebergaenge an den Sektion-Kanten
   ============================================================================ */

.tradehub-devices,
.tradehub-section,
.tradehub-trust,
#tradehub-faq {
  padding-block: var(--tradehub-section-pad);
}
/* HINWEIS: .tradehub-hero hat sein eigenes asymmetrisches padding (Top groesser als Bottom),
   damit der Header darueber Atmungsraum laesst. Nicht hier ueberschreiben. */

/* H2-Hierarchie fuer Trade-Hub-Sektionen */
.tradehub-hero h1,
.tradehub-devices h2.text-decorate,
.tradehub-section h2.text-decorate,
.tradehub-trust h2.text-decorate,
#tradehub-faq h2.text-decorate {
  letter-spacing: -0.02em;
}

.tradehub-devices h2.text-decorate,
.tradehub-section h2.text-decorate,
.tradehub-trust h2.text-decorate,
#tradehub-faq h2.text-decorate {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  font-weight: 700;
}

/* Akzentlinie unter Trade-Hub-Headlines: KEIN eigener Override mehr,
   sodass der globale Standard-Gradient (96 px, blue-to-accent) aus
   .text-decorate::before in §1 greift — identisch zur "Ein Login..."-
   Headline im Erklaerblock und zu allen anderen Sektionen der Webseite.
   Innerhalb von .context-dark wird automatisch der weisse Gradient genutzt. */

/* Sanfter Uebergang von hellblauer Sektion zu weisser Sektion */
.tradehub-hero + .section-lg.bg-default,
.tradehub-section + .section-lg.bg-default,
.tradehub-section + .tradehub-trust {
  background-image: linear-gradient(180deg, rgba(10, 126, 192, 0.05) 0%, transparent 80px), var(--bg-image-default, none);
}

/* Section-md fuer Devices-Sektion: gleiche Padding-Behandlung */
.section-md.tradehub-devices {
  padding-block: var(--tradehub-section-pad);
}

/* ============================================================================
   35) Live-Animationen in den Cluster-Karten (Session 24, 2026-05-09)
   ============================================================================
   Die Mini-Mockups in den 6 Cluster-Karten der Sektion #tradehub-cards
   bekommen Live-Animationen analog zum iPad/iPhone in der Devices-Sektion:
     1) Live-Status: Pulse-Indikator + Status-Pill-Cycle
     2) QC: gestaffelte Verifizierung der Foto-Boxen
     3) Compliance: gestaffelte Aktivierung der Badges mit Gold-Glow
     4) Calc: Zahlen zaehlen hoch + Tick-Updates
     5) Mobile: Sprach-Pill-Active-Cycle + Phone-Screen-Text-Cycle
     6) Workflow: Pipeline-Aktivierungs-Cycle mit Pfeil-Flow
   Bei prefers-reduced-motion: reduce wird kein Cycling durchgefuehrt,
   stattdessen wird der End-State statisch gezeigt.
   ============================================================================ */

/* === Karte 1: Live-Status === */
.tradehub-card-mockup__live {
  position: absolute;
  top: 9px;
  right: 10px;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 0.6rem;
  font-weight: 700;
  color: #15803d;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.tradehub-card-mockup__live::before {
  content: "";
  display: inline-block;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #15803d;
  box-shadow: 0 0 0 0 rgba(21, 128, 61, 0.7);
  animation: tradehub-pulse-live 2s ease-in-out infinite;
}

@keyframes tradehub-pulse-live {
  0%, 100% { box-shadow: 0 0 0 0 rgba(21, 128, 61, 0.55); }
  50% { box-shadow: 0 0 0 6px rgba(21, 128, 61, 0); }
}

.tradehub-card-mockup__pill {
  transition: background 0.35s ease, color 0.35s ease, transform 0.35s ease, opacity 0.35s ease;
}

.tradehub-card-mockup__pill.is-cycling {
  transform: scale(0.7);
  opacity: 0;
}

/* === Karte 2: QC Foto-Galerie === */
.tradehub-card-mockup__photo-check {
  transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.3s ease;
}

.tradehub-card-mockup__photo-check.is-pending {
  transform: scale(0);
  opacity: 0;
}

.tradehub-card-mockup__photo-check.is-popping {
  transform: scale(1);
  opacity: 1;
}

.tradehub-card-mockup__photo.is-pending::after {
  background: #cbd5e1;
  animation: none;
}

.tradehub-card-mockup__photo.is-verified::after {
  animation: tradehub-photo-pulse 1.4s ease-out;
}

@keyframes tradehub-photo-pulse {
  0% { box-shadow: 0 0 0 0 rgba(21, 128, 61, 0.6), 0 0 0 2px rgba(255,255,255,0.9); }
  100% { box-shadow: 0 0 0 12px rgba(21, 128, 61, 0), 0 0 0 2px rgba(255,255,255,0.9); }
}

.tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-aql,
.tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-pass {
  background: linear-gradient(90deg, #e2e8f0 0%, #f1f5f9 50%, #e2e8f0 100%);
  background-size: 200% 100%;
  color: transparent;
  animation: tradehub-skeleton-shimmer 1.4s linear infinite;
  border-radius: 999px;
}

@keyframes tradehub-skeleton-shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* === Karte 3: Compliance Badges === */
.tradehub-card-mockup__badge {
  transition: opacity 0.4s ease, filter 0.4s ease, color 0.4s ease, background 0.4s ease, box-shadow 0.4s ease;
}

.tradehub-card-mockup__badge.is-dim {
  opacity: 0.32;
  filter: grayscale(1);
}

.tradehub-card-mockup__badge.is-glow {
  box-shadow: 0 0 0 2px rgba(212, 160, 23, 0.55), 0 0 14px rgba(212, 160, 23, 0.7);
}

/* === Karte 4: Calc-Tabelle === */
.tradehub-card-mockup__calc-row > span:last-child {
  transition: color 0.35s ease, transform 0.35s ease;
  font-variant-numeric: tabular-nums;
}

.tradehub-card-mockup__calc-row.is-ticking > span:last-child {
  color: var(--brand-amber, #d4a017);
  transform: translateY(-2px);
}

.tradehub-card-mockup__calc-row--total.is-pulsing {
  animation: tradehub-total-pulse 0.8s ease-out;
}

@keyframes tradehub-total-pulse {
  0% { box-shadow: 0 0 0 0 rgba(212, 160, 23, 0); }
  35% { box-shadow: 0 0 0 4px rgba(212, 160, 23, 0.45); }
  100% { box-shadow: 0 0 0 0 rgba(212, 160, 23, 0); }
}

/* === Karte 5: Mobile/Sprach-Pills === */
.tradehub-card-mockup__lang-flag {
  transition: background 0.35s ease, color 0.35s ease, border-color 0.35s ease, transform 0.35s ease;
}

.tradehub-card-mockup__lang-flag.is-active {
  background: var(--brand-primary, #13447a);
  border-color: var(--brand-primary, #13447a);
  color: #fff;
  transform: scale(1.05);
}

.tradehub-card-mockup__phone-screen .tradehub-card-mockup__phone-text-cycle {
  transition: opacity 0.3s ease, transform 0.3s ease;
  display: block;
  width: 100%;
  text-align: center;
}

.tradehub-card-mockup__phone-screen .tradehub-card-mockup__phone-text-cycle.is-fading {
  opacity: 0;
  transform: translateY(-4px);
}

.tradehub-card-mockup__phone-lock {
  transition: transform 0.35s ease;
}

.tradehub-card-mockup__phone-lock.is-pulsing {
  transform: scale(1.18);
}

/* === Karte 6: Workflow-Pipeline === */
.tradehub-card-mockup__step {
  transition: background 0.35s ease, color 0.35s ease, border-color 0.35s ease, transform 0.35s ease, box-shadow 0.35s ease;
}

.tradehub-card-mockup__step.is-active {
  background: var(--brand-primary, #13447a);
  border-color: var(--brand-primary, #13447a);
  color: #fff;
  transform: scale(1.04);
}

.tradehub-card-mockup__step.is-done {
  background: #dcfce7;
  border-color: #86efac;
  color: #15803d;
  transform: scale(1);
}

.tradehub-card-mockup__step.is-final-pulse {
  box-shadow: 0 0 0 3px rgba(212, 160, 23, 0.55), 0 0 18px rgba(212, 160, 23, 0.55);
}

.tradehub-card-mockup__arrow {
  position: relative;
  overflow: hidden;
}

.tradehub-card-mockup__arrow.is-flowing {
  background: linear-gradient(90deg, transparent 0%, rgba(212, 160, 23, 0.35) 50%, transparent 100%);
  background-size: 220% 100%;
  background-position: 200% 0;
  animation: tradehub-arrow-flow 1.6s linear infinite;
  border-radius: 4px;
}

@keyframes tradehub-arrow-flow {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* === Reduced-motion-Guard: alle Cycling-Animationen aus, End-State sichtbar === */
@media (prefers-reduced-motion: reduce) {
  .tradehub-card-mockup__live::before,
  .tradehub-card-mockup__photo.is-verified::after,
  .tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-aql,
  .tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-pass,
  .tradehub-card-mockup__arrow.is-flowing,
  .tradehub-card-mockup__calc-row--total.is-pulsing {
    animation: none !important;
  }
}

/* ============================================================================
   36) Reveal-Animationen fuer Trade-Hub-Detailseite (Sicherheits-Block + FAQ + Lead)
   ============================================================================
   Trust-Items, FAQ-Items und der Section-Lead-Text faden gestaffelt ein, sobald
   die jeweilige Sektion im Viewport ist. Trigger: Klasse `is-revealed` auf der
   Parent-Sektion (kommt aus js/script.js IntersectionObserver). Default:
   opacity:0 + translateY(20px), Reveal: opacity:1 + translateY(0). Stagger ueber
   nth-child-Delays. Respektiert prefers-reduced-motion. */

.tradehub-trust__item,
#tradehub-faq .tradehub-faq__item {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
              transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Standalone FAQ-Seite (#faq-page): eigene Top-to-Bottom-Stagger-Animation, die
   erst nach Entfernen der wp-loading-Klasse anlaeuft. Memory
   feedback_reveal_after_wp_loading: andernfalls rennt die Animation im
   opacity:0-Body ab, und der User sieht beim Reveal nur einen statischen
   End-Zustand. Mit dem html:not(.wp-loading)-Gate startet sie exakt im Moment
   des Body-Reveals.
   Linear 80 ms-Stagger, von Item 1 bis Item 11, gesamt ca. 900 ms + 600 ms
   Animation = ~1.5 s bis alles steht. fill-mode: both haelt opacity:0 in der
   Delay-Phase. prefers-reduced-motion deaktiviert die Animation komplett. */
#faq-page .tradehub-faq__item {
  opacity: 0;
  transform: translateY(18px);
}
html:not(.wp-loading) #faq-page .tradehub-faq__item {
  animation: faq-page-fade-in 600ms cubic-bezier(0.22, 1, 0.36, 1) both;
}
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(1)  { animation-delay:  100ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(2)  { animation-delay:  180ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(3)  { animation-delay:  260ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(4)  { animation-delay:  340ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(5)  { animation-delay:  420ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(6)  { animation-delay:  500ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(7)  { animation-delay:  580ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(8)  { animation-delay:  660ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(9)  { animation-delay:  740ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(10) { animation-delay:  820ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(11) { animation-delay:  900ms; }
html:not(.wp-loading) #faq-page .tradehub-faq__item:nth-child(12) { animation-delay:  980ms; }

@keyframes faq-page-fade-in {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  html:not(.wp-loading) #faq-page .tradehub-faq__item {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* Smooth Open/Close-Animation auf <details>-Items via Web Animations API
   (js/faq-page-animation.js). overflow:hidden ist Pflicht, damit die
   height-Animation den Inhalt nicht ueber die Card-Border hinaus rendert,
   waehrend sie laeuft. Padding bleibt am Inhalt, die Animation steuert nur
   die Hoehe + Opazitaet — die Card-Border + Box-Shadow gehoeren zum Parent
   <details> und bleiben statisch.
   Greift sowohl auf die standalone FAQ-Seite (#faq-page) als auch auf den
   FAQ-Block am Ende von Trade-Hub.html (#tradehub-faq). */
#faq-page .tradehub-faq__item > .tradehub-faq__answer,
#tradehub-faq .tradehub-faq__item > .tradehub-faq__answer {
  overflow: hidden;
}

.tradehub-trust.is-revealed .tradehub-trust__item,
#tradehub-faq.is-revealed .tradehub-faq__item {
  opacity: 1;
  transform: translateY(0);
}

/* Section-Lead bleibt im Default sichtbar (das WOW.fadeInUp im Markup uebernimmt das
   Einfaden) — wir setzen ihn NICHT auf opacity:0, sonst verschwindet er, falls der
   IntersectionObserver-Reveal aus irgendeinem Grund nicht feuert. */

/* Trust-Items Stagger: 80 ms pro Tile, max 10 Items */
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(1)  { transition-delay:   0ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(2)  { transition-delay:  80ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(3)  { transition-delay: 160ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(4)  { transition-delay: 240ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(5)  { transition-delay: 320ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(6)  { transition-delay: 400ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(7)  { transition-delay: 480ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(8)  { transition-delay: 560ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(9)  { transition-delay: 640ms; }
.tradehub-trust.is-revealed .tradehub-trust__item:nth-child(10) { transition-delay: 720ms; }

/* FAQ-Items Stagger: links/rechts-Spalten staffeln, 100 ms-Steps */
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(1) { transition-delay:   0ms; }
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(2) { transition-delay:  80ms; }
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(3) { transition-delay: 160ms; }
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(4) { transition-delay: 240ms; }
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(5) { transition-delay: 320ms; }
#tradehub-faq.is-revealed .tradehub-faq__item:nth-child(6) { transition-delay: 400ms; }

/* Trade-Hub Hero-Reveal: Headline → Subline → Visual + 3 Stats, alles gestaffelt
   fade-up beim Page-Load. Statt Observer-getriggerter is-revealed-Klasse verwenden
   wir direkte CSS-`animation` mit fill:forwards — der Hero ist beim Page-Load
   sofort im Viewport, kein Scroll-Trigger noetig. Vorteil: kein Risiko, dass
   eine fehlgeschlagene Observer-Initialisierung den Inhalt unsichtbar laesst. */

@keyframes tradehub-hero-fade-up {
  from { opacity: 0; transform: translateY(28px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes tradehub-hero-fade-right {
  from { opacity: 0; transform: translateX(40px); }
  to   { opacity: 1; transform: translateX(0); }
}

.tradehub-hero h1,
.tradehub-hero__subline,
.tradehub-hero__stat {
  opacity: 0;
  animation: tradehub-hero-fade-up 800ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

.tradehub-hero__visual {
  opacity: 0;
  animation: tradehub-hero-fade-right 900ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
  animation-delay: 320ms;
}

/* Stagger: H1 → Subline +200ms → Stats gestaffelt 400/520/640ms */
.tradehub-hero h1                          { animation-delay:   0ms; }
.tradehub-hero__subline                    { animation-delay: 200ms; }
.tradehub-hero__stat:nth-child(1)          { animation-delay: 400ms; }
.tradehub-hero__stat:nth-child(2)          { animation-delay: 520ms; }
.tradehub-hero__stat:nth-child(3)          { animation-delay: 640ms; }

@media (prefers-reduced-motion: reduce) {
  .tradehub-hero h1,
  .tradehub-hero__subline,
  .tradehub-hero__stat,
  .tradehub-hero__visual {
    opacity: 1 !important;
    animation: none !important;
  }
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-trust__item,
  .tradehub-faq__item,
  .tradehub-section__lead {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* ============================================================================
   37) [REMOVED in v18] content-visibility: auto verursachte Layout-Reflows
   beim Scrollen, die mehr kosteten als sie sparten — TBT-Regression.
   38) [REMOVED in v18] animation-pauser.js + .is-animation-paused-State
   verursachten Style-Recalc-Storm bei jedem Scroll. Datei in /js/ liegt
   weiter, ist aber nicht mehr im Loader (revertierbar). */

/* ============================================================================
   39) CLS-Killer: tabular-nums auf allen Counter-Zahlen (Performance-Recovery v16)
   ============================================================================
   Counter-Animationen wie "0 → 6" oder "0 → 600" haben in Manrope mit
   proportional-figures unterschiedliche Glyphen-Breiten. Ergebnis: bei jedem
   Frame des Hochzaehlens shiften die umgebenden Elemente — Mobile-CLS bei 0,193.
   Mit `font-variant-numeric: tabular-nums` sind alle Ziffern gleich breit
   (Tabular-Lining), kein Layout-Shift mehr.
   ============================================================================ */
.hero-stat__value,
.tradehub-mockup__kpi-value,
.tradehub-device__tile-num,
.tradehub-card-mockup__calc-row > span:last-child,
[data-count-to],
.key-stats__num {
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

/* [REMOVED in v18] HubSpot-Chat-Mobile-Hide — User-Vorgabe: Chat bleibt auf
   Mobile aktiv. CLS-Beitrag wird stattdessen durch laengere Lazy-Loading-
   Verzoegerung in lazy-third-party.js minimiert (5 s Idle statt 2,5 s). */

/* ============================================================================
   40) Hover-Transitions per @media (hover: hover) klemmen (Performance v18)
   ============================================================================
   Lighthouse-Mobile listet 36 "nicht zusammensetzte Animationen" — alles
   Hover-Effekte mit border-color, color, box-shadow, letter-spacing-Transitions.
   Auf Touch-Devices gibt es keine Hover-Events; die Transitions feuern nie,
   verursachen aber trotzdem Style-Recalc-Kosten beim Initial-Paint, weil der
   Browser sie als "potenziell aktiv" einplant.
   Mit @media (hover: hover) werden die Transition-Properties NUR fuer Geraete
   aktiv, die echte Hover-Events haben (Desktop, iPad mit Maus). Touch-Mobile
   sieht/braucht sie sowieso nicht — kein Effekt-Verlust. */
@media (hover: none) {
  .button,
  .button-default-outline,
  .button-primary,
  .card-flip-trigger,
  .tradehub-cta-secondary,
  .footer-map-card,
  .trust-bar__badge,
  .thumbnail.thumbnail4.card-flip,
  .thumbnail.thumbnail4.card-flip.tradehub-card,
  .footer-compliance__item,
  .tradehub-trust__item,
  .tradehub-card-mockup__step,
  .tradehub-card-mockup__lang-flag,
  .tradehub-card-mockup__badge,
  .tradehub-card-mockup__pill,
  .tradehub-card-mockup__photo-check,
  .tradehub-card-mockup__photo,
  .tradehub-card-mockup__calc-row > span:last-child,
  .tradehub-card-mockup__phone-text-cycle,
  .tradehub-card-mockup__phone-lock,
  .tradehub-card-icon,
  .tradehub-card-icon svg,
  .hero-cta,
  .hero-cta--primary,
  .hero-cta--ghost {
    transition: none !important;
  }
}

/* ============================================================================
   41) will-change auf zentrale Animations-Targets (Performance v18)
   ============================================================================
   Promotet die Elemente zu einem eigenen Compositor-Layer. Browser kann
   transform/opacity-Aenderungen direkt auf der GPU ausfuehren, kein
   Style-Recalc auf dem Hauptthread. Sparsam einsetzen — jeder will-change-
   Layer kostet GPU-Memory. Nur auf Elemente, die wirklich kontinuierlich
   animiert werden. */
.card-flip-inner {
  will-change: transform;
}
.route-map__device-status-dot,
.tradehub-card-mockup__live::before {
  will-change: transform, opacity;
}

/* Verstaerkter prefers-reduced-motion-Reset: schwere Compositor-Animationen
   wie Skeleton-Shimmer (linear-gradient bewegt sich), Arrow-Flow und alle
   infinite-Pulses komplett aus. Die normalen, von Tier-2.1 pausierbaren
   Animationen waren bei reduced-motion teils nur "deaktiviert" aber nicht
   ausgeschaltet — hier ein klarer Sweep. */
@media (prefers-reduced-motion: reduce) {
  .tradehub-card-mockup__live::before,
  .tradehub-card-mockup__photo.is-verified::after,
  .tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-aql,
  .tradehub-card-mockup__qc-meta.is-skeleton .tradehub-card-mockup__qc-pass,
  .tradehub-card-mockup__arrow.is-flowing,
  .tradehub-card-mockup__calc-row--total.is-pulsing,
  .tradehub-card-mockup__tablet-sync-dot,
  .route-map__device-status-dot,
  .route-map .rm-halo,
  .route-map .rm-pin,
  #tradehub-teaser .tradehub-card-icon svg,
  .hero-cta--primary {
    animation: none !important;
  }
}

}
/* ==========================================================================
   Session 28 (2026-05-10): Trade-Hub Refinements
   ==========================================================================
   §42  Mockup-Trenner (order-track-row, qc-meta) — kleine Punkte zwischen
        Label und Wert, damit der Plain-Text-Stream lesbar bleibt
   §43  Vergleichs-Banner unter den 6 Cluster-Karten
   §44  Mini-Case-Zitat ueber dem CTA-Bereich am Ende
   ========================================================================== */

/* ---------- §42  Mockup-Trenner ---------- */
/* Specificity erhoeht (zwei .tradehub-Klassen) damit die Color nicht von der
   span:first-child / :last-child-Regel oben in der Datei ueberschrieben wird. */
.tradehub-device__order-track-row > span.tradehub-device__order-track-sep,
.tradehub-card-mockup__qc-meta > span.tradehub-card-mockup__qc-sep {
  color: #94a3b8 !important;
  font-weight: 600;
  flex: 0 0 auto;
  user-select: none;
}

.tradehub-card-mockup__qc-meta > span.tradehub-card-mockup__qc-sep {
  font-size: 0.75rem;
  margin: 0 0.25rem;
}

/* ---------- §43  Vergleichs-Banner ---------- */
.tradehub-vs-banner {
  background: linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);
  border-top: 1px solid #e2e8f0;
  border-bottom: 1px solid #e2e8f0;
  padding: clamp(28px, 4vw, 48px) 0;
  /* Reveal: initial unsichtbar, blendet beim Sichtbarwerden ein.
     Trigger: js/script.js setzt `.is-revealed` per IntersectionObserver. */
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}
.tradehub-vs-banner.is-revealed {
  opacity: 1;
  transform: translateY(0);
}

.tradehub-vs-banner__inner {
  max-width: 880px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  gap: clamp(12px, 2vw, 20px);
  text-align: left;
}

.tradehub-vs-banner__icon {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--brand-amber, #d4a017);
  color: #ffffff;
}

.tradehub-vs-banner__icon svg {
  width: 22px;
  height: 22px;
}

.tradehub-vs-banner__text {
  margin: 0;
  font-size: clamp(1rem, 1.1vw + 0.6rem, 1.18rem);
  line-height: 1.5;
  color: #1f2937;
  font-weight: 500;
}

@media (max-width: 575px) {
  .tradehub-vs-banner__inner {
    flex-direction: column;
    text-align: center;
    gap: 14px;
  }
}

/* ---------- §44  Mini-Case-Zitat ---------- */
.tradehub-quote {
  background: #ffffff;
  padding: clamp(48px, 6vw, 80px) 0 clamp(8px, 1.5vw, 24px);
}

.tradehub-quote__figure {
  max-width: 760px;
  margin: 0 auto;
  position: relative;
  text-align: center;
  padding: 0 clamp(20px, 3vw, 40px);
}

/* Reveal: drei Inner-Elemente faden gestaffelt ein, sobald der Quote-Block
   sichtbar wird (`.tradehub-quote.is-revealed` per IntersectionObserver). */
.tradehub-quote .tradehub-quote__mark,
.tradehub-quote .tradehub-quote__text,
.tradehub-quote .tradehub-quote__author {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}
.tradehub-quote.is-revealed .tradehub-quote__mark { transition-delay: 0ms; }
.tradehub-quote.is-revealed .tradehub-quote__text { transition-delay: 140ms; }
.tradehub-quote.is-revealed .tradehub-quote__author { transition-delay: 280ms; }
.tradehub-quote.is-revealed .tradehub-quote__mark,
.tradehub-quote.is-revealed .tradehub-quote__text,
.tradehub-quote.is-revealed .tradehub-quote__author {
  opacity: 1;
  transform: translateY(0);
}

.tradehub-quote__mark {
  display: block;
  font-family: Georgia, "Times New Roman", serif;
  font-size: clamp(64px, 7vw, 96px);
  line-height: 0.6;
  color: var(--brand-amber, #d4a017);
  margin-bottom: 12px;
  user-select: none;
}

.tradehub-quote__text {
  margin: 0 0 18px;
  font-size: clamp(1.25rem, 1.5vw + 0.6rem, 1.6rem);
  line-height: 1.45;
  color: #13447a;
  font-weight: 500;
  font-style: italic;
}

.tradehub-quote__author {
  font-size: 0.95rem;
  color: #64748b;
  font-weight: 500;
  letter-spacing: 0.02em;
}

/* ---------- §45  "Inklusive in jedem Service-Paket" Banner unter den 6 Karten ---------- */
.tradehub-section__included {
  /* Reveal: per JS revealSelectors getriggert. */
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}
.tradehub-section__included.is-revealed {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .tradehub-quote__mark { animation: none !important; }
  .tradehub-vs-banner,
  .tradehub-quote .tradehub-quote__mark,
  .tradehub-quote .tradehub-quote__text,
  .tradehub-quote .tradehub-quote__author,
  .tradehub-section__included {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* ===========================================================================
   Inline-Kontaktformular (.wpit-cnt-*) - ersetzt seit 2026-05-11 das
   HubSpot-Formular. Wird auf jeder Seite eingebunden, deshalb in refresh.css
   statt in einer eigenen CSS-Datei.
   =========================================================================== */
.wpit-cnt-form {
  --cnt-primary: #13447a;
  --cnt-amber: #d4a017;
  --cnt-border: #e2e6ec;
  --cnt-border-strong: #94a3b8;
  --cnt-text: #1f2937;
  --cnt-text-soft: #475569;
  --cnt-text-muted: #6b7280;
  --cnt-radius: 10px;
  --cnt-radius-sm: 8px;
  --cnt-ease: cubic-bezier(0.4, 0, 0.2, 1);
  position: relative;
  /* Rahmen entfernt (2026-06-26, analog Cover-Karten): kein Kasten/Rand/Schatten/
     warme Toenung/Glow mehr. Das Formular sitzt direkt auf der Seite und richtet
     sich (padding 0) linksbuendig unter der Ueberschrift aus. Die Felder haben
     eigene feine Rahmen, die genug Struktur geben. Gold-Pflichtstern bleibt. */
  background: transparent;
  padding: 0;
  font-family: Manrope, Arial, sans-serif;
  color: var(--cnt-text);
}
.wpit-cnt-form > * { position: relative; z-index: 1; }
@media (max-width: 575.98px) {
  .wpit-cnt-form { padding: 0; }
}

.wpit-cnt-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px 20px;
}
@media (max-width: 991.98px) {
  .wpit-cnt-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 575.98px) {
  .wpit-cnt-grid { grid-template-columns: 1fr; gap: 14px; }
}

.wpit-cnt-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.wpit-cnt-field--full { grid-column: 1 / -1; }

.wpit-cnt-field label {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--cnt-text-soft);
  letter-spacing: 0.1px;
}
.wpit-cnt-req {
  color: var(--cnt-amber);
  margin-left: 2px;
  font-weight: 700;
}

.wpit-cnt-field input[type="text"],
.wpit-cnt-field input[type="email"],
.wpit-cnt-field input[type="tel"],
.wpit-cnt-field textarea {
  width: 100%;
  padding: 12px 14px;
  border: 1.5px solid var(--cnt-border);
  border-radius: var(--cnt-radius-sm);
  background: #fff;
  color: var(--cnt-text);
  font-family: inherit;
  font-size: 15px;
  line-height: 1.5;
  outline: none;
  transition: border-color 180ms var(--cnt-ease), box-shadow 180ms var(--cnt-ease);
  -webkit-appearance: none;
  appearance: none;
  box-sizing: border-box;
}
.wpit-cnt-field textarea {
  resize: vertical;
  min-height: 120px;
  font-family: inherit;
}
@media (max-width: 575.98px) {
  .wpit-cnt-field input[type="text"],
  .wpit-cnt-field input[type="email"],
  .wpit-cnt-field input[type="tel"] {
    padding: 11px 12px;
    /* iOS Safari zoomt rein, wenn das Eingabe-Feld <16px Font-Size hat.
       Daher 16px auf Mobile - verhindert den ungewollten Zoom-In beim Fokus. */
    font-size: 16px;
  }
  .wpit-cnt-field textarea { min-height: 110px; font-size: 16px; }
  .wpit-cnt-field { gap: 5px; }
  .wpit-cnt-field label { font-size: 14px; }
}
.wpit-cnt-field input:hover,
.wpit-cnt-field textarea:hover { border-color: var(--cnt-border-strong); }
.wpit-cnt-field input:focus,
.wpit-cnt-field textarea:focus {
  border-color: var(--cnt-primary);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--cnt-primary) 18%, transparent);
}

.wpit-cnt-field.is-invalid input,
.wpit-cnt-field.is-invalid textarea {
  border-color: #dc2626;
  box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.12);
}
.wpit-cnt-err {
  display: none;
  font-size: 12.5px;
  color: #dc2626;
  margin-top: 2px;
}
.wpit-cnt-field.is-invalid .wpit-cnt-err { display: block; }

.wpit-cnt-hp {
  position: absolute !important;
  left: -10000px !important;
  width: 1px !important;
  height: 1px !important;
  overflow: hidden !important;
}

.wpit-cnt-consent {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  margin: 22px 0 18px;
  padding: 16px 18px;
  background: rgba(255, 255, 255, 0.7);
  border: 1px solid var(--cnt-border);
  border-radius: var(--cnt-radius-sm);
  font-size: 13px;
  line-height: 1.6;
  color: var(--cnt-text-soft);
  backdrop-filter: blur(2px);
}
.wpit-cnt-consent label {
  text-align: justify;
  hyphens: auto;
}
@media (max-width: 767.98px) {
  /* Blocksatz erzeugt auf schmalen Spalten haessliche Word-Gaps - links-buendig
     ist auf Mobile/Tablet die bessere Wahl. */
  .wpit-cnt-consent label { text-align: left; hyphens: auto; }
  .wpit-cnt-consent { padding: 14px 14px; font-size: 12.5px; }
}
.wpit-cnt-consent input[type="checkbox"] {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  margin-top: 2px;
  accent-color: var(--cnt-primary);
  cursor: pointer;
}
.wpit-cnt-consent label { cursor: pointer; }
.wpit-cnt-consent a { color: var(--cnt-primary); text-decoration: underline; }
.wpit-cnt-consent.is-invalid { border-color: #dc2626; background: #fef2f2; }

.wpit-cnt-actions {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}
.wpit-cnt-submit {
  display: inline-block;
  padding: 14px 32px;
  border-radius: 999px;
  border: 0;
  background: var(--cnt-primary);
  color: #fff;
  font-family: inherit;
  font-size: 15px;
  font-weight: 700;
  letter-spacing: 0.2px;
  cursor: pointer;
  box-shadow: 0 6px 16px rgba(19, 68, 122, 0.28);
  transition: background-color 180ms var(--cnt-ease), transform 180ms var(--cnt-ease), box-shadow 180ms var(--cnt-ease);
}
.wpit-cnt-submit:hover:not(:disabled) {
  background: #0f365f;
  transform: translateY(-1px);
  box-shadow: 0 8px 20px rgba(19, 68, 122, 0.32);
}
.wpit-cnt-submit:disabled { opacity: 0.6; cursor: not-allowed; }
@media (max-width: 575.98px) {
  .wpit-cnt-actions { justify-content: stretch; gap: 12px; flex-direction: column; }
  .wpit-cnt-submit { width: 100%; padding: 14px 24px; }
  .wpit-cnt-status { order: 2; text-align: center; width: 100%; }
}

.wpit-cnt-status {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  display: none;
}
.wpit-cnt-status.is-error { display: block; color: #dc2626; }

/* ---- Erfolgs-Bestaetigung im WP-Blau, zentriert, mit Haekchen-Icon ---- */
.wpit-cnt-status.is-success {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  width: 100%;
  text-align: center;
  color: var(--cnt-primary);
  padding: 12px 0;
}
.wpit-cnt-success__icon {
  color: var(--cnt-primary);
  display: block;
  filter: drop-shadow(0 6px 14px rgba(19, 68, 122, 0.18));
}
/* Stroke-Dash-Animation analog booking.css: erst Ring zeichnen, dann Haken.
   Umfang outer-ring (r=30): 2π·30 ≈ 188.5  → dasharray 189
   Pfadlänge tick „M20 33 L29 42 L45 24": ≈ 36.8  → dasharray 40 */
.wpit-cnt-success__ring {
  opacity: 0.3;
  stroke-dasharray: 189;
  stroke-dashoffset: 189;
  animation: wpit-cnt-success-ring 700ms cubic-bezier(0.4, 0, 0.2, 1) 80ms forwards;
}
.wpit-cnt-success__fill {
  opacity: 0;
  animation: wpit-cnt-success-fill 360ms cubic-bezier(0.4, 0, 0.2, 1) 480ms forwards;
}
.wpit-cnt-success__tick {
  stroke-dasharray: 40;
  stroke-dashoffset: 40;
  animation: wpit-cnt-success-tick 480ms cubic-bezier(0.4, 0, 0.2, 1) 580ms forwards;
}
@keyframes wpit-cnt-success-ring { to { stroke-dashoffset: 0; } }
@keyframes wpit-cnt-success-tick { to { stroke-dashoffset: 0; } }
@keyframes wpit-cnt-success-fill { to { opacity: 0.08; } }
@media (prefers-reduced-motion: reduce) {
  .wpit-cnt-success__ring,
  .wpit-cnt-success__tick,
  .wpit-cnt-success__fill { animation: none; stroke-dashoffset: 0; opacity: 1; }
  .wpit-cnt-success__fill { opacity: 0.08; }
}
.wpit-cnt-success__title {
  font-size: clamp(22px, 2.8vw, 28px);
  font-weight: 700;
  color: var(--cnt-primary);
  letter-spacing: -0.3px;
  line-height: 1.2;
}
.wpit-cnt-success__body {
  font-size: 15px;
  font-weight: 400;
  color: var(--cnt-text-soft);
  line-height: 1.6;
  max-width: 520px;
  margin: 0 auto;
}

/* Form im Erfolgs-Zustand: Felder + Checkbox + Submit verschwinden, Container
   bleibt mit Gradient als Rahmen fuer die Bestaetigung sichtbar. */
.wpit-cnt-form.is-sent .wpit-cnt-grid,
.wpit-cnt-form.is-sent .wpit-cnt-consent,
.wpit-cnt-form.is-sent .wpit-cnt-actions .wpit-cnt-submit { display: none; }
.wpit-cnt-form.is-sent {
  text-align: center;
  padding: clamp(48px, 6vw, 72px) clamp(24px, 4vw, 56px);
}
.wpit-cnt-form.is-sent .wpit-cnt-actions {
  justify-content: center;
  width: 100%;
}

/* ============================================================================
   Sprachumschalter v2 (Hybrid) START
   ----------------------------------------------------------------------------
   Aktive Sprache als Pill mit Mini-Fahne + Sprachcode + Chevron, Dropdown als
   weisse Karte mit Sprach-Namen in Eigensprache. Behebt nebenbei den Baseline-
   Versatz der alten Fahne im Trigger. Backup-Datei: refresh.css.bak-2026-05-17-
   pre-hybrid sowie content/inc_navi.php.bak-2026-05-17-pre-hybrid.
   ============================================================================ */

/* Alten dunkelblauen Chevron der RD-Navbar-Submenu-Logik ausblenden -- wir
   haben unseren eigenen weissen Chevron in der Pill und brauchen den nicht.
   Desktop: komplett display:none.
   Mobile (.rd-navbar-fixed): Theme-Regel ueberschreibt mit `display:flex !important`
   auf Spezifitaet 0,4,0. Wir koennen sie nicht einfach mit display:none kontern,
   weil RD-Navbar dann auch keinen Click-Handler mehr feuert. Stattdessen legen
   wir den (sonst sichtbaren) Toggle UNSICHTBAR ueber die ganze Pille -- damit
   wirkt der Klick auf "die Pille" und RD-Navbar oeffnet das Dropdown wie
   erwartet. Visuell uebernimmt unser eigener .lang-switcher-chevron in der Pille. */
.lang-switcher-item > .rd-navbar-submenu-toggle {
  display: none !important;
}
.rd-navbar-fixed .rd-nav-item.lang-switcher-item.rd-navbar-submenu > .rd-navbar-submenu-toggle {
  display: block !important;
  position: absolute !important;
  inset: 0 !important;
  width: auto !important;
  height: auto !important;
  top: 0 !important;
  right: 0 !important;
  left: 0 !important;
  bottom: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
  border: 0 !important;
  opacity: 0 !important;
  z-index: 3 !important;
  cursor: pointer;
}
.rd-navbar-fixed .rd-nav-item.lang-switcher-item.rd-navbar-submenu > .rd-navbar-submenu-toggle * {
  display: none !important;
}
/* Wenn das Submenue geoeffnet ist, darf das unsichtbare Toggle (inset:0, z-index:3)
   die Klicks auf die Dropdown-Optionen NICHT mehr abfangen -- sonst landet jeder Tap
   auf einer Sprach-Option am Toggle statt am <a>-Link (Session 43 Mobile-Bugfix).
   Schliessen funktioniert weiter ueber Outside-Click (Standard-Mobile-Pattern). */
.rd-navbar-fixed .rd-nav-item.lang-switcher-item.rd-navbar-submenu.opened > .rd-navbar-submenu-toggle {
  pointer-events: none !important;
}

/* Stagger-Slot 8: die Sprach-Pille erscheint als ALLERLETZTES Element der Navi,
   also nach "Kontakt" (Slot 7, 600 ms). Bei 680 ms — fluessiger Schluss mit
   identischem 80-ms-Versatz wie alle anderen Slots.
   Hinweis: 2026-05-24 FAQ vor Kontakt eingefuegt (Slot 6), dadurch Kontakt von
   Slot 6 auf Slot 7 verschoben, Sprach-Pille auf Slot 8. */
.rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item.lang-switcher-item {
  animation-delay: 680ms;
}
@media (prefers-reduced-motion: reduce) {
  .rd-navbar.home-stagger .rd-navbar-nav > .rd-nav-item.lang-switcher-item {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* Trigger-Pill (aktive Sprache) -- Default: weisser Glas-Look,
   passt zu allen Header-States dieser Site (transparenter Hero-Header,
   blauer Subpage-Header, blauer Stuck-Header, blauer Mobile-Fixed-Header). */
.rd-navbar .rd-nav-link.lang-switcher-pill {
  display: inline-flex !important;
  align-items: center;
  gap: 8px;
  padding: 6px 12px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.32);
  font-size: 14px !important;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1 !important;
  color: #ffffff !important;
  text-decoration: none;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background-color 0.18s ease,
              border-color 0.18s ease,
              box-shadow 0.18s ease;
}
.rd-navbar .rd-nav-link.lang-switcher-pill:hover,
.rd-navbar .rd-nav-link.lang-switcher-pill:focus-visible {
  background: rgba(255, 255, 255, 0.20);
  border-color: rgba(255, 255, 255, 0.52);
  color: #ffffff !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.16);
}

/* Mini-Fahne, gleich gross in Pill und Dropdown */
.lang-switcher-flag {
  width: 22px;
  height: 16px;
  object-fit: cover;
  border-radius: 2px;
  display: block;
  flex-shrink: 0;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.06);
}

/* Sprachcode-Label "DE" */
.lang-switcher-code {
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

/* Chevron, dreht sich beim Oeffnen */
.lang-switcher-chevron {
  transition: transform 0.22s ease;
  opacity: 0.7;
  flex-shrink: 0;
}
.rd-navbar-submenu.opened .lang-switcher-chevron,
.rd-navbar-submenu:hover .lang-switcher-chevron {
  transform: rotate(180deg);
  opacity: 1;
}

/* Dropdown-Karte: weiss mit weichem Schatten statt blauem Vollblock */
.rd-navbar .rd-navbar-dropdown.lang-switcher-dropdown {
  background: #ffffff !important;
  border: 1px solid rgba(19, 68, 122, 0.10) !important;
  border-radius: 12px !important;
  padding: 6px !important;
  box-shadow: 0 10px 28px rgba(19, 68, 122, 0.14),
              0 2px 6px rgba(0, 0, 0, 0.04) !important;
  min-width: 160px;
  margin-top: 8px;
}

/* Dropdown-Item: Fahne + Sprach-Name */
.rd-navbar .rd-dropdown-link.lang-switcher-option {
  display: flex !important;
  align-items: center;
  gap: 10px;
  padding: 9px 12px !important;
  border-radius: 8px;
  color: var(--brand-primary, #13447a) !important;
  font-size: 14px !important;
  font-weight: 500 !important;
  letter-spacing: 0;
  line-height: 1;
  background: transparent !important;
  transition: background-color 0.15s ease, color 0.15s ease;
}
/* Ausgegraute Sprach-Items (z.B. auf der FAQ-Seite, die nur in DE existiert).
   pointer-events bleibt aktiv, damit der title-Tooltip beim Hover greift —
   der Klick wird per inline onclick="return false;" im inc_navi.php-Markup
   abgefangen, der Tab-Fokus per tabindex="-1" verhindert.
   Hover/Focus-Stil oben (background blau, color brand) wird hier neutralisiert. */
.rd-navbar .rd-dropdown-link.lang-switcher-option--disabled,
.rd-navbar .rd-dropdown-link.lang-switcher-option--disabled:hover,
.rd-navbar .rd-dropdown-link.lang-switcher-option--disabled:focus-visible {
  opacity: 0.45;
  cursor: not-allowed !important;
  background: transparent !important;
  color: inherit !important;
}
.rd-navbar .rd-dropdown-link.lang-switcher-option:hover,
.rd-navbar .rd-dropdown-link.lang-switcher-option:focus-visible {
  background: rgba(19, 68, 122, 0.08) !important;
  color: var(--brand-primary, #13447a) !important;
}

/* Fahnen im Dropdown: kein Hover-Zoom mehr (alte Regel Z. 286-293 ueberschreiben) */
.rd-navbar-submenu .rd-dropdown-link.lang-switcher-option img.lang-switcher-flag {
  transform: none !important;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.06) !important;
  transition: none;
}
.rd-navbar-submenu .rd-dropdown-link.lang-switcher-option:hover img.lang-switcher-flag {
  transform: none !important;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.06) !important;
}

/* Mobile-Anpassung: Pill bleibt im Hamburger-Menue gut bedienbar */
@media (max-width: 991.98px) {
  .rd-navbar .rd-nav-link.lang-switcher-pill {
    padding: 10px 14px;
    font-size: 15px !important;
  }
  .rd-navbar .rd-navbar-dropdown.lang-switcher-dropdown {
    box-shadow: none !important;
    border-color: rgba(255, 255, 255, 0.18) !important;
    background: rgba(255, 255, 255, 0.04) !important;
    margin-top: 4px;
    min-width: auto;
  }
  .rd-navbar .rd-dropdown-link.lang-switcher-option {
    color: #ffffff !important;
  }
  .rd-navbar .rd-dropdown-link.lang-switcher-option:hover {
    background: rgba(255, 255, 255, 0.12) !important;
    color: #ffffff !important;
  }
}

/* ============================================================================
   Sprachumschalter v2 (Hybrid) ENDE
   ============================================================================ */

/* ============================================================================
   Block 27: Mobile-Hamburger-Open ueberdeckt Floating-Buttons
   ----------------------------------------------------------------------------
   Die drei Floating-Buttons (.login / .kalender / .cookie) im rechten unteren
   Bildschirmbereich haben z-index 9999 (style.css Z. 108/138/207) und liegen
   damit ueber dem RD-Navbar-Mobile-Drawer. Wenn der User im Hamburger-Menue
   das Sprach-Dropdown aufklappt, ueberdecken die Buttons die unteren beiden
   Sprach-Eintraege ("Español" + "Français").

   Fix: script.js setzt body.wpit-menu-open sobald der Hamburger-Toggle aktiv
   ist (siehe Block "Mobile: Hamburger-Open-State auf body"). Diese CSS-Regel
   blendet die Floating-Buttons in diesem State unsichtbar - sobald das
   Hamburger-Menue zu ist, sind sie wieder da. Greift nur unter 992px, weil
   Desktop kein Hamburger-Layout hat.
   ============================================================================ */
@media (max-width: 991.98px) {
  body.wpit-menu-open a.login,
  body.wpit-menu-open a.kalender,
  body.wpit-menu-open a.cookie {
    opacity: 0 !important;
    visibility: hidden !important;
    pointer-events: none !important;
    transition: opacity 0.15s ease, visibility 0.15s ease;
  }
}


/* ============================================================================
   Block 28: Footer-Kontaktliste — Gruppenabstand nach <dl>-Umbau
   ----------------------------------------------------------------------------
   Das Kontakt-<dl> im Footer (inc_footer.php) enthielt nackte <br> zwischen
   den dt/dd-Paaren. Ein <dl> darf direkt aber nur dt/dd-Gruppen, script,
   template oder div enthalten — Lighthouse werte das als kaputten
   Accessibility-Tree (Audit "agent-accessibility-tree", Kategorie
   Agentic Browsing, und Audit "definition-list", Barrierefreiheit).
   Die Paare stecken jetzt in <div>-Gruppen; diese Regel stellt den
   bisherigen optischen Abstand wieder her: ein <br> erzeugte genau eine
   Leerzeile = 25px bei line-height 24.8px/16px im Footer (live gemessen).
   ============================================================================ */
.footer-contact-list > div + div {
  margin-top: 25px;
}
