/* ==========================================================================
   DIE SCHRIFT — der Grund, warum die Seite vorher nach niemandem aussah
   ==========================================================================
   Hier stand: ui-sans-serif, "Segoe UI Variable Display", system-ui. Also der
   Systemzeichensatz. Eine Seite ohne eigene Schrift hat typografisch KEINE
   Identitaet — und das ist der Hauptgrund, warum generierte Entwuerfe
   austauschbar wirken. Jede Marke, die man wiedererkennt, erkennt man zuerst
   an der Schrift.

   ARCHIVO, und zwar aus zwei Gruenden: Sie stammt aus der Tradition
   amerikanischer Industrie- und Beschilderungsschriften — schmal, kraeftig,
   werkstattnah. Und sie ist NICHT Inter und nicht Space Grotesk, die beiden
   Schriften, die auf jedem generierten Entwurf stehen.

   SELBST GEHOSTET, nicht ueber die Google-CDN eingebunden. Das ist hier kein
   Geschmack: Wer Schriften von fonts.gstatic.com laedt, uebermittelt die
   IP-Adresse jedes Besuchers an Google — deutsche Gerichte haben das mehrfach
   als DSGVO-Verstoss gewertet. Vier Schnitte, zusammen 58 KB.

   font-display: swap — der Text steht sofort da, notfalls in der Systemschrift.
   Ein leerer Bildschirm, bis eine Schrift geladen ist, kostet mehr Besucher als
   jede Schriftwahl gewinnt. */
