/** Shopify CDN: Minification failed

Line 1311:25 Unexpected "`"

**/
/* ==========================================================================
   Schnellkauf als rechte Schublade statt mittigem Fenster

   Vorbild snocks.com: Beim Klick auf „Auswählen" fährt die Konfiguration von
   rechts ein, dort wo danach auch der Warenkorb aufgeht. Der Blick bleibt auf
   einer Seite, statt von der Mitte an den Rand zu springen.

   Der Warenkorb selbst fährt bereits rechts ein — `cart_type: drawer` in den
   Theme-Einstellungen. Hier geht es nur um den Schritt davor.

   Ausschliesslich `.quick-add-modal`, nicht `.dialog-modal` — diese Klasse
   teilen sich mehrere Fenster im Theme, unter anderem die Bildvergrösserung
   auf der Produktseite.

   Nur ab 750 px. Auf dem Handy fährt das Fenster von unten ein, das ist dort
   die bessere Bewegung und bleibt unangetastet.
   ========================================================================== */

/* WICHTIG — warum über die Variablen und nicht über width/height:
   Das Theme setzt die Grösse in `quick-add-modal-styles.liquid` aus
   `--quick-add-modal-width` und `--quick-add-modal-height`. Diese
   Sektions-Stylesheets laden NACH `custom.css` und gewinnen deshalb jeden
   direkten `width`-Kampf — der erste Versuch am 12.08. blieb genau daran
   wirkungslos.

   Statt dagegen anzuschreiben, werden hier die beiden Variablen am Element
   selbst neu gesetzt. Die Theme-Regel rechnet dann mit unseren Werten.
   `dialog.quick-add-modal` sticht dabei die Vorgabe aus den
   Theme-Variablen (Element + Klasse schlägt Klasse allein). */

@media screen and (min-width: 750px) {
  dialog.quick-add-modal {
    --quick-add-modal-width: min(520px, 92vw);
    --quick-add-modal-height: 100dvh;
    max-width: none;
    max-height: 100dvh;
    margin: 0 0 0 auto;
    inset-block: 0;
    border-radius: 0;
  }

  /* Der Inhalt liegt in einem siebenspaltigen Raster — und die beiden
     Kinder haben FESTE Plätze darin: das Bild auf Spalte 1–4, die Angaben
     auf 4 bis Ende. Nur das Raster umzustellen genügt deshalb nicht, die
     Plätze müssen mit. Genau daran hing der zweite Fehlversuch.

     Die Selektoren sind absichtlich lang: Die Theme-Regeln stehen in einem
     Sektions-Stylesheet, das nach `custom.css` lädt. Bei gleicher
     Gewichtung gewinnt das spätere — also braucht es hier mehr. */
  dialog.quick-add-modal .quick-add-modal__content {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
    max-height: 100dvh;
  }

  dialog.quick-add-modal .quick-add-modal__content .product-information__media {
    position: relative;
    grid-column: 1 / -1;
    grid-row: 1;
    width: 100%;
    /* Sonst füllt ein quadratisches Foto die halbe Schublade und Länge,
       Menge und Kaufknopf rutschen unter die Falz. */
    max-height: 260px;
    overflow: hidden;
  }

  dialog.quick-add-modal .quick-add-modal__content .product-details {
    grid-column: 1 / -1;
    grid-row: 2;
  }

  dialog.quick-add-modal[open] {
    animation: hhSchubladeRein var(--animation-speed) var(--animation-easing) forwards;
  }

  dialog.quick-add-modal.dialog-closing {
    animation: hhSchubladeRaus var(--animation-speed) var(--animation-easing) forwards;
  }
}

@keyframes hhSchubladeRein {
  from { transform: translateX(100%); opacity: 0; }
  to   { transform: translateX(0);    opacity: 1; }
}

@keyframes hhSchubladeRaus {
  from { transform: translateX(0);    opacity: 1; }
  to   { transform: translateX(100%); opacity: 0; }
}

/* ==========================================================================
   Holzhof Rheinsberg - eigene Anpassungen
   Mega-Menue: Bild klein links neben dem Text, immer zwei gleich breite
   Spalten, mit Trennlinien. Referenz: morenutrition.de

   Markup laut snippets/mega-menu-list.liquid + snippets/link-featured-image.liquid:
     ul.mega-menu__list > li.mega-menu__column > div > a.mega-menu__link
                                                        > img.mega-menu__link-image
                                                        + span.wrap-text

   Wichtig: Horizon vergibt bei 4 oder weniger Eintraegen die Klasse
   .mega-menu__column--wide-collection-image, wodurch das Layout je nach
   Anzahl der Eintraege springt. Das wird hier bewusst neutralisiert.
   Hohe Spezifitaet noetig, weil Horizon seine Stile nach dieser Datei einbindet.
   ========================================================================== */

@media screen and (min-width: 750px) {

  ul.mega-menu__list {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    column-gap: 3rem !important;
    row-gap: 0 !important;
    width: 100% !important;
    max-width: 900px !important;
  }

  /* Spaltenspannen des Themes aufheben - jeder Eintrag genau eine Spalte */
  ul.mega-menu__list li.mega-menu__column,
  ul.mega-menu__list li.mega-menu__column--wide-collection-image,
  ul.mega-menu__list li[class*="mega-menu__column--span-"] {
    grid-column: span 1 !important;
    width: auto !important;
  }

  ul.mega-menu__list li.mega-menu__column a.mega-menu__link {
    display: flex !important;
    flex-direction: row !important;
    align-items: center !important;
    gap: 1rem !important;
    text-align: left !important;
    padding-block: 0.85rem !important;
    border-bottom: 1px solid #dddddd !important;
  }

  ul.mega-menu__list li.mega-menu__column a.mega-menu__link img.mega-menu__link-image {
    width: 64px !important;
    max-width: 64px !important;
    min-width: 64px !important;
    height: 64px !important;
    aspect-ratio: 1 / 1 !important;
    object-fit: cover !important;
    border-radius: 4px !important;
    margin: 0 !important;
  }

  ul.mega-menu__list li.mega-menu__column a.mega-menu__link span.wrap-text {
    flex: 1 1 auto !important;
  }
}

/* ==========================================================================
   Produktkacheln: sichtbarer Rahmen um das Bildfeld

   Das Bildfeld ist bereits quadratisch (`image_ratio: square`), aber die
   Fotos haben sehr unterschiedliche Formate: manche füllen den Rahmen aus,
   andere sind Freisteller auf weißem Grund. Ohne sichtbaren Rahmen scheinen
   die Freisteller frei im Raster zu schweben, und die Übersicht wirkt
   unruhig, obwohl alle Felder gleich groß sind.

   Die Freisteller sind KEINE PNG mit Transparenz, ihr Hintergrund ist echtes
   Weiß. Deshalb ist der Rahmen innen weiß und nicht beige — sonst stünde in
   jeder Kachel ein weißer Kasten auf beigem Grund.

   Gilt bewusst für jede Kachel im Shop, nicht nur auf Kollektionsseiten.
   ========================================================================== */

/* Der Rahmen um die GANZE Karte — Bild, Titel, Preis, Steuerhinweis — kommt
   NICHT von hier, sondern aus der Theme-Einstellung des Blocks „Produktkarte":
   Ränder = Einfarbig, Stärke 1, Eckenradius 8, Padding 10/16/12/12.

   Bewusst nativ statt per CSS, damit die Werte im Theme-Editor sichtbar und
   änderbar sind. Gesetzt wurde er per Skript in ALLEN acht Vorlagen, die
   Produktkarten zeigen (Kollektion, Suche, Startseite, Warenkorb, 404,
   ähnliche Produkte auf beiden Produktseiten) — von Hand übersieht man eine.

   Wird der Rahmen im Editor geändert, hier nichts anpassen. Die Rahmenfarbe
   stammt aus dem Farbschema der Sektion, nicht aus dieser Datei. */
product-card .card-gallery {
  background: #FFFFFF;
  border-radius: 4px;
  overflow: hidden;
}

product-card .card-gallery .product-media-container img {
  object-fit: contain;
}

/* --------------------------------------------------------------------------
   Produktseite: Bildbereich auf 600 px begrenzt

   NUR die Galerie im Hauptbereich der Produktseite. Der Selektor war am
   12.08. schon einmal zu weit gefasst:

   1. `media-gallery { max-width: 600px }` ohne Einschränkung traf auch die
      mitlaufende Kaufleiste — die stand danach 600 px breit da, mit
      einzelnen Wörtern pro Zeile.
   2. `product-card .card-gallery { margin-inline: auto }` liess in jeder
      Kachel das Bild verschwinden: In einem Flex-Container macht ein
      automatischer Seitenrand aus „so breit wie die Spalte" ein „so breit
      wie der Inhalt". Das Bild darin steht auf `width: 100%` — von null.

   Deshalb hier: an `.product-information` gebunden, `.sticky-*` ausdrücklich
   ausgenommen, keine Ränder. */
.product-information > media-gallery,
.product-information > * > media-gallery {
  max-width: 600px;
}

/* Mitlaufende Kaufleiste.

   Sie ist von Haus aus 600 px breit (Theme-Vorgabe) und teilt sich in Bild,
   Textspalte, Preis und Knopf. Die Textspalte hat `flex: 1; min-width: 0`,
   gibt also als Einzige nach.

   Seit Gorillas „Endkundenpreis" eingeschaltet ist, hängt hinter dem Preis
   eine zweite Zahl samt Beschriftung. Der Preis kann nicht schrumpfen, also
   schrumpft die Textspalte — bis die Variante Wort für Wort untereinander
   stand. Der Endkundenpreis steht ohnehin oben im Preisblock; in der Leiste
   ist er nur Ballast. */
.sticky-add-to-cart__bar .wsgRetailPrice,
.sticky-add-to-cart__bar .wsg-retail-label,
.sticky-add-to-cart__bar .hh-brutto-hinweis,
.sticky-add-to-cart__bar .hh-netto {
  display: none;
}

.sticky-add-to-cart__price {
  flex-shrink: 0;
  white-space: nowrap;
}

.sticky-add-to-cart__variant {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ==========================================================================
   Anmelde- und Login-Formular für Händler

   Das Markup steht in `templates/page.wsg-registration-form.liquid` und
   gehört Wholesale Gorilla — deren Kopfzeile warnt ausdrücklich davor, die
   Datei zu ändern. Angepasst wird deshalb ausschließlich von hier aus.
   ========================================================================== */

/* Überschriften: Gorilla setzt sie sehr groß und mittig, der Shop sonst
   ruhiger und linksbündig. */
.wsg-proxy-container h1 {
  font-size: clamp(1.6rem, 3.2vw, 2.2rem);
  line-height: 1.2;
  margin-bottom: 0.6rem;
}

.wsg-proxy-container .wsg-section-header h2,
.wsg-proxy-container .wsg-section-header h3 {
  font-size: clamp(1.15rem, 1.6vw, 1.35rem);
  line-height: 1.3;
  margin: 1.8rem 0 0.6rem;
}

/* „Hast du bereits ein Konto? Bitte hier einloggen." stand auf 1.2em und
   damit größer als der Fließtext. Es ist ein Hinweis, keine Ansage. */
.wsg-proxy-container .wsg-signup-link {
  font-size: 0.95rem !important;
  margin-bottom: 2rem;
}

/* Mobil klebten Felder und Beschriftungen an den Bildschirmkanten —
   Gorillas Rahmen hat keinen Innenabstand, Horizons Seitenrand greift
   hier nicht (Mirco, 14.09., Handy-Screenshot). */
@media screen and (max-width: 749px) {
  .wsg-proxy-container {
    padding-left: 16px;
    padding-right: 16px;
  }

  /* Gorilla schachtelt zwei .wsg-proxy-container — nur der äußere bekommt
     den Rand, sonst 32 px. */
  .wsg-proxy-container .wsg-proxy-container {
    padding-left: 0;
    padding-right: 0;
  }
}

/* Der Rahmen hatte `min-width: 570px` — das überläuft jedes Handy. */
.wsg-proxy-container .wsg-one-half {
  min-width: 0 !important;
  max-width: 640px !important;
  width: 100%;
}

/* ⚠️ Bundesland ausblenden, solange es nichts zu wählen gibt.
   Shopify kennt für Deutschland keine Provinzen. Gorillas Skript setzt aber
   eine leere Platzhalter-Option hinein, deshalb reicht `:not(:has(option))`
   nicht — geprüft wird auf eine ZWEITE Option. Wählt jemand ein Land mit
   Provinzen, erscheint das Feld von selbst wieder. */
.wsg-proxy-container .wsg-input-small:has(> #wsg-form-province:not(:has(option:nth-child(2)))) {
  display: none !important;
}

/* Postleitzahl rückt dann auf die volle Breite statt rechts zu kleben */
.wsg-proxy-container .wsg-two-column:has(#wsg-form-province:not(:has(option:nth-child(2)))) .wsg-zip {
  width: 100% !important;
  float: none !important;
}

/* --- Schnellbestellformular ---------------------------------------------
   Der Inhalt wird per XHR von Gorilla nachgeladen. Die Klassennamen
   stammen aus dem Inspektor (11.08.):

     .wsg-spof-container-main        äußerer Rahmen
     .swiper-wrapper.nav-menu        Kategorieleiste (Swiper-Karussell)
     a.swiper-slide.wsg-nav-link     ein Kategorie-Eintrag
   -------------------------------------------------------------------- */

/* ⚠️ Gorilla setzt jedem Eintrag `width: 164px` als Inline-Stil. Lange
   Namen wie „Pfahlholz & Rundholz" brechen dadurch auf zwei Zeilen und
   die Leiste wirkt unruhig. `auto` mit Innenabstand lässt jeden Eintrag
   so breit werden, wie er sein muss. Inline-Stil schlägt Klassen —
   deshalb `!important`. */
#wsg-quick-order-form a.swiper-slide.wsg-nav-link {
  width: auto !important;
  min-width: 0 !important;
  padding: 0.45rem 1rem !important;
  margin-right: 0.4rem !important;
  white-space: nowrap;
  border-radius: 999px;
  line-height: 1.4;
  color: #675F4B !important;
}

