/* =========================================================================
   Zero One IT - Preistafel als Karten (Vanilla-Portierung)
   =========================================================================
   Dieselbe Sektion wie components/ui/pricing.tsx, nur ohne React: reines
   HTML/CSS/JS, damit sie in dieser statischen Seite laeuft. Alle Farben,
   Schriften, Radien und Kurven kommen aus den bestehenden Tokens in
   index.html (:root) und assets/css/theme.css - die Datei fuehrt keinen
   einzigen eigenen Farbwert.

   Ohne JavaScript (kein .ptf-aktiv am Abschnitt) steht alles ruhig und
   vollstaendig da: Karten sichtbar, Monatspreise gesetzt, kein Umschalter,
   kein Sternenfeld. Der Umschalter ist Komfort, die Preise sind Inhalt.
   ========================================================================= */

/* ===== GRUND UND PUNKTE: EIN AUFBAU, ZWEI SAETZE WERTE =====
   Der Abschnitt bringt seinen Hintergrund selbst mit, statt den Seitengrund
   durchscheinen zu lassen. Beide Themen benutzen dieselben drei Regeln; was
   sich unterscheidet, steht ausschliesslich in diesen fuenf Variablen. So gibt
   es keine zweite Fassung der Sektion, die man mitpflegen muesste.

     --ptf-wasch    flaechiger Verlauf hinter allem
     --ptf-schein   Akzentschimmer oben
     --ptf-punkt    Farbe der Punkte
     --ptf-halo     Schein um jeden Punkt
     --ptf-funken   Spitzenhelligkeit beim Funkeln

   DUNKEL traegt der Seitengrund die Tiefe schon selbst - dort genuegt der
   Schimmer, die Punkte leuchten als Licht auf dunklem Grund.

   HELL funktioniert das nicht: ein Teal mit 7 % Deckkraft auf #EEF1F7 ist
   praktisch unsichtbar, und blanke Punkte ohne Schein lesen sich als Staub auf
   dem Bildschirm. Deshalb bekommt Hell drei Dinge: einen Verlauf, der nach oben
   bis ins Weiss aufhellt (die Logik des Tagbilds aus theme.css), einen deutlich
   kraeftigeren Schimmer, und einen weichen Halo um jeden Punkt. Damit werden
   aus Staubkoernern Lichtpartikel - dasselbe Bild wie nachts, nur bei Tag. */
.preistafel{position:relative;overflow:hidden;isolation:isolate;
  --ptf-wasch:none;
  --ptf-schein:radial-gradient(64% 46% at 50% 14%,var(--accent-glow),transparent 72%);
  --ptf-punkt:var(--accent);
  --ptf-halo:0 0 0 rgba(0,0,0,0);
  --ptf-funken:1;
  background:var(--ptf-wasch)}

/* Beide Verlaeufe klingen INNERHALB des Abschnitts aus, nicht an seiner Kante.
   Eine Wasch, die oben bei voller Deckkraft beginnt, setzt eine sichtbare
   Naht zum Abschnitt darueber - der Grund springt dort um mehrere Stufen.
   Deshalb faengt sie durchsichtig an, hat ihr Maximum bei 26 % und ist bei
   72 % wieder weg; der Schimmer sitzt aus demselben Grund bei 14 % statt am
   oberen Rand. Der Uebergang passiert damit im Verlauf und nicht als Linie. */
:root[data-theme="light"] .preistafel{
  --ptf-wasch:linear-gradient(180deg,
    rgba(var(--hoch-rgb),0) 0%,
    rgba(var(--hoch-rgb),.92) 26%,
    rgba(var(--hoch-rgb),.5) 48%,
    rgba(var(--grund-rgb),0) 74%);
  --ptf-schein:radial-gradient(62% 44% at 50% 16%,rgba(var(--akzent-rgb),.16),transparent 72%);
  --ptf-halo:0 0 6px rgba(var(--akzent-rgb),.42);
  --ptf-funken:.92}

.preistafel-schimmer{position:absolute;inset:0;pointer-events:none;z-index:0;
  background:var(--ptf-schein)}

/* ===== STERNENFELD =====
   Die Punkte liegen in Prozent im Abschnitt. Bewegt wird ausschliesslich
   transform - kein top/left im Frame, damit nichts neu layoutet wird. */
.preistafel-sterne{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:0}
.ptf-stern{position:absolute;border-radius:50%;background:var(--ptf-punkt);opacity:0;
  box-shadow:var(--ptf-halo);will-change:transform,opacity}