@font-face {
  font-family: "Archivo"; font-style: normal; font-weight: 400;
  font-display: swap; src: url("/web/schrift/archivo-400.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo"; font-style: normal; font-weight: 500;
  font-display: swap; src: url("/web/schrift/archivo-500.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo"; font-style: normal; font-weight: 600;
  font-display: swap; src: url("/web/schrift/archivo-600.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo"; font-style: normal; font-weight: 800;
  font-display: swap; src: url("/web/schrift/archivo-800.woff2") format("woff2");
}

/* =====================================================================
   Handwerk Champion — die öffentliche Seite
   =====================================================================

   WAS AN DEN ERSTEN ZWEI ENTWÜRFEN FALSCH WAR

   Rückmeldung, wörtlich: „Es sieht alles nach irgendwelchen Boxen aus. Das
   ist wenig emotional. Es fehlen Effekte, es fehlt Freshness, es gibt keine
   Emotionen, kein Leben."

   Das stimmte. Ich hatte auf Zurückhaltung gesetzt — Haarlinien, keine
   Verläufe, keine Bewegung, alles rechteckig — und das Strenge genannt.
   Herausgekommen ist ein Dokument: Rechtecke mit Rahmen, überall gleich
   gepolstert, ohne Rhythmus, ohne Tiefe, ohne einen einzigen Moment, an dem
   etwas passiert.

   DIESE FASSUNG IST WARM UND SIE BEWEGT SICH.

     * Weiche große Radien statt scharfer Kanten. Ein Werkzeug, das auf
       deiner Seite steht, hat keine Ecken.
     * Warmes Licht: cremiger Grund, bräunliches Schwarz, Schatten mit
       warmem Ton. Kühles Grau wirkt wie eine Behörde.
     * EINE kräftige Farbe, die Flamme, und sie steht nur dort, wo gehandelt
       wird. Daneben ein tiefes Moosgrün ausschließlich für „erledigt".
     * Großer Sprung in der Schriftgröße. Wo alles gleich groß ist, ist
       nichts wichtig.
     * Bewegung beim Scrollen, und im Aufmacher führt sich das Produkt
       selbst vor. Das war der eigentliche Fehler der ersten Fassung: Sie
       hat den Vorgang ABGEBILDET statt ihn zu zeigen.

   Alles Bewegte hält sich an prefers-reduced-motion — wer das eingestellt
   hat, sieht die fertige Seite ohne einen einzigen Übergang.
   ===================================================================== */

:root {
  --grund:        #FDFCFB;
  --sand:         #F4F2EF;
  --sand-2:       #EAE6E1;
  --weiss:        #FFFFFF;

  --tinte:        #1F1D1B;
  --tinte-weich:  #423D38;
  --gedaempft:    #6F6862;
  --gedaempft-d:  #C3B3A3;

  --flamme:       #E04A0C;
  --flamme-hell:  #F26A2E;
  --flamme-blass: #FDEEE4;
  --moos:         #2E6047;
  --moos-blass:   #E7F0EA;

  --linie:        #E9E5E0;
  --linie-stark:  #D5CFC8;
  /* Die Hoehe der Kopfleiste. Sie steht hier, weil zwei Regeln sie brauchen:
     `.kopf-inhalt` als Mindesthoehe und der negative Abstand, mit dem der Kopf
     auf der Buehne aus dem Fluss genommen wird. Zwei getippte 76 waeren zwei
     Stellen, von denen die zweite beim naechsten Mal vergessen wird. */
  --kopf-hoehe:   76px;
  /* DER RAND EINES EINGABEFELDES IST EIN BEDIENELEMENT, kein Zierstrich — er
     braucht 3:1 gegen den Grund daneben (WCAG 1.4.11, Nicht-Text-Kontrast).
     Gemessen: `--linie-stark` erreicht auf Weiss 1,55. Das ist der Grund, aus
     dem die Felder auf der Registrierseite unsichtbar waren, und es waere auch
     auf Weiss zu wenig gewesen.
     #908678 erreicht 3,58 auf Weiss und 3,20 auf Sand — auf BEIDEN Gruenden,
     damit die Sichtbarkeit nicht wieder davon abhaengt, wo das Formular steht. */
  --feldrand:     #908678;
  /* DASSELBE FUER DEN FEHLERTEXT. Die Flamme erreicht auf Weiss 4,07 und
     verfehlt die 4,5 fuer normale Schrift knapp — knapp daneben ist bei einer
     Fehlermeldung besonders teuer, weil sie gelesen werden MUSS. #C63F09
     erreicht 5,10 auf Weiss und 4,50 auf dem blassen Flammenton. */
  --flamme-tief:  #C63F09;
  --linie-d:      rgba(255, 252, 248, 0.16);

  --schatten-s:   0 2px 6px rgba(90, 55, 25, 0.05), 0 1px 2px rgba(90, 55, 25, 0.04);
  --schatten-m:   0 12px 28px -10px rgba(90, 55, 25, 0.16), 0 2px 6px rgba(90, 55, 25, 0.05);
  --schatten-l:   0 40px 70px -34px rgba(90, 55, 25, 0.38), 0 6px 18px rgba(90, 55, 25, 0.07);

  --rund:         18px;
  --rund-s:       10px;

  --breit:  1220px;
  --schmal: 700px;
  /* Die dritte Breite. 700px ist eine LESESPALTE — richtig fuer Fliesstext,
     viel zu schmal fuer eine Tabelle mit Betraegen rechts. 1220px ist die volle
     Bahn. Dazwischen fehlte etwas: 1040px, die uebliche Breite fuer Inhalt, der
     gelesen UND verglichen wird. */
  --mittel: 1040px;

  --schrift: "Archivo", ui-sans-serif, "Segoe UI", system-ui,
             -apple-system, "Helvetica Neue", Arial, sans-serif;
  --mono:    ui-monospace, "SF Mono", "Cascadia Mono", "Segoe UI Mono",
             "Roboto Mono", Menlo, Consolas, monospace;
}

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--grund);
  color: var(--tinte);
  font-family: var(--schrift);
  font-size: 18px;
  line-height: 1.68;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img { max-width: 100%; display: block; }

/* --- Typografie: großer Sprung ------------------------------------------
   Wo alles gleich groß ist, ist nichts wichtig. Die Überschrift ist
   deshalb wirklich groß und wirklich eng — und der Fließtext bleibt ruhig
   und weit, damit er sich lesen lässt. */

h1, h2, h3, h4 { margin: 0; font-weight: 800; letter-spacing: -0.03em; line-height: 1.04; text-wrap: balance; }
h1 { font-size: clamp(2.9rem, 6.4vw, 5rem); letter-spacing: -0.045em; }
h2 { font-size: clamp(2rem, 4.2vw, 3.2rem); letter-spacing: -0.038em; }
h3 { font-size: clamp(1.2rem, 2vw, 1.45rem); letter-spacing: -0.024em; }
p  { margin: 0 0 1.1rem; max-width: 62ch; }
a  { color: inherit; }
strong { font-weight: 700; color: var(--tinte); }

.marke {
  display: inline-flex; align-items: center; gap: 9px;
  background: var(--flamme-blass); color: var(--flamme);
  border-radius: 999px; padding: 7px 16px 7px 13px;
  font-size: 0.82rem; font-weight: 700; letter-spacing: 0.01em;
  margin: 0 0 20px;
}
.marke::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex: none; }
.marke.gruen { background: var(--moos-blass); color: var(--moos); }

.vorspann { font-size: clamp(1.12rem, 1.5vw, 1.3rem); line-height: 1.6; color: var(--tinte-weich); max-width: 56ch; }

/* --- Gerüst -------------------------------------------------------------- */

.bahn { width: 100%; max-width: var(--breit); margin: 0 auto; padding: 0 24px; }
/* GEMESSEN, NICHT GESCHAETZT: Bei 132px oben UND unten standen zwischen je
   zwei Abschnitten 264 Pixel. Auf der Preisseite mit ihren dreizehn Abschnitten
   waren das 3.432 Pixel reine Luft bei 13.111 Pixeln Seitenhoehe — ein Viertel
   der Seite. Wer scrollt, verliert dabei den Zusammenhang zwischen dem, was er
   gerade gelesen hat, und dem, was kommt. */
section { padding: clamp(40px, 3.2vw, 56px) 0; position: relative; }
/* AUF DEM SCHREIBTISCH ZAEHLT JEDE ZEILE, DIE MAN NICHT SCROLLEN MUSS.
   Am Handy ist Luft billig — dort steht ohnehin nur eine Spalte, und der Daumen
   scrollt schneller als das Auge liest. Am Monitor kostet sie: Wer die Preise
   vergleichen will, muss dafuer zurueckscrollen. */
@media (min-width: 900px) {
  section { padding: 44px 0; }
  h1 { line-height: 1.0; }
  /* Der Nachlauf des letzten Absatzes addiert sich auf den Innenabstand des
     Abschnitts — 19 Pixel, die niemand haben wollte und die man nur beim
     Nachmessen findet. */
  .bahn > *:last-child, .bahn > div > *:last-child { margin-bottom: 0; }
  /* DER AUFMACHER GEHT IN DIE ERSTE KARTE UEBER, statt vor ihr zu enden. Sein
     Schlusssatz lautet „Rechnen Sie zuerst nach, was das heute kostet" — und
     genau das steht darunter. Zwei volle Abstaende dazwischen trennen, was
     zusammengehoert. */
  section:first-of-type { padding-bottom: 20px; }
}
section.sand { background: var(--sand); border-radius: 40px; }
section.flamme-grund { background: var(--flamme-blass); border-radius: 40px; }
@media (max-width: 700px) { section.sand, section.flamme-grund { border-radius: 26px; } }

/* --- Knöpfe: rund, warm, mit Gewicht ------------------------------------- */

.knopf {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  min-height: 58px; padding: 0 30px;
  border: 0; border-radius: 999px;
  font: inherit; font-weight: 700; font-size: 1.03rem; letter-spacing: -0.012em;
  text-decoration: none; cursor: pointer; white-space: nowrap;
  transition: transform 0.18s cubic-bezier(.2,.8,.3,1), box-shadow 0.18s ease, background-color 0.18s ease;
}
.knopf-haupt { background: var(--flamme); color: #fff; box-shadow: 0 10px 22px -8px rgba(221, 85, 24, 0.55); }
.knopf-haupt:hover { background: var(--flamme-hell); transform: translateY(-2px); box-shadow: 0 16px 30px -10px rgba(221, 85, 24, 0.6); }
.knopf-rand { background: var(--weiss); color: var(--tinte); box-shadow: inset 0 0 0 1.5px var(--linie-stark), var(--schatten-s); }
.knopf-rand:hover { transform: translateY(-2px); box-shadow: inset 0 0 0 1.5px var(--tinte), var(--schatten-m); }
.knopf-klein { min-height: 46px; padding: 0 22px; font-size: 0.95rem; }
.knopf:active { transform: translateY(0); }

:focus-visible { outline: 3px solid var(--flamme); outline-offset: 3px; border-radius: 6px; }

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

.kopf {
  position: sticky; top: 0; z-index: 60;
  background: rgba(255, 252, 248, 0.86);
  backdrop-filter: saturate(180%) blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.kopf.gescrollt { border-bottom-color: var(--linie); box-shadow: 0 4px 20px -12px rgba(90,55,25,0.3); }
.kopf-inhalt { display: flex; align-items: center; gap: 26px; min-height: var(--kopf-hoehe); }

/* DIE WORTMARKE IST EIN BILD, DIE MASSE STEHEN DESHALB HIER (31.8.2026).
   Frueher standen hier ein 34-Pixel-Zeichen und ein Schriftzug daneben, deren
   Verhaeltnis zueinander gepflegt werden musste. Beide stecken jetzt in einer
   Datei; zu regeln bleibt nur, wie hoch sie im Kopf steht. */
.wortmarke {
  display: inline-flex; align-items: center; gap: 13px;
  font-weight: 800; font-size: 1.24rem; letter-spacing: -0.036em;
  text-decoration: none; margin-right: auto;
}
.wortmarke svg { display: block; flex: none; }
/* DIE WORTMARKE IST JETZT EIN BILD, KEIN ZEICHEN MIT TEXT DANEBEN (31.8.2026).
   `height: auto` ist hier kein Schoenheitsfehler, sondern noetig: Weiter oben
   steht `img { max-width: 100% }`. Ohne `height: auto` wuerde in einem sehr
   schmalen Fenster die Breite schrumpfen, die im HTML gesetzte Hoehe aber
   stehen bleiben — das Logo waere gestaucht. `flex: none` haelt es davor,
   im Kopf-Flexkasten zusammengedrueckt zu werden. */
.wortmarke img { display: block; flex: none; height: auto; }

/* SIE FUELLT JETZT 61 % DER KOPFHOEHE STATT 39 % (31.8.2026).
   Bei 30 px war das Zeichen darin KLEINER als die 34 px, die es vorher als
   eigenes Bild hatte — die Marke war beim Umstieg auf das Logo unbemerkt
   geschrumpft. Der Kopf ist 76 px hoch, die Knoepfe daneben sind 58 px: Bei
   46 px bleiben oben und unten je 15 px Luft, und das Logo steht auf etwa drei
   Vierteln der Knopfhoehe. Im Logo nimmt das Zeichen die volle Hoehe ein, der
   Schriftzug 52 % davon — aus 46 px werden also ein 46-px-Zeichen und ein
   24 px hoher Schriftzug, beides groesser als der alte Bestand.

   AM TELEFON MUSS SIE ZURUECK. Unter 1060 px klappt die Navigation zum
   Schalter, und im Kopf stehen nur noch Logo und Schalter. Gerechnet fuer ein
   320 Pixel schmales Fenster: 24 px Innenabstand je Seite lassen 272 px, davon
   gehen 26 px Abstand und 20 px Schalter ab. Bei 46 px waere das Logo 278 px
   breit und liefe um 52 px ueber; bei 36 px sind es 217 px und es bleiben
   29 px Luft. Der alte Bestand aus Zeichen und Text war mit 226 px genau am
   Anschlag — schmaler wird es hier also nicht, sondern weiter. */
.kopf .wortmarke img { height: 46px; width: auto; }
@media (max-width: 560px) { .kopf .wortmarke img { height: 36px; } }

.hauptnav { display: flex; align-items: center; gap: 4px; }
.hauptnav a {
  font-size: 0.97rem; font-weight: 600; text-decoration: none;
  color: var(--gedaempft); padding: 9px 14px; border-radius: 999px;
  transition: background-color 0.16s ease, color 0.16s ease;
}
.hauptnav a:hover, .hauptnav a[aria-current="page"] { color: var(--tinte); background: var(--sand); }
/* Der Knopf im Menü ist ein KNOPF und keine Verlinkung mit Hintergrundfarbe:
   In der ersten Fassung stand er ohne Innenabstand und ohne Rundung da und
   sah aus wie ein Fehler in der Darstellung. */
.hauptnav .knopf { margin-left: 12px; color: #fff; }
.hauptnav .knopf:hover { color: #fff; background: var(--flamme-hell); }

/* ANMELDEN: umrandet statt gefuellt.
   Zwei gefuellte Knoepfe nebeneinander konkurrieren, und der Besucher weiss
   nicht, welcher fuer ihn ist. Der Bestandskunde sucht ohnehin gezielt — er
   braucht Sichtbarkeit, keine Lautstaerke. */
.hauptnav .nav-anmelden {
  margin-left: 8px;
  color: var(--tinte);
  background: transparent;
  box-shadow: inset 0 0 0 1.5px var(--linie-stark);
}
.hauptnav .nav-anmelden:hover {
  color: var(--tinte);
  background: var(--sand);
  box-shadow: inset 0 0 0 1.5px var(--tinte-weich);
}

.nav-schalter {
  display: none; background: var(--weiss); border: 0; border-radius: 999px;
  width: 48px; height: 48px; cursor: pointer;
  box-shadow: inset 0 0 0 1.5px var(--linie-stark);
  align-items: center; justify-content: center;
}
@media (max-width: 1060px) {
  .hauptnav {
    display: none; position: absolute; top: calc(100% + 8px); left: 16px; right: 16px;
    flex-direction: column; align-items: stretch; gap: 2px;
    background: var(--weiss); border-radius: var(--rund);
    box-shadow: var(--schatten-l); padding: 14px;
  }
  .hauptnav.offen { display: flex; }
  .hauptnav a { padding: 14px 16px; }
  .hauptnav .knopf { margin: 10px 0 0; }
  .nav-schalter { display: inline-flex; }
}

/* --- Der Aufmacher -------------------------------------------------------
   Kürzer als vorher und ohne Sachfoto. Links steht, worum es geht; rechts
   FÜHRT SICH DAS PRODUKT VOR: Der Satz wird gesprochen, die Karte baut
   sich auf, der Knopf pulsiert. Vier Sekunden, und man hat verstanden,
   was diese Software tut — ohne einen erklärenden Satz zu lesen. */

.aufmacher { position: relative; overflow: hidden; padding: clamp(26px, 3.5vw, 52px) 0 clamp(52px, 6vw, 88px); }
/* Warmes Licht — kein Verlauf über die ganze Fläche, sondern ein Schein,
   wie von einer Lampe außerhalb des Bildes. */
.aufmacher::before {
  content: ""; position: absolute; z-index: 0;
  width: 900px; height: 900px; right: -180px; top: -420px;
  background: radial-gradient(circle, rgba(242,106,46,0.17) 0%, rgba(242,106,46,0) 62%);
  pointer-events: none;
}
.aufmacher::after {
  content: ""; position: absolute; z-index: 0;
  width: 700px; height: 700px; left: -300px; bottom: -400px;
  background: radial-gradient(circle, rgba(46,96,71,0.10) 0%, rgba(46,96,71,0) 64%);
  pointer-events: none;
}
.aufmacher .bahn { position: relative; z-index: 1; }

.aufmacher-raster {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr);
  gap: clamp(30px, 4vw, 58px); align-items: center;
}
@media (max-width: 1060px) { .aufmacher-raster { grid-template-columns: 1fr; gap: 40px; } }

.aufmacher h1 { max-width: 13ch; }
.aufmacher .vorspann { margin-top: 22px; }
.aufmacher-tat { display: flex; flex-wrap: wrap; gap: 13px; margin-top: 30px; }
.aufmacher-fuss { display: flex; flex-wrap: wrap; gap: 8px 22px; margin-top: 24px; font-size: 0.9rem; color: var(--gedaempft); }
.aufmacher-fuss span { display: inline-flex; align-items: center; gap: 8px; }
.aufmacher-fuss span::before {
  content: ""; width: 17px; height: 17px; flex: none; border-radius: 50%;
  background: var(--moos-blass) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2 L4.7 8.4 L9.5 3.6' fill='none' stroke='%232E6047' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/12px no-repeat;
}

/* --- Die Vorführung ------------------------------------------------------
   Das Herzstück. Oben ein Mikrofon, das „hört", darunter der Satz, der
   Wort für Wort erscheint, darunter die Karte, die sich Zeile für Zeile
   aufbaut. Zum Schluss pulsiert der Freigabe-Knopf.

   Beide Hälften sind ausdrücklich beschriftet („SIE SAGEN" / „DARAUS MACHT
   DIE SOFTWARE"), weil in der ersten Fassung niemand verstanden hat, dass
   die Karte eine Folge des Satzes ist. */

/* ==========================================================================
   DIE SCHLAGZAHLEN IM AUFMACHER
   ==========================================================================
   Hier stand die Vorfuehrung. Sie war am falschen Platz: Sie zeigt, WIE aus
   einem Satz eine Buchung wird — das ist die Erklaerung, nicht das Versprechen.
   Wer eine Verkaufsseite oeffnet, will zuerst wissen, was es ihm BRINGT.

   Die Zahlen sind gross, aber nicht laut: Ziffern in 800, Beschriftung klein
   und ruhig. Eine Zahl, die schreit, wird geglaubt wie eine Werbung — eine, die
   dasteht und ihre Herkunft danebenschreibt, wird nachgerechnet. Und genau das
   soll ein Handwerker tun. */
  /* Ziffern in gleicher Breite: Sonst tanzen die drei Zahlen
/* Die EINHEIT klein und in der Akzentfarbe: Sie gehoert zur Zahl, soll ihr aber
   nicht die Groesse wegnehmen. */

.vorfuehrung { position: relative; }
/* Unterhalb der Umkehr steht die Vorfuehrung fuer sich und nicht mehr in einer
   Rasterspalte — begrenzt, damit die Karte nicht ueber die ganze Bahn laeuft. */
.vorfuehrung-breit { max-width: 560px; margin: 40px auto 0; }
.vf-fenster { background: var(--weiss); border-radius: var(--rund); box-shadow: var(--schatten-l); overflow: hidden; }
.vf-oben { padding: 20px 24px 22px; background: var(--sand); }
.vf-label { display: block; font-size: 0.72rem; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gedaempft); margin-bottom: 13px; }
.vf-hoeren { display: flex; align-items: center; gap: 14px; }
.vf-mikro { width: 42px; height: 42px; border-radius: 50%; flex: none; background: var(--flamme); display: grid; place-items: center; }
.vf-laeuft .vf-mikro { animation: puls 1.8s ease-out infinite; }
@keyframes puls {
  0%   { box-shadow: 0 0 0 0 rgba(221, 85, 24, 0.45); }
  70%  { box-shadow: 0 0 0 16px rgba(221, 85, 24, 0); }
  100% { box-shadow: 0 0 0 0 rgba(221, 85, 24, 0); }
}
/* Fünf Balken, die sich unabhängig bewegen. Ein gleichmäßig schwingender
   Balken sieht aus wie ein Ladebalken. */
.vf-wellen { display: flex; align-items: center; gap: 4px; height: 26px; }
.vf-wellen i { width: 3px; border-radius: 2px; background: var(--flamme); height: 6px; opacity: 0.55; }
.vf-laeuft .vf-wellen i { animation: welle 1.1s ease-in-out infinite; }
.vf-wellen i:nth-child(2) { animation-delay: 0.14s; }
.vf-wellen i:nth-child(3) { animation-delay: 0.29s; }
.vf-wellen i:nth-child(4) { animation-delay: 0.08s; }
.vf-wellen i:nth-child(5) { animation-delay: 0.22s; }
@keyframes welle { 0%,100% { height: 6px; opacity: .5; } 50% { height: 22px; opacity: 1; } }

.vf-satz { margin: 15px 0 0; font-size: 1.13rem; font-weight: 650; line-height: 1.5; letter-spacing: -0.02em; color: var(--tinte); min-height: 4.5em; }
.vf-cursor { display: inline-block; width: 2px; height: 1.05em; background: var(--flamme); vertical-align: -0.14em; margin-left: 2px; animation: blinken 1s steps(2) infinite; }
@keyframes blinken { 0%, 50% { opacity: 1; } 50.01%, 100% { opacity: 0; } }

.vf-unten { padding: 20px 24px 24px; }
.vf-karte-titel {
  font-size: 1.08rem; font-weight: 750; letter-spacing: -0.022em; margin: 10px 0 4px;
  opacity: 0; transform: translateY(8px);
  transition: opacity .4s ease, transform .4s cubic-bezier(.2,.8,.3,1);
}
.vf-zeile {
  display: grid; grid-template-columns: 94px minmax(0, 1fr); gap: 14px;
  padding: 11px 0; border-top: 1px solid var(--linie); align-items: start;
  opacity: 0; transform: translateY(10px);
  transition: opacity .42s ease, transform .42s cubic-bezier(.2,.8,.3,1);
}
.vf-zeile dt { font-size: 0.74rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--gedaempft); padding-top: 3px; }
.vf-zeile dd { margin: 0; font-size: 0.97rem; font-weight: 550; }
.vf-zeile .gruen { color: var(--moos); font-weight: 700; }
.vf-sichtbar { opacity: 1 !important; transform: translateY(0) !important; }

.vf-tat { display: flex; gap: 10px; margin-top: 18px; opacity: 0; transform: translateY(10px); transition: opacity .4s ease, transform .4s cubic-bezier(.2,.8,.3,1); }
.vf-tat .knopf { flex: 1; min-height: 50px; font-size: 0.98rem; }
.vf-tat .ablehnen { background: var(--weiss); color: var(--gedaempft); box-shadow: inset 0 0 0 1.5px var(--linie-stark); }
.vf-bereit .vf-tat .knopf-haupt { animation: knopfpuls 2s ease-in-out infinite; }
@keyframes knopfpuls {
  0%, 100% { box-shadow: 0 10px 22px -8px rgba(221,85,24,.55); }
  50%      { box-shadow: 0 10px 32px -6px rgba(221,85,24,.9); }
}

.vf-fussnote { margin: 15px 6px 0; font-size: 0.9rem; color: var(--gedaempft); text-align: center; }

/* --- Bewegung beim Scrollen ---------------------------------------------- */

/* NUR VERSTECKEN, WENN JAVASCRIPT WIRKLICH LÄUFT.
   Vorher stand hier ``opacity: 0`` ohne Bedingung. Das heißt: Bricht das
   Skript aus irgendeinem Grund, BEVOR der Beobachter die Klasse „da" vergibt,
   ist die halbe Seite unsichtbar — und niemand sieht einen Fehler, sondern
   eine leere Seite. Das darf bei einer Verkaufsseite nicht passieren.
   Die Klasse „js" setzt ein winziges Skript im <head>; ohne sie ist alles
   sichtbar. */
.js .auf { opacity: 0; transform: translateY(26px); }
.auf { transition: opacity .7s ease, transform .7s cubic-bezier(.2,.8,.3,1); }
.js .auf.da { opacity: 1; transform: none; }
.auf.v1 { transition-delay: .09s; }
.auf.v2 { transition-delay: .18s; }
.auf.v3 { transition-delay: .27s; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation: none !important; transition: none !important; }
  .auf { opacity: 1; transform: none; }
  .vf-karte-titel, .vf-zeile, .vf-tat { opacity: 1; transform: none; }
}

/* --- Karten -------------------------------------------------------------
   Weich, warm und MIT TIEFE. In der ersten Fassung waren es Rechtecke mit
   einer Haarlinie — deshalb sah alles aus wie eine Tabelle. */

.karten { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 46px; }
.karte {
  background: var(--weiss); border-radius: var(--rund); padding: 30px 28px 32px;
  box-shadow: var(--schatten-m);
  transition: transform .28s cubic-bezier(.2,.8,.3,1), box-shadow .28s ease;
}
.karte:hover { transform: translateY(-4px); box-shadow: var(--schatten-l); }
.karte h3 { margin-bottom: 10px; }
.karte p { font-size: 1rem; color: var(--tinte-weich); margin: 0; }
/* `.karte p` (0-1-1) schlug `.marke` (0-1-0) und nahm dem Abzeichen seinen
   Abstand — „Fuer die meisten richtig" klebte am Wort „Betrieb". Diese Regel
   hat 0-2-0 und gewinnt. */
.karte .marke { margin-bottom: 18px; }
.karte-hervor .marke { background: var(--flamme); color: var(--weiss); }

/* Die gestrichene Einrichtungsgebuehr. DURCHGESTRICHEN UND NICHT WEGGELASSEN:
   Ein weggelassener Posten ist ein Geschenk, das niemand bemerkt. */
.entfaellt s { color: var(--gedaempft); text-decoration-thickness: 2px; }
.entfaellt-marke {
  display: inline-block; margin-left: 8px;
  background: var(--moos); color: var(--weiss);
  font-size: 0.74rem; font-weight: 800; letter-spacing: 0.05em;
  padding: 3px 10px; border-radius: 999px; text-transform: uppercase;
}

/* DAS BAND AUF DER EMPFOHLENEN KARTE HATTE KEINE REGEL (2.9.2026).
   Auf der Preisseite steht ueber „Backendbuero" ein <span class="karte-band">
   „Der Kern". Die Klasse gab es im Stylesheet nicht — uebrig blieb eine
   nackte Textzeile, die wie ein verrutschter Satz aussah statt wie das
   Abzeichen, das eine Karte als die empfohlene ausweist.
   Es traegt bewusst VOLLES Orange und nicht das blasse: Der Grund der Karte
   ist bereits `--flamme-blass`, ein blasses Band darauf verschwaende. */
/* DAS BAND LIEGT AUF DER KARTE, ES SCHIEBT SIE NICHT (3.9.2026).
   Als Element im Fluss kostete es 12 px Abstand plus seine eigene Hoehe — und
   nur die EINE Karte hatte es. Gemessen bei 1440 px: „0 €" und „590 €" standen
   auf 456, „990 €" auf 498. Zweiundvierzig Pixel Versatz zwischen drei Zahlen,
   die man nebeneinander lesen soll; man sieht es sofort und haelt es fuer
   schlechte Arbeit, ohne sagen zu koennen, woran es liegt.
   Absolut gesetzt sitzt es am oberen Rand der Karte, wo ein Abzeichen hingehoert,
   und die drei Zahlen stehen auf einer Linie. Die Karte bekommt dafuer oben
   etwas mehr Innenabstand — sonst laege das Band auf der Ueberschrift. */
.karte-band {
  position: absolute; top: -13px; left: 28px;
  background: var(--flamme); color: var(--weiss);
  font-size: 0.74rem; font-weight: 800; letter-spacing: 0.05em;
  padding: 4px 12px; border-radius: 999px; text-transform: uppercase;
  box-shadow: 0 4px 12px -4px rgba(224, 74, 12, 0.5);
}
.karte:has(> .karte-band) { position: relative; }
.karte p + p { margin-top: 10px; }

/* Zwei Knoepfe nebeneinander IN einer Karte — und umgebrochen, sobald sie
   nicht mehr nebeneinander passen. `.knopf` traegt `white-space: nowrap`, kann
   also nicht schmaler werden als seine Beschriftung; ohne `flex-wrap` schiebt
   die Reihe die Karte auf, die Karte ihre Grid-Spalte und die Spalte die ganze
   Seite. Genau so sind auf der Startseite 56 Pixel Querlauf entstanden.
   Die Knoepfe sind hier kleiner als die der Seite: Sie stehen im Nachbau einer
   Programmoberflaeche, nicht in ihr. */
/* Der Satz unter einem Knopf, der anders heisst als seine Nachbarn. Er steht
   NACH dem Knopf und nicht davor: Wer schon entschieden hat, soll nicht erst
   eine Begruendung lesen muessen. */
.knopf-grund {
  margin: 10px 0 0; font-size: 0.84rem; line-height: 1.45;
  color: var(--gedaempft); max-width: 34ch;
}

.karte-tat { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.karte-tat .knopf { flex: 1 1 12ch; min-height: 48px; font-size: 0.96rem; padding: 0 18px; }
/* DIE HERVORGEHOBENE KARTE IST WARM, NICHT SCHWARZ.
   Bis zum 23.8.2026 stand sie auf var(--tinte) mit heller Schrift. Das faellt
   auf — aber es faellt auf wie eine Warnung, nicht wie eine Empfehlung, und ein
   dunkler Block zwischen zwei hellen liest sich unfreundlich.
   Jetzt traegt sie den Akzent als GRUND und als RING: blasses Orange, zwei
   Pixel Rahmen, ein warmer Schatten. Sie steht damit genauso deutlich heraus —
   nur laedt sie ein, statt sich abzugrenzen. Und die Leistungsliste bleibt in
   normaler Tinte lesbar; heller Text auf dunklem Grund kostet bei sieben
   Stichpunkten spuerbar Lesbarkeit. */
.karte-hervor {
  background: var(--flamme-blass);
  border: 2px solid var(--flamme);
  box-shadow: 0 18px 44px -20px rgba(232, 93, 24, 0.45);
}

.zeichen {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 44px; height: 44px; padding: 0 15px; margin-bottom: 18px;
  border-radius: 999px; background: var(--flamme-blass); color: var(--flamme);
  font-size: 0.92rem; font-weight: 800; letter-spacing: -0.01em;
}
.karte-hervor .zeichen { background: var(--weiss); color: var(--flamme); }
.zeichen.gruen { background: var(--moos-blass); color: var(--moos); }

.zweispalt { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: clamp(34px, 5vw, 70px); align-items: center; }
@media (max-width: 940px) { .zweispalt { grid-template-columns: 1fr; } }

/* `height: auto` IST DER PUNKT, an dem dieses Bild ueberhaupt 3:2 wird.
   Bis zum 30.8.2026 fehlte es, und die Folge sah niemand als Fehler: Das
   `height`-Attribut im HTML (fuer die Layoutreservierung noetig, damit beim
   Laden nichts springt) setzt eine feste Hoehe. Eine feste Hoehe ist nicht
   `auto`, und ohne `auto` ignoriert der Browser `aspect-ratio` vollstaendig.
   Die Bilder standen dadurch 551 x 1020 im Raster — hochkant, obwohl das
   Stylesheet quer verlangt, und `object-fit: cover` schnitt aus einem
   Querformat einen schmalen senkrechten Streifen heraus.
   Zwei Angaben, die einander widersprechen, und die stillere gewinnt. */
.stimmungsbild {
  width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover;
  border-radius: var(--rund); box-shadow: var(--schatten-l);
}
.stimmungsbild.hoch { aspect-ratio: 1 / 1; }

/* --- Vorher / Nachher ---------------------------------------------------- */

.umkehr { display: grid; grid-template-columns: 1fr auto 1fr; gap: clamp(16px, 3vw, 40px); align-items: stretch; margin-top: 46px; }
@media (max-width: 900px) { .umkehr { grid-template-columns: 1fr; } .umkehr-pfeil { transform: rotate(90deg); justify-self: center; } }
.umkehr-seite { background: var(--weiss); border-radius: var(--rund); padding: 28px; box-shadow: var(--schatten-m); }
.umkehr-seite.jetzt { background: var(--tinte); color: var(--sand); box-shadow: var(--schatten-l); }
.umkehr-kopf { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gedaempft); margin: 0 0 16px; }
.umkehr-seite.jetzt .umkehr-kopf { color: var(--flamme-hell); }
.felderliste { margin: 0; padding: 0; list-style: none; }
.felderliste li { font-size: 0.9rem; color: var(--gedaempft); padding: 7px 0 7px 24px; position: relative; }
/* DER AUFZAEHLUNGSPUNKT IST DER DER MARKE — ein gefuellter oranger Kreis, wie
   in `.marke::before`. Hier stand ein leeres Kaestchen mit grauem Rand: auf der
   Startseite las es sich als Haekchenliste zum Abarbeiten, und auf der
   Preisseite stand ein UNGEKREUZTES Kaestchen neben „Website und
   Google-Unternehmensprofil aufgebaut" — also neben einer Leistung, die es
   gibt. Ein leeres Kaestchen heisst „noch nicht"; das war das Gegenteil der
   Aussage.
   Die 16px sind gerechnet, nicht geraten: 7px Innenabstand oben plus die halbe
   Zeilenhoehe (0,9rem x 1,68 / 2 = 12,1px) ist die Mitte der ERSTEN Zeile bei
   19,1px, minus der halbe Punkt (3,5px). Auf der ersten Zeile und nicht in der
   Mitte des Punktes: Die Vertragsliste auf der Preisseite hat mehrzeilige
   Eintraege, und ein Punkt in deren Mitte schwebt neben dem Fliesstext. */
.felderliste li::before { content: ""; position: absolute; left: 2px; top: 16px; width: 7px; height: 7px; border-radius: 50%; background: var(--flamme); }
.umkehr-pfeil { align-self: center; display: grid; place-items: center; width: 54px; height: 54px; border-radius: 50%; background: var(--flamme); color: #fff; font-size: 1.4rem; box-shadow: 0 10px 22px -8px rgba(221,85,24,.5); }
.umkehr-satz { font-size: 1.22rem; font-weight: 650; line-height: 1.45; letter-spacing: -0.022em; margin: 0 0 14px; color: var(--weiss); }
.umkehr-fuss { font-size: 0.95rem; color: var(--gedaempft); margin: 0; }
.umkehr-seite.jetzt .umkehr-fuss { color: var(--gedaempft-d); }

/* --- Die Morgenlage ------------------------------------------------------ */

.lage-liste { list-style: none; margin: 0; padding: 0; }
/* DER PUNKT STEHT IN DER MITTE DES EINTRAGS, nicht an dessen Oberkante.
   Jede Zeile ist zweiteilig — fette Aussage plus Erklaerung darunter. Mit
   `flex-start` und 9px Abstand klebte der Punkt an der ersten Zeile und liess
   die zweite ohne Bezug darunter haengen; er sah aus wie der Punkt einer
   Aufzaehlung, nicht wie die Marke DIESES Eintrags. Zentriert bindet er beide
   Zeilen zusammen, und die Trennlinien darunter bekommen eine ruhige Achse. */
.lage-liste li { display: flex; gap: 14px; align-items: center; padding: 15px 0; border-bottom: 1px solid var(--linie); }
.lage-liste li:last-child { border-bottom: 0; }
.lage-punkt { width: 10px; height: 10px; border-radius: 50%; background: var(--flamme); flex: none; }
.lage-liste b { display: block; font-size: 1rem; font-weight: 700; letter-spacing: -0.018em; }
.lage-liste span { display: block; margin-top: 2px; font-size: 0.9rem; color: var(--gedaempft); }

/* --- Zahlen -------------------------------------------------------------- */


/* --- Preise -------------------------------------------------------------- */

.rechner { background: var(--weiss); border-radius: var(--rund); box-shadow: var(--schatten-l); overflow: hidden; }
.rechner-kopf { padding: 28px 30px 22px; background: var(--sand); }
.rechner-kopf p:first-child { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gedaempft); margin: 0 0 7px; }
.rechner-zeile { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; padding: 20px 30px; border-bottom: 1px solid var(--linie); }
.rechner-zeile > div:first-child { flex: 1 1 230px; }
.rechner-zeile b { display: block; font-size: 1.04rem; font-weight: 700; letter-spacing: -0.02em; }
.rechner-zeile small { display: block; margin-top: 3px; font-size: 0.89rem; color: var(--gedaempft); }
.rechner-betrag { font-size: 1.1rem; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }

.zaehler { display: inline-flex; align-items: center; background: var(--sand); border-radius: 999px; padding: 4px; }
.zaehler button { width: 44px; height: 44px; border: 0; border-radius: 50%; background: var(--weiss); cursor: pointer; font-size: 1.3rem; line-height: 1; color: var(--tinte); box-shadow: var(--schatten-s); transition: transform .15s ease; }
.zaehler button:hover:not(:disabled) { transform: scale(1.08); }
.zaehler button:disabled { opacity: .4; cursor: not-allowed; }
.zaehler output { min-width: 54px; text-align: center; font-size: 1.15rem; font-weight: 800; font-variant-numeric: tabular-nums; }

.rechner-summe { display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px; padding: 26px 30px 30px; background: var(--flamme-blass); }
.rechner-summe span:first-child { font-size: 1.05rem; font-weight: 700; margin-right: auto; }
.rechner-summe b { font-size: clamp(2.2rem, 4vw, 3rem); font-weight: 800; letter-spacing: -0.05em; line-height: 1; font-variant-numeric: tabular-nums; color: var(--flamme); }
.rechner-fuss { padding: 24px 30px 28px; }
.rechner-fuss .knopf { width: 100%; }

.katalog { display: grid; grid-template-columns: repeat(auto-fit, minmax(232px, 1fr)); gap: 8px 36px; margin-top: 40px; }
.katalog h4 { font-size: 0.79rem; font-weight: 800; letter-spacing: 0.11em; text-transform: uppercase; color: var(--flamme); margin: 20px 0 10px; }
.katalog ul { list-style: none; margin: 0 0 10px; padding: 0; font-size: 0.97rem; }
.katalog li { display: grid; grid-template-columns: 20px 1fr; gap: 9px; padding: 5px 0; align-items: start; color: var(--tinte-weich); }
.katalog li::before {
  content: ""; width: 17px; height: 17px; margin-top: 5px; flex: none; border-radius: 50%;
  background: var(--moos-blass) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2 L4.7 8.4 L9.5 3.6' fill='none' stroke='%232E6047' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/12px no-repeat;
}

/* --- Gegenüberstellung --------------------------------------------------- */

.nutzen { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 0.88fr); gap: clamp(26px, 3.5vw, 50px); margin-top: 44px; align-items: start; }
@media (max-width: 940px) { .nutzen { grid-template-columns: 1fr; } }
.regler-feld { background: var(--weiss); border-radius: var(--rund-s); padding: 20px 22px; margin-bottom: 12px; box-shadow: var(--schatten-s); }
.regler-kopf { display: flex; align-items: baseline; gap: 12px; margin-bottom: 4px; }
.regler-kopf label { font-weight: 700; font-size: 1.02rem; letter-spacing: -0.02em; flex: 1; }
.regler-kopf b { font-size: 1.12rem; font-weight: 800; font-variant-numeric: tabular-nums; color: var(--flamme); white-space: nowrap; }
.regler-feld small { display: block; font-size: 0.89rem; color: var(--gedaempft); margin-bottom: 12px; }
.regler-feld input[type="range"] { width: 100%; margin: 0; accent-color: var(--flamme); height: 28px; cursor: pointer; }

