/* ============================================================
   SITE COMPONENTS (v6) — nav, stage, sections, cards, sliders,
   bands, forms, footer. One sheet, ordered top-of-page → bottom.
   Sections are full-bleed; content is inset by --edge.
   ============================================================ */

/* ================= NAV ============================================= */
.nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 100;
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--space-4) var(--edge) var(--space-3);
  transition: transform 0.35s var(--motion-ease-out), background 0.3s ease;
}
.nav.is-hidden { transform: translateY(-100%); }
.nav.is-scrolled {
  background: rgba(8, 8, 8, 0.94);
  padding-block: var(--space-2);
}
.nav__brand { display: block; }
.nav__brand img { height: 20px; width: auto; display: block; }
.nav__menu { display: flex; align-items: center; gap: 70px; }
.nav__item--home { display: none; }
.nav__item { position: relative; }
.nav__item > a {
  position: relative;
  font-size: 16px; font-weight: 400;
  color: var(--color-white);
  padding-block: var(--space-1);
  opacity: 0.92;
  transition: opacity 0.2s ease;
}
.nav__item > a:hover { opacity: 1; font-weight: 600; }
.nav__item > a.is-active { opacity: 1; font-weight: 600; }
/* reserve the bold width so hovering never shifts the row */
.nav__item > a::before {
  content: attr(data-label);
  display: block; height: 0; overflow: hidden; visibility: hidden;
  font-weight: 600;
}
.nav__item > a.is-active::after { right: 0; }
/* invisible bridge so the dropdown survives the gap */
.nav__item::after { content: ""; position: absolute; top: 100%; left: -16px; right: -16px; height: 20px; }
/* dropdown — black glass panel */
.nav__sub {
  position: absolute; top: calc(100% + 14px); left: 50%;
  transform: translateX(-50%) translateY(6px) scale(0.98);
  transform-origin: top center;
  min-width: 236px; padding: var(--space-1);
  background: rgba(8, 8, 8, 0.95);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--radius-default);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity 0.25s var(--motion-ease-out), transform 0.25s var(--motion-ease-out), visibility 0.25s;
}
.nav__item:hover .nav__sub, .nav__item:focus-within .nav__sub {
  opacity: 1; visibility: visible; pointer-events: auto;
  transform: translateX(-50%) translateY(0) scale(1);
}
.nav__sub a {
  display: block; padding: 10px 14px;
  border-radius: 8px;
  font-size: 14px; font-weight: 400; color: rgba(255, 255, 255, 0.85);
  white-space: nowrap;
  transition: background 0.2s ease, color 0.2s ease;
}
.nav__sub a:hover { background: rgba(255, 255, 255, 0.09); color: var(--color-white); }
/* DE | EN — refined segmented toggle (DE inert until the German copy lands) */
.nav__lang { display: inline-flex; align-items: stretch; height: 26px; font-size: 14px; letter-spacing: 0; }
.nav__lang-de, .nav__lang-en {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 34px; padding-inline: 8px;
}
.nav__lang-de { border-radius: var(--radius-toggle) 0 0 var(--radius-toggle); }
.nav__lang-en { border-radius: 0 var(--radius-toggle) var(--radius-toggle) 0; }
.nav__lang :not([aria-current]) {
  color: rgba(255, 255, 255, 0.75); font-weight: 300;
  border: 1px solid rgba(255, 255, 255, 0.45);
  transition: color 0.2s ease, border-color 0.2s ease;
}
.nav__lang a:not([aria-current]):hover { color: var(--color-white); border-color: rgba(255, 255, 255, 0.75); }
.nav__lang-de:not([aria-current]) { border-right: 0; }
.nav__lang-en:not([aria-current]) { border-left: 0; }
.nav__lang [aria-current] {
  color: var(--color-black); font-weight: 600;
  background: var(--color-white);
}
.nav__burger { display: none; width: 44px; height: 44px; position: relative; z-index: 110; }
.nav__burger span {
  display: block; width: 26px; height: 2px; margin: 5px auto;
  background: var(--color-white); border-radius: 2px;
  transition: transform 0.3s var(--motion-ease-out), opacity 0.2s ease;
}
.nav__burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav__burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav__burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* ================= STAGE (page hero) =============================== */
.stage {
  position: relative;
  background: var(--color-bg);
  color: var(--color-white);
  overflow: hidden;
  display: flex;
  align-items: flex-end;
  min-height: 541px;
  padding: 176px var(--edge) var(--space-8);
}
.stage--tall { min-height: 100svh; padding-bottom: 80px; }
.stage--short { min-height: 349px; padding-bottom: var(--space-8); }
.stage--service { min-height: 420px; padding-top: 176px; padding-bottom: var(--space-6); }
.stage__art {
  position: absolute; top: 0; right: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: right center;
  max-width: none; pointer-events: none; user-select: none;
  opacity: 0; transition: opacity 0.45s ease;
}
.stage__art.is-loaded { opacity: 1; }
.stage__art--arc {
  height: auto; width: 62%; top: 0; right: 0;
  -webkit-mask-image: radial-gradient(130% 130% at 100% 0%, #000 52%, transparent 73%);
  mask-image: radial-gradient(130% 130% at 100% 0%, #000 52%, transparent 73%);
}

.stage__inner { position: relative; z-index: 2; width: 100%; }
.stage__title .nowrap { white-space: nowrap; }
.stage__title { color: var(--color-white); max-width: 20ch; }
.stage__lead {
  margin-top: var(--space-4);
  max-width: 820px;
  color: var(--color-white);
}
.stage__lead--dim { color: var(--color-white-82); }
.stage .cta { margin-top: var(--space-4); }
/* subpage stage titles sit one weight above section titles (hierarchy);
   the home hero (.stage--tall) keeps the original weight */
.stage:not(.stage--tall) .stage__title { font-weight: 600; }
/* single-phrase service titles stay on one line from tablet up (size gives
   way, never wraps); phones wrap normally at full stage size.
   .stage prefix outranks the >=1200 type lock */
@media (min-width: 900px) {
  .stage .stage__title--oneline { white-space: nowrap; font-size: min(var(--type-stage-size), 5.6vw); }
}
/* Zweizeiler mit festen Umbrüchen: die 20ch-Deckelung greift hier nicht,
   die Größe gibt nach, bevor eine dritte Zeile entsteht */
.stage .stage__title--zwei { max-width: none; font-size: min(var(--type-stage-size), 5.5vw); }
/* the expertise family breathes more before the first section */
.stage--service, .stage--airy { padding-bottom: var(--space-12); }
.stage__caret {
  display: inline-block; width: 0.06em; height: 0.74em; margin-left: 0.08em;
  background: currentColor; vertical-align: baseline;
  animation: caret-blink 1s steps(1) infinite;
}
.stage__caret.is-done { animation: none; opacity: 0; }
@keyframes caret-blink { 50% { opacity: 0; } }
.stage__kicker {
  display: block;
  font-size: clamp(18px, 2.2vw, var(--type-kicker-size));
  font-weight: var(--type-kicker-weight);
  line-height: 1.25;
  text-transform: uppercase;
  margin-bottom: var(--space-1);
}
/* back arrow on subpages — glass round, sits under the nav */
.back {
  position: absolute; top: 100px; left: var(--edge); z-index: 3;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 0;
  font-size: 14px; font-weight: 400; letter-spacing: 0.02em;
  color: var(--color-white); font-size: 15px; opacity: 0.65;
  transition: opacity 0.2s ease, transform 0.3s var(--motion-ease-out);
}
.back:hover { opacity: 1; transform: translateX(-3px); }

/* floating back-to-top (appears after a viewport of scroll) */
.totop {
  position: fixed; right: var(--space-3); bottom: var(--space-3); z-index: 90;
  width: 48px; height: 48px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: var(--color-white); font-size: 18px;
  background: rgba(8, 8, 8, 0.55);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.2);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  opacity: 0; pointer-events: none; transform: translateY(8px);
  transition: opacity 0.3s ease, transform 0.3s var(--motion-ease-out);
}
.totop.is-visible { opacity: 1; pointer-events: auto; transform: none; }

/* ================= GENERIC SECTION =================================== */
.sec { padding: var(--space-12) var(--edge); }
.sec--white { background: var(--color-white); color: var(--color-ink); }
.sec--black { background: var(--color-black); color: var(--color-white); position: relative; overflow: hidden; }
.sec__title { margin-bottom: var(--space-6); }
.sec--black .sec__title { color: var(--color-white); }

/* ---- hero cube grid (home stage) — invisible until hovered --------- */
.hero__grid {
  position: absolute; top: 0; left: 0; z-index: 2;
  display: grid;
  grid-template-columns: repeat(var(--cols, 26), 56px);
  grid-auto-rows: 56px;
}
.hero__cube { position: relative; }
.hero__cube-fill {
  position: absolute; inset: 0; opacity: 0;
  background: rgba(255, 255, 255, 0.17);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.95),
              0 0 16px rgba(255, 255, 255, 0.3);
}
.hero__cube.is-on .hero__cube-fill,
.hero__cube.is-shimmer .hero__cube-fill {
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.hero__cube.is-on { z-index: 1; }
.hero__cube.is-on .hero__cube-fill {
  animation-name: cube-morph;
  animation-duration: var(--dur, 1400ms);
  animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
  animation-fill-mode: both;
}
.hero__cube.is-shimmer .hero__cube-fill {
  animation-name: cube-morph;
  animation-duration: var(--dur, 2200ms);
  animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
  animation-fill-mode: both;
}
@keyframes cube-morph {
  0%   { opacity: 0;              transform: scale(0.9);  border-radius: 10%; }
  12%  { opacity: var(--peak, 1); transform: scale(1.03); border-radius: 2%; }
  42%  { opacity: var(--peak, 1); transform: scale(1);    border-radius: 0; }
  100% { opacity: 0;              transform: scale(0.96); border-radius: 8%; }
}
.stage--tall .stage__inner { z-index: 3; pointer-events: none; }
.stage--tall .stage__title { font-size: min(var(--type-stage-size), 5.5vw); }
.stage--tall .stage__title .nowrap { white-space: nowrap; }
.stage--tall .stage__inner a { pointer-events: auto; }

/* ================= LOGO BAR ========================================= */
.logo-bar {
  height: 151px; background: var(--color-bg);
  display: flex; align-items: center; overflow: hidden;
}
.logo-bar__track {
  display: flex; align-items: center;
  flex: none; width: max-content;
  will-change: transform;
  animation: logo-marquee 80s linear infinite;
}
/* two identical sequences, each carrying its own gaps and trailing gap,
   so the -50% loop point is seamless */
.logo-bar__seq {
  display: flex; align-items: center; flex: none;
  gap: var(--space-6); padding-right: var(--space-6);
}
@keyframes logo-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.logo-bar__logo { flex: none; opacity: 0.95; }
.logo-bar__logo[src$="partner-3.svg"]  { width: 104px; height: 40px; }
.logo-bar__logo[src$="partner-4.svg"]  { width: 112px; height: 24px; }
.logo-bar__logo[src$="partner-5.svg"]  { width: 78px;  height: 31px; }
.logo-bar__logo[src$="partner-6.svg"]  { width: 115px; height: 23px; }
.logo-bar__logo[src$="partner-7.svg"]  { width: 154px; height: 18px; }
.logo-bar__logo[src$="partner-8.svg"]  { width: 81px;  height: 29px; }
.logo-bar__logo[src$="partner-9.svg"]  { width: 71px;  height: 34px; }
.logo-bar__logo[src$="partner-10.svg"] { width: 95px;  height: 26px; }
.logo-bar__logo[src$="partner-11.svg"] { width: 69px;  height: 32px; }
.logo-bar__logo[src$="partner-12.svg"] { width: 91px;  height: 26px; }
.logo-bar__logo[src$="partner-13.svg"] { width: 110px; height: 40px; }
.logo-bar__logo[src$="partner-14.svg"] { width: 83px;  height: 44px; }
.logo-bar__logo[src$="partner-15.svg"] { width: 89px;  height: 48px; }
.logo-bar__logo[src$="partner-16.svg"] { width: 114px; height: 33px; }
/* Aus den Referenzen: dieselbe Marke wie auf der Karte, nur unbeschnitten —
   im Band steht sie zwischen Logos, die alle ihren Schutzraum mitbringen. */
.logo-bar__logo[src$="kuka.svg"] { width: 123px; height: 21px; }
.logo-bar__logo[src$="deutsche-windtechnik.svg"] { width: 109px; height: 24px; }
.logo-bar__logo[src$="mueller-fenster-fassaden.svg"] { width: 97px; height: 27px; }
.logo-bar__logo[src$="datenschutz-nord.svg"] { width: 95px; height: 27px; }
/* Nicht auf .png enden lassen: der Build liefert PNG und JPEG als WebP aus
   und schreibt die Verweise um — eine Regel auf "hamburg.png" gölte dann
   in dist/ nicht mehr, und das Wappen stünde in seiner vollen Dateigröße
   im Band. Der Stamm mit Punkt trifft beide Endungen. */
.logo-bar__logo[src*="/hamburg."] { width: 83px; height: 62px; }
.logo-bar__logo[src*="/big-direkt."] { width: 156px; height: 67px; }
.logo-bar__logo[src*="/bitmarck."] { width: 134px; height: 19px; }
.logo-bar__logo[src*="/debeka-bkk."] { width: 74px; height: 74px; }

/* ================= CARD SLIDER (what-we-do / jobs) =================== */
.slider-sec { position: relative; background: var(--color-white); padding: var(--space-8) 0 var(--space-8); }
.slider-sec__title { margin-left: var(--edge); color: var(--color-ink); }
.slider { overflow-x: clip; overflow-y: visible; margin-top: var(--space-6); }
.slider__track {
  display: flex; gap: var(--space-3);
  padding-inline: var(--edge);
  width: max-content;
  cursor: grab; touch-action: pan-y; will-change: transform;
}
.slider__track.is-dragging { cursor: grabbing; }
/* 584 = Bild 180 + Abstand 32 + Textspalte 348 + Innenrand 24, minus der
   beiden Rahmenpixel: die Spalte wird 346 px breit. Bei 560 schrumpfte sie
   als Flex-Element auf 322, und "Automatisierung &" fand mit 343 px keinen
   Platz mehr — der Browser brach vor dem &, der harte <br> dahinter, und
   das Zeichen stand allein in einer eigenen Zeile. */
.wcard {
  flex: none; min-height: 320px; width: 584px;
  display: flex; gap: var(--space-4); padding-right: var(--space-3);
  background: var(--color-white);
  border: 1px solid rgba(0, 0, 0, 0.2);
  border-radius: var(--radius-default);
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  overflow: hidden;
  transition: transform 0.35s var(--motion-ease-out);
}
.wcard:hover { transform: translateY(-6px); }
.wcard--klickbar { cursor: pointer; }
.wcard__img { flex: none; width: 180px; height: 100%; overflow: hidden; background: #000; }
.wcard__img img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; user-select: none; }
.wcard__body { position: relative; display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-5) 0 112px; min-width: 0; width: 348px; }
.wcard__name { color: var(--color-ink); }
.wcard__name .nowrap { white-space: nowrap; }
.wcard__desc { color: var(--color-ink); max-width: 300px; }
/* one baseline for every card's CTA, independent of text length */
.wcard__body .cta, .wcard__body .cta--light { position: absolute; bottom: var(--space-5); align-self: flex-start; }
/* the black closer card */
.wcard--ink {
  width: 407px; padding: 0 26px 0 40px;
  background: var(--color-bg);
  border-color: rgba(0, 0, 0, 1);
  color: var(--color-white);
}
.wcard--ink .wcard__body { width: 100%; }
.wcard--ink .wcard__name, .wcard--ink .wcard__desc { color: var(--color-white); }
/* progress bar */
.slider-bar {
  position: relative; height: 8px; margin: var(--space-3) var(--edge) 0;
  cursor: pointer; touch-action: none;
  border-radius: var(--radius-cta);
  background: rgba(255, 255, 255, 0.29);
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
}
/* Greiffläche über die 8px hinaus, damit die Leiste mit der Maus zu treffen ist */
.slider-bar::before { content: ""; position: absolute; inset: -10px 0; }
.slider-bar__thumb {
  position: absolute; top: 1px; left: 1px; height: 6px; width: 30%;
  border-radius: var(--radius-cta); background: var(--color-black);
}

