/* =========================================================================
   ENNS – Engineering Systems
   Design system & styles · self-hosted, no external dependencies
   Colours (CD): Precision Blue #151f35 · Energy Green #00db9e
                 Clarity Grey #c6c9d1 · Substance White #f9f7f7
   Type: Bahnschrift (DIN 1451) via Adobe Fonts/Typekit – berechtigtes Interesse (CI)
   ========================================================================= */

/* ---------- Tokens ---------- */
:root{
  --blue:#151f35; --blue-900:#0f1727; --blue-800:#1b2740; --blue-700:#26344f;
  /* Energy Green ist auf den dunklen Flächen die Markenfarbe (9:1 und besser).
     Auf Substance White misst dasselbe Grün 1,69:1 – unlesbar. --green-ink ist
     deshalb KEIN Ersatz der Markenfarbe, sondern ihr Textton für helle Flächen
     (≈5,5:1 auf #f9f7f7). Regel: Fläche dunkel → --green, Fläche hell → --green-ink. */
  --green:#00db9e; --green-600:#00db9e; --green-ink:#00734f; --green-glow:rgba(0,219,158,.35);
  --grey:#c6c9d1; --grey-500:#9aa1b0; --grey-600:#7b8494; --grey-700:#5c6472;
  --white:#f9f7f7; --paper:#ffffff;
  --ink:#151f35; --ink-soft:#42506a;

  /* Bahnschrift (DIN 1451) via Adobe Fonts/Typekit; DIN-Fallbacks je OS, dann System */
  --font-body:'bahnschrift','Bahnschrift','DIN Alternate','Segoe UI',system-ui,-apple-system,Arial,sans-serif;
  --font-head:'bahnschrift','Bahnschrift','DIN Condensed','DIN Alternate','Segoe UI',system-ui,Arial,sans-serif;

  --wrap:1180px; --gap:clamp(1rem,3vw,2rem);
  --sp-sec:clamp(4.5rem,9vw,8.5rem);
  /* Glas: durchscheinende Flächen mit Unschärfe, feiner Kante und Lichtkante oben */
  --glass-d:rgba(255,255,255,.055); --glass-d-line:rgba(255,255,255,.14);
  --glass-l:rgba(255,255,255,.55);  --glass-l-line:rgba(21,31,53,.09);
  --glass-blur:16px;
  --glass-hi:inset 0 1px 0 rgba(255,255,255,.22);
  --glass-hi-l:inset 0 1px 0 rgba(255,255,255,.9);

  --radius:14px; --radius-lg:22px;
  --ease:cubic-bezier(.22,.61,.36,1);
  --line:1px solid rgba(197,201,210,.22);
  --shadow:0 24px 60px -24px rgba(6,14,28,.55);
}

