/* ISTARIUM — smart solutions
   Sovereign dark landing. Self-contained: fonts + logo are local (relative paths).
   Palette: brand navy #2B2E83, warm ember #E94E1B. Type: Roboto (Light-led). */

/* ---- Fonts (local woff2, resolved relative to this stylesheet) ---- */
@font-face{font-family:"Roboto";font-style:normal;font-weight:300;font-display:swap;src:url("Roboto-Light.woff2") format("woff2");}
@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:url("Roboto-Medium.woff2") format("woff2");}

/* ---- Tokens ---- */
:root{
  --sky-top:#080915;
  --sky-mid:#101229;
  --sky-low:#1a1d45;
  --navy:#2B2E83;
  --ember:#E94E1B;
  --ember-soft:#f0693b;
  --text:#edeef6;
  --muted:#9698ba;
  /* 4.55:1 on the footer #080915 — clears WCAG AA for the legal text and the brand
     line. Lifted from #6d6f93 (4.10:1) on 2026-07-17. Consumers on LIGHTER panels
     (.scrollcue on the hero's #1a1d45 bottom, .contact__hint[checking] on #0d0f24)
     still sit under 4.5:1 — improved by this lift, but not yet fixed. */
  --faint:#74769e;
  --line:rgba(237,238,246,.12);
  --line-strong:rgba(237,238,246,.24);
  --ease:cubic-bezier(.22,.61,.36,1);
  /* Height of the conditional legacy-brand notice bar (see index.php). 0 unless the
     bar is shown; then set once, in px, on <html> by the notice script. Everything
     that must yield to the bar reads THIS — never a hardcoded number — so a 2-line
     wrap on narrow phones reserves its real space automatically. */
  --icg-notice-h:0px;
  /* The page gutter: the single horizontal inset every full-width element starts at.
     The topbar logo, the hero logo and the .wrap content column all sit on this line,
     so anything that must align with the logo reads THIS, never a copy of the clamp. */
  --gutter:clamp(22px,6vw,72px);
  /* Dark panels/foot/scrim tokenised so the light theme (html[data-theme="light"])
     can flip them from ONE place — never a second hardcoded #08.. copy. --fade is the
     rgb triple the hero ridge fades to, used as rgba(var(--fade),a). */
  --panel:#0d0f24;
  --foot-bg:#080915;
  --scrim:rgba(8,9,21,.86);
  --fade:8,9,21;
  /* The two section bands carry their own gradients as WHOLE tokens so the light theme
     flips them from ONE place — the old hardcoded #14163a/#101228/#0e1024 stops stayed
     dark under light mode and swallowed the (now dark) text. */
  --band-essence:linear-gradient(180deg,var(--sky-low) 0%, #14163a 55%, #101228 100%);
  --band-work:linear-gradient(180deg,#101228 0%, #0e1024 100%);
  /* Partner band: bridges band--work's end stop into --panel (band--contact), so the
     two read as one continuous surface with only the hairline between them. */
  --band-partners:linear-gradient(180deg,#0e1024 0%, var(--panel) 100%);
  /* Text colour on hover of the bordered CTAs (#fff on dark). Tokenised because plain
     white is invisible on the light theme — see the override below. */
  --onhover:#fff;
  /* Header control chips (language + reading aid). Active/hover share the accent look. */
  --btn-bg:rgba(237,238,246,.06);
  --btn-active-bg:rgba(233,78,27,.18);
  --btn-active-fg:#fff;
  /* Reading-aid font scale — the A / A+ / A++ stepper multiplies page zoom. */
  --fs-scale:1;
}

/* ---- Light / high-contrast theme (reading aid) --------------------------------
   One switch, one variable set. Dark text on near-white, ember darkened to clear
   WCAG AA as body text, navy kept as accent. Everything downstream reads the same
   tokens, so the whole site flips without touching a single component rule. */
html[data-theme="light"]{
  --sky-top:#f5f6fb;
  --sky-mid:#eef0f8;
  --sky-low:#e4e7f3;
  --navy:#2B2E83;          /* 8.6:1 on white — strong as an accent, kept */
  --ember:#bc3a0e;         /* 4.9:1 on the light sky — AA as text/accent */
  --text:#14162b;          /* ~15:1 */
  --muted:#3c3e5c;         /* ~8:1 */
  --faint:#565879;         /* ~5:1 — AA */
  --line:rgba(20,22,43,.16);
  --line-strong:rgba(20,22,43,.30);
  --panel:#e8eaf6;
  --foot-bg:#e4e7f3;
  --scrim:rgba(20,22,43,.45);
  --fade:245,246,251;
  --btn-bg:rgba(20,22,43,.05);
  --btn-active-bg:var(--ember);
  --btn-active-fg:#fff;    /* white on darkened ember — AA */
  /* Section bands: near-white with a whisper of the sky tint, so the dark stops that
     used to swallow the text are gone. */
  --band-essence:linear-gradient(180deg,var(--sky-low) 0%, #edeff8 55%, #f5f6fb 100%);
  --band-work:linear-gradient(180deg,#f5f6fb 0%, #edeff8 100%);
  --band-partners:linear-gradient(180deg,#edeff8 0%, var(--panel) 100%);
  --onhover:var(--navy);   /* navy on white — 8.6:1, replaces the invisible #fff */
}
/* Damp the ember dawn atmospherics so they read as warmth, not glare, on light. */
html[data-theme="light"] .hero__glow{opacity:.45;}
html[data-theme="light"] .hero__fog{opacity:.4;}
/* Logo: the shipped mark is white-on-dark and vanishes on the light theme. Swap all
   three placements (topbar, hero, footer) to the full-colour navy+ember mark. */
html[data-theme="light"] .topbar__mark img,
html[data-theme="light"] img.hero__logo,
html[data-theme="light"] img.pair__logo--iss,
html[data-theme="light"] img.crew__hub,
html[data-theme="light"] .foot__brand img{content:url("ISTARIUM_Logo_dark.png");}
/* Dasselbe für den MAI-Advisory-Schriftzug: ausgeliefert wird die Negativ-Fassung
   (weiß), die auf hellem Grund verschwindet. Namenskonvention wie bei ISTARIUM —
   „light" = helles Logo für dunklen Grund, „dark" = dunkles Logo für hellen. */
html[data-theme="light"] img.pair__logo--map{content:url("MAP_Logo_dark.png");}
/* Brand presence on light: the big display type carries ISTARIUM navy instead of the
   near-black ink — navy as TYPE, not as a background. Body/muted copy stays neutral. */
html[data-theme="light"] .promise,
html[data-theme="light"] .uses__name,
html[data-theme="light"] .lines p,
html[data-theme="light"] .contact__lead,
html[data-theme="light"] .who__name{color:var(--navy);}
/* Soft cross-fade when the reader flips the switch. */
body,.band--contact,.foot{transition:background-color .35s var(--ease),color .35s var(--ease);}

*,*::before,*::after{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;zoom:var(--fs-scale,1);}
body{
  margin:0;
  font-family:"Roboto",system-ui,-apple-system,Segoe UI,Arial,sans-serif;
  font-weight:300;
  color:var(--text);
  background:var(--sky-top);
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
}
img{max-width:100%;display:block;}
a{color:inherit;text-decoration:none;}
::selection{background:rgba(233,78,27,.32);color:#fff;}

/* Focus visibility (a11y floor) */
:focus-visible{outline:2px solid var(--ember-soft);outline-offset:3px;border-radius:2px;}

/* ---- Shell / rhythm ---- */
/* EINE Textspalte für die ganze Seite (Owner 2026-08-30). Vorher hatte jeder Block
   sein eigenes Maß (bandtext 62ch, uses 720, duo 860, pair/crew 880) — im Scroll
   sprangen die rechten Kanten und die Seite wirkte unruhig. Maßgeblich ist die
   Breite, die ISTARIUM + MAI Advisory nebeneinander aufspannen: 880px. Jeder
   Fließtext und jeder Block hängt jetzt an --measure, nirgends mehr eine eigene Zahl. */
:root{--measure:880px;}
.wrap{width:100%;max-width:1120px;margin-inline:auto;padding-inline:var(--gutter);}
.eyebrow{
  font-size:12px;font-weight:500;letter-spacing:.34em;text-transform:uppercase;
  color:var(--ember);margin:0 0 clamp(20px,3vw,34px);
  display:inline-flex;align-items:center;gap:14px;
}
.eyebrow::before{content:"";width:26px;height:1px;background:var(--ember);opacity:.75;}

/* ---- Top bar ---- */
/* Absolute against the initial containing block (document top), so it overlays the
   hero artwork. The notice bar is in normal flow ABOVE it, so the bar's height is
   exactly the topbar's start offset — logo and bar can never collide. */
.topbar{
  position:absolute;top:var(--icg-notice-h);left:0;right:0;z-index:6;
  display:flex;align-items:center;justify-content:space-between;
  padding:clamp(20px,3.4vw,34px) var(--gutter);
}
.topbar__mark img{height:22px;width:auto;opacity:.92;}

/* Header controls: language + reading aid (light/contrast toggle + font stepper).
   Rendered as chip buttons — same visual family as the contact CTAs — so older
   visitors actually SEE the language + reading options before they scroll. */
.topbar__tools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end;}
.lang{display:flex;align-items:center;gap:8px;}
.a11y{display:flex;align-items:center;gap:10px;}
.fs{display:inline-flex;}
.lang a,.tbtn{
  font-family:inherit;font-size:14px;font-weight:500;letter-spacing:.05em;line-height:1;
  color:var(--text);background:var(--btn-bg);
  border:1px solid var(--line-strong);border-radius:999px;
  padding:9px 15px;cursor:pointer;white-space:nowrap;
  display:inline-flex;align-items:center;gap:8px;
  transition:border-color .25s var(--ease),color .25s var(--ease),background .25s var(--ease);
}
.lang a:hover,.tbtn:hover,
.lang a[aria-current="true"],
.fs__btn[aria-pressed="true"],
.tbtn--theme[aria-pressed="true"]{
  border-color:var(--ember);background:var(--btn-active-bg);color:var(--btn-active-fg);
}
.tbtn--theme .tbtn__icon{font-size:16px;line-height:1;}
/* Segmented A / A+ / A++ — one connected control */
.fs__btn{border-radius:0;border-left-width:0;padding-inline:13px;min-width:38px;justify-content:center;}
.fs__btn:first-child{border-left-width:1px;border-top-left-radius:999px;border-bottom-left-radius:999px;}
.fs__btn:last-child{border-top-right-radius:999px;border-bottom-right-radius:999px;}
@media (max-width:640px){
  .topbar{flex-wrap:wrap;gap:12px 14px;}
  .tbtn--theme .tbtn__lbl{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0;}
}

/* ================= HERO ================= */
.hero{
  position:relative;
  /* The notice bar consumes real space at the top of the document, so the hero
     shrinks by exactly that much: bar + hero still equal one fold, never more. */
  min-height:calc(100svh - var(--icg-notice-h));
  display:flex;flex-direction:column;justify-content:center;
  overflow:hidden;
  isolation:isolate;
  /* Sky depth gradient — always present, reads as pre-dawn navy sky */
  background:
    radial-gradient(120% 88% at 50% 118%, rgba(43,46,131,.55) 0%, rgba(43,46,131,0) 46%),
    linear-gradient(180deg, var(--sky-top) 0%, var(--sky-mid) 52%, var(--sky-low) 100%);
}

/* (1) OPTIONAL licensed photograph goes here — drop an INDUSTRIAL/plant key-visual
   (a production complex / works on the horizon) and it slots straight in beneath the
   atmosphere overlays; no layout changes needed. Uncomment and set the file:
   .hero__photo{ background-image:url("hero.jpg"); }  */
.hero__photo{
  position:absolute;inset:0;z-index:-3;
  background-size:cover;background-position:center 62%;background-repeat:no-repeat;
  /* background-image: none;  <-- set a licensed INDUSTRIAL/plant photo here later */
}

/* (2) Ember dawn glow rising off the horizon */
.hero__glow{
  position:absolute;left:50%;bottom:-6%;z-index:-2;
  width:min(1400px,150%);height:62%;transform:translateX(-50%);
  background:
    radial-gradient(60% 100% at 50% 102%, rgba(233,78,27,.55) 0%, rgba(233,78,27,.22) 30%, rgba(233,78,27,0) 64%),
    radial-gradient(38% 78% at 50% 102%, rgba(246,140,80,.6) 0%, rgba(246,140,80,0) 58%),
    radial-gradient(24% 52% at 50% 104%, rgba(255,196,150,.5) 0%, rgba(255,196,150,0) 60%);
  filter:blur(5px);
  pointer-events:none;
  animation:dawn 14s ease-in-out infinite;
}

/* (3) Soft fog bands drifting above the skyline */
.hero__fog{position:absolute;inset:0;z-index:-2;pointer-events:none;overflow:hidden;}
.hero__fog span{
  position:absolute;left:-10%;right:-10%;height:120px;border-radius:50%;
  background:radial-gradient(closest-side, rgba(180,186,225,.10), rgba(180,186,225,0));
  filter:blur(10px);
}
.hero__fog span:nth-child(1){bottom:22%;height:180px;opacity:.8;}
.hero__fog span:nth-child(2){bottom:30%;left:8%;right:24%;height:120px;opacity:.55;}
.hero__fog span:nth-child(3){bottom:14%;left:-6%;right:40%;height:150px;opacity:.5;}

/* (4) Layered industrial silhouette: pale far plant in fog + darker near plant */
.hero__ridge{
  position:absolute;left:0;right:0;bottom:0;z-index:-1;
  width:100%;height:min(46vh,420px);
  pointer-events:none;
}
.hero__ridge svg{width:100%;height:100%;display:block;}

/* (5) Legibility scrim */
.hero::after{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:linear-gradient(180deg, rgba(var(--fade),.55) 0%, rgba(var(--fade),0) 26%, rgba(var(--fade),0) 60%, rgba(var(--fade),.28) 100%);
}

/* Hero content */
.hero__inner{position:relative;z-index:2;}
.hero__logo{
  height:clamp(46px,8.4vw,116px);width:auto;
  filter:drop-shadow(0 6px 30px rgba(0,0,0,.45));
}
/* Nur für Maschinen sichtbar: Text, der im Accessibility-Tree und für Crawler da
   ist, aber kein Pixel belegt. Nicht display:none — das nähme ihn auch dem
   Screenreader. Genutzt vom Markennamen in der Hero-<h1>. */
.u-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}

.lockup{
  margin:clamp(18px,2.4vw,30px) 0 0;
  font-weight:300;color:var(--ember-soft);
  font-size:clamp(15px,2.3vw,26px);
  letter-spacing:.26em;text-transform:lowercase;
}
.promise{
  margin:clamp(26px,4vw,44px) 0 0;
  font-weight:300;color:var(--text);
  font-size:clamp(19px,2.7vw,31px);
  line-height:1.4;letter-spacing:.005em;
  max-width:22ch;
}

/* Discreet scroll cue */
.scrollcue{
  position:absolute;left:var(--gutter);bottom:clamp(26px,4vw,44px);z-index:3;
  display:inline-flex;flex-direction:column;align-items:center;gap:10px;
  font-size:11px;letter-spacing:.3em;text-transform:uppercase;color:var(--muted);
  transition:color .35s var(--ease);
}
.scrollcue:hover{color:var(--muted);}
.scrollcue i{width:1px;height:56px;background:linear-gradient(var(--faint),transparent);display:block;}
.scrollcue i::after{
  content:"";position:absolute;left:50%;top:0;width:1px;height:18px;background:var(--ember);
  transform:translateX(-50%);animation:trickle 3.4s var(--ease) infinite;
}
.scrollcue span{writing-mode:vertical-rl;}

/* ================= SECTIONS ================= */
.band{position:relative;padding-block:clamp(96px,17vh,190px);}
.band--essence{
  background:var(--band-essence);
  border-top:1px solid var(--line);
}
.band--work{background:var(--band-work);border-top:1px solid var(--line);}
.band--contact{background:var(--panel);border-top:1px solid var(--line);}
/* Deliberately shallower than the content bands: suppliers are a footnote of substance,
   not a chapter. Reuses .uses for the list so no second list idiom enters the page. */
.band--partners{
  background:var(--band-partners);border-top:1px solid var(--line);
  padding-block:clamp(64px,11vh,120px);
}

/* Use cases — cryptic, sparse. A bold name + one quiet line each. */
.uses{list-style:none;margin:0;padding:0;max-width:min(100%,var(--measure));display:grid;gap:0;}
.uses li{
  display:grid;gap:8px;
  padding-block:clamp(22px,3vw,32px);
  border-bottom:1px solid var(--line);
}
.uses li:first-child{padding-top:0;}
.uses li:last-child{border-bottom:0;}
/* Die Überschrift IST der Auslöser des Zugangsdialogs — als <button>. Im RUHEZUSTAND
   optisch exakt wie die frühere <span>: kein Unterstrich, keine Farbe, kein Icon — der
   Zugang bleibt unangekündigt. Erst beim Hover (bzw. Tastaturfokus) erscheint eine
   dezente ember-Unterstreichung, sonst nichts (Pfeil und „mehr“ waren zu viel). */
.uses__name{
  font-weight:500;color:var(--text);
  font-size:clamp(19px,2.4vw,26px);letter-spacing:.005em;
  justify-self:start;text-align:left;
  display:inline-flex;align-items:center;gap:.45em;
  appearance:none;background:none;padding:0 0 3px;margin:0;
  border:0;border-bottom:1px solid transparent;text-decoration:none;
  font-family:inherit;line-height:inherit;cursor:pointer;
  transition:border-color .35s var(--ease);
}
/* 1px ist die Untergrenze für einen sauber gerenderten Border — „dünner“ heisst hier
   also leiser: halbtransparentes Ember statt Vollton, wirkt zarter als die 1px-Linie. */
.uses__name:hover,.uses__name:focus-visible{border-bottom-color:rgba(233,78,27,.5);}
.uses__name:focus-visible{outline:0;}
/* Leichtes ember-Schloss rechts neben dem Titel — nur bei gesperrten Fällen. AI Enabled
   Executives ist offen (echter Link) und trägt keins. Leise, kein lautes Signal. */
.uses__lock{
  width:.62em;height:.72em;flex:none;
  stroke:var(--ember);fill:none;stroke-width:1.5;
  opacity:.72;transform:translateY(.03em);
}
.uses__line{
  font-weight:300;color:var(--muted);
  font-size:clamp(15px,1.8vw,19px);line-height:1.5;max-width:min(100%,var(--measure));
}
/* ---- Zugangsdialog (assets/unlock.php prüft, nicht der Browser) ---- */
.lock{
  position:fixed;inset:0;z-index:120;
  display:flex;align-items:center;justify-content:center;padding:var(--gutter);
  background:var(--scrim);backdrop-filter:blur(3px);
}
.lock[hidden]{display:none;}
.lock__box{
  position:relative;width:min(100%,430px);
  background:var(--panel);border:1px solid var(--line-strong);
  padding:clamp(26px,4vw,38px);
}
.lock__eyebrow{
  margin:0 0 6px;font-size:12px;font-weight:500;letter-spacing:.28em;
  text-transform:uppercase;color:var(--ember);
}
.lock__name{margin:0 0 22px;font-weight:300;color:var(--text);font-size:clamp(19px,2.4vw,24px);}
.lock__label{
  display:block;margin-bottom:8px;font-size:12px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--faint);
}
.lock__input{
  width:100%;box-sizing:border-box;margin-bottom:18px;
  background:transparent;border:0;border-bottom:1px solid var(--line-strong);
  padding:10px 0;font:inherit;font-weight:300;font-size:17px;color:var(--text);
  letter-spacing:.06em;
}
.lock__input:focus{outline:0;border-bottom-color:var(--ember);}
.lock__go{
  appearance:none;cursor:pointer;font:inherit;font-size:15px;font-weight:400;
  letter-spacing:.14em;text-transform:uppercase;color:var(--text);
  background:none;border:1px solid var(--line-strong);padding:11px 26px;
  transition:border-color .4s var(--ease),color .4s var(--ease);
}
.lock__go:hover{border-color:var(--ember);color:var(--onhover);}
.lock__go[disabled]{opacity:.5;cursor:default;}
.lock__msg{margin:16px 0 0;font-size:14px;font-weight:300;line-height:1.5;color:var(--ember-soft);}
.lock__msg[hidden]{display:none;}
.lock__hint{
  margin:22px 0 0;padding-top:18px;border-top:1px solid var(--line);
  font-size:13.5px;font-weight:300;line-height:1.6;color:var(--muted);
}
.lock__close{
  position:absolute;top:10px;right:14px;
  appearance:none;background:none;border:0;cursor:pointer;
  font:inherit;font-size:26px;line-height:1;color:var(--faint);padding:4px 8px;
  transition:color .3s var(--ease);
}
.lock__close:hover{color:var(--text);}

/* Contact layout — portrait left, identity + gate stacked right on wide; stacked on narrow.
   Photo + intro are STATIC (always visible); only the gate's details are verified.
   Left-aligned tracks, matching the page's rhythm (.uses ~720, .lines ~660 are left-set,
   never pinned to opposite edges). The two tracks total ~784 at most, so the composition
   sits in the same left-hand column as every other block. */
.contact__cols{
  display:grid;grid-template-columns:1fr;
  gap:clamp(36px,5vw,48px);align-items:start;justify-content:start;
}
@media (min-width:900px){
  .contact__cols{
    grid-template-columns:280px minmax(0,440px);gap:clamp(40px,4vw,64px);
    /* stretch (not start) so the right column inherits the portrait's height and
       has room to push its last child down — see .contact__gate below. */
    align-items:stretch;
  }
}

/* Right-hand stack: name + profile and the gated contact read as one column. */
.contact__stack{
  display:grid;gap:clamp(28px,3.5vw,40px);align-content:start;
}

/* Two-column only: the contact block sits flush with the portrait's BOTTOM edge.
   The stack fills the row (as tall as the photo) and the gate is pushed down with
   an auto margin — no fixed offsets, so it holds at any type/photo size.
   Bottom-anchoring also keeps the gate's bottom edge FIXED across both gate states:
   the idle hint and the revealed e-mail+phone differ in height, but both grow
   upward from the same baseline, so nothing lurches when Turnstile resolves.
   Below 900px the stack is a plain single column in source order — untouched. */
@media (min-width:900px){
  .contact__stack{display:flex;flex-direction:column;}
  .contact__gate{margin-top:auto;}
}

/* Portrait: an aperture into daylight, dissolving into the band.
   The source is a bright Munich daylight shot, not a dark studio headshot — so a
   full vignette would smear the sky into a grey blob. Instead the crisp top reads as
   a window cut into the pre-dawn canvas, while the bottom (already brand navy — the
   suit) is masked away so the figure dissolves into the band rather than sitting in
   a box. No radius, no border: consistent with the page's hard-edged geometry.
   Ember appears once here, on the role line — the photo carries no second accent. */
.who{margin:0;max-width:280px;width:100%;}
.who__frame{position:relative;}
.who__frame img{
  width:100%;height:auto;
  filter:saturate(.88) contrast(1.04) brightness(.94);
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 54%,rgba(0,0,0,.55) 80%,rgba(0,0,0,0) 100%);
          mask-image:linear-gradient(180deg,#000 0%,#000 54%,rgba(0,0,0,.55) 80%,rgba(0,0,0,0) 100%);
}
.who__cap{margin:0;max-width:44ch;}
.who__name{
  margin:0;font-weight:500;color:var(--text);
  font-size:clamp(18px,2.1vw,21px);letter-spacing:.005em;line-height:1.3;
}
.who__role{
  margin:6px 0 0;font-weight:300;color:var(--ember-soft);
  font-size:12px;letter-spacing:.2em;text-transform:uppercase;line-height:1.4;
}
.who__line{
  margin:14px 0 0;font-weight:300;color:var(--muted);
  font-size:clamp(14px,1.6vw,16px);line-height:1.55;max-width:34ch;
}

/* Contact gate — details revealed to verified humans only (anti-scraping) */
.contact__gate{max-width:min(100%,560px);}
.contact__hint{
  margin:0;font-weight:300;color:var(--muted);
  font-size:clamp(15px,1.8vw,19px);line-height:1.6;max-width:46ch;
}
.contact__hint[data-state="checking"]{color:var(--muted);}
.contact__reveal{display:flex;flex-direction:column;align-items:flex-start;gap:clamp(14px,2vw,20px);}
.contact__reveal[hidden]{display:none;}
.contact__addr{margin:0;font-weight:300;color:var(--muted);font-size:clamp(15px,1.7vw,18px);line-height:1.6;}
.contact__addr a{border-bottom:1px solid var(--line-strong);padding-bottom:2px;transition:border-color .4s var(--ease),color .4s var(--ease);}
.contact__addr a:hover{border-color:var(--ember);color:var(--text);}
.cf-turnstile{margin:0;}

/* Enigmatic lines: sparse, large, light. Each line stands alone. */
.lines{max-width:min(94%,660px);}
.lines p{
  margin:0;font-weight:300;
  font-size:clamp(22px,3vw,36px);
  line-height:1.32;letter-spacing:.004em;color:var(--text);text-wrap:balance;
}
.lines p + p{margin-top:clamp(16px,2.2vw,26px);color:var(--muted);}
.lines .accent{color:var(--ember-soft);}

/* Contact */
/* Der Vorspann trägt jetzt einen Einladungsabsatz unter sich (.contact__invite), der
   den Abstand zum Kontaktblock übernimmt. Deshalb hier nur noch der kleine Abstand
   zum eigenen Folgeabsatz — sonst klaffte zwischen Lead und Einladung ein Loch. */
.contact__lead{
  font-weight:300;color:var(--text);
  font-size:clamp(21px,3vw,34px);line-height:1.35;max-width:22ch;margin:0 0 clamp(16px,2.2vw,24px);
}
/* Owner 2026-09-02: eine Leerzeile zwischen Einladungstext und Porträt.
   Doppelselektor .bandtext.contact__invite ist Absicht: .bandtext steht WEITER UNTEN in
   dieser Datei (Z. 644) und setzt margin-bottom auf 0. Bei gleicher Spezifität gewann
   bisher .bandtext — der Abstand hier war deshalb nie wirksam. */
.bandtext.contact__invite{margin:0 0 clamp(70px,8vw,100px);max-width:min(100%,var(--measure));}
.cta{
  display:inline-flex;align-items:baseline;gap:16px;
  font-size:clamp(17px,2vw,22px);font-weight:300;letter-spacing:.02em;color:var(--text);
  padding-bottom:8px;border-bottom:1px solid var(--line-strong);
  transition:border-color .4s var(--ease),color .4s var(--ease);
}
.cta:hover{border-color:var(--ember);color:var(--onhover);}
.cta em{font-style:normal;color:var(--ember);font-weight:500;transition:transform .4s var(--ease);}
.cta:hover em{transform:translateX(4px);}

/* ================= FOOTER + LEGAL ================= */
.foot{
  background:var(--foot-bg);border-top:1px solid var(--line);padding-block:clamp(56px,9vh,96px);color:var(--muted);
  /* The logo's rendered box, as two tokens. They are the single source of truth for the
     logo AND for how far .foot__meta is pushed down to meet the brand line (see there):
     resize the logo here and the alignment follows by itself. */
  --foot-logo-h:31px;
  --foot-logo-gap:16px;
}
.foot__top{display:flex;flex-wrap:wrap;gap:28px 48px;align-items:flex-start;justify-content:space-between;}
/* display:block, not the default inline: an inline img sits on a text baseline and drags
   the line box's descender space along under it, so the logo's block would be a few px
   taller than --foot-logo-h and the calc() in .foot__meta would not land. As a block the
   img occupies exactly --foot-logo-h + --foot-logo-gap and the arithmetic is honest. */
.foot__brand img{display:block;height:var(--foot-logo-h);width:auto;opacity:.9;margin-bottom:var(--foot-logo-gap);}
.foot__brand p{margin:0;font-size:14px;color:var(--faint);max-width:34ch;line-height:1.6;}
/* The company name is a legal entity and must never break across lines — the <br> after
   "der" places the break, this keeps the name itself whole at any column width. */
.foot__brand .nb{white-space:nowrap;}
/* Footnote line under the brand: quieter than the brand line by size (13px vs 14px),
   not by contrast — same --faint as the brand line, one source of truth. */
.foot__brand p.foot__more{margin:36px 0 0;max-width:none;font-size:13px;color:var(--faint);}
.foot__brand p.foot__more a{color:var(--muted);border-bottom:1px solid var(--line);transition:border-color .4s var(--ease),color .4s var(--ease);}
.foot__brand p.foot__more a:hover{border-color:var(--ember);color:var(--text);}
/* One product = one .foot__more-item span: the linked name, then plain-text platform
   labels in brackets. A further product is a copy of that span and nothing else — the
   comma between items is generated here, never typed, so the list never needs re-spacing
   by hand as it grows. Only the name is a link; the labels stay in the line's own --faint
   and the brackets sit outside the <a>, so nothing but the name is underlined. */
.foot__brand .foot__more-item:not(:last-child)::after{content:",";}
/* The row aligns at flex-start, i.e. at the top of the logo. This block belongs to the
   brand LINE, not the logo, so it is offset by exactly the logo's own box — height + its
   margin-bottom, read from the same tokens the logo uses. Never hardcode this number:
   it is the logo's size, and the logo has been resized twice already. */
.foot__meta{
  font-size:13px;color:var(--faint);line-height:1.9;text-align:right;
  margin-top:calc(var(--foot-logo-h) + var(--foot-logo-gap));
}
.foot__meta a:hover{color:var(--text);}

/* No padding-top here on purpose. Every doc row already carries its own 22px above its
   text (details.doc > summary padding), and that is what sets the gap under a rule for
   Datenschutz and every row after it. A padding-top here would apply only to the FIRST
   row, Impressum, stacking on top of its summary padding and making that one gap
   ~50-66px against everyone else's 22px. The rule-to-text gap is the summary's job. */
.legal{margin-top:clamp(18px,2.5vh,26px);border-top:1px solid var(--line);}
details.doc{border-bottom:1px solid var(--line);}
details.doc > summary{
  list-style:none;cursor:pointer;
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:22px 2px;font-size:14px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  transition:color .3s var(--ease);
}
details.doc > summary:hover{color:var(--text);}
details.doc > summary::-webkit-details-marker{display:none;}
details.doc > summary .plus{color:var(--ember);font-weight:500;font-size:20px;line-height:1;transition:transform .3s var(--ease);}
details.doc[open] > summary .plus{transform:rotate(45deg);}
.doc__body{
  max-height:52vh;overflow-y:auto;
  padding:6px 20px 30px 2px;margin-bottom:8px;
  font-size:13px;line-height:1.7;color:var(--faint);
}
.doc__body p{margin:0 0 1em;}
.doc__body p:first-child{color:var(--muted);}
.doc__body strong{color:var(--muted);font-weight:500;}
/* The global a{color:inherit} would sink a link into the --faint body text with no
   affordance at all. Same treatment as the only other in-prose link on the page
   (.foot__more a): --muted (7.07:1 on #080915) lifted off the --faint copy, hairline
   rule under it, ember on hover. No new colour, no new gesture. */
.doc__body a{color:var(--muted);border-bottom:1px solid var(--line);transition:border-color .4s var(--ease),color .4s var(--ease);}
.doc__body a:hover{border-color:var(--ember);color:var(--text);}
.doc__body::-webkit-scrollbar{width:8px;}
.doc__body::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px;}
.copyline{margin-top:clamp(34px,5vh,56px);font-size:12px;letter-spacing:.14em;color:var(--faint);text-transform:uppercase;}
.ai-note{margin-top:10px;font-size:11px;line-height:1.55;letter-spacing:.02em;color:var(--faint);text-transform:none;max-width:60ch;}
.ai-note a{color:inherit;text-decoration:underline;text-underline-offset:2px;}
.ai-note a:hover{color:var(--ink,currentColor);}

/* ================= Motion ================= */
@keyframes dawn{0%,100%{opacity:.82;}50%{opacity:1;}}
@keyframes trickle{0%{transform:translate(-50%,-100%);opacity:0;}25%{opacity:1;}70%{opacity:.6;}100%{transform:translate(-50%,220%);opacity:0;}}

/* Restrained entrance */
.reveal{opacity:0;transform:translateY(18px);}
.is-in .reveal,.reveal.is-in{opacity:1;transform:none;transition:opacity 1.1s var(--ease),transform 1.1s var(--ease);}
.hero .reveal{transition-delay:var(--d,0s);}

@media (max-width:640px){
  /* Single column: there is no logo beside this block to align to any more, so the
     logo-sized offset must go — flex gap does not collapse into it, the two would add up
     to a ~75px hole between the brand block and this one. The 28px row gap is the spacing. */
  .foot__meta{text-align:left;margin-top:0;}
  .foot__top{flex-direction:column;}
  .promise,.lines{max-width:100%;}
  .scrollcue{display:none;}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
  .hero__glow{animation:none;}
  .scrollcue i::after{animation:none;opacity:.5;}
  .reveal{opacity:1;transform:none;transition:none;}
}

/* ============ ANGEBOTS-KACHELN (ab 2026-08-28) ============
   Für den AIEE-Block: zwei gleichrangige Formate, je drei Zeilen und ein Preis-ab.
   Bewusst EIGENE, schlanke Bauteile statt der .tier-Karten von aiee.eu — die Dachseite
   soll die Formate ANTEASERN, nicht das Preisband der Produktseiten nachbauen. Wer hier
   klickt, liest die Details dort.

   Bewusst KEIN Bestell-CTA auf dieser Seite: ISTARIUM erzählt die Firma, aiee.eu erzählt
   das Angebot. Verkauft wird auf der Produktseite. */
.duo{
  list-style:none;margin:clamp(30px,4.5vw,48px) 0 0;padding:0;
  display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(14px,2vw,22px);
  max-width:min(100%,var(--measure));align-items:stretch;
}
@media (max-width:760px){ .duo{grid-template-columns:1fr;max-width:min(94%,34rem);} }
.duo li{
  display:flex;flex-direction:column;
  padding:clamp(20px,2.6vw,30px);border-radius:14px;
  background:color-mix(in srgb,var(--panel) 55%,transparent);
  border:1px solid var(--line);
}
.duo__name{margin:0;font-weight:400;color:var(--text);font-size:clamp(19px,2.2vw,24px);letter-spacing:.005em;}
.duo__meta{margin:8px 0 0;font-weight:300;color:var(--ember);font-size:clamp(13px,1.4vw,14px);letter-spacing:.02em;}
.duo__line{margin:clamp(12px,1.6vw,16px) 0 0;font-weight:300;color:var(--muted);
  font-size:clamp(14px,1.5vw,16px);line-height:1.65;}
.duo__cta{margin:auto 0 0;padding-top:clamp(16px,2vw,22px);}
.duo__cta a{
  display:inline-block;font-weight:500;font-size:15px;color:var(--ember);text-decoration:none;
  padding:10px 18px;border-radius:9px;
  border:1px solid color-mix(in srgb,var(--ember) 45%,transparent);
  transition:background .2s var(--ease);
}
.duo__cta a:hover{ background:color-mix(in srgb,var(--ember) 12%,transparent); }

/* Fließtext-Absatz in einem Band — für die Brücke zu MAI Advisory und die Einleitung
   über dem AIEE-Block. .lines ist für kurze Zeilen gebaut, nicht für Absätze. */
.bandtext{margin:clamp(18px,2.4vw,26px) 0 0;max-width:min(100%,var(--measure));font-weight:300;color:var(--muted);
  font-size:clamp(15px,1.7vw,18px);line-height:1.7;}
.bandtext b{color:var(--text);font-weight:500;}
.bandtext a{color:var(--ember);text-decoration:none;
  border-bottom:1px solid color-mix(in srgb,var(--ember) 40%,transparent);}
.bandtext a:hover{border-bottom-color:var(--ember);}
.bandtext + .bandtext{margin-top:clamp(12px,1.6vw,18px);}

/* Organigramm der digitalen Mitarbeiter. Volle Breite im Band, dunkler Hintergrund
   durchscheinend — die SVG ist transparent und trägt eigene Farben. */
.orbit{margin:clamp(28px,4vw,44px) 0 0;max-width:min(100%,var(--measure));}
.orbit img{width:100%;height:auto;display:block;border-radius:14px;}
.orbit figcaption{margin:clamp(12px,1.6vw,16px) 0 0;font-weight:300;color:var(--faint);
  font-size:clamp(13px,1.4vw,14px);line-height:1.6;max-width:min(100%,var(--measure));}

/* .uses stand bisher immer direkt unter der Eyebrow und brauchte deshalb keinen
   eigenen Abstand. Seit „In Entwicklung" eine .lines-Überschrift darüber hat,
   braucht die Liste einen — sonst klebt der erste Eintrag an der Zeile. */
.lines + .uses{margin-top:clamp(30px,4.5vw,48px);}

/* ============ ZWEI MARKEN NEBENEINANDER (ab 2026-08-28) ============
   ISTARIUM und MAI Advisory gleichrangig in EINER Reihe. Bewusst kein Trennstrich
   und kein „zwei Hälften"-Pathos (Owner 2026-08-28): es gehört zusammen, es steht
   nur unter zwei Marken. Beide Logos in Schauwert-Größe — wer MAI Advisory kennt,
   soll die Marke sehen, nicht bloß lesen. */
.pair{
  list-style:none;margin:clamp(30px,4.5vw,48px) 0 0;padding:0;
  display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(26px,4vw,56px);
  max-width:min(100%,var(--measure));align-items:start;
}
@media (max-width:760px){ .pair{grid-template-columns:1fr;gap:clamp(34px,6vw,44px);} }
.pair__side{display:grid;align-content:start;}
/* Beide Logos hängen an derselben Zeile, aber NICHT an derselben Höhe: der
   ISTARIUM-Schriftzug ist 2,3:1, der MAI-Advisory-Block fast quadratisch (mit
   Diagonale im Bild). Gleiche Höhe ließe MAI Advisory halb so groß wirken —
   angeglichen wird die optische Breite, nicht die Zahl.
   Damit die beiden Spalten trotz ungleicher Logohöhe auf EINER Linie weiterlaufen,
   steht jedes Logo in einer Box, die so hoch ist wie das größere, und sitzt darin
   auf der Grundlinie. Ohne das startet die rechte Spalte 40px tiefer als die linke. */
.pair__mark{display:flex;align-items:center;min-height:clamp(58px,7.6vw,100px);}
.pair__logo{height:var(--brandmark-h);width:auto;opacity:.94;}
.pair__logo--iss{--brandmark-h:clamp(38px,5.3vw,70px);}
.pair__logo--map{--brandmark-h:clamp(58px,7.6vw,100px);margin-left:-4px;}
.pair__role{
  margin:clamp(18px,2.4vw,26px) 0 0;font-size:12px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:var(--ember-soft);
}
.pair__line{
  margin:10px 0 0;font-weight:300;color:var(--muted);
  font-size:clamp(15px,1.6vw,17px);line-height:1.65;max-width:38ch;
}
.pair__line a{color:var(--ember);border-bottom:1px solid color-mix(in srgb,var(--ember) 40%,transparent);}
.pair__line a:hover{border-bottom-color:var(--ember);}
/* Die Adresse steht als EIGENER Absatz unter der Beschreibung, auf beiden Seiten
   gleich (Owner 2026-08-30). Vorher hing nur bei MAI Advisory ein Link mitten im
   Satz — das las sich wie eine Fußnote und fehlte bei ISTARIUM ganz. */
.pair__url{margin:clamp(16px,2.2vw,22px) 0 0;font-weight:300;font-size:clamp(14px,1.5vw,16px);}
.pair__url a{color:var(--ember);border-bottom:1px solid color-mix(in srgb,var(--ember) 40%,transparent);}
.pair__url a:hover{border-bottom-color:var(--ember);}

/* ============ NETZWERK-ELLIPSE (ab 2026-08-28) ============
   Die Köpfe laufen auf einer liegenden Ellipse statt in Kacheln (Owner). Gerechnet
   wird ausschließlich in CSS: der Ring veröffentlicht EINEN Winkel --t, jedes
   Mitglied leitet daraus seine eigene Position ab (--a = eigener Sektor + --t).
   Weil --t per @property als <angle> registriert ist, bewegt eine einzige
   Keyframe-Animation alle Positionen — kein JS, und pro Frame nur transform,
   also kein Layout. Ohne @property-Unterstützung bleibt --t bei 0deg: die
   Ellipse steht still, die Anordnung stimmt trotzdem.
   Dieselbe Bühne soll später die Agenten/KI-Mitarbeiter tragen — die Positionen
   hängen an --n, die Zahl der Köpfe ist also frei. */
@property --t{syntax:"<angle>";inherits:true;initial-value:0deg;}

.crew{margin:clamp(30px,4.5vw,48px) 0 0;max-width:min(100%,var(--measure));}
.crew__stage{
  position:relative;height:clamp(420px,52vw,560px);
  /* Halbachsen der Ellipse. Als absolute Längen, NICHT in Prozent: ein Prozentwert
     in translate() bezöge sich auf das Mitglied selbst, nicht auf die Bühne.
     --ry muss die BESCHRIFTUNG mittragen: bei 132px stieß die Rollenzeile eines
     Kopfes in das Foto des Nachbarn darunter (gemessen 2026-08-28, „Supply Chain
     Expert" bricht auf zwei Zeilen um). Die Bühnenhöhe folgt 2*--ry + Kopfhöhe. */
  --rx:clamp(118px,30vw,320px);
  --ry:clamp(128px,17vw,178px);
}
/* Ruhige Mitte: die Marke, stark zurückgenommen. Sie ist der Anker der Komposition,
   nicht ihr Inhalt — die Menschen sind der Inhalt. */
.crew__hub{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  height:clamp(29px,3.8vw,46px);width:auto;opacity:1;
}
.crew__ring{list-style:none;margin:0;padding:0;position:absolute;inset:0;
  animation:crew-orbit 210s linear infinite;}
@keyframes crew-orbit{to{--t:360deg;}}
/* Anhalten, sobald jemand hinschaut oder mit der Tastatur hineingeht — Namen lesen
   soll man im Stand, nicht im Vorbeifahren. */
.crew:hover .crew__ring,.crew:focus-within .crew__ring{animation-play-state:paused;}
.crew__m{
  --a:calc(var(--i) / var(--n) * 360deg + var(--t) - 90deg);
  position:absolute;left:50%;top:50%;
  width:clamp(96px,12vw,128px);
  /* Erst scale (um die eigene Mitte), dann die Verschiebung auf die Ellipse.
     Der leichte Größenunterschied ist die Tiefe: unten = vorne. */
  transform:
    translate(calc(var(--rx) * cos(var(--a)) - 50%), calc(var(--ry) * sin(var(--a)) - 50%))
    scale(calc(.88 + .06 * (1 + sin(var(--a)))));
}
.crew__m figure{margin:0;display:grid;justify-items:center;gap:10px;}
/* Graustufen ist hier keine Stilgeste, sondern Notwendigkeit: die übernommenen
   Porträts sind teils Farb-, teils S/W-Aufnahmen. Einheitlich entsättigt lesen sie
   sich als eine Mannschaft; Farbe kommt beim Hover zurück. */
/* +10 % gegenüber dem Stand vom 2026-08-30 (Owner 2026-09-02): 64/8/86 → 70/8.8/95. */
.crew__m img{
  width:clamp(70px,8.8vw,95px);height:auto;border-radius:50%;
  filter:grayscale(1) contrast(1.06) brightness(.96);
  border:1px solid var(--line-strong);
  transition:filter .45s var(--ease),border-color .45s var(--ease);
}
.crew__m:hover img,.crew__m:focus-within img{filter:none;border-color:var(--ember);}
.crew__m figcaption{display:grid;gap:3px;text-align:center;line-height:1.3;}
.crew__m figcaption b{font-weight:500;font-size:13.5px;color:var(--text);}
/* Enge Laufweite und 10px: die Rollen sind teils dreiwortig („Senior Technology
   Expert"). Bei .12em/10.5px sprengten sie die Spaltenbreite und liefen in den
   Nachbarn. Kein Kürzen der Titel — die sind von MAI Advisory übernommen. */
.crew__m figcaption span{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ember-soft);}

/* Kurzprofil beim Hover/Fokus (Owner 2026-08-30) — derselbe Dreizeiler wie bei
   MAI Advisory. Es hängt AM MITGLIED, nicht an der Bühne: das Mitglied trägt die
   Ellipsen-Transformation, das Feld fährt also von selbst mit und braucht keine
   eigene Positionsrechnung. Der Ring hält beim Hover ohnehin an (.crew:hover),
   das Feld steht also still, während man es liest.
   pointer-events:none — sonst flackert es, sobald der Zeiger es selbst berührt.

   Owner 2026-09-02: das Feld liegt jetzt ÜBER Foto UND Beschriftung statt darunter.
   Vorher hing es unterhalb und schob sich bei den unteren Köpfen aus der Bühne heraus.
   Zentriert auf das Mitglied (translate -50%/-50%), mit eigenem, deutlich hellerem
   Grund — es soll wie eine aufgelegte Karte wirken, nicht wie ein Teil des Bandes.
   --bio-bg/--bio-fg sind eigene Token, weil der Kasten in BEIDEN Themes heller sein
   muss als sein Untergrund: im Dunkelmodus ein angehobenes Panel, im Hellmodus Weiß. */
.crew__bio{
  /* Deutlich angehoben gegenüber dem Band (#0d0f24): bei #1b1f3d verschwand die Karte
     im Untergrund, sie soll aufgelegt wirken (Owner 2026-09-02, gerendert geprüft). */
  --bio-bg:#282e58;
  --bio-fg:#eceefa;
  --bio-line:rgba(237,238,246,.42);
  /* top UND bottom gesetzt: der Kasten spannt sich damit über die volle Höhe des
     Mitglieds (Foto + Beschriftung) plus 10px Überstand. Nur zentriert reichte nicht —
     die Rollenzeile lugte unten heraus (gemessen 2026-09-02). */
  position:absolute;left:50%;top:-10px;bottom:-10px;transform:translateX(-50%);
  width:max-content;max-width:230px;z-index:5;
  display:flex;align-items:center;
  margin:0;padding:12px 14px;border-radius:2px;
  background:var(--bio-bg);border:1px solid var(--bio-line);
  font-size:12px;font-weight:300;line-height:1.5;color:var(--bio-fg);text-align:left;
  box-shadow:0 12px 30px rgba(8,9,21,.55);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .3s var(--ease),visibility .3s var(--ease);
}
html[data-theme="light"] .crew__bio{
  --bio-bg:#ffffff;
  --bio-fg:#14162b;
  --bio-line:rgba(20,22,43,.28);
  box-shadow:0 12px 30px rgba(20,22,43,.18);
}
.crew__m:hover .crew__bio,.crew__m:focus .crew__bio,.crew__m:focus-within .crew__bio{
  opacity:1;visibility:visible;
}
/* Ohne das läge die Karte unter dem nächsten Kopf: .crew__m trägt eine transform und
   bildet damit einen eigenen Stapelkontext — das z-index im Feld allein reicht nicht. */
.crew__m:hover,.crew__m:focus,.crew__m:focus-within{z-index:10;}
.crew__m:focus{outline:0;}
.crew__m:focus-visible{outline:2px solid var(--ember-soft);outline-offset:6px;}

/* Schmale Geräte: die Ellipse trägt sieben Namen nicht mehr, ohne dass sich die
   Beschriftungen überlagern. Statt sie zu verkleinern bis zur Unlesbarkeit wird die
   Bühne aufgelöst und die Köpfe stehen in einer Reihe — dieselbe Information. */
/* Schmale Geräte: VERTIKALES KARUSSELL statt Ellipse (Owner 2026-09-02).
   Erst wurde die Ellipse zu Kacheln untereinander aufgelöst — sieben volle Kacheln machten
   die Seite auf dem Handy aber ewig lang, und darum geht es hier nicht: das Band soll
   zeigen, DASS da eine Mannschaft ist, nicht jede Biografie erzählen.
   Deshalb: kompakte Kachel (kleines Foto, Name, Rolle — keine Details), das Kurzprofil
   bleibt mobil ganz weg, und die Liste läuft in einem eigenen Scrollfeld mit Platz für
   etwa drei Kacheln. Der weiche Rand oben/unten (mask) ist die Ansage „hier geht es
   weiter" — ohne ihn liest sich der Abschnitt als abgeschnitten, nicht als scrollbar.
   Die Porträts laufen hier in Farbe: die Entsättigung war die Voraussetzung dafür, dass
   Farbe beim Hover zurückkommt — ohne Hover bleibt sie sonst für immer weg. */
@media (max-width:720px){
  .crew__stage{height:auto;}
  .crew__hub{display:none;}
  .crew__ring{
    position:static;animation:none;display:grid;grid-template-columns:1fr;gap:10px;
    max-height:clamp(200px,40vh,264px);overflow-y:auto;
    scroll-snap-type:y proximity;
    padding:2px;
    -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 6px,#000 calc(100% - 22px),transparent 100%);
            mask-image:linear-gradient(180deg,transparent 0,#000 6px,#000 calc(100% - 22px),transparent 100%);
  }
  .crew__m{
    /* left/top müssen mit zurückgesetzt werden — die Basisregel setzt beide auf 50 %
       für die Ellipse; ohne das Zurücksetzen rutscht jede Kachel um die halbe
       Bühnenbreite nach rechts aus dem Bild. */
    position:relative;left:auto;top:auto;transform:none;width:auto;
    padding:10px 14px;border:1px solid var(--line);background:var(--panel);border-radius:2px;
    scroll-snap-align:start;
  }
  .crew__m figure{
    grid-template-columns:auto minmax(0,1fr);
    align-items:center;justify-items:start;column-gap:12px;row-gap:0;
  }
  .crew__m img{width:44px;filter:none;}
  .crew__m figcaption{text-align:left;justify-items:start;gap:1px;}
  /* Kurzprofil mobil ganz raus — es ist der Grund, warum die Kachel dreimal so hoch war. */
  .crew__bio{display:none;}
}
@media (prefers-reduced-motion:reduce){
  .crew__ring{animation:none;}
}

/* KACHELN STATT ELLIPSE (Owner 2026-09-08, aus `.crew--pair` hervorgegangen) — steht
   bewusst GANZ AM ENDE des crew-Blocks, damit diese Regeln auch die Handy-Auflösung oben
   überschreiben (Reihenfolge, nicht nur Spezifität). Die Ellipse bleibt vollständig
   erhalten: Bühne, Ring-Animation und Nabe werden hier nur stillgelegt, nicht gelöscht —
   mit mehr Köpfen (oder den Agenten) trägt sie wieder.
   Wenige Köpfe im rotierenden Ring lasen sich als halb leere Mannschaft; als ruhige Reihe
   nebeneinander lesen sie sich als das, was sie sind. Deshalb steht die Bio hier auch
   fest statt beim Hover: bei drei Personen ist Platz dafür, und eine aufklappende Karte
   über drei Köpfe wirkt wie ein Versteck.
   `1fr` statt einer festen Maximalbreite: bei minmax(200px,260px) passten 3 Kacheln plus
   Gaps nicht mehr in die 880px-Textspalte und die dritte fiel in eine zweite Zeile. */
.crew--tiles .crew__stage{height:auto;}
.crew--tiles .crew__hub{display:none;}
.crew--tiles .crew__ring{
  position:static;animation:none;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:clamp(26px,3.6vw,44px);justify-content:start;
  max-height:none;overflow:visible;
  -webkit-mask-image:none;mask-image:none;
}
.crew--tiles .crew__m{
  position:static;left:auto;top:auto;transform:none;width:auto;
  padding:0;border:0;background:none;
}
.crew--tiles .crew__m figure{grid-template-columns:1fr;justify-items:start;gap:14px;row-gap:14px;}
/* Schwarzweiß bleibt schwarzweiß — auch beim Hover (Owner 2026-09-08). Tillmanns Bild ist
   echtes Graustufen-JPEG, die beiden anderen sind RGB: ein Hover, der die Farbe zurückholt,
   färbte zwei von drei Kacheln ein und ließ die dritte grau stehen. */
.crew--tiles .crew__m img{width:clamp(88px,10vw,112px);filter:grayscale(1) contrast(1.06) brightness(.96);}
.crew--tiles .crew__m figcaption{text-align:left;justify-items:start;}
.crew--tiles .crew__bio{
  display:block;position:static;transform:none;
  width:auto;max-width:30ch;
  opacity:1;visibility:visible;pointer-events:auto;
  background:none;border:0;box-shadow:none;padding:0;margin:0;
  color:var(--muted);font-size:12.5px;line-height:1.55;
}
/* Muss den Theme-Selektor mitführen: html[data-theme="light"] .crew__bio ist spezifischer
   als .crew--tiles .crew__bio und setzte den Schatten der Hover-Karte sonst wieder — ohne
   Grund darunter blieb ein grauer Kasten aus dem Nichts stehen (gerendert geprüft). */
html[data-theme="light"] .crew--tiles .crew__bio{box-shadow:none;background:none;}