#wsg-quick-order-form a.swiper-slide.wsg-nav-link:hover {
  background: #F7F4EF !important;
  color: #212121 !important;
}

/* Die aktive Kategorie trägt bei Gorilla einen Rahmen — in CI-Farbe und
   mit Fläche wird sie deutlicher, ohne laut zu werden. */
#wsg-quick-order-form a.swiper-slide.wsg-nav-link[aria-current],
#wsg-quick-order-form a.swiper-slide.wsg-nav-link.active,
#wsg-quick-order-form a.swiper-slide.wsg-nav-link.wsg-nav-link-active {
  background: #212121 !important;
  color: #FFFFFF !important;
  border-color: #212121 !important;
}

/* Überschriften auf Gorillas Seiten.

   Die Regel galt zuerst für alle `h1` und `h2` in `.wsg-proxy-container` —
   gedacht war sie fürs Schnellbestellformular, wo die Überschrift linksbündig
   stehen soll wie im übrigen Shop. Auf der Anmeldeseite ist aber alles andere
   zentriert, dort hing die Überschrift dann schief.

   Jetzt: `h1` zentriert, ausser im Schnellbestellformular. Die
   Abschnittsüberschriften (`h2`, „Ihre Angaben", „Lieferadresse") bleiben
   linksbündig — sie gehören zu den Feldern darunter. */
.wsg-proxy-container h1 {
  text-align: center;
}

.wsg-proxy-container h2 {
  text-align: left;
}

#wsg-quick-order-form h1 {
  text-align: left;
}

/* Die Hülle brachte einen großen Leerraum zwischen Titel und Inhalt mit */
#wsg-quick-order-form {
  margin-top: 0;
  padding-top: 0;
}

#wsg-quick-order-form > *:first-child {
  margin-top: 0;
}

/* Suchfeld auf die Feldbreite des Themes bringen */
#wsg-quick-order-form input[type="text"],
#wsg-quick-order-form input[type="search"] {
  max-width: 420px;
  width: 100%;
}

/* Tabellenzeilen ruhiger: Linien in der CI-Farbe statt im Grau des Browsers */
#wsg-quick-order-form table {
  width: 100%;
  border-collapse: collapse;
}

#wsg-quick-order-form td,
#wsg-quick-order-form th {
  border-color: #C6C1B8;
}

/* Knopf in CI statt im ausgegrauten Standard */
.wsg-proxy-container #wsg-submit {
  background: #212121 !important;
  border-color: #212121 !important;
  color: #FFFFFF !important;
  border-radius: 6px;
  padding-inline: 2.5rem;
}

.wsg-proxy-container #wsg-submit:hover {
  background: #000000 !important;
  border-color: #000000 !important;
}

/* ==========================================================================
   Gorillas Prüfseite vor der Kasse (/pages/ws-cart)

   Sie ist Gorillas Bestellweg, nicht ein doppelter Warenkorb — „Auschecken"
   in der Schublade führt hierher. Klassennamen aus dem Inspektor (11.08.),
   Gorillas eigenes Stylesheet ist `wscart.css`:

     #wsg-cart-main                  äußerer Rahmen
     #wsg-cart-items.wsg-cart-table  Positionsliste
     .wsg-cart-product               eine Position
     .wsg-product-img                Bild
     .wsg-product-full-info-block    Titel, Preis, Menge (Flex, space-between)
     .wsg-cart-bottom-block          Summe und Knöpfe
     #wsg-cart-shipping              Versandschritt
   ========================================================================== */

/* Positionen als abgesetzte Zeilen statt als lose Reihe */
#wsg-cart-main .wsg-cart-product {
  padding-block: 1.1rem;
  border-bottom: 1px solid #C6C1B8;
}

#wsg-cart-main .wsg-cart-product:last-of-type {
  border-bottom: 0;
}

/* Gorilla reserviert für das Bild 172 px und zentriert es darin — bei
   unserem 72-px-Bild blieben links 50 px Luft, die Positionen wirkten
   eingerückt (Mirco, 14.09.). Spalte auf Bildbreite plus Abstand, Bild
   linksbündig an der Kante, an der auch Überschrift und Linien stehen. */
#wsg-cart-main .wsg-product-img,
#wsg-cart-main .wsg-product-img .wsg-product-img-link {
  width: 92px !important;
  justify-content: flex-start;
}

/* Gorillas Textspalte ist auf `calc(100% - 516px)` festgelegt — gerechnet
   mit der 172-px-Bildspalte. Nach dem Schmälern blieb rechts Luft, Preis
   und Papierkorb rückten von der Kante weg. Die Textspalte füllt jetzt,
   was übrig ist; Menge, Preis und Papierkorb sitzen wieder rechts bündig. */
#wsg-cart-main .wsg-product-info-block {
  width: auto !important;
  flex: 1 1 auto;
  min-width: 0;
}

/* … und die Hülle darum ebenso: `.wsg-product-full-info-block` steht bei
   Gorilla auf `calc(100% - 172px)` — die eigentliche Ursache der rechten
   Einrückung. Füllt jetzt den Platz neben dem Bild. */
#wsg-cart-main .wsg-product-full-info-block {
  width: auto !important;
  flex: 1 1 auto;
  min-width: 0;
  padding-left: 20px;
}

/* Produktbild auf ein ruhiges Maß, mit demselben Rahmen wie die Kacheln */
#wsg-cart-main .wsg-product-img img {
  width: 72px;
  height: 72px;
  object-fit: contain;
  background: #FFFFFF;
  border: 1px solid #C6C1B8;
  border-radius: 6px;
  padding: 4px;
}

/* Der Infoblock zieht sich über `calc(100% - 172px)` — auf schmalen
   Fenstern quetscht das den Titel. Unter 750 px umbrechen lassen. */
@media (max-width: 749px) {
  #wsg-cart-main .wsg-product-full-info-block {
    width: 100% !important;
    padding-left: 1rem !important;
    flex-wrap: wrap;
    gap: 0.5rem;
  }
}

/* Nettozeilen auf der Prüfseite in eine eigene Zeile zwingen — Gorillas
   Infoblock ist ein Flex-Container, sonst kleben sie am Bruttobetrag. */
#wsg-cart-main .hh-netto {
  display: block !important;
  flex: 0 0 100%;
  width: 100%;
  margin-top: 0.1rem;
  font-size: 0.8rem;
  color: #675F4B;
  white-space: nowrap;
}

/* Summenbereich absetzen */
#wsg-cart-main .wsg-cart-bottom-block {
  margin-top: 1.5rem;
  padding-top: 1.25rem;
  border-top: 1px solid #C6C1B8;
}

/* Gorillas Knöpfe in CI */
#wsg-cart-main button,
#wsg-cart-main .wsg-button-fix {
  border-radius: 6px;
}

/* ==========================================================================
   Händler-Links nur dort zeigen, wo sie Sinn ergeben

   Shopify-Menüs kennen keine Bedingungen. Die Kennung `hh-haendler` setzt
   layout/theme.liquid im <head>, sobald ein Kunde den Tag `b2b` trägt.

   Schnellbestellformular   nur für angemeldete Firmenkunden — sonst führt es
                            auf eine Seite, die ohne Anmeldung leer ist
   Firmenkonto anlegen      nur für Nicht-Firmenkunden — wer eins hat,
   Firmen-Login             braucht beides nicht mehr

   Die Kollektion `spielgerate-gewerblich` stand hier bis zum 10.09.2026
   ebenfalls. Sie ist jetzt öffentlich: Kommunen, Kitas und Vereine kaufen
   dort ein, und die Produkte waren über Bestseller, Sortiment und Suche
   ohnehin erreichbar. Nur die Preise bleiben der Anmeldung vorbehalten.

   `li:has(...)` blendet den ganzen Listenpunkt aus; ohne das bliebe in
   manchen Fußzeilen-Varianten ein leerer Aufzählungspunkt stehen.
   ========================================================================== */

:root:not(.hh-haendler) li:has(> a[href^="/pages/ws-quick-order-form"]),
:root:not(.hh-haendler) a[href^="/pages/ws-quick-order-form"] {
  display: none !important;
}

:root.hh-haendler li:has(> a[href^="/pages/ws-account-create"]),
:root.hh-haendler li:has(> a[href^="/pages/ws-account-login"]),
:root.hh-haendler a[href^="/pages/ws-account-create"],
:root.hh-haendler a[href^="/pages/ws-account-login"] {
  display: none !important;
}

/* ==========================================================================
   B2B: Umschalter zwischen Brutto- und Nettoanzeige

   Vorbild contorion.de. Der Schalter sitzt im Kopf, ein zweiter Einstieg als
   Textlink in der Fußzeile. Er setzt nur die Klasse `hh-netto-modus` auf
   <html>; die Umschaltung passiert hier per CSS.

   Wichtig: Die Bruttowerte werden NICHT überschrieben, sondern ausgeblendet.
   Wholesale Gorilla schreibt laufend in dieselben Elemente — würden wir
   dagegenhalten, flackerte es.
   ========================================================================== */

/* Rabattstufe des Händlers. Zwei Orte, ein Stil-Gedanke:
   in der Kopfzeile als ruhige Pille neben dem Steuerschalter, im Portal
   als Zeile über dem Inhalt. Gefüllt wird beides per JavaScript
   (layout/theme.liquid) — ohne Händlerkonto ist nichts davon im HTML. */
.hh-stufe {
  display: inline-flex;
  align-items: center;
  /* Flacher als hoch: schmales Innenmaß oben und unten, damit die Pille
     neben den Symbolen der Kopfzeile ruhig wirkt. */
  /* Feste Höhe statt Innenmass oben/unten: so sind beide Pillen exakt
     gleich hoch, unabhängig von Schriftgrösse und Zeilenhöhe. */
  height: 28px;
  /* Mittig zu Suche, Konto und Warenkorb. `align-self` wirkt nur, wenn
     die Kopfzeile ein Flex-Container ist — ist sie nicht, schadet es
     nichts. Die Ausrichtung wird hier am eigenen Element gesetzt, nicht
     am Container: der trägt auch Suche, Konto und Warenkorb. */
  align-self: center;
  /* Zweiter Weg für den Fall, dass die Kopfzeile kein Flex-Container
     ist: dann zählt die Grundlinie, nicht align-self. */
  vertical-align: middle;
  padding: 0 0.6rem;
  margin-inline-end: 0.6rem;
  border-radius: 999px;
  background: #EFEAE0;
  font-size: 0.72rem;
  line-height: 1.4;
  color: #4B463E;
  white-space: nowrap;
}

.hh-stufe[hidden] {
  display: none;
}

.hh-stufe-portal {
  margin: 0 0 1.25rem;
  padding: 0.6rem 0.9rem;
  border-radius: 6px;
  background: #EFEAE0;
  font-size: 0.95rem;
  color: #4B463E;
}

/* Dunkle Fassung, entspricht dem Sekundär-Button der CI:
   Fläche #4B463E, Text Sand, beim Überfahren invertiert. Das hebt den
   Schalter von der hellen Stufen-Pille ab, statt beide gleich blass
   nebeneinanderzustellen. */
.hh-steuerschalter {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  height: 28px;
  align-self: center;
  /* Zweiter Weg für den Fall, dass die Kopfzeile kein Flex-Container
     ist: dann zählt die Grundlinie, nicht align-self. */
  vertical-align: middle;
  padding: 0 0.45rem 0 0.35rem;
  border: 1px solid #212121;
  border-radius: 999px;
  background: #212121;
  font: inherit;
  font-size: 0.72rem;
  line-height: 1;
  color: #FFFFFF;
  cursor: pointer;
  white-space: nowrap;
}

/* Kein Farbwechsel beim Überfahren. Die Pille bleibt dunkel — sie ist
   ein Zustandsanzeiger, kein Knopf, der sich melden muss. Der Punkt
   allein zeigt, was gerade gilt. */

/* „inkl. MwSt." und „exkl. MwSt." sind unterschiedlich breit — beim
   Umschalten wäre die Pille gesprungen und der Punkt mit ihr. Feste
   Breite am Textfeld, in em: sie wächst mit der Schriftgrösse mit und
   ist bemessen auf die längere der beiden Beschriftungen. Dadurch
   bleibt der Punkt an derselben Stelle. */
.hh-steuerschalter__text {
  display: inline-block;
  width: 6.1em;
  text-align: left;
}

/* Der Punkt zeigt den Zustand. Auf dunklem Grund muss er hell werden,
   sonst verschwindet er. Beim Überfahren kehrt sich das mit um. */
.hh-steuerschalter__punkt {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.35);
  transition: background 0.15s ease;
}

.hh-netto-modus .hh-steuerschalter__punkt {
  background: #FFFFFF;
}

/* Mobil (14.09.2026, Mirco: „hier oben stört unser mwst schalter"): Die
   Pille lag über dem mittigen Logo. Für Gäste fällt sie in der Kopfzeile
   weg — die Einladung zum Firmenkonto steht auf der Startseite im Band und
   in der Fußzeile bei „Preisanzeige". Firmenkunden behalten den Schalter,
   aber knapper: kleinere Schrift, Textfeld ohne feste Breite. Die
   Stufen-Pille wandert mobil ebenfalls aus der Kopfzeile. */
@media screen and (max-width: 749px) {
  .hh-steuerschalter--gast,
  .hh-stufe {
    display: none !important;
  }

  .hh-steuerschalter {
    height: 24px;
    gap: 0.3rem;
    padding: 0 0.4rem 0 0.3rem;
    font-size: 0.62rem;
  }

  .hh-steuerschalter__text {
    width: auto;
  }
}

/* Soziale Symbole in der Fusszeile: grösser und weiss.

   Das Theme setzt sie auf `--icon-size-lg` und erbt die Textfarbe des
   Farbschemas — auf dem dunklen Grund wirkten sie stumpf und zu klein.
   Nur innerhalb der Fusszeile; im übrigen Shop bleibt alles wie es ist. */
