/* =========================================================================
   SALESHAX — Trust-Landingpage
   Mobil zuerst. Die Basisregeln gelten fuer 360 px, Breakpoints oeffnen
   nach oben. Farbwelt und Sektionsrhythmus folgen saleshax.de/karriere:
   weisser Grund, schwarze Sektionen als aufgelegte Karten, Blau nur als
   Punkt und kursiver Akzent. Nie als Flaeche.
   ========================================================================= */

:root {
  /* Neutrale */
  --ink:            #0A0A0A;
  --weiss:          #FFFFFF;
  --off-weiss:      #FAFAFA;
  --muted:          #656565;       /* Fliesstext auf hell */
  /* #999 aus dem Tokenfile kommt auf Weiss nur auf 2,85:1 und faellt
     damit durch WCAG AA. #767676 ist die hellste Stufe, die 4,5:1 haelt. */
  --grau-350:       #767676;
  --linie:          rgba(0, 0, 0, 0.09);
  --linie-fein:     rgba(0, 0, 0, 0.06);

  /* Sky — der einzige Akzent */
  --sky-200:        #90CFE8;
  --sky-500:        #1796C9;
  --sky-600:        #0C85B4;
  --sky-link:       #0B7BA6;       /* 4,77:1 auf Weiss, fuer Linktext */
  --punkt:          #65BADB;       /* Eyebrow-Punkt */

  /* Auf dunkel */
  --auf-dunkel:     rgba(255, 255, 255, 0.70);
  --auf-dunkel-faint: rgba(255, 255, 255, 0.50);
  --kursiv-dunkel:  rgba(255, 255, 255, 0.60);
  --linie-invers:   rgba(255, 255, 255, 0.10);

  /* Die dunkle Karte, wortgleich von /karriere gemessen */
  --karte-dunkel:   linear-gradient(182deg, #222222 -88%, #121212 94%);

  /* Radien */
  --r-karte:        20px;          /* rounded-[1.25rem] */
  --r-kachel:       16px;
  --r-pill:         71px;
  --r-kapsel:       100px;

  /* Rhythmus */
  --sec-y:          64px;
  --rand:           20px;
  --container:      1520px;

  --ease:           cubic-bezier(0.22, 1, 0.36, 1);
}

@media (min-width: 768px)  { :root { --sec-y: 88px;  --rand: 32px; } }
@media (min-width: 1100px) { :root { --sec-y: 120px; --rand: 40px; } }

/* ---------- Grundlagen ---------------------------------------------- */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  background: var(--weiss);
  color: var(--ink);
  font-family: var(--shx-font-ui);
  font-size: 16px;                 /* nie darunter, sonst zoomt iOS */
  line-height: 1.5;
  letter-spacing: -0.04em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;              /* Sicherheitsnetz gegen Ueberlauf */
}

img, svg, video { max-width: 100%; }
img { height: auto; }

a { color: inherit; }

:focus-visible {
  outline: 2px solid var(--sky-500);
  outline-offset: 3px;
  border-radius: 4px;
}

.nur-sr {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
/* Die Sprungmarke ist nur solange unsichtbar, bis jemand hintabbt. */
a.nur-sr:focus {
  position: fixed; top: 12px; left: 12px; z-index: 99;
  width: auto; height: auto; margin: 0; overflow: visible;
  clip: auto; white-space: normal;
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 10px 18px; border-radius: var(--r-kapsel);
  background: var(--ink); color: #fff; font-size: 16px; text-decoration: none;
}

/* ---------- Sektionsgeruest ------------------------------------------ */

/* viewport-fit=cover steht im <head>, der Inhalt reicht also bis unter Notch und
   Home-Indikator. Ohne env() klebt im Querformat auf aktuellen iPhones Text an
   der Kamerainsel. max() nimmt den groesseren von beiden Werten. */
.wrap {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding-inline: max(var(--rand), env(safe-area-inset-left))
                  max(var(--rand), env(safe-area-inset-right));
}

.sec { padding-block: var(--sec-y); }

/* Die schwarze Sektion ist eine aufgelegte Karte, kein Vollbild-Block.
   Genau so macht es die Karriereseite. */
.sec--dunkel .karte {
  background: var(--ink);
  color: var(--weiss);
  border-radius: var(--r-karte);
  padding: var(--sec-y) 16px;
  position: relative;
  overflow: hidden;
}
/* Die dunkle Karte braucht Luft nach unten, sonst klebt die naechste helle
   Sektion direkt an ihr und der Wechsel-Rhythmus der Karriereseite geht weg.
   Nach oben bringt die vorherige Sektion ihren eigenen Abstand mit. */
.sec--dunkel { padding-block: 0 var(--sec-y); }

@media (min-width: 768px) {
  .sec--dunkel .karte { padding-inline: 40px; }
}

/* ---------- Typografie ----------------------------------------------- */

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 14px;
  font-size: 16px;
  font-weight: 400;
  letter-spacing: -0.04em;
  color: var(--ink);
}
.eyebrow::before {
  content: "";
  width: 7px; height: 7px;
  border-radius: 99px;
  background: var(--punkt);
  flex: none;
}
.sec--dunkel .eyebrow { color: var(--auf-dunkel); }

h1, h2, h3 {
  font-family: var(--shx-font-serif);
  font-weight: 400;
  letter-spacing: -0.05em;
  line-height: 1.08;
  margin: 0;
  text-wrap: pretty;
}