/* ================= PROMPTER (image CTA band) ========================= */
.prompter {
  position: relative; height: 499px; overflow: hidden;
  background: var(--color-bg);
  display: flex; align-items: center; justify-content: center; text-align: center;
}
.prompter__bg {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  pointer-events: none; user-select: none;
  opacity: 0; transition: opacity 0.45s ease;
}
.prompter__bg.is-loaded { opacity: 1; }
/* readability without the harshness: dark only behind the text,
   transparent toward the edges so the render keeps its color */
.prompter__scrim {
  position: absolute; inset: 0;
  background: radial-gradient(58% 66% at 50% 50%, rgba(0, 0, 0, 0.32), rgba(0, 0, 0, 0) 72%);
}
.prompter__fx {
  position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none;
  opacity: 0; transition: opacity 0.45s ease;
}
.prompter__fx.is-loaded { opacity: 1; }
.prompter__inner { position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center; gap: 21px; padding-inline: var(--edge); }
.prompter__title { color: var(--color-white); max-width: 760px; }
.prompter__sub { color: var(--color-white); font-weight: 300; margin-top: -8px; }

/* ================= ABOUT (home band) ================================ */
.about {
  background: linear-gradient(172deg, #F4F4F4 0%, #FFFFFF 100%);
  color: var(--color-ink);
  display: grid; grid-template-columns: 1fr 1fr;
  gap: var(--space-8) var(--space-8);
  padding: var(--space-8) var(--edge);
  align-items: center;
}
.about__col { display: flex; flex-direction: column; gap: var(--space-5); align-items: flex-start; max-width: 496px; }
.about__text { display: flex; flex-direction: column; gap: 1.2em; }
.metrics { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-6) var(--space-4); }
.metric { display: flex; flex-direction: column; gap: var(--space-1); }
.metric__num { color: var(--color-ink); font-variant-numeric: tabular-nums; min-width: 4ch; }
.metric__label {
  font-size: var(--type-small-size); font-weight: 300;
  letter-spacing: 0.06em; text-transform: uppercase; color: var(--color-ink);
}
/* 4-across variant (about page) */
.metrics--row { grid-template-columns: repeat(4, 1fr); text-align: center; padding: var(--space-8) var(--edge); background: var(--color-white); }
.metrics--row .metric { align-items: center; }
.metrics--dark { background: var(--color-black); }
.metrics--dark .metric__num, .metrics--dark .metric__label { color: var(--color-white); }

/* ================= INDUSTRIES (home) ================================ */
.industries { background: var(--color-black); color: var(--color-white); padding: var(--space-8) 0 var(--space-12); }
.industries__title { margin: 0 var(--edge) var(--space-5); }
.ind-rail { display: flex; }
/* Ein <a>: jede Kachel führt zu den Referenzen, meist mit gesetztem
   Branchenfilter. Deshalb color/text-decoration zurücksetzen — das Aussehen
   soll sich vom bisherigen <div> nicht unterscheiden. */
.ind {
  flex: 1 1 0; min-width: 0;
  display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
  color: inherit; text-decoration: none;
  transition: flex-grow 560ms var(--motion-ease-out);
}
.ind:focus-visible { outline: 2px solid var(--color-white); outline-offset: 3px; }
/* the fan: hovered panel opens, siblings tuck in (from v5) */
.ind-rail:hover .ind { flex-grow: 0.82; }
.ind-rail .ind:hover { flex-grow: 3.2; }
.ind__panel { position: relative; width: 100%; height: 560px; overflow: hidden; background: var(--gradient-ind-default); }
.ind__panel img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: var(--crop, 50% 50%);
  user-select: none; pointer-events: none;
  transition: transform 0.6s var(--motion-ease-out), filter 0.45s ease;
}
.ind:hover .ind__panel img { transform: scale(1.12); }
.ind-rail:hover .ind:not(:hover) .ind__panel img { filter: grayscale(0.5) brightness(0.95); }
/* art-directed crops, taken from the Figma placements */
.ind--healthcare   { --crop: 74% 51%; }
.ind--transport    { --crop: 42% 0%; }
.ind--logistics    { --crop: 62% 55%; }
.ind--construction { --crop: 78% 0%; }
.ind--energy       { --crop: 52% 50%; }
.ind--public       { --crop: 66% 0%; }
.ind--education    { --crop: 50% 50%; }
.ind--data         { --crop: 19% 68%; }
.ind__label {
  font-size: clamp(13px, 1.25vw, 16px); font-weight: 400; letter-spacing: 0.04em;
  text-transform: uppercase; text-align: center; color: var(--color-white);
  line-height: 1.25; min-height: 40px;
  transition: color 0.35s ease, font-size 0.35s ease, letter-spacing 0.35s ease;
}
/* hovering the rail dims the other labels; the active one grows and leads */
.ind-rail:hover .ind__label { color: rgba(255, 255, 255, 0.5); font-size: 12px; letter-spacing: 0.02em; }
.ind-rail .ind:hover .ind__label { color: var(--color-white); font-size: clamp(15px, 1.5vw, 22px); font-weight: 400; letter-spacing: 0.04em; }
.industries__cta { display: flex; justify-content: center; margin-top: var(--space-5); }

/* ================= CLOSING MORPH (home) =============================
   Scroll-scrubbed: full-viewport white panel shrinks to a card, the
   dark "with" half grows beside it, the card flips to the JAAI logo.
   All sizes driven by scripts/finale.js. */
.closing { position: relative; height: 390vh; background: var(--color-bg); }
.closing__pin { position: sticky; top: 0; height: 100vh; overflow: hidden; }
.morph { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); perspective: 1800px; }
.morph__flip { position: relative; transform-style: preserve-3d; will-change: transform; }
.morph__front, .morph__back {
  position: absolute; inset: 0;
  -webkit-backface-visibility: hidden; backface-visibility: hidden;
  border-radius: inherit; overflow: hidden;
}
.morph__front { display: flex; align-items: stretch; outline: 3px solid var(--color-white); outline-offset: -3px; box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45); }
.morph__white, .morph__with {
  display: flex; align-items: center; justify-content: center; white-space: nowrap;
  font-family: var(--type-family-sans); text-transform: uppercase; line-height: 1;
}
.morph__white { flex: none; background: var(--color-white); color: var(--color-ink); font-weight: 400; }
.morph__with { flex: none; background: var(--color-bg); color: var(--color-white); font-size: 32px; font-weight: 400; overflow: hidden; border-left: 3px solid var(--color-white); }
.morph__back { transform: rotateY(180deg); background: var(--color-bg); display: grid; place-items: center; }
.morph__back svg { width: 90%; height: auto; display: block; }
/* Der Rückzug — drei Takte à 1,3 s, sobald die Karte fertig gedreht ist:
   der weiße Block fährt heraus und verschluckt jaai, der Rahmen zieht
   sich als Strich zurück, die Lettern spreizen zur neuen Wortmarke.
   Rückwärts scrollen spielt alles gespiegelt zurück. */
.rt-jaai { fill: var(--color-bg); }
.rt-blockrect, .rt-wm .lt { will-change: transform; }
.rt-frame { stroke-dasharray: 100; stroke-dashoffset: 0; }
/* Der Schlussakkord: steht die neue Wortmarke, glüht das AI einmal im
   Markenverlauf auf und kehrt zu Weiß zurück — einmal von selbst beim
   Ankommen, danach bei jedem Überfahren des Logos. Das weiße Original
   blendet gegengleich aus, sonst schimmert eine helle Kante durch. */