/* Das Bestellformular ist der meistgenutzte Weg eines Händlers in den Shop.
   Menüeinträge tragen keine eigenen Klassen, deshalb über die Adresse
   angesprochen — das trifft den Eintrag, egal in welchem Menü er steht. */
a[href*="ws-quick-order-form"] {
  font-weight: 600;
}

/* Der Selektor muss `.shopify-section-group-footer-group` heissen — die
   Fusszeile trägt KEINE Klasse `.footer`, sondern nur `.section` und ihr
   Farbschema. Die erste Fassung griff deshalb ins Leere. */
.shopify-section-group-footer-group .social-icons__icon-wrapper,
.shopify-section-group-footer-group .social-icons__icon {
  width: 36px;
  height: 36px;
}

.shopify-section-group-footer-group .social-icons__icon-wrapper {
  color: #FFFFFF;
}

.shopify-section-group-footer-group .social-icons__icon,
.shopify-section-group-footer-group .social-icons__icon path {
  fill: currentColor;
  color: #FFFFFF;
}

.shopify-section-group-footer-group .social-icons__wrapper {
  gap: 16px;
}

/* Fusszeile: der Steuerschalter als vierte Spalte der Abschlusszeile,
   zusammen mit Newsletter, Sozialen Medien und Zahlungsarten.

   WICHTIG — die Fusszeile ist dunkelbraun. Die Kopfzeilen-Fassung des
   Schalters ist ebenfalls dunkel und würde hier verschwinden. Deshalb
   umgekehrt: helle Fläche, dunkler Text. Nur innerhalb dieser Spalte,
   die Kopfzeile bleibt unberührt. */
.hh-fuss-schalter {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
}

/* Als <h6> ausgezeichnet, damit dieselbe Überschriftenform greift wie bei
   „Newsletter", „Folgen Sie uns" und „Zahlungsarten" — Grösse, Gewicht und
   Laufweite kommen aus dem Theme, nicht von hier. Nur der Aussenabstand
   muss weg, den bringt h6 von Haus aus mit. */
.hh-fuss-schalter__titel {
  margin: 0;
}

/* In der Fusszeile ebenfalls schwarz — aber mit heller Kante. Der Grund
   dort ist #2F2C27; ohne Rahmen verschwände die Pille fast vollständig. */
.hh-fuss-schalter .hh-steuerschalter {
  background: #212121;
  border-color: rgba(255, 255, 255, 0.25);
  color: #FFFFFF;
}

/* Fußzeile: derselbe Schalter als Textzeile mit Standortangabe */
.hh-steuerhinweis-fuss {
  font-size: 0.85rem;
  color: #675F4B;
}

.hh-steuerhinweis-fuss button {
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: #4B463E;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
}

/* --- Was der Modus umschaltet ------------------------------------------- */

/* Mit Schalter ist immer GENAU EIN Preis sichtbar — nicht beide.
   Zwei Zahlen untereinander zwingen zum Nachdenken, welche gilt. */

/* ⚠️ Der Umschalter gilt NUR für Produktpreise, NICHT für den Warenkorb.

   Im Warenkorb hatte die Umschaltung den Bruttopreis ausgeblendet, ohne
   dass die Nettozeile zuverlässig an seine Stelle trat — es standen gar
   keine Preise mehr da. Im Warenkorb zählt Sichtbarkeit mehr als
   Konsequenz: dort steht der Bruttobetrag und darunter klein der Netto,
   in beiden Ansichten. Die Aufschlüsselung darunter (19 % MwSt.,
   Gesamt netto) liefert ohnehin beide Werte.

   Erkennbar sind die Warenkorb-Zeilen am Attribut `data-hh-netto` — sie
   kommen aus cart-products.liquid, die anderen setzt das Skript. */

/* Bruttomodus: Nettozeile an Produktpreisen verborgen, im Warenkorb bleibt sie */
:root:not(.hh-netto-modus) .hh-netto:not([data-hh-netto]) {
  display: none !important;
}

/* Nettomodus: Bruttopreis weg, Nettowert übernimmt dessen Darstellung */
.hh-netto-modus product-price .price {
  display: none !important;
}

/* `inline`, damit ein vorangestelltes „ab" auf derselben Zeile bleibt.
   Als Block stand „ab" allein über dem Preis. Gilt nicht für den
   Warenkorb — dort bleibt die Nettozeile die kleine Zweitzeile. */
.hh-netto-modus .hh-netto:not([data-hh-netto]) {
  display: inline !important;
  flex: 0 1 auto;
  width: auto;
  margin: 0;
  font-size: inherit;
  font-weight: inherit;
  line-height: inherit;
  color: inherit;
}

/* Die Angabe „inkl./exkl. MwSt." steht seit 11.08. IM Text, nicht mehr als
   CSS-Endung. Grund: Im Bruttomodus fehlte sie, und im Warenkorb standen
   zwei Zahlen untereinander, ohne dass erkennbar war, welche welche ist. */
.hh-brutto-hinweis {
  font-size: 0.8rem;
  font-weight: 400;
  color: #675F4B;
  white-space: nowrap;
}

/* Firmen-Prüfseite: Gorilla gibt dem Preisblock feste 130 px (120 px auf
   kleinen Schirmen). „1.792,05 € inkl. MwSt." passt da nicht hinein — das
   € brach um, nach dem geschützten Leerzeichen klebte die Zahl am
   Mengenfeld (Mirco, 14.09.). Der Block wächst jetzt mit seinem Inhalt,
   hält Abstand zum Mengenfeld, und der Hinweis darf als eigene Zeile
   darunter rutschen. */
#wsg-cart-main .wsg-line-price-block {
  width: auto !important;
  min-width: 130px;
  flex-shrink: 0;
  padding-left: 16px;
}

#wsg-cart-main .wsg-line-price-block .hh-brutto-hinweis {
  display: inline-block;
}

/* Zwei Fassungen des Steuerhinweises, je nach Modus */
.hh-netto-modus .hh-wenn-brutto,
:root:not(.hh-netto-modus) .hh-wenn-netto {
  display: none;
}

/* ==========================================================================
   B2B: Nettopreis unter dem Bruttopreis

   Erscheint nur bei angemeldeten Händlern. Der Wert wird im Browser
   gerechnet, weil Wholesale Gorilla die Händlerpreise erst nach dem Laden
   einsetzt — siehe den Block am Ende von layout/theme.liquid.
   ========================================================================== */
/* Die Zeile steht IM Preiselement, nicht daneben — als Nachbar rutscht sie
   in Rasterlayouts wie der Warenkorbzeile in die falsche Zelle.
   `!important` ist nötig, weil Horizons Preiszeile ein Flex-Container ist:
   ohne das stünde „2,28 € netto" direkt hinter „€2,71". */
.hh-netto {
  display: block !important;
  flex: 0 0 100%;
  width: 100%;
  margin-top: 0.15rem;
  font-size: 0.8rem;
  font-weight: 400;
  line-height: 1.3;
  color: #675F4B;
  white-space: nowrap;
}

/* Steuer und Nettosumme unter dem Gesamtbetrag im Warenkorb.
   Vorbild contorion.de: Der Gesamtbetrag bleibt brutto, darunter stehen
   ruhiger gesetzt die enthaltene Steuer und die Nettosumme. */
.hh-steuerzeile {
  font-size: 0.9rem;
  color: #675F4B;
}

.hh-steuerzeile--netto {
  font-weight: 600;
  color: #4B463E;
}

/* Vor dem Preis steht bei Spannen ein "ab". Es liegt bewusst außerhalb
   von .price, weil Gorilla dessen Inhalt ersetzt. */
.hh-preis-ab {
  white-space: nowrap;
}

/* Steuerhinweis unter dem Preis (Pflichtangabe nach PAngV) */
.hh-steuerhinweis {
  margin: 0.35rem 0 0 0;
  font-size: 0.85rem;
  opacity: 0.75;
  line-height: 1.4;
}

.hh-steuerhinweis a {
  color: inherit;
  text-decoration: underline;
}

/* Dieselbe Angabe auf Produktkacheln — kleiner, damit sie die Kachel
   nicht dominiert. Der Link braucht z-index, weil product-card__link
   die ganze Kachel überlagert. */
.hh-steuerhinweis--karte {
  margin: 0.2rem 0 0 0;
  font-size: 0.75rem;
  line-height: 1.3;
}

.hh-steuerhinweis--karte a {
  position: relative;
  z-index: 2;
}

/* ==========================================================================
   Kollektionsseiten: Kopf und Textabschnitte
   Inhalte kommen aus Titel/Beschreibung der Kollektion und aus den
   Metafeldern custom.einleitung_bild und custom.abschnitte.
   ========================================================================== */

/* Farbige Bänder für Holzarten-Leiste und Textabschnitte.

   Das Band gehört zu MEINEM Inhalt, nicht zur Shopify-Sektion. Eine Sektion
   rendert ihren Hintergrund auch dann, wenn der Block darin nichts ausgibt —
   auf Kollektionen ohne Text stand deshalb ein leeres beiges Band in der
   Seite. Jetzt liegen beide Bereiche in eigenen Sektionsdateien, die bei
   fehlendem Inhalt gar nichts ausgeben, und die Fläche kommt von hier. */
.hh-band {
  background: #F7F4EF;
  width: 100%;
}

.hh-band--holzarten {
  padding-block: 28px;
}

.hh-band--text {
  padding-block: 56px;
  margin-top: 32px;
}

/* Auf die Inhaltsbreite des Themes ziehen.
   Horizons `.section` ist ein Grid, das nur seine direkten Kinder in die
   mittlere Spalte setzt (`.section--page-width > * { grid-column: 2 }`).
   Der Inhalt eines Custom-Liquid-Blocks liegt eine Ebene tiefer und lief
   deshalb bis an den Fensterrand. `max-width` statt fester Breite, damit
   die Regel auch dann stimmt, wenn ein Elternelement schon begrenzt --
   dann greift sie einfach nicht. */
.hh-kolkopf,
.hh-kolabschnitte {
  width: 100%;
  max-width: var(--page-content-width);
  margin-inline: auto;
}

/* ENTSCHIEDEN (10.08.): Der Textbereich bekommt KEINE Zeilenlängen-Begrenzung.
   Zweimal versucht (78ch, dann 68ch), zweimal verworfen -- auch auf dem
   warmen Grund wirkt eine schmale Spalte neben dem breiten Raster falsch.
   Nicht wieder einbauen. */
.hh-kolkopf__text,
.hh-kolabschnitt__text {
  width: 100%;
}

/* Überschriftenhierarchie
   h1  Kollektionstitel        (Theme-Vorgabe)
   h2  Abschnittsüberschrift   hier gedämpft, die Theme-Vorgabe war zu wuchtig
   h3  Zwischenüberschrift     innerhalb eines Abschnitts
   Alles, was im Fließtext als h1 oder h2 gesetzt wird, wandelt der Baustein
   `hh_abschnitte` in ein h3 um -- die Gliederung bleibt dadurch sauber,
   egal was im Backend angeklickt wird. */
.hh-kolkopf__titel {
  margin: 0 0 0.6rem 0;
}

.hh-kolabschnitt__titel {
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  line-height: 1.2;
}

.hh-kolabschnitt__text .rte h3 {
  font-size: clamp(1.15rem, 1.4vw, 1.35rem);
  line-height: 1.3;
  margin: 1.6rem 0 0.5rem 0;
}

.hh-kolkopf__einstieg > *:last-child,
.hh-kolabschnitt__text > .rte > *:last-child {
  margin-bottom: 0;
}

/* Zweispaltig erst, wenn ein Einleitungsbild hinterlegt ist.
   Das Bild bleibt schmal — es begleitet den Text, es trägt ihn nicht. */
/* Raster 3:2 wie auf der bestehenden Website — Text drei Teile, Bild zwei.
   Der Kreis ist auf 380 px gedeckelt: ohne Deckel würde er bei 1400 px
   Inhaltsbreite 560 px groß und risse wieder eine Lücke unter den kurzen
   Einstiegstext. Deckel raus, wenn er größer sein soll. */
.hh-kolkopf--zweispaltig {
  display: grid;
  grid-template-columns: 3fr 2fr;
  gap: 3rem;
  align-items: center;
  width: 100%;
}

.hh-kolkopf__bild {
  justify-self: end;
  width: 100%;
  max-width: 380px;
  margin: 0;
}

/* Rund, wie auf der bestehenden Website */
.hh-kolkopf__bild img {
  display: block;
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: 50%;
}

/* Schnellzugriff nach Holzart — runde Produktfotos über dem Raster.

   Die Sektion richtet ihre Kinder mittig aus und schrumpft sie auf
   Inhaltsbreite. Dagegen hilft nur `!important`: Horizon sammelt die
   `{% stylesheet %}`-Blöcke seiner Sektionen ein und hängt sie NACH
   custom.css in die Seite. Dieselbe Begründung wie beim Mega-Menü oben. */
.hh-holzarten {
  display: flex !important;
  flex-wrap: wrap;
  justify-content: flex-start !important;
  align-self: stretch !important;
  gap: 1.6rem;
  width: 100% !important;
  max-width: var(--page-content-width) !important;
  margin-inline: auto !important;
  padding: 0;
}

.hh-holzart {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.55rem;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
  font: inherit;
  color: #675F4B;
}

.hh-holzart__kreis {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border-radius: 50%;
  overflow: hidden;
  background: #F7F4EF;
  box-shadow: 0 0 0 2px transparent;
  transition: box-shadow 0.15s ease;
}

.hh-holzart__kreis img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* „Alle" trägt keine Produktfoto-Fläche und wirkte ohne Umrandung wie
   blosser Text, sobald eine Holzart gewählt war. Der Rahmen steht deshalb
   dauerhaft — die dickere Markierung der aktiven Wahl kommt getrennt über
   `box-shadow` und bleibt dadurch unterscheidbar. */