.ptf-aktiv .ptf-stern{animation:ptf-funkeln var(--dauer,3s) linear var(--verzug,0s) infinite}
@keyframes ptf-funkeln{0%,100%{opacity:0}50%{opacity:var(--ptf-funken,1)}}

.preistafel-inhalt{position:relative;z-index:1}

.preistafel-kopf{display:flex;flex-direction:column;align-items:center;text-align:center;margin-bottom:44px}
.preistafel-kopf p{max-width:520px;color:var(--text-2);font-size:1.0625rem;line-height:1.6;margin-top:20px}

/* ===== ABRECHNUNGSUMSCHALTER =====
   Zwei echte Radiofelder in einem Fieldset: Pfeiltasten wechseln die Auswahl,
   Screenreader melden Gruppe und Zustand von sich aus. */
.preistafel-schalter{display:none;flex-direction:column;align-items:center;gap:16px;margin-bottom:56px}
.ptf-aktiv .preistafel-schalter{display:flex}
.ptf-fieldset{border:0;padding:0;margin:0;min-width:0}
.ptf-bahn{position:relative;display:inline-flex;align-items:stretch;padding:4px;
  background:var(--surface);border:1px solid var(--border);border-radius:100px}
.ptf-radio{position:absolute;width:1px;height:1px;padding:0;margin:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}
.ptf-option{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;
  gap:9px;min-height:44px;padding:0 22px;border-radius:100px;font-family:var(--font-display);
  font-size:.9375rem;font-weight:600;color:var(--text-2);cursor:pointer;white-space:nowrap;
  transition:color .28s var(--ease-out)}
.ptf-option:hover{color:var(--text-1)}
.ptf-radio:checked + .ptf-option{color:var(--accent-ink)}
.ptf-radio:focus-visible + .ptf-option{outline:2px solid var(--accent);outline-offset:3px}
/* Breite und Versatz setzt das Skript - auch nach dem Nachladen der Schrift,
   sonst sitzt der Schieber neben der Beschriftung. */
.ptf-schieber{position:absolute;top:4px;left:4px;bottom:4px;width:0;border-radius:100px;
  background:var(--accent);transition:transform .34s var(--ease-out),width .34s var(--ease-out)}
.ptf-marke{font-family:var(--font-mono);font-size:.625rem;font-weight:500;letter-spacing:.06em;
  text-transform:uppercase;padding:3px 9px;border-radius:100px;background:var(--accent-dim);
  border:1px solid var(--border-accent);color:var(--accent-text);
  transition:background .28s,border-color .28s,color .28s}
