/* ===========================================================================
   Die angedockte Checkout-Leiste (Figma VETO_Gala_V3, 0:2089 Desktop /
   0:2299 Mobil). Markup: src/views/components/checkout-bar.ts.

   Weißes Band am unteren Bildschirmrand, 2 Pixel schwarze Oberkante, 20 Pixel
   Polsterung, darin eine zentrierte Spalte von 540 Pixeln — dieselbe Breite,
   die auch der Karteninhalt hat (580 minus zweimal 20).

   NACH summary.css eingebunden (src/views/head.ts): die Leiste überschreibt
   dort einige Summenklassen. Alle diese Überschreibungen stehen unter
   `.checkout-bar` — dieselben Klassen tragen auch den grünen Summenblock im
   Bestellprüfungs-Overlay (`bestellpruefung.ts` rendert
   `class="summary bestellpruefung__summary"`), und der ist am 01.09.2026
   gegen den Entwurf abgeglichen worden. Eine ungescopte Regel hier änderte
   ihn stillschweigend mit.
   =========================================================================== */

/*
 * Ein Sprungziel darf nicht hinter der Leiste landen.
 *
 * Das ist keine Kosmetik: ohne diese Zeile scrollt Playwright im
 * Mobil-Projekt Elemente unter die Leiste und bricht mit „intercepts pointer
 * events" ab. `--checkout-bar-h` setzt public/checkout-bar.js zur Laufzeit;
 * ohne Skript und auf Seiten ohne Leiste bleibt es bei 0.
 */
html {
  scroll-padding-bottom: var(--checkout-bar-h, 0px);
}

/*
 * Platz für die Leiste — reserviert IM grünen Band der Fußzeile.
 *
 * Über die Geschwisterbeziehung, nicht über `:has()`: `.page--checkout` steht
 * nur, wenn wirklich gebucht werden kann (booking-page.ts), und die Fußzeile
 * ist ihr direkter Nachbar im <body> (layout.ts).
 *
 * Reserviert wird im GRÜNEN Band und nicht darunter: liegt die gemessene
 * Höhe daneben, sieht man Grün — und nicht den cremefarbenen Grund der Seite,
 * an dem eine Lücke wie ein Fehler aussieht, aber wie ein Absatz wirkt.
 *
 * `15rem` ist der Rückfall für den Zustand, bevor das Skript gemessen hat:
 * die aufgeklappte Leiste ist im Entwurf rund 227 Pixel hoch. Gemessen wird
 * gleich beim Laden, und seit dem 02.09.2026 auch bei jedem Umlegen des
 * `hidden` an der Leiste (public/checkout-bar.js) — ohne Ticket steht sie
 * nicht da, und dann darf hier auch kein Freiraum in ihrer Höhe stehen
 * bleiben.
 */
.page--checkout ~ .site-footer {
  padding-bottom: calc(var(--footer-pad-unten) + var(--checkout-bar-h, 15rem));
}

/* --- Das Band ------------------------------------------------------------ */

/*
 * `position: fixed` misst gegen den nächsten Vorfahren mit `filter`,
 * `transform`, `backdrop-filter`, `perspective`, `will-change: transform`
 * oder `contain: paint` — sonst gegen das Sichtfenster. Der Hinweis steht an
 * `.card` in public/booking.css, wo genau das bis zum 02.09.2026 stand.
 *
 * `z-index: 5`: über allem im Fluss, unter der Sprungmarke (`.skip-link`,
 * `z-index: 10`). Gegen die Dialoge braucht es nichts — `showModal()` legt
 * sie in den Top-Layer, und der liegt über jedem `z-index`.
 */
.checkout-bar {
  position: fixed;
  inset-inline: 0;
  bottom: 0;
  z-index: 5;
  /* Unten die Polsterung plus die Sicherheitszone des Geräts (iPhone-Balken).
     `viewport-fit=cover` steht im Dokumentkopf, siehe src/views/head.ts. */
  padding: 1.25rem 1.25rem calc(1.25rem + env(safe-area-inset-bottom, 0px));
  border-top: 2px solid var(--schwarz);
  background: var(--weiss);
}