.hh-holzart__kreis--alle {
  font-size: 0.8rem;
  color: #4B463E;
  background: #FFFFFF;
  border: 1px solid #C6C1B8;
}

.hh-holzart__text {
  font-size: 0.85rem;
  line-height: 1.2;
}

.hh-holzart:hover .hh-holzart__kreis,
.hh-holzart.is-aktiv .hh-holzart__kreis {
  box-shadow: 0 0 0 2px #4B463E;
}

.hh-holzart.is-aktiv .hh-holzart__text {
  color: #4B463E;
  font-weight: 600;
}

.hh-kolabschnitte {
  display: grid;
  gap: 2.75rem;
  width: 100%;
}

.hh-kolabschnitt__titel {
  margin: 0 0 0.75rem 0;
}

/* Ohne Bild läuft der Abschnitt einspaltig — der Regelfall. */
.hh-kolabschnitt--bild {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.7fr);
  gap: 2.5rem;
  align-items: center;
}

/* Bild links: Reihenfolge tauschen, Markup bleibt Text-zuerst,
   damit Vorlesegeräte die Überschrift zuerst bekommen. */
.hh-kolabschnitt--links .hh-kolabschnitt__text { order: 2; }
.hh-kolabschnitt--links .hh-kolabschnitt__bild { order: 1; }

.hh-kolabschnitt__bild {
  margin: 0;
}

.hh-kolabschnitt__bild img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 8px;
}

/* Kauf-Link am Absatzende. Bewusst kein Knopf: auf der bestehenden Website
   stehen diese Verweise als schlichte Textlinks unter dem Absatz. Damit
   sieht ein Link aus dem Feld genauso aus wie einer im Fließtext. */
.hh-kolabschnitt__text .rte a,
.hh-kolabschnitt__knopf {
  color: #4B463E;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}

.hh-kolabschnitt__text .rte a:hover,
.hh-kolabschnitt__knopf:hover {
  color: #675F4B;
}

.hh-kolabschnitt__knopf {
  display: inline-block;
  margin-top: 0.9rem;
}

@media (max-width: 749px) {
  .hh-kolkopf--zweispaltig,
  .hh-kolabschnitt--bild {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }

  /* Bild oben, Text darunter — auch wenn "links" gewählt ist */
  .hh-kolabschnitt--links .hh-kolabschnitt__text,
  .hh-kolabschnitt--links .hh-kolabschnitt__bild {
    order: initial;
  }

  .hh-kolkopf__bild img {
    max-width: 220px;
    margin-inline: auto;
  }

  .hh-kolabschnitte {
    gap: 2rem;
  }
}

/* Hersteller/Marke über dem Produkttitel — nur bei Fremdmarken sichtbar */
.hh-marke {
  margin: 0 0 0.25rem 0;
  font-size: 0.8rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.7;
}

/* Produktbild auf der Detailseite begrenzen */

product-card .product-card__content {
  height: 100%;
}

/* Holzhof: Produkttitel in der Kachel auf zwei Zeilen, Rest mit Auslassungspunkten.
   Bewusste Entscheidung (04.08.): Bei diesem Sortiment steht die Unterscheidung
   oft am Titelende ("roh - ohne Impraegnierung" gegen "KDI - gruen"). Der Kunde
   sieht sie erst nach einem Klick auf die Produktseite. Das wurde abgewogen und
   zugunsten der ruhigeren Kachelansicht entschieden.
   Greift nur in der Kachel (<product-card>), nicht auf der Produktseite. */
product-card a[ref="productTitleLink"] p {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ==========================================================================
   Gorillas Kaufknöpfe (Prüfseite, Schnellbestellformular)

   Ursache der grauen, unfertigen Knöpfe: In `snippets/wsg-custom.liquid`
   stand noch Gorillas Platzhalter `xxButtonClassesHerexx` statt der
   Button-Klasse des Themes. Am 11.08. auf `button` gesetzt — damit greift
   Horizons Grundgestaltung. Was hier folgt, bringt sie auf die CI und
   fängt den Ladezustand ab.

     #wsg-checkout-one   Hauptknopf „Bezahlen"
     .button--loading    Gorillas Ladezustand (blendet .button__text aus)
     .spof-btn           Schnellbestell-Knopf, den Gorillas JS inline färbt
   ========================================================================== */

/* Luft zwischen Summe und Kaufknopf.

   Der Knopf kommt aus Gorillas nachgeladenem Markup, das Passwort auf dem
   Storefront verhindert einen Blick hinein — deshalb bekommen alle
   infrage kommenden Ebenen denselben Abstand statt nur eine geratene. */
/* NUR der Kaufknopf. Vorher stand hier zusätzlich
   `.wsg-cart-bottom-block button` — das traf auch die Notiz-Zeile über der
   Summe, schob sie um 2,75rem nach unten und alles darunter gleich mit. */
/* NUR auf dem Container. Lag der Abstand zusätzlich auf `#wsg-finalize`,
   addierten sich beide zu 5,5rem. */
.wsg-proxy-container .wsg-checkout-buttons,
#wsg-cart-main #wsg-checkout-one {
  margin-top: 2.75rem !important;
}

/* Gorillas Summenbereich brachte oben zu viel Luft mit */
#wsg-cart-main .wsg-cart-bottom-block {
  margin-top: 0.75rem !important;
  padding-top: 1rem !important;
}

/* Horizons eigener Warenkorb: Knopfbereich und Summen sind Geschwister */
.cart__ctas,
.cart-drawer__summary .cart__ctas {
  margin-block-start: 2.75rem !important;
}

/* Shopifys Schnellkasse-Knöpfe laden als grauer Platzhalter nach und
   sassen ohne Abstand direkt unter dem Betrag */
.additional-checkout-buttons {
  margin-block-start: 2.75rem !important;
}

.wsg-proxy-container #wsg-checkout-one,
#wsg-cart-main #wsg-checkout-one,
.wsg-proxy-container #wsg-finalize,
.wsg-proxy-container button.wsg-button-fix {
  background: #212121 !important;
  border: 1px solid #212121 !important;
  color: #FFFFFF !important;
  border-radius: 6px !important;
  min-width: 220px;
  padding: 0.85rem 2.5rem !important;
  font-size: 1rem;
  line-height: 1.3;
  letter-spacing: 0.01em;
}

.wsg-proxy-container #wsg-checkout-one:hover,
#wsg-cart-main #wsg-checkout-one:hover,
.wsg-proxy-container button.wsg-button-fix:hover {
  background: #000000 !important;
  border-color: #000000 !important;
}

/* --------------------------------------------------------------------------
   Der Kaufknopf heisst `#wsg-finalize` (Inspektor, 11.08.). `.button--loading`
   aus dem Anmeldeformular gilt hier NICHT — Gorilla nutzt auf der Prüfseite
   ein anderes Verfahren:

     <button id="wsg-finalize" class="… wsg-button-fix … wsg-loading-btn" disabled>
       <span id="wsg-finalize-text" class="hide">Bezahlen</span>
       <span id="wsg-finalize-loader" class="data-loader">…</span>
     </button>

   Beim Laden bekommt der Knopf `wsg-loading-btn` und `disabled`, der Text
   wird per `.hide` ausgeblendet und der Ladekringel eingeblendet. Der zieht
   die Höhe auf — daher wirkte der Knopf als grauer Klotz.
   -------------------------------------------------------------------------- */

/* Feste Höhe, damit zwischen Beschriftung und Ladekringel nichts springt.
   Als Flex-Box, weil `overflow: hidden` mit fester Zeilenhöhe den Kringel
   schlicht abgeschnitten hat — der Knopf stand dann leer da. */
.wsg-proxy-container #wsg-finalize {
  display: flex !important;
  align-items: center;
  justify-content: center;
  height: 52px !important;
  padding-block: 0 !important;
  line-height: normal !important;
}

/* Im Ladezustand Farbe halten statt in Grau zu verfallen */
.wsg-proxy-container #wsg-finalize:has(#wsg-finalize-text.hide),
.wsg-proxy-container #wsg-finalize:disabled,
.wsg-proxy-container button.wsg-button-fix:disabled {
  background: #212121 !important;
  border-color: #212121 !important;
  color: #FFFFFF !important;
  opacity: 1 !important;
  cursor: progress;
}

/* Gorillas Ladekringel bringt kein eigenes Mass mit und dehnte den Knopf
   auf ~85 px. Sein Innenleben kommt aus dem nachgeladenen Markup und ist
   von hier nicht zuverlaessig zu treffen — deshalb wird er ausgeblendet
   und durch einen eigenen ersetzt, der in die 52 px passt. */
   Ausgeloest wird ueber `#wsg-finalize-text.hide`, nicht ueber
   `.wsg-loading-btn` oder `:disabled`: die Klasse stand im Inspektor auch
   im Ruhezustand in der Liste, und `disabled` ist der Knopf auch bei leerem
   Warenkorb. Beides wuerde den Kringel dauerhaft drehen lassen.
   Der ausgeblendete Text dagegen heisst eindeutig: laedt gerade. */
.wsg-proxy-container #wsg-finalize:has(#wsg-finalize-text.hide) #wsg-finalize-loader {
  display: none !important;
}

.wsg-proxy-container #wsg-finalize:has(#wsg-finalize-text.hide)::after {
  content: "";
  width: 22px;
  height: 22px;
  border: 3px solid rgba(203, 193, 169, 0.35);
  border-top-color: #CBC1A9;
  border-radius: 50%;
  animation: hh-kringel 0.8s linear infinite;
}

@keyframes hh-kringel {
  to { transform: rotate(1turn); }
}

/* ==========================================================================
   Eigenschaftstabelle auf der Produktseite

   Löst die HTML-Tabellen ab, die aus Ecwid in den Beschreibungen steckten.
   Zeilenlinien sind hier bewusst gesetzt: eine Datentabelle ohne Trennung
   ist auf Zeilenhöhe nicht mehr lesbar, und die alte Tabelle hatte sie auch.
   Auf schmalen Fenstern bricht sie in zwei Zeilen um — die alte tat das nicht.
   ========================================================================== */
.hh-eig {
  width: 100%;
  border-collapse: collapse;
  margin-top: 1.5rem;
  font-size: 0.95rem;
}

.hh-eig__zeile {
  border-bottom: 1px solid #E3DED3;
}

.hh-eig__zeile:last-child {
  border-bottom: 0;
}

.hh-eig__bez {
  width: 34%;
  padding: 0.65rem 1rem 0.65rem 0;
  text-align: left;
  font-weight: 600;
  color: #4B463E;
  vertical-align: top;
}

.hh-eig__wert {
  padding: 0.65rem 0;
  color: #675F4B;
  vertical-align: top;
}

@media (max-width: 599px) {
  .hh-eig__bez,
  .hh-eig__wert {
    display: block;
    width: 100%;
  }
  .hh-eig__bez { padding-bottom: 0.15rem; }
  .hh-eig__wert { padding-top: 0; padding-bottom: 0.75rem; }
}

/* ==========================================================================
   Händlerexklusive Ware für Nicht-Händler

   Wholesale Gorilla sperrt die Produktseite („Einloggen und ansehen"), lässt
   die Kachel in der Kollektion aber stehen. Der Hinweis kommt deshalb eine
   Ebene früher — sonst klickt sich jemand durch und läuft in eine Sperrseite.
   ========================================================================== */

.hh-haendlerhinweis {
  grid-column: 2;
  width: 100%;
  max-width: var(--page-content-width);
  margin: 0 auto 1.5rem auto;
  padding: 1.25rem 1.5rem;
  background: #F7F4EF;
  border-left: 3px solid #CBC1A9;
  border-radius: 6px;
}

.hh-haendlerhinweis__text {
  margin: 0;
  color: #4B463E;
  font-size: 0.95rem;
  line-height: 1.5;
}

.hh-haendlerhinweis__links {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  flex-wrap: wrap;
  margin: 0.9rem 0 0 0;
  font-size: 0.9rem;
}

.hh-haendlerhinweis__links a {
  color: #4B463E;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.hh-haendlerhinweis__knopf {
  padding: 0.5rem 1.5rem;
  border-radius: 999px;
  background: #CBC1A9;
  color: #212121 !important;
  text-decoration: none !important;
  font-weight: 600;
}

.hh-haendlerhinweis__knopf:hover {
  background: #4B463E;
  color: #FFFFFF !important;
}

/* Steht auf der Kachel anstelle des Preises */
.hh-nur-haendler {
  display: inline-block;
  padding: 0.2rem 0.7rem;
  border: 1px solid #C6C1B8;
  border-radius: 999px;
  background: #F7F4EF;
  color: #675F4B;
  font-size: 0.8rem;
  white-space: nowrap;
}

/* Steht auf der Produktseite anstelle des Kaufknopfs, wenn die Ware
   gewerblich ist und niemand angemeldet ist. Siehe blocks/buy-buttons.liquid. */
.hh-kauf-gesperrt {
  margin: 1.25rem 0;
  padding: 1rem 1.25rem;
  border: 1px solid #C6C1B8;
  border-radius: 8px;
  background: #F7F4EF;
}

.hh-kauf-gesperrt__text {
  margin: 0 0 0.75rem 0;
  color: #4B463E;
  font-size: 0.95rem;
  line-height: 1.5;
}

.hh-kauf-gesperrt__links {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  align-items: center;
  margin: 0;
  font-size: 0.9rem;
}

.hh-kauf-gesperrt__knopf {
  display: inline-block;
  padding: 0.5rem 1.1rem;
  border-radius: 999px;
  background: #4B463E;
  color: #FFFFFF !important;
  text-decoration: none !important;
  font-weight: 600;
}

.hh-kauf-gesperrt__knopf:hover {
  background: #675F4B;
  color: #FFFFFF !important;
}

/* Pflichtfeld-Kennzeichnung im Händler-Anmeldeformular.
   Gorilla setzt `required` an den Eingaben, zeigt es aber nicht an — der
   Stern und der Hinweis oben werden per JS ergänzt (layout/theme.liquid). */
.hh-pflicht {
  color: #8A4B3C;
  font-weight: 600;
}

