/*
 * Eigene Ergänzungen zum Shopware-Theme. Die EINZIGE Stylesheet-Datei, die von
 * Hand gepflegt wird — alles Fremde steht in assets/theme/all.css und wird beim
 * nächsten Theme-Export als Ganzes ersetzt. Darum sind es zwei Dateien: diese
 * hier muss den Export überleben.
 *
 * Lag bisher als Heredoc mitten im Renderer (tcs_layout) und wurde bei jedem
 * Request inline in den <head> geschrieben. Als Datei ist es browser-cachebar
 * und für Redakteure wie Entwickler auffindbar.
 *
 * ENTFERNT, weil in diesem Auftritt nichts sie erreichen kann — nachgesehen in
 * allen 80 ausgelieferten Seiten und in jedem Snippet, Blueprint und Skript:
 *
 *   .cookiefirst-root, [class*="cookiefirst"], [class*="cookie-permission"]
 *       Blendete den Consent-Banner des Originals aus. Diese Installation lädt
 *       überhaupt kein fremdes JavaScript (footer.php: vier lokale Dateien,
 *       sonst nichts), also entsteht das Markup nie, das die Regel verstecken
 *       sollte.
 *
 *   .cta-portrait, .brand-row, .brand-chip
 *       „Bibliotheks-Module" für Bausteine, die es nicht gibt: kein Snippet in
 *       site/snippets/blocks/, kein Blueprint in site/blueprints/blocks/ und
 *       kein Inhalt erzeugt eine dieser Klassen. Der cta-Baustein setzt
 *       .cms-element-call-to-action, ein brands-Baustein existiert nicht.
 *       Kommen die Bausteine, kommen die Regeln mit ihnen zurück.
 */

/* Das Logo kommt aus dem eingefrorenen Markup ohne die Größenregel des
   Originals. !important, weil das Theme-CSS mit höherer Spezifität dagegenhält. */
.header-logo-picture img {
  height: 48px !important;
  width: auto !important;
  max-width: none !important;
}

/* ── Slider ──────────────────────────────────────────────────────────────────
   Die Pfeile sind server-gerendert; slider-init.js hebt sie auf die
   .base-slider-Ebene, damit left/right an den Rändern greifen statt in der
   Mitte zu clustern. */
.base-slider,
.cms-element-image-slider {
  position: relative;
}

.base-slider > .base-slider-controls .base-slider-controls-prev {
  left: 0;
  right: auto;
}

.base-slider > .base-slider-controls .base-slider-controls-next {
  right: 0;
  left: auto;
}

.base-slider-controls-prev .icon,
.base-slider-controls-next .icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

/* ── Mobiles Menü ────────────────────────────────────────────────────────────
 *
 * Hier stand ein KOMPLETTER eigener Drawer: eigener Kasten, eigener Abdunkler,
 * eigene Schaltfläche, eigene Listengestaltung — rund siebzig Zeilen, die
 * nachbauten, was zwei Verzeichnisse weiter längst fertig lag.
 *
 * Denn assets/theme/all.css IST der Theme-Export derselben Shopware-Instanz,
 * aus der dieses Projekt stammt, und bringt die Schublade mit: `.offcanvas`
 * samt Maßen, Übergang und Stapelebene, `.offcanvas-start` samt Startposition
 * links, `.offcanvas-header`/`-close` samt Schließzeile,
 * `.navigation-offcanvas-list-item` samt Trennlinien, `.is-back-link`,
 * `.is-home-link`, `.is-current-category` samt Farben — 206 Regeln. Seit das
 * Markup in site/snippets/menu.php DIESE Klassennamen trägt, greifen sie
 * einfach. Was hier bleibt, sind drei Dinge, die das Theme nicht mitbringen
 * kann, weil sein Original die Ebenen einzeln nachlud statt sie
 * nebeneinanderzustellen — und zwei, die es falsch mitbringt.
 * ──────────────────────────────────────────────────────────────────────────── */