.bilanz { background: var(--weiss); border-radius: var(--rund); overflow: hidden; box-shadow: var(--schatten-l); position: sticky; top: 96px; }
@media (max-width: 940px) { .bilanz { position: static; } }
.bilanz-kopf { padding: 24px 28px 20px; background: var(--sand); }
.bilanz-kopf p:first-child { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gedaempft); margin: 0 0 6px; }
.bilanz-posten { display: flex; align-items: baseline; gap: 14px; padding: 15px 28px; border-bottom: 1px solid var(--linie); }
.bilanz-posten span:first-child { flex: 1; font-size: 0.97rem; font-weight: 600; }
.bilanz-posten span:first-child small { display: block; font-weight: 400; font-size: 0.85rem; color: var(--gedaempft); }
.bilanz-posten b { font-size: 1.05rem; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--moos); }
.bilanz-posten.kosten b { color: var(--gedaempft); }
.bilanz-summe { padding: 24px 28px 28px; background: var(--flamme-blass); display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px; }
.bilanz-summe span:first-child { font-size: 1.05rem; font-weight: 700; margin-right: auto; }
.bilanz-summe b { font-size: clamp(2rem, 3.6vw, 2.8rem); font-weight: 800; letter-spacing: -0.05em; line-height: 1; font-variant-numeric: tabular-nums; color: var(--flamme); }
.bilanz-fuss { padding: 22px 28px 26px; }

/* --- Tabelle ------------------------------------------------------------- */

.tabellenrahmen { overflow-x: auto; margin-top: 42px; border-radius: var(--rund); background: var(--weiss); box-shadow: var(--schatten-m); }
table.vergleich { width: 100%; min-width: 620px; border-collapse: collapse; font-size: 0.97rem; }
table.vergleich th, table.vergleich td { text-align: left; padding: 16px 22px; border-bottom: 1px solid var(--linie); vertical-align: top; }
table.vergleich tbody tr:last-child th, table.vergleich tbody tr:last-child td { border-bottom: 0; }
table.vergleich thead th { font-size: 0.76rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gedaempft); white-space: nowrap; }
table.vergleich tbody th { font-weight: 650; }
table.vergleich td { font-variant-numeric: tabular-nums; color: var(--tinte-weich); }
table.vergleich .uns { background: var(--flamme-blass); }
table.vergleich .uns strong { color: var(--flamme); }

/* --- Fragen -------------------------------------------------------------- */

.fragen { margin-top: 40px; max-width: 840px; display: flex; flex-direction: column; gap: 10px; }
.frage { background: var(--weiss); border-radius: var(--rund-s); box-shadow: var(--schatten-s); overflow: hidden; transition: box-shadow .2s ease; }
.frage[open] { box-shadow: var(--schatten-m); }
.frage summary { cursor: pointer; list-style: none; padding: 20px 62px 20px 24px; font-size: 1.05rem; font-weight: 700; letter-spacing: -0.02em; position: relative; }
.frage summary::-webkit-details-marker { display: none; }
.frage summary::after {
  content: ""; position: absolute; right: 20px; top: 50%; transform: translateY(-50%);
  width: 30px; height: 30px; border-radius: 50%; background: var(--flamme-blass);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M7 2.6v8.8M2.6 7h8.8' stroke='%23DD5518' stroke-width='1.9' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: center; background-size: 14px;
  transition: transform .22s cubic-bezier(.2,.8,.3,1);
}
.frage[open] summary::after { transform: translateY(-50%) rotate(135deg); }
.frage summary:hover { color: var(--flamme); }
.frage-text { padding: 0 56px 22px 24px; }
.frage-text p { font-size: 1rem; color: var(--tinte-weich); }
.frage-text p:last-child { margin-bottom: 0; }

/* --- Die Staffel --------------------------------------------------------- */

.staffel { background: var(--weiss); border-radius: var(--rund); padding: clamp(28px, 4vw, 46px); box-shadow: var(--schatten-l); margin-top: 40px; }
.staffel-plaetze { display: flex; gap: 6px; margin: 22px 0 8px; flex-wrap: wrap; }
.staffel-plaetze i { width: 34px; height: 10px; border-radius: 999px; background: var(--linie-stark); display: block; }
.staffel-plaetze i.frei { background: var(--flamme); }

/* --- Fußzeile ------------------------------------------------------------ */

.fuss { background: var(--tinte); color: var(--gedaempft-d); padding: 68px 0 34px; font-size: 0.96rem; border-radius: 40px 40px 0 0; margin-top: 20px; }
.fuss-raster { display: grid; grid-template-columns: 1.7fr repeat(3, 1fr); gap: 40px 30px; }
@media (max-width: 800px) { .fuss-raster { grid-template-columns: 1fr 1fr; } }
.fuss h4 { font-size: 0.78rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--weiss); margin-bottom: 16px; }
.fuss ul { list-style: none; margin: 0; padding: 0; }
.fuss li { margin-bottom: 11px; }
.fuss a { text-decoration: none; }
.fuss a:hover { color: var(--weiss); text-decoration: underline; }
.fuss-unten { display: flex; flex-wrap: wrap; gap: 10px 26px; justify-content: space-between; margin-top: 48px; padding-top: 24px; border-top: 1px solid var(--linie-d); font-size: 0.87rem; }

/* --- Hilfsklassen -------------------------------------------------------- */

/* `margin-inline: auto` IST DER GRUND, WARUM DIESE KLASSEN SO HEISSEN.
   Bis zum 30.8.2026 fehlte es: Beide setzten nur eine Maximalbreite, und ein
   <div> mit Maximalbreite ohne automatische Seitenränder klebt am linken Rand.
   Gemessen im Preisblock der Startseite: Die Überschrift stand bei Mitte 484,
   die Karten darunter bei 720 — 236 Pixel Versatz zwischen zwei Blöcken, die
   zusammengehören. Man sieht es sofort und kann es nicht benennen; es wirkt
   nur schief.
   Betroffen waren 16 Blöcke auf drei Seiten. Der Name der Klasse versprach die
   ganze Zeit etwas, das ihre einzige Regel nicht tat. */