/* ---------- Reset ---------- */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  font-family:var(--font-body);font-weight:400;font-size:clamp(1rem,.6vw + .9rem,1.125rem);
  line-height:1.65;color:var(--ink);background:var(--white);
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
html{overflow-x:clip}
img,svg{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
ul{list-style:none}
/* Der Fokusring muss auf beiden Flächen sichtbar sein: Energy Green auf hell
   landete bei 1,7:1 (WCAG 2.2 SC 2.4.11). Grundstellung ist deshalb der dunkle
   Ton, die dunklen Flächen holen sich das leuchtende Grün zurück. */
:focus-visible{outline:2px solid var(--green-ink);outline-offset:3px;border-radius:4px}
.surface-dark :focus-visible,.surface-deep :focus-visible,
.hero :focus-visible,.site-header :focus-visible,.site-footer :focus-visible{outline-color:var(--green)}
::selection{background:var(--green);color:var(--blue)}

/* Sprungmarke: eine Seite, rund 30 fokussierbare Elemente – ohne sie tabbt
   man jedes Mal durch den kompletten Kopf. */
.skip-link{position:absolute;left:1rem;top:-4rem;z-index:120;
  background:var(--green);color:var(--blue);font-weight:600;font-size:.95rem;
  padding:.7em 1.2em;border-radius:100px;transition:top .2s var(--ease)}
.skip-link:focus{top:1rem}

/* ---------- Type ---------- */
/* Radikale Typo – Bahnschrift trägt große Grade. Umbruchschutz sorgt dafür,
   dass auch lange deutsche Komposita auf schmalen Displays nicht überlaufen. */
/* Keine Silbentrennung in Schaugrößen – „An-lagen“ wirkt wie ein Satzfehler.
   overflow-wrap fängt Extremfälle trotzdem ab, text-wrap:balance verteilt
   die Zeilen gleichmäßiger. */
h1,h2,h3,h4{font-family:var(--font-head);font-weight:700;line-height:1.02;letter-spacing:-.015em;
  color:var(--blue);overflow-wrap:break-word;hyphens:none;text-wrap:balance}
h1{font-size:clamp(3rem,9.5vw,8.5rem);font-weight:700;letter-spacing:-.035em;line-height:.94}
h2{font-size:clamp(2.1rem,5.6vw,4.6rem);font-weight:700;letter-spacing:-.028em;line-height:.98}
h3{font-size:clamp(1.2rem,1.9vw,1.55rem);font-weight:700;letter-spacing:-.01em}
.lead{font-size:clamp(1.1rem,1.4vw,1.35rem);color:var(--ink-soft);max-width:52ch}
.en{font-family:var(--font-head)}
.mt{margin-top:1.1rem}
.mt-lg{margin-top:2.5rem}
.muted{color:var(--ink-soft)}

/* ---------- Layout ---------- */
.wrap{width:min(100% - 2.4rem,var(--wrap));margin-inline:auto}
/* Der Kopf ist fixiert (72 px). Ohne diese Reserve landet auf schmalen
   Displays jede angesprungene Überschrift bündig darunter. */
section{padding-block:var(--sp-sec);position:relative;scroll-margin-top:88px}
.sec-head{max-width:60ch;margin-bottom:clamp(2rem,4vw,3.5rem)}
.sec-head .lead{margin-top:1.1rem}

/* Alternating surfaces */
.surface-dark{background:var(--blue);color:rgba(255,255,255,.82)}
.surface-dark h1,.surface-dark h2,.surface-dark h3,.surface-dark h4{color:#fff}
.surface-dark .lead{color:rgba(255,255,255,.72)}
.surface-deep{background:var(--blue-900);color:rgba(255,255,255,.82)}
.surface-deep h2,.surface-deep h3{color:#fff}
.surface-dark .lead,.surface-deep .lead{color:rgba(255,255,255,.72)}
/* Leichte Tönung, damit die Glasflächen darauf überhaupt etwas aufnehmen. */
.surface-light{background:
  radial-gradient(58% 46% at 88% 0%,rgba(0,219,158,.10),transparent 62%),
  radial-gradient(48% 40% at 0% 100%,rgba(21,31,53,.055),transparent 62%),
  var(--white)}
.surface-paper{background:var(--paper)}

/* ---------- Glas ---------- */
.glass{background:var(--glass-d);border:1px solid var(--glass-d-line);
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  box-shadow:var(--glass-hi)}
.surface-light .glass{background:var(--glass-l);border-color:var(--glass-l-line);box-shadow:var(--glass-hi-l)}

.wrap{position:relative;z-index:1}

/* ---------- Buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:.6rem;font-family:var(--font-body);font-weight:600;
  font-size:1rem;padding:.85em 1.5em;border-radius:100px;cursor:pointer;border:1.5px solid transparent;
  transition:transform .25s var(--ease),background .25s var(--ease),color .25s var(--ease),border-color .25s var(--ease),box-shadow .25s var(--ease);}
.btn svg{width:18px;height:18px}
/* Grün bleibt deckend (Kontrast!), bekommt aber eine Glanzkante wie Glas. */
.btn-primary{background:linear-gradient(180deg,rgba(255,255,255,.3),rgba(255,255,255,0) 48%),var(--green);
  color:var(--blue);border-color:rgba(255,255,255,.3);
  box-shadow:0 10px 30px -12px var(--green-glow),var(--glass-hi)}
.btn-primary:hover{transform:translateY(-2px);
  box-shadow:0 16px 42px -12px var(--green-glow),var(--glass-hi)}
.btn-ghost{background:var(--glass-d);border-color:var(--glass-d-line);color:inherit;
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  box-shadow:var(--glass-hi)}
.surface-light .btn-ghost{background:var(--glass-l);border-color:var(--glass-l-line);box-shadow:var(--glass-hi-l)}
.btn-ghost:hover{border-color:var(--green);color:var(--green-ink);transform:translateY(-2px)}
.surface-dark .btn-ghost:hover,.hero .btn-ghost:hover{color:var(--green)}
/* Mindestens 44 px hohe Trefferfläche – vorher 27,6 px. */
.link-arrow{display:inline-flex;align-items:center;gap:.45rem;font-weight:600;color:var(--green-ink);
  min-height:44px;padding-block:.35rem}
.surface-dark .link-arrow,.surface-deep .link-arrow{color:var(--green)}
.link-arrow svg{width:16px;height:16px;transition:transform .25s var(--ease)}
.link-arrow:hover svg{transform:translateX(4px)}

/* ---------- Brand & signet (official assets) ---------- */
.brand-logo{height:24px;width:auto;display:block}
.site-header .brand-logo{height:38px}

/* ---------- Header ---------- */
.site-header{position:fixed;inset:0 0 auto 0;z-index:50;transition:background .3s var(--ease),box-shadow .3s var(--ease),backdrop-filter .3s}
/* Nur die Kopfzeile selbst – NICHT verschachtelt suchen: im Schalter steckt ein
   <rect class="bar">, dem diese Regel sonst height:72px verpasst und damit das
   Signet verzeichnet. */
.site-header > .bar{display:flex;align-items:center;justify-content:space-between;height:72px}
.site-header.scrolled{background:rgba(15,23,39,.82);backdrop-filter:blur(12px);box-shadow:0 1px 0 rgba(197,201,210,.12)}
.brand{display:inline-flex;align-items:center;gap:.55rem;min-height:44px}
.bar-actions{display:flex;align-items:center;gap:.7rem}

/* Dauerhafter Handlungsaufruf. Er erscheint erst, wenn der Hero durch ist –
   solange sein eigener CTA sichtbar ist, wäre er Dopplung. */
.header-cta{display:inline-flex;align-items:center;min-height:44px;padding:.55em 1.15em;
  border-radius:100px;font-weight:600;font-size:.92rem;white-space:nowrap;
  background:var(--green);color:var(--blue);border:1px solid var(--green);
  opacity:0;transform:translateY(-6px) scale(.96);pointer-events:none;
  transition:opacity .35s var(--ease),transform .35s var(--ease),filter .2s var(--ease)}
.header-cta:hover{filter:brightness(1.08)}
.site-header.cta-on .header-cta{opacity:1;transform:none;pointer-events:auto}
/* Ohne JS gibt es kein Scroll-Signal – dann steht er dauerhaft. */
html:not(.js) .header-cta{opacity:1;transform:none;pointer-events:auto}

/* ---------- Schwebende Navigation (I/O-Schalter) ---------- */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* Sitzt im Header an der Stelle, an der sonst die Burger-Navigation läge.
   flex:none an beiden Stellen: Sonst schrumpft der Schalter als Flex-Kind,
   und der Bereichsname (overflow:hidden, also min-width 0) kollabiert auf
   null, statt aufzuklappen. */
.fab{position:relative;display:flex;align-items:center;flex:none}
.fab-btn{flex:none}

/* Das Menü klappt unter dem Schalter auf und baut den Header nicht auf. */
.fab-items{position:absolute;top:calc(100% + .65rem);right:0;
  display:flex;flex-direction:column;align-items:flex-end;gap:.5rem;
  visibility:hidden;pointer-events:none}
.fab.open .fab-items{visibility:visible;pointer-events:auto}
.fab-items li{opacity:0;transform:translateY(-10px) scale(.94)}
.fab-items a{display:block;padding:.62em 1.1em;border-radius:100px;font-weight:500;font-size:.97rem;
  color:#fff;background:rgba(15,23,39,.92);border:1px solid rgba(198,201,209,.22);
  backdrop-filter:blur(10px);white-space:nowrap;
  transition:color .2s var(--ease),border-color .2s var(--ease),background .2s var(--ease)}
.fab-items a:hover{color:var(--green);border-color:var(--green)}
.fab-items a.is-cta{background:var(--green);color:var(--blue);border-color:var(--green);font-weight:600}
.fab-items a.is-cta:hover{color:var(--blue);filter:brightness(1.08)}

/* Ohne Bereichsnamen ist der Schalter ein exakter Kreis (64 × 64 px): gleiche
   Polsterung ringsum und KEIN Spaltmaß zum leeren Label – sonst wird er oval. */
.fab-btn{display:inline-flex;align-items:center;gap:0;cursor:pointer;
  padding:.5rem;border-radius:100px;border:1px solid rgba(198,201,209,.22);
  background:rgba(15,23,39,.92);backdrop-filter:blur(10px);color:#fff;
  box-shadow:0 16px 40px -18px rgba(0,0,0,.8);
  transition:border-color .25s var(--ease),box-shadow .25s var(--ease)}
.fab-btn:hover{border-color:var(--green);box-shadow:0 18px 44px -16px var(--green-glow)}
/* Mit Bereichsnamen wächst er zur Pille.
   Die Breite läuft über grid-template-columns 0fr → 1fr statt über max-width,
   gap und padding: der Schalter wechselt bei jedem Bereichswechsel, und drei
   gleichzeitig animierte Layout-Eigenschaften im fixierten Kopf sind genau
   die Sorte Arbeit, die man beim Scrollen merkt. */
/* Breite über max-width statt über grid-template-columns: Eine 0fr→1fr-Spalte
   kollabiert in diesem automatisch breiten Container, der Bereichsname
   erschiene nie. Die Animation läuft höchstens ein Dutzend Mal pro Besuch an
   einem einzelnen Element ohne abhängige Nachbarn – der Layout-Aufwand ist
   hier bewusst in Kauf genommen. */
.fab-here{max-width:0;overflow:hidden;opacity:0;
  transition:max-width .45s var(--ease),opacity .3s var(--ease)}
.fab-here-t{display:block;font-weight:600;font-size:.9rem;letter-spacing:.04em;
  color:var(--grey);white-space:nowrap;padding-left:.7rem}
.fab-btn.has-here .fab-here{max-width:15rem;opacity:1}
/* Das Signet ist die Fassung aus der Wortmarke: Strich mittig im Ring.
   Es sitzt quadratisch im Kreis, deshalb ist die Grafik hier nicht mehr
   das breite I/O-Lockup, sondern der Ring selbst. */
.fab-mark{display:grid;place-items:center;width:46px;height:46px;border-radius:50%;
  background:rgba(198,201,209,.08);flex:none;
  transition:background .3s var(--ease),transform .35s var(--ease)}
/* Beide Zeichen liegen in derselben Rasterzelle exakt übereinander und werden
   nur über die Deckkraft getauscht – reine Compositor-Arbeit, kein Layout. */
.fab-mark .sig{grid-area:1/1;width:30px;height:30px;overflow:visible;
  fill:var(--green);
  transition:opacity .34s var(--ease),fill .3s var(--ease)}
.fab-mark .sig-standby{opacity:1}
.fab-mark .sig-on{opacity:0}
/* Offen = eingeschaltet: Der Strich steht in der Lücke, der Kreis ist
   geschlossen, die Scheibe geht unter Spannung, das Zeichen kehrt sich um. */
.fab.open .fab-mark{background:var(--green);transform:scale(1.06)}
.fab.open .fab-mark .sig{fill:var(--blue)}
.fab.open .fab-mark .sig-standby{opacity:0}
.fab.open .fab-mark .sig-on{opacity:1}

/* ---------- Hero ---------- */
.hero{min-height:100svh;display:flex;align-items:center;background:
  radial-gradient(120% 90% at 85% 10%,rgba(0,219,158,.10),transparent 55%),
  radial-gradient(80% 60% at 10% 90%,rgba(38,52,79,.6),transparent 60%),var(--blue-900);
  color:#fff;overflow:hidden;padding-top:72px}
.hero .grid{display:grid;grid-template-columns:1.15fr .85fr;align-items:center;gap:clamp(2rem,5vw,4rem)}
.hero h1{margin:.6rem 0 1.4rem;color:#fff}
.hero h1 .accent{color:var(--green)}
.hero .lead{color:rgba(255,255,255,.78);font-size:clamp(1.05rem,1.4vw,1.3rem);max-width:46ch}
.hero-cta{display:flex;flex-wrap:wrap;gap:1rem;margin-top:2.2rem}
.hero-visual{position:relative;aspect-ratio:1;max-width:440px;margin-inline:auto;width:100%;
  display:flex;align-items:center;justify-content:center}
.hero-visual::before{content:"";position:absolute;width:70%;aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle,var(--green-glow),transparent 68%);filter:blur(6px);animation:pulse 5.5s var(--ease) infinite}
/* I und O bleiben zwei Zeichen – Eins und Null, i/O, .io. Die Größen folgen
   den gelieferten Dateien: der Strich misst 402 von 559 Ringhöhen. */
.io-lockup{position:relative;display:flex;align-items:center;justify-content:center;
  gap:9%;width:88%;animation:floaty 6s var(--ease) infinite}
.io-lockup .io-i{width:9.6%;height:auto}
.io-lockup .io-o{width:66%;height:auto}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
@keyframes pulse{0%,100%{opacity:.55;transform:scale(.94)}50%{opacity:.9;transform:scale(1.04)}}
.scroll-cue{position:absolute;left:50%;bottom:1.8rem;transform:translateX(-50%);color:rgba(255,255,255,.5);
  font-size:.78rem;letter-spacing:.18em;text-transform:uppercase;display:flex;flex-direction:column;align-items:center;gap:.5rem}
.scroll-cue span{width:1px;height:30px;background:linear-gradient(rgba(0,219,158,.8),transparent);animation:cue 2s var(--ease) infinite}
@keyframes cue{0%{transform:scaleY(0);transform-origin:top}45%{transform:scaleY(1);transform-origin:top}55%{transform:scaleY(1);transform-origin:bottom}100%{transform:scaleY(0);transform-origin:bottom}}

/* ---------- Haltung ---------- */
.statement{font-family:var(--font-head);font-weight:700;font-size:clamp(1.8rem,4.4vw,3.4rem);
  line-height:1.1;letter-spacing:-.015em;max-width:20ch}
.statement .g{color:var(--green-ink)}
.surface-dark .statement .g,.surface-deep .statement .g{color:var(--green)}
.two-col{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(2rem,5vw,4.5rem);align-items:center}

/* ---------- Domains (Maschinen/Anlagen/Gebäude) ---------- */
.domains{display:grid;grid-template-columns:repeat(3,1fr);gap:1.2rem;margin-top:2.5rem}
.domain{padding:1.6rem 1.5rem;border-radius:var(--radius);
  background:var(--glass-d);border:1px solid var(--glass-d-line);
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  box-shadow:var(--glass-hi);
  transition:border-color .3s var(--ease),transform .3s var(--ease),background .3s}
.surface-light .domain{background:var(--glass-l);border-color:var(--glass-l-line);box-shadow:var(--glass-hi-l)}
.domain:hover{border-color:var(--green);transform:translateY(-4px)}
.domain h3{margin-bottom:.35rem}
.domain p{font-size:.95rem;color:var(--grey-600)}
.surface-dark .domain p{color:var(--grey)}

/* Pillars */
.pillars{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:1.4rem;margin-top:3rem;
  border-top:var(--line);padding-top:2.4rem}
.pillar h4{font-size:1.05rem;margin-bottom:.4rem;color:var(--blue)}
.surface-dark .pillar h4{color:#fff}
/* #kompetenz ist surface-dark – hier bleibt das leuchtende Grün richtig. */
.pillar .num{font-family:var(--font-head);font-weight:800;font-size:.95rem;color:var(--green);display:block;margin-bottom:.7rem}
.surface-light .pillar .num{color:var(--green-ink)}
.pillar p{font-size:.9rem;color:var(--grey-600)}
.surface-dark .pillar p{color:var(--grey)}

/* ---------- Stromlaufplan (Systemarchitektur) ----------------------------
   Senkrechte Sammelschiene links, vier Abgriffe rechts. Das Signal wandert
   scrollgesteuert nach unten und schaltet jede Ebene frei (Klasse .on).
   Ohne JS/Motion sind alle Ebenen sofort aktiv – nichts bleibt unlesbar. */
:root{--rail-x:14px}

/* Überschrift links (bleibt beim Scrollen stehen), Schaltplan rechts. */
.arch-grid{display:grid;grid-template-columns:minmax(0,.82fr) minmax(0,1.18fr);
  gap:clamp(2rem,5vw,4.5rem);align-items:start}
.arch-intro{position:sticky;top:104px}
.arch-intro .lead{margin-top:1.2rem}

.circuit{position:relative;padding-left:clamp(2.6rem,6vw,4.5rem)}

.circuit-rail{position:absolute;left:0;top:0;bottom:3.4rem;width:calc(var(--rail-x) * 2);
  pointer-events:none}
.rail-line{position:absolute;left:var(--rail-x);top:0;bottom:0;width:2px;
  background:rgba(198,201,209,.2);transform:translateX(-50%)}
/* Der grüne Signalweg wächst von oben mit --p (0…1). */
.rail-signal{position:absolute;left:var(--rail-x);top:0;width:2px;transform:translateX(-50%);
  height:calc(var(--p, 0) * 100%);background:var(--green);
  box-shadow:0 0 12px 1px var(--green-glow)}
/* Signalkopf */
.rail-signal::after{content:"";position:absolute;left:50%;bottom:0;width:11px;height:11px;
  border-radius:50%;background:var(--green);transform:translate(-50%,50%);
  box-shadow:0 0 0 5px rgba(0,219,158,.16),0 0 18px 3px var(--green-glow);
  opacity:var(--head, 0)}

.nodes{list-style:none;display:flex;flex-direction:column;gap:clamp(1.6rem,4vw,2.8rem)}
.node{position:relative}
/* Abzweig von der Schiene zum Inhalt */
/* Grundzustand = voll lesbar (gilt auch ohne JS).
   Erst wenn JS läuft, starten die Ebenen gedimmt und werden freigeschaltet. */
.node-tap{position:absolute;left:calc(-1 * clamp(2.6rem,6vw,4.5rem) + var(--rail-x));top:.72em;
  height:2px;width:calc(clamp(2.6rem,6vw,4.5rem) - var(--rail-x) - 14px);
  background:rgba(0,219,158,.55);transform-origin:left;transform:scaleX(1);
  transition:transform .5s var(--ease),background .5s var(--ease)}
.node-tap::before{content:"";position:absolute;left:-5px;top:50%;width:10px;height:10px;
  border-radius:50%;border:2px solid var(--green);background:var(--green);
  transform:translateY(-50%);transition:border-color .4s var(--ease),background .4s var(--ease)}
.js .node:not(.on) .node-tap{transform:scaleX(.35);background:rgba(198,201,209,.22)}
.js .node:not(.on) .node-tap::before{border-color:rgba(198,201,209,.35);background:var(--blue-900)}

.node-head{display:flex;align-items:baseline;gap:.8rem;margin-bottom:.45rem}
.node-id{font-family:var(--font-head);font-weight:700;font-size:.75rem;letter-spacing:.14em;
  color:var(--green);transition:color .4s var(--ease)}
.js .node:not(.on) .node-id{color:var(--grey-600)}
.node-tier{font-family:var(--font-head);font-weight:700;font-size:clamp(1.15rem,2vw,1.5rem);
  color:#fff;letter-spacing:-.01em;transition:color .4s var(--ease)}
.js .node:not(.on) .node-tier{color:rgba(255,255,255,.42)}

.node-body{max-width:60ch}
.node-body h3{font-size:clamp(.98rem,1.2vw,1.08rem);font-weight:700;color:var(--green);
  margin-bottom:.3rem;transition:color .4s var(--ease)}
.js .node:not(.on) .node-body h3{color:rgba(255,255,255,.55)}
.node-body p{font-size:.95rem;color:var(--grey);transition:color .4s var(--ease)}
.js .node:not(.on) .node-body p{color:var(--grey-600)}

/* Klemmenleiste statt Pillen. Die angebundenen Systeme sind Abgriffe an
   dieser Ebene – in einem Abschnitt, der ohnehin Stromlaufplan spricht,
   sind rechte Winkel und geteilte Haarlinien die richtige Zeichensprache.
   Die negativen Ränder lassen benachbarte Klemmen sich eine Kante teilen,
   wie auf einer echten Leiste. */
.terminals{display:flex;flex-wrap:wrap;margin-top:1rem;padding:1px 0 0 1px}
.terminal{position:relative;font-size:.82rem;font-weight:500;color:var(--grey);
  white-space:nowrap;padding:.62em .95em .5em;
  border:1px solid rgba(198,201,209,.28);margin:-1px 0 0 -1px;
  transition:color .4s var(--ease),border-color .4s var(--ease)}
/* Schraubenschlitz der Klemme – eine Haarlinie, mehr braucht es nicht. */
.terminal::before{content:"";position:absolute;left:50%;top:.42em;width:9px;height:1px;
  background:rgba(198,201,209,.45);transform:translateX(-50%);
  transition:background .4s var(--ease)}
.js .node:not(.on) .terminal{color:var(--grey-600);border-color:rgba(198,201,209,.16)}
.js .node:not(.on) .terminal::before{background:rgba(198,201,209,.2)}

.circuit-note{margin-top:clamp(1.8rem,4vw,2.6rem);font-size:.88rem;color:var(--grey-600);
  padding-top:1.2rem;border-top:1px solid rgba(198,201,209,.12)}

/* ---------- Module: Sammelschiene ---------------------------------------
   Die Lead-Zeile verspricht „aufeinander abgestimmt, einzeln nutzbar“.
   Drei gleich breite Karten konnten davon nur die zweite Hälfte zeigen.
   Eine liegende Schiene mit drei Abgriffen zeigt beides gleichzeitig –
   und die Richtung „vom Standard bis zur Systemumgebung“ dazu.
   Auf heller Fläche bleibt sie gezeichneter Plan: exakte Linie, kein
   Signalschein. Der gehört der Systemarchitektur und dem Kontakt. */
.bus{position:relative;padding-top:3.6rem}
.bus-rail{position:absolute;left:0;right:0;top:1.6rem;height:2px}
.bus-line{position:absolute;inset:0;background:var(--green-ink);opacity:.55}
/* Offene Klemme am Ende: die Schiene hört nicht auf, sie steht bereit. */
.bus-rail::after{content:"";position:absolute;right:0;top:50%;width:9px;height:9px;border-radius:50%;
  border:2px solid var(--green-ink);background:var(--white);transform:translate(50%,-50%)}
.bus-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(1.4rem,3vw,2.6rem)}

.mod{position:relative;display:flex;flex-direction:column}
/* Abgriff: Tropfen von der Schiene herunter auf das Modul. */
.mod-drop{position:absolute;left:0;top:-2rem;width:2px;height:2rem;background:var(--green-ink)}
.mod-drop::before{content:"";position:absolute;left:-4px;top:-10px;width:10px;height:10px;
  border-radius:50%;background:var(--green-ink)}
.mod .tag{font-family:var(--font-head);font-weight:800;font-size:clamp(1.35rem,2.4vw,1.75rem);
  color:var(--blue);letter-spacing:-.01em;line-height:1.05}
.mod .tag b{color:var(--green-ink)}
.mod-step{font-family:var(--font-head);font-weight:700;font-size:.8rem;letter-spacing:.1em;
  color:var(--grey-700);margin-top:.3rem}
.mod .claim{font-family:var(--font-head);font-weight:600;font-style:italic;color:var(--ink-soft);
  margin:.55rem 0 .9rem}
.mod p{font-size:.96rem;color:var(--ink-soft)}
.mod p.claim,.mod p.mod-step{flex:none}
.mod > p:not(.claim):not(.mod-step){flex:1}
.mod .link-arrow{margin-top:.9rem;align-self:flex-start}
/* Einzeln nutzbar heißt einzeln ansprechbar: jeder Abgriff hat seine eigene
   Fläche für Hover und Tastaturfokus – ohne dass daraus wieder eine Karte wird. */
.mod::after{content:"";position:absolute;inset:-.9rem -1rem;border-radius:var(--radius);
  border:1px solid transparent;pointer-events:none;
  transition:border-color .3s var(--ease),background .3s var(--ease)}
.mod:hover::after,.mod:focus-within::after{border-color:rgba(0,115,79,.32);background:rgba(0,219,158,.055)}

/* ---------- Lifecycle ---------- */
.lifecycle-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,5vw,4rem);align-items:start}
.lc-list{display:grid;gap:.2rem;margin-top:.5rem}
.lc-list li{display:flex;gap:1rem;padding:1rem 0;border-bottom:1px solid rgba(255,255,255,.09);align-items:baseline}
.lc-list li:last-child{border-bottom:0}
.lc-list .i{font-family:var(--font-head);font-weight:800;color:var(--green);font-size:.9rem;min-width:2.2rem}
.lc-list p{color:rgba(255,255,255,.85);font-size:1rem}
.lc-quotes{position:sticky;top:100px;display:grid;gap:1.6rem}
.lc-quote{border-left:2px solid var(--green);padding-left:1.3rem}
.lc-quote p{font-family:var(--font-head);font-weight:600;font-size:1.3rem;line-height:1.25;color:#fff}
.lc-quote span{display:block;color:var(--grey-500);font-size:.85rem;margin-top:.5rem;font-family:var(--font-body);font-weight:500}

/* ---------- References – Abschnitt geparkt, Regeln bleiben erhalten -------
   #referenzen ist in index.html auskommentiert, bis freigegebene Beispiele
   vorliegen. Diese Regeln nicht löschen: sie werden beim Wiedereinsetzen
   unverändert gebraucht. .branch bekommt jetzt den hellflächigen Textton. */
.refs{display:grid;grid-template-columns:repeat(3,1fr);gap:1.4rem}
.ref{padding:1.7rem;border-radius:var(--radius);
  background:var(--glass-l);border:1px solid var(--glass-l-line);
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.35);
  backdrop-filter:blur(var(--glass-blur)) saturate(1.35);
  box-shadow:var(--glass-hi-l);
  transition:transform .3s var(--ease),border-color .3s var(--ease)}
.ref:hover{transform:translateY(-4px);border-color:var(--green)}
.ref .branch{font-family:var(--font-head);font-weight:800;font-size:.82rem;letter-spacing:.06em;color:var(--green-ink);padding-right:6.5rem}
.ref h3{margin:.6rem 0 .5rem;font-size:1.15rem}
.ref p{font-size:.93rem;color:var(--ink-soft)}
.placeholder{position:relative}
.placeholder::after{content:"Platzhalter";position:absolute;top:.9rem;right:.9rem;font-family:var(--font-body);
  font-size:.62rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--grey-600);
  border:1px dashed var(--grey-500);border-radius:100px;padding:.2em .6em}

/* ---------- About ---------- */
.about-grid{display:grid;grid-template-columns:.85fr 1.15fr;gap:clamp(2rem,5vw,4rem);align-items:center}
.about-visual{aspect-ratio:4/5;border-radius:var(--radius-lg);background:
  radial-gradient(120% 90% at 30% 20%,rgba(0,219,158,.14),transparent 55%),var(--blue-800);
  display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;border:var(--line)}
/* Foto-Platz: sobald ein Bild vorliegt, füllt es die Fläche randlos. */
.about-visual.is-photo{padding:0;display:block}
.about-visual.is-photo img{width:100%;height:100%;object-fit:cover;border-radius:inherit}
.about-visual.is-photo figcaption{position:absolute;left:1.1rem;bottom:1rem;font-size:.85rem;
  font-weight:600;color:#fff;text-shadow:0 1px 8px rgba(15,23,39,.9)}
.about-facts{display:flex;gap:2.2rem;margin-top:1.8rem;flex-wrap:wrap}
.fact .n{font-family:var(--font-head);font-weight:800;font-size:2.4rem;color:var(--green-ink);line-height:1}
.fact .l{font-size:.85rem;color:var(--ink-soft)}
/* Absicherung: --ink-soft ist ein Ton für helle Flächen. Landet der Block je
   wieder auf Dunkel, kam er dort bei 2,02:1 heraus. */
.surface-dark .fact .n,.surface-deep .fact .n{color:var(--green)}
.surface-dark .fact .l,.surface-deep .fact .l{color:var(--grey)}

/* ---------- FAQ ---------- */
.faq{max-width:820px;margin-top:1rem}
.faq details{border-bottom:var(--line);padding:.4rem 0}
.faq summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;gap:1rem;
  align-items:center;padding:1.15rem 0;font-family:var(--font-head);font-weight:700;font-size:1.15rem;color:var(--blue)}
.faq summary::-webkit-details-marker{display:none}
.faq summary .plus{position:relative;width:20px;height:20px;flex:none}
.faq summary .plus::before,.faq summary .plus::after{content:"";position:absolute;background:var(--green-ink);inset:9px 0 auto 0;height:2px;transition:transform .3s var(--ease)}
.faq summary .plus::after{transform:rotate(90deg)}
.faq details[open] summary .plus::after{transform:rotate(0)}
.faq details[open] summary{color:var(--green-ink)}
.faq .answer{padding:0 0 1.3rem;color:var(--ink-soft);max-width:70ch}

/* ---------- Contact ---------- */
.contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,5vw,4rem);align-items:start}
.contact-intro .statement{margin:1rem 0 1.4rem}
.contact-intro ul{margin-top:1.6rem;display:grid;gap:.8rem}
.contact-intro ul li{display:flex;gap:.7rem;color:rgba(255,255,255,.8);font-size:.98rem}
.contact-intro ul li svg{width:20px;height:20px;color:var(--green);flex:none}
.form{background:var(--glass-d);border:1px solid var(--glass-d-line);border-radius:var(--radius-lg);
  padding:clamp(1.4rem,3vw,2.2rem);
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  backdrop-filter:blur(var(--glass-blur)) saturate(1.3);
  box-shadow:var(--glass-hi)}