.rt-ai-shine { opacity: 0; }
.rt-wm .lt:nth-last-child(-n+2) > path:first-child { opacity: 1; }
.closing.rt-shine-auto .rt-ai-shine,
.closing.rt-done .morph:hover .rt-ai-shine {
  animation: rt-shine 1.8s ease-in-out 0.1s 1;
}
.closing.rt-shine-auto .rt-wm .lt:nth-last-child(-n+2) > path:first-child,
.closing.rt-done .morph:hover .rt-wm .lt:nth-last-child(-n+2) > path:first-child {
  animation: rt-shine-weg 1.8s ease-in-out 0.1s 1;
}
@keyframes rt-shine {
  0% { opacity: 0; } 32% { opacity: 1; } 68% { opacity: 1; } 100% { opacity: 0; }
}
@keyframes rt-shine-weg {
  0% { opacity: 1; } 32% { opacity: 0; } 68% { opacity: 0; } 100% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .closing.rt-shine-auto .rt-ai-shine, .closing.rt-done .morph:hover .rt-ai-shine,
  .closing.rt-shine-auto .rt-wm .lt:nth-last-child(-n+2) > path:first-child,
  .closing.rt-done .morph:hover .rt-wm .lt:nth-last-child(-n+2) > path:first-child { animation: none; }
}
.closing__cta { position: absolute; left: 0; right: 0; margin-inline: auto; width: max-content; top: calc(50% + 148px); opacity: 0; }
@media (max-width: 768px) { .closing { height: 220vh; } }

/* ================= MARQUEE ========================================== */
.marquee { background: var(--color-black); overflow: hidden; padding: 12px 0 0; height: auto; }
.marquee__track { display: flex; gap: 10px; width: max-content; will-change: transform; animation: marquee-run 22s linear infinite; }
.marquee__track span {
  font-size: var(--type-marquee-size); font-weight: var(--type-marquee-weight);
  line-height: var(--type-marquee-line); letter-spacing: 0.02em;
  text-transform: uppercase; color: var(--color-white); white-space: nowrap;
}
@keyframes marquee-run { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* ================= EDITORIAL INDEX ROWS (what's included) =========== */
.index { background: var(--color-white); color: var(--color-ink); padding: var(--space-12) var(--edge); }
.index__rows { margin-top: var(--space-4); }
.index__row {
  display: grid;
  grid-template-columns: 56px minmax(0, 1.55fr) minmax(0, 1fr);
  gap: var(--space-6);
  align-items: center;
  padding-block: var(--space-4);
  border-bottom: 1px solid rgba(0, 0, 0, 0.35);
}
.index__row:last-child { border-bottom: 0; }
.index__num { font-family: var(--type-family-cta); font-size: 32px; font-weight: 600; width: max-content; }
.index__title { color: var(--color-ink); }
/* long German compounds hyphenate instead of bulging the column */
.index__title:lang(de), .uc-card__name:lang(de) { hyphens: auto; -webkit-hyphens: auto; }
.index__desc { max-width: 360px; justify-self: end; color: var(--color-ink); }

/* Aufklappbare Zeilen ("Was wir bieten"). Die Geometrie der Zeile bleibt,
   sie wandert nur auf den Knopf; Plus, Drehung und Bewegung sind die des
   FAQ weiter unten — dieselbe Geste soll sich überall gleich anfühlen. */
.index__row--fold { display: block; padding-block: 0; }
.index__h { margin: 0; font: inherit; }
.index__head {
  width: 100%; display: grid;
  grid-template-columns: 56px minmax(0, 1.55fr) minmax(0, 1fr) 32px;
  gap: var(--space-6); align-items: center;
  padding-block: var(--space-4); text-align: left;
  font: inherit; color: inherit; background: none; border: 0;
}
/* Linksbündig statt rechtsbündig wie auf den Nachbarseiten: dort sind alle
   vier Kurztexte lang genug, um die Spalte zu füllen, hier sind zwei
   einzeilig. Rechts ausgerichtete Blöcke mit linksbündigem Text lassen
   dann die linke Kante von Zeile zu Zeile springen. */
.index__head .index__desc { justify-self: start; }
.index__plus {
  font-family: var(--type-family-cta); font-size: 24px; font-weight: 400;
  justify-self: end; transition: transform 0.3s var(--motion-ease-out);
}
.index__row--fold.is-open .index__plus { transform: rotate(45deg); }
.index__fold { overflow: hidden; max-height: 0; transition: max-height 0.4s var(--motion-ease-out); }
/* Der Inhalt rückt auf die Titelspalte ein, damit die Nummernspalte frei
   bleibt und die Zeile beim Aufklappen nicht nach links kippt. */
.index__foldinner {
  padding: 0 0 var(--space-5) calc(56px + var(--space-6));
  display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-3);
}
.index__foldinner p { max-width: 62ch; font-weight: 300; color: var(--color-muted); }
/* Bausteine eines Workshops. Vorher standen sie als Pillen in einer Reihe
   wie die Branchenchips der Referenzen — die sind aber Schaltflächen, und
   die Pille direkt über dem Knopf ließ Inhalt und Aktion gleich aussehen.
   Jetzt sind es zwei ruhige Spalten, getrennt von derselben Verlaufslinie,
   die die FAQ-Einträge unten trennt: gelesen wird hier, nicht geklickt. */
.index__bausteine {
  width: 100%; max-width: 760px;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: var(--space-6);
  list-style: none; padding: 0; margin: 0;
}
/* Haarlinie statt Verlauf: acht davon stehen hier eng untereinander, in
   Farbe wird die Liste lauter als die Zeile, zu der sie gehört. Die Farbe
   bleibt den Ziffern und dem Plus. */
.index__bausteine li {
  padding-block: var(--space-2);
  font-size: 16px; font-weight: 300; color: var(--color-ink);
  border-bottom: 1px solid rgba(0, 0, 0, 0.15);
}
/* Die letzte Zeile jeder Spalte steht ohne Linie, sonst hängt unter der
   Liste ein Strich, der nichts mehr trennt. Die beiden letzten Einträge
   sind immer die untersten ihrer Spalte — bei gerader wie bei ungerader
   Anzahl. */
.index__bausteine li:last-child, .index__bausteine li:nth-last-child(2) { border-bottom: 0; }
/* Schmal wird daraus eine Spalte — zu zweit blieben je rund 110px, die
   längeren Einträge brachen dann dreizeilig um. Dann trennt wieder jede
   Zeile außer der letzten. */
@media (max-width: 640px) {
  .index__bausteine { grid-template-columns: 1fr; }
  .index__bausteine li:nth-last-child(2) { border-bottom: 1px solid rgba(0, 0, 0, 0.15); }
  .index__bausteine li:last-child { border-bottom: 0; }
}

/* Aktion im Aufklapper: Textzeile mit Pfeil statt Glas-Pille. Die Pille ist
   für Bildgrund gebaut (weiß auf weiß), auf der weißen Sektion blieb von
   ihr nur ein Schatten. Dieselbe Geste wie die Terminzeilen auf /events/. */
.index__link {
  font-family: var(--type-family-cta); font-size: 18px; font-weight: 500;
  color: var(--color-ink); white-space: nowrap;
}
.index__link:hover { text-decoration: underline; text-underline-offset: 4px; }
.index__arrow { display: inline-block; transition: transform 0.3s var(--motion-ease-out); }
.index__link:hover .index__arrow { transform: translateX(4px); }
.index__link:hover .index__arrow--extern { transform: translate(3px, -3px); }
@media (prefers-reduced-motion: reduce) { .index__arrow { transition: none; } }

/* ================= SOLVES BAND ====================================== */
.solves { background: var(--color-black); color: var(--color-white); padding: var(--space-12) 0; position: relative; overflow: hidden; }
.solves__title { position: relative; margin: 0 var(--edge) var(--space-6); color: var(--color-white); }
.solves__list { position: relative; display: flex; flex-direction: column; gap: var(--space-5); }
.solves__item { padding-inline: var(--edge); }
.solves__item p { font-size: clamp(18px, 1.7vw, 24px); font-weight: 300; line-height: 1.9; }
/* the gradient rule with an arrowhead, drawn under each line */
.solves__item .solves__line {
  position: relative; display: block; height: 1px; margin-top: var(--space-1);
  background: var(--gradient-line); opacity: 0.9;
  transform-origin: left center;
}
.solves__item .solves__line::after {
  content: ""; position: absolute; right: -1px; top: -3.5px;
  width: 8px; height: 8px;
  border-top: 1.5px solid #4865C6; border-right: 1.5px solid #4865C6;
  transform: rotate(45deg);
}
.solves__item:nth-child(2) { padding-left: calc(var(--edge) + 8%); }
.solves__item:nth-child(3) { padding-left: calc(var(--edge) + 16%); }
.solves__item:nth-child(4) { padding-left: calc(var(--edge) + 24%); }
/* enter from beyond the left viewport edge, then stay. The item itself
   never moves (an element translated off-viewport can't intersect, so the
   observer would never fire) — its content sweeps in instead. */
.solves__item[data-reveal] { opacity: 1; transform: none; }
.solves__item[data-reveal] p,
.solves__item[data-reveal] .solves__line {
  transform: translateX(-110vw);
  transition: transform 0.85s var(--motion-ease-out);
  transition-delay: var(--reveal-delay, 0ms);
}
.solves__item[data-reveal].is-in p,
.solves__item[data-reveal].is-in .solves__line { transform: none; }

/* ================= TIMELINE (how we proceed) ======================== */
.timeline-sec { background: var(--color-black); color: var(--color-white); padding: var(--space-12) var(--edge); }
.timeline { position: relative; margin-top: var(--space-8); }
.timeline__line { position: absolute; left: 0; right: 0; top: 69px; height: 1px; background: rgba(255, 255, 255, 0.9); }
.timeline__steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-4); }
.tstep { position: relative; padding-top: 108px; }
.tstep::before {
  content: ""; position: absolute; left: 0; top: 64px;
  width: 12px; height: 12px; border-radius: 50%; background: var(--color-white);
}
.tstep__num { position: absolute; top: 0; left: 0; font-family: var(--type-family-cta); font-size: 24px; font-weight: 600; }
.tstep__title { font-size: 24px; font-weight: 500; line-height: 1.2; margin-bottom: 5px; }
.tstep__desc { font-size: 14px; font-weight: 300; line-height: 1.45; max-width: 240px; color: var(--color-white); }
.tstep__desc--lg { font-size: clamp(16px, 1.6vw, 24px); max-width: 300px; line-height: 1.2; }

/* ================= GLASS CARDS (how we work / looking back) ========= */

/* ================= FAQ ============================================== */
.faq { background: var(--color-white); color: var(--color-ink); padding: var(--space-12) var(--edge); }
.faq__inner { width: 100%; }
.faq__item { border-bottom: 1px solid transparent; border-image: var(--gradient-line) 1; border-image-slice: 0 0 1 0; border-bottom-width: 1px; border-bottom-style: solid; }
.faq__item:last-child { border-bottom: 0; }
.faq__q {
  width: 100%; display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
  padding-block: var(--space-3); text-align: left;
  font-size: clamp(18px, 1.8vw, 24px); font-weight: 300; line-height: 1.25; color: var(--color-ink);
}
.faq__plus { font-family: var(--type-family-cta); font-size: 24px; font-weight: 400; transition: transform 0.3s var(--motion-ease-out); }
.faq__item.is-open .faq__plus { transform: rotate(45deg); }
/* Derselbe Aufbau wie .index__foldinner: Spalte, Abstand über gap statt
   über das Padding der Absätze. Der Grund ist der Verweis am Ende einer
   Antwort — als Inline-Element in einem Blockcontainer klebte er unter dem
   letzten Absatz und am unteren Rand, während er oben in den Aufklappern
   rundum Luft hat. Mit align-items: flex-start nimmt er wie dort nur seine
   eigene Breite ein, statt über die ganze Zeile zu reichen.

   Der untere Abstand hängt am letzten Kind, nicht als Padding am Container:
   Padding zählt nicht zu max-height und bliebe im zugeklappten Zustand als
   Lücke unter jeder Frage stehen. */
.faq__a {
  overflow: hidden; max-height: 0; transition: max-height 0.4s var(--motion-ease-out);
  display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-3);
}
.faq__a > :last-child { margin-bottom: var(--space-3); }
.faq__a p { max-width: 62ch; font-weight: 300; color: var(--color-muted); }
/* Wie bei .story: der Fließtext steht auf 300, und das <b> des Browsers
   ist "bolder" — von 300 aus landet das nach CSS-Stufenregel bei 400 und
   ist neben 300 nicht zu sehen. Ein eigener Wert macht die Hervorhebung
   wieder zu einer. */