/* 1 — DIE SCHUBLADE MUSS SOFORT FOKUSSIERBAR SEIN, NICHT ERST NACH DER FAHRT.
 *
 * Bootstrap animiert an einer Schublade nur `transform`. Dieses Theme hat
 * daraus `transition: all 0.45s …` gemacht — und `all` schließt `visibility`
 * ein. `visibility` kennt keine Zwischenwerte, der Browser schaltet mitten in
 * der Dauer um; die Schublade ist also nach `classList.add('show')` noch rund
 * 0,2 s lang `hidden`. Ein .focus() in diesem Fenster verpufft, der Fokus
 * blieb auf dem Burger-Knopf stehen, und ein Vorlesewerkzeug bekam den Dialog
 * nie angesagt. Gemessen, nicht vermutet: `Fokus: {imDrawer: false}`.
 *
 * Dieselbe Auflösung wie bei den Ebenen weiter unten: Dauer 0 in beide
 * Richtungen, aber die Verzögerung nur beim Hinausfahren. Herein wird sofort
 * sichtbar (und fokussierbar), hinaus bleibt sie sichtbar, solange sie fährt.
 * `.navigation-offcanvas.offcanvas` ist zwei Klassen spezifisch und gewinnt
 * damit gegen die `.offcanvas`-Regel des Themes. */
.navigation-offcanvas.offcanvas {
  transition: transform 0.45s cubic-bezier(0.3, 0, 0.15, 1), visibility 0s linear 0.45s;
}

.navigation-offcanvas.offcanvas.show {
  transition: transform 0.45s cubic-bezier(0.3, 0, 0.15, 1), visibility 0s;
}

@media (prefers-reduced-motion: reduce) {
  .navigation-offcanvas.offcanvas,
  .navigation-offcanvas.offcanvas.show {
    transition: none;
  }
}

/* 2 — DIE EBENEN LIEGEN ÜBEREINANDER, NICHT UNTEREINANDER.
 *
 * Alle Ebenen stehen gleichzeitig im Dokument. `grid` mit EINER Zelle, in die
 * jede Ebene gelegt wird (`grid-area: 1 / 1`), stapelt sie ohne
 * `position: absolute` — und, das ist der Punkt, die Zelle ist so hoch wie die
 * HÖCHSTE Ebene. Dadurch springt die Schublade beim Ebenenwechsel nicht in der
 * Höhe, und niemand muss eine Höhe in JavaScript ausrechnen.
 *
 * `align-self: start` verhindert, dass kurze Ebenen auf die volle Zellhöhe
 * gedehnt werden und ihre Trennlinien mitwandern. */
.navigation-offcanvas-container {
  display: grid;

  /* Die 24 px unter der Schließzeile. Im Original entstehen sie aus einem
     LEEREN `<nav class="navigation-offcanvas-actions">` (padding-top: 1rem,
     margin-bottom: 0.5rem) — dort stünden Konto- und Merkzettel-Links, die
     dieser Auftritt nicht hat, und übrig bleibt ein Abstandhalter in Gestalt
     eines Elements. Ein leeres <nav> ist aber keine Lücke, sondern ein
     Navigations-Bereich: Vorlesewerkzeuge zählen es auf und führen ihre Nutzer
     hinein, wo nichts ist. Die Lücke gehört ins Stylesheet. Gemessen ist sie
     dieselbe: 1rem + 0.5rem. */
  padding-top: 1.5rem;
}