.field{margin-bottom:1.1rem}
.field label{display:block;font-size:.85rem;font-weight:600;color:var(--grey);margin-bottom:.45rem}
/* Rahmen lag bei 1,69:1 – unter dem 3:1-Minimum für Bedienelement-Grenzen. */
.field input,.field textarea{width:100%;font-family:inherit;font-size:1rem;color:#fff;
  background:rgba(15,23,39,.5);border:1px solid rgba(197,201,210,.5);border-radius:10px;padding:.8em .9em;transition:border-color .25s}
.field input::placeholder,.field textarea::placeholder{color:var(--grey-500)}
/* Kein outline:none mehr – die Regel hatte höhere Spezifität als :focus-visible
   und nahm Tastaturnutzern den Fokusring auf allen vier Feldern. */
.field input:focus,.field textarea:focus{border-color:var(--green)}
.field input:focus-visible,.field textarea:focus-visible{outline:2px solid var(--green);outline-offset:2px}
.field textarea{resize:vertical;min-height:120px}
/* Fehlerbild aus der nativen Validierung, erst nach dem ersten Absendeversuch. */
.form.was-validated .field input:invalid,.form.was-validated .field textarea:invalid{border-color:#ff9a8b}

/* Rückmeldung nach dem Absenden. */
.form-status{border-radius:10px;padding:.9em 1.1em;margin-bottom:1.3rem;font-size:.95rem;line-height:1.5}
.form-status[hidden]{display:none}
.form-status.is-ok{background:rgba(0,219,158,.12);border:1px solid rgba(0,219,158,.5);color:#eafff8}
.form-status.is-error{background:rgba(255,154,139,.12);border:1px solid rgba(255,154,139,.55);color:#ffe6e1}
.form-status strong{display:block;font-weight:600;margin-bottom:.15rem}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.form .btn-primary{width:100%;justify-content:center}
.form-note{font-size:.82rem;line-height:1.55;color:var(--grey);margin-top:1.1rem;text-align:center}
.form-note a{color:var(--green);text-decoration:underline;text-underline-offset:2px}

/* ---------- Footer ---------- */
.site-footer{background:var(--blue-900);color:var(--grey);padding-block:clamp(3rem,6vw,5rem) 2rem;border-top:1px solid rgba(197,201,210,.1)}
.footer-top{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:2.5rem}
.footer-top .brand{margin-bottom:1rem}
.footer-claim{font-family:var(--font-head);font-weight:600;color:var(--grey-500);max-width:32ch}
.footer-col h3{font-size:.8rem;letter-spacing:.14em;text-transform:uppercase;color:var(--grey-500);margin-bottom:.6rem;font-family:var(--font-body);font-weight:600}
/* 44 px Trefferfläche statt 35 px. */
.footer-col a{display:flex;align-items:center;min-height:44px;color:var(--grey);transition:color .2s;font-size:.95rem}
.footer-col a:hover{color:var(--green)}
.footer-bottom{display:flex;justify-content:space-between;flex-wrap:wrap;gap:1rem;margin-top:3rem;padding-top:1.6rem;
  border-top:1px solid rgba(197,201,210,.1);font-size:.83rem;color:var(--grey-600)}
.footer-bottom a:hover{color:var(--green)}

/* ---------- Legal pages ---------- */
.legal{padding-top:calc(72px + clamp(2.5rem,6vw,5rem))}
.legal .wrap{max-width:820px}
.legal h1{font-size:clamp(2rem,5vw,3.2rem);margin-bottom:1.5rem}
.legal h2{font-size:clamp(1.25rem,2.4vw,1.7rem);margin:2.4rem 0 .8rem}
.legal h3{font-size:1.1rem;margin:1.6rem 0 .4rem}
.legal p,.legal li{color:var(--ink-soft);margin-bottom:.8rem}
.legal ul{list-style:disc;padding-left:1.3rem;margin-bottom:1rem}
.legal a{color:var(--green-600);text-decoration:underline}
.legal .back{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:2rem;font-weight:600;color:var(--green-600)}
.legal .todo{background:rgba(0,219,158,.08);border:1px dashed var(--green-600);border-radius:10px;padding:1rem 1.2rem;color:var(--ink);font-size:.9rem}

/* ---------- Reveal animation ---------- */
.js [data-reveal]{opacity:0;transform:translateY(26px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
/* Motion (js/vendor/motion.js) animiert selbst Frame für Frame –
   CSS-Transition muss dann aus, sonst interpolieren beide gegeneinander. */
.motion [data-reveal]{transition:none}
.js [data-reveal].in{opacity:1;transform:none}
.js [data-reveal][data-delay="1"]{transition-delay:.08s}
.js [data-reveal][data-delay="2"]{transition-delay:.16s}
.js [data-reveal][data-delay="3"]{transition-delay:.24s}

/* ---------- Responsive ---------- */
@media (max-width:960px){
  .hero .grid{grid-template-columns:1fr;text-align:left}
  .hero-visual{grid-row:1;max-width:300px;margin:0 0 1rem}
  .two-col,.lifecycle-grid,.about-grid,.contact-grid,.arch-grid{grid-template-columns:1fr}
  .arch-intro{position:static}
  .lc-quotes{position:static}
  .about-visual{max-width:360px}
  .refs,.domains{grid-template-columns:1fr 1fr}
  .footer-top{grid-template-columns:1fr 1fr}
  /* Die Schiene kippt in die Senkrechte: liegend hätte sie hier keinen Platz,
     und untereinander ist der Signalweg ohnehin die klarere Lesart. */
  .bus{padding-top:0;padding-left:2.4rem}
  .bus-rail{left:14px;right:auto;top:.6rem;bottom:0;height:auto;width:2px}
  .bus-rail::after{right:auto;left:50%;top:auto;bottom:0;transform:translate(-50%,50%)}
  .bus-grid{grid-template-columns:1fr;gap:2.8rem}
  /* Der Abgriff beginnt an der Schiene (14 px vom linken Rand), nicht davor –
     sonst steht die Stichleitung links über die Schiene hinaus. */
  .mod-drop{left:calc(-2.4rem + 14px);top:.7em;width:calc(2.4rem - 14px);height:2px}
  .mod-drop::before{left:-5px;top:-4px}
  .mod::after{inset:-.8rem -.8rem}
}
@media (max-width:640px){
  .refs,.domains{grid-template-columns:1fr}
  .footer-top{grid-template-columns:1fr}
  .hero-cta .btn{width:100%;justify-content:center}
  .hero-visual{max-width:190px}
  /* Neben der Wortmarke bleibt kein Platz für den Bereichsnamen –
     dort zeigt der Schalter nur das Signet. */
  .fab-btn.has-here .fab-here{max-width:0;opacity:0}
  .fab-items a{font-size:1rem;padding:.7em 1.2em}
  /* Der Kopf wird eng: Der CTA verkürzt sich, bleibt aber vorhanden –
     genau hier ist der Weg zum Formular am längsten. */
  .header-cta{padding:.55em .9em;font-size:.86rem}
  .bus{padding-left:2rem}
  .mod-drop{left:calc(-2rem + 14px);width:calc(2rem - 14px)}
}

/* ---------- Motion preference ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
  .js [data-reveal],[data-reveal]{opacity:1!important;transform:none!important}
}