.faq__a b { font-weight: 500; }

/* ================= GET STARTED (glow cards) ========================= */
.getstarted { background: var(--color-white); color: var(--color-ink); padding: var(--space-12) var(--edge); }
.glowcards { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); margin-top: var(--space-6); }
.glowcard {
  position: relative; overflow: hidden; min-height: 134px;
  background: var(--color-black); color: var(--color-white);
  border-radius: var(--radius-default);
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.25);
  padding: var(--space-4);
  display: flex; flex-direction: column; gap: 11px; justify-content: center;
  transition: transform 0.35s var(--motion-ease-out);
}
.glowcard:hover { transform: translateY(-6px); }
/* picture behind the content with the uc-card 50% scrim */
.glowcard__bg {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%; object-fit: cover;
}
.glowcard::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background: rgba(0, 0, 0, 0.5);
  pointer-events: none;
}
.glowcard > :not(.glowcard__bg) { position: relative; z-index: 2; }
.glowcard--a .glowcard__bg { object-position: center 75%; }
.glowcard--b .glowcard__bg { object-position: center 58%; }
.glowcard__title { color: var(--color-white); }
.glowcard__link { font-family: var(--type-family-cta); font-weight: 400; font-size: 16px; color: var(--color-white); position: relative; z-index: 2; }

/* ================= USE-CASE GRID ==================================== */
.ucwrap { background: var(--color-white); color: var(--color-ink); padding: var(--space-12) var(--edge); }
.uc-filter { display: flex; flex-wrap: wrap; gap: var(--space-1); margin-bottom: var(--space-9, 72px); }
.uc-chip {
  padding: var(--space-1) var(--space-2);
  border: 1px solid rgba(0, 0, 0, 1); border-radius: var(--radius-cta);
  font-size: 14px; color: var(--color-ink); background: transparent;
  transition: background 0.2s ease, color 0.2s ease;
}
.uc-chip:hover { background: rgba(0, 0, 0, 0.06); }
.uc-chip.is-active { background: var(--color-black); color: var(--color-white); }
/* Chip ohne eine einzige Referenz dahinter — main.js setzt das. */
.uc-chip.is-hidden { display: none; }
/* Branchenfilter rechts in der Leiste. Ein Klappmenü und keine weitere
   Chipreihe: die Branchen sind ein Dutzend und wachsen mit jeder Referenz —
   als Chips wären sie zwei Zeilen und würden die Fähigkeiten erschlagen,
   die den Hauptweg durch die Seite bilden. Ausklappen statt ausbreiten.

   Eigener Knopf mit eigener Liste, kein <select>: das Auswahlfeld des
   Systems ließ sich geschlossen wie ein Chip anmalen, aber die aufgeklappte
   Liste gehört dem Betriebssystem — blaue Markierung, Systemschrift, eigene
   Ecken. Das war die einzige Stelle der Website, die nicht nach uns aussah.

   Zwei Vorlagen, beide aus dem Bestand: geschlossen ist der Knopf ein Chip
   wie die daneben (.uc-chip, gleiche Höhe, gleiche Kontur), offen ist die
   Liste das Klappmenü der Navigation (.nav__sub) — dieselbe Geometrie,
   dieselbe Bewegung, nur helle Farben. Das ist die Regel des Styleguide für
   Bedienelemente auf hellem Grund: gleiche Form, umgekehrte Farben, so wie
   .cta zu .cta--light steht. */
.uc-branche { position: relative; margin-left: auto; }
.uc-branche__knopf { display: inline-flex; align-items: center; gap: var(--space-1); }
.uc-branche__pfeil, .wahl__pfeil { flex: none; transition: transform 0.25s var(--motion-ease-out); }
.uc-branche.is-open .uc-branche__pfeil, .wahl.is-open .wahl__pfeil { transform: rotate(180deg); }
/* Helle Fassung des Navigations-Klappmenüs: Radius, Innenabstand, Schatten
   und Bewegung sind dieselben, die Farben die der weißen Karten. */
.uc-branche__liste, .wahl__liste {
  position: absolute; z-index: 5; top: calc(100% + var(--space-1)); right: 0;
  min-width: 100%; padding: var(--space-1);
  background: var(--color-white);
  border: 1px solid rgba(0, 0, 0, 0.2);
  border-radius: var(--radius-default);
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  opacity: 0; visibility: hidden; pointer-events: none;
  transform: translateY(6px) scale(0.98); transform-origin: top right;
  transition: opacity 0.25s var(--motion-ease-out), transform 0.25s var(--motion-ease-out), visibility 0.25s;
}
/* Seit dem 27.08.2026 stehen elf Branchen im Menü statt sechs. Aufgeklappt
   ist die Liste damit rund 440px hoch und lief bei kleinem Fenster oder weit
   unten stehendem Filter aus dem Bild. Sie rollt jetzt, statt zu verschwinden
   — nur diese Liste, nicht die des Sprachwählers in der Navigation. */
.uc-branche__liste { max-height: 70vh; overflow-y: auto; }
.uc-branche.is-open .uc-branche__liste, .wahl.is-open .wahl__liste {
  opacity: 1; visibility: visible; pointer-events: auto;
  transform: translateY(0) scale(1);
}
.uc-branche__option, .wahl__option {
  display: block; width: 100%; text-align: left;
  padding: 10px 14px; border-radius: var(--radius-default);
  font-size: 14px; color: var(--color-ink); background: transparent;
  white-space: nowrap;
  transition: background 0.2s ease, color 0.2s ease;
}
.uc-branche__option:hover, .wahl__option:hover { background: rgba(0, 0, 0, 0.06); }
/* Gewählt sieht aus wie ein aktiver Chip — schwarz gefüllt heißt auf dieser
   Seite überall "dieser Filter greift". */
.uc-branche__option[aria-selected="true"], .wahl__option[aria-selected="true"] { background: var(--color-black); color: var(--color-white); }
/* Branche ohne eine einzige Referenz dahinter — main.js setzt das, dieselbe
   Regel wie bei den Chips. */
.uc-branche__option.is-hidden { display: none; }
.uc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3); margin-top: var(--space-6); }
/* Alle Referenzkästchen gleich hoch. grid-auto-rows: 1fr zieht jede Reihe auf
   das Maß der höchsten — ohne eine feste Höhe in Pixeln, die bei jeder
   Fensterbreite wieder falsch wäre. Die Karte selbst darf weiter wachsen
   (min-height oben), nur eben nicht mehr allein: sie zieht ihre Reihe mit,
   und die Reihe zieht alle anderen nach.

   Nur das Referenzraster. Die Ausgründungen unten haben sehr verschieden
   lange Texte, und eine gemeinsame Höhe würde sich am längsten ausrichten —
   dann stehen neun Karten mit viel Leerraum da. */
/* Alle Referenzkästchen gleich hoch — aber die Höhe darf nicht davon
   abhängen, welche Karten gerade sichtbar sind. Mit grid-auto-rows: 1fr war
   genau das der Fall: der Filter versteckt Karten, die höchste verbliebene
   bestimmte die Reihe, und beim Wechsel von "Alle" auf "Sprachverarbeitung"
   sprang die Kartenhöhe von 500 auf 314 Pixel.

   Deshalb rechnet main.js die Höhe der höchsten Karte einmal aus — mit allen
   Karten sichtbar — und legt sie als --uc-kartenhoehe ab. Die ist eine feste
   Zahl und ändert sich beim Filtern nicht. Der Rückfallwert greift, solange
   das Skript nicht gelaufen ist. */
.uc-grid--referenzen { grid-auto-rows: auto; }
.uc-grid--referenzen > .uc-card { min-height: var(--uc-kartenhoehe, 288px); }
.uc-card {
  position: relative; overflow: hidden;
  border-radius: var(--radius-default);
  background: var(--color-bg);
  color: var(--color-white);
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.25);
  padding: var(--space-4);
  display: flex; flex-direction: column; gap: var(--space-1);
  min-height: 288px;      /* description space is reserved — no grid jump */
}
.uc-card.is-hidden { display: none; }
/* industry picture behind the card content, 50% black scrim on top
   (per design); hovering fades both out so the card turns solid black */
/* Das Kartenbild füllt die Karte und wird dabei beschnitten — und zwar
   erheblich: die Karte steht hochkant (rund 352×469), die Bilder sind quer
   im Verhältnis 4:3. Bei object-fit: cover bleiben davon nur die mittleren
   56 % der Bildbreite übrig, links und rechts fallen je 22 % weg.

   Das ist die Falle bei jedem neuen Bild: was am Bildrand steht, ist auf der
   Karte halb verschwunden — ein Roboter, der im Vollbild eindrucksvoll rechts
   steht, zeigt auf der Karte nur noch seinen Arm. Motive gehören deshalb in
   die Mitte.

   Wo das nicht geht, verschiebt --bild-position den Ausschnitt. Der Wert ist
   die waagerechte Position von object-position: 50% ist die Mitte, ein
   größerer Wert holt den rechten Bildteil ins Sichtfenster, ein kleinerer den
   linken. Gesetzt wird er an der Karte:

       <article class="uc-card" style="--bild-position: 62%" …>

   Sparsam benutzen. Wenn ein Bild ihn braucht, ist meist das Bild schuld und
   nicht die Karte — dann lieber ein neues erzeugen, bei dem das Motiv mittig
   steht. */
.uc-card__bg {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%; object-fit: cover;
  object-position: var(--bild-position, 50%) center;
  transition: opacity 0.45s ease;
}
.uc-card::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  /* Verlauf statt Fläche: oben so dunkel wie vorher, weil dort Branche, Titel
     und Tags stehen und lesbar bleiben müssen — nach unten lässt er nach, wo
     im Ruhezustand nichts als Bild ist. Das Motiv kommt damit durch, ohne
     dass die Schrift Kontrast verliert.

     Die Beschreibung erscheint erst beim Überfahren, und dann geht dieser
     Schleier ohnehin auf 0 (Regel darunter) — sie ist von der Abstufung
     also nicht betroffen. */
  background: linear-gradient(to bottom,
    rgba(0, 0, 0, 0.52) 0%,
    rgba(0, 0, 0, 0.5) 40%,
    rgba(0, 0, 0, 0.26) 100%);
  pointer-events: none;
  transition: opacity 0.45s ease;
}
.uc-card--venture::before { content: none; }
.uc-card > :not(.uc-card__bg) { position: relative; z-index: 2; }
.uc-card:hover .uc-card__bg, .uc-card:focus-within .uc-card__bg,
.uc-card:hover::before, .uc-card:focus-within::before { opacity: 0; }
.uc-card__industry { font-size: 10px; font-weight: 300; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-white); }
.uc-card__name { font-size: clamp(18px, 1.8vw, 24px); font-weight: 500; line-height: 1.2; text-transform: uppercase; }
.uc-card__tech { display: flex; flex-wrap: wrap; gap: var(--space-1); margin-top: 4px; }
.uc-card__tech span {
  padding: 2px var(--space-1);
  border: 1px solid rgba(255, 255, 255, 0.45); border-radius: var(--radius-cta);
  font-size: 12px; color: rgba(255, 255, 255, 0.9);
}
.uc-card__desc {
  font-size: 16px; font-weight: 300; line-height: 1.5; color: rgba(255, 255, 255, 0.92);
  margin-top: var(--space-1);
  opacity: 0; transform: translateY(6px);
  transition: opacity 0.35s ease, transform 0.35s var(--motion-ease-out);
}
.uc-card:hover .uc-card__desc,
.uc-card:focus-within .uc-card__desc { opacity: 1; transform: none; }
/* Weiterführender Link auf einer Referenzkarte — Video, Fallstudie, Vortrag.
   Erscheint mit der Beschreibung, nicht davor: die Karte soll im Ruhezustand
   nur Branche, Titel und Tags zeigen, sonst wird aus einem Raster eine
   Linkliste. margin-top: auto setzt ihn an den unteren Rand; trägt die Karte
   ein Partnerlogo, hält deren padding-bottom den Platz frei, sodass Link und
   Logo sich nicht überlagern. */