h1 { font-size: clamp(34px, 9.2vw, 76px); }
h2 { font-size: clamp(30px, 7.6vw, 56px); max-width: 20ch; }
h3 { font-size: clamp(20px, 4.4vw, 26px); line-height: 1.2; }

/* Der kursive Akzent am Satzende. Light Italic 300, Grau #666.
   Niemals fett, niemals blau. */
/* .kursiv ist der Klassenname aus dem Figma-Export. Auf dieser Seite laufen
   alle Akzente ueber <em>; die Klasse bleibt als Reserve fuer handgesetzte
   Stellen im Selektor stehen. */
em, .kursiv {
  font-style: italic;
  font-weight: 300;
  color: var(--shx-italic-color);
}
.sec--dunkel em, .sec--dunkel .kursiv { color: var(--kursiv-dunkel); }

.lead {
  margin: 14px 0 0;
  font-size: 17px;
  line-height: 1.55;
  color: var(--muted);
  max-width: 40ch;
}
.sec--dunkel .lead { color: var(--auf-dunkel); }

@media (min-width: 768px) { .lead { font-size: 19px; } }

.sec__kopf { margin-bottom: 32px; }
@media (min-width: 768px) { .sec__kopf { margin-bottom: 48px; } }

/* ---------- Button: Pill im Pill, die Marken-Signatur ---------------- */