.ptf-radio:checked + .ptf-option .ptf-marke{background:rgba(0,38,31,.14);border-color:rgba(0,38,31,.3);color:var(--accent-ink)}
.ptf-notiz{font-size:.8125rem;color:var(--text-3);text-align:center;max-width:56ch;line-height:1.6;margin:0}
.ptf-notiz b{color:var(--text-2);font-weight:500}
.ptf-still{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@media(max-width:400px){
  .ptf-option{padding:0 14px;font-size:.875rem;gap:6px}
  .ptf-marke{padding:3px 7px;font-size:.5625rem}
}

/* ===== KARTENRASTER =====
   align-items:stretch statt start: die Vorlage laesst die Karten unterschiedlich
   hoch enden, dann stehen die drei Knoepfe auf drei Hoehen. Die bestehende Tafel
   auf der Website richtet Preise und Knoepfe bewusst aus - das bleibt so. Die
   Hebung der hervorgehobenen Karte ist ein transform und beruehrt die Hoehe
   der Nachbarn nicht. */
.preistafel-raster{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:stretch;gap:32px}
@media(max-width:1023.98px){.preistafel-raster{grid-template-columns:minmax(0,1fr);gap:26px;max-width:520px;margin:0 auto}}

.preiskarte{position:relative;display:flex;flex-direction:column;padding:32px;
  border:1px solid var(--border);border-radius:var(--radius);
  background:rgba(var(--flaeche-rgb),.72);backdrop-filter:blur(6px);text-align:center}
.preiskarte.hervor{border-color:var(--accent);
  background:linear-gradient(180deg,var(--accent-dim),transparent 58%),rgba(var(--flaeche-rgb),.9);
  box-shadow:0 28px 70px -34px rgba(var(--akzent-rgb),.5)}

/* Einflug: gestaffelt, Verzug je Karte setzt das Skript. Die hervorgehobene
   Karte bleibt ab 1024 px 20 px hoeher stehen - unter 1024 px stehen die
   Karten untereinander, dort waere die Hebung nur ein Versatz. */
.ptf-aktiv .preiskarte{opacity:0;transform:translateY(50px);
  transition:opacity .5s ease var(--verzug,0s),transform .7s cubic-bezier(.16,1,.3,1) var(--verzug,0s)}
.ptf-aktiv .preiskarte.ist-da{opacity:1;transform:translateY(0)}
@media(min-width:1024px){.ptf-aktiv .preiskarte.hervor.ist-da{transform:translateY(-20px)}}

.pk-schild{position:absolute;top:0;left:50%;transform:translate(-50%,-50%);
  display:inline-flex;align-items:center;gap:6px;padding:6px 16px;border-radius:100px;
  background:var(--accent);color:var(--accent-ink-2);
  font-family:var(--font-mono);font-size:.625rem;font-weight:500;letter-spacing:.1em;text-transform:uppercase}
.pk-schild svg{width:13px;height:13px;fill:currentColor}

/* ===== KOPFZONE ALS DISCLOSURE =====
   <button> in einer <h3>: Name, Kurztext, Preis, Umfang und Hinweiszeile sind
   eine einzige Klickflaeche, die Karte bleibt semantisch Ueberschrift + Button.
   Der Buchungsknopf steht ausserhalb - ein Button darf keinen zweiten enthalten.

   Die Kopfzone waechst ausdruecklich NICHT mit (flex:0 0 auto). Mit flex-grow
   schluckte sie die Hoehe, die das Raster der Karte gibt, sobald eine Nachbar-
   karte geoeffnet ist - die Aufklappflaeche (overflow:hidden, also
   min-height:auto = 0) wuerde dann auf null zusammengedrueckt. Die Resthoehe
   nimmt stattdessen der Buchungsknopf auf. */
.pk-titel{margin:0 0 26px;display:flex;flex-direction:column;flex:0 0 auto}
.pk-kopf{display:flex;flex-direction:column;align-items:stretch;width:100%;padding:0;
  background:transparent;border:none;text-align:center;font-family:var(--font-body);
  font-size:1rem;font-weight:400;line-height:1.7;color:var(--text-1);cursor:default;
  -webkit-tap-highlight-color:transparent}
.ptf-aktiv .pk-kopf{cursor:pointer}
.pk-kopf:focus-visible{outline:2px solid var(--accent);outline-offset:6px;border-radius:10px}

.pk-name{display:block;font-family:var(--font-display);font-size:1.25rem;font-weight:700;color:var(--text-1)}
.pk-text{display:block;margin:8px auto 0;max-width:32ch;font-size:.8125rem;line-height:1.6;color:var(--text-3)}
@media(min-width:1024px){.pk-text{min-height:calc(1.6em * 3)}}

.pk-preis{display:flex;align-items:baseline;justify-content:center;gap:6px;margin-top:24px;
  font-family:var(--font-display);font-weight:700;letter-spacing:-.02em;line-height:1;
  font-size:clamp(2.5rem,5vw,3rem);color:var(--text-1)}
.preiskarte.hervor .pk-preis{color:var(--accent-text)}
.pk-preis-text{font-size:.75em}
.pk-einheit{font-family:var(--font-body);font-size:.875rem;font-weight:600;letter-spacing:.02em;color:var(--text-2)}

/* Rollende Ziffern (Ersatz fuer NumberFlow): je Stelle eine Spalte 0-9, die
   um --ziffer Zeilen nach oben faehrt. tabular-nums haelt die Breite konstant,
   sonst zappelt die Zeile beim Wechsel. */
.pk-ziffern{display:inline-flex;align-items:baseline;font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1}
.pk-stelle{display:inline-block;height:1em;overflow:hidden;vertical-align:baseline}
.pk-band{display:flex;flex-direction:column;transform:translateY(calc(var(--ziffer,0) * -1em));
  transition:transform .62s cubic-bezier(.16,1,.3,1);transition-delay:var(--verzug,0s)}
.pk-band span{display:block;height:1em;line-height:1}
.pk-fest{display:inline-block}

.pk-umfang{display:block;margin-top:14px;font-size:.8125rem;color:var(--text-2)}
.pk-hinweis{display:block;margin-top:6px;font-size:.75rem;line-height:1.55;color:var(--text-3);min-height:calc(1.55em * 2)}
.pk-hinweis b{color:var(--accent-text);font-weight:500}

/* Hinweiszeile: Text statt blossem Pfeil. Auf einer Preiskarte muss im
   geschlossenen Zustand sichtbar bleiben, dass dahinter die Leistungen stecken -
   sonst sucht sie niemand. Die Zahl davor sagt, wie viele es sind. Ohne
   JavaScript entfaellt sie, weil dann nichts aufzuklappen ist. */
.pk-tipp{display:none;align-items:center;justify-content:center;gap:10px;margin-top:22px;
  padding-top:16px;border-top:1px solid var(--border);font-family:var(--font-mono);
  font-size:.6875rem;line-height:1.4;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-2);transition:color .25s ease,border-color .25s ease}