.navigation-offcanvas-container > .navigation-offcanvas-content {
  grid-area: 1 / 1;
  align-self: start;
  background-color: #ffffff;

  /* `visibility` statt `display`: es nimmt die verborgenen Ebenen vollständig
     aus der Tab-Reihenfolge und aus dem, was Vorlesewerkzeuge sehen, lässt sich
     aber — anders als `display` — zeitlich steuern. Genau darauf verlässt sich
     die Fokus-Falle in menu-init.js.
     ─────────────────────────────────────────────────────────────────────────
     DIE BEIDEN RICHTUNGEN SIND NICHT SYMMETRISCH, UND DAS IST DER GANZE PUNKT.

     Hier stand zuerst `transition: transform 0.3s ease, visibility 0.3s`, und
     das war falsch — auf eine Art, die man nur mit dem Messgerät sieht.
     `visibility` kennt keine Zwischenwerte; der Browser SCHALTET UM, und zwar
     irgendwo mitten in der Dauer. Die hereinkommende Ebene war deshalb noch
     rund 150 ms lang `hidden`, während sie schon `is-active` hieß. Ein
     .focus() in diesem Fenster verpufft folgenlos: der Fokus fiel auf <body>,
     die Fokus-Falle hatte nichts mehr zu greifen, und die Tastaturbedienung
     brach genau an der Stelle ab, an der man die zweite Ebene betritt.
     Gemessen: `direktNachKlasse: "hidden"`, `fokusSofort: false`.

     Richtig ist eine Dauer von 0 in BEIDE Richtungen, aber mit
     unterschiedlicher VERZÖGERUNG:

       herein (.is-active)  0s ohne Verzögerung  → sofort sichtbar, sofort
                                                   fokussierbar
       hinaus (Grundregel)  0s nach 0.3s         → bleibt sichtbar, solange sie
                                                   hinausgleitet, und
                                                   verschwindet erst am Ende

     Das ist zugleich das Verhalten des Originals: dort bleibt die verlassene
     Ebene als „placeholder" stehen, während die neue als „overlay" darüber
     hereinfährt. */
  visibility: hidden;
  transform: translateX(100%);
  transition: transform 0.3s ease, visibility 0s linear 0.3s;
}

/* Vorfahren der gezeigten Ebene warten LINKS. Nur deshalb kommt „Zurück" von
   links herein und nicht von rechts wie das Hineingehen — dieselbe Richtung
   für beide Wege wäre eine falsche Fährte. */
.navigation-offcanvas-container > .navigation-offcanvas-content.is-zurueck {
  transform: translateX(-100%);
}

.navigation-offcanvas-container > .navigation-offcanvas-content.is-active {
  visibility: visible;
  transform: none;
  transition: transform 0.3s ease, visibility 0s;
}

/* Wer Bewegung abbestellt hat, bekommt keine. Das Theme hält es bei seinen
   eigenen Übergängen genauso. */
@media (prefers-reduced-motion: reduce) {
  .navigation-offcanvas-container > .navigation-offcanvas-content,
  .navigation-offcanvas-container > .navigation-offcanvas-content.is-active {
    transition: none;
  }
}

/* 3 — EIN AUFKLAPP-PUNKT IST EIN <button>, KEIN <a>.
 *
 * Warum, steht in site/snippets/menu-item.php. Das Theme kennt
 * `.navigation-offcanvas-link` nur als Link; ein Knopf bringt eigene
 * Vorgaben mit (Schriftart des Betriebssystems, Breite nach Inhalt, zentrierter
 * Text), die hier zurückgenommen werden. Alles Weitere — Polsterung, Farbe,
 * Fokusrahmen, Trennlinien — kommt aus dem Theme. */
button.navigation-offcanvas-link {
  width: 100%;
  text-align: left;

  /* Einzeln und NICHT als `font: inherit`. Die Kurzform setzt auch
     `font-weight` zurück — und damit die 700, die das Theme dem „Zurück"
     mitgibt (`.navigation-offcanvas-link.is-back-link`). Dass die Theme-Regel
     hier mit zwei Klassen ohnehin spezifischer wäre, ist Glück und kein
     Argument: die nächste Regel dieser Art hätte es nicht. */
  font-family: inherit;
  font-size: inherit;

  -webkit-appearance: none;
  appearance: none;
}

/* 4 — DIE SCHUBLADE IST NUR MOBIL DA.
 *
 * `d-lg-none` im Markup schaltet sie ab 992 px auf `display: none`. Das Theme
 * setzt `.offcanvas` aber auf `display: flex` — bei gleicher Spezifität
 * entschiede die Reihenfolge, und die Bootstrap-Hilfsklasse trägt genau
 * deshalb `!important`. Sie steht in all.css und gewinnt. Hier steht nichts
 * dazu; die Zeile ist nur der Hinweis, dass das geprüft ist: 80 von 80 Seiten
 * bei 1440 px pixelgleich. */