.mitte-schmal { max-width: var(--schmal); margin-inline: auto; }
.mitte-mittel { max-width: var(--mittel); margin-inline: auto; }

/* EIN ZENTRIERTER KASTEN MUSS AUCH SEINE ABSAETZE ZENTRIEREN (4.9.2026).
   `text-align: center` richtet nur den Text INNERHALB eines Absatzes aus. Der
   Absatz selbst ist durch `p { max-width: 62ch }` (Zeile 159) schmaler als sein
   Kasten und klebt ohne automatische Seitenraender an dessen linkem Rand.

   GEMESSEN unter den Preiskarten der Startseite, Fenster 1512 px: Der Kasten
   war 700 px breit mit Mitte bei 756 — genau wie die Kartenreihe darueber. Der
   Absatz darin war 500 px breit mit Mitte bei 656. Das Kleingedruckte stand
   also 100 Pixel zu weit links, WAEHREND seine Zeilen untereinander sauber
   zentriert aussahen. Genau daran sieht man den Fehler so schlecht: Er
   verschiebt den Block, nicht die Zeilen zueinander.

   Deshalb eine Klasse und kein `style="text-align:center"` mehr: Der Stil
   allein war die halbe Sache, und wer ihn das naechste Mal setzt, bekommt die
   andere Haelfte mit. */
.mittig { text-align: center; }
.mittig > p, .mittig > h2, .mittig > h3 { margin-inline: auto; }

/* --- Der Kopf der Preisseite --------------------------------------------- */
/* KLEINER ALS DAS h1 DER STARTSEITE, und das ist kein Geschmack.
   Das globale h1 steht auf clamp(2.9rem, 6.4vw, 5rem) — bei 1440 px sind das
   80 Pixel und drei Zeilen. Auf dem Aufmacher der Startseite ist das richtig:
   Er muss Aufmerksamkeit holen. Auf der Preisseite ist sie schon da; wer
   „Preise" anklickt, hat die Frage gestellt.

   GEMESSEN, WARUM DAS NOETIG WAR: Mit dem alten Kopf begann die erste
   Preiskarte bei 934 Pixeln. Das Fenster ist 900 hoch. Es war also keine
   einzige Zahl zu sehen, ohne zu scrollen — auf der Seite, deren ganze Aufgabe
   die Zahl ist.

   Die 24ch begrenzen auf zwei Zeilen bei 1440 px und eine bei sehr breiten
   Fenstern; ohne die Grenze zieht `text-wrap: balance` die Zeile bis an den
   Rand der 1040 und der Satz zerfaellt in vier kurze Stuecke. */
.preis-h1 {
  font-size: clamp(1.9rem, 3.4vw, 2.7rem);
  letter-spacing: -0.035em;
  max-width: 24ch;
}
.preis-kopf-satz {
  margin: 14px 0 0; max-width: 58ch;
  font-size: 1.06rem; color: var(--tinte-weich);
}
/* Der Abstand zu den Karten kommt von `.karten` (46px). Zusammen mit dem Satz
   darueber sind das genug Luft — ein eigener Abstand hier waere der zweite. */
.abstand-oben { margin-top: 30px; }
.hinweiszeile { font-size: 0.88rem; color: var(--gedaempft); }
.abschluss h2 { max-width: 18ch; }

/* --- Das Handy in der Hand ----------------------------------------------
   Das Foto zeigt eine leere weisse Displayflaeche — mit Absicht: Ein
   erzeugtes Bild haette dort eine ERFUNDENE Oberflaeche gezeigt, und das
   waere eine Luege ueber das Produkt. Die echte Ansicht liegt als HTML
   darueber, millimetergenau auf die vermessene Displayflaeche gelegt.

   Die Prozentwerte unten sind gemessen, nicht geschaetzt (Bild 580 × 880). */

  /* GEMESSEN, NICHT GESCHAETZT. Im Foto (580x880) liegt die weisse
  /* DIE ECKEN WAREN DER FEHLER.
  /* Das Display sitzt hinter Glas: eine Spur Licht von oben links. */
/* Alles im Display skaliert mit der Bildbreite, damit es auf jedem Gerät
   stimmig bleibt — feste Punktgrößen liefen bei 320 px Bildbreite aus dem
   Rahmen. */
/* Alles im Display haengt an der Bildbreite: feste Punktgroessen liefen bei
   320 px Bildbreite aus dem Rahmen. */

/* --- Preisrechner: zwei Zähler nebeneinander ---------------------------- */

.rechner-zeile.zwei { align-items: flex-start; }
.zaehler-klein { display: inline-flex; align-items: center; background: var(--sand); border-radius: 999px; padding: 3px; }
.zaehler-klein button { width: 38px; height: 38px; border: 0; border-radius: 50%; background: var(--weiss); cursor: pointer; font-size: 1.15rem; line-height: 1; color: var(--tinte); box-shadow: var(--schatten-s); }
.zaehler-klein button:disabled { opacity: .4; cursor: not-allowed; }
.zaehler-klein output { min-width: 44px; text-align: center; font-size: 1.05rem; font-weight: 800; font-variant-numeric: tabular-nums; }

/* --- Der Weg zum Termin -------------------------------------------------- */

.schritte { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px; margin-top: 44px; counter-reset: schritt; }
.schritt { background: var(--weiss); border-radius: var(--rund); padding: 28px 26px 30px; box-shadow: var(--schatten-m); position: relative; }
.schritt-nr {
  display: inline-flex; align-items: center; justify-content: center;
  width: 46px; height: 46px; border-radius: 50%; margin-bottom: 18px;
  background: var(--flamme); color: #fff; font-size: 1.15rem; font-weight: 800;
  box-shadow: 0 8px 18px -6px rgba(221,85,24,.5);
}
.schritt.frei .schritt-nr { background: var(--moos); box-shadow: 0 8px 18px -6px rgba(46,96,71,.5); }
.schritt h3 { margin-bottom: 9px; }
.schritt p { font-size: 0.98rem; color: var(--tinte-weich); margin: 0; }

/* --- Anfrageformular ----------------------------------------------------- */

/* `[hidden]` MUSS GEWINNEN, AUCH GEGEN `display: flex`.
   Der Browser setzt fuer `[hidden]` nur `display: none` in seinem eigenen
   Stilblatt — jede eigene `display`-Regel schlaegt das. `.formular` ist ein
   Flex-Container, und deshalb blieb das Formular nach dem Absenden STEHEN,
   waehrend die Bestaetigung darunter erschien. Beides gleichzeitig, mit einem
   Knopf, den man ein zweites Mal druecken kann.
   Aufgefallen ist es nicht beim Ansehen, sondern beim Messen: `is_hidden` sagte
   nein, obwohl das Skript `hidden` gesetzt hatte. */
[hidden] { display: none !important; }

.formular { display: flex; flex-direction: column; gap: 14px; }
/* DIE MELDEZEILE DES ANFRAGEFORMULARS. Sie stand bis zum 31.8.2026 unformatiert
   da — was nicht auffiel, weil das Skript sie nie beschrieben hat (falsche
   Kennung, siehe web.js). Zwei Zustände, nie beide zugleich. */
.formular-antwort:empty { display: none; }
.formular-antwort {
  margin: 0; font-size: 0.95rem; font-weight: 600; line-height: 1.5;
  padding: 12px 15px; border-radius: 12px;
}
.antwort-gut { background: var(--moos-blass); color: var(--moos); }
.antwort-schlecht { background: var(--flamme-blass); color: var(--flamme); }
/* JEDES <label> IM FORMULAR IST EINE BESCHRIFTUNG, auch ohne die Klasse.
   Vorher trug nur `.beschriftung` Groesse, Gewicht und Farbe; ein schlichtes
   <label> stand unformatiert daneben und sah aus wie Fliesstext. Wer ein
   Formular baut, soll die Klasse nicht kennen muessen, damit es richtig
   aussieht — die Ausnahme ist der teurere Weg als die Regel. */
.formular label, .formular .beschriftung {
  display: block; font-size: 0.85rem; font-weight: 700;
  color: var(--tinte-weich); margin-bottom: 6px; letter-spacing: -0.005em;
}
/* EIN FELD MUSS MAN SEHEN, BEVOR MAN HINEINKLICKT (31.8.2026).
   Hier stand `border: 0` und `background: var(--sand)`. Auf der Preisseite
   fiel das nicht auf, weil das Formular dort auf WEISS steht — der Rand war
   unsichtbar, aber die Fläche hob sich ab.

   Auf der Registrierseite stand dasselbe Formular auf einem `.sand`-Abschnitt:
   gleiche Farbe, kein Rand. Die Felder waren buchstäblich nicht zu erkennen;
   nur wer hineinklickte, sah den Fokusring. Junaids Rückmeldung war „man kann
   die Felder nicht sehen", und das war keine Geschmacksfrage.

   Jetzt trägt jedes Feld einen eigenen Rand und weissen Grund. Damit hängt
   seine Sichtbarkeit nicht mehr davon ab, worauf das Formular zufällig steht —
   und auf der Preisseite sieht man den Kasten jetzt ebenfalls, statt ihn nur zu
   erahnen. */
.formular input, .formular textarea, .formular select {
  width: 100%; padding: 14px 16px; font: inherit; font-size: 1rem;
  border: 0; border-radius: var(--rund-s); background: var(--weiss);
  box-shadow: inset 0 0 0 1.5px var(--feldrand);
  transition: box-shadow .16s ease, background-color .16s ease;
}
.formular input::placeholder, .formular textarea::placeholder {
  color: var(--gedaempft); opacity: 1;
}
.formular input:focus, .formular textarea:focus, .formular select:focus {
  outline: none; background: var(--weiss);
  box-shadow: inset 0 0 0 1.5px var(--flamme);
}
.formular textarea { min-height: 96px; resize: vertical; }
.formular-paar { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 560px) { .formular-paar { grid-template-columns: 1fr; } }
.formular-antwort { margin: 0; padding: 16px 18px; border-radius: var(--rund-s); font-size: 0.97rem; }
.formular-antwort.gut { background: var(--moos-blass); color: var(--moos); }
.formular-antwort.schlecht { background: var(--flamme-blass); color: var(--flamme); }

/* --- Der Zeitgewinn, gross ----------------------------------------------
   Die ZEIT steht oben und gross, der Euro-Betrag ist die Folge. Ein
   Meister, der abends um neun noch am Rechner sitzt, kauft keine Rendite
   — er kauft seinen Abend zurueck. Ein Rechner, der ihm zuerst eine
   Eurozahl zeigt, redet an ihm vorbei. */

.zeitgewinn { padding: 30px 28px 26px; background: var(--tinte); color: var(--sand); }
.zeit-label { display: block; font-size: 0.78rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gedaempft-d); margin-bottom: 8px; }
.zeitgewinn > b {
  display: block; font-size: clamp(3.4rem, 7.5vw, 5rem); font-weight: 800;
  letter-spacing: -0.055em; line-height: 0.92; color: var(--flamme-hell);
  font-variant-numeric: tabular-nums;
}
.zeit-einheit { display: block; font-size: 1.05rem; font-weight: 650; color: var(--weiss); margin-top: 4px; }
.zeit-jahr { display: flex; flex-wrap: wrap; gap: 8px 26px; margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--linie-d); }
.zeit-jahr span { font-size: 0.95rem; color: var(--gedaempft-d); }
.zeit-jahr b { color: var(--weiss); font-size: 1.15rem; font-weight: 800; font-variant-numeric: tabular-nums; }

.bilanz-trenner {
  padding: 14px 28px 10px; background: var(--sand);
  font-size: 0.76rem; font-weight: 800; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--gedaempft);
}

/* --- Der Schalter Monat / Jahr ------------------------------------------
   Zwei Knoepfe in einer Schale, nicht ein Kippschalter: Ein Kippschalter sagt
   nicht, was die andere Seite ist, und auf einer Preisseite muss beides
   gleichzeitig lesbar sein. */
/* Die App-Schale hat diese Klasse; die Webseite hatte sie nicht. Ohne sie
   haetten die Jahres-Elemente von Anfang an sichtbar danebengestanden — zwei
   Preise je Karte, und der Schalter waere wirkungslos gewesen. */
.versteckt { display: none !important; }

.preis-schalter {
  display: inline-flex; gap: 4px; margin: 0 auto 28px;
  padding: 5px; border-radius: 999px; background: var(--sand);
  border: 1px solid var(--linie);
}
.karten-drei + .preis-schalter, .preis-schalter { display: inline-flex; }
.ps-knopf {
  font: inherit; font-weight: 700; font-size: 0.95rem;
  border: 0; background: transparent; color: var(--gedaempft);
  padding: 10px 20px; border-radius: 999px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 9px;
  transition: background .18s ease, color .18s ease;
}
.ps-knopf:hover { color: var(--tinte); }
.ps-knopf.ist-an { background: var(--weiss); color: var(--tinte); box-shadow: var(--schatten-m); }
.ps-vorteil {
  font-size: 0.72rem; font-weight: 800; letter-spacing: 0.04em;
  background: var(--moos-blass); color: var(--moos);
  padding: 3px 8px; border-radius: 999px; white-space: nowrap;
}
.ps-knopf:focus-visible { outline: 2px solid var(--flamme); outline-offset: 2px; }

/* =========================================================================
   PREISSEITE — die Umstellung von „Software je Zugang" auf „Pauschale je
   Betrieb" (August 2026)

   Die alte Preisseite hatte einen Rechner mit Reglern: Grundpreis plus
   Monteure ergibt eine Summe. Der ist weg, und mit ihm die Regeln dafuer.
   Was jetzt zaehlt, sind drei nebeneinanderstehende Optionen und die
   Alternativkosten-Rechnung darueber — die eine Zahl, die der Meister kennt.
   ========================================================================= */

/* Drei Optionen nebeneinander, so lange sie nebeneinander lesbar sind. Unter
   1.020 px bricht das Raster von selbst um (auto-fit in .karten). Die feste
   Dreiteilung darueber verhindert, dass die dritte Karte allein in eine zweite
   Zeile rutscht — dann sieht die „Zentrale" aus wie ein Nachtrag statt wie die
   Option, die die mittlere vernuenftig aussehen laesst. */
