/* =====================================================================
   VHC – Landingpage · Entwurf 6 „Variante 1e" — nach Michas Anleitung
   EIN Container (r=20, overflow:hidden): grauer Header-Block (Verlauf
   grau->dunkel INNERHALB, ab 94%) + dunkler Hero-Block. Swoosh als PNG
   mit object-fit:fill + fester flacher Höhe (killt den Glow-Kasten).
   final-02 OHNE scaleX(-1) (ist bereits „links runter").
   Vanilla, keine CDNs.
   ===================================================================== */

:root {
  --navy-1: #0b1220;
  --navy-2: #0d1728;
  --navy-3: #080f1c;
  --grey:   #c4cad3;
  --green:  #22c55e;
  --green-h:#4ade80;
  /* Warmer Akzent, bisher nur im Verlauf der Impressum-Ueberschrift. Bewusst
     in der Helligkeit auf --green-h abgestimmt, damit beide Akzente auf dem
     dunklen Grund gleich stark wirken und keiner den anderen ueberstrahlt. */
  --orange: #fb923c;
  --tx:     #eef1f6;
  --tx-dim: #9aa5b6;
  --tx-dim2:#aab4c4;
  --ink:    #0d1728;   /* dunkler Text auf Grau */

  /* Fonts laut Anleitung. Dateien fehlen noch → Fallback-Stack;
     sobald assets/fonts/ befüllt ist, @font-face unten aktivieren. */
  --font-head: "Rajdhani", "Oswald", "Segoe UI Semibold", system-ui, sans-serif;
  --font-sans: "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", Arial, sans-serif;
  --font-mono: "IBM Plex Mono", ui-monospace, "Cascadia Code", Consolas, monospace;

  --wrap: 1180px;


  /* Ungenutzt seit dem Wechsel „Schleier" -> „ersetzen": die Dunkelzonen
     liegen jetzt transparent über dem HG aus Entwurf 2, statt ihn zu
     überdecken. Bleibt stehen, falls doch wieder gedämpft werden soll.
  --veil: rgba(11, 18, 32, .62); */

  /* Swoosh-Geometrie — Nav wird an DIESELBE linke Referenz gekoppelt (.mh-head),
     damit Nav-Ende und Swoosh-Ende bei JEDER Breite bündig sind. */
  --sw-start: 60px;    /* padding-left des Header-Swoosh */
  --sw-width: 1000px;  /* Breite des Header-Swoosh */
}

/* Hausschriften laut Anleitung, self-contained im Projekt (deploy-sicher).
   Quelle: zentraler Fontordner /vhc/global-media/fonts (via Font-Tool geladen). */