.hh-pflicht-hinweis {
  margin: 0 0 1.25rem 0;
  color: #675F4B;
  font-size: 0.85rem;
}

/* Luft unter dem Absenden-Knopf im Händlerformular — er klebte am Fussbereich */
.wsg-proxy-container .wsg-shipping-footer,
#wsg-signup .wsg-shipping-footer {
  padding-bottom: 100px;
}

/* Leere Pflichtfelder im Händlerformular kennzeichnen.

   `:user-invalid` greift erst, nachdem jemand das Feld benutzt und leer
   verlassen hat — nicht beim Laden. `.hh-fehlt` setzt das Skript beim
   Absendeversuch. Rot ist bewusst gedämpft: Die CI kennt kein Signalrot,
   ein grelles #FF0000 würde in den warmen Tönen wie ein Fremdkörper wirken. */
#wsg-signup input:user-invalid,
#wsg-signup select:user-invalid,
#wsg-signup textarea:user-invalid,
#wsg-signup .hh-fehlt {
  border-color: #A8342A !important;
  background-color: #FBF1EF !important;
}

#wsg-signup input:user-invalid:focus,
#wsg-signup .hh-fehlt:focus {
  outline: 2px solid #A8342A;
  outline-offset: 1px;
}

/* Das Sternchen in derselben Farbe, damit der Zusammenhang sichtbar ist */
.hh-pflicht {
  color: #A8342A;
}

/* Fehlermeldung über dem Anmeldeformular, wenn Gorilla mit ?error= zurückkommt */
.hh-formfehler {
  margin: 0 0 1.5rem 0;
  padding: 0.9rem 1.1rem;
  border-left: 3px solid #A8342A;
  border-radius: 6px;
  background: #FBF1EF;
  color: #7A2A22;
  font-size: 0.95rem;
  line-height: 1.5;
}

/* Bestätigungsseite nach der Anmeldung: Der Knopf stand links unter mittigem
   Text. `.wsg-proxy-container` ist hier der Träger des gesamten Inhalts. */
#wsg-proxy-content {
  text-align: center;
}

#wsg-proxy-content .btn,
#wsg-proxy-content button,
#wsg-proxy-content a.button {
  margin-inline: auto;
}


/* ==========================================================================
   Händler-Login: Bild links, Anmeldung rechts

   Zwei Dinge, die beim ersten Anlauf nicht stimmten:

   1. Unter dem Bild stand weisse Fläche bis zur Fussleiste. Ursache ist der
      Innenabstand der umgebenden Sektion — `:has()` nimmt ihn nur auf dieser
      Seite weg, damit das Bild bündig an die Fussleiste stösst.
   2. Die Texte waren gemischt ausgerichtet: Überschrift links, Absätze mittig.
      Jetzt durchgängig zentriert — das ist Gorillas eigene Ausrichtung, so
      muss nichts dagegen überschrieben werden.
   ========================================================================== */
.section:has(.hh-login) {
  padding-block: 0 !important;
  max-width: none !important;
}

.hh-login {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: stretch;
  gap: 0;
  min-height: 78vh;
  margin: 0;
}

.hh-login__bild {
  background-image: url('/cdn/shop/files/hero-open-202602.jpg');
  background-size: cover;
  background-position: center;
  background-color: #EFE8DE;
  min-height: 320px;
}

.hh-login__inhalt {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 3rem 2rem;
  text-align: center;
}

.hh-login__inhalt .wsg-proxy-container {
  width: 100%;
  max-width: 440px;
}

/* Gleichmässig zentriert — auch die Überschrift, die sonst links stünde */
.hh-login__inhalt h1,
.hh-login__inhalt p {
  text-align: center;
}

.hh-login__inhalt h1 {
  margin-bottom: 1rem;
}

.hh-login__inhalt input,
.hh-login__inhalt .wsg-login-input {
  width: 100%;
}

@media (max-width: 899px) {
  .hh-login {
    grid-template-columns: 1fr;
    min-height: 0;
  }
  .hh-login__bild {
    min-height: 220px;
  }
  .hh-login__inhalt {
    padding: 2.5rem 1rem 3rem 1rem;
  }
}

/* --------------------------------------------------------------------------
   Prüfseite: mehr Kontrast im Text

   Gorillas Seite erbt den warmen Braunton des Themes (#675F4B). Auf der
   Seite, auf der über Geld entschieden wird, ist Schwarz das bessere
   Argument. Die Netto-Zeilen bleiben gedämpft — sie sind Beiwerk zum
   Bruttopreis, keine gleichrangige Angabe.
   -------------------------------------------------------------------------- */
#wsg-cart-main,
#wsg-cart-main a,
#wsg-cart-main .wsg-cart-product,
#wsg-cart-main .wsg-product-full-info-block,
#wsg-cart-main .wsg-cart-bottom-block {
  color: #212121;
}

#wsg-cart-main .hh-netto,
#wsg-cart-main .hh-brutto-hinweis {
  color: #675F4B;
}

/* Notiz und Bestellnummer, jetzt oben unter der Überschrift.
   `.hh-notiz` setzt das Skript beim Verschieben, `__grund` ist die
   Begründungszeile darunter. */
/* Als grauer Kasten wie die Kacheln unten, nur neutral statt beige
   (Mirco, 14.09.: „smarter grauer Kasten drum"). */
.wsg-cart-notes {
  margin-block: 0 2rem;
  width: 100%;
  padding: 14px 18px;
  background: #F1F1EE;
  border-radius: 8px;
  box-sizing: border-box;
}

/* Der Auslöser ist ein nacktes <button> ohne eigene Klasse. Gorilla stylt
   ihn über seine Lage im unteren Block — nach dem Verschieben nach oben
   greift das nicht mehr, und der Browser zeichnete seinen Standardrahmen.
   Deshalb hier als Textlink ausgezeichnet, so wie er vorher aussah. */
.wsg-cart-notes button {
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: #212121;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
}

.wsg-cart-notes button:hover {
  text-decoration-thickness: 2px;
}

.hh-notiz__grund {
  margin: 0.3rem 0 0;
  font-size: 0.9rem;
  line-height: 1.4;
  color: #675F4B;
  max-width: 46rem;
}

.wsg-cart-notes button {
  font-weight: 600;
}

/* Zahlungssymbole auf feste Höhe. Ohne Vorgabe skalieren sie mit dem
   verfügbaren Platz — auf Gorillas Seiten ist der Inhaltsbereich schmaler,
   dort schrumpften sie sichtbar gegenüber dem übrigen Shop. */
.shopify-section-group-footer-group .payment-icons__item svg,
.shopify-section-group-footer-group .payment-icons__item img {
  height: 24px;
  width: auto;
}

/* --------------------------------------------------------------------------
   Weissraum über der Überschrift auf Gorillas Seiten

   Der Abstand kommt aus der Seitenvorlage, nicht aus Gorillas Markup. Der
   Anker ist deshalb `main[data-template]` — dieses Attribut steht auf der
   Proxy-Seite und nirgends sonst (Inspektor, 12.08.:
   `<main id="MainContent" … data-template="page.wsg-proxy-template">`).

   Bewusst verschraubt gebaut: Greift die Vorgabe woanders, passiert schlicht
   nichts — kaputt gehen kann dabei nichts, und der übrige Shop ist nicht
   betroffen.
   -------------------------------------------------------------------------- */
main[data-template*="wsg-proxy"] {
  padding-block-start: 2.5rem;
}

main[data-template*="wsg-proxy"] > .shopify-section:first-child,
main[data-template*="wsg-proxy"] .wsg-proxy-container {
  margin-block-start: 0;
}

/* Gorilla setzt `margin: 32px 0 48px` auf die Überschrift, aus einem eigenen
   <style>-Block (Inspektor, 12.08.). Kurzform gegen Langform ist ein Streit,
   den man nicht führen muss — deshalb hier ebenfalls die Kurzform und
   `!important`. Der untere Abstand bleibt, nur der obere fällt weg. */
main[data-template*="wsg-proxy"] #wsg-cart-title {
  margin: 0 0 32px !important;
}

/* Über der Überschrift liegen drei Hüllen, die auch leer Platz belegen:
   zwei Fehlerbanner und der Kopfbereich des Warenkorbs. Leer eingeklappt,
   gefüllt bleiben sie sichtbar. */
main[data-template*="wsg-proxy"] .wsg-all-errors-banner:empty,
main[data-template*="wsg-proxy"] .wsg-note-errors-banner:empty,
main[data-template*="wsg-proxy"] #wsg-cart-header:empty {
  display: none !important;
}

main[data-template*="wsg-proxy"] #wsg-cart-header {
  margin-block: 0;
  padding-block: 0;
}

/* DAS war der Weissraum (Inspektor, 12.08.): `<p id="wsg-cart-message">`
   mit `padding: 3% 0`. Dort schreibt die Seitenvorlage den Seiteninhalt
   hinein — die Seite `ws-cart` hat keinen, also stand dort ein leerer
   Absatz mit oben und unten je 3 % Polsterung. `#wsg-cart-header` liess
   sich deshalb auch nicht über `:empty` einklappen: Der Absatz ist ja da.

   Polsterung generell weg. Steht später doch ein Text darin, bekommt er
   über `:not(:empty)` seinen Abstand zurück. */
main[data-template*="wsg-proxy"] #wsg-cart-message {
  padding: 0 !important;
  margin: 0;
}

main[data-template*="wsg-proxy"] #wsg-cart-message:not(:empty) {
  margin-block-end: 1.25rem;
}

/* --------------------------------------------------------------------------
   „Nach Holzart einkaufen" — Band wie auf der bestehenden Website

   Vorbild ist nicht Snocks, sondern holzhofrheinsberg.com: ein dunkles,
   halbtransparentes Band unten am Bild, Titel in Versalien, weisse Schrift.
   Das ist Holzhofs eigene Bildsprache und liest sich auf jedem Foto.

   ACHTUNG beim Selektor: Abschnitte aus JSON-Vorlagen heissen NICHT
   `#shopify-section-holzarten`, sondern
   `#shopify-section-template--<Zahl>__holzarten`. Deshalb der Anker über
   die Endung der ID.

   Die Hülle füllt von Haus aus die ganze Kartenhöhe — der Hintergrund lag
   dadurch über dem kompletten Bild statt nur unten. Deshalb Höhe nach
   Inhalt und über `margin-block-start: auto` nach unten geschoben.
   -------------------------------------------------------------------------- */
[id$="__holzarten"] .collection-card__inner,
[id$="__kategorien"] .collection-card__inner {
  justify-content: flex-end;
  height: 100%;
}

[id$="__holzarten"] .collection-card__content,
[id$="__kategorien"] .collection-card__content {
  width: calc(100% - 1.5rem);
  height: fit-content;
  align-self: flex-end;
  margin: auto 0.75rem 0.75rem;
  padding: 0.9rem 1rem !important;
  gap: 0;
  background: linear-gradient(to top, rgb(33 33 33 / 0.92), rgb(33 33 33 / 0.78));
  border-radius: 8px;
  justify-content: flex-start;
}

/* Der Titelblock bringt aus dem Theme einen Innenabstand nach unten mit —
   daher die grosse Lücke zwischen Überschrift und Unterzeile. Beides gehört
   zusammen, deshalb Innenabstände raus und der Abstand allein über `gap`
   des Bandes. */
[id$="__holzarten"] .collection-card__content > *,
[id$="__kategorien"] .collection-card__content > * {
  width: 100%;
  padding: 0 !important;
  margin: 0;
  text-align: left;
}

[id$="__holzarten"] .collection-card__content .collection-title,
[id$="__holzarten"] .collection-card__content h2,
[id$="__holzarten"] .collection-card__content h3,
[id$="__kategorien"] .collection-card__content .collection-title,
[id$="__kategorien"] .collection-card__content h2,
[id$="__kategorien"] .collection-card__content h3 {
  margin: 0;
  color: #FFFFFF;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  line-height: 1.15;
}

/* Gleiche Bandhöhe über alle fünf Kacheln.

   Eine Mindesthöhe am Band reichte nicht: Zweizeilige Unterzeilen wachsen
   darüber hinaus. Gemessen wird deshalb dort, wo der Unterschied entsteht —
   an der Zeilenzahl der Unterzeile. Sie belegt immer genau zwei Zeilen,
   auch wenn der Text nur eine füllt.

   Dazu sind die fünf Texte auf 31 bis 43 Zeichen angeglichen, damit keiner
   in eine dritte Zeile läuft. */
[id$="__holzarten"] .collection-card__content p {
  margin: 0;
  color: rgb(255 255 255 / 0.85);
  line-height: 1.35;
  min-height: 2.7em;
}

/* Die Überschrift wird vom Theme über ihren Schriftschnitt gesetzt; eine
   Regel auf `.collection-title` allein blieb wirkungslos. Deshalb auf den
   ersten Block im Band und alles darin — eingegrenzt auf diesen Abschnitt. */
[id$="__holzarten"] .collection-card__content > :first-child,
[id$="__holzarten"] .collection-card__content > :first-child *,
[id$="__kategorien"] .collection-card__content > :first-child,
[id$="__kategorien"] .collection-card__content > :first-child * {
  font-weight: 700 !important;
}

/* „Trending Kategorien" trägt nur einen Titel, keine Unterzeile. Ohne die
   zweizeilige Reserve wäre das Band dort halb so hoch wie im Holzart-
   Streifen darunter — deshalb hier eine eigene Mindesthöhe. */
[id$="__kategorien"] .collection-card__content {
  min-height: 3.4rem;
  justify-content: center;
}

/* Weiss durchsetzen. Die Farbe kommt aus dem Farbschema und landet als
   Inline-Stil am Element — weder die Regel oben noch die Blockeinstellung
   `color` haben sie geschlagen. Alles im Band ist weiss, das ist bei einem
   dunklen Grund ohnehin die einzige sinnvolle Farbe. */