/* Das Band ist vollbreit, sein Inhalt nicht — dieselbe Aufteilung wie bei
   `.page` und der Fußzeile. 15 Pixel zwischen den Blöcken (Figma 0:2089). */
.checkout-bar__inner {
  display: flex;
  flex-direction: column;
  gap: 0.9375rem;
  max-width: var(--breite-leiste);
  margin-inline: auto;
}

/* --- Einzelzeilen und Trennlinie ----------------------------------------- */

/*
 * KEINE `display`-Regel an `.checkout-bar__details`: der Behälter wird über
 * das `hidden`-Attribut auf- und zugeklappt (public/checkout-bar.js), und
 * jede `display`-Regel schlüge das Attribut aus dem Browser-Stylesheet aus.
 * Der Wächter `[hidden] { display: none !important }` in styles.css trägt
 * das; hier wird er nicht untergraben.
 *
 * Der Behälter braucht auch keine: ein <div> ist von sich aus ein Block, und
 * die Zeilen darin stapelt `.summary__lines` (summary.css).
 */

.checkout-bar__divider {
  width: 100%;
  /* 15 über der Linie; die 15 darunter kommen aus dem `gap` der Spalte, weil
     die Linie das letzte Kind des einklappbaren Behälters ist. */
  margin: 0.9375rem 0 0;
  border: 0;
  /* Nicht Schwarz wie die Oberkante des Bandes — im Entwurf ist die Linie im
     Grün der Karte gesetzt (nachgemessen: #14372d). */
  border-top: 1px solid var(--gruen-tief);
}

/* --- Der Umschalter „Details anzeigen" ----------------------------------- */

/*
 * Ebenfalls OHNE `display`-Regel: der Knopf ist `hidden`, solange nichts
 * gewählt ist (public/app.js) — es gibt dann nichts aufzuklappen.
 *
 * Er ist Flex-Kind der Spalte und damit von selbst über die volle Breite
 * gestreckt; zentriert wird der Text, nicht der Knopf. Das gibt nebenbei eine
 * Trefferfläche über die ganze Spalte statt über 113 Pixel Text.
 *
 * Die Polsterung ist eine bewusste Abweichung vom Entwurf, die keinen Pixel
 * bewegt: dort ist der Umschalter genau 12 Pixel hoch (Schriftgrad 12,
 * Zeilenhöhe 12), und ein 12 Pixel hohes Ziel ist zu klein (WCAG 2.5.8
 * verlangt 24). Die 6 Pixel oben und unten werden an den Rändern wieder
 * herausgerechnet — oben gegen das `gap` von 15, unten samt des `gap`, denn
 * im Entwurf steht der Umschalter DIREKT über der Summenzeile (in beiden
 * Referenzbildern unabhängig nachgemessen).
 */
.checkout-bar__toggle {
  align-self: stretch;
  margin-top: -0.375rem;
  margin-bottom: -1.3125rem;
  padding: 0.375rem 0;
  border: 0;
  background: none;
  /*
   * #19aa81 auf Weiß kommt auf rund 2,9:1 — fetter 12-Pixel-Text braucht
   * 4,5:1 (Konzept §10 Nr. 22). Die Farbe steht so im Entwurf und bleibt
   * hier stehen; ein eigenmächtig abgedunkeltes Marken-Token wäre eine
   * Entscheidung, die ein Mensch trifft. Vermerkt im Übergabebericht.
   */
  color: var(--gruen-akzent);
  font: inherit;
  font-size: 0.75rem;
  font-weight: 700;
  line-height: 0.75rem;
  text-align: center;
  cursor: pointer;
}

/* --- Betrag und Knopf ---------------------------------------------------- */