@font-face { font-family:"Rajdhani";      src:url(assets/fonts/rajdhani-v17-latin-700.woff2) format("woff2");         font-weight:700; font-display:swap; }
@font-face { font-family:"IBM Plex Sans";  src:url(assets/fonts/ibm-plex-sans-v23-latin-regular.woff2) format("woff2"); font-weight:400; font-display:swap; }
@font-face { font-family:"IBM Plex Sans";  src:url(assets/fonts/ibm-plex-sans-v23-latin-700.woff2) format("woff2");     font-weight:700; font-display:swap; }
@font-face { font-family:"IBM Plex Mono";  src:url(assets/fonts/ibm-plex-mono-v20-latin-500.woff2) format("woff2");     font-weight:500; font-display:swap; }
@font-face { font-family:"IBM Plex Mono";  src:url(assets/fonts/ibm-plex-mono-v20-latin-700.woff2) format("woff2");     font-weight:700; font-display:swap; }

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
body {
  margin: 0; font-family: var(--font-sans);
  font-size: 17px; line-height: 1.65; color: var(--tx);
  background: var(--navy-3);
  -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;
  /* Seite mindestens fensterhoch, Inhalt als Spalte — zusammen mit
     `margin-top: auto` am Fuss (siehe .site-footer) drueckt das den Fuss an
     den unteren Rand, SOBALD der Inhalt das Fenster nicht fuellt.
     Ohne diese Regel endete die Seite mitten im Fenster: gemessen 29.07. auf
     der IT-Seite bei 1400px Fensterhoehe 207px Leerraum UNTER dem Fuss, waehrend
     es bei 1000px passte — der Fuss „hing in der Luft", je nach Fenstergroesse.
     Gehoert ins Grundgeruest, nicht zu einer einzelnen Seite: es betrifft jede. */
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
img { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
h1, h2, h3 { margin: 0; line-height: 1.1; }
p { margin: 0; }
.wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: clamp(20px, 5vw, 44px); }

/* =====================================================================
   GANZFLÄCHIGER NETZWERK-HINTERGRUND (aus Entwurf 2 „Netzwerk")
   ---------------------------------------------------------------------
   Warum fix statt im Hero: der Hintergrund soll EIN durchgehendes Feld
   hinter der ganzen Seite sein, nicht pro Sektion neu ansetzen.
   Stapelung: body-Hintergrund (--navy-3) ganz unten -> .net-bg (z 0)
   -> Inhalt (z 1). Der Inhalt braucht das z-index ausdrücklich, sonst
   verschwindet er hinter der fixen Ebene.
   ===================================================================== */
/* Diese Ebene IST der Hintergrund der Seite — Grundverlauf aus Entwurf 2
   (dort .hero), darüber Canvas + Aurora. Die Sektionen darunter sind
   deshalb durchgehend transparent (siehe unten). */
.net-bg {
  position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
  background:
    radial-gradient(120% 80% at 50% -10%, #14203050 0%, transparent 60%),
    linear-gradient(180deg, #0b1119 0%, #0e1622 100%);
}
.net-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
/* Aurora = statischer Schimmer; trägt den Hintergrund allein, wenn das
   Canvas ausfällt (kein JS, prefers-reduced-motion). Werte aus Entwurf 2. */
.net-aurora {
  position: absolute; inset: 0;
  background:
    radial-gradient(60% 50% at 78% 22%, rgba(34,197,94,.16), transparent 60%),
    radial-gradient(55% 45% at 12% 78%, rgba(120,150,180,.14), transparent 62%);
}
/* Inhalt über die Hintergrund-Ebene heben */
.hero-card, .section, .site-footer { position: relative; z-index: 1; }

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 14px 28px; font-family: var(--font-sans);
  font-size: 16px; font-weight: 700; border-radius: 999px; border: 1.5px solid transparent; cursor: pointer;
  transition: transform .15s ease, box-shadow .2s ease, background .2s ease, color .2s ease, border-color .2s ease;
}
.btn:hover { transform: translateY(-2px); }
.btn-primary { background: var(--green); color: #04160b; box-shadow: 0 8px 22px rgba(34,197,94,.28); }
.btn-primary:hover { background: #3ad46f; }
.btn-ghost { background: transparent; color: var(--tx); border-color: rgba(154,165,182,.35); }
.btn-ghost:hover { border-color: var(--green); color: var(--green-h); }
.btn-lg { padding: 17px 40px; font-size: 18px; font-family: var(--font-mono); }
/* Der Formular-Knopf neben der Mailadresse (Micha 29.07.): leicht gruen
   hinterlegt — deutlich schwaecher als der gefuellte Mail-Knopf daneben —,
   dafuer mit kraeftigem Rand in DERSELBEN Farbe wie dieser (var(--green)).
   Bewusst eine eigene Klasse statt einer Aenderung an `.btn-ghost`: die
   Geisterknoepfe tragen auch „Den Aufbau ansehen" und „Zurueck zur Uebersicht"
   auf den Leistungsseiten, die unveraendert bleiben sollen. */
.btn-formular {
  background: rgba(34,197,94,.13);
  border-color: var(--green);
  /* Kraeftiger Rand — aber der halbe zusaetzliche Millimeter geht vom
     Innenabstand ab, sonst waere dieser Knopf 2px hoeher als der gefuellte
     daneben (der Rahmen addiert sich auf die Aussenmasse). */
  border-width: 2px;
  /* Ausgleich je Groesse — Begruendung wie in ../style.css (Zwillingsdatei,
     synchron halten): 2px Rand sind 0.5px mehr als die 1.5px der Grundklasse.
     Hier der Grundwert von `.btn` (14/28) fuer den Knopf im Impressumskasten,
     unten der von `.btn-lg` (17/40) fuer die Kontaktsektion der Startseite. */
  padding: calc(14px - 0.5px) calc(28px - 0.5px);
}
.btn-lg.btn-formular {
  padding: calc(17px - 0.5px) calc(40px - 0.5px);
}
.btn-formular:hover {
  background: rgba(34,197,94,.22);
  border-color: var(--green-h);
  color: var(--tx);
}

/* =====================================================================
   HERO-CARD (ein Container, rund, overflow hidden)
   ===================================================================== */
/* full-bleed: kein dunkler Rand/Rahmen mehr um den hellen Header */
.hero-card { margin: 0; max-width: 100%; border-radius: 0; overflow: hidden; }

/* ---------- 1) Grauer Header-Block ---------- */
/* Kopfblock gibt seinen Hintergrund ebenfalls an .net-bg ab — der HG aus
   Entwurf 2 läuft jetzt durchgehend von ganz oben bis zum Footer.
   Damit entfällt auch der Grau->Dunkel-Übergang am Blockende (er hatte nur
   den Zweck, den grauen Kopf an die Dunkelzone anzuschließen).
   Ursprung 11, für Rückbau aufbewahrt:
   background: linear-gradient(180deg,
       #b6bdc9 0%, #b5bcc8 94%, #8b94a4 97%, #454d5e 99%, #0a1120 100%); */
.mh-grey {
  /* Kopfbereich abgedunkelt: gleichmäßiger Schleier über dem Netzwerk-HG,
     mit HARTER Kante zum Hero-Block (Vorgabe Micha) — kein Ausblenden.
     Der Schleier läuft gegen SCHWARZ, nicht gegen das Palette-Navy:
     #080f1c ist praktisch so dunkel wie der Grund darunter (~rgb 13/22/31) —
     damit gemischt ergab sich nachgemessen nur 20.5 -> 17.5 Helligkeit, also
     unsichtbar. Gegen Schwarz wirkt derselbe Alpha-Wert echt abdunkelnd.
     Stellschraube: der Alpha-Wert (kleiner = heller). */
  background: rgba(0,0,0,.28);
  /* Höhe gekürzt — AUSSCHLIESSLICH über den Leerraum, der Inhalt bleibt
     unangetastet: Logo 118px, Nav und Swoosh 58px unverändert. Gemessen
     waren von 300px Blockhöhe 114px reines Padding, davon 74px totes Feld
     UNTER dem Swoosh. Genau dort wird gekürzt.
     Ursprung 11: padding: 40px 0 74px;  (Blockhöhe 300px) */
  padding: 24px 0 28px;   /* Seiten-Padding raus: Content über zentrierte Wrap */
}
/* Kopfzeile endet exakt am Swoosh-Ende -> Nav (space-between) ist damit bündig,
   unabhängig von der Fensterbreite (beides links verankert). */
.mh-head { display: flex; align-items: center; justify-content: space-between; max-width: var(--wrap); margin-inline: auto; padding-inline: clamp(20px, 5vw, 44px); }
.brand { display: inline-flex; align-items: center; gap: 24px; }
/* Rahmen von 4px Weiß auf 3px Silber — Weiß stach auf dem dunklen Grund
   als hellster Punkt der Seite hervor. Silber = --grey aus der Palette,
   kein neuer Sonderwert. Ursprung 11: border: 4px solid #fff; */
.brand-logo { width: 118px; height: 118px; border-radius: 24px; border: 3px solid var(--grey); box-shadow: 0 12px 30px rgba(8,15,28,.30); }
/* Firmenname in Silber (--grey, dieselbe Farbe wie der Logo-Rahmen — kein
   neuer Sonderwert). Zwischenschritt war Fast-Weiß (--tx), als der Kopf auf
   dunklen Grund kam; Ursprung 11 (für hellen Grund) war var(--ink).
   Ursprung 11: color: var(--ink);   Zwischenstand: color: var(--tx); */
.brand-word { font-family: var(--font-sans); font-weight: 700; font-size: clamp(22px, 2.4vw, 31px); line-height: 1.14; color: var(--grey); white-space: nowrap; letter-spacing: -.01em; }

/* Menü rechts, aber 400px vom rechten Rand -> Kontakt bündig mit Swoosh-Ende */
.mh-nav { display: flex; align-items: center; gap: 30px; }
/* Navigation auf hell gedreht (Kopf steht auf Dunkel). Der Kontakt-Knopf war
   ein dunkles Navy-Pill auf Grau — auf dunklem Grund verschwindet es, deshalb
   auf den Grün-Akzent von 11 (--green, wie .btn-primary) mit dunkler Schrift.
   Ursprung 11 (für hellen Grund):
   .mh-nav a       { color: #26313f; }
   .mh-nav .nav-cta{ background: var(--navy-2); color: #fff; }
   .mh-nav .nav-cta:hover { background: var(--green); } */
.mh-nav a { font-weight: 600; font-size: 17px; color: var(--tx-dim2); transition: color .18s ease; }
.mh-nav a:hover { color: var(--green-h); }
.mh-nav .nav-cta { background: var(--green); color: #04160b; padding: 11px 22px; border-radius: 999px; }
.mh-nav .nav-cta:hover { background: var(--green-h); color: #04160b; }
/* Bild-Buttons in der Navigation: kein Polster und kein Grund — der Button
   bringt seine Form selbst mit, ein Pill darunter waere ein zweiter Rahmen.
   Die Bilder liegen in doppelter Aufloesung vor (92px hoch fuer 46px
   Anzeige), damit sie auf feinen Bildschirmen scharf bleiben. */
.mh-nav .nav-bild { padding: 0; background: none; display: inline-flex; }
.mh-nav .nav-bild img { display: block; height: 46px; width: auto; transition: filter .2s ease, transform .2s ease; }
.mh-nav .nav-bild:hover img { filter: brightness(1.12); transform: translateY(-1px); }

/* Swoosh: feste flache Höhe + object-fit:fill (kein Glow-Kasten), rechtsbündig
   mit 400px Offset -> endet bündig mit Kontakt. final-02, KEIN scaleX(-1). */
.mh-swoosh { margin-top: 10px; max-width: var(--wrap); margin-inline: auto; padding-inline: clamp(20px, 5vw, 44px); overflow: visible; }
/* Glow-Dämpfung (nur der KOPF-Swoosh, nicht der Akzent unter „arbeitet.").
   Der Glow steckt im PNG: gemessen sind nur ~6% der Pixel der kräftige Kern,
   ~35% ein weicher Halo mit Alpha 10-160. Genau dieser Halo blüht auf dem
   dunklen Grund auf — auf dem früheren grauen Kopf war er gedämpft.
   opacity trifft ihn deshalb überproportional: der schwache Halo fällt unter
   die Wahrnehmungsschwelle, der Kern bleibt als Linie stehen.
   EINE Stellschraube — kleiner = weniger Glow. Ursprung 11: kein opacity. */
.swoosh-img { display: block; margin-left: 60px; width: calc(100% - 60px); height: 58px; object-fit: fill; transform: scaleX(-1); pointer-events: none; opacity: .7; }

/* ---------- 2) Dunkler Hero-Block ---------- */
/* Hintergrund komplett an .net-bg abgegeben (Entwurf-2-HG ersetzt den alten).
   Ursprung 11 (Punktraster + Tiefen-Verlauf), für Rückbau aufbewahrt:
   background:
     radial-gradient(circle at 1px 1px, rgba(148,163,184,.10) 1px, transparent 0),
     radial-gradient(130% 120% at 78% 40%, #16233a 0%, #0d1728 45%, #080f1c 100%);
   background-size: 34px 34px, auto; */
.mh-dark {
  background: transparent;
  padding: clamp(44px, 5vw, 72px) 0 clamp(64px, 8vw, 112px);
}
.mh-hero { display: grid; grid-template-columns: 1.3fr .7fr; gap: 56px; align-items: start; max-width: var(--wrap); margin-inline: auto; padding-inline: clamp(20px, 5vw, 44px); }

.kicker { font-family: var(--font-mono); font-size: 14px; font-weight: 500; letter-spacing: .34em; text-transform: uppercase; color: var(--green-h); margin: 0 0 22px; }
.headline { font-family: var(--font-head); font-weight: 700; font-size: clamp(46px, 6vw, 76px); line-height: 1.05; color: var(--tx); letter-spacing: .005em; }
.headline .accent { position: relative; color: var(--green); white-space: nowrap; display: inline-block; overflow: visible; }
.headline .accent .accent-swoosh { position: absolute; left: -12px; bottom: -22px; width: 118%; height: 44px; object-fit: fill; transform: scaleX(-1); pointer-events: none; }
.hero-text { font-family: var(--font-sans); font-size: clamp(18px, 2vw, 21px); color: var(--tx-dim2); max-width: 44ch; margin: 28px 0 34px; }
.hero-actions { display: flex; flex-wrap: wrap; gap: 16px; }

/* Leistungsliste = grüne Leiterbahn + Nodes */
.leistungsliste { list-style: none; margin: 6px 0 0; padding: 6px 0 6px 40px; position: relative; display: flex; flex-direction: column; gap: 42px; }
.leistungsliste::before { content: ""; position: absolute; left: 9px; top: 12px; bottom: 12px; width: 2px; background: linear-gradient(180deg, rgba(34,197,94,.55), rgba(34,197,94,.16)); }
.leistungsliste li { position: relative; }
.node { position: absolute; left: -40px; top: 2px; width: 18px; height: 18px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 5px rgba(34,197,94,.14), 0 0 14px 2px rgba(34,197,94,.5); }
.ll-title { display: block; font-family: var(--font-mono); font-weight: 700; letter-spacing: .12em; color: var(--green-h); font-size: 16px; }
.ll-line { display: block; font-family: var(--font-sans); color: var(--tx-dim); font-size: 16px; margin-top: 3px; }
/* Die drei Hero-Zeilen sind seit 29.07. Links auf `#leistungen`.
   `display:block` ist noetig, weil `.ll-title`/`.ll-line` Bloecke sind — in
   einem inline `<a>` wuerde die Klickflaeche zerfallen. `position` bleibt
   static, damit `.node` weiter gegen das `li` positioniert (sonst rutschte
   der Punkt um 40 px).
   Der Hover faerbt nur auf, was ohnehin schon da ist: Titel weiss, Unterzeile
   heller, Punkt staerker leuchtend — bewusst keine Verschiebung, weil die
   Zeilen an einer senkrechten Leitlinie haengen und jedes Wandern die Flucht
   dieser Linie sichtbar brechen wuerde. */
.ll-link { display: block; }
.ll-title, .ll-line, .node { transition: color .18s ease, box-shadow .18s ease; }
.ll-link:hover .ll-title, .ll-link:focus-visible .ll-title { color: #fff; }
.ll-link:hover .ll-line, .ll-link:focus-visible .ll-line { color: var(--tx); }
.ll-link:hover .node, .ll-link:focus-visible .node {
  box-shadow: 0 0 0 6px rgba(34,197,94,.20), 0 0 18px 3px rgba(34,197,94,.70);
}
@media (prefers-reduced-motion: reduce) {
  .ll-title, .ll-line, .node { transition: none; }
}

/* =====================================================================
   Weitere Sektionen (unter der Hero-Card)
   ===================================================================== */
.section { padding: clamp(70px, 9vw, 116px) 0; position: relative; }
/* Alle Dunkelzonen geben ihren Hintergrund an .net-bg ab — der HG aus
   Entwurf 2 ERSETZT Punktraster + Navy-Fläche, statt darunter zu liegen.
   Ursprung 11, für Rückbau aufbewahrt:
   .section-dark   { background: radial-gradient(circle at 1px 1px, rgba(148,163,184,.08) 1px, transparent 0), #0b1220; background-size: 34px 34px, auto; }
   .section-light  { background: radial-gradient(circle at 1px 1px, rgba(148,163,184,.08) 1px, transparent 0), #0b1220; background-size: 34px 34px, auto; }
   .section-contact{ background: radial-gradient(circle at 1px 1px, rgba(148,163,184,.08) 1px, transparent 0), radial-gradient(60% 80% at 50% 100%, rgba(34,197,94,.14), transparent 60%), #0b1220; background-size: 34px 34px, auto, auto; } */
.section-dark { background: transparent; }
/* Ganz dunkel: Profil ist Teil der durchgehenden Zone */
.section-light { background: transparent; color: #eaf0f6; }
/* Grüner Schimmer unten 1:1 aus Entwurf 9 (dort style.css Z.143) zurückgeholt.
   NUR der grüne Verlauf — Punktraster und die deckende Navy-Fläche aus 9
   bleiben draußen, sonst würde der Netzwerk-HG hier wieder verdeckt.
   Der Verlauf ist durchgehend transparent (rgba .14 -> transparent) und
   legt sich damit über das Canvas, statt es zuzudecken. */
.section-contact { background: radial-gradient(60% 80% at 50% 100%, rgba(34,197,94,.14), transparent 60%); text-align: center; }
.section-head { max-width: 640px; margin-bottom: clamp(38px, 5vw, 56px); }
.section-kicker { font-family: var(--font-mono); font-size: 13px; font-weight: 500; letter-spacing: .18em; color: var(--green-h); margin: 0 0 16px; }
.section-title { font-family: var(--font-head); font-weight: 700; font-size: clamp(27px, 3.6vw, 40px); margin-bottom: 16px; color: #fff; letter-spacing: .01em; }
.section-light .section-kicker { color: #4ade80; }
.section-light .section-title { color: #fff; max-width: 22ch; }
.section-intro { font-size: 18px; color: var(--tx-dim2); }

/* ---------- Pfeil „nach oben" neben dem Sektions-Kicker ----------
   Ersatz fuer die fehlende zweite Menuefuehrung: Das Kopfmenue sitzt nur im
   Hero und scrollt weg, unterhalb davon gab es keinen Weg zurueck. Steht in
   Leistungen, Profil und Kontakt jeweils direkt hinter dem Kicker-Wort.
   Bewusst NICHT an `.section-kicker` selbst gebaut (kein display-Wechsel dort):
   die Klasse laeuft auch in den Unterseiten und in weiteren Bloecken — ein
   Eingriff dort haette Fernwirkung. Der Pfeil ist ein eigenes inline-Element,
   der Kicker bleibt unveraendert ein Block.
   Farbe kommt ueber `currentColor` vom Kicker — damit stimmt sie in der
   dunklen Zone (var(--green-h)) wie in `.section-light` (#4ade80) von selbst.
   Ein Kreis statt eines nackten Zeichens, weil das Element eine BEDIENUNG ist
   und ohne Umriss neben einer Versal-Zeile wie Dekoration wirkt. */
.zum-anfang {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; margin-left: 12px; vertical-align: middle;
  border: 1px solid rgba(154,165,182,.34); border-radius: 999px;
  color: inherit; flex: none;
  transition: color .18s ease, border-color .18s ease, background .18s ease, transform .18s ease;
}
.zum-anfang svg {
  width: 13px; height: 13px; display: block;
  fill: none; stroke: currentColor; stroke-width: 2.2;
  stroke-linecap: round; stroke-linejoin: round;
}
.zum-anfang:hover, .zum-anfang:focus-visible {
  border-color: var(--green-h); background: rgba(34,197,94,.12);
  transform: translateY(-2px);
}
/* Die Anhebung ist Zierde — bei reduzierter Bewegung entfaellt sie, Farbe und
   Rahmen bleiben als Rueckmeldung. */
@media (prefers-reduced-motion: reduce) {
  .zum-anfang { transition: none; }
  .zum-anfang:hover, .zum-anfang:focus-visible { transform: none; }
}

.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.card { background: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,.015)); border: 1px solid rgba(148,163,184,.16); border-radius: 16px; padding: 34px 28px; transition: transform .25s ease, box-shadow .3s ease, border-color .3s ease, background .3s ease; }
.card:hover { transform: translateY(-5px); border-color: rgba(34,197,94,.42); background: linear-gradient(180deg, rgba(34,197,94,.06), rgba(255,255,255,.015)); box-shadow: 0 18px 40px rgba(0,0,0,.35); }
.card-icon { width: 56px; height: 56px; border-radius: 14px; display: grid; place-items: center; background: rgba(34,197,94,.10); border: 1px solid rgba(34,197,94,.30); color: var(--green-h); margin-bottom: 22px; }
.card-icon svg { width: 28px; height: 28px; }
.card-title { font-size: 21px; color: #fff; margin-bottom: 10px; }
.card-text { color: var(--tx-dim2); font-size: 16px; }
.card-text + .card-text { margin-top: 12px; }
.card-text strong { color: var(--tx); }

/* Kurzzeile + die drei Unterpunkte je Feld (Beratung steckt in jedem Feld,
   deshalb kein viertes Consulting-Feld — s. Intro der Sektion). */
.card-kurz { font-family: var(--font-mono); font-size: 13px; font-weight: 500; letter-spacing: .04em; color: var(--green-h); margin: 0 0 14px; }
.card-tags { list-style: none; display: flex; flex-wrap: wrap; gap: 7px; margin: 0 0 18px; padding: 0; }
.card-tags li { font-family: var(--font-mono); font-size: 12px; letter-spacing: .03em; color: var(--tx-dim); border: 1px solid rgba(154,165,182,.28); border-radius: 999px; padding: 4px 11px; }

/* =====================================================================
   DREI FELDER ALS AUFKLAPPER
   Reiter nebeneinander (kompakt), Text auf voller Breite darunter.
   Der Zustand hängt allein an aria-expanded/hidden — die Optik folgt dem
   Attribut, nicht einer zweiten Klasse, die auseinanderlaufen könnte.
   ===================================================================== */
/* minmax(0, 1fr) statt 1fr: Grid-Spalten haben von sich aus eine Mindestbreite
   von `auto` — ein langer Inhalt (etwa eine Stichwortzeile) sprengt die Spalte
   dann und die drei Kacheln werden UNTERSCHIEDLICH breit. Mit 0 als Minimum
   bleiben sie exakt gleich. (Gemessen 29.07.: 6 px Differenz.) */
.feld-reiter { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.feld-tab {
  position: relative; display: flex; flex-direction: column; align-items: flex-start;
  text-align: left; font: inherit; color: inherit; cursor: pointer;
  padding: 26px 46px 22px 24px;
  border: 1px solid rgba(148,163,184,.16); border-radius: 16px;
  /* Abgedunkelt 29.07. (gilt fuer beide Reihen): vorher lag ein AUFHELLENDER
     Weissschleier auf der Kachel, das Netzwerk-Canvas schien fast ungedaempft
     durch. Jetzt ein dunkler Schleier — die Kachel setzt sich vom Hintergrund
     ab, Icons und Text stehen darueber und werden nicht mitgedunkelt.
     Vorher: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,.015)) */
  background: linear-gradient(180deg, rgba(6,11,18,.58), rgba(6,11,18,.70));
  transition: transform .25s ease, border-color .3s ease, background .3s ease, box-shadow .3s ease;
}
.feld-tab:hover { transform: translateY(-4px); border-color: rgba(34,197,94,.42); box-shadow: 0 18px 40px rgba(0,0,0,.35); }
.feld-tab:focus-visible { outline: 2px solid var(--green-h); outline-offset: 3px; }
.feld-tab[aria-expanded="true"] { border-color: rgba(34,197,94,.60); background: linear-gradient(180deg, rgba(34,197,94,.09), rgba(255,255,255,.015)); }
/* Icon-Bilder (seit 29.07.) statt der frueheren Strich-SVGs. Die Vorlagen sind
   200x200 mit Alphakanal und bringen ihre runde Form UND ihren Rand selbst mit
   — deshalb kein Kasten, kein zweiter Rahmen, keine Hintergrundfuellung mehr.
   Vorherige Fassung (Kasten 52px, gruener Rahmen, SVG 26px innen):
   .feld-icon { width: 52px; height: 52px; border-radius: 14px; display: grid; place-items: center; background: rgba(34,197,94,.10); border: 1px solid rgba(34,197,94,.30); color: var(--green-h); margin-bottom: 18px; }
   .feld-icon svg { width: 26px; height: 26px; } */
.feld-icon { display: block; width: 128px; height: 128px; margin-bottom: 18px; }
.feld-icon img { width: 100%; height: 100%; display: block; }
/* Farbiger Schein je Feld (obere Reihe, 29.07.). `drop-shadow` statt
   `box-shadow`: es folgt der Alphakontur des Bildes, glueht also der runden
   Form entlang, waehrend box-shadow den quadratischen Rahmen nachzeichnen
   wuerde. Zwei gestapelte Schatten ergeben engen Kern + weiten Hof.
   Farbwahl nach dem Motiv: Gehaeuse gruen, Platine blau, Codefenster orange.
   Gilt fuer BEIDE Reihen — `.feld-icon--*` ist die obere (Bild ueber dem
   Text), `.feld-bg--*` die untere (Bild hinter dem Text). Dort wirkt der
   Schein schwaecher, weil die Deckkraft des Elements den Schatten mitdimmt. */
.feld-icon--gruen  img, .feld-bg--gruen  { filter: drop-shadow(0 0 8px rgba(34,197,94,.46))  drop-shadow(0 0 20px rgba(34,197,94,.27)); }
.feld-icon--blau   img, .feld-bg--blau   { filter: drop-shadow(0 0 8px rgba(56,189,248,.46)) drop-shadow(0 0 20px rgba(56,189,248,.27)); }
.feld-icon--orange img, .feld-bg--orange { filter: drop-shadow(0 0 8px rgba(251,146,60,.46)) drop-shadow(0 0 20px rgba(251,146,60,.27)); }
.feld-name { font-family: var(--font-head); font-weight: 700; font-size: 22px; color: #fff; letter-spacing: .01em; }
.feld-kurz { color: var(--tx-dim2); font-size: 15.5px; margin-top: 6px; }
.feld-stich { font-family: var(--font-mono); font-size: 12px; color: var(--tx-dim); letter-spacing: .02em; margin-top: 14px; }
/* Pfeil = die einzige Aufforderung; dreht sich beim Öffnen. */
.feld-pfeil { position: absolute; right: 24px; top: 32px; width: 10px; height: 10px; border-right: 2px solid rgba(154,165,182,.65); border-bottom: 2px solid rgba(154,165,182,.65); transform: rotate(45deg); transition: transform .25s ease, border-color .25s ease; }
.feld-tab[aria-expanded="true"] .feld-pfeil { transform: rotate(-135deg); border-color: var(--green-h); }

/* ---------------------------------------------------------------------
   Vergleichsvariante (29.07.): Icon gross und mittig HINTER dem Text.
   Das Bild liegt absolut in der Kachelmitte, der Text steht per
   position/z-index darueber. Deckkraft ist der Startwert zum Feintunen —
   zu hoch frisst sie die Lesbarkeit der Kurzzeile.
   --------------------------------------------------------------------- */
.feld-reiter--bild { margin-top: 20px; }
/* Quadratische Kachel (Micha 29.07.): die Hoehe folgt der Spaltenbreite, also
   dem Grid — kein fester Wert, der bei anderer Fensterbreite nicht mehr passt.
   Ersetzt die frueher feste `min-height: 210px`. */
/* padding-right zurueck auf 24px: die 46px der Grundklasse waren Platz fuer den
   Aufklapp-Pfeil, den diese Variante nicht mehr hat. Ohne das bricht die
   Stichwortzeile von „Web-Systeme" in zwei Zeilen, waehrend die anderen beiden
   einzeilig bleiben. */
/* Die Kachel ist seit 29.07. KEIN Bedienelement mehr (Micha: „die anklickbaren
   Kaesten deaktivieren, nur ueber Menue") — im Markup ein <div> statt <button>,
   hier entsprechend ohne Zeigefinger. Bedient wird ueber den Burger, der jetzt
   selbst der Knopf ist. */
.feld-tab--bild { aspect-ratio: 1 / 1; justify-content: flex-start; overflow: hidden; padding-right: 24px; padding-bottom: 34px; cursor: default; }
/* Das Anheben beim Ueberfahren BLEIBT (Micha 29.07.: „Mouseover — Kasten
   groesser, bleibt, nur ohne Link") — es zeigt, dass die Kachel lebt, auch
   wenn sie selbst nicht mehr klickbar ist. Geerbt von `.feld-tab:hover`,
   deshalb steht hier nur der Zeigefinger-Verzicht. */
/* Textaufteilung in der quadratischen Kachel (Micha 29.07.): der Titelblock
   (Ueberschrift + Unterzeile) setzt knapp UNTERHALB der Kachelmitte an, die
   Stichwortzeile bleibt am unteren Rand. Vorher hing alles unten zusammen
   (justify-content: flex-end).
   Warum Prozent am margin funktioniert: Prozentwerte bei margin beziehen sich
   auf die BREITE des Elternelements — bei aspect-ratio 1/1 ist die gleich der
   Hoehe, der Wert ist also zugleich ein Hoehenanteil. 47 % + 26 px Innenabstand
   oben ergeben rund 55 % der Kachelhoehe. */
.feld-tab--bild .feld-name  { margin-top: 49%; }
.feld-tab--bild .feld-stich { margin-top: auto; }

/* Rahmen in der Farbe des jeweiligen Icons (Micha 29.07.): KI blau, Web
   orange, IT gruen. Die Farbe steckt als RGB-Tripel in einer eigenen
   Variablen, damit Ruhe-, Hover- und Offen-Zustand nur die Deckkraft
   aendern — sonst muesste jede Farbe dreimal gepflegt werden.
   Angeschrieben ueber die IDs, nicht ueber die Reihenfolge: eine Umsortierung
   der Kacheln soll die Farben nicht durcheinanderbringen. */
#tab-ki-b  { --feldfarbe:  56, 189, 248; }
#tab-web-b { --feldfarbe: 251, 146,  60; }
#tab-it-b  { --feldfarbe:  34, 197,  94; }
.feld-tab--bild { border-color: rgba(var(--feldfarbe), .30); }
.feld-tab--bild:hover { border-color: rgba(var(--feldfarbe), .60); }
/* Icon oben rechts mit Abstand zum Rand (vorher mittig ueber die ganze Kachel
   zentriert: left/top 50% + translate(-50%,-50%)). Groesse unveraendert 200px. */
.feld-bg {
  position: absolute; top: 22px; right: 22px;
  /* Deckkraft 29.07. von .30 auf .55 angehoben: an Variante A gefielen Micha
     die KRAEFTIGEREN Icons — das ist hier die einzige Schraube dafuer, denn
     die Elementdeckkraft dimmt auch den farbigen Schein mit. */
  /* 220px = 10 % ueber der nativen Aufloesung der Vorlage (200x200). Auf einem
     normalen Bildschirm unsichtbar, auf einem hochaufloesenden minimal weicher —
     wer deutlich groesser will, braucht groessere Vorlagen. */
  width: 220px; height: 220px; z-index: 0; opacity: .70; pointer-events: none;
}
/* Leseschleier zwischen Bild und Text (29.07.). Die Icons sollen kraeftig
   bleiben (.55), aber der Text steht unten in der Kachel und lag damit auf den
   hellen Stellen des Motivs — bei „Web-Systeme" am staerksten. Statt das Bild
   wieder zu dimmen, dunkelt ein Verlauf NUR die untere Haelfte ab: oben
   transparent, unten fast deckend. Stapelung: Bild 0 < Schleier 1 < Text 2. */
.feld-tab--bild::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  /* Ansatzpunkte 29.07. nach unten gezogen (vorher 34%/58%): in der jetzt
     quadratischen Kachel sitzt das Icon oben rechts und der Text deutlich
     tiefer — der alte Verlauf haette die untere Icon-Haelfte gedimmt. */
  background: linear-gradient(180deg, rgba(6,11,18,0) 48%, rgba(6,11,18,.48) 70%, rgba(6,11,18,.76) 100%);
}
/* Text ueber den Leseschleier heben. OHNE diese Zeile bleiben die Spans
   `position: static` — ein positioniertes Pseudo-Element (der `::after`-Schleier,
   z-index 1) malt dann UEBER sie, und Ueberschrift, Kurz- und Stichwortzeile
   liegen unter dem dunklen Verlauf statt darueber. Genau das war hier der Fall
   (Micha 30.07.: „Kacheln auf preview schlecht lesbar"): Die Zeile ging beim
   Herausloesen der Burger-Teile fuer die Landingpage-Fassung verloren — der
   Kommentar weiter unten verweist noch auf sie („die Zeile darueber").
   Stapelung damit wieder wie in der Hauptfassung: Bild 0 < Schleier 1 < Text 2.
   Anders als dort ohne den `.feld-burger`-Teil: Die Landingpage hat bewusst
   weder Burger noch Kachelmenue (Micha 29.07.), das Element existiert im
   Markup dieser Fassung nicht. */
.feld-tab--bild > span { position: relative; z-index: 2; }

/* Beim selben Herausloesen stehengeblieben: zwei Selektoren ohne eigenen Rumpf,
   die sich ueber die Kommata den `display: none`-Rumpf der Pfeil-Regel unten
   teilten. Beide zielen auf Elemente, die es in dieser Fassung nicht gibt
   (`feld-burger`, `menu-schliessen` — im Markup 0 Treffer). Auskommentiert
   statt geloescht, damit der Zusammenhang zur Hauptfassung sichtbar bleibt:
   .feld-tab--bild .feld-burger::before,
   .menu-schliessen::before, */
/* Kein Pfeil in dieser Variante (Micha 29.07.) — die Aufforderung soll spaeter
   ein Mouseover-Verhalten uebernehmen. Die Verankerungs-Regel bleibt
   auskommentiert stehen, falls der Pfeil zurueckkommt: die Zeile darueber
   setzt ALLE Spans auf relative, was dem absolut positionierten Pfeil seine
   Verankerung nimmt und ihn in den Textfluss fallen laesst (gemessen 29.07.:
   sass unten links statt oben rechts).
   .feld-tab--bild > span.feld-pfeil { position: absolute; z-index: 1; } */
.feld-tab--bild > span.feld-pfeil { display: none; }
.feld-tab--bild:hover .feld-bg { opacity: .88; }
.feld-tab--bild:focus-within .feld-bg { opacity: .88; }

.feld-panel { margin-top: 20px; padding: 34px 34px 30px; border: 1px solid rgba(34,197,94,.26); border-radius: 16px; background: linear-gradient(180deg, rgba(34,197,94,.05), rgba(255,255,255,.012)); }
.feld-panel[hidden] { display: none; }

@keyframes sk-fluss { to { stroke-dashoffset: -32; } }

/* Handelszeile — bewusst eine Zeile und keine Karte, damit sie nicht wie ein
   viertes Leistungsfeld gelesen wird. */
.handel { max-width: 900px; margin: 34px 0 0; color: var(--tx-dim2); font-size: 16.5px; border-left: 2px solid rgba(34,197,94,.45); padding-left: 20px; }
.handel strong { color: var(--tx); }

/* Nachweis-Block: Diagramm links, Text rechts. */
.nachweis { display: grid; grid-template-columns: 1.15fr .85fr; gap: 40px; align-items: center; margin-top: 52px; padding: 30px; border: 1px solid rgba(148,163,184,.16); border-radius: 16px; background: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,.012)); }
.nachweis-text .section-kicker { margin-bottom: 12px; }
.nachweis-text p { color: var(--tx-dim2); font-size: 17px; margin-bottom: 22px; }

/* Erstgespräch — steht zweimal auf der Seite (Leistungsteil + Kontakt), Text
   identisch. Der letzte Satz („Was nicht passt, sage ich Ihnen auch.") bleibt
   stehen, er unterscheidet das Gespräch von einem Verkaufstermin. */
.erstgespraech { margin-top: 40px; padding: 22px 26px; border: 1px solid rgba(34,197,94,.30); border-radius: 14px; background: rgba(34,197,94,.06); }
.erstgespraech p { color: var(--tx-dim2); font-size: 16.5px; }
.erstgespraech strong { color: var(--green-h); }
.erstgespraech--kontakt { margin-top: 36px; text-align: left; max-width: 640px; margin-inline: auto; }

/* Web-Pakete */
.pakete { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.paket { display: flex; flex-direction: column; background: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,.015)); border: 1px solid rgba(148,163,184,.16); border-radius: 16px; padding: 30px 26px; transition: transform .25s ease, border-color .3s ease, box-shadow .3s ease; }
.paket:hover { transform: translateY(-5px); border-color: rgba(34,197,94,.42); box-shadow: 0 18px 40px rgba(0,0,0,.35); }
.paket-name { font-family: var(--font-head); font-size: 24px; color: #fff; letter-spacing: .01em; }
.paket-preis { font-family: var(--font-mono); font-weight: 700; font-size: 26px; color: var(--green-h); margin: 8px 0 20px; }
.paket-liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.paket-liste li { position: relative; padding-left: 22px; color: var(--tx-dim2); font-size: 15.5px; line-height: 1.5; }
.paket-liste li::before { content: ""; position: absolute; left: 2px; top: .62em; width: 7px; height: 7px; border-radius: 50%; background: rgba(34,197,94,.75); }

.paket-zusatz { margin-top: 34px; display: grid; grid-template-columns: 1fr 1fr; gap: 18px 40px; }
.paket-zusatz p { color: var(--tx-dim2); font-size: 15.5px; }
.paket-zusatz strong { color: var(--tx); }

.einzugsgebiet { color: var(--tx-dim); font-size: 15.5px; }

/* =====================================================================
   RECHTSTEXT (Impressum, spaeter Datenschutz)
   Nummer links, Inhalt rechts — die Gliederung bleibt beim Ueberfliegen
   sichtbar, ohne dass der Text in Kaesten zerfaellt.
   ===================================================================== */
/* Erste Fassung war die Gliederung der Vorlage abgeschrieben: grosse Nummer
   links, Trennlinie, Text rechts — sechsmal gleich. Ersetzt durch eine
   Gewichtung nach Lesebeduerfnis (wer / wie erreichbar zuerst als Karten),
   ohne Reihenfolge oder Wortlaut anzutasten. */
/* Seitenkopf des Impressums: Titel links, Paragrafenhinweis rechts auf
   derselben Grundlinie. `align-items: baseline` statt `center` — sonst
   schwimmt die kleine Zeile in der Mitte der grossen Ueberschrift statt
   mit ihr auf einer Linie zu sitzen. Bricht auf schmalen Schirmen um. */
/* `center` statt `baseline`: Links steht ein Bild, das gar keine Schrift-
   grundlinie hat — bei Grundlinien-Ausrichtung zaehlt seine Unterkante, und
   die rechte Spalte haengt dann darunter. Auf der Datenschutzseite fiel das
   auf, weil die Datumszeile sie 31px hoeher macht (gemessen 103 statt 72).
   Mittig ausgerichtet liegen Bild und Text auf beiden Seiten auf einer Hoehe,
   unabhaengig davon, wie viele Zeilen rechts stehen. */
.imp-kopfzeile { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 28px; margin-bottom: 30px; }
/* Ueberschrift als Bild-Button. Das Bild liegt in doppelter Aufloesung vor
   (128px hoch fuer 64px Anzeige). */
.imp-titel-bild { margin: 0; line-height: 0; }
.imp-titel-bild img { display: block; height: 64px; width: auto; }
/* Derselbe Verlauf wie an den Kaesten, nur auf die Schrift: gruen an der
   linken Kante, nach rechts ins Silber auslaufend. `background-clip: text`
   beschneidet den Verlauf auf die Buchstaben.
   Zwei Feinheiten: Die Ueberschrift ist ein Flex-Element und damit genau so
   breit wie das Wort — sonst laege der Verlauf ueber der ganzen Zeilenbreite
   und das Wort waere durchgehend gruen. Und `color` bleibt als Rueckfall
   gesetzt: wo `background-clip: text` nicht traegt, steht schlicht Silber
   statt unsichtbarer Schrift. */
.imp-titel {
  font-family: var(--font-head); font-weight: 700;
  font-size: clamp(27px, 3.6vw, 40px); letter-spacing: .01em;
  color: var(--grey);
  background: linear-gradient(to right, var(--orange) 0%, var(--grey) 62%);
  -webkit-background-clip: text;
          background-clip: text;
  -webkit-text-fill-color: transparent;
}
/* 15px waren zu zurueckhaltend fuer eine Zeile, die neben einer 64px hohen
   Ueberschrift steht. Gilt auf beiden Rechtsseiten. */
.imp-paragraf { color: var(--tx-dim); font-size: 16.5px; }
/* Rechte Spalte der Kopfzeile: Paragrafenhinweis und Stand untereinander,
   beide rechtsbuendig. */
.imp-nebeninfo { text-align: right; }

/* Aufbau nach dem Vorbild der GameZone-Rechtsseiten (legal-document.css):
   gleichfoermige Kaesten, feste Nummernspalte, Ueberschrift als kleiner
   Versalien-Kicker statt als Titel. EINE Rasterbreite fuer alles — die
   wechselnden Breiten der Vorfassung ergaben das unruhige Treppenbild.
   Grundton wie der Footer-Schleier: der alte Kartenverlauf war ein AUFheller
   (Weiss 3,5 %) und daempfte gar nichts — gemessen schlugen Linien des
   Netzwerks mit Helligkeit 128 durch die Karte durch. */
/* Keine eigene Maximalbreite: mit 900px endeten die Kaesten 192px vor dem
   rechten Rand von Kopfzeile und Footer, waehrend sie links buendig standen —
   diese einseitige Verkuerzung wirkt wie eine Verschiebung nach links.
   Jetzt laufen sie ueber die volle Spaltenbreite und schliessen beidseitig
   mit dem uebrigen Seiteninhalt ab. */
.imp-liste { max-width: none; }
.imp-block {
  display: grid; grid-template-columns: 48px 1fr; gap: 0 20px; align-items: start;
  padding: 26px 30px; margin-bottom: 14px;
  border: 1px solid rgba(148,163,184,.16);
  border-left: 2px solid rgba(34,197,94,.45);
  border-radius: 12px;
  /* Gruen laeuft von der linken Kante nach rechts aus. Feste Auslauflaenge
     (180px) statt Prozent — sonst waere der Verlauf in den halbbreiten
     Kaesten 01/02 kuerzer als in den vollbreiten darunter. Die harte Kante
     links bleibt die Border, der Verlauf legt sich nur darueber. */
  background:
    linear-gradient(to right, rgba(34,197,94,.13), rgba(34,197,94,0) 180px),
    rgba(8,15,28,.70);
  transition: border-color .25s ease;
}
.imp-block:hover { border-color: rgba(34,197,94,.42); border-left-color: var(--green); }
/* 01 + 02 als Paar. Der Zeilenabstand wandert vom Kasten auf das Paar, sonst
   addierte sich die Kasten-Unterkante zum Rasterabstand. `align-items: stretch`
   ist der Grid-Standard — beide Haelften bleiben dadurch gleich hoch. */
.imp-paar { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 14px; }
.imp-paar .imp-block { margin-bottom: 0; }
.imp-nr { font-family: var(--font-mono); font-weight: 700; font-size: 15px; color: var(--green-h); opacity: .8; padding-top: 2px; letter-spacing: .05em; }
/* Ursprung: 12px. Groesser auf Wunsch — die Sperrung bleibt bei .15em,
   dadurch waechst die Zeile spuerbar in der Breite, nicht nur in der Hoehe. */
.imp-kicker { font-family: var(--font-mono); font-size: 14px; font-weight: 700; letter-spacing: .15em; text-transform: uppercase; color: var(--green-h); margin-bottom: 14px; }
.imp-body p { color: var(--tx-dim2); font-size: 16px; }
.imp-body p + p { margin-top: 12px; }
.imp-body strong { color: var(--tx); }
.imp-body a { color: var(--green-h); text-decoration: none; border-bottom: 1px solid rgba(34,197,94,.4); }
.imp-body a:hover { color: var(--green); border-bottom-color: var(--green); }




.leistungsseite .imp-block,

/* Kaesten auf der Datenschutzseite dunkler als im Impressum (.70). Bewusst
   NUR hier: Dort liegen sie ueberwiegend auf dem ruhigen Netzwerk-Canvas,
   hier auf einem Foto mit Schrankreihen und Bodenspiegelung. Gleiche Zahl
   haette also ungleiche Wirkung ergeben — was zaehlt, ist der Lesegrund,
   nicht der Zahlenwert. */
#datenschutz .imp-block { background: rgba(8,15,28,.84); }

/* ---------- Nur Datenschutzseite ----------
   Die Kasten-Klassen `.imp-*` tragen BEIDE Rechtsseiten — der Name stammt vom
   Impressum, wo sie zuerst entstanden. Bewusst nicht umbenannt: eine Umbenennung
   haette beide Seiten angefasst, ohne etwas zu verbessern. */
/* Vorher 13px Schreibmaschinenschrift und damit sichtbar kleiner als der
   Paragrafenhinweis darueber — jetzt dieselbe Schrift, nur eine Spur
   kleiner und gedaempfter, damit die Rangfolge stimmt ohne Bruch. */
.ds-stand { font-size: 15px; color: var(--tx-dim); opacity: .8; margin-top: 6px; }
/* Zwischenüberschrift innerhalb eines Abschnitts (06 hat zwei Kontaktwege).
   Kleiner als der Kicker und in Silber statt Grün, damit die Rangfolge
   Abschnitt > Zwischenteil auf einen Blick stimmt. */
.ds-unter { font-family: var(--font-sans); font-weight: 700; font-size: 16px; color: var(--grey); margin: 20px 0 10px; }
.ds-unter:first-of-type { margin-top: 4px; }
.ds-grundlage { border-left: 2px solid rgba(34,197,94,.35); padding-left: 14px; }
.ds-rechte { list-style: none; margin: 12px 0 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.ds-rechte li { position: relative; padding-left: 22px; color: var(--tx-dim2); font-size: 16px; line-height: 1.5; }
.ds-rechte li::before { content: ""; position: absolute; left: 2px; top: .62em; width: 7px; height: 7px; border-radius: 50%; background: rgba(34,197,94,.75); }

.imp-name { font-family: var(--font-head); font-weight: 700; font-size: 28px; color: #fff; letter-spacing: .01em; }
.imp-firma { color: var(--grey); font-size: 17px; margin-top: 4px; }
/* Anschrift bleibt abgesetzt, aber OHNE eigenen Kasten: kein Grund, kein
   Rahmen. Die Absetzung traegt jetzt allein der Abstand und der weitere
   Zeilenfall — ein Kasten im Kasten machte daraus eine zweite Ebene, die
   der Rest der Seite nicht hat. */
.imp-anschrift { display: block; font-style: normal; color: var(--tx-dim2); font-size: 16px; line-height: 1.9; margin: 18px 0 0; }
.imp-fuss { margin-top: 16px; font-family: var(--font-mono); font-size: 13px; color: var(--tx-dim); }
.imp-mail { font-size: 19px; word-break: break-word; }
.imp-mail a { color: var(--green-h); text-decoration: none; border-bottom: 1px solid rgba(34,197,94,.4); padding-bottom: 2px; }
.imp-mail a:hover { color: var(--green); border-bottom-color: var(--green); }
/* Der Kopier-Knopf traegt exakt das Aussehen des frueheren Links (die Adresse
   soll sich nicht veraendert haben, nur ihr Verhalten). Ein <button> bringt
   dafuer eigene Voreinstellungen mit — Systemschrift, Innenabstand, Rahmen,
   grauer Grund —, die hier alle zurueckgenommen werden. */
.imp-mail .mail-kopieren {
  font-family: inherit; font-size: inherit; line-height: inherit;
  padding: 0 0 2px; background: none; border: 0; cursor: pointer;
  color: var(--green-h); border-bottom: 1px solid rgba(34,197,94,.4);
  transition: color .18s ease, border-color .18s ease;
}
.imp-mail .mail-kopieren:hover { color: var(--green); border-bottom-color: var(--green); }
.imp-mail .mail-kopieren:focus-visible { outline: 2px solid var(--green); outline-offset: 3px; }
/* Luft im Kontaktblock (Micha 29.07.): Der ganze Block sitzt tiefer unter dem
   Kicker, und der Hinweis auf den zweiten Kontaktweg setzt sich deutlicher von
   der eigenen Adresse darueber ab. Damit trennen sich die beiden Kontaktwege
   optisch, statt als eine dichte Liste zu erscheinen.
   Beide Regeln greifen NUR im Kontaktkasten (`#imp-kontakt`), nicht in den
   uebrigen Bloecken des Impressums. */
#imp-kontakt .imp-kicker { margin-bottom: 26px; }
#imp-kontakt .imp-mail + p { margin-top: 26px; }
/* Verweis aufs Kontaktformular — schlichter Textlink, kein Knopf: es ist ein
   Querverweis im Rechtstext, keine Handlungsaufforderung. Gleiche Machart wie
   die Mailadresse darueber, damit beide Kontaktwege gleich aussehen. */
.imp-formularlink { margin-top: 14px; }
/* Die beiden Regeln fuer `.imp-formularlink a` sind hier entfernt (Micha 30.07.,
   ausdruecklich): Reste aus der Zeit, als der Formularaufruf ein Link war. Seit
   er ein <button> ist, griffen sie auf nichts mehr. Zwillingsdatei ../style.css. */

/* ---------- Footer mit Bildband ----------
   Das Band sitzt buendig am unteren Rand (letztes Element, Footer ohne
   Bodenabstand). Der Uebergang nach oben ist eine CSS-Maske: sie senkt die
   Deckkraft des Elements selbst, deshalb bleibt der animierte Hintergrund
   im ausgeblendeten Bereich sichtbar — anders als bei einem daruebergelegten
   Farbverlauf, der ihn zudecken wuerde. */
/* ---------- Bodenbild als Seitenhintergrund ----------
   Frueher lag das Bild als Band IM Footer und verlaengerte damit die Seite —
   der Inhalt stand darueber statt darauf. Jetzt haengt es am unteren Rand
   des Dokuments und der Inhalt liegt darauf.
   `position: absolute` gegen den Body (nicht `fixed`): es soll am SEITENende
   kleben, nicht am Sichtfensterrand mitwandern. */
body { position: relative; }
/* Unterkante am Seitenende: das Bild laeuft bis ganz unten durch, der Footer
   liegt darin. Wichtig dabei — der Footer darf davon NICHT wachsen: er behaelt
   seine 114px der Startseite, das Bild traegt keine eigene Hoehe bei, weil es
   absolut positioniert aus dem Fluss genommen ist. (Ein frueherer Versuch mit
   zusaetzlichem Bodenpolster liess genau das passieren.) */
.bodenbild { position: absolute; left: 0; right: 0; bottom: 0; z-index: 0; pointer-events: none; }
/* Variante fuer die Startseite: am SICHTFENSTER statt am Dokument verankert.
   Grund ist die Seitenlaenge — gemessen 4286px, das Bild deckt davon 651px
   und damit nur 15 %, die ganz unten liegen. Man muesste erst ewig scrollen,
   um es ueberhaupt zu sehen. Vergroessern hilft kaum: ein Panorama mit 2,43:1
   muesste auf das Vierfache, um die Seite zu fuellen, und waere dann seitlich
   so beschnitten, dass vom Netz ueber der Ortschaft nichts uebrig bleibt.
   Fest am unteren Fensterrand liegt es dagegen wie ein Horizont immer im
   Blick, und der Inhalt zieht darueber hinweg. */
.bodenbild--fest { position: fixed; }
/* Ganzes Bild durchscheinend, damit das Netzwerk-Canvas dahinter sichtbar
   bleibt und sich beides mischt. Hier ist `opacity` das richtige Mittel —
   anders als beim reinen Abdunkeln, wo es das Bild nur fahl machen wuerde:
   Gewollt ist ja gerade das Durchscheinen des Hintergrunds.
   Zwei getrennte Stellschrauben, bewusst nicht in einer verrechnet:
   `opacity` regelt, WIEVIEL vom Netzwerk dahinter durchkommt,
   `brightness` regelt, wie hell das Bild selbst ist. Beides ueber die
   Deckkraft zu machen wuerde das Bild nur blasser statt dunkler. */
/* Doppelte Klasse mit Absicht: Die allgemeine Regel `.bodenbild img` steht
   SPAETER in dieser Datei und setzt ebenfalls `filter` (fuers Impressum-Bild).
   Bei gleicher Gewichtung gewinnt die spaetere — dadurch liefen mehrere
   Abdunklungs-Schritte hier ins Leere, ohne dass es auffiel. Mit der
   doppelten Klasse gewinnt diese Regel unabhaengig von der Reihenfolge. */
.bodenbild.bodenbild--fest img { opacity: .30; filter: brightness(.55); }
/* Hinweis fuer kuenftige Bildwechsel: Ob die Maske gebraucht wird, haengt an
   der Datei. Bringt sie einen Alphakanal mit (gestalteter Verlauf), muss die
   Maske hier abgeschaltet werden — sonst blendet es doppelt aus:
     .bodenbild--fest img { -webkit-mask-image: none; mask-image: none; }
   Das aktuelle Bild ist reines RGB ohne Alphakanal, deshalb bleibt die Maske
   aus der Grundregel aktiv und erzeugt den Verlauf. */
.bodenbild img {
  display: block; width: 100%; height: auto;   /* Hoehe folgt dem Bild, kein Beschnitt */
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 46%);
          mask-image: linear-gradient(to bottom, transparent 0%, #000 46%);
  /* Etwas dunkler. Bewusst `brightness` und NICHT `opacity`: Deckkraft wuerde
     das Bild mit dem Netzwerk-Canvas dahinter verrechnen — es wuerde fahler
     statt dunkler. Stellschraube: kleiner = dunkler. */
  filter: brightness(.85);
}

/* ---------- Raumbild (Datenschutzseite) ----------
   Anders als das Bodenbild oben: kein Band am unteren Rand, sondern ein
   flaechiges Motiv hinter der ganzen Seite.
   Diese Regel FEHLTE in dieser Fassung (Micha 30.07.: „der Preview-
   Datenschutzseite fehlt das HG-Bild"). Das `<div class="raumbild">` steht im
   Markup, nur die Regel dazu ging beim Herausloesen der Landingpage-Teile
   verloren — ohne sie bleibt das div leer und die Seite unbebildert. Zweiter
   Fall derselben Machart am selben Tag, s. `.feld-tab--bild > span` weiter oben.
   1:1 aus ../style.css uebernommen (Zwillingsdatei, synchron halten). */
.raumbild {
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  background: url(assets/datenschutz-hg.webp) center center / cover no-repeat;
  /* Etwas dunkler — gleiche Machart wie beim Bodenbild des Impressums.
     Stellschraube: kleiner = dunkler. */
  filter: brightness(.85);
}
/* Der Boden im unteren Bilddrittel ist deutlich heller als der Rest
   (gemessen: Mitte oben 0, unten Median 66 mit Spitzen bis 90) — genau dort
   laufen die Textkaesten durch. Ein Schleier von unten nimmt die Spitzen,
   ohne die Schraenke oben zu daempfen. */
.raumbild::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to bottom, rgba(8,15,28,0) 45%, rgba(8,15,28,.55) 100%);
}

/* Footer behaelt die normale Hoehe der Startseite (114px, Polster 40/40).
   Das zusaetzliche Bodenpolster der Vorfassung schob die Zeile hoch und liess
   darunter ein grosses leeres Bildstueck stehen.
   Der Schleier laeuft nur nach OBEN aus (keine Kante zur Sektion darueber)
   und bleibt zur Unterkante hin dunkel — dort steht die Schrift, und
   gemessen lagen die Helligkeitsspitzen des Bildes dahinter bei 148 bis 241
   bei einer Schriftfarbe von 141. Ohne ruhigen Grund ist das nicht lesbar. */
.site-footer.site-footer--bild {
  /* Polster verschoben, Summe bleibt gleich der Grundregel -> das Band ist
     genauso hoch wie auf den uebrigen Seiten, die Zeile sitzt nur 8px tiefer. */
  padding-top: 38px;
  padding-bottom: 22px;
  /* Schleier blendet frueher ein (14 % statt 30 %): vorher begann der sichtbare
     dunkle Balken erst auf Hoehe der Schrift, dadurch wirkte sie an dessen
     Oberkante angeschlagen statt mittig — obwohl sie geometrisch exakt
     zentriert war (40px Luft oben wie unten, gemessen). */
  background: linear-gradient(to bottom,
      rgba(8,15,28,0)   0%,
      rgba(8,15,28,.70) 14%,
      rgba(8,15,28,.74) 100%);
}
/* HIER STAND ein Sonderfall fuer Seiten mit Seitenbild (kraeftigerer Schleier
   ueber `.seitenbild ~ .site-footer`). Wieder entfernt: Er kurierte ein
   Symptom meiner Fehldiagnose. Die Ursache war nicht der Schleier, sondern
   ein fehlender Halt des Fusses bei kurzem Inhalt — behoben im Grundgeruest
   (body als Spalte + `margin-top:auto` am Fuss), damit fuer JEDE Seite gleich.
   Michas Vorgabe 29.07.: „nicht ueberall ein neues Pflaster draufkleben, nicht
   bei jeder Seite das Rad neu erfinden." */

/* Spalte breiter und OBEN ausgerichtet (Micha 29.07.: „kann hoeher, groesser") —
   vorher stand die Bildspalte mittig zum Text und begann dadurch erst auf
   halber Hoehe. */
.profil-grid { display: grid; grid-template-columns: 300px 1fr; gap: 56px; align-items: start; }
/* Logo oben, Portraet darunter (Michas Vorgabe: Logo bleibt, darueber). */
/* `margin-top` setzt die Bildspalte tiefer an als die Textspalte (Micha 29.07.:
   „Logo tiefer"). Ueber `align-items: start` am Raster beginnen beide Spalten
   sonst exakt auf einer Linie. */
.profil-visual { display: flex; flex-direction: column; align-items: center; gap: 46px; margin-top: 64px; }
/* Rahmen und Rundung wie am Kopf-Logo (.brand-logo, Zeile ~148) — das Logo ist
   CI und muss ueberall gleich aussehen. Weil es hier groesser ist, sind die
   Werte MITSKALIERT statt uebernommen: Radius 24/118 = 20,3 % der Breite, also
   39 px bei 190 px; Rand 3 px * 190/118 = 5 px. Gleiche absolute Zahlen haetten
   das Logo hier eckiger und duenner umrandet wirken lassen.
   Bei einer Groessenaenderung beide Werte mitrechnen (oder auf `border-radius:
   20.3%` umstellen, dann skaliert die Rundung von selbst).
   Die SVG bringt zusaetzlich eine eigene Rundung mit (rx=110 auf 1400 = 8 %);
   die CSS-Rundung liegt darueber und beschneidet sie. */
.profil-logo {
  width: 190px; height: auto;
  border-radius: 39px; border: 5px solid var(--grey);
  box-shadow: 0 12px 30px rgba(8,15,28,.30);
}
/* Ohne Rahmen und Schatten (Micha 29.07.): Das Portraet ist oval freigestellt
   und transparent — ein rechteckiger Rand samt Schatten laege sichtbar daneben
   statt am Bild. */
.profil-portrait { width: 300px; height: auto; }
.profil-copy p { margin-top: 16px; color: #b7c6d5; max-width: 60ch; }

.contact { max-width: 640px; margin-inline: auto; }
.contact .section-title { max-width: none; }
.contact-lead { font-size: 18px; color: var(--tx-dim2); margin: 14px auto 30px; }

/* Ursprung 11: background: radial-gradient(circle at 1px 1px, rgba(148,163,184,.08) 1px, transparent 0), #0b1220; background-size: 34px 34px, auto; */
/* Ursprung 11: padding: 40px 0 (Bandhoehe 114px). Schmaler auf Wunsch —
   gilt fuer ALLE Seiten, deshalb hier in der Grundregel und nicht nur im
   Impressum. */
/* `margin-top: auto` schiebt den Fuss an den unteren Rand, wenn der Inhalt
   das Fenster nicht fuellt (Gegenstueck zur Flex-Spalte am body). Bei langem
   Inhalt bleibt er wie bisher direkt unter dem Inhalt. */
.site-footer { background: transparent; color: var(--tx-dim2); padding: 30px 0; margin-top: auto; }
.footer-inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 18px; }
.footer-brand { display: inline-flex; align-items: center; gap: 12px; font-weight: 600; color: var(--tx); font-size: 15px; }
.footer-brand img { width: 34px; height: 34px; }
.footer-links { display: flex; gap: 24px; }
.footer-links a { font-size: 14.5px; color: var(--tx-dim); transition: color .18s ease; }
.footer-links a:hover { color: var(--green-h); }
/* Verweis auf die Seite, auf der man schon steht: bleibt sichtbar, ist aber
   kein Link mehr. Ein Link, der nur neu laedt, ist eine Sackgasse — und im
   Markup steht dafuer jetzt ein <span>, nicht ein <a> ohne Ziel. */
.footer-links .footer-aktuell { font-size: 14.5px; color: var(--tx-dim); opacity: .55; cursor: default; }
.footer-copy { font-size: 13.5px; color: #7e8fa0; font-family: var(--font-mono); font-weight: 500; }

.reveal { opacity: 0; transform: translateY(20px); transition: opacity .6s ease, transform .6s ease; }
.reveal.in { opacity: 1; transform: none; }
.cards .card.reveal:nth-child(2) { transition-delay: .08s; }
.cards .card.reveal:nth-child(3) { transition-delay: .16s; }

/* ---------- Responsive ---------- */
@media (max-width: 1000px) {
  .mh-nav { margin-right: 0; }
  .mh-swoosh { padding-right: 0; }
  .mh-hero { grid-template-columns: 1fr; gap: 40px; }
  /* Diagramm über den Text statt daneben — nebeneinander wird die Systemkarte
     zu schmal, um ihre Beschriftung noch lesbar zu halten. */
  .nachweis { grid-template-columns: 1fr; gap: 26px; }
  .imp-block { grid-template-columns: 38px 1fr; gap: 0 14px; padding: 22px 20px; }
  .imp-paar { grid-template-columns: 1fr; }
  .paket-zusatz { grid-template-columns: 1fr; }
}
@media (max-width: 760px) {
  .mh-head { flex-wrap: wrap; gap: 18px; }
  .brand-logo { width: 92px; height: 92px; }
  .swoosh-img { margin-left: 0; width: 100%; height: 40px; }
  .cards { grid-template-columns: 1fr; max-width: 460px; margin-inline: auto; }
  .pakete { grid-template-columns: 1fr; max-width: 460px; margin-inline: auto; }
  .feld-reiter { grid-template-columns: 1fr; max-width: 460px; margin-inline: auto; }
  .feld-panel { max-width: 460px; margin-inline: auto; padding: 26px 22px; }
  .handel, .nachweis, .erstgespraech { max-width: 460px; margin-inline: auto; }
  .profil-grid { grid-template-columns: 1fr; gap: 28px; text-align: center; }
  .profil-visual { order: -1; }
  .section-light .section-title, .profil-copy p { max-width: none; margin-inline: auto; }
}
@media (max-width: 560px) {
  .mh-nav a:not(.nav-cta) { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { transition: none !important; animation: none !important; }
  .reveal { opacity: 1; transform: none; }
}



/* =====================================================================
   KACHELMENUES
   Ein Menue je Kachel, geoeffnet vom Burger oben links. Vorlage: Michas
   Schnipsel (Selcuk Cura) — Flaeche zieht von oben auf, Eintraege fahren
   gestaffelt von unten herein, unten zwei Eckwinkel. Farben an die Seite
   angepasst: die Vorlage ist hell, hier steht alles auf dunklem Grund.
   Gehoert zum gleichnamigen Block in index.html und script.js.
   ===================================================================== */
/* Bezugsrahmen der Menues. MUSS stehen bleiben: ohne diese Zeile beziehen sich
   `left`/`width` unten auf einen anderen Vorfahren, und die Menues sitzen
   versetzt und zu breit — am 29.07. genau so passiert, als die Zeile mit einem
   entfernten Testblock verschwand (gemessen: 111 px zu breit). */
.feld-reiter--bild { position: relative; }

      
/* Die beiden Eckwinkel unten aus der Vorlage, hier in der Kachelfarbe. */
.stufenmenu-bg::before,


.stufenmenu-inhalt a:hover,
.stufenmenu-inhalt a:hover::after,

.stufenmenu-inhalt a:hover .menu-ueber,
/* KACHELMENUES — ENDE */

/* =====================================================================
   KONTAKTFORMULAR
   ---------------------------------------------------------------------
   Funktion und Aufbau folgen der GameZone (`vhc/impressum-vhc.php`), die
   OPTIK kommt aus dieser Seite: Kasten wie die Rechtsseiten-Bloecke
   (`.imp-block` — dunkler Grund, gruene linke Kante, gleicher Radius),
   Beschriftungen in der Kicker-Schrift, Knoepfe die vorhandenen `.btn`.
   Bewusst keine eigene Farbwelt: das Fenster soll wie ein Teil der Seite
   wirken, nicht wie ein aufgesetztes Fremdteil.
   Zugehoeriges Markup in index.html, Bedienung in script.js.
   ===================================================================== */
/* Die Flaeche ueber der Seite. `hidden` am Element schaltet es aus — der
   Standardwert dafuer ist `display:none`, den `display:flex` sonst
   ueberschreiben wuerde, deshalb der ausdrueckliche Riegel unten. */
.kf-overlay {
  position: fixed; inset: 0; z-index: 50;
  display: flex; align-items: center; justify-content: center;
  padding: clamp(16px, 4vw, 48px);
  background: rgba(4, 8, 16, .74);
  /* Weichzeichner nur, wo er unterstuetzt wird — er trennt das Fenster vom
     bewegten Netzwerk-Hintergrund, ohne ihn ganz zu verdecken. */
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  overflow-y: auto;
}
.kf-overlay[hidden] { display: none; }

.kf-box {
  position: relative;
  width: 100%; max-width: 680px;
  padding: clamp(26px, 4vw, 38px) clamp(22px, 4vw, 40px);
  border: 1px solid rgba(148,163,184,.18);
  border-left: 2px solid rgba(34,197,94,.45);
  border-radius: 14px;
  /* Deckender als die Rechtsseiten-Kaesten (.70): dort liegt Flaeche auf
     ruhigem Grund, hier steht Text auf dem animierten Canvas — bei .70 wandern
     die Knotenpunkte sichtbar durch die Eingabefelder. */
  background:
    linear-gradient(to right, rgba(34,197,94,.10), rgba(34,197,94,0) 220px),
    rgba(8,15,28,.94);
  box-shadow: 0 30px 70px rgba(0,0,0,.55);
}

/* Schliesser: das X entsteht aus zwei gedrehten Strichen statt aus einem
   Schriftzeichen — ein getipptes × sitzt je nach Schrift unterschiedlich
   hoch und laesst sich nicht sauber zentrieren. */
.kf-schliessen {
  position: absolute; top: 14px; right: 14px;
  width: 34px; height: 34px; padding: 0;
  background: transparent; cursor: pointer;
  border: 1px solid rgba(154,165,182,.30); border-radius: 999px;
  transition: border-color .18s ease, background .18s ease, transform .18s ease;
}
.kf-schliessen::before, .kf-schliessen::after {
  content: ""; position: absolute; left: 50%; top: 50%;
  width: 13px; height: 1.5px; margin: -1px 0 0 -6.5px;
  background: var(--tx-dim);
  transition: background .18s ease;
}
.kf-schliessen::before { transform: rotate(45deg); }
.kf-schliessen::after  { transform: rotate(-45deg); }
.kf-schliessen:hover, .kf-schliessen:focus-visible {
  border-color: var(--green); background: rgba(34,197,94,.10);
}
.kf-schliessen:hover::before, .kf-schliessen:hover::after,
.kf-schliessen:focus-visible::before, .kf-schliessen:focus-visible::after { background: var(--green-h); }

.kf-kicker {
  font-family: var(--font-mono); font-size: 13px; font-weight: 700;
  letter-spacing: .15em; text-transform: uppercase; color: var(--green-h);
  margin-bottom: 10px; padding-right: 40px;
}
.kf-titel {
  font-family: var(--font-head); font-weight: 700;
  font-size: clamp(24px, 3vw, 31px); color: #fff; letter-spacing: .01em;
}
.kf-sub { margin-top: 12px; color: var(--tx-dim2); font-size: 16px; }
.kf-sub a { color: var(--green-h); border-bottom: 1px solid rgba(34,197,94,.4); }
.kf-sub a:hover { color: var(--green); border-bottom-color: var(--green); }

.kf-form { margin-top: 26px; display: flex; flex-direction: column; gap: 16px; }
/* Honigtopf — fuer Menschen unsichtbar, fuer Programme ein Feld wie jedes
   andere. Bewusst NICHT `display:none`: Manche Programme erkennen das und
   lassen das Feld dann leer. Stattdessen aus dem Bild geschoben, ohne Hoehe,
   ohne Platzbedarf. */
.kf-honig {
  position: absolute; left: -9999px; top: auto;
  width: 1px; height: 1px; overflow: hidden;
}
/* Name und E-Mail nebeneinander wie in der Vorlage; die Mindestbreite haelt
   sie auf schmalen Fenstern davon ab, zu Spalten von Buchstabenbreite zu
   schrumpfen — dann bricht die Reihe um. */
.kf-reihe { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }
.kf-feld { display: block; }
.kf-label {
  display: block; margin-bottom: 7px;
  font-family: var(--font-mono); font-size: 12.5px; font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase; color: var(--tx-dim);
}
/* Der Stern in der Farbe des Akzents, aber ohne Kursivschnitt: `em` ist hier
   die semantisch richtige Auszeichnung, die Schraeglage passt aber nicht zur
   Beschriftung. */
.kf-label em { color: var(--green-h); font-style: normal; }

.kf-form input, .kf-form textarea {
  width: 100%;
  padding: 12px 14px;
  font-family: var(--font-sans); font-size: 16px; color: var(--tx);
  background: rgba(8,15,28,.72);
  border: 1px solid rgba(154,165,182,.26); border-radius: 10px;
  transition: border-color .18s ease, background .18s ease, box-shadow .18s ease;
}
.kf-form textarea { resize: vertical; min-height: 120px; line-height: 1.55; }
.kf-form input::placeholder, .kf-form textarea::placeholder { color: #64748b; }
.kf-form input:focus, .kf-form textarea:focus {
  outline: none;
  border-color: var(--green);
  background: rgba(8,15,28,.9);
  box-shadow: 0 0 0 3px rgba(34,197,94,.16);
}

/* Rechenaufgabe und Absenden stehen in einer Zeile, solange Platz ist —
   `space-between` haelt den Knopf rechts. Bei Enge fallen sie untereinander,
   dann nimmt der Knopf die volle Breite. */
.kf-fuss {
  display: flex; flex-wrap: wrap; align-items: flex-end;
  justify-content: space-between; gap: 18px; margin-top: 4px;
}
.kf-rechen { flex: 0 1 auto; }
.kf-rechen-reihe { display: flex; align-items: center; gap: 12px; }
/* Feste Masse: das Canvas wird in Bildpunkten gezeichnet, eine gedehnte
   Darstellung wuerde die Zahlen unscharf machen. */
.kf-canvas {
  width: 150px; height: 46px; flex: none;
  border: 1px solid rgba(154,165,182,.26); border-radius: 10px;
  background: rgba(8,15,28,.72);
}
.kf-rechen-reihe input { width: 90px; text-align: center; }
.kf-senden { flex: 0 0 auto; }
.kf-pflicht { margin-top: 2px; font-size: 13.5px; color: var(--tx-dim); }
.kf-pflicht em { color: var(--green-h); font-style: normal; }

/* Rueckmeldungen. Beide Kaesten liegen im Markup erst vor, wenn der
   Serverteil sie setzt — die Gestaltung steht hier schon fest, damit die
   Optik nicht spaeter nebenher entsteht. */
.kf-meldung {
  margin-top: 18px; padding: 14px 16px; border-radius: 12px;
  font-size: 15.5px; line-height: 1.5;
}
.kf-meldung--fehler {
  border: 1px solid rgba(248,113,113,.42); background: rgba(248,113,113,.10); color: #fecaca;
}
.kf-meldung--erfolg {
  border: 1px solid rgba(34,197,94,.42); background: rgba(34,197,94,.10); color: var(--green-h);
}
.kf-meldung ul { margin: 6px 0 0; padding-left: 18px; }

/* Die beiden Kontaktwege in der Kontakt-Sektion nebeneinander. Der Abschnitt
   ist zentriert (`text-align:center`), deshalb hier `justify-content:center`
   statt einer eigenen Ausrichtung. `align-items:center` haelt die beiden
   Bildknoepfe auf einer Mittellinie — sie sind gleich hoch, aber
   unterschiedlich breit. */
/* gap 12px statt 18px: bei 18px messen beide Knoepfe zusammen 557px und
   sprengen die 552px der Spalte um 5px — sie faellen dann untereinander. */
/* `stretch` statt `center`: Die beiden Knoepfe haben unterschiedlich starke
   Raender (gefuellt gegen umrandet) und kamen dadurch auf 59 bzw. 60 Pixel.
   Gedehnt sind sie zwangslaeufig exakt gleich hoch — verlaesslicher, als die
   Innenabstaende gegeneinander auszurechnen. Beim Umbruch auf schmalen
   Schirmen bleibt es wirkungslos, weil dann jeder Knopf allein in seiner
   Zeile steht. */
.kontakt-wege { display: flex; flex-wrap: wrap; justify-content: center; align-items: stretch; gap: 12px; }

/* Bildknopf: das Bild IST der Knopf. Der Button selbst bleibt deshalb ohne
   eigene Flaeche — Rahmen, Farbe und Form stecken in der Grafik. Wichtig
   trotzdem ein echtes <button>: ein Bild allein ist nicht bedienbar (Tastatur,
   Vorleseprogramme), und der Alternativtext des Bildes traegt die Beschriftung. */
.bildknopf {
  padding: 0; border: 0; background: none; cursor: pointer; line-height: 0;
  border-radius: 10px;
  transition: transform .18s ease, filter .18s ease;
}
/* Die Grafiken sind bereits auf die gemeinsame Hoehe 62px gebracht (siehe
   Kommentar im Markup), werden hier also 1:1 dargestellt — keine Skalierung
   im Browser, dadurch bleiben die feinen Metallkanten scharf.
   Platzrechnung, gemessen: Die Kontaktspalte traegt BEIDE Klassen `.wrap` und
   `.contact`; von den 640px bleiben nach dem Innenpolster (2x44px) nur 552px.
   In voller Groesse (62px) messen beide zusammen 551px — das passte zwar,
   liess aber nur EINEN Pixel Reserve; schon geringfuegiger Zoom haette sie
   umbrechen lassen. Bei 56px sind es 498px inklusive Abstand, also gut 50px
   Luft. Die Grafiken werden dadurch leicht verkleinert dargestellt (56 von
   62), nicht vergroessert — die Schaerfe bleibt. */
.bildknopf img { display: block; height: 56px; width: auto; }
.bildknopf:hover { transform: translateY(-2px); filter: brightness(1.08) drop-shadow(0 8px 18px rgba(34,197,94,.30)); }
.bildknopf:focus-visible { outline: 2px solid var(--green); outline-offset: 4px; }

/* Rueckmeldung nach dem Kopieren. Sie belegt ihren Platz dauerhaft (nur die
   Sichtbarkeit wechselt), sonst wuerde der Abschnitt bei jedem Klick um eine
   Zeilenhoehe springen. */
.kopier-hinweis {
  min-height: 24px; margin-top: 12px;
  font-family: var(--font-mono); font-size: 14px; letter-spacing: .04em;
  color: var(--green-h);
  opacity: 0; transition: opacity .2s ease;
}
.kopier-hinweis.sichtbar { opacity: 1; }
/* Fassung fuer die Adresszeilen im Impressum: steht NEBEN der Adresse und
   belegt keinen eigenen Platz. Als eigene Zeile hielt sie dort dauerhaft
   ~31px frei und verschob dadurch den ganzen Kontaktblock. */
.kopier-hinweis--inline {
  display: inline; min-height: 0; margin: 0 0 0 12px;
  font-size: 13px; white-space: nowrap;
}
/* Scheitert das Kopieren (aeltere Browser ohne Zwischenablage-Zugriff), wird
   die Zeile zur Notloesung: sie zeigt die Adresse zum Abschreiben, dann aber
   in normaler Textfarbe statt im Bestaetigungsgruen. */
.kopier-hinweis.fehlschlag { color: var(--tx-dim2); }

@media (max-width: 560px) {
  /* Auf dem Telefon fuellt das Fenster den Schirm bis auf einen Rand; ein
     zentrierter Kasten mit viel Luft daneben verschenkt dort Platz. */
  .kf-overlay { padding: 12px; align-items: flex-start; }
  .kf-box { padding: 24px 18px; }
  .kf-fuss { align-items: stretch; }
  .kf-senden { width: 100%; }
  /* Auf dem Telefon stehen die Bildknoepfe ohnehin untereinander (flex-wrap);
     kleiner gesetzt bleiben beide vollstaendig sichtbar, statt bis an den
     Rand zu laufen. */
  .bildknopf img { height: 64px; }
}
@media (prefers-reduced-motion: reduce) {
  .kf-schliessen, .kf-form input, .kf-form textarea { transition: none; }
}
/* KONTAKTFORMULAR — ENDE */