[id$="__holzarten"] .collection-card__content,
[id$="__holzarten"] .collection-card__content *,
[id$="__kategorien"] .collection-card__content,
[id$="__kategorien"] .collection-card__content * {
  color: #FFFFFF !important;
}

[id$="__holzarten"] .collection-card__content p {
  color: rgb(255 255 255 / 0.85) !important;
}

/* Schlichter Kollektionskopf — für Kollektionen ohne Einleitungsbild.
   Vorbild snocks.com: kleine zentrierte Überschrift, darunter eine Zeile,
   dann direkt die Filter. Kein halbleerer Zweispalter. */
.hh-kolkopf--schlicht {
  display: block;
  /* Der Block ist ein Flex-Kind der Sektion. Stand die Sektion auf
     `flex-start`, schrumpfte er auf Inhaltsbreite — dann zentriert
     `text-align` nichts mehr, weil der Kasten selbst schon links klebt.
     Deshalb zusätzlich volle Breite und Selbstzentrierung. */
  width: 100%;
  align-self: center;
  text-align: center;
  max-width: 46rem;
  margin-inline: auto;
  padding-block: 0.5rem 0;
}

.hh-kolkopf--schlicht .hh-kolkopf__titel {
  margin: 0;
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  line-height: 1.2;
}

.hh-kolkopf__unterzeile {
  margin: 0.4rem 0 0;
  color: #675F4B;
  font-size: 0.95rem;
}

/* --------------------------------------------------------------------------
   Lieferzeit auf der Produktseite

   Vorbild: der pulsierende Punkt aus shop.lowcarbrezepte.org. Dort hängt er
   an `variant.available` — das geht hier nicht, die Bestandsführung ist seit
   dem 11.08. abgeschaltet. Die Unterscheidung kommt stattdessen aus dem
   Metafeld `holzhof.lieferzeit` oder der Kategorie.

   Grün = ab Lager, Bernstein = Fertigung nach Auftrag. Ein grüner Punkt an
   einem Spielturm, der erst gebaut wird, wäre ein falsches Versprechen.
   -------------------------------------------------------------------------- */
.hh-lieferzeit {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  margin: 0 0 0.9rem;
  font-size: 0.95rem;
  font-weight: 500;
  /* Text in der Farbe des Punktes, wie bei snocks.com und lowcarbrezepte.
     #2E7D32 auf Weiss liegt bei rund 4,9:1 Kontrast und erfüllt damit AA. */
  color: #2E7D32;
}

.hh-lieferzeit--offen {
  color: #B26A00;
}

.hh-lieferzeit__punkt {
  flex: 0 0 auto;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #2E7D32;
  box-shadow: 0 0 0 0 rgb(46 125 50 / 0.55);
  animation: hhPuls 2s ease-out infinite;
}

.hh-lieferzeit--offen .hh-lieferzeit__punkt {
  background: #B26A00;
  box-shadow: 0 0 0 0 rgb(178 106 0 / 0.55);
  animation-name: hhPulsFertigung;
}

@keyframes hhPuls {
  0%   { box-shadow: 0 0 0 0 rgb(46 125 50 / 0.55); }
  70%  { box-shadow: 0 0 0 8px rgb(46 125 50 / 0); }
  100% { box-shadow: 0 0 0 0 rgb(46 125 50 / 0); }
}

@keyframes hhPulsFertigung {
  0%   { box-shadow: 0 0 0 0 rgb(178 106 0 / 0.55); }
  70%  { box-shadow: 0 0 0 8px rgb(178 106 0 / 0); }
  100% { box-shadow: 0 0 0 0 rgb(178 106 0 / 0); }
}

/* Wer Bewegung im Browser abgestellt hat, bekommt einen ruhigen Punkt. */
@media (prefers-reduced-motion: reduce) {
  .hh-lieferzeit__punkt { animation: none; }
}

/* „Das passt dazu" über die volle Bildschirmbreite.

   Die Sektion steht auf `full-width`, damit der Slider links an der Kante
   beginnt und rechts hinausläuft. Auf dem Handy bleibt ein Rand von 1 rem —
   sonst klebt die Überschrift am Displayrand. */
[id*="product_recommendations"] .section--full-width {
  padding-inline: 0;
}

@media (max-width: 749px) {
  [id*="product_recommendations"] .section--full-width {
    padding-inline: 1rem;
  }
}

/* --------------------------------------------------------------------------
   Schieberegler unter „Das passt dazu"

   Vorbild snocks.com. Es braucht kein eigenes Bauteil: `slideshow-slides`
   ist bereits ein echter Scroll-Bereich (`overflow-x: scroll`,
   `scroll-snap-type: x mandatory`). Das Theme blendet die Leiste nur aus —
   `scrollbar-width: none` und `::-webkit-scrollbar { width: 0 }` in
   `snippets/slideshow-styles.liquid`.

   Hier wird sie zurückgeholt und gestaltet. Vorteil gegenüber einem
   nachgebauten Regler: Sie ist von Haus aus ziehbar, tastaturbedienbar und
   zeigt korrekt an, wie weit man gescrollt hat — ohne eine Zeile JavaScript.

   Eingegrenzt auf die Empfehlungssektion, damit alle anderen Karussells im
   Shop unverändert bleiben.
   -------------------------------------------------------------------------- */
[id*="product_recommendations"] slideshow-slides {
  scrollbar-width: none;
}

[id*="product_recommendations"] slideshow-slides::-webkit-scrollbar {
  width: auto;
  height: 4px;
}

[id*="product_recommendations"] slideshow-slides::-webkit-scrollbar-track {
  background: rgb(33 33 33 / 0.12);
  border-radius: 999px;
}

[id*="product_recommendations"] slideshow-slides::-webkit-scrollbar-thumb {
  background: #212121;
  border: none;
  border-radius: 999px;
}

[id*="product_recommendations"] slideshow-slides::-webkit-scrollbar-thumb:hover {
  background: #000000;
}

/* Kachelbreite und Einzug der Überschrift

   Die Breite einer Kachel rechnet das Theme aus `--column-count`:
     (100% − Abstände − Vorschau) / column-count
   Ein gebrochener Wert ist erlaubt — 4,5 zeigt vier ganze Kacheln und eine
   halbe. Die angeschnittene Kachel ist das Signal, dass es weitergeht;
   ohne sie sieht ein Karussell aus wie ein Raster.

   Der Einzug der Überschrift ist bewusst eine eigene Variable: Er soll auf
   der Kante des ersten Produktbildes sitzen. Passt er nicht, ist es dieser
   eine Wert. */
[id*="product_recommendations"] {
  --hh-empfehlungen-einzug: 1.5rem;
}

[id*="product_recommendations"] .resource-list__carousel .resource-list__slide {
  --column-count: 4.5;
}

[id*="product_recommendations"] .section--full-width > *:not(.resource-list__carousel):not(:has(slideshow-slides)) {
  padding-inline-start: var(--hh-empfehlungen-einzug);
}

@media (max-width: 749px) {
  [id*="product_recommendations"] .resource-list__carousel .resource-list__slide {
    --column-count: 2.3;
  }
}

/* Eigener Schieberegler, gebaut vom Block am Ende von layout/theme.liquid

   Farben aus der CI, nicht erfunden: Sand `#CBC1A9` ist die Leitfarbe,
   `#B8AA89` der dort dokumentierte Aktiv-Zustand. Die Spur ist dieselbe
   Farbe mit 35 % Deckkraft. Ein Goldton im engeren Sinn existiert in der
   CI nicht — laut `ci_holzhofrheinsberg.md` gibt es bei Holzhof keinen
   Gold-Akzent, Sand ist die Farbe, die dem am nächsten kommt. */
.hh-leiste {
  position: relative;
  height: 4px;
  margin: 1.5rem var(--hh-empfehlungen-einzug, 1.5rem) 0;
  border-radius: 999px;
  background: rgb(203 193 169 / 0.35);
  cursor: pointer;
  touch-action: none;
}

.hh-leiste[hidden] {
  display: none;
}

.hh-leiste__griff {
  position: absolute;
  inset-block: -4px;
  left: 0;
  min-width: 32px;
  border-radius: 999px;
  background: #CBC1A9;
  cursor: grab;
  transition: background 0.15s ease;
}

.hh-leiste--zieht .hh-leiste__griff {
  background: #B8AA89;
  cursor: grabbing;
}

.hh-leiste__griff:hover {
  background: #B8AA89;
}

/* Beratungskasten unter den Produktempfehlungen

   Vorbild snocks.com, dort „Was ist die Snocks Garantie?". Bewusst mit
   WENIGER Bildfläche als auf der Startseite: Auf der Produktseite ist der
   Kasten ein Anker, kein Kapitel. Höhe deshalb nach Inhalt statt 60 svh,
   Bild schmal und gedeckelt. */
[id*="hh_beratung"] .media-with-content__media img,
[id*="hh_beratung"] figure img {
  /* Feste Höhe statt Deckel: Bei `media_height: auto` bekam das Bild sonst
     keine Höhe und war unsichtbar. */
  height: 260px;
  object-fit: cover;
  border-radius: 10px;
}

/* Farbiges Band von Kante zu Kante, der INHALT aber zentriert auf
   Seitenbreite — dieselbe Spalte wie der Produktbereich darüber. So sitzt
   das Foto genau unter dem Produktbild und der Text unter den Angaben.
   Vorher lief der Inhalt über die volle Breite und stand quer zu allem,
   was darüber liegt. */
/* Zentriert wird die SEKTION, nicht jedes Kind einzeln. Der vorherige
   Versuch setzte `max-width` und `margin: auto` auf alle direkten Kinder —
   dadurch zentrierte sich die Bildspalte selbst und fiel in sich zusammen,
   das Foto war weg.

   Der farbige Grund bleibt trotzdem über die volle Breite: Horizon legt ihn
   in ein eigenes Element `.section-background`, das hiervon unberührt ist. */
[id*="hh_beratung"] .section {
  max-width: var(--page-content-width);
  margin-inline: auto;
  column-gap: 3.5rem;
  padding-inline: var(--page-margin, 2rem);
}

@media (max-width: 749px) {
  [id*="hh_beratung"] .section {
    padding-inline: 1.25rem;
  }
}

/* --------------------------------------------------------------------------
   „Nach Holzart einkaufen": Kacheln bis an die linke Kante, Überschrift bleibt

   Die Sektion steht auf `full-width`. Damit die Überschrift trotzdem genau
   dort bleibt, wo sie vorher stand — auf der Kante des Inhaltsbereichs —
   bekommt die ganze Sektion diesen Einzug, und das Karussell wird um
   denselben Betrag wieder nach links gezogen.

   Der Betrag wird gerechnet, nicht geschätzt: halbe Differenz zwischen
   Fensterbreite und Inhaltsbreite, mindestens der Seitenrand. So stimmt es
   auf jedem Schirm und auch dann, wenn jemand die Seitenbreite im Theme
   ändert.
   -------------------------------------------------------------------------- */
[id$="__holzarten"] {
  --hh-rand: max(var(--page-margin, 1rem), calc((100vw - var(--page-content-width)) / 2));
}

/* KORREKTUR 13.08.: Erst wurde die ganze Sektion eingerückt und das
   Karussell mit einem negativen Rand zurückgezogen. Das verschob doppelt —
   bei `full-width` setzt das Theme den Startabstand des Karussells ohnehin
   schon auf null (`--gutter-slide-width: 0px` in
   `resource-list-carousel.liquid`). Die erste Kachel lief dadurch aus dem
   Bild.

   Jetzt wird nur eingerückt, was KEIN Karussell ist — also die Überschrift.
   Erkannt über `:has()`: Der Kopfbereich enthält keine `slideshow-slides`,
   das Karussell schon. */
[id$="__holzarten"] .section > *:not(:has(slideshow-slides)) {
  padding-inline-start: var(--hh-rand);
  padding-inline-end: var(--hh-rand);
}

@media (max-width: 749px) {
  [id$="__holzarten"] .section > *:not(:has(slideshow-slides)) {
    padding-inline-start: 1rem;
    padding-inline-end: 1rem;
  }
}

/* ==================================================================
   Hinweis auf den Einkauf als Unternehmen (04.09.2026)

   Ein Dialog, zwei Auslöser: erster Seitenaufruf und Klick auf den
   MwSt-Umschalter im Kopf, solange niemand angemeldet ist. Markup und
   Verhalten in snippets/hh-b2b-dialog.liquid.

   Farben nach ci_holzhofrheinsberg.md: Sand #cbc1a9 als Primärfläche,
   Dunkelbraun-Grau #4b463e für Überschrift und Text auf Sand,
   Fliesstext #675f4b. Kein Gold, kein Fremdblau.
   ================================================================== */

.hh-b2b-dialog {
  max-width: 30rem;
  width: calc(100% - 2rem);
  padding: 0;
  border: 0;
  border-radius: 10px;
  background: #FFFFFF;
  color: #675F4B;
  /* Der Schatten trägt die Fläche, nicht ein Rahmen — sonst wirkt der
     Dialog wie ein Kasten im Kasten. */
  box-shadow: 0 18px 48px rgba(29, 27, 21, 0.28);
}

/* Der Grund muss die Seite dämpfen, ohne sie zu verdecken: Wer den
   Hinweis wegklickt, soll sehen, wohin er zurückkehrt. */
.hh-b2b-dialog::backdrop {
  background: rgba(29, 27, 21, 0.45);
}

.hh-b2b-dialog__form {
  position: relative;
  padding: 2rem 1.75rem 1.5rem;
  margin: 0;
}

/* Das Schliesskreuz sitzt aussen im Weissraum, nicht neben der
   Überschrift — sonst konkurriert es mit ihr um den Blick. */
/* Das Theme rahmt jeden <button> ein. Ohne diese spezifischere Regel
   sass das Kreuz in einem Kasten — am 04.09. im Shop gesehen. */