/* Der Selektor ist absichtlich zweiteilig: die Regel weiter oben,
   `.uc-card > :not(.uc-card__bg) { position: relative }`, zählt zwei
   Klassen und würde ein einfaches `.uc-card__link` überstimmen — das
   `position: absolute` unten wäre dann wirkungslos. */
.uc-card > .uc-card__link {
  font-family: var(--type-family-cta); font-weight: 400; font-size: 14px;
  /* Aus dem Fluss genommen und fest an den Kartenboden gesetzt. Vorher hing
     er am Ende der Flexspalte, und weil Karten mit Partnerlogo je nach
     Logoform 64 bis 88 Pixel Bodenabstand reservieren, ploppte der Link auf
     jeder Karte in anderer Höhe auf — bei sechs Karten in einem Raster fällt
     das als Unruhe auf. Jetzt sitzt er überall gleich: links unten, im
     selben Abstand wie das Logo rechts unten. */
  position: absolute; left: var(--space-4); bottom: var(--space-4);
  /* Rechts Platz für das Partnerlogo lassen. Ohne diese Grenze überlappen
     Link und Logo, sobald die Karten schmaler werden — bei drei Spalten und
     1060 px Fensterbreite sind es 290 px je Karte, und dort schoben sich die
     beiden um bis zu 59 px übereinander. Reicht der Platz nicht, bricht der
     Linktext um und wächst nach oben; die letzte Zeile bleibt auf ihrer
     Höhe, der Ankerpunkt sitzt also weiter überall gleich.

     Die 96px sind ein Standard, kein Gesetz: --logo-breite hebt ihn an, wo
     eine Marke breiter steht. Seit die Schriftzüge einheitlich 22px hoch
     sind, werden lange Marken breit statt flach — KUKA belegt 129px, und
     ohne diese Variable schöbe sich der Link 33px darunter. Zu setzen ist
     sie an der Karte, und nur dort, wo Link UND Logo zusammenkommen:

         <article class="uc-card" style="--logo-breite: 130px" …>

     Die Breite liest man im Browser ab (naturalWidth/naturalHeight mal der
     Höhe aus der Formtabelle) oder rechnet sie aus der viewBox. */
  right: calc(var(--space-4) + var(--logo-breite, 96px));
  z-index: 2;
  color: var(--color-white); text-decoration: none;
  opacity: 0; transform: translateY(6px);
  transition: opacity 0.35s ease, transform 0.35s var(--motion-ease-out),
              border-color 0.2s ease;
}
/* Ohne Partnerlogo braucht rechts nichts reserviert zu werden — dann steht
   dem Linktext die ganze Kartenbreite zur Verfügung und er bleibt einzeilig. */
.uc-card:not(:has(.uc-card__partner)) > .uc-card__link { right: var(--space-4); }
/* Zwei Beschriftungen je Link, im Markup beide vorhanden. Die kurze ist der
   Standard: auf einer 290 Pixel breiten Karte — drei Spalten bei 1060 Pixel
   Fensterbreite — bricht die lange auf zwei Zeilen um, und bei sechs Links
   in einem Raster fällt das auf. Erst wenn die Karte wirklich Platz hat,
   erscheint die ausführliche Fassung.
   1440 Pixel, nicht 1200: bei 1400 brachen die beiden längsten noch um. */
.uc-card__link-lang { display: none; }
@media (min-width: 1440px) {
  .uc-card__link-lang { display: inline; }
  .uc-card__link-kurz { display: none; }
}
.uc-card:hover .uc-card__link,
.uc-card:focus-within .uc-card__link { opacity: 1; transform: none; }
/* venture (spin-out) cards — each carries its venture's accent (--vc) */
.uc-card--venture { border: 1px solid rgba(255, 255, 255, 0.14); }
.uc-card--venture[style*="--vc"] { border-color: color-mix(in srgb, var(--vc) 38%, transparent); }
.uc-card .uc-card__badge--exit { position: absolute; top: var(--space-4); right: var(--space-4); z-index: 2; }
/* Das Abzeichen liegt auf Logo-Höhe — auf schmalen Karten (dreispaltiges
   Raster um 1200px) muss das Logo ihm Platz lassen, sonst schieben sich
   beide ineinander. Unter 480px steht das Abzeichen im Fluss, dann darf
   das Logo wieder voll breit (siehe unten). */
.uc-card:has(.uc-card__badge--exit) .uc-card__logo { max-width: calc(100% - 165px); }
/* Kundenlogo unten rechts auf einer Referenzkarte.

   SCHRIFTZÜGE STEHEN GLEICH HOCH, FORMEN NACH FLÄCHE.

   Vorher galt hier durchgehend gleiche Fläche: h = 38,6/√r, jede Marke rund
   1500px². Der Gedanke stimmt für den Vergleich zwischen *verschiedenen*
   Formen — „Müller Fenster | Fassaden" neben der Werder-Raute, beide bei
   34px, wäre fünfmal so viel Fläche für dieselbe Rolle in der Ecke.

   Zwischen Marken *derselben* Form ist er falsch, und das fiel auf, als fünf
   Wortmarken nebeneinander standen (Enno, 26.08.2026): ITSC stand 20px hoch,
   die Deutsche Windtechnik 16px, bei fast gleicher Breite. Die Grenze bei
   r = 4,5 lief mitten durch eine Gruppe, die für das Auge eine ist — beides
   ist Text in einer Zeile, und Text vergleicht man über die Höhe, nicht über
   die Fläche.

   Deshalb jetzt: **alle Schriftzüge 22px**, egal wie lang. Nur wo die Form
   wirklich wechselt — kurzes Wortzeichen, Wappen, Hochformat — steigt die
   Höhe weiter, sonst schrumpfte ein quadratisches Wappen bei 22px auf 31px
   Breite und wäre nicht mehr zu erkennen.

     r < 0,9    Hochformat, Wappen ohne Schrift   --hoch      42px
     0,9–1,8    quadratisch, Wappen mit Schrift   --wappen    34px
     1,8–2,8    kurzes Wortzeichen                --breit     27px
     r > 2,8    Schriftzug, gleich wie lang       (ohne)      22px

   Damit ist --band weg. Ein langer Schriftzug wird jetzt breit statt flach:
   „MATTHÄI" (r = 8,4) steht 185px breit da, KUKA (r = 5,8) 128px. Dafür ist
   max-width angehoben — der alte Deckel von 96px hätte genau die langen
   Marken wieder flachgedrückt und das Problem zurückgeholt.

   Das setzt voraus, dass die Datei knapp beschnitten ist: Luft in der Datei
   zählt als Marke und macht sie auf der Karte kleiner. Bei PNG erledigt das
   der Skill kundenlogos, bei SVG ist die viewBox von Hand zu prüfen —
   itsc.svg trug 43 % Leerraum in der Höhe und stand deshalb halb so hoch da
   wie gemeint.

   EINZELNE MARKEN DÜRFEN ABWEICHEN: --logo-faktor
   Manche Marken wirken bei rechnerisch gleicher Höhe zu zurückhaltend — ein
   Wappen mit feiner Zeichnung trägt weniger weit als ein fetter Schriftzug.
   Dafür gibt es einen Faktor, gesetzt an der KARTE, nicht am Bild:

       <article class="uc-card" style="--logo-faktor: 1.2" …>

   An der Karte, weil auch der Freiraum unten mitwachsen muss und die
   :has()-Regeln darunter nur an die Variable der Karte kommen, nicht an die
   eines Kindes. Der Preis: steht dieselbe Datei auf mehreren Karten — das
   Hamburger Wappen auf dreien —, muss der Faktor dreimal gesetzt werden.

   Der Faktor ist die Ausnahme, nicht der Regler. Wer ihn bei der Hälfte der
   Karten braucht, hat die falsche Grundhöhe, und die gehört dann oben
   geändert. Derzeit gesetzt (Enno, 26.08.2026): 1,2 auf den drei Hamburger
   Wappen und auf Müller Fenster & Fassaden. */
.uc-card .uc-card__partner {
  position: absolute; right: var(--space-4); bottom: var(--space-4); z-index: 2;
  --logo-h: 22px;
  height: calc(var(--logo-h) * var(--logo-faktor, 1));
  width: auto; max-width: calc(190px * var(--logo-faktor, 1)); opacity: 0.92;
  /* max-width ist der Notnagel gegen eine Marke, die noch länger wäre als
     MATTHÄI; object-fit hält sie dann unverzerrt und am rechten Rand.
     Er wächst mit dem Faktor mit — sonst drückt er eine vergrößerte Marke
     sofort wieder flach. */
  object-fit: contain; object-position: right center;
}
.uc-card .uc-card__partner--breit { --logo-h: 27px; }
.uc-card .uc-card__partner--wappen { --logo-h: 34px; }
.uc-card .uc-card__partner--hoch { --logo-h: 42px; }
/* Die Karte hält die Ecke frei: Fließtext und Link enden über der Marke,
   sonst laufen sie hinein. Immer Höhe + 32px Abstand + 16px Luft. */
/* Ein Link braucht unten Platz, sonst läuft die Beschreibung darunter. Steht
   vor den Partnerregeln: trägt eine Karte beides, gilt der größere Wert der
   Logoform, und der reicht für den Link mit. */
.uc-card:has(.uc-card__link) { padding-bottom: 56px; }
.uc-card:has(.uc-card__partner) { padding-bottom: calc(22px * var(--logo-faktor, 1) + 48px); }
.uc-card:has(.uc-card__partner--breit) { padding-bottom: calc(27px * var(--logo-faktor, 1) + 48px); }
.uc-card:has(.uc-card__partner--wappen) { padding-bottom: calc(34px * var(--logo-faktor, 1) + 48px); }
.uc-card:has(.uc-card__partner--hoch) { padding-bottom: calc(42px * var(--logo-faktor, 1) + 48px); }
.uc-card__logo { height: 24px; width: auto; max-width: 220px; align-self: flex-start; object-fit: contain; object-position: left center; margin-bottom: var(--space-1); }
/* per-shape heights so every mark carries the same optical weight */
.uc-card__logo--narrow { height: 26px; }
.uc-card__logo--wide { height: 20px; }
.uc-card__logo--xwide { height: 17px; }
.uc-card__logo--square { height: 40px; }
.uc-card__logo--invert { filter: invert(1); }
.uc-card__badge {
  align-self: flex-start; padding: 3px 10px;
  border-radius: var(--radius-cta);
  background: var(--color-white); color: var(--color-ink);
  font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase;
}
.uc-card__visit { font-family: var(--type-family-cta); font-weight: 400; font-size: 14px; margin-top: auto; padding-top: var(--space-1); }
/* scroll-in motion for the grid */
[data-reveal] { opacity: 0; transform: translateY(20px); transition: opacity 0.6s var(--motion-ease-out), transform 0.6s var(--motion-ease-out); transition-delay: var(--reveal-delay, 0ms); }
[data-reveal].is-in { opacity: 1; transform: none; }
[data-reveal].is-instant, [data-reveal].is-instant p, [data-reveal].is-instant .solves__line {
  transition-duration: 0s !important; transition-delay: 0s !important;
}
@media (prefers-reduced-motion: reduce) {
  [data-reveal], .solves__item[data-reveal] p, .solves__item[data-reveal] .solves__line { opacity: 1; transform: none; transition: none; }
}
.ucwrap .sec__title--ventures { margin: var(--space-10) 0 0; }

/* ================= STORY BAND (about page) ========================== */
.story { background: var(--color-black); color: var(--color-white); padding: var(--space-8) var(--edge); text-align: center; }
.story p {
  max-width: 820px; margin-inline: auto;
  font-size: clamp(18px, 1.7vw, 24px); font-weight: 300; line-height: 1.4;
}
.story p + p { margin-top: var(--space-4); }
.story .story__cta { margin-top: var(--space-5); }
.story b { font-weight: 500; }