.btn {
  display: inline-flex;
  padding: 3px;
  border-radius: var(--r-kapsel);
  border: 1px solid rgba(0, 0, 0, 0.1);
  background: transparent;
  text-decoration: none;
  transition: transform var(--ease) 240ms;
}
.btn span {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  min-height: 48px;
  border-radius: var(--r-pill);
  background: linear-gradient(#000, #666);
  color: #fff;
  font-family: var(--shx-font-ui);
  font-weight: 500;
  font-size: 16px;
  letter-spacing: -0.06em;
  padding: 12px 24px 12px 20px;
}
.btn:hover { transform: translateY(-1px); }
.btn svg { flex: none; }

/* Auf dunkler Flaeche kehrt sich das um */
.btn--hell { border-color: rgba(255, 255, 255, 0.2); }
.btn--hell span { background: #fff; color: #000; }

/* Mobil volle Breite */
.btn--voll { display: flex; width: 100%; }
@media (min-width: 560px) {
  .btn--voll { display: inline-flex; width: auto; }
}

/* Auf 360 px passt "Kostenfreies Erstgespräch buchen" innerhalb der dunklen
   Karte sonst nicht in eine Zeile.
   ⚠️ Die Regel gilt bewusst fuer ALLE Knoepfe, nicht nur die in der dunklen
   Karte. Einmal versucht, sie auf .sec--dunkel zu verengen, damit der Hero-CTA
   auf 16 px bleibt: bei 360 px geht das, bei 320 px bricht der Hero-Knopf dann
   auf drei Zeilen und 72 px um. Nachgemessen am 12.09.2026. */
@media (max-width: 389px) {
  .btn span { font-size: 15px; gap: 8px; padding: 12px 18px; }
}

/* ---------- Kopfzeile ------------------------------------------------ */

.kopf {
  padding: 18px 0 0;
}
.kopf__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}
.wortmarke {
  display: block;
  width: 118px;
  color: var(--ink);
}
.wortmarke svg { display: block; width: 100%; height: auto; }

.kopf .btn { display: none; }
@media (min-width: 768px) {
  .kopf .btn { display: inline-flex; }
  .kopf .btn span { min-height: 44px; font-size: 15px; padding: 10px 20px 10px 18px; }
  .wortmarke { width: 140px; }
}

/* =========================================================================
   1 — Hero
   Nur Text, CTA und Laufband. Punkt-Textur als Boden. Kein Video.
   ========================================================================= */

.hero {
  position: relative;
  padding-block: 44px 0;
  text-align: left;
}
.hero__boden {
  position: absolute;
  inset: auto 0 0 0;
  height: 260px;
  background: url("../texture-dots.png") repeat-x bottom center / auto 100%;
  opacity: 0.45;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(transparent, #000 70%);
          mask-image: linear-gradient(transparent, #000 70%);
  z-index: 0;
}
.hero__inner { position: relative; z-index: 1; }
.hero h1 { margin-bottom: 16px; }
.hero .lead { max-width: 34ch; }
.hero__cta { margin-top: 28px; }

@media (min-width: 768px) {
  .hero { padding-block: 72px 0; text-align: center; }
  .hero .eyebrow { justify-content: center; }
  .hero h1 { margin-inline: auto; max-width: 17ch; }
  .hero .lead { margin-inline: auto; max-width: 52ch; }
}

/* ---------- Logo-Laufband -------------------------------------------- */

.band { margin-top: 44px; padding-bottom: 8px; }
.marquee {
  position: relative;
  overflow: hidden;
  width: 100%;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.marquee__track {
  display: flex;
  width: max-content;
  margin: 0;
  padding: 0;
  list-style: none;
  animation: marquee 80s linear infinite;
}
.marquee:hover .marquee__track { animation-play-state: paused; }
@keyframes marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
.band__item {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 122px;
  height: 42px;
  padding: 0 6px;
}
.band__item img {
  max-width: 100%;
  max-height: 26px;
  width: auto;
  height: auto;
  object-fit: contain;
  filter: grayscale(1) contrast(0.92) opacity(0.55);
}
/* niro media ist helles Zeichen auf dunklem Kasten */
.band__item--invert img { filter: grayscale(1) invert(1) contrast(0.92) opacity(0.6); }

@media (min-width: 768px) {
  .band { margin-top: 64px; }
  .band__item { width: 156px; height: 48px; }
  .band__item img { max-height: 32px; }
}

/* =========================================================================
   2 — Bento
   Mobil eine Spalte. Ab 768 das Raster der Karriereseite.
   ========================================================================= */

/* <ul>, nicht <div>: fuenf namenlose article-Landmarken sind fuer Screenreader
   Rauschen, "Liste mit 5 Eintraegen" ist eine Aussage. */
.bento {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.kachel {
  position: relative;
  border-radius: var(--r-kachel);
  overflow: hidden;
  min-height: 200px;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.kachel--dunkel {
  background: var(--karte-dunkel);
  border: 1px solid rgba(255, 255, 255, 0.06);
}
/* Kachel 1 ist auf Marwens Wunsch hellblau (12.09.2026). An dieser einen
   Stelle ist Blau damit Flaeche statt Akzent. Bewusste Abweichung von der
   Farbregel des Fahrplans, alle anderen Sektionen bleiben unberuehrt. */
.kachel--blau {
  background: linear-gradient(168deg, #A9DCEF 0%, #8CC9E4 56%, #7CBEDD 100%);
  border: 1px solid rgba(10, 10, 10, 0.07);
}
.kachel--bild::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.78) 0%, rgba(0, 0, 0, 0.15) 46%, transparent 72%);
  pointer-events: none;
}
.kachel__bild {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
/* Das Saal-Foto ist hell und wuerde die Zahl darauf schlucken. Leicht
   abgedunkelt traegt der Verlauf darunter den Text. */
.k3 .kachel__bild { filter: brightness(0.72) saturate(0.88); }

/* David steht im Quellbild hochkant und mittig oben. Auf einer flachen Kachel
   schneidet object-fit: cover den Kopf ab, deshalb sitzt der Ausschnitt hier
   oben statt in der Mitte. Kein neues Bild, nur ein anderer Ausschnitt. */
.kachel--fokus-kopf .kachel__bild { object-position: 50% 10%; }
.kachel__text {
  position: relative;
  z-index: 2;
  padding: 20px;
}
.kachel__zahl {
  display: block;
  font-family: var(--shx-font-ui);
  font-weight: 500;
  font-size: 18px;
  line-height: 1.25;
  letter-spacing: -0.04em;
  color: #fff;
}
.kachel__sub {
  display: block;
  margin-top: 4px;
  font-size: 16px;
  font-weight: 300;
  line-height: 1.4;
  color: var(--auf-dunkel);
}
.kachel--blau .kachel__zahl { color: var(--ink); }
.kachel--blau .kachel__sub  { color: #114254; }

/* Kachel 4: Glas-Pill auf dem Vision-Bild */
/* 190 px bleiben. cover skaliert hier auf die HOEHE, mehr Kachelhoehe zeigt
   also WENIGER Bildbreite, nicht mehr: bei 190 px sind bei 288 px Kachelbreite
   63 % der Bildbreite sichtbar, bei 240 px nur noch 50 %. Der eingebrannte
   Schriftzug "Unsere Vision" liegt bei 190 px mit rund 130 px Rand auf jeder
   Seite im Ausschnitt. Nachgemessen am 12.09.2026. */
.kachel--vision { min-height: 190px; justify-content: flex-end; align-items: flex-start; }
/* "Unsere Vision" ist im Bild eingebrannt und sitzt im oberen Drittel. Bei
   mittigem Ausschnitt schneidet die flache Kachel den Schriftzug oben ab. */
.kachel--vision .kachel__bild { object-position: 50% 28%; }
.kachel--vision .kachel__text { padding: 20px; }   /* gleich wie die Nachbarn */
/* Die Pill liegt auf einem Foto, ihr Kontrast haengt also am hellsten Pixel
   darunter. Gemessen am 12.09.2026 am gerenderten Bild: mit einer hellen
   Glasflaeche (rgba(255,255,255,0.14)) kam weisser Text auf 3,14:1 und lag auf
   45 % der Pillflaeche unter WCAG AA. Dunkles Glas dreht das um: der Text
   traegt jetzt ueberall, und die Glasanmutung bleibt. */
.glas-pill {
  display: inline-block;
  padding: 9px 18px;
  border-radius: var(--r-kapsel);
  background: rgba(10, 10, 10, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.18);
  -webkit-backdrop-filter: blur(12px);
          backdrop-filter: blur(12px);
  font-family: var(--shx-font-serif);
  font-style: italic;
  font-weight: 300;
  font-size: 17px;
  letter-spacing: -0.03em;
  color: #fff;
}

/* Kachel 1 traegt die Zahl als Geist im Hintergrund. Das Bild von der
   Karriereseite hat eine riesige 63 eingebrannt und laeuft im Teal-Verlauf
   — beides ist hier falsch. Der Mechanismus wird deshalb in CSS nachgebaut,
   mit der richtigen Zahl und in der neutralen Karte. */
.kachel--geist { justify-content: flex-end; }
.kachel--geist .geist {
  position: absolute;
  right: -8px;
  top: 50%;
  transform: translateY(-54%);
  font-family: var(--shx-font-serif);
  font-weight: 400;
  font-size: 148px;
  line-height: 0.8;
  letter-spacing: -0.06em;
  color: rgba(255, 255, 255, 0.055);
  pointer-events: none;
  user-select: none;
  z-index: 1;
}
/* Auf dunkel steht die Geist-Zahl bei 5,5 % Weiss. Auf dem hellblauen Grund
   traegt sie schon bei einem Drittel Deckkraft und bleibt trotzdem hinter dem
   Text, der ueber ihr liegt. */
.kachel--blau .geist { color: rgba(255, 255, 255, 0.34); }
@media (min-width: 768px)  { .kachel--geist .geist { font-size: 170px; } }
@media (min-width: 1100px) { .kachel--geist .geist { font-size: 210px; right: 4px; } }

/* Kachel 2 traegt drei Marken aus der Gruppe ueber dem Text. Die Dateien
   sind die Laufband-Fassungen, also dunkle Zeichen. Statt drei neue Dateien
   anzulegen, faerbt ein Filter sie auf der dunklen Karte weiss. */
.kachel--marken { justify-content: space-between; }
.kachel__marken {
  position: relative;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px 24px;
  margin: 22px 20px 0;
  padding: 0;
  list-style: none;
}
.kachel__marken img {
  display: block;
  width: auto;
  height: var(--h, 22px);
  max-width: 120px;
  object-fit: contain;
  filter: brightness(0) invert(1) opacity(0.82);
}

/* Mobil: die beiden Fotokacheln brauchen mehr Hoehe als die Textkacheln.
   Bei k4 haengt der Kopf von David daran, bei k3 der Saal. */
.k3 { min-height: 240px; }
.k4 { min-height: 300px; }

/* Tablet: zwei gleich breite Spalten. Die Vision laeuft ueber beide. */
@media (min-width: 768px) {
  .bento {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
  }
  .kachel { min-height: 220px; }
  .k3, .k4 { min-height: 320px; }
  .k5 { grid-column: span 2; min-height: 260px; }
  .kachel__zahl { font-size: 20px; }
  .kachel__text { padding: 24px; }
  /* Spezifitaet: .kachel--vision .kachel__text (0,2,0) schlaegt die Regel
     darueber, die Pill klebte sonst naeher am Rand als die Nachbartexte. */
  .kachel--vision .kachel__text { padding: 24px; }
  .kachel__marken { margin: 24px 24px 0; gap: 18px 28px; }
}

/* Ab hier das Zwoelfer-Raster der Karriereseite, angepasst an fuenf Kacheln:
   zwei Zeilen Paare, darunter die Vision als Band ueber die volle Breite.
   Die beiden Fotokacheln stehen in der mittleren, hoeheren Zeile. */
@media (min-width: 1100px) {
  .bento {
    grid-template-columns: repeat(12, minmax(0, 1fr));
    grid-auto-rows: 148px;
    gap: 20px;
  }
  .kachel { min-height: 0; }
  .k1 { grid-column: span 7; grid-row: span 2; }
  .k2 { grid-column: span 5; grid-row: span 2; }
  .k3 { grid-column: span 7; grid-row: span 3; }
  .k4 { grid-column: span 5; grid-row: span 3; }
  .k5 { grid-column: span 12; grid-row: span 2; }
  .kachel__zahl { font-size: 22px; }
  /* Auf der breiten Kachel tragen die Marken etwas mehr Hoehe. */
  .kachel__marken { gap: 20px 34px; }
  .kachel__marken img { height: calc(var(--h, 22px) * 1.3); max-width: 152px; }
}

/* =========================================================================
   3 — Roadmap
   Mobil: Phasen untereinander, Linie senkrecht links, Termin-Karte darunter.
   Die Karte ersetzt die drei nackten Bullets von vorher (Marwen, 12.09.2026).
   Bewusst OHNE Zeitachse, Strichraster oder Wochentakt als Grafik: so etwas
   wird abzaehlbar und behauptet eine Laufzeit je Phase, die nirgends belegt
   ist. Sichtbar ist nur, was belegt ist.
   ========================================================================= */

.rm__intro { margin: 0 0 40px; }
.rm__lead {
  margin: 0 0 26px;
  font-size: 17px;
  line-height: 1.55;
  color: var(--muted);
  max-width: 58ch;
}
.rm__punkte {
  display: grid;
  gap: 20px;
  margin: 0;
  padding: 0;
  list-style: none;
}
/* Bewusst ohne Aufzaehlungsmarker: mit Punkt oder Quadrat davor liest sich die
   Stelle wieder als die Bullet-Liste, die hier vorher stand und die Marwen
   ausgetauscht haben wollte. Ueberschrift plus Satz reicht. */
.rm__punkte li {
  position: relative;
  padding-top: 13px;
  border-top: 1px solid var(--linie-fein);
}
.rm__punkte strong {
  display: block;
  font-family: var(--shx-font-ui);
  font-weight: 500;
  font-size: 17px;
  letter-spacing: -0.03em;
  color: var(--ink);
}
.rm__punkte span {
  display: block;
  margin-top: 3px;
  font-size: 16px;
  line-height: 1.5;
  color: var(--muted);
}
@media (min-width: 768px) {
  .rm__lead { font-size: 19px; }
  .rm__punkte { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px 40px; }
}
@media (min-width: 1160px) {
  .rm__intro { margin-bottom: 56px; }
  .rm__punkte { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 32px; }
}

.rm {
  position: relative;
  display: grid;
  gap: 0;
}
/* Die Verbindungslinie */
.rm::before {
  content: "";
  position: absolute;
  left: 15px;
  top: 12px;
  bottom: 12px;
  width: 1px;
  background: linear-gradient(var(--sky-200), var(--linie) 70%);
}
.phase {
  position: relative;
  padding: 0 0 28px 46px;
}
.phase:last-child { padding-bottom: 0; }
.phase__nr {
  position: absolute;
  left: 0; top: -2px;
  width: 31px; height: 31px;
  display: grid;
  place-items: center;
  border-radius: 99px;
  background: var(--weiss);
  border: 1px solid var(--linie);
  font-family: var(--shx-font-serif);
  font-style: italic;
  font-weight: 300;
  font-size: 15px;
  letter-spacing: -0.02em;
  color: var(--grau-350);
}
.phase__titel {
  margin: 0 0 12px;
  font-family: var(--shx-font-serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: -0.04em;
  line-height: 1.16;
  /* "Bestandskundenvertrieb" ist ein Wort ohne Umbruchstelle. lang="de"
     steht am <html>, die Trennung greift also. */
  overflow-wrap: break-word;
  hyphens: auto;
  -webkit-hyphens: auto;
}

/* ---------- Die Termin-Karte ---------------------------------------- */

/* --off-weiss gegen Weiss sind 1,04:1, der feine Rahmen 1,14:1 — die Karte war
   als Karte kaum zu erkennen. Kraeftigerer Rahmen plus der Schatten, den die
   Trustpilot-Karten auch tragen. */
.termin {
  position: relative;
  background: var(--off-weiss);
  border: 1px solid var(--linie);
  border-radius: var(--r-kachel);
  padding: 15px 16px 16px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}
.termin__kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 14px;
  margin: 0 0 14px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--linie-fein);
}
.termin__art {
  font-family: var(--shx-font-ui);
  /* 14 px ist hier richtig: die Untergrenze aus Abschnitt 8.0 gilt dem
     Fliesstext, nicht einem Versal-Label. Auf 16 px gehoben bricht die
     Kopfzeile der Karte bei 320 px zusaetzlich um. */
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink);
}
/* Der Takt steht als Wort da, nicht als Raster. Ein Raster waere abzaehlbar
   und damit eine Aussage ueber die Dauer einer Phase. */
.termin__takt {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 16px;
  letter-spacing: -0.03em;
  /* NICHT --grau-350: der Wert ist auf reines Weiss gerechnet (4,54:1) und
     faellt auf dem --off-weiss der Karte auf 4,35:1 durch WCAG AA. */
  color: var(--muted);
}
.termin__takt::before {
  content: "";
  width: 7px; height: 7px;
  border-radius: 99px;
  background: var(--punkt);
  flex: none;
}

/* Einer pro Zeile. Umbrechen laesst die Namen je nach Laenge mal zu zweit,
   mal allein stehen — das sieht nach Versehen aus. */
.phase__team {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.berater {
  display: flex;
  align-items: center;
  gap: 11px;
  font-size: 16px;
  color: var(--ink);
  letter-spacing: -0.03em;
}
.berater img {
  width: 40px; height: 40px;
  border-radius: 99px;
  object-fit: cover;
  background: var(--weiss);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  flex: none;
}

/* Die Karte zeigt drei Gesichter. Ohne diese Zeile liest sich das als drei
   Berater, die mit dem Kunden arbeiten — belegt ist aber einer je Phase.
   Der Satz steht zwar auch im Intro, mobil aber rund 900 px weiter oben. */
.termin__fuss {
  margin: 14px 0 0;
  padding-top: 12px;
  border-top: 1px solid var(--linie-fein);
  font-size: 16px;
  line-height: 1.4;
  letter-spacing: -0.03em;
  color: var(--muted);
}

/* ---------- Die Bewegung -------------------------------------------- */
/* Die drei Portraets werden nacheinander aufgelegt. Alles haengt unter
   .reveal-an: faellt trust.js aus, raeumt das Kopf-Skript die Klasse nach
   zwei Sekunden ab und alles steht sichtbar da. Ohne diese Schachtelung
   blieben die Gesichter bei einem Ausfall auf opacity 0 stehen. */
.reveal-an .phase[data-reveal] .berater,
.reveal-an .phase[data-reveal] .termin__fuss,
.reveal-an .phase[data-reveal] .termin__kopf {
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 520ms var(--ease), transform 520ms var(--ease);
}
.reveal-an .phase[data-reveal] .berater {
  transform: translateY(16px) scale(0.9) rotate(-4deg);
  transition-duration: 560ms;
}
/* Der Name kommt erst, wenn das Bild liegt. */
.reveal-an .phase[data-reveal] .berater span {
  opacity: 0;
  transform: translateX(-8px);
  transition: opacity 380ms var(--ease), transform 380ms var(--ease);
}
.reveal-an .phase[data-reveal].ist-da .berater span { opacity: 1; transform: none; }
.reveal-an .phase[data-reveal].ist-da .berater,
.reveal-an .phase[data-reveal].ist-da .termin__fuss,
.reveal-an .phase[data-reveal].ist-da .termin__kopf { opacity: 1; transform: none; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(1) { transition-delay: 150ms; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(2) { transition-delay: 270ms; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(3) { transition-delay: 390ms; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(1) span { transition-delay: 430ms; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(2) span { transition-delay: 550ms; }
.reveal-an .phase[data-reveal].ist-da .berater:nth-child(3) span { transition-delay: 670ms; }

/* Der Steg von der Phasennummer zur Karte zeichnet sich einmal. Keine
   Fortschrittsanzeige: er gehoert zu einer Phase und fuellt sich nicht. */
.termin::before {
  content: "";
  position: absolute;
  left: -30px; top: 30px;
  width: 30px; height: 1px;
  background: var(--linie);
  transform-origin: left center;
}
.reveal-an .phase[data-reveal] .termin::before {
  transform: scaleX(0);
  transition: transform 520ms var(--ease) 60ms;
}
.reveal-an .phase[data-reveal].ist-da .termin::before { transform: none; }

/* Erst wenn beide Zeilen nebeneinander passen, rueckt der Takt nach rechts.
   Bei 360 px umbricht die Kopfzeile, und rechtsbuendig stuende der Takt dann
   allein am rechten Rand der zweiten Zeile. */
@media (min-width: 560px) { .termin__takt { margin-left: auto; } }

@media (min-width: 768px) {
  .phase { padding-bottom: 34px; }
  .phase__titel { font-size: 24px; }
  .termin { padding: 18px 20px 20px; }
  .berater { font-size: 17px; }
  .berater img { width: 44px; height: 44px; }
}

/* Ab hier ist die Karte breit genug fuer alle drei nebeneinander. Darunter
   stehen sie untereinander: bei schmaleren Karten bricht sonst 2+1 um, und
   lange Namen wie "Alexander Akopjan" rutschen auf zwei Zeilen. */
@media (min-width: 860px) {
  .phase__team { flex-direction: row; flex-wrap: wrap; gap: 16px 26px; }
  .berater { flex: 1 1 0; min-width: 190px; }
}

/* Ab 1280 steht die Karte neben Nummer und Titel statt darunter. Die
   Verbindungslinie bleibt senkrecht: die frueher hier liegende Fuenf-Spalten-
   Fassung legte sie waagerecht ueber die Koepfe und liess zwischen 768 und
   1159 px die Phasen 02 und 04 ohne Linie stehen.
   Nicht frueher als 1280: bei 1160 bleiben der rechten Spalte nur 644 px
   Innenbreite, und "Lukas von Cysewski" bricht dort auf zwei Zeilen um. */
@media (min-width: 1280px) {
  .phase {
    display: grid;
    grid-template-columns: minmax(0, 0.62fr) minmax(0, 1.38fr);
    column-gap: 40px;
    align-items: start;
    padding-bottom: 40px;
  }
  .phase__titel { margin: 0; padding-top: 1px; }
  .termin { grid-column: 2; grid-row: 1; }
  .termin::before { left: -40px; width: 40px; }
}
@media (min-width: 1400px) {
  .phase__titel { font-size: 27px; }
  .berater img { width: 48px; height: 48px; }
}

/* =========================================================================
   4 — Case-Study-Videos
   Poster plus preload="none". Nie autoplay.
   ========================================================================= */

.vids { display: grid; gap: 26px; }
.vid-gruppe__titel {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin: 0 0 14px;
  font-family: var(--shx-font-ui);
  /* 14 px: Versal-Label mit 0,06em Sperrung im Verbund mit der 17-px-Ziffer.
     Die 16-px-Untergrenze gilt dem Fliesstext. */
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--auf-dunkel-faint);
}
.vid-gruppe__nr {
  font-family: var(--shx-font-serif);
  font-style: italic;
  font-weight: 300;
  font-size: 17px;
  letter-spacing: -0.02em;
  text-transform: none;
  color: var(--sky-200);
}
/* Mobil ein Wisch-Karussell je Phase. Fuenfzehn Karten untereinander sind
   auf dem Handy ein endloser Scroll. Die angeschnittene naechste Karte ist
   der Hinweis, dass es weitergeht. Der Body scrollt dabei nicht mit —
   gescrollt wird nur in dieser Liste. */
.vid-liste {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 82%;
  gap: 12px;
  margin: 0; padding: 0 0 4px;
  list-style: none;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.vid-liste::-webkit-scrollbar { display: none; }
.vid-liste > .vid { scroll-snap-align: start; }

.vid {
  position: relative;
  border-radius: var(--r-kachel);
  overflow: hidden;
  background: #141414;
  border: 1px solid var(--linie-invers);
}
.vid__buehne {
  position: relative;
  aspect-ratio: 16 / 9;
  background: #0d0d0d;
}
.vid__buehne img,
.vid__buehne video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.vid__start {
  position: absolute;
  inset: 0;
  width: 100%;
  border: 0;
  background: transparent;
  cursor: pointer;
  display: grid;
  place-items: center;
  padding: 0;
}
.vid__start::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.5), transparent 60%);
}
.vid__play {
  position: relative;
  width: 56px; height: 56px;
  border-radius: 99px;
  background: rgba(255, 255, 255, 0.92);
  display: grid;
  place-items: center;
  transition: transform 240ms var(--ease);
}
.vid__start:hover .vid__play { transform: scale(1.06); }
/* .vid traegt overflow:hidden, und der Knopf liegt deckungsgleich auf der
   Kartenkante. Ein Ring mit positivem offset wird komplett weggeschnitten. */
.vid__start:focus-visible { outline-offset: -4px; border-radius: var(--r-kachel); }
.vid__play svg { margin-left: 3px; }
.vid__info { padding: 16px 18px 18px; }
.vid__marke {
  display: block;
  font-weight: 500;
  font-size: 16px;
  letter-spacing: -0.04em;
  color: #fff;
}
/* Ab Tablet ist Platz genug: Raster statt Karussell. */
@media (min-width: 640px) {
  .vid-liste {
    grid-auto-flow: row;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    overflow-x: visible;
    scroll-snap-type: none;
    gap: 16px;
  }
}
@media (min-width: 1100px) {
  .vids { gap: 40px; }
  .vid-liste { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
}

/* =========================================================================
   5 — Trustpilot
   Helle Sektion. Weisse Karten mit gruenen Sternen brauchen hellen Grund.
   ========================================================================= */

/* Kopfzeile im Alfima-Zuschnitt: die Anzahl steht als eigene Zeile ueber der
   Headline, mit der Zahl als farbigem Akzent. Die Note 4,3 bleibt draussen
   (Marwen, 12.09.2026). Der Link unter der Wand traegt sie ebenfalls nicht. */
.tp-zahl {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin: 0 0 12px;
  font-size: 16px;
  font-weight: 400;
  letter-spacing: -0.03em;
  color: var(--ink);
}
.tp-zahl span {
  font-family: var(--shx-font-serif);
  font-weight: 400;
  font-size: 34px;
  line-height: 1;
  letter-spacing: -0.05em;
  color: var(--sky-600);
}
@media (min-width: 768px) { .tp-zahl span { font-size: 40px; } }

/* Die Wand soll dicht wirken, nicht zum Lesen einladen (Marwen, 12.09.2026,
   Vorbild vertrauen.alfima.io). Deshalb frueher mehr Spalten, schmalere
   Karten, weniger Polster und ein spaeterer Verlauf. Wiederholt wird nichts:
   es sind 18 verschiedene Karten. */
/* Der Spaltenwechsel MUSS auf derselben Breite sitzen wie die Fenstergrenze
   (768 px). Lag er bei 640 px, rechnete die Drei-Karten-Formel zwischen 640 und
   767 px gegen eine zweispaltige Wand und traf die Kartenkante nicht mehr. */
.tp-wand { columns: 1; column-gap: 14px; }
@media (min-width: 768px)  { .tp-wand { columns: 2; column-gap: 14px; } }
@media (min-width: 1000px) { .tp-wand { columns: 3; column-gap: 16px; } }
@media (min-width: 1280px) { .tp-wand { columns: 4; column-gap: 16px; } }

.tp-karte {
  margin: 0 0 14px;
  background: #fff;
  border: 1px solid var(--linie-fein);
  border-radius: 14px;
  padding: 16px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
  break-inside: avoid;
}
.tp-karte img { display: block; width: 100%; height: auto; }
@media (min-width: 768px)  { .tp-karte { padding: 14px; } }
@media (min-width: 1280px) { .tp-karte { padding: 12px; margin-bottom: 12px; } }

/* Mobil sollen nicht 18 Karten am Stueck gescrollt werden. Drei reichen,
   dann der Verlauf und der Link aufs Profil. Ab Tablet laeuft die Wand bis zur
   Fensterkante (1180 px, ab 1000 px 1480 px) und blendet dort aus — gemessen
   sind das rund fuenf Karten auf dem Tablet und rund fuenfzehn auf dem Desktop,
   nicht alle 18.

   Wichtig: die Hoehenbegrenzung sitzt auf dem FENSTER, nicht auf .tp-wand.
   Eine begrenzte Hoehe direkt am Spalten-Container laesst CSS-Multicol den
   Rest in weitere Spalten nach rechts fliessen statt ihn abzuschneiden. */
/* Die Hoehe folgt den ersten drei Karten, statt auf 1180 px festgenagelt zu
   sein. --tp-drei ist die Summe der drei Seitenverhaeltnisse und kommt aus
   build.py. Der Rest: Bildbreite = 100vw minus 2x20 Rand, 2x16 Kartenpolster
   und 2 px Rahmen = 100vw - 74px. Dazu 3x34 px Polster plus 2x14 px Abstand.
   Aendert sich das Kartenpolster, aendert sich diese Rechnung mit. */
.tp-fenster {
  max-height: calc((100vw - 74px) * var(--tp-drei, 3.7) + 130px);
  overflow: hidden;
}
.tp-maske {
  -webkit-mask-image: linear-gradient(#000 62%, transparent);
          mask-image: linear-gradient(#000 62%, transparent);
}
/* Ab Tablet bleibt das Fenster begrenzt, nur weiter unten. Ohne Grenze endet
   die kuerzeste Spalte deutlich frueher als die laengste, und rechts unten
   steht ein leeres Feld. Mit Grenze laufen alle Spalten bis zur Kante und die
   Wand wirkt, als ginge sie weiter. Die Grenze sitzt auf dem Fenster, nie auf
   .tp-wand: eine Hoehe direkt am Spalten-Container laesst Multicol nach rechts
   weiterfliessen statt abzuschneiden. */
@media (min-width: 768px) {
  .tp-fenster { max-height: 1180px; }
  .tp-maske {
    -webkit-mask-image: linear-gradient(#000 86%, transparent);
            mask-image: linear-gradient(#000 86%, transparent);
  }
}
@media (min-width: 1000px) { .tp-fenster { max-height: 1480px; } }
.tp-ende {
  text-align: center;
  margin-top: -26px;
  position: relative;
  z-index: 2;
}
.tp-ende a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 48px;
  min-width: 44px;
  font-size: 16px;
  color: var(--sky-link);
  text-decoration: none;
  border: 1px solid rgba(0, 0, 0, 0.1);
  border-radius: var(--r-kapsel);
  padding: 14px 24px;
  background: #fff;
}
.tp-ende a:hover { border-color: rgba(0, 0, 0, 0.22); }

/* =========================================================================
   6 — Finaler CTA
   ========================================================================= */

.endcta { text-align: center; }
.endcta .karte { padding-block: 72px; }
.endcta h2 {
  max-width: 18ch;
  margin-inline: auto;
  color: #fff;
}
.endcta__btn { margin-top: 30px; }
.endcta__fein {
  margin: 16px 0 0;
  font-size: 16px;
  color: var(--auf-dunkel-faint);
}
/* Halo hinter dem Knopf */
.halo {
  position: absolute;
  left: 50%;
  bottom: -140px;
  transform: translateX(-50%);
  width: min(560px, 120%);
  height: 300px;
  background: radial-gradient(ellipse at center, rgba(144, 207, 232, 0.22), transparent 68%);
  pointer-events: none;
  z-index: 0;
}
.endcta .karte > *:not(.halo) { position: relative; z-index: 1; }

/* =========================================================================
   7 — Footer
   ========================================================================= */

.footer {
  border-top: 1px solid var(--linie);
  padding: 32px 0 40px;
}
.footer__inner {
  display: flex;
  flex-direction: column;
  gap: 24px;
}
.footer .wortmarke { width: 108px; color: var(--ink); }
.footer__links {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 22px;
  margin: 0; padding: 0;
  list-style: none;
}
.footer__links a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  min-width: 44px;          /* sonst ist "AGB" nur 28 px breit */
  font-size: 16px;
  color: var(--muted);
  text-decoration: none;
}
.footer__links a:hover { color: var(--ink); }
.footer__social {
  display: flex;
  gap: 6px;
  margin: 0; padding: 0;
  list-style: none;
}
.footer__social a {
  display: grid;
  place-items: center;
  width: 44px; height: 44px;
  border-radius: 6px;
  color: var(--muted);
}
.footer__social a:hover { color: var(--ink); background: var(--off-weiss); }
.footer__rechts {
  font-size: 14px;
  color: var(--grau-350);
  margin: 0;
}

@media (min-width: 768px) {
  .footer__inner {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 20px 32px;
  }
}

/* =========================================================================
   Motion — und wie sie stillgelegt wird
   ========================================================================= */

/* Sichtbar ist der Grundzustand. Versteckt wird nur unter .reveal-an, und
   die Klasse setzt das Inline-Skript im <head> — mit Selbstabschaltung nach
   zwei Sekunden, falls trust.js nie ankommt. Damit faellt JEDER Ausfall
   (JS aus, Datei fehlt, Skript wirft, Adblocker) in den sichtbaren Zustand.
   Vorher war es umgekehrt: ohne trust.js blieben Bento, Roadmap, Videos und
   die Trustpilot-Wand auf opacity 0 stehen — also genau die vier Sektionen,
   die auf einer Vertrauensseite den Beweis tragen. */
.reveal-an [data-reveal] {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 640ms var(--ease), transform 640ms var(--ease);
}
.reveal-an [data-reveal].ist-da { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .marquee__track { animation: none !important; }
  [data-reveal] { opacity: 1 !important; transform: none !important; transition: none !important; }
  /* Die Roadmap-Bewegung sitzt auf Kindern von [data-reveal], die greift die
     Regel darueber nicht. Inhalte bleiben dabei vollstaendig sichtbar. */
  .berater, .berater span, .termin__kopf, .termin__fuss, .termin::before {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
    animation: none !important;
  }
  /* Das Laufband nicht nur anhalten, sondern umstellen: angehalten waeren
     bei 360 px nur zwei der 16 Marken sichtbar und die uebrigen 14 auf
     keinem Weg erreichbar. */
  .marquee {
    overflow-x: visible;
    /* Die seitliche Maske gehoert zur laufenden Schiene. Bei einem ruhenden
       Block wuerde sie die aeusseren Marken jeder Reihe wegblenden. */
    -webkit-mask-image: none;
            mask-image: none;
  }
  .marquee__track { width: auto; flex-wrap: wrap; justify-content: center; row-gap: 4px; }
  /* Schmaler, damit drei je Reihe passen statt zwei — sonst wird der ruhende
     Block acht Reihen hoch. 90 statt 98 px: bei 320 px ist der Inhaltsbereich
     nur 280 px breit, drei Kacheln zu 98 px brauchen 294 und brechen wieder auf
     zwei je Reihe um. Nachgemessen am 12.09.2026. */
  .marquee__track .band__item { width: 90px; }
  .marquee__track [aria-hidden="true"] { display: none; }
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}