.hh-b2b-dialog .hh-b2b-dialog__x,
.hh-b2b-mehr .hh-b2b-dialog__x {
  position: absolute;
  top: 0.5rem;
  right: 0.65rem;
  border: 0;
  background: none;
  font-size: 1.6rem;
  line-height: 1;
  color: #675F4B;
  opacity: 0.55;
  cursor: pointer;
  padding: 0.25rem 0.4rem;
  min-height: 0;
  min-width: 0;
  box-shadow: none;
  border-radius: 0;
}

.hh-b2b-dialog .hh-b2b-dialog__x:hover,
.hh-b2b-mehr .hh-b2b-dialog__x:hover {
  opacity: 1;
  background: none;
}

.hh-b2b-dialog__titel {
  margin: 0 0 0.75rem;
  font-size: 1.35rem;
  line-height: 1.25;
  color: #4B463E;
}

.hh-b2b-dialog__text {
  margin: 0 0 1rem;
  font-size: 0.95rem;
  line-height: 1.5;
}

/* Die Vorteilsliste trägt die Entscheidung. Eigene Aufzählungszeichen in
   Sand statt der Theme-Punkte: Sie sollen mitlesen, nicht abzählen. */
.hh-b2b-dialog__liste {
  margin: 0 0 1.5rem;
  padding: 0;
  list-style: none;
  font-size: 0.92rem;
  line-height: 1.45;
}

.hh-b2b-dialog__liste li {
  position: relative;
  padding-left: 1.35rem;
  margin-bottom: 0.5rem;
}

.hh-b2b-dialog__liste li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.5em;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #CBC1A9;
}

/* Untereinander statt nebeneinander: Auf dem Telefon bricht eine Zeile
   mit zwei Knöpfen ohnehin um, und der Hauptweg soll oben stehen. */
.hh-b2b-dialog__aktionen {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  margin-bottom: 1.25rem;
}

.hh-b2b-dialog__knopf {
  display: block;
  padding: 0.75rem 1rem;
  border-radius: 6px;
  background: #CBC1A9;
  color: #4B463E;
  font-size: 0.95rem;
  font-weight: 600;
  text-align: center;
  text-decoration: none;
}

.hh-b2b-dialog__knopf:hover {
  background: #B8AA89;
  color: #4B463E;
}

/* „Als Privatkunde weiter" ist kein zweiter Knopf, sondern der Ausgang.
   Als Fläche gestaltet stünde er gleichrangig neben dem Firmenkonto und
   die Frage wäre keine mehr. */
.hh-b2b-dialog__weiter {
  border: 0;
  background: none;
  padding: 0.35rem;
  font: inherit;
  font-size: 0.9rem;
  color: #675F4B;
  text-decoration: underline;
  cursor: pointer;
}

.hh-b2b-dialog__fuss {
  margin: 0;
  padding-top: 1rem;
  border-top: 1px solid #EFEDE9;
  font-size: 0.85rem;
}

.hh-b2b-dialog__fuss a {
  color: #4B463E;
}

/* Der Umschalter für Gäste sieht aus wie der echte, schaltet aber nichts.
   Deshalb kein aria-pressed und kein Zustandswechsel am Punkt — er ist
   eine Einladung, kein Zustandsanzeiger. */
.hh-steuerschalter--gast {
  cursor: pointer;
}

/* ------------------------------------------------------------------
   Fassung 2: zwei Wege nebeneinander (04.09.2026)

   Links gewerblich, rechts privat. Die Vorteile stecken links in einem
   <details>-Kästchen, das nur auf Klick aufgeht — der Privatkunde soll
   nicht erst eine Rabattwerbung lesen, die ihn nicht betrifft.
   ------------------------------------------------------------------ */

.hh-b2b-dialog--v2 {
  max-width: 40rem;
}

.hh-b2b-dialog--v2 .hh-b2b-dialog__titel {
  text-align: center;
  margin-bottom: 1.5rem;
}

.hh-b2b-dialog__spalten {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.25rem;
  margin-bottom: 1.25rem;
}

/* Unter 640 px untereinander. Zwei Spalten à 9 rem wären auf dem Telefon
   zwei Streifen, in denen jedes Wort einzeln umbricht. */
@media (max-width: 640px) {
  .hh-b2b-dialog__spalten {
    grid-template-columns: 1fr;
    gap: 1rem;
  }
}

/* Beide Spalten gleich hoch, damit die Knöpfe auf einer Linie sitzen —
   sonst wirkt der kürzere Weg wie der zweitrangige. */
/* Festes Raster statt Flex: Titel, Text, Knopf, Link. Der Text nimmt den
   Rest (1fr), Knopf und Link stehen dadurch in beiden Spalten auf
   derselben Höhe — auch wenn die Texte unterschiedlich lang umbrechen.
   Eine Spalte, deren Knopf tiefer sitzt als der andere, wirkt nachrangig. */
.hh-b2b-dialog__spalte {
  display: grid;
  grid-template-rows: auto 1fr auto auto;
  padding: 1.15rem 1rem 1rem;
  border: 1px solid #EFEDE9;
  border-radius: 8px;
  background: #FFFDF9;
}

.hh-b2b-dialog__spaltentitel {
  margin: 0 0 0.5rem;
  font-size: 1rem;
  color: #4B463E;
}

.hh-b2b-dialog__spaltentext {
  margin: 0 0 1rem;
  font-size: 0.9rem;
  line-height: 1.45;
}

/* Die Ausrichtung macht das Raster der Spalte, nicht der Knopf selbst. */
.hh-b2b-dialog--v2 .hh-b2b-dialog__knopf {
  align-self: end;
}

/* Der stille Knopf für den privaten Weg: gleiche Form, gleiche Grösse,
   aber ohne Sandfläche. Beide Wege sind gleichwertig — der gewerbliche
   ist nur der erklärungsbedürftige. */
.hh-b2b-dialog__knopf--still {
  background: transparent;
  border: 1px solid #CBC1A9;
  color: #4B463E;
  font: inherit;
  font-size: 0.95rem;
  font-weight: 600;
  cursor: pointer;
  width: 100%;
}

.hh-b2b-dialog__knopf--still:hover {
  background: #F7F4EF;
}

/* „Was das bedeutet" öffnet ein zweites Fenster. Früher ein
   <details>-Kästchen mit Dreieck — Dreieck plus Unterstrich unter Symbol
   und Text ergaben ein unruhiges Bild, und die aufgeklappte Liste zerriss
   die Symmetrie der beiden Spalten.

   Der Link sitzt jetzt an derselben Stelle wie „Kundenkonto anlegen" in
   der rechten Spalte. Gleiche Zeile, gleiches Gewicht, kein Symbol. */
.hh-b2b-dialog__textlink {
  border: 0;
  background: none;
  padding: 0;
  font: inherit;
  font-size: inherit;
  color: #675F4B;
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
}

/* Das zweite Fenster erbt die Gestaltung des ersten und liegt darüber.
   Zwei modale Fenster übereinander sind erlaubt; Esc schliesst zuerst
   das obere. */
.hh-b2b-mehr {
  max-width: 30rem;
  width: calc(100% - 2rem);
  padding: 0;
  border: 0;
  border-radius: 10px;
  background: #FFFFFF;
  color: #675F4B;
  box-shadow: 0 18px 48px rgba(29, 27, 21, 0.28);
}

.hh-b2b-mehr::backdrop {
  background: rgba(29, 27, 21, 0.35);
}

/* Der Nebenlink zum Kundenkonto: bewusst klein. Ein Privatkunde braucht
   kein Konto, um zu bestellen — das Angebot soll da sein, aber nicht
   nach einer Bedingung aussehen. */
.hh-b2b-dialog__nebenlink {
  margin: 0.6rem 0 0;
  font-size: 0.82rem;
  text-align: center;
}

.hh-b2b-dialog__nebenlink a {
  color: #675F4B;
}

.hh-b2b-dialog--v2 .hh-b2b-dialog__fuss {
  text-align: center;
}

/* ------------------------------------------------------------------
   Frachtpauschale auf der Versandseite — 10.09.2026

   Erscheint nur fuer angemeldete Firmenkunden, gesteuert im Block
   `versand-weiche` in templates/page.versand.json. Der Betrag kommt aus
   dem Etikett `versand-N` am Kundenkonto.

   Farben aus der CI: Grund #F7F4EF, Schrift #4B463E. Der Bernstein-Ton
   fuer den offenen Fall ist derselbe wie bei der Lieferzeit (#B26A00),
   damit "hier fehlt noch ein Wert" im Shop ueberall gleich aussieht.
   ------------------------------------------------------------------ */

.hh-pauschale {
  background: #F7F4EF;
  border-radius: 6px;
  padding: 1rem 1.25rem;
  margin: 0 0 1.5rem;
}

.hh-pauschale__zeile {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  margin: 0;
}

.hh-pauschale__wert {
  font-size: 1.25rem;
  font-weight: 600;
  color: #4B463E;
  line-height: 1.3;
}

.hh-pauschale__zusatz {
  font-size: 0.95rem;
  color: #4B463E;
  opacity: 0.8;
}

/* Noch keine Frachtstufe hinterlegt — bernstein statt Sandton, damit es
   auffaellt. An der Kasse greift in dem Fall der Auffangtarif. */
.hh-pauschale--offen {
  background: #FDF4E6;
}

.hh-pauschale--offen .hh-pauschale__wert {
  color: #B26A00;
}

/* Kennzeichen „Vorkasse" in der Zahlungsarten-Leiste — Produktseite und
   Fußzeile. Manuelle Zahlungsarten haben kein Shopify-Icon, siehe
   snippets/hh-vorkasse-badge.liquid.

   Maße exakt wie Shopifys Icons: 38 × 24. Am 11.09. war die Kachel 58 px
   breit (10 px Schrift, Innenabstand) — Mirco: „größer wie die anderen".
   Gemessen: „Vorkasse" braucht bei 8,5 px fett 36 px. Also feste Breite,
   kein Innenabstand, kein Buchstabenabstand. */
.hh-vorkasse {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 24px;
  padding: 0;
  border-radius: 4px;
  background: #4B463E;
  color: #FFFFFF;
  font-size: 8.5px;
  font-weight: 700;
  letter-spacing: 0;
  line-height: 1;
  white-space: nowrap;
  list-style: none;
  flex: 0 0 38px;
}

/* Nur in der Produktseiten-Liste: dort tragen alle Icons diesen Abstand.
   In der Fußzeile NICHT — die Liste zentriert per Flex, und ein
   margin-bottom schob die Kachel 4 px über die Icons. */
.my-paymentmethods .hh-vorkasse {
  margin-bottom: 8px;
  margin-right: 8px;
}

/* Gorillas Prüfseite: Textlink unter dem Kaufknopf, öffnet den Notiz-Dialog.
   Eingehängt per JS in layout/theme.liquid (notizAmKaufknopf). */
.hh-notiz-link {
  display: inline-flex;
  align-items: center;
  width: auto;
  min-height: 48px;
  margin: 0 0.75rem 0 0;
  padding: 0 18px;
  border: 1px solid #C6C1B8;
  border-radius: 4px;
  background: none;
  color: #212121;
  font: inherit;
  font-size: 0.9rem;
  text-decoration: none;
  cursor: pointer;
  align-self: center;
  white-space: nowrap;
}

/* Der Kaufknopf brach in zwei Zeilen („Jetzt sicher zur / Kasse") —
   Gorillas Knopf ist schmal bemessen. Nicht umbrechen, Breite dem Text folgen. */
#wsg-finalize {
  white-space: nowrap;
  width: auto;
  min-width: 0;
  padding-left: 2rem;
  padding-right: 2rem;
}

.hh-notiz-link:hover {
  border-color: #212121;
}

/* Zahlungsarten auf der Firmen-Prüfseite: eigene Zeile unter dem Block mit
   dem Kaufknopf, in dessen Breite, Linie darüber, Wort davor. Erster Anlauf
   saß neben „Einkaufswagen löschen" und Gorillas CSS halbierte die Icons,
   zweiter hing am Ende von #wsg-cart über die volle Seitenbreite.
   Die Icons tragen die Klasse hh-zahlungsicon statt Shopifys „icon" —
   Gorillas Stylesheet greift auf .icon zu und färbte Amex und Klarna grau
   (Fußzeile und Prüfseite; die Produktseite ohne Klasse war richtig). */
.hh-zahlungsarten {
  display: flex;
  flex-wrap: wrap;
  flex: 0 0 100%;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-width: 100%;
  margin: 3rem 0 3.5rem;
  padding: 1.75rem 0 0;
  border-top: 1px solid #E6E2DA;
  list-style: none;
}

.hh-zahlungsarten li {
  display: flex;
  align-items: center;
  margin: 0;
}

.hh-zahlungsarten__titel {
  margin-right: 1.5rem !important;
  color: #675F4B;
  font-size: 0.85rem;
  font-weight: 700;
}

/* Gorillas Stylesheet setzt svg auf eine kleinere Größe — hier zurück auf das
   Maß von Fußzeile und Produktseite. */
.hh-zahlungsarten svg {
  width: 38px !important;
  height: 24px !important;
  max-width: none !important;
}

/* Icons bleiben, wie Shopify sie liefert — keine fremde Füllung, kein Filter.
   Die Farben stehen als Attribut im SVG; hier wird nur verhindert, dass ein
   App-Stylesheet sie über eine allgemeine Klasse überschreibt. */
.hh-zahlungsicon,
.hh-zahlungsicon rect,
.hh-zahlungsicon path {
  filter: none;
  opacity: 1;
}

/* Das Grau kam als Füllung des Rahmen-Rechtecks: Bei Amex ist es
   fill="none", bei Klarna erbt es „none" vom SVG — wird das von außen
   gefüllt, liegt Grau über der Markenfarbe. Hier festgenagelt. */
svg.hh-zahlungsicon {
  fill: none !important;
}

.hh-zahlungsicon rect[fill='none'],
.hh-zahlungsicon rect:not([fill]) {
  fill: none !important;
}

.hh-zahlungsarten .hh-vorkasse {
  margin: 0;
}