/* ================= LINK ROWS (about page) =========================== */
.linkrows { background: var(--color-white); padding: var(--space-8) var(--edge); display: flex; flex-direction: column; gap: var(--space-6); }
.linkrow {
  display: flex; height: 163px; overflow: hidden;
  background: var(--color-white);
  border: 1px solid rgba(0, 0, 0, 0.2); border-radius: var(--radius-default);
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  color: var(--color-ink);
  transition: transform 0.35s var(--motion-ease-out);
}
.linkrow:hover { transform: translateY(-4px); }
.linkrow__img { flex: none; width: 66%; overflow: hidden; }
.linkrow__img img { width: 100%; height: 100%; object-fit: cover; }
/* Das Feld ist rund 5:1, die Bilder sind es nicht — sichtbar bleibt ein Band
   aus der Mitte. Bei den 4:1-Bildern der Reihe passt das. Ein 2:1-Bild
   verliert dabei unten zu viel: beim Gruppenbild fielen Wasser, Boote und
   Promenade heraus, übrig blieben Himmel und Hausdächer. Deshalb wandert der
   Ausschnitt dort nach unten. */
.linkrow__img--tief img { object-position: center 75%; }
.linkrow__body { display: flex; flex-direction: column; justify-content: center; gap: var(--space-2); padding: var(--space-4); min-width: 0; }

/* ================= EVENT ROWS ======================================= */
/* Termine sind eine Liste, keine Kachelwand: bei zwei Terminen wirken zwei
   Karten verloren, eine Zeile je Termin wirkt gesetzt. Aufbau wie .index__row
   — großes Datum links, Titel und Eckdaten in der Mitte, rechts genau eine
   Aktion. Ort, Uhrzeit und Preis stehen bewusst in der Mitte und nicht rechts:
   drei rechtsbündige Kurzzeilen wirken verstreut, eine Aktion wirkt wie eine.
   Die ganze Zeile ist der Verweis, die Anmeldung läuft nach außen. */
.index--events .index__row {
  grid-template-columns: 104px minmax(0, 1fr) max-content;
  gap: var(--space-6);
  align-items: center;
  padding-block: var(--space-6);
  /* Der Streifen für den Hover-Hintergrund ragt seitlich über die Textkante
     hinaus — aber nie weiter als der Seitenrand hergibt, sonst schiebt die
     Zeile die schmalen Breakpoints ins Querscrollen. */
  padding-inline: min(var(--space-3), var(--gutter));
  margin-inline: calc(min(var(--space-3), var(--gutter)) * -1);
  transition: background 0.3s var(--motion-ease-out);
}
.index--events .index__row:hover { background: rgba(0, 0, 0, 0.05); }
/* Der Platzhalter, wenn kein Termin mehr läuft. main.js blendet ihn ein und
   die Liste aus; im HTML steht er mit hidden, damit er nie aufblitzt. */
.index__leer {
  margin-top: var(--space-6);
  color: var(--color-muted);
}
/* Tageszahl und Monat stehen mittig übereinander, nicht linksbündig:
   "SEP 26" ist schmaler als "22" und hinge links ausgerichtet schief. */
.evrow__date {
  display: flex; flex-direction: column; align-items: center;
  gap: 6px; font-family: var(--type-family-cta);
}
.evrow__day { font-size: 56px; font-weight: 600; line-height: 1; }
/* Es gibt nur eine Zifferngröße. Mehrtägige Messen zeigen den Starttag und
   sonst nichts — jede Sonderform daneben, die ganze Spanne klein gesetzt
   oder ein kleiner Endtag neben der großen Ziffer, macht aus der ruhigen
   Zahlenspalte einen Flickenteppich. Wie lange die Messe läuft, steht auf
   ihrer eigenen Seite, und dahin führt die Zeile. */
.evrow__mon { font-size: 14px; font-weight: 400; letter-spacing: 0.1em; text-transform: uppercase; color: var(--color-ink); }
.evrow__body { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.evrow__title { color: var(--color-ink); }
.evrow__where { font-size: 16px; font-weight: 400; color: var(--color-ink); }
.evrow__note { font-size: 14px; font-weight: 300; color: var(--color-muted); }
.evrow__cta {
  font-family: var(--type-family-cta); font-size: 20px; font-weight: 500;
  color: var(--color-ink); white-space: nowrap;
}
.evrow__cta-arrow { display: inline-block; transition: transform 0.3s var(--motion-ease-out); }
.index--events .index__row:hover .evrow__title { text-decoration: underline; text-underline-offset: 4px; }
.index--events .index__row:hover .evrow__cta-arrow { transform: translate(3px, -3px); }
@media (max-width: 900px) {
  .index--events .index__row { grid-template-columns: 1fr; gap: var(--space-2); }
  .evrow__date { flex-direction: row; align-items: baseline; gap: var(--space-2); }
  .evrow__day { font-size: 40px; }
  .evrow__cta { margin-top: var(--space-1); }
}
@media (prefers-reduced-motion: reduce) {
  .index--events .index__row, .evrow__cta-arrow { transition: none; }
}

/* looking back — glass gallery cards on black */
.galcards { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); margin-top: var(--space-6); }
.galcard {
  background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(0, 0, 0, 0.35);
  border-radius: var(--radius-default); padding: var(--space-4);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.galcard__title { font-size: 24px; font-weight: 500; text-transform: uppercase; color: var(--color-white); margin-bottom: var(--space-3); }
.galcards--press { grid-template-columns: repeat(2, 1fr); }
.galcards--press .galcard { display: flex; flex-direction: column; gap: var(--space-2); transition: transform 0.35s var(--motion-ease-out); }
.galcards--press .galcard:hover { transform: translateY(-4px); }
.galcard__src { font-size: 14px; font-weight: 300; letter-spacing: 0.06em; text-transform: uppercase; color: var(--color-white-72); }
.galcards--press .galcard__title { font-size: 20px; text-transform: none; margin-bottom: 0; line-height: 1.3; }
.galcard__link { font-family: var(--type-family-cta); font-weight: 400; font-size: 14px; color: var(--color-white); margin-top: auto; }
@media (max-width: 1024px) { .galcards--press { grid-template-columns: 1fr; } }
.galcard__grid { display: grid; grid-template-columns: 272fr 129fr 129fr; grid-template-rows: 142px 142px; gap: var(--space-2); }
.galcard__ph {
  position: relative;
  background: var(--color-white); border-radius: var(--radius-tile);
}
.galcard__ph::before {
  content: ""; position: absolute; inset: 0; margin: auto;
  width: 32px; height: 32px; opacity: 0.28;
  background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.5"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M3 17l5-5 4 4 3-3 6 6"/></svg>') center / contain no-repeat;
}
.galcard__ph--tall { grid-row: 1 / 3; }

/* ================= JOB / TEXT CARDS ================================= */
.jobcards { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3); margin-top: var(--space-6); }
.jobcard {
  background: var(--color-white); border: 1px solid rgba(0, 0, 0, 0.35);
  border-radius: var(--radius-default); box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-1);
  color: var(--color-ink);
}
.jobcard--ink { background: var(--color-bg); border-color: rgba(255, 255, 255, 0.14); color: var(--color-white); box-shadow: none; }
.jobcard__title { font-size: 24px; font-weight: 500; line-height: 1.2; }
.jobcard__meta { font-size: 14px; font-weight: 300; letter-spacing: 0.06em; text-transform: uppercase; }
.jobcard--ink .jobcard__meta { color: var(--color-white-82); text-transform: none; letter-spacing: 0; line-height: 1.5; }
.jobcard__link {
  font-family: var(--type-family-cta); font-weight: 400; font-size: 16px;
  /* Unten angeschlagen: seit über dem Link nur noch der Ort steht, liegt der
     gewonnene Platz als Weißraum dazwischen — und die Links einer Zeile
     stehen auf einer Linie, statt je nach Kartentext zu wandern. */
  margin-top: auto; padding-top: var(--space-3);
}
.jobcard--ink .cta { align-self: flex-start; margin-top: var(--space-2); min-width: 0; }
.jobcard--wide { grid-column: span 2; }
@media (max-width: 768px) { .jobcard--wide { grid-column: auto; } }
.jobcards__lead { margin-top: var(--space-3); max-width: 720px; color: var(--color-ink); }
.jobcards__note {
  /* Rechtsbündig und rechts angeschlagen: die Fußnote liegt damit an der
     Kante des Kartenrasters und drängelt sich nicht an den Anfang der Zeile,
     wo der Vorspann steht. Auf schmalen Schirmen zurück nach links —
     Flattersatz von links liest sich in kurzen Zeilen schlecht. */
  margin-top: var(--space-4); max-width: 720px; margin-left: auto; text-align: right;
  font-size: 16px; font-weight: 300; line-height: 1.6; color: var(--color-muted);
}

/* ================= CONTACT ========================================== */
.contact { background: var(--color-white); color: var(--color-ink); padding: var(--space-8) var(--edge); }
.contact__grid { display: grid; grid-template-columns: 752fr 480fr; gap: var(--space-6); margin-top: var(--space-6); }
/* Dieselbe Falle wie beim Danke-Block: display aus einer Klassenregel schlägt
   das hidden-Attribut aus dem Browser-Stylesheet. Ohne diese Zeile blieb das
   abgeschickte Formular stehen, und der Dank erschien darunter statt an
   seiner Stelle. */
.leadform[hidden] { display: none; }
.leadform {
  background: var(--color-white); border: 1px solid rgba(0, 0, 0, 0.35);
  border-radius: var(--radius-default); box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-2);
}
.leadform__title { font-size: 32px; font-weight: 400; line-height: 1.2; margin-bottom: var(--space-1); }
.leadform__row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); }
.field {
  width: 100%; padding: var(--space-2);
  border: 1px solid rgba(0, 0, 0, 0.35); border-radius: var(--radius-default);
  background: transparent; font-weight: 300; color: var(--color-ink);
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.field::placeholder { color: rgba(0, 0, 0, 0.6); }
.field:focus { outline: none; border-color: var(--color-ink); box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.06); }
textarea.field { min-height: 112px; resize: vertical; }
/* Beschriftung über dem Feld. Das Kontaktformular kommt mit Platzhaltern
   aus, weil es zwei Felder hat; sobald ein Formular länger wird, braucht es
   sichtbare Beschriftungen — ein Platzhalter verschwindet beim Tippen. */
.feld__label { font-size: 14px; font-weight: 400; color: var(--color-ink); }
/* Ein ausgeblendetes Feld steht auf hidden; ohne diese Zeile schlägt das
   display:flex der Feldbox das Attribut aus dem Browser-Stylesheet — wie
   beim Danke-Block weiter unten. */
.feld[hidden] { display: none; }
.leadform .cta--light { align-self: flex-start; margin-top: var(--space-1); }
.contact__side { display: flex; flex-direction: column; gap: var(--space-3); }
/* Linke Rasterspalte: Formular (oder der Danke-Block) und darunter der
   Bewerbungshinweis. Der Abstand ist kleiner als die Rasterlücke — der
   Hinweis gehört zur Anfrage und soll nicht als eigener Block dastehen. */
.contact__anfrage { display: flex; flex-direction: column; gap: var(--space-2); }
.anfrage__hinweis {
  /* Linke Kante am Kartenrand, damit der Satz als Fußnote zum Formular
     gelesen wird — und rechte Kante ebenso: der Hinweis läuft über die volle
     Breite der Anfragespalte, sonst endet er vor dem Kartenrand und sieht
     abgeschnitten aus. */
  font-size: 13px; font-weight: 300; line-height: 1.5; color: var(--color-muted);
}
.anfrage__hinweis a { color: inherit; text-decoration: underline; }
/* Terminanfrage: Formular links, Bild rechts. Das Formular bekommt eine
   Höchstbreite — über 620px wird eine Feldzeile unangenehm lang —, das Bild
   nimmt den Rest. */
.contact__grid--anfrage { grid-template-columns: minmax(0, 620px) minmax(0, 1fr); }
.anfrage__bild {
  border-radius: var(--radius-default); overflow: hidden;
  box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
}
.anfrage__bild img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Klappmenü im Formular. Es teilt sich die Regeln des Branchenfilters der
   Referenzen (.uc-branche, weiter oben) — dieselbe Liste, dieselbe Bewegung,
   dieselben Farben, damit nicht zwei Klappmenüs nebeneinander leben, die
   sich langsam auseinander entwickeln. Anders ist nur die Verankerung: der
   Filter hängt rechts an einer Leiste, hier steht das Menü linksbündig unter
   einem Feld und ist so breit wie dieses. */