.ptf-aktiv .pk-tipp{display:flex}
.pk-tipp-zahl{color:var(--accent-text);font-weight:600}
.pk-tipp-auf{display:none}
.preiskarte.offen .pk-tipp-zu{display:none}
.preiskarte.offen .pk-tipp-auf{display:inline}
.ptf-aktiv .pk-kopf:hover .pk-tipp{color:var(--text-1);border-color:var(--border-accent)}
.pk-chevron{width:26px;height:26px;flex-shrink:0;border:1px solid var(--border);border-radius:50%;
  display:flex;align-items:center;justify-content:center;color:var(--text-3);
  transition:background .3s var(--ease-out),border-color .3s var(--ease-out),color .3s var(--ease-out)}
.pk-chevron svg{width:11px;height:11px;stroke:currentColor;fill:none;stroke-width:2.2;
  transition:transform .3s var(--ease-out)}
.ptf-aktiv .pk-kopf:hover .pk-chevron{border-color:var(--border-accent);color:var(--accent-text)}
.preiskarte.offen .pk-chevron{background:var(--accent);border-color:var(--accent-text);color:var(--accent-ink)}
.preiskarte.offen .pk-chevron svg{transform:rotate(180deg)}

/* Aufklappflaeche: Grid-Zeile 0fr -> 1fr, dieselbe Technik wie beim FAQ und
   bei den Referenzfaellen. Die Hoehe folgt damit der tatsaechlichen Listenlaenge,
   statt einen max-height-Deckel zu raten. Ohne JavaScript bleibt die Liste
   offen: die Leistungen sind kaufentscheidend und duerfen nicht hinter einem
   Schalter verschwinden, den es dann nicht gibt. */
.pk-koerper{flex:0 0 auto;display:grid;grid-template-rows:1fr;overflow:hidden}
.ptf-aktiv .pk-koerper{grid-template-rows:0fr;transition:grid-template-rows .44s var(--ease-out)}
.ptf-aktiv .preiskarte.offen .pk-koerper{grid-template-rows:1fr}
.pk-koerper-innen{min-height:0;overflow:hidden}
.ptf-aktiv .pk-koerper-innen{opacity:0;transform:translateY(8px);
  transition:opacity .28s ease,transform .34s var(--ease-out)}
.ptf-aktiv .preiskarte.offen .pk-koerper-innen{opacity:1;transform:none;
  transition:opacity .28s ease .1s,transform .34s var(--ease-out) .1s}
.pk-koerper-innen>:last-child{margin-bottom:26px}

.pk-liste{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px;text-align:left}
.pk-liste li{display:flex;gap:11px;font-size:.8125rem;line-height:1.5;color:var(--text-2);overflow-wrap:break-word}
.pk-haken{flex:0 0 auto;width:16px;height:16px;margin-top:2px;stroke:var(--accent);fill:none;
  stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}

/* Der Knopf nimmt die Resthoehe der Karte auf. Dadurch stehen die drei Knoepfe
   immer auf einer Linie - auch wenn nur eine Karte geoeffnet ist und die beiden
   anderen vom Raster mitgestreckt werden. */
.preiskarte>.btn{width:100%;justify-content:center;margin-top:auto}

.preistafel-fuss{margin:40px auto 0;max-width:64ch;text-align:center;font-size:.8125rem;
  line-height:1.6;color:var(--text-3)}

/* Konfetti-Flaeche des Umschalters. Liegt ueber allem und faengt keine Klicks. */
.ptf-konfetti{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:9999}

@media (prefers-reduced-motion: reduce){
  .ptf-aktiv .preiskarte{opacity:1;transform:none;transition:none}
  @media(min-width:1024px){.ptf-aktiv .preiskarte.hervor.ist-da{transform:none}}
  .ptf-aktiv .ptf-stern{animation:none;opacity:calc(.32 * var(--ptf-funken,1))}
  .ptf-schieber,.pk-band{transition:none}
  /* Aufklappen bleibt, nur ohne Fahrt: der Inhalt erscheint sofort. */
  .ptf-aktiv .pk-koerper,.ptf-aktiv .pk-koerper-innen,.pk-chevron,.pk-chevron svg{transition:none}
}