/*
 * Eine Zeile, unten ausgerichtet: der Betrag ist zweizeilig beschriftet und
 * damit höher als der Knopf, und im Entwurf stehen beide Grundlinien unten
 * bündig (Figma 0:2106).
 *
 * `flex-wrap` bleibt: Betrag und Knopf sollen umbrechen dürfen, statt sich
 * auf einem schmalen Schirm gegenseitig zu stauchen. Es trug bis zum
 * 02.09.2026 zusätzlich den Sperr-Hinweis auf eine eigene Zeile darüber —
 * der ist mit `cta.submit_hint` entfallen (bestellknopf.ts).
 */
.checkout-bar__row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem;
  align-items: flex-end;
  justify-content: space-between;
}

/* Der Betrag mit seiner zweizeiligen Beschriftung. `.summary__total` ist in
   summary.css eine Zeile (der Overlay-Block setzt den Betrag allein) — hier
   eine Spalte, mit 5 Pixeln zwischen Beschriftung und Betrag. */
.checkout-bar .summary__total {
  flex-direction: column;
  gap: 0.3125rem;
}

.checkout-bar .summary__total-label {
  display: flex;
  flex-direction: column;
  color: var(--grau-text);
  font-size: 0.875rem;
  font-weight: 500;
}

.checkout-bar .summary__total-note {
  font-size: 0.625rem;
}

/* 24 statt der 28 Pixel des Overlay-Blocks (Figma 0:2109). */
.checkout-bar .summary__total-value {
  font-size: 1.5rem;
  line-height: 2rem;
}

/*
 * `.button--primary` zentriert sich in summary.css selbst in der Flex-Spalte
 * der Karte — in dieser Zeile stünde er damit mittig statt unten bündig.
 * Die seitliche Polsterung ist im Entwurf schmaler als die 28 Pixel des
 * Knopfes im Formular.
 *
 * Die Fläche bleibt `--pink-schrift` (#d6008c) und wird NICHT auf die
 * #f100a0 des Entwurfs gesetzt: weiße Schrift darauf erreicht nur 4,00:1
 * (Konzept §10 Nr. 22), und dieser Knopf ist fetter 14-Pixel-Text.
 */
.checkout-bar__row .button {
  align-self: flex-end;
  /*
   * Der Knopf steht rechts — auch, wenn er unter 340 Pixeln Bandbreite neben
   * dem Betrag keinen Platz mehr hat und in eine eigene Zeile rutscht. Dort
   * verteilt `justify-content: space-between` nichts mehr, weil nur noch ein
   * Element auf der Zeile steht; der automatische Anfangsrand schiebt ihn
   * trotzdem an die rechte Kante der Spalte. Steht er neben dem Betrag,
   * ändert die Zeile nichts.
   */
  margin-inline-start: auto;
  padding-inline: 0.9375rem;
  /*
   * Die 16 Pixel Zeilenhöhe des Entwurfs. `.button` in summary.css deklariert
   * sie zwar (`line-height: 1.143`), aber VOR `font: inherit` — und die
   * Kurzform setzt die Zeilenhöhe auf den geerbten Wert zurück. Sichtbar ist
   * das nirgends (`min-height: 40px` bestimmt die Knopfhöhe, der Text steht
   * mittig), deshalb steht die Korrektur hier und nicht in summary.css: dort
   * änderte sie auch den Knopf im Bestellprüfungs-Overlay.
   */
  line-height: 1.1429;
}

/* --- AGB-Satz ------------------------------------------------------------ */

/*
 * `.terms` bringt weißen Grund und einen Radius mit — entworfen gegen den
 * grünen Summenblock im Formular. Auf dem weißen Band ist beides unsichtbar
 * und die Polsterung verschöbe nur den Satz. Die Klasse selbst bleibt
 * unangetastet: der Klon im Bestellprüfungs-Overlay benutzt sie.
 */
.checkout-bar .terms {
  padding: 0;
  border-radius: 0;
  background: none;
}

.checkout-bar .terms__note {
  padding: 0;
  line-height: 1.3333;
  text-align: center;
}