@media (min-width: 1020px) {
  .karten-drei { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* Die Bilanz steht auf dieser Seite ALLEIN in der Mitte und nicht neben einer
   zweiten Spalte. `position: sticky` wuerde sie beim Scrollen an der Kopfzeile
   festkleben, ohne dass daneben etwas weiterlaeuft — das sieht nach einem
   Fehler aus. */
.mitte-schmal > .bilanz, .mitte-mittel > .bilanz { position: static; }

/* In .bilanz-posten stand der Betrag bisher immer in einem <b>. Auf der
   Preisseite ist er teils ein <span> mit einem durchgestrichenen Vergleichswert
   daneben; ohne diese Regel steht er in Fliesstext-Groesse und rutscht optisch
   unter die Bezeichnung. */
.bilanz-posten > span:last-child {
  font-size: 1.02rem; font-weight: 700; white-space: nowrap;
  font-variant-numeric: tabular-nums; color: var(--tinte);
}
.bilanz-posten > span:first-child { font-weight: 600; }
/* Der regulaere Preis neben dem Nachlass. DURCHGESTRICHEN UND NICHT WEGGELASSEN:
   Der Nachlass wird immer als Nachlass ausgewiesen, damit der Ankerpreis im Kopf
   bleibt. */
.bilanz-posten [data-preis$="-regulaer"] {
  text-decoration: line-through; color: var(--gedaempft);
  font-weight: 500; font-size: 0.94rem;
}
.bilanz-summe > span:last-child {
  font-size: clamp(1.6rem, 3vw, 2.3rem); font-weight: 800; letter-spacing: -0.04em;
  line-height: 1; font-variant-numeric: tabular-nums; color: var(--flamme);
}

/* Der Preis in der Tarifkarte. .rechner-betrag war fuer eine Zeile im Rechner
   gedacht (1,1 rem); als Hauptzahl einer Karte muss er die Groesse haben, die
   das Auge zuerst findet. */
.karte > .rechner-betrag {
  font-size: clamp(2rem, 3.4vw, 2.6rem); font-weight: 800;
  letter-spacing: -0.05em; line-height: 1.05; margin: 14px 0 2px;
  color: var(--flamme);
}
.karte-hervor > .rechner-betrag { color: var(--flamme); }

/* DER TAGESPREIS. Bewusst KLEINER als die Hauptzahl und nicht in der
   Signalfarbe: Er ist ein zweiter Massstab fuer dieselbe Summe, kein zweites
   Angebot. Traegt er dieselbe Groesse, stehen zwei Preise gleichberechtigt in
   der Karte und der Leser fragt sich, welchen er zahlt.
   Der Betrag steht im <strong>, das Wort „am Tag" daneben — die Zahl soll beim
   Ueberfliegen haengenbleiben, die Einheit erklaert sie erst danach. */
.preis-tag {
  font-size: 0.95rem; color: var(--gedaempft);
  margin: 2px 0 10px; font-variant-numeric: tabular-nums;
}
.preis-tag > strong { color: var(--tinte); font-weight: 700; }
/* .nutzen IST EIN ZWEISPALTIGES GRID (Zeile 571) — gebaut fuer einen ganz
   anderen Zusammenhang. In der Tarifkarte wurde der Satz damit in die erste
   Spalte gequetscht: „Sie werden / gefunden, und kein / Anruf geht mehr /
   verloren." Vier Zeilen fuer einen Satz.
   Und bei „Anfragen kommen UND die Verwaltung..." wurde das <em>und</em> zu
   einem EIGENEN Grid-Element in der zweiten Spalte — daher die Luecke mitten im
   Satz.
   Das ist zum dritten Mal dasselbe Muster (nach .vorspann am <section> und
   .aufmacher-fuss um Fliesstext): eine Klasse, die das Layout traegt, an einem
   Element, das Text ist. Der Waechter dagegen steht jetzt in
   tests/test_webseite_klassen.py. */
/* `.liste-haken` GAB ES IM STILBLATT GAR NICHT (31.8.2026).
   Ich habe die Klasse beim Umbau der Preiskarten benutzt, ohne sie anzulegen —
   die Listen standen also mit den gewöhnlichen Aufzählungspunkten des Browsers
   da, eingerückt und grau. Dasselbe Muster wie beim toten Formular: ein Name,
   den niemand definiert hat, wirft keinen Fehler.

   DER HAKEN IST ORANGE, NICHT GRÜN. Grün ist auf dieser Seite die Farbe für
   „erledigt" (Moos, im Lagebild und in Bestätigungen). Eine Leistungsliste
   zählt nicht Erledigtes auf, sondern das, was zum Paket gehört — und dafür ist
   die Flamme die Farbe der Marke. */
.liste-haken {
  list-style: none;
  margin: 20px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 11px;
}
.liste-haken li {
  position: relative;
  padding-left: 28px;
  font-size: 0.97rem;
  line-height: 1.5;
  color: var(--tinte-weich);
  text-wrap: pretty;
}
.liste-haken li::before {
  content: "";
  position: absolute;
  left: 0;
  /* An der ERSTEN Zeile, nicht in der Mitte des Kastens: Bei zweizeiligen
     Punkten säße ein zentriertes Zeichen zwischen den Zeilen. */
  top: calc(0.75em - 9px);
  width: 18px; height: 18px; flex: none;
  border-radius: 50%;
  background: var(--flamme-blass)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2 L4.7 8.4 L9.5 3.6' fill='none' stroke='%23C63F09' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center/12px no-repeat;
}
.karte-hervor .liste-haken li::before { background-color: var(--flamme-blass); }

/* ABSTÄNDE IN DER TARIFKARTE. Sie hatte bisher nur zwei, drei Zeilen; mit
   Leistungsliste, Abgrenzung und Knopf braucht sie eine Ordnung, sonst kleben
   die Blöcke aneinander. Die Karte wird zur Spalte, und der Knopf sitzt unten
   — bei drei Karten nebeneinander auf gleicher Höhe, auch wenn die Listen
   verschieden lang sind. */
.karten-drei .karte {
  display: flex;
  flex-direction: column;
}
.karte > .liste-haken { margin-bottom: 22px; }
.karte .karte-nutzen { margin-top: auto; }
.karte > .knopf { margin-top: 18px; width: 100%; justify-content: center; }
.karte > .hinweiszeile.entfaellt { margin-top: 12px; }

/* .karte-nutzen UND NICHT .nutzen — der Name war doppelt belegt.
   `.nutzen` (Zeile 571) ist ein zweispaltiges Raster fuer einen ganz anderen
   Abschnitt. In der Tarifkarte trug dieselbe Klasse einen SATZ, und der wurde
   darin zerlegt. Ein Override haette gereicht; ein eigener Name ist besser:
   Zwei Bedeutungen fuer ein Wort sind die Zweideutigkeit, aus der der naechste
   Fehler entsteht. */
.karte-nutzen {
  margin: 14px 0 12px;
  font-weight: 600;
  color: var(--tinte);
  max-width: none;
  line-height: 1.45;
}

/* „Der erste Monat ist frei" steht ALLEIN und gruen. Er war vorher an die
   Einrichtungszeile angehaengt und ging dort unter — dabei ist er das, was den
   Einstieg leicht macht. */
.erster-monat {
  display: block; margin: 10px 0 0;
  background: var(--moos-blass); color: var(--moos);
  border-radius: var(--rund-s); padding: 8px 12px;
  font-size: 0.9rem; font-weight: 700;
}
.karte-hervor .karte-nutzen { color: var(--tinte); }
.karte-hervor .felderliste li { color: var(--tinte-weich); }
/* Hier stand eine Aufhellung des KAESTCHEN-RANDS. Das Kaestchen gibt es nicht
   mehr (siehe .felderliste li::before), und `.karte-hervor` ist eine helle
   Karte — der orange Punkt steht darauf ohne Nachhilfe. */
.karte .felderliste { margin-top: 6px; }
/* Die Tarifkarten sind unterschiedlich lang. Ohne diese Zeile stehen die
   Ueberschriften auf gleicher Hoehe und die Karten enden ausgefranst. */
.karten-drei .karte { display: flex; flex-direction: column; }
.karten-drei .karte .felderliste { flex: 1; }

/* =====================================================================
   DIE BÜHNE — der Aufmacher als ganzer erster Bildschirm (30.8.2026)

   WARUM EIN BILD UND NICHT DIE VORFÜHRUNG.
   Der alte Aufmacher führte das Produkt selbst vor: ein Mikrofon, das hört,
   ein Satz, der Wort für Wort erscheint, eine Karte, die sich aufbaut. Das war
   gut und bleibt weiter unten auf der Seite stehen. Nur beantwortet es die
   zweite Frage, nicht die erste. Die erste lautet: „Ist das für mich?"

   Darauf antwortet ein Mann in staubiger Arbeitshose vor einem offenen
   Verteilerkasten, der in sein Telefon spricht, schneller als jede Animation.
   Der Meister erkennt sich, seinen Keller und seinen Werkzeugkoffer — und
   erst danach interessiert ihn, wie die Software funktioniert.

   WARUM DUNKEL, WO DIE SEITE SONST HELL IST.
   Das Bild ist kühler Beton. Ein warmer Schleier darüber macht es schmutzig,
   ein heller Schleier frisst den Kontrast. Also dunkel — und dagegen steht die
   Flamme am Knopf so kräftig wie nirgends sonst auf der Seite. Der Bruch ist
   gewollt: Die Bühne ist der Ort, an dem gehandelt wird, danach wird gelesen.

   WARUM DER TEXT RECHTS STEHT.
   Weil dort die leere Wand ist. Das Bild wurde so erzeugt, dass die rechte
   Hälfte frei bleibt; Text über den Mann zu legen hieße, beides zu verlieren.
   ===================================================================== */

.buehne {
  position: relative;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  overflow: hidden;
  /* Der Grund trägt, bevor Bild oder Video da sind — kein weißes Aufblitzen. */
  background: #1B1917;
}

/* Bild UND Video liegen übereinander. Das Bild ist immer da; das Video legt
   sich darüber, sobald es genug geladen hat, und wird eingeblendet. Wer
   reduzierte Bewegung eingestellt hat, sieht nie etwas anderes als das Bild. */
/* DIE SZENE IST GESPIEGELT (30.8.2026). Im erzeugten Material steht der Mann
   links; gebraucht wird er rechts, damit Text und Handlungsknöpfe die linke
   Seite bekommen — die Seite, auf der in deutscher Leserichtung angefangen
   wird.
   `scaleX(-1)` statt neu erzeugen: Im Bild steht kein Text und keine Marke,
   die seitenverkehrt auffiele. Eine zweite Erzeugung hätte Credits gekostet
   und eine andere Bildaufteilung geliefert — die Spiegelung ist exakt dieselbe
   Aufnahme. */
.buehne-bild,
.buehne-video {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  /* KEINE SPIEGELUNG MEHR (30.8.2026, zweiter Anlauf).
     Zwischendurch war die Szene gespiegelt, weil im ersten Material der Mann
     links stand und rechts gebraucht wurde. Das Bild ist jetzt von vornherein
     so erzeugt: Meister rechts der Mitte, nach LINKS blickend, der
     Zählerschrank ragt bis in die Bildmitte, links eine ruhige Wand für den
     Text. Eine Spiegelung dreht auch den Blick — er hätte aus dem Bild
     herausgeschaut statt zum Text hin.

     DER AUSSCHNITT HÄNGT AN DEN BEIDEN GESICHTERN, NICHT AM SCHRANK
     (31.8.2026). Vorher stand hier 60 % mit der Begründung, das halte den
     Zählerschrank im Bild. Das tat es — und warf dafür die Kundin weg. In
     einem Fenster von 1074 px Breite war sie vollständig verschwunden: Übrig
     blieben ein Schrank und ein Mann, der mit niemandem spricht. Damit ist das
     Bild nicht mehr die Szene, für die es erzeugt wurde.

     GEMESSEN AM MOTIV: Schrank 46–57 %, Meister 62–84 %, Kundin 84–100 %. Ein
     schmales Fenster schneidet unter `cover` symmetrisch um die
     `object-position` herum. Bei 60 % fällt die Kundin zuerst; bei 80 % fallen
     zuerst die leere Wand und der linke Teil des Schranks — also das, was am
     wenigsten trägt. Der rechte Rand des Schranks bleibt dabei stehen und
     liefert weiter den Kontext.

     GEMESSEN, NICHT GESCHÄTZT. Bei 80 % blieb in einem Fenster von
     1074 × 1374 der Bereich 44,6–88,8 % stehen — von der Kundin also ein
     Streifen Schulter. Am rechten Rand (100 %) sind es 56–100 %: der rechte
     Teil des Schranks, der Meister ganz, die Kundin ganz. Bei 1600 × 900 sind
     es 16–100 % und damit alles, was zählt.

     RECHTS HÄNGEN KOSTET NICHTS. Was am linken Rand wegfällt, ist die leere
     Wand — und genau dort steht der Text, den der Schleier ohnehin auf 0,90
     abdunkelt. In einem breiten Fenster, in dem das ganze Bild passt, tut der
     Wert nichts: Browser klemmen `object-position` so, dass der Kasten immer
     voll bedeckt bleibt. */
  object-position: 100% center;
}
.buehne-video { opacity: 0; transition: opacity 1200ms ease; }
.buehne-video.laeuft { opacity: 1; }

/* DER SCHLEIER. Von links nach rechts zunehmend, weil der Text rechts steht
   und der Mann links stehen bleiben soll. */
.buehne::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    linear-gradient(260deg,  /* dunkel nach links, wo der Text steht */
      rgba(24, 21, 19, 0.20) 0%,
      rgba(24, 21, 19, 0.42) 34%,
      rgba(24, 21, 19, 0.78) 64%,
      rgba(24, 21, 19, 0.90) 100%);
}

.buehne .bahn { position: relative; z-index: 2; }

.buehne-inhalt {
  flex: 1;
  display: grid;
  /* MINMAX(0, 1FR) UND NICHT DER STANDARD (3.9.2026).
     Ein Grid-Element hat `min-width: auto` und kann damit nicht unter seine
     Mindestbreite schrumpfen — die Spalte waechst stattdessen ueber den Kasten
     hinaus. Gemessen bei 390 px: Spalte 392,36 px in einem 390er-Kasten, also
     gut zwei Pixel Querlauf allein aus dem Aufmacher. Zwei Pixel sieht niemand,
     aber sie addieren sich zu dem, was andere Abschnitte danebenlegen, und
     zusammen rutscht die Seite. */
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
  padding: clamp(92px, 11vh, 140px) 0 clamp(20px, 3vh, 34px);
}

.buehne-text {
  max-width: 34rem;
  margin-right: auto;  /* links: gelesen wird von links, gehandelt auch */
}
/* =====================================================================


/* DIE MARKE IST AUF DER BÜHNE KEINE PILLE.
   `.marke` trägt auf der hellen Seite einen cremefarbenen Hintergrund. Auf dem
   dunklen Grund wurde daraus ein heller Fleck mit grauer Schrift darin —
   schlechter Kontrast und optisch ein Fremdkörper. Hier ist sie eine
   Versalzeile mit einem Flammenpunkt davor. */
.buehne .marke {
  background: none; padding: 0; border: 0;
  color: rgba(255, 252, 248, 0.72);
  font-size: 0.78rem; font-weight: 600;
  letter-spacing: 0.13em; text-transform: uppercase;
  display: inline-flex; align-items: center; gap: 10px;
}
.buehne .marke::before {
  content: ""; width: 7px; height: 7px; flex: none;
  border-radius: 50%; background: var(--flamme-hell);
}

/* DIE ÜBERSCHRIFT IST KLEINER ALS DIE DER ALTEN SEITE — und das ist der Punkt.
   Bei voller Größe stand sie am Rechner vierzeilig und am Telefon fünfzeilig
   im Bild, und der Belegstreifen mit den drei Zahlen rutschte unter die Falz.
   Damit fehlte oberhalb der Falz genau das, was den Meister zum Weiterlesen
   bringt: die nachrechenbare Zahl. Eine Überschrift, die den Beweis
   verdrängt, ist zu groß, egal wie gut sie aussieht. */
.buehne h1 {
  color: #FFFCF8;
  font-size: clamp(2.1rem, 4.4vw, 3.5rem);
  line-height: 1.02;
  margin: 14px 0 0;
  max-width: 15ch;
  text-wrap: balance;
  letter-spacing: -0.035em;
}
.buehne-sagt {
  margin-top: 16px;
  font-size: clamp(1.02rem, 1.4vw, 1.2rem);
  line-height: 1.6;
  color: rgba(255, 252, 248, 0.88);
  max-width: 46ch;
}
.buehne-sagt strong { color: #FFFCF8; }

/* DIE DREI PUNKTE DER BÜHNE.
   Fett das Ergebnis, mager die Erklärung: Wer nur die fetten Vorderteile liest,
   hat trotzdem die drei Abteilungen mitgenommen. Genau dafür ist die Trennung
   da — auf einem Aufmacher liest kaum jemand den zweiten Halbsatz.

   DER PUNKT DAVOR IST DERSELBE WIE VOR DER MARKE (7 px, flamme-hell). Ein
   Häkchen wäre naheliegender gewesen, aber die Häkchen tragen weiter unten die
   Belegzeile („Sprachgesteuert", „Kein Preis pro Kopf"). Zwei Ränge mit
   demselben Zeichen sind kein Rang mehr.

   `list-style: none` allein genügt nicht: Der Browser nimmt der Liste damit in
   VoiceOver und Safari die Listen-Rolle. `role="list"` wäre die Reparatur —
   hier ist sie unnötig, weil die Punkte über ::before gesetzt werden und die
   Liste ihre Rolle behält. */
.buehne-punkte {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
  max-width: 46ch;
  font-size: clamp(1rem, 1.3vw, 1.14rem);
  line-height: 1.5;
  color: rgba(255, 252, 248, 0.82);
}
.buehne-punkte li {
  position: relative;
  padding-left: 20px;
  text-wrap: pretty;
}
.buehne-punkte li::before {
  content: "";
  position: absolute;
  left: 0;
  /* An der Grundlinie der ERSTEN Zeile, nicht in der Mitte des Kastens: Bei
     zweizeiligen Punkten säße ein zentrierter Punkt zwischen den Zeilen. */
  top: calc(0.75em - 3.5px);
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--flamme-hell);
}
.buehne-punkte b { color: #FFFCF8; font-weight: 700; }

.buehne-tat { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 26px; }
/* Der Rand-Knopf muss auf dunklem Grund gelesen werden — die helle Fassung
   verschwände darauf. */
.buehne-tat .knopf-rand {
  border-color: rgba(255, 252, 248, 0.42);
  color: #FFFCF8;
  background: rgba(255, 252, 248, 0.06);
}
.buehne-tat .knopf-rand:hover { border-color: #FFFCF8; background: rgba(255, 252, 248, 0.14); }

.buehne-haken {
  display: flex; flex-wrap: wrap; gap: 8px 18px;
  margin-top: 22px; font-size: 0.86rem;
  color: rgba(255, 252, 248, 0.76);
}
.buehne-haken span { display: inline-flex; align-items: center; gap: 8px; }
.buehne-haken span::before {
  content: ""; width: 17px; height: 17px; flex: none; border-radius: 50%;
  background: rgba(255, 252, 248, 0.14) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2 L4.7 8.4 L9.5 3.6' fill='none' stroke='%23FFFCF8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/12px no-repeat;
}

/* =====================================================================
   AM TELEFON BLEIBT DAS BILD IM HINTERGRUND (30.8.2026, zweiter Anlauf)

   Zwischendurch war hier gestapelt: Bild oben als Streifen, Text darunter auf
   dunklem Grund. Das löste zwar den Beschnitt, sah aber aus wie zwei Seiten
   übereinander statt wie ein Aufmacher — zu Recht abgelehnt.

   Der Beschnitt wird jetzt an der Wurzel gelöst statt im Layout: Am Telefon
   lädt ein EIGENER Ausschnitt im Verhältnis 3:4 (`hero-hoch`), in dem Schrank
   und Meister vollständig stehen. Ein 16:9-Bild verliert in einem hochkanten
   Fenster unter `object-fit: cover` rund drei Viertel seiner Breite — beim
   iPhone-Format blieb vom Motiv ein Streifen Hemd. Jetzt muss der Browser
   nichts mehr wegwerfen, und das Bild kann bleiben, was es sein soll: der
   Hintergrund.

   DER TEXT SITZT UNTEN, nicht mittig. Oben bleibt das Bild frei, damit man
   Schrank, Gesicht und Telefon sieht; der Schleier läuft von unten hoch und
   lässt das obere Fünftel fast unangetastet.
   ===================================================================== */
@media (max-width: 900px) {
  /* AUCH IM HOCHFORMAT HÄNGT DER AUSSCHNITT RECHTS (31.8.2026).
     „Bereits passend geschnitten" stimmte für das Seitenverhältnis 3:4, nicht
     für ein Telefon: Ein 390 × 844 ist 0,46 breit zu hoch, das Bild 0,74 —
     `cover` zeigt also nur 62 % seiner Breite. Bei 46 % war das der Bereich
     15–77 %, und die Kundin steht bei 85–100 %. Sie fehlte auf jedem Telefon,
     seit es diesen Ausschnitt gibt.
     Am rechten Rand sind es 38–100 %: der Meister ganz, das Tablet in seinen
     Händen und die Kundin daneben. Der Schrank fällt am Telefon heraus — das
     ist die richtige Reihenfolge, denn das Gespräch TRÄGT die Szene, der
     Schrank erklärt sie nur. Er steht zwei Bildschirme weiter unten im
     Vergleich ohnehin noch einmal. */
  /* Die Buehne erbt von der allgemeinen Abschnittsregel 40 px oben und unten.
     Am Rechner verschwinden sie in `min-height: 100svh`; am Telefon sind es
     80 px reiner Leerraum ueber und unter einem bildschirmfuellenden Bild. */
  .buehne { padding: 0; }
  .buehne-bild { object-position: 100% center; }
  .buehne-video { display: none; }

  /* DER SCHLEIER SETZT DORT EIN, WO DER TEXT BEGINNT — und zwar hart.
     Beim ersten Versuch stand er bei 46 % erst auf 0,60, und die Markenzeile
     lag darüber auf hellen Sicherungsautomaten: weiße Versalien auf weißem
     Kunststoff. Oben bleibt es hell (das Bild soll zu sehen sein), ab einem
     Drittel wird konsequent abgedunkelt. */
  .buehne::after {
    background:
      linear-gradient(180deg,
        rgba(24, 21, 19, 0.46) 0%,
        rgba(24, 21, 19, 0.20) 13%,
        rgba(24, 21, 19, 0.78) 33%,
        rgba(24, 21, 19, 0.94) 58%,
        rgba(24, 21, 19, 0.97) 100%);
  }

  /* JEDER PIXEL HÖHE ZOOMT DAS BILD WEITER HINEIN (31.8.2026).
     Das ist der Zusammenhang, den ich zweimal übersehen habe: Das Bild liegt
     unter `object-fit: cover` über der GANZEN Bühne. Wird der Text höher, wird
     die Bühne höher, und weil das Bild breiter als hoch ist, muss der Browser
     seitlich immer mehr wegschneiden. Gemessen: Bei 1.147 px Bühnenhöhe blieben
     45 % der Bildbreite übrig — ein Gesicht in Großaufnahme, ohne Kundin, ohne
     Tablet.
     Die Höhe ist damit kein Geschmacksthema, sondern die Stellschraube am
     Bildausschnitt. Deshalb steht der obere Abstand jetzt bei 12 vh statt 22. */
  .buehne-inhalt {
    align-items: end;
    padding: clamp(64px, 12vh, 140px) 0 clamp(12px, 1.6vh, 20px);
  }
  .buehne-text { margin-right: 0; max-width: none; }
  .buehne .marke { font-size: 0.72rem; letter-spacing: 0.1em; }
  .buehne h1 { font-size: clamp(1.85rem, 8vw, 2.3rem); margin-top: 10px; max-width: none; }
  .buehne-sagt { font-size: 0.94rem; margin-top: 12px; }
  .buehne-punkte { font-size: 0.95rem; gap: 9px; margin-top: 10px; line-height: 1.45; }
  /* AM TELEFON BLEIBEN NUR DIE DREI AUSSAGEN, NICHT IHRE ERLÄUTERUNG.
     Mit Erläuterung wurde die Bühne rund 1.400 px hoch — und weil das Bild sie
     unter `cover` füllen muss, blieb vom Motiv ein einzelnes Gesicht in
     Großaufnahme übrig: keine Kundin, kein Tablet, kein Schrank. Die Höhe des
     Textes hat also das Bild zerstört, nicht der Bildausschnitt.
     Was hier wegfällt, steht zwei Bildschirme weiter unten vollständig in den
     drei Abteilungskarten. Was bleibt, sind die drei Sätze, für die jemand
     stehen bleibt. */
  .buehne-punkte .dazu { display: none; }
  .buehne-punkte b { font-weight: 650; }
  .buehne-tat { margin-top: 20px; gap: 10px; }
  .buehne-tat .knopf { width: 100%; justify-content: center; }
  /* DIE HÄKCHENZEILE FÄLLT AM TELEFON GANZ WEG, nicht erst auf kurzen
     Geräten. Sie kostete 101 px — und 101 px Bühnenhöhe sind rund vier
     Prozent Bildbreite, die der Beschnitt frisst. Dieselben vier Punkte
     stehen weiter unten auf der Seite; die Kundin im Bild steht nur hier. */
  .buehne-haken { display: none; }
}

/* AUF KURZEN BILDSCHIRMEN WEICHT DIE HÄKCHENZEILE, NICHT DER KNOPF.
   Gemessen: Auf einem 390 × 844 endet sie bei 838 px und passt gerade. Auf
   einem 360 × 740 — und das ist kein seltenes Gerät — ragt sie 154 px hinaus,
   und mit ihr wäre der zweite Knopf halb abgeschnitten.
   Was hier wegfällt, ist Belegmaterial („Sprachgesteuert", „Eine Pauschale je
   Betrieb"). Dieselben vier Punkte stehen weiter unten auf der Seite. Was
   bleibt, ist der Weg zum Handeln — und der gehört auf den ersten Bildschirm.
   Die Abfrage geht über die HÖHE, nicht über die Breite: Ein breites Telefon
   im Querformat hat dasselbe Problem. */
@media (max-width: 900px) and (max-height: 800px) {
  /* `.buehne-haken` ist am Telefon inzwischen ohnehin fort — siehe oben. */
  .buehne-sagt { font-size: 0.9rem; margin-top: 10px; }
  .buehne-punkte { font-size: 0.88rem; gap: 7px; margin-top: 9px; }
  .buehne-inhalt { padding-top: clamp(52px, 9vh, 110px); }
}

/* DER BELEGSTREIFEN klebt an der Unterkante der Bühne — die drei Zahlen aus
   dem alten Aufmacher. Sie bleiben oberhalb der Falz, weil sie der Grund sind,
   überhaupt weiterzulesen: Er rechnet nach, und er kann es. */
.buehne-beleg {
  position: relative; z-index: 2;
  border-top: 1px solid rgba(255, 252, 248, 0.16);
  background: rgba(20, 18, 16, 0.55);
  backdrop-filter: blur(6px);
  padding: clamp(14px, 2vh, 22px) 0;
}
.buehne-beleg-raster {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(14px, 3vw, 40px); align-items: baseline;
}
@media (max-width: 700px) {
  .buehne-beleg-raster { grid-template-columns: 1fr; gap: 10px; }
  .buehne-beleg { padding: 14px 0; }
}
/* MITTIG STATT AUF DER GRUNDLINIE (31.8.2026).
   `align-items: baseline` legt die erste Textzeile auf die Grundlinie der
   grossen Zahl — die zweite Zeile hängt darunter, und der Block sitzt optisch
   zu tief. Bei einer Zahl von 33 px und zwei Textzeilen von zusammen 36 px
   fällt das auf: Es sieht aus, als wäre der Text abgesackt.
   `center` stellt beide Zeilen symmetrisch neben die Zahl. */
.buehne-zahl { display: flex; align-items: center; gap: 10px; }
.buehne-zahl b {
  font-size: clamp(1.5rem, 2.6vw, 2.05rem); font-weight: 800;
  letter-spacing: -0.04em; color: var(--flamme-hell);
  font-variant-numeric: tabular-nums; line-height: 1;
}
/* Die EINHEIT ist klein — „h", „€". Sie ist ein Anhang an die Zahl. */
.buehne-zahl b .bz-einheit { font-size: 0.62em; font-weight: 700; }
/* DER PFEIL ist klein, die Zahlen dahinter NICHT. Vorher stand die zweite Zahl
   in der Einheiten-Position und schrumpfte auf 0,62em mit — aus „14 wird 1"
   wurde eine große 14 mit einem unleserlichen Anhängsel. */
.buehne-zahl b .bz-pfeil {
  font-size: 0.66em; font-weight: 600;
  color: rgba(255, 252, 248, 0.55);
  margin: 0 0.14em; letter-spacing: 0;
}
.buehne-beleg-kopf {
  margin: 0 0 12px; font-size: 0.78rem; font-weight: 600;
  letter-spacing: 0.11em; text-transform: uppercase;
  color: rgba(255, 252, 248, 0.5);
}
.buehne-zahl p {
  margin: 0; font-size: 0.87rem; line-height: 1.35;
  color: rgba(255, 252, 248, 0.74);
}
.buehne-zahl p em { font-style: normal; color: rgba(255, 252, 248, 0.5); display: block; }
.buehne-beleg-fuss {
  margin: 12px 0 0; font-size: 0.82rem; color: rgba(255, 252, 248, 0.55);
}
.buehne-beleg-fuss a { color: rgba(255, 252, 248, 0.86); }

/* DER KOPF SCHWEBT NUR GANZ OBEN — DANACH IST ER EINE LEISTE (31.8.2026).
   Hier stand `position: absolute`. Damit war der Kopf kein klebendes Element,
   sondern ein durchsichtiges Stück Bühne: Er scrollte weg und kam beim
   Zurückscrollen als transparente Fläche über hellem Inhalt wieder — mit
   weißer Schrift darauf. Junaid: „dann wird das obere Menü praktisch
   transparent, und dadurch ist das Logo nicht mehr richtig leserlich."

   OBEN SOLL ER DURCHSICHTIG BLEIBEN, denn dort liegt das dunkle Bühnenbild
   dahinter und trägt die weiße Schrift. Sobald gescrollt wird — `gescrollt`
   setzt web.js ab 8 Pixeln —, bekommt er einen eigenen dunklen Grund. Damit
   ist er ab dem ersten Pixel Bewegung eine echte Leiste, unter der der Inhalt
   durchläuft, statt eine Scheibe, durch die man ihn liest. */
body.hat-buehne .kopf {
  position: sticky; top: 0; z-index: 60;
  background: transparent; border-bottom-color: transparent;
  backdrop-filter: none;
  /* DER NEGATIVE ABSTAND IST DER GANZE PUNKT (31.8.2026, zweiter Anlauf).
     Ein klebender Kopf nimmt Platz im Fluss ein. Ohne diese Zeile ruecht die
     Buehne um 77 Pixel nach unten, und oben bleibt ein cremefarbener Streifen —
     auf dem die weisse Menueschrift steht. Gemessen: Kontrast 1,0, also weiss
     auf weiss. Junaid: „jetzt ist auf dem Desktop, dass man das Menue nicht
     mehr lesen kann."

     Vorher stand hier `position: absolute`. Das loeste dasselbe Problem, hatte
     aber einen anderen Preis: Der Kopf scrollte weg und kam beim Zurueckscrollen
     als durchsichtige Flaeche ueber hellem Inhalt wieder.

     `sticky` PLUS negativer Abstand hat beides: Er liegt ueber dem Bild wie
     vorher, und er bleibt trotzdem oben stehen. Kein Wechsel der
     Positionierungsart beim Scrollen, also auch kein Sprung. */
  margin-bottom: calc(-1px - var(--kopf-hoehe));
}

/* EIN VERLAUF STATT EINES BALKENS.
   Der Kopf liegt über dem Bühnenbild, und das Bild ist oben nicht überall
   dunkel: Gemessen liegt die Helligkeit dort zwischen 71 und 149 von 255 — je
   nach Bildschirmbreite und Ausschnitt. Weisse Schrift auf 149 ist nicht mehr
   lesbar, und ob es trägt, hinge damit vom Zufall des Ausschnitts ab.

   Der Verlauf ist oben dunkel und läuft nach unten auf null. Als Balken sieht
   man ihn nicht — er hat keine Kante —, aber er macht die Schrift von der
   Bildstelle unabhängig. Genau dafür sind Verläufe in Aufmachern da.

   NUR IM DURCHSICHTIGEN ZUSTAND: Sobald gescrollt wird, hat der Kopf seinen
   eigenen hellen Grund und dunkle Schrift; ein Verlauf darüber wäre dann ein
   Schmutzrand. */
body.hat-buehne .kopf:not(.gescrollt)::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: calc(var(--kopf-hoehe) + 44px);
  background: linear-gradient(
    rgba(20, 16, 13, 0.62) 0%,
    rgba(20, 16, 13, 0.34) 55%,
    rgba(20, 16, 13, 0) 100%);
  pointer-events: none;
  z-index: -1;
}
/* KEINE ZWEITE `gescrollt`-REGEL HIER. Beim ersten Anlauf stand an dieser
   Stelle eine mit dunklem Grund — und weiter unten (Zeile ~1395) gab es die
   passende längst: Sobald gescrollt wird, ist der Kopf wieder die normale
   helle Leiste mit dunkler Schrift. Zwei Regeln für denselben Zustand sind
   keine Absicherung, sondern ein Wettlauf: Die spätere gewinnt, und wer die
   frühere liest, glaubt, sie täte etwas.
   Kaputt war nur die eine Zeile darüber — `position: absolute`. */
body.hat-buehne .kopf a { color: #FFFCF8; }
body.hat-buehne .kopf .nav-anmelden { border-color: rgba(255, 252, 248, 0.42); }
/* Das Hamburger-Zeichen ist ein <svg> mit fest eingetragener dunkler Linie —
   auf der Bühne wäre es unsichtbar. Umgefärbt wird über einen Filter statt
   über das Attribut, weil das Attribut im HTML steht und dort für die helle
   Seite richtig ist. */
body.hat-buehne .nav-schalter svg { filter: invert(1) brightness(2); }

/* WEISS AUF WEISS BEIM UEBERFAHREN.
   `.hauptnav a:hover` setzt einen sandfarbenen Grund und dunkle Schrift — auf
   der hellen Seite richtig. Auf der Buehne ist die Schrift aber weiss, und die
   Regel faerbte nur den GRUND um: Der Eintrag verschwand unter dem Zeiger,
   genau in dem Moment, in dem jemand ihn anklicken will.
   Hier bekommt er stattdessen eine helle Fuellung mit geringer Deckkraft und
   behaelt seine weisse Schrift. Sobald gescrollt wird und der Kopf seinen
   eigenen Grund hat, gilt wieder die normale Regel. */
body.hat-buehne .kopf:not(.gescrollt) .hauptnav a:hover,
body.hat-buehne .kopf:not(.gescrollt) .hauptnav a[aria-current="page"] {
  background: rgba(255, 252, 248, 0.16);
  color: #FFFCF8;
}

/* UND AM TELEFON WEISS AUF WEISS IM AUFGEKLAPPTEN MENÜ (31.8.2026).
   Unter 1060 px ist `.hauptnav` kein Streifen im Kopf mehr, sondern eine
   WEISSE Klappe darunter. Die Schrift darin ist aber die des Kopfes — auf der
   Bühne und auf der Registrierseite also weiss. Wer den Burger antippte, sah
   eine leere weisse Fläche mit unsichtbaren Einträgen.

   Derselbe Fehler wie beim Überfahren eine Regel weiter oben, nur eine
   Bildschirmgrösse tiefer: Ich habe die Schriftfarbe am KOPF gesetzt und nicht
   daran gedacht, dass dasselbe Element am Telefon auf einem anderen Grund
   liegt. */
@media (max-width: 1060px) {
  body.hat-buehne .kopf .hauptnav.offen a,
  body.seite-zugang .kopf .hauptnav.offen a {
    color: var(--tinte);
  }
  body.hat-buehne .kopf .hauptnav.offen a:hover,
  body.seite-zugang .kopf .hauptnav.offen a:hover {
    background: var(--sand);
    color: var(--tinte);
  }
  body.hat-buehne .kopf .hauptnav.offen .nav-anmelden,
  body.seite-zugang .kopf .hauptnav.offen .nav-anmelden {
    border-color: var(--linie-stark);
    background: var(--weiss);
  }
}
/* Der Knopf selbst trägt auf der hellen Seite einen weißen Grund. Auf der
   Bühne war das ein leuchtender Kreis oben rechts — das auffälligste Element
   im Bild, und es ist nur ein Menü. */
body.hat-buehne .nav-schalter {
  background: rgba(255, 252, 248, 0.10);
  border-color: rgba(255, 252, 248, 0.34);
}
body.hat-buehne .kopf.gescrollt .nav-schalter { background: var(--weiss); border-color: var(--linie-stark); }

/* SOBALD GESCROLLT WIRD, ist der Kopf wieder der normale.
   Ohne diese Regel bliebe er durchsichtig und weiß über der hellen Seite —
   also unlesbar. `.gescrollt` setzt web.js ohnehin schon. */
body.hat-buehne .kopf.gescrollt {
  position: sticky;
  background: rgba(253, 252, 251, 0.92);
  backdrop-filter: saturate(1.4) blur(9px);
  border-bottom-color: var(--linie);
}
body.hat-buehne .kopf.gescrollt a { color: inherit; }
body.hat-buehne .kopf.gescrollt .nav-anmelden { border-color: var(--linie-stark); }
body.hat-buehne .kopf.gescrollt .nav-schalter svg { filter: none; }

@media (prefers-reduced-motion: reduce) {
  .buehne-video { display: none; }
}

/* --- Der Tagesstand auf dem Handy-Schirm (30.8.2026) ---------------------
   Er füllt die Fläche, die vorher leer war, und er tut es mit dem, was die
   App wirklich führt: gebuchte Stunden, Fotos an der Baustelle, erfasstes
   Material. Alles in `em`, weil der ganze Schirm über eine Container-Anfrage
   mitskaliert — feste Pixelwerte würden bei jeder anderen Bildbreite
   auseinanderlaufen. */

/* Die Netz-Zeile belegt, was der Abschnitt daneben behauptet: Sie läuft im
   Keller eines Altbaus weiter. Der Punkt ist moosgrün — dieselbe Farbe, die
   in der ganzen Oberfläche „erledigt" bedeutet. */

/* --- Die drei Buchungen in der dunklen Karte (30.8.2026) -----------------
   Sie füllen nicht nur die Fläche, die vorher leer war. Sie machen den
   Vergleich vollständig: links vierzehn Eingaben, rechts drei Buchungen aus
   EINEM Satz. Ein behauptetes „legt drei Buchungen an" neben einer leeren
   Kartenhälfte wirkt schwächer als die Liste selbst. */
.umkehr-buchungen {
  margin-top: 20px; padding-top: 16px;
  border-top: 1px solid rgba(255, 252, 248, 0.14);
}
.ub-kopf {
  margin: 0 0 12px; font-size: 0.74rem; font-weight: 600;
  letter-spacing: 0.11em; text-transform: uppercase;
  color: rgba(255, 252, 248, 0.46);
}
.ub-zeile {
  display: flex; align-items: baseline; gap: 12px;
  padding: 9px 0; border-top: 1px solid rgba(255, 252, 248, 0.09);
}
.ub-zeile:first-of-type { border-top: 0; padding-top: 0; }
.ub-zeile b {
  flex: none; min-width: 3.6em;
  font-size: 1rem; font-weight: 750; color: var(--flamme-hell);
  font-variant-numeric: tabular-nums;
}
.ub-zeile span { font-size: 0.92rem; line-height: 1.4; color: rgba(255, 252, 248, 0.8); }

/* =====================================================================
   DIE PROBE AUF DER BÜHNE (30.8.2026)

   Das Video zeigt einen Mann, der in sein Telefon spricht. Was daraus
   entsteht, war nicht zu sehen — man sah eine Stimmung und keine Software.
   Diese Karte läuft daneben mit: der Satz erscheint, darunter baut sich die
   Buchung auf, dann fängt es von vorne an.

   SIE LIEGT UNTEN LINKS, über dem Boden mit der Kabeltrommel. Nicht über dem
   Mann: Sein Gesicht und seine Hände sind der Grund, warum das Bild wirkt.

   REIN IN CSS. Kein Skript, keine Kennungen, kein Zusammenstoß mit der großen
   Vorführung weiter unten (die trägt `vf-` und wird von web.js gesteuert).
   ===================================================================== */

.buehne-probe {
  position: absolute; z-index: 2;
  /* RECHTS, UNTER DEM MANN. Er spricht oben rechts in sein Telefon; was daraus
     wird, steht direkt darunter. Der Weg vom Telefon zur Buchung ist damit
     eine senkrechte Strecke von zwanzig Zentimetern statt einer Diagonale
     quer über den Bildschirm. */
  right: max(24px, calc((100vw - var(--breit)) / 2 + 24px));
  /* GENUG ABSTAND ZUM BELEGSTREIFEN. Bei 19vh schnitt der Streifen die untere
     Kante der Karte ab — er kommt später im Dokument, trägt denselben
     z-index und übermalt sie damit. Statt am z-index zu drehen (und die Karte
     über einen Streifen zu legen, der oberhalb der Falz stehen MUSS) bekommt
     sie schlicht ihren Platz. */
  bottom: clamp(200px, 24vh, 280px);
  /* 430 STATT 330 (3.9.2026). Gemessen bei 1440 px: Der zitierte Satz war
     292 px breit und brach auf drei Zeilen, waehrend links das h1 mit 525 px
     stand. Das Verhaeltnis liess den Kasten wie eine Randnotiz aussehen — dabei
     ist er das einzige BEWEISSTUECK des Aufmachers. Der Platz ist da: Die Bahn
     misst 1220, das h1 nimmt 525.
     `max-width: 34vw` bleibt die Bremse fuer schmale Fenster. */
  width: 430px; max-width: 34vw;
  padding: 16px 18px 18px;
  border-radius: var(--rund);
  background: rgba(22, 19, 17, 0.72);
  backdrop-filter: blur(14px) saturate(1.2);
  border: 1px solid rgba(255, 252, 248, 0.16);
  box-shadow: 0 24px 50px -22px rgba(0, 0, 0, 0.7);
}
/* UNTER 1180 PX WIRD SIE ZUR RUHENDEN FASSUNG, NICHT ZU NICHTS (3.9.2026).
   Bisher stand hier `display: none`. Neben dem Mann ist wirklich kein Platz —
   die Karte haette entweder sein Gesicht oder die Ueberschrift verdeckt. Nur:
   Damit sah auf dem Handy NIEMAND das Beweisstueck, und das Handy ist das
   Geraet, auf dem diese Seite gelesen wird.

   Statt zu verschwinden loest sie sich aus der absoluten Lage und stellt sich
   unter den Text. Ohne den gesprochenen Satz und ohne das Blinklicht: Beides
   lebt davon, NEBEN dem sprechenden Mann zu stehen. Was bleibt, sind die drei
   Zeilen, auf die es ankommt — und die stehen sofort da, ohne Animation. */
@media (max-width: 1180px) {
  .buehne-probe {
    /* `order` IST HIER NOETIG, NICHT KOSMETIK: Im Markup steht die Probe VOR
       dem Text — sie muss oben rechts schweben koennen. Statisch gesetzt stuende
       sie damit ueber der Ueberschrift. `.buehne` ist eine Flex-Spalte, also
       kostet die richtige Reihenfolge eine Zeile statt eines Umbaus im HTML. */
    order: 1;
    position: static;
    width: min(100% - 48px, 560px); max-width: none;
    margin: 0 auto clamp(18px, 3vh, 30px);
    padding: 14px 16px 16px;
    backdrop-filter: none; background: rgba(22, 19, 17, 0.55);
  }
  .buehne-probe .bp-label,
  .buehne-probe .bp-satz { display: none; }
  .buehne-probe .bp-karte { margin-top: 0; padding-top: 0; border-top: 0; }
  /* Ohne Animation: Wer hier landet, hat den Aufbau nicht gesehen und soll
     nicht auf ihn warten. */
  .buehne-probe .bp-zeile { opacity: 1; transform: none; animation: none; }
}

.bp-label {
  display: flex; align-items: center; gap: 8px; margin: 0 0 10px;
  font-size: 0.72rem; font-weight: 600; letter-spacing: 0.1em;
  text-transform: uppercase; color: rgba(255, 252, 248, 0.6);
}
.bp-punkt {
  width: 7px; height: 7px; border-radius: 50%; background: var(--flamme-hell);
  animation: bp-puls 1.6s ease-in-out infinite;
}
@keyframes bp-puls { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.35; transform: scale(0.75); } }

/* Der Satz wird von links aufgedeckt, wie beim Sprechen. `clip-path` statt
   Breite: Es läuft auf der Grafikkarte und löst kein Umbrechen aus. */
/* EINMAL, DANN STEHEN BLEIBEN (3.9.2026).
   Hier stand `11s infinite` — und in denselben elf Sekunden lief `bp-auf` fuer
   die drei Belegzeilen. Aus den Keyframes gerechnet: Der Beleg war von 0 bis
   34 % unsichtbar und ab 92 % wieder, also rund vier von elf Sekunden. Ein
   Drittel aller Momente zeigte der Kasten nichts oder einen halben Satz.

   Nachgesehen mit zwei Bildschirmaufnahmen, drei und dreiunddreissig Sekunden
   nach dem Laden: beide leer. Das war kein Pech.

   Der Kasten traegt das einzige konkrete Beweisstueck des Aufmachers — sechs
   Positionen, 2.480 €, bereit zur Unterschrift. Es endlos wegzublenden heisst,
   den Beweis wegzublenden. Dazu zieht eine Schleife das Auge dauerhaft von dem
   Text ab, der daneben gelesen werden soll.

   Jetzt laeuft es EINMAL und bleibt stehen. Der Eindruck „hier spricht jemand"
   entsteht beim ersten Blick; danach steht die Aussage da. `forwards` haelt den
   LETZTEN Keyframe, deshalb enden beide Laeufe jetzt im sichtbaren Zustand —
   mit dem alten 100-%-Keyframe (versteckt) waere die Karte fuer immer leer
   geblieben. */
.bp-satz {
  margin: 0; font-size: 0.92rem; line-height: 1.45; font-weight: 600;
  color: #FFFCF8;
  animation: bp-sprechen 2.4s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes bp-sprechen {
  from { clip-path: inset(0 100% 0 0); }
  to   { clip-path: inset(0 0 0 0); }
}

.bp-karte {
  margin-top: 14px; padding-top: 13px;
  border-top: 1px solid rgba(255, 252, 248, 0.14);
}
.bp-kopf {
  margin: 0 0 9px; font-size: 0.7rem; font-weight: 600;
  letter-spacing: 0.1em; text-transform: uppercase;
  color: rgba(255, 252, 248, 0.45);
}
.bp-zeile {
  display: flex; align-items: baseline; gap: 10px; padding: 5px 0;
  opacity: 0;
  animation: bp-auf 0.5s ease-out forwards;
}
.bp-zeile b {
  flex: none; min-width: 3.2em; font-size: 0.9rem; font-weight: 750;
  color: var(--flamme-hell); font-variant-numeric: tabular-nums;
}
.bp-zeile span { font-size: 0.86rem; line-height: 1.35; color: rgba(255, 252, 248, 0.82); }
.bp-haken { color: var(--moos) !important; }
/* Gestaffelt: erst die Stunden, dann das Material, dann die Bestätigung.
   Der Abstand ist bewusst spürbar — es soll aussehen, als denke jemand mit. */
/* Die Verzoegerungen setzen jetzt AUF dem Satz auf: Er braucht 2,4 s, dann
   kommen die drei Zeilen im Abstand von gut einer halben Sekunde. Nach rund
   vier Sekunden steht die Karte vollstaendig — und bleibt so. */
.bp-z1 { animation-delay: 2.4s; }
.bp-z2 { animation-delay: 2.95s; }
.bp-z3 { animation-delay: 3.55s; }
@keyframes bp-auf {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

/* Wer reduzierte Bewegung eingestellt hat, sieht die Karte fertig — nicht leer.
   Ohne diese Regel bliebe `.bp-zeile` bei `opacity: 0` stehen und die Karte
   wäre für genau die Leute leer, die ohnehin schon eingeschränkt sind. */
@media (prefers-reduced-motion: reduce) {
  .bp-satz, .bp-zeile, .bp-punkt { animation: none; }
  .bp-satz { clip-path: none; }
  .bp-zeile { opacity: 1; transform: none; }
}

/* =====================================================================
   DIE DREI PREISKARTEN RICHTEN SICH ANEINANDER AUS (30.8.2026)

   Vorher standen die drei Preise auf drei verschiedenen Höhen, und man sah es
   sofort, ohne benennen zu können, warum es schief wirkt:

     · Die Unterzeile des Backendbüros bricht auf zwei Zeilen um („die andere
       Hälfte · die Verwaltung läuft von selbst"), die des Marketingbüros nicht.
       Damit rutschte der zweite Preis eine Zeile tiefer als der erste.
     · Beim Komplettbüro steht über der Überschrift eine Marke. Sie schob die
       ganze Karte um ihre eigene Höhe nach unten.
     · Die Nutzen-Sätze endeten dadurch auf drei verschiedenen Höhen.

   Drei Preise, die nicht auf einer Linie liegen, sind schwer zu vergleichen —
   und Vergleichen ist das Einzige, wofür dieser Block da ist.

   GELÖST ÜBER DIE STRUKTUR, nicht über feste Höhen: Die Marke wird aus dem
   Fluss genommen und über die Kante gelegt, alle drei Karten bekommen dafür
   denselben oberen Innenabstand, die Unterzeile bekommt Platz für zwei Zeilen,
   und der Nutzen-Satz wird nach unten geschoben. Feste Pixelhöhen würden beim
   ersten längeren Wort wieder brechen.
   ===================================================================== */

.preiskarten { align-items: stretch; }
.preiskarten .karte {
  position: relative;
  display: flex; flex-direction: column;
  /* Platz für die Marke — in ALLEN drei, nicht nur in der einen, die eine hat. */
  padding-top: 40px;
}
.preiskarten .karte > .marke {
  position: absolute; top: -15px; left: 28px;
  margin: 0;
  box-shadow: 0 6px 16px -6px rgba(90, 55, 25, 0.35);
}
/* Die Unterzeile hält zwei Zeilen frei. Damit steht der Preis in jeder Karte
   auf derselben Linie, egal wie lang der Satz ist.

   ANGESPROCHEN ÜBER `h3 +` UND NICHT ÜBER `:first-of-type`.
   `:first-of-type` meint den ersten seiner ELEMENTART unter den Geschwistern,
   nicht den ersten mit dieser Klasse. In der Komplettbüro-Karte ist das erste
   <p> die Marke — die Regel griff dort also überhaupt nicht, und ausgerechnet
   die hervorgehobene Karte hielt keine zwei Zeilen frei. Gemessen: 43px, 54px,
   27px, und die drei Preise streuten über 29 Pixel.

   `2lh` sind genau zwei Zeilenhöhen DIESES Elements — kein geratener em-Wert,
   der beim nächsten Schriftwechsel wieder danebenliegt. Der Pixelwert davor
   ist der Rückfall für Browser ohne `lh`. */
.preiskarten .karte > h3 + .hinweiszeile {
  min-height: 54px;
  min-height: 2lh;
  margin-bottom: 4px;
}
.preiskarten .karte > .rechner-betrag { margin-top: 0; }
/* Der Nutzen-Satz sitzt am Fuß der Karte — dadurch schließen alle drei unten
   bündig ab, auch wenn oben unterschiedlich viel steht. */
.preiskarten .karte-nutzen { margin-top: auto; padding-top: 14px; }

@media (max-width: 720px) {
  .preiskarten .karte { padding-top: 34px; }
  .preiskarten .karte > .hinweiszeile:first-of-type { min-height: 0; }
}

/* --- Die Strecke vom Telefon zur Buchung (30.8.2026) ---------------------
   Das Bild zeigt einen Mann, der spricht. Die Karte darunter zeigt, was
   entsteht. Was fehlte, war der Zusammenhang: Ein Punkt löst sich oben — dort,
   wo er das Telefon hält — läuft die Linie herunter und kommt an, wenn die
   erste Buchung erscheint.

   SIE HÄNGT AN DER KARTE, NICHT AN DER BÜHNE. Beim ersten Versuch war sie ein
   eigener Kasten mit eigenem `bottom` — und weil die Karte denselben Wert
   trägt, lag die Linie exakt HINTER ihr statt darüber. `bottom: 100%` an einem
   Pseudo-Element der Karte heißt „direkt oberhalb von mir", ganz gleich wie
   hoch die Karte gerade ist.

   DIESELBEN ELF SEKUNDEN wie die Karte. Zwei Animationen mit verschiedenen
   Dauern sehen am Anfang synchron aus und laufen im Lauf einer Minute
   auseinander; dann trifft der Punkt ein, während nichts passiert. */
.buehne-probe::before,
.buehne-probe::after {
  content: ""; position: absolute; pointer-events: none;
  left: 190px;   /* unter der Hand mit dem Telefon */
}
.buehne-probe::before {
  bottom: 100%; width: 2px; height: clamp(140px, 21vh, 230px);
  background: linear-gradient(180deg,
    rgba(242, 106, 46, 0) 0%,
    rgba(242, 106, 46, 0.5) 30%,
    rgba(242, 106, 46, 0.5) 100%);
}
.buehne-probe::after {
  bottom: 100%; width: 9px; height: 9px; margin-left: -3.5px;
  border-radius: 50%; background: var(--flamme-hell);
  box-shadow: 0 0 14px 3px rgba(242, 106, 46, 0.5);
  animation: bs-lauf 11s cubic-bezier(0.55, 0, 0.5, 1) infinite;
}
/* Der Punkt startet, wenn der Satz zu Ende gesprochen ist (22 % des Takts),
   und kommt unten an, wenn die erste Buchungszeile erscheint (34 %). */
@keyframes bs-lauf {
  0%, 22%   { bottom: calc(100% + clamp(140px, 21vh, 230px)); opacity: 0; }
  26%       { opacity: 1; }
  34%       { bottom: 100%; opacity: 1; }
  42%, 100% { bottom: 100%; opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .buehne-probe::before, .buehne-probe::after { display: none; }
}


/* =====================================================================
   DIE REGISTRIERSEITE

   ZWEI SPALTEN, JEDE MIT EINER AUFGABE: links der Grund (dunkel, mit der
   echten Aufnahme dahinter), rechts die Handlung (weiss, zwei Felder, ein
   Knopf). Ein zentrierter Kasten auf leerem Grund waere naheliegend — und die
   Fassung, bei der man sich fragt, warum man hier eigentlich unterschreiben
   soll. Der Grund gehoert NEBEN die Handlung.

   KEINE ZWEITE IDENTITAET. Der Entwurfsassistent schlug Glasoptik, Blau und
   Poppins vor. Uebernommen sind seine Formularregeln — sichtbare Beschriftung,
   Fehler am Feld statt oben gesammelt, Ladezustand am Knopf, Fokus ins erste
   beanstandete Feld. Die Optik bleibt Flamme, Tinte, Sand und der
   Systemzeichensatz, weil eine Seite, die anders aussieht als der Rest, wie ein
   fremdes Produkt wirkt — und ausgerechnet an der Stelle, an der jemand seine
   Adresse hinterlaesst.
   ================================================================== */
.seite-zugang { background: var(--tinte); }

/* DER KOPF STEHT DARÜBER UND KLEBT (position: sticky, 76 px hoch). Die
   Zweiteilung darf deshalb nicht mehr 100 svh verlangen: Zusammen wären es
   100 svh + 76 px, und der Fuß der Karte läge unter der Falz — auf einem
   Bildschirm, auf dem alles hineingepasst hätte.

   AUF DUNKLEM GRUND WIRD DER KOPF HELL. Er ist sonst cremefarben mit dunkler
   Schrift; über der Tinte des linken Feldes wäre das ein weißer Balken, der die
   Seite oben abschneidet. */
.seite-zugang .kopf {
  background: rgba(36, 28, 22, 0.82);
  border-bottom: 1px solid rgba(255, 252, 248, 0.12);
}
.seite-zugang .kopf .wortmarke { color: var(--weiss); }
.seite-zugang .hauptnav a { color: rgba(255, 252, 248, 0.78); }
.seite-zugang .hauptnav a:hover { color: var(--weiss); background: rgba(255, 252, 248, 0.12); }
/* Am Telefon gilt die Ausnahme weiter unten: Die aufgeklappte Klappe ist
   weiss, die Schrift darin muss dunkel sein. */
.seite-zugang .nav-anmelden {
  border-color: rgba(255, 252, 248, 0.42);
  color: var(--weiss);
  background: rgba(255, 252, 248, 0.06);
}
.seite-zugang .nav-schalter svg path { stroke: #FFFCF8; }

.zugang {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  min-height: calc(100svh - 76px);
}

/* --- Links: der Grund ---------------------------------------------------- */
.zugang-grund {
  position: relative;
  display: flex;
  align-items: center;
  overflow: hidden;
  background: var(--tinte);
  padding: clamp(36px, 6vh, 72px) clamp(24px, 5vw, 76px);
}
/* Das Bild traegt die Stimmung und darf den Text nicht angreifen: stark
   abgedunkelt, und der Verlauf laeuft zur Textseite hin zu. */
.zugang-bild {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: 100% center;
  opacity: 0.34;
}
.zugang-grund::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(105deg,
    rgba(36, 28, 22, 0.94) 0%,
    rgba(36, 28, 22, 0.80) 46%,
    rgba(36, 28, 22, 0.42) 100%);
}
.zugang-grund-inhalt { position: relative; z-index: 1; max-width: 30rem; }

.zugang-titel {
  margin: 0;
  font-size: clamp(2rem, 3.6vw, 3.05rem);
  font-weight: 800;
  letter-spacing: -0.042em;
  line-height: 1.03;
  color: var(--weiss);
  text-wrap: balance;
}
.zugang-vorspann {
  margin: 18px 0 0;
  font-size: clamp(1rem, 1.25vw, 1.12rem);
  line-height: 1.6;
  color: rgba(255, 252, 248, 0.82);
  max-width: 42ch;
}

/* Drei Zahlen statt drei Versprechen. Die Ziffer traegt, das Wort erklaert. */
.zugang-fakten {
  margin: clamp(26px, 5vh, 44px) 0 0;
  display: grid;
  gap: 18px;
}
.zugang-fakten > div {
  display: grid;
  grid-template-columns: 7.5rem minmax(0, 1fr);
  align-items: baseline;
  gap: 16px;
  padding-top: 15px;
  border-top: 1px solid rgba(255, 252, 248, 0.16);
}
.zugang-fakten dt {
  font-size: 1.16rem; font-weight: 800; letter-spacing: -0.03em;
  color: var(--flamme-hell);
  font-variant-numeric: tabular-nums;
}
.zugang-fakten dd {
  margin: 0; font-size: 0.96rem; line-height: 1.5;
  color: rgba(255, 252, 248, 0.78);
}
.zugang-beleg {
  margin: clamp(26px, 5vh, 42px) 0 0;
  font-size: 0.88rem;
  color: rgba(255, 252, 248, 0.6);
}
.zugang-beleg strong { color: rgba(255, 252, 248, 0.86); font-weight: 700; }

/* --- Rechts: die Handlung ------------------------------------------------ */
.zugang-tat {
  display: flex; flex-direction: column; justify-content: center;
  gap: 20px;
  background: var(--sand);
  padding: clamp(32px, 6vh, 64px) clamp(20px, 4vw, 60px);
}
.zugang-karte {
  background: var(--weiss);
  border-radius: var(--rund);
  box-shadow: var(--schatten-l);
  overflow: hidden;
  width: 100%;
  max-width: 30rem;
  margin-inline: auto;
}
/* Zustand, kein Schmuck: waechst mit jedem ausgefuellten Feld. */
.zugang-fortschritt { height: 3px; background: var(--linie); }
.zugang-fortschritt i {
  display: block; height: 100%;
  background: var(--flamme);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .32s cubic-bezier(.2, .7, .3, 1);
}
.zugang-karte-inhalt { padding: clamp(26px, 4vw, 38px); }
.zugang-karte h2 {
  margin: 12px 0 0;
  font-size: clamp(1.34rem, 2vw, 1.6rem);
  letter-spacing: -0.032em;
  line-height: 1.12;
}

.zugang-formular { margin-top: 24px; gap: 18px; }
.feld { display: block; }
.feld-fehler:empty, .zugang-fehler:empty { display: none; }
.feld-fehler {
  margin: 7px 0 0; font-size: 0.87rem; font-weight: 650;
  color: var(--flamme-tief);
}
.feld-hinweis { margin: 7px 0 0; font-size: 0.85rem; color: var(--gedaempft); }
/* NICHT NUR ROT. Wer Rot nicht als Rot sieht, erkennt den doppelt so
   dicken Rahmen und den eingefaerbten Grund — und darunter steht der Satz,
   der sagt, was fehlt. Drei Wege zur selben Auskunft, weil Farbe allein
   keine ist. */
.formular input.ist-falsch {
  box-shadow: inset 0 0 0 2px var(--flamme-tief);
  background: var(--flamme-blass);
}

/* Der Knopf traegt seinen eigenen Ladezustand — kein Text, der hin- und
   herspringt, sondern ein Dreher neben der unveraenderten Beschriftung. */
.zugang-knopf {
  width: 100%; justify-content: center; margin-top: 4px;
  min-height: 54px; font-size: 1.02rem;
}
.knopf-dreher { display: none; }
.zugang-knopf.laedt .knopf-text { opacity: 0.55; }
.zugang-knopf.laedt .knopf-dreher {
  display: block; width: 17px; height: 17px; margin-left: 11px;
  border: 2px solid rgba(255, 255, 255, 0.36);
  border-top-color: #fff; border-radius: 50%;
  animation: zugang-dreht .7s linear infinite;
}
@keyframes zugang-dreht { to { transform: rotate(360deg); } }

.zugang-kleingedruckt {
  margin: 14px 0 0; font-size: 0.84rem; line-height: 1.55;
  color: var(--gedaempft);
}
.zugang-alternative {
  margin: 0 auto; max-width: 30rem; width: 100%;
  font-size: 0.9rem; line-height: 1.6; color: var(--gedaempft);
}

/* --- Nach dem Absenden --------------------------------------------------- */
.zugang-fertig { text-align: left; }
.zugang-fertig h2 { margin-top: 16px; outline: none; }
.zugang-fertig p { margin: 12px 0 0; line-height: 1.6; }
.zugang-fertig .knopf { margin-top: 22px; }
.zugang-haken {
  display: inline-grid; place-items: center;
  width: 46px; height: 46px; border-radius: 50%;
  background: var(--moos-blass); color: var(--moos);
}

/* --- Am Telefon ---------------------------------------------------------- */
/*
   DIE HANDLUNG KOMMT ZUERST. Am Rechner steht der Grund links und wird zuerst
   gelesen; am Telefon waere er ein Bildschirm Text VOR dem Formular — und wer
   auf „Kostenlos registrieren" geklickt hat, will nicht ueberzeugt werden,
   sondern tippen. Der Grund rutscht deshalb unter die Karte und begruendet dort
   fuer den, der noch zoegert.
*/
@media (max-width: 900px) {
  .zugang { grid-template-columns: 1fr; min-height: 0; }
  .zugang-tat { order: 1; padding-top: 26px; padding-bottom: 30px; }
  .zugang-grund { order: 2; padding-block: clamp(34px, 6vh, 56px); }
  .zugang-grund-inhalt { max-width: none; }
  .zugang-marke { display: none; }
  .zugang-titel { font-size: clamp(1.6rem, 6.6vw, 2.1rem); }
  .zugang-fakten > div { grid-template-columns: 6.5rem minmax(0, 1fr); gap: 12px; }
}
/* Auf dem Telefon steht die Marke oben in der Karte statt im Bildabschnitt —
   ohne sie waere die erste Seite ohne Absender. */
@media (max-width: 900px) {
  .zugang-karte-inhalt .marke { margin-top: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .zugang-fortschritt i { transition: none; }
  .zugang-knopf.laedt .knopf-dreher { animation-duration: 2s; }
}

/* --- Die Rechtsseite ------------------------------------------------------
   Ein Impressum wird nicht gelesen, sondern GESUCHT: Jemand will die Anschrift,
   die Registernummer oder den Namen des Geschäftsführers. Deshalb Blöcke mit
   fetter Überschrift und kurzen Zeilen statt Fließtext — man findet die eine
   Angabe, ohne den Rest zu lesen. */
.rechtsblock {
  display: grid;
  gap: 22px;
  margin-top: 22px;
  padding: 24px 26px;
  background: var(--sand);
  border-radius: var(--rund);
}
.rechtsblock p { margin: 0; line-height: 1.65; color: var(--tinte-weich); }
.rechtsblock strong {
  display: block; color: var(--tinte); font-weight: 700;
  font-size: 0.82rem; letter-spacing: 0.08em; text-transform: uppercase;
  margin-bottom: 5px;
}
.rechtsblock a { color: var(--flamme-tief); }

/* Der Hinweiskasten trägt die Markenfarbe, nicht nur einen Strich: Er ist die
   eine Stelle der Seite, an der etwas fehlt, und das soll man sehen. */
.rechtshinweis {
  margin-top: 44px;
  padding: 20px 22px;
  background: var(--flamme-blass);
  border-radius: var(--rund);
  border-left: 4px solid var(--flamme);
}