.wahl { position: relative; }
.wahl__knopf {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
  text-align: left; cursor: pointer;
}
.wahl__liste { right: auto; left: 0; transform-origin: top left; }
.loccard--bild, .jobcard--bild { position: relative; overflow: hidden; }
.loccard--bild > *, .jobcard--bild > * { position: relative; z-index: 2; }
.loccard__bg, .jobcard__bg {
  position: absolute !important; inset: 0; z-index: 0;
  width: 100%; height: 100%; object-fit: cover;
}
.loccard--bild::before, .jobcard--bild::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background: rgba(0, 0, 0, 0.55); pointer-events: none;
}
.loccard {
  background: var(--color-white); border: 1px solid rgba(0, 0, 0, 0.35);
  border-radius: var(--radius-default); box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.12);
  padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-1);
}
.loccard--ink { background: var(--color-bg); color: var(--color-white); border-color: rgba(255, 255, 255, 0.14); box-shadow: none; }
.loccard__label { font-size: 14px; font-weight: 300; letter-spacing: 0.06em; text-transform: uppercase; opacity: 0.7; }
.loccard__title { font-size: 24px; font-weight: 500; line-height: 1.2; }
.loccard__meta { font-size: 14px; color: var(--color-muted); }
.loccard--ink .loccard__meta { color: var(--color-white-82); }
.loccard--ink a { font-weight: 500; }

/* ================= LEGAL ============================================ */
.legal { background: var(--color-white); color: var(--color-ink); }
.legal__block { padding: var(--space-4) var(--edge); }
.legal__block h2 { font-size: 24px; font-weight: 500; line-height: 1.25; margin-bottom: var(--space-2); }
.legal__block h3 { font-size: 18px; font-weight: 500; line-height: 1.3; margin-bottom: var(--space-1); }

/* Meldung im Newsroom: ein Artikel in einem Block. Die Legal-Stile sind für
   Rechtstexte gebaut — eine Überschrift je Block, Zeilen dicht. Im Artikel
   folgen Zwischenüberschriften und Absätze aufeinander, deshalb bekommen sie
   hier Luft; alles unter .legal--meldung, damit Impressum und Datenschutz
   unverändert bleiben. */
.legal--meldung .legal__block h2 { font-size: 32px; line-height: 1.2; margin-bottom: var(--space-2); }
.legal--meldung .legal__block h3 { margin-top: var(--space-4); }
.legal--meldung .legal__block p + p { margin-top: var(--space-2); }
.legal--meldung .legal__block + .legal__block { padding-top: 0; }
.meldung__datum { font-size: 14px; color: var(--color-muted); margin-bottom: var(--space-1); }
/* .legal__block p setzt 300 mit höherer Spezifität, deshalb hier mit Block davor */
.legal__block .meldung__unterzeile { font-weight: 500; }
/* HubSpot embed inherits the site's field look once the form arrives */
.leadform .hs-form input[type="text"], .leadform .hs-form input[type="email"],
.leadform .hs-form input[type="tel"], .leadform .hs-form textarea {
  width: 100%; padding: 14px 16px;
  border: 1px solid rgba(0, 0, 0, 0.2); border-radius: var(--radius-default);
  font-family: var(--type-family-sans); font-size: 16px; color: var(--color-ink);
  background: var(--color-white);
}
.leadform .hs-form label { font-size: 14px; font-weight: 400; color: var(--color-ink); }
.leadform .hs-form .hs-button {
  min-width: 160px; padding: 18px var(--space-3);
  border-radius: var(--radius-cta); border: 0; cursor: pointer;
  font-family: var(--type-family-cta); font-size: 16px; font-weight: 400;
  color: var(--color-white); background: var(--color-black);
}
.leadform .hs-error-msgs { font-size: 13px; color: #C1493D; list-style: none; }
.legal__block p, .legal__block li { font-weight: 300; line-height: 1.5; max-width: 900px; }
.legal__block li { padding-left: 1.2em; text-indent: -1.2em; }
.legal__block li::before { content: "•  "; }
/* Verweise im Rechtstext bekommen einen Strich. Ohne ihn unterscheidet sich
   "Kontaktformular" im Impressum in nichts vom Fließtext daneben. */
.legal__block a { text-decoration: underline; }
.legal__block:first-child { padding-top: var(--space-8); }
.legal__block:last-child { padding-bottom: var(--space-8); }

/* Randnavigation für lange Rechtstexte. Die Datenschutzerklärung hat 38
   Abschnitte — wer darin etwas sucht, rollt sonst blind. Links steht deshalb
   ein Inhaltsverzeichnis, das stehen bleibt und den Abschnitt markiert, der
   gerade im Bild ist; die Markierung setzt scripts/main.js.

   .doc-body trägt seine Abstände selbst, statt sie wie .legal__block aus dem
   Blockrahmen zu beziehen: im Raster gibt es keinen --edge mehr, den ein
   Block einrücken könnte. */
.doc-layout {
  display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 11fr);
  gap: var(--space-6); align-items: start;
  padding: var(--space-8) var(--edge);
}
.doc-toc {
  position: sticky; top: var(--space-4);
  display: grid; gap: 2px;
  max-height: calc(100vh - var(--space-10)); overflow-y: auto;
}
.doc-toc a {
  padding: 8px 16px; border-left: 2px solid rgba(0, 0, 0, 0.12);
  font-size: var(--type-small-size); font-weight: 300; line-height: 1.4;
  color: var(--color-muted);
  transition: color .12s ease, border-color .12s ease, background .12s ease;
}
.doc-toc a:hover { color: var(--color-ink); background: rgba(0, 0, 0, 0.04); }
.doc-toc a.is-active { border-left-color: #EA0CE2; color: var(--color-ink); font-weight: 500; }
.doc-toc a.doc-toc__sub { padding-left: var(--space-4); }
.doc-body { max-width: 900px; }
/* Die Sprungmarken landen sonst unter der Kopfzeile. */
.doc-body h2, .doc-body h3 { scroll-margin-top: var(--space-8); }
.doc-body h2 { font-size: 32px; font-weight: 500; line-height: 1.2; margin: var(--space-8) 0 var(--space-2); }
.doc-body h2:first-child { margin-top: 0; }
.doc-body h3 { font-size: 20px; font-weight: 500; line-height: 1.3; margin: var(--space-4) 0 var(--space-1); }
.doc-body p, .doc-body li { font-weight: 300; line-height: 1.5; }
.doc-body p + p, .doc-body ul { margin-top: var(--space-2); }
.doc-body li { padding-left: 1.2em; text-indent: -1.2em; }
.doc-body li::before { content: "•  "; }
.doc-body a { text-decoration: underline; }

/* ================= FOOTER =========================================== */
.footer { background: var(--color-bg); color: var(--color-white); padding: 56px var(--edge) var(--space-6); }
.footer__cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-8); }
.footer__brand { font-size: 24px; font-weight: 400; }
.footer__claim { margin-top: var(--space-2); max-width: 272px; font-weight: 300; line-height: 1.4; color: var(--color-white-72); }
.footer__col h3 {
  font-size: 12px; font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--color-white-50);
  margin-bottom: var(--space-2);
}
.footer__col a, .footer__col p { display: block; font-weight: 300; line-height: 2; color: var(--color-white-82); }
.footer__col a:hover { color: var(--color-white); }
.footer__bottom {
  display: flex; justify-content: space-between; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  margin-top: var(--space-6); padding-top: var(--space-3);
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  font-size: 14px;
}
.footer__bottom span { color: var(--color-white-50); }
.footer__bottom nav { display: flex; gap: var(--space-5); }
.footer__bottom a { color: var(--color-white-72); }
.footer__bottom a:hover { color: var(--color-white); }