/* Prüfseite, fünf Hebel (14.09.2026): Nachlass und Fracht unter der
   Zwischensumme, Lieferzeit je Position, Zusicherungen und Telefon unter
   dem Kaufknopf. Alles gedämpft — der Preis bleibt die Hauptsache. */
/* Nachlass und Fracht unter der Zwischensumme: ein kleiner Kasten rechts,
   zwei Zeilen Begriff/Wert — vorher zwei lose rechtsbündige Textzeilen,
   die „optisch hingen" (Mirco, 14.09.). */
#wsg-cart-main .hh-korb-hinweise {
  display: grid;
  grid-template-columns: auto auto;
  gap: 4px 14px;
  width: fit-content;
  margin: 0.9rem 0 0 auto;
  padding: 12px 16px;
  background: #F7F4EF;
  border-radius: 8px;
  font-size: 0.85rem;
  line-height: 1.4;
  color: #675F4B;
  text-align: left;
}

#wsg-cart-main .hh-korb-hinweise dt,
#wsg-cart-main .hh-korb-hinweise dd {
  margin: 0;
}

#wsg-cart-main .hh-korb-hinweise dt {
  font-weight: 600;
  color: #212121;
  white-space: nowrap;
}

#wsg-cart-main .hh-korb-hinweise strong {
  color: #212121;
  font-weight: 600;
}

/* „Einkaufswagen löschen" — Gorillas Knopf hing allein links unter dem
   Kaufknopf. Positionen löscht man über den Papierkorb je Zeile (Mirco,
   14.09.: „benutzt man doch nicht wirklich"). */
#wsg-cart-main #wsg-clear-cart {
  display: none !important;
}

/* Vier Kacheln unter dem Kaufknopf-Block, volle Breite, im Stil der
   Vertrauensmerkmale der Produktseite. */
#wsg-cart-main .hh-korb-kacheln {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
  list-style: none;
  margin: 2rem 0 0;
  padding: 0;
}

@media (max-width: 999px) {
  #wsg-cart-main .hh-korb-kacheln { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 549px) {
  #wsg-cart-main .hh-korb-kacheln { grid-template-columns: 1fr; }
}

#wsg-cart-main .hh-korb-kachel {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0;
  padding: 14px 16px;
  background: #F7F4EF;
  border-radius: 8px;
}

#wsg-cart-main .hh-korb-kachel svg {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  stroke: #4B463E;
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}

#wsg-cart-main .hh-korb-kachel span {
  display: block;
  font-size: 13px;
  line-height: 1.35;
  color: #675F4B;
}

#wsg-cart-main .hh-korb-kachel strong {
  display: block;
  font-size: 14px;
  font-weight: 600;
  color: #212121;
}

#wsg-cart-main .hh-korb-kachel a {
  color: inherit;
  text-decoration: none;
}

#wsg-cart-main .hh-lieferzeit {
  margin: 0 0 4px;
  font-size: 13px;
  line-height: 1.3;
  color: #2E7D32;
}

/* Inhaltsbreite „Mittel" für Seiten — Horizon kennt nur 42 rem (Lesebreite)
   oder die volle Seitenbreite. Für Seiten mit Kacheln und Knöpfen ist 42 rem
   auf dem Desktop zu schmal (Mirco, 14.09.). Wählbar in der Sektion
   „Seite" → Inhaltsbreite. */
.page-width-medium {
  --page-content-width: 64rem;
  --page-width: calc(var(--page-content-width) + (var(--page-margin) * 2));
}

/* B2B-Band unter dem Startbild (Startseite, Sektion b2b_band, 14.09.2026):
   Text links, Knöpfe rechts; mobil untereinander. */
.hh-b2b-band {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
}

@media (max-width: 899px) {
  .hh-b2b-band { flex-direction: column; align-items: flex-start; gap: 1.25rem; }
  /* Mobil: beide Knöpfe volle Breite untereinander, der Anmelden-Link
     mittig darunter — nebeneinander mit dem zweiten Knopf sah es
     zerrissen aus (Mirco, 14.09., Handy-Screenshot). */
  .hh-b2b-band__knoepfe { width: 100%; flex-direction: column; align-items: stretch; gap: 10px; }
  .hh-b2b-band__knoepfe .button { width: 100%; justify-content: center; text-align: center; }
  .hh-b2b-band__link { margin: 4px 0 0; text-align: center; }
}

.hh-b2b-band__kicker {
  margin: 0 0 0.35rem;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #675F4B;
}

.hh-b2b-band__titel {
  margin: 0 0 0.5rem;
  font-size: 1.6rem;
  line-height: 1.2;
  color: #212121;
}

.hh-b2b-band__zeile {
  margin: 0;
  max-width: 40em;
  font-size: 1rem;
  line-height: 1.5;
  color: #675F4B;
}

.hh-b2b-band__knoepfe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  flex: 0 0 auto;
}

.hh-b2b-band__zweiter {
  background: transparent !important;
  color: #212121 !important;
  border: 1px solid #212121 !important;
}

/* „Schon Kunde? Anmelden" in der Knopfzeile, nicht darunter — als eigene
   Zeile hing es in der Luft (Mirco, 14.09.). */
.hh-b2b-band__link {
  margin-left: 0.5rem;
  font-size: 0.9rem;
  color: #675F4B;
  text-decoration: underline;
  text-underline-offset: 3px;
  white-space: nowrap;
}

/* Ankreuzbox „keine USt-IdNr." unter dem Feld im Anmeldeformular (14.09.2026) */
.wsg-proxy-container .hh-keine-ustid {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 6px 0 14px;
  font-size: 0.9rem;
  color: #675F4B;
  cursor: pointer;
}

/* Gorilla gibt jedem <input> 46 px Höhe und volle Breite — die Box sah
   aus wie ein leeres Textfeld (Mirco: „ich wusste gar nicht, was ich da
   machen soll"). Hier ausdrücklich klein und als Häkchen. */
.wsg-proxy-container .hh-keine-ustid input[type='checkbox'],
#wsg-signup input#hh-keine-ustid {
  -webkit-appearance: checkbox !important;
  appearance: checkbox !important;
  width: 18px !important;
  min-width: 18px !important;
  max-width: 18px !important;
  height: 18px !important;
  min-height: 18px !important;
  margin: 0 !important;
  padding: 0 !important;
  border-radius: 3px;
  flex: 0 0 18px;
  accent-color: #212121;
  cursor: pointer;
}

.wsg-proxy-container .hh-keine-ustid {
  line-height: 1.35;
}

.wsg-proxy-container .hh-feld-gesperrt {
  background: #F1EEE8 !important;
  color: #8a8375 !important;
}

/* Unteilbare Angaben in den Kacheln der Prüfseite („Mo–Fr 7–16 Uhr") */
.hh-nowrap { white-space: nowrap; }

/* ==========================================================================
   Prüfseite mobil (14.09.2026, Mirco: „mobile sieht richtig scheiße aus")
   ========================================================================== */

/* Gorillas Knopf „Schnellbestellformular" — auf dem Desktop schon versteckt,
   mobil zeigt Gorilla eine zweite Fassung oben. Alle weg: Der Weg zur
   Schnellbestellung steht in der Fußzeile, hier zählt nur der Kaufknopf. */
#wsg-cart .spof-btn,
#wsg-cart .wsg-cart-label-spof {
  display: none !important;
}

@media screen and (max-width: 749px) {
  /* Kaufknopf-Zeile: Kommentar-Knopf und Kaufknopf untereinander in voller
     Breite — nebeneinander lief der Kommentar-Knopf links aus dem Bild. */
  #wsg-cart-main .wsg-button-row {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
  }

  #wsg-cart-main .hh-notiz-link,
  #wsg-cart-main #wsg-finalize {
    width: 100% !important;
    flex: 0 0 100%;
    margin: 0;
    justify-content: center;
    text-align: center;
  }

  #wsg-cart-main .hh-notiz-link {
    order: 2;
  }

  #wsg-cart-main #wsg-finalize {
    order: 1;
  }

  /* Kasten Nachlass/Fracht: volle Breite, Werte umbrechen lassen */
  #wsg-cart-main .hh-korb-hinweise {
    width: 100%;
    grid-template-columns: auto 1fr;
    font-size: 0.8rem;
  }
}

/* Nettozeilen an versteckten Preis-Fassungen: erledigt das Skript
   (verwaisteNettozeilen in layout/theme.liquid) anhand der tatsächlichen
   Sichtbarkeit. Die CSS-Fassung dieser Regel vom 14.09. hatte
   `.wsg-line-price-mobile + .hh-netto` pauschal versteckt — Gorilla zeigt
   diese Fassung aber ab 1226 px als Desktop-Zeilensumme, die Nettozeile
   fehlte dort. */

/* Prüfseite mobil: Mengenfeld links, Preise rechtsbündig in derselben Zeile
   — Gorilla setzte den Preisblock linksbündig neben das Mengenfeld, die
   Zahlen „hingen in der Luft" (Mirco, 14.09.). */
@media screen and (max-width: 749px) {
  /* Die Nettozeile ist hier ein Geschwister des Preisblocks IN der
     Flex-Zeile (Basis 100 %). Mit `nowrap` drückte sie den Bruttopreis auf
     null Breite — „nur noch ein Preis am Produkt" (Mirco, 14.09.). Deshalb
     umbrechen: Zeile 1 Menge + Brutto, Zeile 2 Netto, beides rechtsbündig. */
  /* Alles rechtsbündig übereinander: Mengenfeld, darunter Brutto, darunter
     Netto (Mirco, 14.09.: „schieb es über den Preis nach rechts"). */
  #wsg-cart-main .wsg-prices-block {
    flex-direction: column;
    flex-wrap: nowrap;
    align-items: flex-end;
    justify-content: flex-start;
    row-gap: 6px;
    /* Der Block selbst saß mittig in der Zeile — auf volle Breite ziehen,
       dann greift das rechtsbündige Ausrichten der Kinder. */
    width: 100%;
    margin-left: auto;
    align-self: stretch;
  }

  #wsg-cart-main .wsg-product-full-info-block {
    align-items: stretch;
  }

  #wsg-cart-main .wsg-prices-block .wsg-quantity-counter {
    margin-left: auto;
    padding-left: 0;
  }

  #wsg-cart-main .wsg-line-price-block {
    width: auto !important;
    min-width: 0;
    margin: 0;
    padding: 0;
    text-align: right;
    align-items: flex-end;
    flex-shrink: 0;
  }

  #wsg-cart-main .wsg-prices-block > .hh-netto {
    flex: 0 0 auto;
    width: auto;
    margin-top: -4px;
    text-align: right;
  }

  /* MwSt-Schalter in der Kopfzeile: auf der Prüfseite ohne Funktion, mobil
     nur im Weg — weg. Desktop bleibt er als Zustandsanzeige. */
  body.hh-pruefseite .hh-steuerschalter {
    display: none !important;
  }
}

/* Kein Stückpreis unter dem Titel (Mirco, 14.09.: „hier würde ich keine
   preise setzen") — die Zeilensumme rechts genügt, bei Menge 1 stand
   derselbe Betrag zweimal. Gilt für Gorillas Desktop- und Mobil-Fassung
   samt unserer Nettozeile dahinter. */
#wsg-cart-main .wsg-item-prices,
#wsg-cart-main .wsg-item-prices + .hh-netto,
#wsg-cart-main .wsg-item-price-mobile,
#wsg-cart-main .wsg-item-price-mobile + .hh-netto {
  display: none !important;
}

/* Zeilensumme mobil wie auf dem Desktop: brutto fett, netto klein darunter.
   Gorilla versteckt `.wsg-line-price-mobile` unter 1226 px — genau die
   Fassung, die auf dem Desktop die Zeilensumme trägt; mobil blieb nur
   unsere Nettozeile eines leeren Elements übrig (Mirco, 14.09.: „die preise
   sollten wie auf dem desktop gesetzt sein"). Also mobil einblenden. */
@media screen and (max-width: 1225px) {
  #wsg-cart-main .wsg-line-price-mobile {
    display: block !important;
    text-align: right;
    font-size: 16px;
    font-weight: 600;
    line-height: 1.4;
    color: #212121;
  }
}

/* ==================================================================
   Gesetzliche Gewährleistung — harmonisierter EU-Hinweis (29.09.2026)
   snippets/hh-gewaehrleistung.liquid. Die Grafik selbst bleibt
   unverändert; gestaltet werden nur Link und Rahmen.
   ================================================================== */
.hh-gewaehrleistung {
  margin: 0.75rem 0 0;
  font-size: 0.9rem;
  line-height: 1.4;
}

.hh-gewaehrleistung__link {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

.hh-gewaehrleistung--produkt {
  font-size: 12px;
}

.hh-gw-dialog {
  max-width: 45rem;
  width: calc(100% - 1rem);
  max-height: calc(100dvh - 1rem);
  padding: 0;
  border: 0;
  border-radius: 10px;
  background: #FFFFFF;
  color: #675F4B;
  box-shadow: 0 18px 48px rgba(29, 27, 21, 0.28);
}

.hh-gw-dialog::backdrop {
  background: rgba(29, 27, 21, 0.55);
}

.hh-gw-dialog__form {
  position: relative;
  padding: 1.25rem 1rem 1rem;
}

.hh-gw-dialog__x {
  position: absolute;
  top: 0.5rem;
  right: 0.65rem;
  border: 0;
  background: none;
  font-size: 1.6rem;
  line-height: 1;
  color: #675F4B;
  opacity: 0.55;
  cursor: pointer;
  padding: 0.25rem 0.4rem;
  min-height: 0;
}

.hh-gw-dialog__x:hover {
  opacity: 1;
}

.hh-gw-dialog__titel {
  margin: 0 2rem 0.75rem 0;
  font-size: 1.2rem;
  line-height: 1.25;
  color: #4B463E;
}

.hh-gw-dialog__bild {
  display: block;
}

.hh-gw-dialog__bild img {
  display: block;
  width: 100%;
  height: auto;
}

.hh-gw-dialog__fuss {
  margin: 0.75rem 0 0;
  font-size: 0.9rem;
}