/* ================= RESPONSIVE ======================================= */
@media (max-width: 1200px) {
  .nav__menu { gap: 40px; }
  .index__row { grid-template-columns: 48px minmax(0, 1.3fr) minmax(0, 1fr); gap: var(--space-4); }
  .index__head { grid-template-columns: 48px minmax(0, 1.3fr) minmax(0, 1fr) 28px; gap: var(--space-4); }
  .index__foldinner { padding-left: calc(48px + var(--space-4)); }
}
@media (max-width: 1024px) {
  .about { grid-template-columns: 1fr; gap: var(--space-6); }
  .timeline__line { display: none; }
  .timeline__steps { grid-template-columns: repeat(2, 1fr); gap: var(--space-6) var(--space-4); }
  .uc-grid { grid-template-columns: repeat(2, 1fr); }
  .contact__grid, .contact__grid--anfrage { grid-template-columns: 1fr; }
  /* Auf dem Telefon gehört das erste Feld nach oben, kein Bild darüber. */
  .anfrage__bild { display: none; }
  .metrics--row { grid-template-columns: repeat(2, 1fr); gap: var(--space-6); }
  .uc-grid { grid-template-columns: repeat(2, 1fr); }
  .linkrow__img { width: 55%; }
  .solves__item:nth-child(n) { padding-left: var(--edge); }
  .stage__art.is-loaded { opacity: 0.85; }
  /* Randnavigation nach oben. Sie bleibt dort nicht stehen — ein Verzeichnis,
     das am Kopf klebt, nimmt auf dem Telefon den halben Schirm. Und es rollt
     in sich, sonst schöbe es den Text um 38 Zeilen nach unten. */
  .doc-layout { grid-template-columns: 1fr; gap: var(--space-4); }
  .doc-toc { position: static; max-height: 220px; }
}
@media (max-width: 900px) {
  /* below the burger breakpoint the designed line breaks release —
     "two lines max" is a desktop rule */
  .stage__title .nowrap { white-space: normal; }
  /* the card titles carry a hard <br> for the narrow desktop text
     column. Full width there is room to spare — let the line run on. */
  .wcard__name br { display: none; }
  .nav__menu {
    position: absolute; top: 0; left: 0; right: 0; height: 100svh; z-index: 105;
    display: flex; flex-direction: column; align-items: stretch; justify-content: flex-start;
    gap: var(--space-3);
    padding: calc(var(--nav-h, 88px) + var(--space-4)) var(--edge) var(--space-5);
    overflow-y: auto;
    background: #080808;
    opacity: 0; visibility: hidden; transform: translateY(-8px);
    transition: opacity 0.25s var(--motion-ease-out), transform 0.25s var(--motion-ease-out), visibility 0.25s;
  }
  .nav.is-menu-open .nav__menu { opacity: 1; visibility: visible; transform: none; }
  .nav__item--home { display: block; }
  .nav__menu .nav__item > a { display: block; font-size: 24px; padding-block: var(--space-1); }
  /* no hover states in the panel — tap feedback comes from :active */
  .nav__menu .nav__item > a:hover { opacity: 0.92; }
  .nav__menu .nav__sub a:hover { background: none; color: var(--color-white-72); }
  .nav__menu a:active { opacity: 0.55; }
  .nav__sub {
    position: static; transform: none; opacity: 1; visibility: visible; pointer-events: auto;
    min-width: 0; padding: 0 0 var(--space-1) var(--space-2);
    background: none; border: 0; box-shadow: none;
    -webkit-backdrop-filter: none; backdrop-filter: none;
  }
  /* the desktop hover rule re-applies translateX(-50%) with higher
     specificity — in the static panel that shoved the list half off
     screen. Match its specificity and pin it. */
  .nav__item:hover .nav__sub, .nav__item:focus-within .nav__sub { transform: none; }
  .nav__sub a { padding: 6px 0; color: var(--color-white-72); }
  .nav__item::after { content: none; }
  /* language switch = utility, not a nav link: pinned to the bottom of
     the panel as its own full-width row behind a hairline, so it can't
     read as part of Contact */
  .nav__menu .nav__lang {
    margin-top: auto; align-self: stretch;
    height: auto; padding-top: var(--space-4);
    border-top: 1px solid rgba(255, 255, 255, 0.16);
    justify-content: flex-start;
  }
  .nav__menu .nav__lang-de, .nav__menu .nav__lang-en { height: 32px; min-width: 44px; }
  .nav__burger { display: block; }
}
@media (max-width: 768px) {
  :root { --nav-h: 72px; }
  .stage { padding-top: 136px; min-height: 480px; }
  .stage--tall { min-height: 100svh; }
  .stage__art { width: 100%; height: auto; min-height: 45%; top: 0; object-fit: cover; }
  .stage__art.is-loaded { opacity: 0.8; }
  .stage__art--arc { width: 90%; }
  .back { top: 84px; }
  .index__row { grid-template-columns: 48px 1fr; }
  .index__desc { grid-column: 2; justify-self: start; max-width: none; }
  /* Schmal steht der Kurztext unter dem Titel; Nummer, Titel und Plus
     werden gesetzt, sonst schiebt das Plus sich in eine dritte Zeile. */
  .index__head { grid-template-columns: 48px 1fr 28px; row-gap: var(--space-2); }
  .index__head .index__num   { grid-column: 1; grid-row: 1; }
  .index__head .index__title { grid-column: 2; grid-row: 1; }
  .index__head .index__plus  { grid-column: 3; grid-row: 1; }
  .index__head .index__desc  { grid-column: 2 / -1; grid-row: 2; justify-self: start; max-width: none; }
  .evcards, .galcards, .jobcards, .glowcards { grid-template-columns: 1fr; }
  .jobcards__note { margin-left: 0; text-align: left; }
  .linkrow { flex-direction: column; height: auto; }
  .linkrow__img { width: 100%; height: 160px; }
  .uc-grid { grid-template-columns: 1fr; }
  .uc-card { min-height: 0; }
  /* vertical timeline on phones: the line runs through the same dots */
  .timeline__line { display: block; left: 7px; right: auto; top: 0; bottom: 0; height: auto; width: 1px; }
  .timeline__steps { grid-template-columns: 1fr; gap: var(--space-5); }
  .tstep { padding-top: 0; padding-left: 40px; }
  .tstep::before { top: 6px; left: 2px; }
  .tstep__num { position: static; display: block; margin-bottom: 4px; }
  .footer__cols { grid-template-columns: 1fr 1fr; gap: var(--space-6); }
  .marquee { height: auto; padding-top: 12px; }
  .marquee__track span { font-size: 28px; }
  .galcard__grid { grid-template-columns: 1fr 1fr; grid-template-rows: repeat(3, 120px); }
  .galcard__ph--tall { grid-row: auto; grid-column: 1 / 3; }
  /* what-we-do goes 100% mobile: no slider, cards stack full-width,
     image on top, type tuned for small screens */
  .slider { overflow: visible; }
  .slider__track {
    flex-direction: column; gap: var(--space-3);
    width: auto !important; transform: none !important;
    padding-inline: var(--edge); cursor: default;
  }
  .slider-bar { display: none; }
  .wcard, .wcard--ink { width: 100%; height: auto; flex-direction: column; padding: 0; }
  .wcard__img { width: 100%; height: 180px; }
  .wcard__body { width: 100%; flex: none; gap: var(--space-2); padding: var(--space-3) var(--space-3) calc(var(--space-2) + 63px); }
  .wcard__name { font-size: 28px; }
  .wcard__desc { font-size: 14px; max-width: none; }
  .wcard__body .cta, .wcard__body .cta--light { left: var(--space-3); bottom: var(--space-2); }
  .prompter { height: 420px; }
  .metrics--row { grid-template-columns: repeat(2, 1fr); }
  .about { padding-block: var(--space-6); }
  .totop { right: var(--space-2); bottom: var(--space-2); }
}
@media (max-width: 480px) {
  /* narrow cards: the exit pill leaves the corner (long German label) and
     sits under the logo instead */
  .uc-card .uc-card__badge--exit { position: static; }
  .uc-card:has(.uc-card__badge--exit) .uc-card__logo { max-width: 220px; }
  .metrics { gap: var(--space-5) var(--space-3); }
  .footer__cols { grid-template-columns: 1fr; }
  .footer__bottom nav { gap: var(--space-3); }
}
/* Referenzkarte ohne Überfahren: schmaler Schirm oder gar kein Zeigegerät.
   Beides fällt zusammen, weil beides dasselbe bedeutet — der ganze
   Kartentext steht von Anfang an da, Beschreibung und Link warten nicht auf
   eine Bewegung, die es nicht gibt. Damit muss die Karte über ihre volle
   Höhe lesbar sein, nicht nur oben:

   - Das Bild selbst wird gedimmt, nicht bloß ein Schleier darübergelegt. Die
     Kartenfläche darunter ist fast schwarz (--color-bg), eine niedrigere
     Deckkraft dunkelt das Motiv also gleichmäßig ab.
   - Der Schleier wird eine gleichmäßige Fläche statt eines Verlaufs. Der
     Verlauf ließ nach unten auf 0.26 nach, weil dort im Ruhezustand nichts
     als Bild war — jetzt sitzt genau dort der Link.

   Der Linkselektor ist zweiteilig wie bei der Grundregel oben:
   `.uc-card > .uc-card__link` zählt zwei Klassen, ein einfaches
   `.uc-card__link` überstimmt deren opacity: 0 nicht — eine Mediengrenze
   erhöht die Spezifität nicht. Daran lag es, dass der Link auf dem Telefon
   verborgen blieb, obwohl eine Regel dafür dastand. */
@media (max-width: 768px), (hover: none) {
  .uc-card__desc { opacity: 1; transform: none; }
  .uc-card > .uc-card__link { opacity: 1; transform: none; }
  .uc-card__bg { opacity: 0.6; }
  .uc-card::before { background: rgba(0, 0, 0, 0.4); }
  /* Kein Aufhellen beim Antippen: :hover und :focus-within setzen Bild und
     Schleier sonst auf 0, und die Karte springt unter dem Finger — der Text
     ist hier ohnehin schon zu sehen. */
  .uc-card:hover .uc-card__bg, .uc-card:focus-within .uc-card__bg { opacity: 0.6; }
  .uc-card:hover::before, .uc-card:focus-within::before { opacity: 1; }
}
/* touch: hover is not an input — nothing may move, dim, or hide behind it */
@media (hover: none) {
  .ind:hover .ind__panel img, .glowcard:hover, .linkrow:hover, .uc-card:hover,
  .back:hover, .galcards--press .galcard:hover, .wcard:hover { transform: none; }
  .back:hover { opacity: 0.7; }
  .ind-rail:hover .ind:not(:hover) .ind__panel img { filter: none; }
  .nav__sub a:hover { background: none; color: var(--color-white-72); }
  .nav__item > a:hover { opacity: 0.92; }
  .uc-chip:hover { background: transparent; }
  .uc-chip.is-active:hover { background: var(--color-black); }
  .uc-branche__option:hover, .wahl__option:hover { background: transparent; }
  .uc-branche__option[aria-selected="true"]:hover, .wahl__option[aria-selected="true"]:hover { background: var(--color-black); }
}
@media (pointer: coarse) {
  .uc-chip { min-height: 44px; }
  /* Auf schmalen Schirmen bricht der Branchenfilter mit den Chips um, statt
     rechts in der Leiste zu stehen — dort hätte er neben sechs umgebrochenen
     Chips keinen Platz. Er bleibt dabei aber ein Chip wie die anderen: nur so
     breit wie seine Beschriftung. Über die ganze Breite gezogen sah er wie
     ein Eingabefeld aus und nicht wie ein Filter neben seinesgleichen.

     Die Liste richtet sich deshalb an der Chipleiste aus, nicht am Knopf: der
     rutscht beim Umbrechen irgendwohin in die Zeile, und eine an ihm hängende
     Liste stünde von dort aus schnell halb außerhalb des Schirms. .uc-branche
     steht hier auf static, damit .uc-filter der Bezug ist — die Liste beginnt
     an deren linker Kante, wird nie breiter als sie, und klappt unter die
     ganze Leiste auf, also unter den Knopf, der in der letzten Zeile steht. */
  .uc-filter { position: relative; }
  .uc-branche { position: static; margin-left: 0; }
  .uc-branche__knopf { min-height: 44px; }
  .uc-branche__liste {
    left: 0; right: auto; transform-origin: top left; max-width: 100%;
  }
  .uc-branche__option, .wahl__option { min-height: 44px; display: flex; align-items: center; }
  .nav__menu a { padding-block: var(--space-2); }
}

/* industries responsive — the v5 tile grid: 2-up tiles, label overlaid
   bottom-left on a scrim; no fan, no dimming, no hover dependence */
@media (max-width: 1024px) {
  .ind-rail { display: grid; grid-template-columns: repeat(2, 1fr); }
  .ind { position: relative; display: block; }
  /* Bei ungerader Anzahl — seit Bildung dazukam sind es neun — läge die
     letzte Kachel allein in der linken Spalte und die rechte Hälfte der Reihe
     bliebe leer. Sie nimmt deshalb beide Spalten. Die Bedingung rechnet sich
     selbst aus: bei gerader Anzahl greift sie nicht. */
  .ind-rail > .ind:last-child:nth-child(odd) { grid-column: span 2; }
  .ind__panel { height: 280px; }
  .ind__panel::after {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background: linear-gradient(to top,
      rgba(8, 8, 8, 0.66) 0%, rgba(8, 8, 8, 0.18) 40%, rgba(8, 8, 8, 0) 66%);
  }
  .ind__label {
    position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
    padding: var(--space-3); min-height: 0;
    text-align: left; color: var(--color-white);
  }
  .ind-rail:hover .ind, .ind-rail .ind:hover { flex-grow: initial; }
  .ind:hover .ind__panel img { transform: none; }
  .ind-rail:hover .ind:not(:hover) .ind__panel img { filter: none; }
  .ind-rail:hover .ind__label, .ind-rail .ind:hover .ind__label {
    color: var(--color-white); font-size: clamp(13px, 1.25vw, 16px);
    font-weight: 400; letter-spacing: 0.04em;
  }
}
@media (max-width: 768px) {
  .ind__panel { height: 240px; }
  .ind__label { font-size: 14px; }
  .ind-rail:hover .ind__label, .ind-rail .ind:hover .ind__label { font-size: 14px; }
}
@media (max-width: 480px) { .ind__panel { height: 200px; } }


/* ---- design-exact type on desktop ---------------------------------- */
@media (min-width: 1200px) {
  .solves__item p { line-height: 46px; }
  .t-stage { font-size: var(--type-stage-size); line-height: var(--type-stage-line); }
  .t-section { font-size: var(--type-section-size); line-height: var(--type-section-line); }
  .t-card { font-size: var(--type-card-size); line-height: var(--type-card-line); }
  .t-row { font-size: var(--type-row-size); line-height: var(--type-row-line); }
  .t-lead { font-size: var(--type-lead-size); line-height: var(--type-lead-line); }
  .t-lead-sm { font-size: var(--type-lead-sm-size); line-height: var(--type-lead-sm-line); }
  .t-number { font-size: var(--type-number-size); line-height: var(--type-number-line); }
}
body { font-synthesis: none; text-rendering: optimizeLegibility; }


html.pt-arriving::before {
  content: ""; position: fixed; inset: 0; z-index: 1000;
  background: var(--color-bg);
}
/* ================= PAGE TRANSITION ==================================
   A dark veil fades out on arrival and back in when leaving through an
   internal link. The spinner only becomes visible if the next page
   takes longer than ~0.5s. Injected by scripts/transition.js. */
.pt {
  position: fixed; inset: 0; z-index: 999;
  background: var(--color-bg);
  display: grid; place-items: center;
  opacity: 1; pointer-events: none;
  transition: opacity 0.3s ease;
}
.pt--clear { opacity: 0; }
.pt--leave { opacity: 1; pointer-events: auto; }
.pt__spin {
  width: 28px; height: 28px; border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, 0.18);
  border-top-color: var(--color-white);
  opacity: 0;
  animation: pt-rot 0.9s linear infinite;
  transition: opacity 0.3s ease 0.5s;
}
.pt--leave .pt__spin { opacity: 1; }
@keyframes pt-rot { to { transform: rotate(360deg); } }


/* ================= CROSS-PAGE VIEW TRANSITIONS ======================
   In browsers with cross-document view transitions the pages crossfade
   and the fixed nav keeps its own stable snapshot — no full-reload feel.
   Elsewhere scripts/transition.js falls back to the veil. */
@view-transition { navigation: auto; }
.nav { view-transition-name: site-nav; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: 0.25s; }


