/* pz: Kategorieseite — dunkler Kopf, Filter-Sidebar, Toolbar, Produktraster,
   Pager, SEO-Band, Berater-Box. SOLL: mockup-kategorie.html.
   Version: siehe Marker --pz-css-kategorie unten (muss mit layout/header.tpl uebereinstimmen) */

:root { --pz-css-kategorie: "20260921-41"; }

/* ============================================================================
   pz: BROTKRUMEN IM DUNKLEN KOPFBAND (Review R3, B14).
   IST vorher (gemessen 20.08., /Perlenketten, 1440): Band y226-542, Krumen
   als hellgrauer Streifen DARUNTER (y542-612), gemischte Schreibung.
   SOLL (Mockup .chead): kleine Gold-Versalien ueber der H1, im Band.
   Markup: productlist/header_lead.tpl; NOVAs Streifen ist fuer Artikellisten
   in layout/breadcrumb.tpl unterdrueckt (dort steht auch, warum). */
.pz-crumbs { margin-bottom: 22px; }
.pz-crumbs ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0 10px;
  list-style: none;
  margin: 0;
  padding: 0;
}
.pz-crumbs li {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 9.5px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: #8c8175;
}
.pz-crumbs li + li::before {
  content: "";
  width: 12px;
  height: 1px;
  background: rgba(247, 244, 238, .28);
  flex: none;
}
.pz-crumbs a { color: var(--pz-gold-lt); text-decoration: none; }
.pz-crumbs a:hover { color: #f2ede4; }
.pz-crumbs li:last-child { color: #8c8175; }

/* ============ Kategoriekopf (vollbreit, dunkel) ============ */

.pz-chead {
  background: var(--pz-ink);
  color: #f2ede4;
  /* pz: Skala statt Einzelwert (88/96 waren zwei verschiedene Masse).
     ⚠️ 20.08. (Ben/K1): "hier auch die abstaende nach oben und unten
     halbieren" — markiert war der Raum ueber der Brotkrume und unter der H1,
     beide je 96px (gemessen /Perlencolliers 1440: padT/padB 96px, Band
     y226-579). Halbe Bandstufe statt eines freien Wertes; die responsiven
     Entsprechungen (28/20px) ziehen ueber das Token automatisch mit. */
  padding: var(--pz-band-halb) 0;
}
.pz-chead-wrap {
  display: grid;
  grid-template-columns: 1.02fr .98fr;
  gap: 80px;
  align-items: flex-end;
}
.pz-chead .pz-eyebrow { display: block; margin-bottom: 26px; }
.pz-chead h1 {
  font-size: 78px;
  color: #f7f2e9;
  margin: 0;
  line-height: 1.02;
}
.pz-chead-cnt {
  display: flex;
  align-items: baseline;
  gap: 16px;
  margin-bottom: 22px;
  justify-content: flex-end;
}
.pz-chead-cnt b {
  font-family: var(--pz-serif);
  font-size: 40px;
  font-weight: 500;
  /* pz: bleibt --pz-gold: der Kategoriekopf ist DUNKEL (.pz-chead h1 auf
     #f7f2e9), dort misst Flaechen-Gold 6,32:1. */
  color: var(--pz-gold);
}
.pz-chead-cnt span {
  font-size: 11px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: #8c8175;
}

/* pz: Der NOVA-Brotkrumen-Streifen ist auf Artikellisten leer (die Krumen
   stehen jetzt im dunklen Kopfband, siehe layout/breadcrumb.tpl) — sein
   Polster blieb aber als 20px hoher Leerstreifen unter dem Band stehen
   (gemessen 390: y390-410, h20 ohne Inhalt). Ein Abstand ohne Element ist
   genau der "sinnlose Whitespace" aus FEHLERMUSTER.md Zeile 1.
   :has-Pruefung statt fester Seiten-Ausnahme, damit der Streifen sofort
   zurueckkommt, falls dort je wieder etwas gerendert wird. */
#content-wrapper.is-item-list .breadcrumb-container:not(:has(.breadcrumb)) {
  padding-top: 0;
  padding-bottom: 0;
}

/* Breadcrumb ruhig auf ivory */
.breadcrumb-container { background: var(--pz-ivory); }
.breadcrumb { background: transparent; font-size: 12px; letter-spacing: .04em; }
.breadcrumb a, .breadcrumb-item { color: var(--pz-muted); }

/* ============================================================================
   pz: ANSCHLUSS DUNKLES BAND -> INHALT (Ben 20.08./K2: "der content klebt am
   banner ... hier muss etwas abstand rein").
   Gemessen vorher (/Perlencolliers, 1440): Bandunterkante y=579,
   #sidepanel_left top=579 — also GENAU 0px. Das "KATEGORIEN"-Label sass auf
   der Bandkante. Die rechte Spalte startete bei 611, weil NOVAs Toolbar-Zeile
   ein eigenes margin-top von 32px mitbrachte: zwei verschiedene Masse an
   derselben Grenze, eins davon 0.
   Genau dafuer gibt es --pz-sek-lead (76px, Mockup `.layout{padding:76px 0 0}`)
   — es war auf dieser Seitengattung nur nie gesetzt, weil pz-base das
   NOVA-Polster an der Basis nullt.
   Skalen-Regel 2 "an jeder Grenze zieht GENAU EIN Skalenwert": das Mass traegt
   der Wrapper, NOVAs Toolbar-Margin faellt weg. Beide Spalten beginnen dadurch
   auf derselben Hoehe. */
/* ⚠️ KORREKTUR 20.08. (Ben/B1, Screenshot mit rot markiertem Leerband:
   "Abstand halbieren"). Der Wert war mit --pz-sek-lead (76px) richtig
   HERGELEITET, aber zu gross: ueber dem Streifen steht kein Inhalt, sondern
   eine harte Farbkante, und darunter beginnt die Seite nicht mit einer
   Ueberschrift, sondern mit der Toolbar-Zeile — 76px sehen dort aus wie ein
   vergessenes weisses Band. Es zieht deshalb die benannte HALBSTUFE
   --pz-lead-halb (38 / 24 / 16px), kein freier Pixelwert.

   FEHLERREGISTER 17 GEPRUEFT ("ist der Wert HIER falsch oder UEBERALL?"):
   --pz-sek-lead steht an vier weiteren Stellen — .pz-404-head (Kopfpolster
   einer Inhaltsseite), .content-cats-small (Unterkategorie-Kacheln -> Liste),
   .pz-setgrid (Kopf -> Raster INNERHALB des Set-Bandes) und .pz-nature (PDP).
   Keine davon ist diese Grenze: die Paarung "dunkles Vollbild-Kopfband ->
   sofort folgende Toolbar" gibt es im ganzen Shop genau einmal, auf der
   Artikelliste. Halbiert wird deshalb hier und nur hier — die Stufe selbst
   bleibt fuer die anderen vier unveraendert. */
#content-wrapper.is-item-list { padding-top: var(--pz-lead-halb); }
#result-wrapper .productlist-page-nav-header-m { margin-top: 0; }

/* ============ Seitenraster (Reviewer M5) ============ */

/* Artikellisten-Container auf denselben 1280px-Rahmen wie die Startseite —
   NOVAs container-fluid-xl lief bis an die Viewport-Kanten (Sidebar x=16). */
@media (min-width: 1200px) {
  #content-wrapper.is-item-list {
    max-width: 1280px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 40px;
    padding-right: 40px;
  }
  /* pz: Die Spaltenzahl steht NICHT hier — sie folgt weiter unten der
     Item-Zahl (Reviewer F12). Zwei Fassungen desselben Fixes im selben
     Stylesheet sind derselbe Fehler in gruen (Fehlerregister 17). */
}

/* ============ Unterkategorie-Kacheln ============
   ⚠️ Der frueher hier stehende Regelblock hing an `.subcategories` — eine
   Klasse, die dieser Shop nie rendert; er war wirkungslos. Der wirksame
   Block steht am Dateiende unter "Reviewer F2" (Selektor belegt gemessen). */

/* ============ Filter-Sidebar ============ */

/* Boxen-Karten auf ruhige Mockup-Optik (fgroup): kein Kartenrahmen,
   Trennlinien, Gold-Titel */
#sidebox .card, .sidebox-left .card,
#footer-sidepanel-left .card,
aside .card {
  border: 0;
  background: transparent;
  border-radius: 0;
}
aside .card + .card, aside .box + .box { border-top: 1px solid var(--pz-line); }
/* ============================================================================
   pz: EIN TRENNER PRO FILTERGRUPPE (Ben 20.08./K2: "im filterbereich / navi
   links irgendwelche komischen sinnlosen raender doppelt").
   Gemessen vorher (/Perlencolliers, 1440, Border-Scan ueber #sidepanel_left):
   jede Filtergruppe brachte ZWEI Haarlinien 8px auseinander mit —
     y=893-894  HR.box-filter-hr   (NOVAs eigener Abschluss IM Kasten)
     y=902      border-top         (die pz-Regel eine Zeile darueber)
   Zwei Quellen fuer dieselbe Trennung. Die Regel oben bleibt (sie sitzt an der
   Gruppengrenze und traegt den CI-Ton), NOVAs HR faellt weg.
   ⚠️ Nebenbefund, hier korrigiert: der Kommentar weiter unten behauptet,
   `#sidepanel_left` sei ein DIV und die aside-Regeln griffen nie. Gemessen ist
   es ein <aside id="sidepanel_left"> — die Regel oben greift also sehr wohl,
   sie ist genau die zweite Linie. */
#sidepanel_left .box-filter-hr { display: none; }
/* Die letzte Gruppe braucht ihren Abschluss trotzdem — sonst endet die Spalte
   ohne Kante ueber der dunklen Berater-Box. */
#sidepanel_left .box[class*="box-filter-"]:last-of-type { border-bottom: 1px solid var(--pz-line); }
aside .card-header, aside .box-title,
aside .productlist-filter-headline {
  background: transparent;
  border: 0;
  padding-left: 0;
  font-family: var(--pz-sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  /* pz: 21.08. Text-Gold statt Flaechen-Gold — Sidebar-Filterkopf 10px auf heller Seite:
     --pz-gold war 2,74:1, --pz-gold-text ist 5,01:1. Siehe pz-base.css. */
  color: var(--pz-gold-text);
}
aside .card-body { padding-left: 0; padding-right: 0; }
aside .filter-item, aside .nav-link {
  font-size: 14px;
  color: #413b34;
  padding: 8px 0;
}
aside .filter-item:hover, aside .nav-link:hover { color: var(--pz-ink); }
aside .filter-item .badge {
  background: transparent;
  color: var(--pz-muted); /* pz: 21.08. heller Grund -> --pz-muted (muted-d misst hier 2,45:1) */
  font-size: 11.5px;
  font-weight: 400;
}

/* ============================================================================
   pz: KATEGORIE-SIDEBAR MOBIL (Review R3, B8 — Fehlerregister 10: dieselbe
   Mechanik verhaelt sich je Breakpoint anders).
   Gemessen 20.08.:
   a) 768 — der Goldstrich des aktiven Eintrags (`li.nav-item.active >
      .nav-link`, `border-bottom: 6px solid`) spannte die VOLLE Seitenbreite
      (x16-752 = 736px), weil die Sidebar unterhalb lg vollbreit wird. Auf
      1440 sah dieselbe Regel richtig aus (227px Spaltenbreite).
      -> Der Strich gehoert an den Eintrag, nicht an die Zeile: Inhaltsbreite
      statt Blockbreite, und in der Staerke der uebrigen Akzente (2px, das
      Mockup-.hint-Mass) statt 6px.
   b) 390 — der Klapp-Kopf der Kategorien-Box (`a.box-normal-link`) trug
      NOVAs Rohtypo (Montserrat 16px, #525252). Er ist derselbe Baustein wie
      die 768er-Ueberschrift "KATEGORIEN" und bekommt dieselbe Typo.
      ⚠️ Anker ist `#sidepanel_left` (gemessen), NICHT `aside` — die Sidebar
      dieses Shops ist ein DIV, die aside-Regeln oben greifen dort nie
      (Fehlerregister 13/16). Der Fuss benutzt dieselbe Klasse; er hat seine
      eigene Regel in pz-footer.css und bleibt hier unberuehrt. */
@media (max-width: 991.98px) {
  #sidepanel_left .box-categories .nav-item > .nav-link,
  #sidepanel_left .nav-item.active > .nav-link {
    display: inline-block;
    width: auto;
    max-width: 100%;
    border-bottom-width: 2px;
  }
}
#sidepanel_left .box-normal-link,
#sidepanel_left .box-normal-link .text-truncate {
  font-family: var(--pz-sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  /* pz: 21.08. Text-Gold statt Flaechen-Gold — Sidebar-Boxlink 10px auf heller Seite:
     --pz-gold war 2,74:1, --pz-gold-text ist 5,01:1. Siehe pz-base.css. */
  color: var(--pz-gold-text);
  text-decoration: none;
}

/* ============ Berater-Box (footer.tpl-Block, nur Artikellisten) ============ */

.pz-abox {
  background: var(--pz-ink);
  color: #c9beb2;
  padding: 30px 28px;
  margin-top: 36px;
}
/* pz: 21.08. — Selektor folgt dem Tagwechsel h5 -> h2 in layout/footer.tpl
   (Heading-Sprung h1 -> h5). Die Werte sind unveraendert, damit die Box
   exakt gleich aussieht — NOVAs h2-Grundgroesse wird hier ueberschrieben. */
.pz-abox h2 {
  font-family: var(--pz-serif);
  font-size: 23px;
  font-weight: 500;
  color: #f2ede4;
  line-height: 1.2;
  margin-bottom: 12px;
}
.pz-abox p { font-size: 13px; line-height: 1.7; color: #9d9286; margin: 0; }
.pz-abox a {
  display: flex;
  align-items: center;
  gap: 11px;
  margin-top: 20px;
  font-family: var(--pz-serif);
  font-size: 23px;
  color: var(--pz-gold-lt);
}
.pz-abox a:hover { color: #f2ede4; }
.pz-abox svg { width: 16px; height: 16px; }

/* ============================================================================
   pz: TOOLBAR-ZEILE — TOTRAEUME UND TRENNLINIE (Ben 20.08./F4, zweimal:
   "hier sind noch toträume die keinen sinn machen … und die filter kleben
   direkt an der trennlinie", danach praezisiert: "das ist immernoch nicht
   bündig nach oben - und die filter kleben immernoch an der trennleiste").

   GEMESSEN VORHER (1440, /Perlencolliers) — jeder Streifen mit Quelle:
     483,4          Unterkante dunkles Kopfband
     483,4 -> 559,4  76px = #content-wrapper.is-item-list padding-top
                     (damals --pz-sek-lead; seit Ben/B1 vom 20.08. abends die
                     Halbstufe --pz-lead-halb = 38px, Begruendung oben)
     559,4          Oberkante beider Spalten; "KATEGORIEN" beginnt hier
     559,4 -> 582,2  22,8px = NOVAs `margin-top:16px` auf
                     .productlist-item-info UND .displayoptions, plus
                     Zeilenkasten-Vorlauf. DAS ist der zweite Streifen: ein
                     Abstand ohne Element, der die rechte Spalte gegen die
                     linke verschiebt.
     613,9          Unterkante der Knoepfe
     614,9          Trennlinie -> 1,0px Luft, also "kleben"

   DREI KORREKTUREN:
   (1) NOVAs Eigenabstaende in der Zeile fallen weg. Damit beginnt die
       rechte Spalte auf derselben Kante wie die linke, und zwischen
       Bandkante und Toolbar zieht wieder GENAU EIN Skalenwert (76).
   (2) Die Zeile bekommt Luft UEBER der Linie — ein benannter Skalenwert
       (--pz-nav-halb), nicht ein Pixelwert fuer diese eine Stelle.
       `gap` mit demselben Token traegt zugleich den Abstand, wenn die
       Zeile unterhalb lg umbricht (dort standen bisher je nach Breakpoint
       8px, 16px oder gar nichts — Fehlerregister 3).
   (3) Ab lg teilen sich Sidebar-Label und Toolbar EINE Zeilenhoehe
       (--pz-toolbar-row) und zentrieren ihren Inhalt darin. Vorher bezog
       das Label seine Hoehe aus der Textzeile und die Toolbar aus den
       Knopfkaesten — zwei Hoehen in einer Zeile (Fehlerregister 11), und
       genau das sah Ben als "nicht buendig".
   ============================================================================ */

.pz-toolbar-scope, #result-wrapper .productlist-page-nav {
  border-bottom: 1px solid var(--pz-line);
  margin-bottom: 48px;
}
#result-wrapper .productlist-page-nav {
  gap: var(--pz-nav-halb);
  padding-bottom: var(--pz-nav-halb);
}
#result-wrapper .productlist-page-nav > * {
  margin-top: 0;
  margin-bottom: 0;
}
@media (min-width: 992px) {
  /* EINE Zeilenhoehe, von beiden Spalten referenziert (Fehlerregister 11) */
  #result-wrapper .productlist-page-nav,
  #sidepanel_left .productlist-filter-headline {
    min-height: var(--pz-toolbar-row);
    display: flex;
    align-items: center;
  }
  /* Der Knopfkasten war die Quelle der 38,5px — er referenziert jetzt
     dieselbe Zahl, statt sie zu setzen. */
  #result-wrapper .productlist-page-nav .btn,
  #result-wrapper .productlist-page-nav .dropdown-toggle {
    min-height: var(--pz-toolbar-row);
  }
  /* Das Label trug zusaetzlich ein eigenes Fusspolster; die Zeilenhoehe
     oben ersetzt es, sonst stuende der Abstand zweimal in der Kette. */
  #sidepanel_left .productlist-filter-headline { padding-bottom: 0; }
}
/* ⚠️ frueher stand hier zusaetzlich das nackte `#result-wrapper select`.
   NOVA benutzt #result-wrapper NICHT nur fuer die Artikelliste - im
   Bestellvorgang liegt das Laender-Select ebenfalls darin und erbte
   dadurch die Toolbar-Optik (Lehre I.5: die ID-Regel schlug die
   Basisregel in pz-base still). Deshalb auf die Toolbar eingegrenzt. */
#result-wrapper .productlist-page-nav .custom-select,
#result-wrapper .productlist-page-nav select,
#result-wrapper .snippets-filter-mobile-sorting select {
  border: 1px solid var(--pz-line);
  border-radius: 0;
  background-color: #fff;
  font-size: 11.5px;
  letter-spacing: .1em;
  color: #413b34;
}

/* ============ Produktraster (NOVA-Galerie, Karten wie Startseite) ============
   ⚠️ ALLES, was hier Geometrie setzt, haengt an `.layout-gallery`.
   Grund (Ben 20.08./K4, Fehlerregister 23 / FEHLERMUSTER.md Zeile 3): NOVA
   rendert unter DERSELBEN Klasse `.product-list` zwei Ansichten —
   `.layout-gallery` (Kacheln, `.productbox-column`) und `.layout-list`
   (Zeilen, `.productbox-row`). Die Regeln standen bis heute ungescoped und
   haben die Listenansicht zerlegt. Farb-/Schriftregeln duerfen weiter fuer
   beide gelten, Masse nicht. */

.product-list .product-wrapper { min-width: 0; }

/* Hover ruhig (Fehlerregister #1) + Bildwechsel aus (Lehre F.4: nur Opacity).
   Bewusst fuer BEIDE Ansichten: das ist eine Entscheidung ueber unsere Fotos
   (kein zweites Bild aufblitzen lassen), keine Layout-Regel. Die Kartenflaeche
   und ihr Hover kommen generisch aus pz-base (.productbox-column). */
.product-list .productbox img.first { opacity: 1 !important; }
.product-list .productbox img.second { opacity: 0 !important; }
.product-list .productbox:hover img.first { opacity: 1 !important; }
.product-list .productbox:hover img.second { opacity: 0 !important; }
.product-list.layout-gallery .productbox .productbox-variations { display: none !important; }
.product-list.layout-gallery .productbox-quick-actions { display: none !important; }

/* Bildbuehne + Abstandskette: generisch in pz-base.css (.productbox) */
.product-list.layout-gallery .productbox-caption .productbox-title,
.product-list.layout-gallery .productbox-caption a {
  font-family: var(--pz-serif);
  font-size: 21px;
  line-height: 1.25;
  font-weight: 500;
  color: var(--pz-ink);
  text-decoration: none;
}
.product-list .price { font-size: 19px; font-weight: 600; color: var(--pz-ink); }
.product-list .price_wrapper .strike,
.product-list .price_wrapper del { font-size: 13px; color: var(--pz-muted); } /* pz: 21.08. heller Grund -> --pz-muted (muted-d misst hier 2,45:1) */

/* ============================================================================
   pz: LISTENANSICHT (Ben 20.08./K4 — "hast du komplett reingeschissen ... nimm
   die Nova Version aber halt in sauberer farbgebung die zur CI passt";
   Fehlerregister 23 / FEHLERMUSTER.md Zeile 3).

   Grundlinie ist NOVAs Zeilenlayout — Struktur, Spaltenfolge und Markup bleiben
   unangetastet. Farbe und Schrift kommen aus den generischen .productbox-Regeln
   in pz-base (Titel-Serif, Preisfamilie, Verfuegbarkeits-Ton, Kartenflaeche in
   --pz-card-bg). Hier stehen nur die vier Punkte, die Ben namentlich beanstandet
   hat — jeder mit dem gemessenen Befund, gegen den er behoben wurde.

   REFERENZMESSUNG (20.08., alle pz-Stylesheets per link.disabled abgeschaltet,
   /Perlencolliers?ed=1, 1440): NOVA pur rendert die Zeile 1080px breit, Bild
   238px, drei Textspalten a 270px. Unser Inhaltsrahmen ist 908px breit
   (max-width 1280 + 40px Polster) — dieselben Bootstrap-Klassen ergeben darin
   nur noch 231px je Spalte. Genau diese 39px fehlen dem laengsten Label.
   Deshalb sind die vier Punkte hier KEINE Geschmacksfragen: NOVAs Standard
   passt in unseren Rahmen nicht unveraendert hinein. */

/* (1) "Artikelnummer:" ueberlappte den Wert (Bens Screenshot: "ArtikelnummerPZ-P026").
   Gemessen: DT ist `col-6` = 105px breit, das Label braucht 117px (scrollWidth)
   und die DL traegt `text-nowrap-util` — es lief also 12px in die DD hinein.
   Ein fester 50/50-Split kann das nie halten, weil die Labelbreite vom Wort
   abhaengt: das Label bekommt Inhaltsbreite, der Wert den Rest.
   ⚠️ 20.08. (Audit L5) HIERHER ZURUECKGEZOGEN: dieselbe dl-Mechanik steckt auch
   im Warenkorb-Modal (dort 355px Luecke gemessen). Zwei Fassungen desselben
   Fixes waeren derselbe Fehler in gruen (Fehlerregister 17) — die EINE Fassung
   steht jetzt in pz-base.css unter `.productbox-inner dl.form-row` und deckt
   Listenzeile UND Modal ab. Hier absichtlich keine Regel mehr. */

/* (2) "Mini-Bild links". Gemessen: 199x142 in einer 231px-Spalte, und die
   zweite Zeile zeigte ein anders proportioniertes, noch kleineres Bild — zwei
   Bildformate in derselben Liste. Die Zeile bekommt deshalb dieselbe Buehne wie
   die Kachel (ivory-2, Haarlinie, 4/3, formatfuellend). Das ist die CI-Fassung
   desselben Bausteins, nicht ein zweites Layout. */
.product-list.layout-list .productbox-images {
  background: var(--pz-ivory-2);
  border: 1px solid var(--pz-line);
}
/* Die Bildspalte ist kuerzer als die Textspalte (148px gegen ~280px). Stand sie
   oben, blieb darunter ein Loch in der Kartenflaeche — dieselbe Optik, die Ben
   als "riesige leere Kartenflaeche" beanstandet hat, nur kleiner. Mittig
   ausgerichtet verteilt sich der Rest als Polster ueber und unter dem Bild und
   liest sich als Absicht statt als Rest. */
.product-list.layout-list .productbox-inner > .row { align-items: center; }
.product-list.layout-list .productbox-images .square::before { padding-bottom: 75%; }
.product-list.layout-list .productbox-images .square-image .inner img,
.product-list.layout-list .productbox-images .first-wrapper img,
.product-list.layout-list .productbox-images .second-wrapper img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* (3) "riesige leere Kartenflaeche, kein Kaufbereich". Zwei Ursachen, beide
   gemessen:
   a) `.productbox-variations` ist in diesem Shop LEER (innerHTML.length = 0 —
      keine Variationsartikel im Bestand) und belegte trotzdem eine volle
      Spalte von 231px. Sie faellt nur weg, wenn sie wirklich leer ist; sobald
      der Kunde Variationsartikel pflegt, ist sie wieder da.
   b) NOVAs Kaufbereich haengt an `.productbox-onhover` und steht auf
      `opacity: 0` (in der Referenzmessung OHNE unser CSS ebenso) — er erscheint
      erst beim Ueberfahren. Deshalb sah die Zeile im Ruhezustand aus wie eine
      leere Flaeche, und auf dem Touchgeraet gibt es kein Ueberfahren.
      In einer LISTENansicht ist der Kaufbereich der Zweck der Zeile: er steht
      hier dauerhaft. Bewusste Abweichung vom NOVA-Standard, weil der Standard
      genau das Symptom erzeugt, das Ben beanstandet hat. */
/* ⚠️ `:empty` ist hier WIRKUNGSLOS und war der erste Versuch: Smarty laesst
   Zeilenumbrueche im Container stehen, und ein Textknoten — auch reiner
   Whitespace — schliesst `:empty` aus (gemessen: display blieb block).
   `:not(:has(*))` fragt nach ELEMENT-Kindern und ignoriert Whitespace. */
.product-list.layout-list .productbox-variations:not(:has(*)) { display: none; }
.product-list.layout-list .productbox-row .productbox-onhover,
.product-list.layout-list .productbox-row .productbox-actions,
.product-list.layout-list .productbox-row .item-list-basket-details { opacity: 1; }
/* Die Merken/Vergleichen-Kreise ueber dem Bild bleiben aus — die Karte ist in
   beiden Ansichten bewusst ruhig (dieselbe Entscheidung wie im Kachelraster). */
.product-list.layout-list .productbox-quick-actions { display: none !important; }

/* (3b) Schmales Fenster: NOVA gibt der Listenzeile als Grundklasse `col-6`
   (gemessen 20.08. bei 390, Desktop-UA: zwei Listenzeilen a 195px
   NEBENEINANDER, Hoehen 521 und 585 — dasselbe Quetsch-Symptom wie auf 1440,
   nur aus NOVAs eigener Klasse statt aus unserer).
   ⚠️ Dieser Zustand ist nur mit Desktop-Kennung im schmalen Fenster erreichbar —
   mit echter Mobil-Kennung liefert JTL unterhalb des Tablet-Punkts ohnehin die
   Kachelkarte (productlist/index.tpl: `$style === 'list' && (!$isMobile ||
   $isTablet)`). Erreichbar ist erreichbar: eine Zeilenansicht mit zwei Zeilen
   nebeneinander ist keine Zeilenansicht (Fehlerregister 23 — jede erreichbare
   Zweitansicht wird an JEDEM Gate geprueft, nicht nur auf der Zielbreite). */
@media (max-width: 767.98px) {
  #result-wrapper .product-list.layout-list > .product-wrapper {
    flex: 0 0 100%;
    max-width: 100%;
  }
}

/* (4) "Verfuegbarkeit rechts zerrissen". Ursache war die 231px-Spalte, in der
   NOVAs rechtsbuendiger Block Wort fuer Wort umbrach. Mit der leeren Spalte aus
   (3) hat die Spalte wieder Platz; damit kein Rest-Flattersatz bleibt, steht
   der Block linksbuendig wie die uebrige Zeile. */
.product-list.layout-list .productbox-options,
.product-list.layout-list .productbox-options .item-list-price,
.product-list.layout-list .productbox-options .delivery-status { text-align: left; }

/* ============================================================================
   pz: (5) TOTE FLAECHE RECHTS IN DER ZEILE (Audit L1, Fehlerregister 3b —
   Bens Klasse "damit mache ich mich LAECHERLICH").
   Gemessen vorher (/Perlencolliers?ed=1, 1440): Zeile x428-1320 (892 breit),
   Bildspalte 231, .productbox-details 231 (x643), .productbox-options 231
   (x874-1105) — rechts blieben 1320-1105 = 215px (24 % der Zeile) LEER.
   Ursache ist genau die Wurzel aus Register 3b: die Spaltenzahl passt nicht
   zur Item-Zahl. NOVA legt drei `col-xl-4`-Spalten an (Details / Variationen /
   Optionen); die Variationsspalte faellt in diesem Shop per Regel (3a) weg,
   ihre 33 % werden aber nicht neu verteilt.
   Die beiden verbliebenen Spalten teilen sich deshalb den Platz — und zwar
   unter derselben Bedingung, unter der die dritte verschwindet: die
   Variationsspalte hat kein Element-Kind. Pflegt der Kunde Variationsartikel,
   ist die Spalte wieder da und das 3er-Raster kommt automatisch zurueck; die
   beiden Regeln koennen nicht auseinanderlaufen.
   ⚠️ Die Bedingung steht bewusst als `:not(:has(> .productbox-variations > *))`
   und NICHT als `:has(> .productbox-variations:not(:has(*)))`: `:has()` darf
   laut Spezifikation nicht in `:has()` verschachtelt werden — der Browser
   verwirft dann die GANZE Regel. Beim ersten Versuch genau so passiert und
   gemessen (Optionsspalte blieb 223px, Totflaeche unveraendert 223px).
   `:has()` innerhalb von `:not()` ist dagegen gueltig — dieselbe Form, die die
   Ausblendregel unter (3a) benutzt.
   ⚠️ Nur ab xl: darunter rendert NOVA die drei Spalten ohnehin als col-12
   untereinander, da gibt es nichts zu verteilen (Fehlerregister 10). */
@media (min-width: 1200px) {
  .product-list.layout-list .productbox-inner .row:not(:has(> .productbox-variations > *)) > .productbox-details,
  .product-list.layout-list .productbox-inner .row:not(:has(> .productbox-variations > *)) > .productbox-options {
    flex: 1 1 0;
    max-width: none;
  }
}

/* ============================================================================
   pz: (6) KARTENPLATTE OHNE INNENABSTAND (Audit L2, Fehlerregister 22 /
   FEHLERMUSTER.md Zeile 2 — "der text klebt direkt am rand", diesmal in der
   Listenansicht).
   Gemessen vorher (1440): `.productbox-inner` padding 0 — die Platte (NOVAs
   ::before, von pz-base auf --pz-card-bg gezogen) lag deckungsgleich auf dem
   Inhalt: Titel-Oberkante y663 = Plattenoberkante y663, Bild-Linkskante
   x428 = Plattenkante x428, Gold-CTA-Unterkante = Plattenunterkante.
   Die Kachelkarte hat ihr Polster laengst (`--pz-card-pad` an
   .productbox-column); die Zeilenkarte traegt ihre Flaeche aber am INNER,
   nicht an der aeusseren Box — deshalb das Polster hier, an derselben Ebene
   wie die Flaeche. Gleicher Token, gleiches Mass auf allen vier Seiten, also
   dieselbe Kartenrhythmik wie im Kachelraster (kein zweiter Wert). */
.product-list.layout-list .productbox-inner { padding: var(--pz-card-pad); }

/* ============================================================================
   pz: BEWUSSTE ENTSCHEIDUNGEN DER LISTENANSICHT (Audit L7 — dokumentiert,
   damit sie nicht bei der naechsten Runde als Befund wieder auflaufen):
   a) Die Artikelnummer-Zeile (`.productbox-details`) blendet NOVA unterhalb
      xl aus. Das bleibt so: die Kachelkarte zeigt die Artikelnummer ebenfalls
      nicht, und ein Datenfeld, das nur in einer von zwei Ansichten auftaucht,
      waere die Beliebigkeit, nicht ihre Behebung.
   b) Mit ECHTER Mobil-Kennung liefert JTL unterhalb des Tablet-Punkts gar
      keine Zeilen-, sondern die Kachelansicht (productlist/index.tpl:
      `$style === 'list' && (!$isMobile || $isTablet)`). Die Regeln unter (3b)
      greifen deshalb nur im schmalen Fenster mit Desktop-Kennung — erreichbar
      ist erreichbar, aber es ist KEIN Defekt, dass ein echtes Telefon hier
      Kacheln zeigt. */

/* Reviewer m6: Produktlisten-Fuss — Linien um die Ergebniszeile reduzieren */
#result-wrapper .productlist-page-nav-bottom { border: 0; }
#result-wrapper .productlist-page-nav-bottom hr { display: none; }

/* ============================================================================
   pz: LISTENFUSS — die beiden Luecken aus Ben/K3 ("wo die markierten abstaende
   herkommen kann ich ned sehen, aber die kannst du sicher auch mindestens mal
   halbieren").
   Gemessen vorher (/Perlencolliers, 1440):
     letzter Karten-CTA endet  y=1261
     "Artikel 1-2 von 2"       y=1414-1440   -> 153px Luecke
     Footer-Oberkante          y=1614        -> 174px Luecke
   Die erste Luecke kam aus dem Kartenraster (haengender Reihen-margin +
   Flex-Stretch) und ist mit dem Grid-Umbau weiter unten weg; hier bleiben die
   beiden Masse der Zeile selbst. Statt NOVAs 16/32/48-Mischung traegt jede
   Grenze genau EINEN Skalenwert (Skalen-Regel 2):
     Liste -> Ergebniszeile : --pz-sek-nav   (32) — es ist ein Nav-Streifen
     Ergebniszeile -> Footer: --pz-sek-halb  (64) — halbierte Sektionsgrenze an
                              der harten Farbkante; der Footer bringt sein
                              eigenes Kopfmass mit (Skalen-Regel 3).
   ⚠️ Gemessene DOM-Lage (nicht geraten): `.productlist-page-nav-bottom` und
   `-top` sind <hr>-Elemente, keine Zeilen — und die `-bottom`-HR steht ZWEIMAL
   im #result-wrapper (einmal ueber der Liste, einmal darunter). Die sichtbare
   Zeile "Artikel 1-2 von 2" ist `div.row.productlist-page-nav` als letztes DIV.
   Die HRs sind durch die Regel darueber randlos, also 0px hoch — ihre Margins
   wirken aber weiter und waren Teil der Streuung (16/32/48). */
#result-wrapper .productlist-page-nav-top {
  margin-top: var(--pz-sek-nav);
  margin-bottom: var(--pz-nav-halb);
}
#result-wrapper .productlist-page-nav-bottom { margin: 0; }
#result-wrapper > div.productlist-page-nav:last-of-type { margin-bottom: 0; }

/* ============================================================================
   pz: PAGER (Ben 20.08./B2 — "Pagination ist ungeprueftes Terrain": Layout mit
   ECHTER Pagination pruefen und in CI bringen, Desktop + Mobil).

   ⚠️ ERST DEN BAUSTEIN GEMESSEN, DANN GESTYLT (Fehlerregister 13/14) — die
   Pagination der Artikelliste ist NICHT `snippets/pagination.tpl`, sondern ein
   eigener Baustein in `snippets/productlist_page_nav.tpl` mit ZWEI Gesichtern:
     >= md  NOVA legt das `.dropdown-menu` auf `position:static; display:flex`
            und blendet den Toggle aus -> die Seitenzahlen stehen als Reihe
            (`.dropdown-item.page-item` — NICHT `li.page-item`!).
     <  md  die Zahlenreihe ist ein echtes Dropdown; sichtbar ist nur der
            Toggle-Knopf "Seite 1" (`.btn.btn-outline-secondary`).
   Eine Regel, die nur `li.page-item` kennt, trifft am Desktop also KEINE
   einzige Seitenzahl. Beide Huellen stehen deshalb in jeder Regel.
   (NOVA-Quelle: themes/base/sass/components/_pagination.scss.)

   ⚠️ Der goldene 4px-Balken unter der aktiven Seite ist NOVAs
   `.page-item.active .page-link::after` — er sass UNTER dem Kasten auf der
   Grundlinie und sah aus wie ein Rendering-Rest. Die aktive Seite bekommt
   stattdessen eine Ink-Flaeche, wie jede andere aktive Auswahl im Shop.

   Hoehe: --pz-toolbar-row (40px) — dieselbe Zeilenhoehe, die Sortier- und
   Seitengroessen-Knopf in derselben Zeile tragen (Fehlerregister 11).
   Der Abstand ZWISCHEN den Kaesten ist ein komponenteninternes Mass (8px, wie
   .pz-btn 14 / .pz-cardcta 10) — die Sektions-Skala misst Sektionsgrenzen,
   keine Knopfabstaende (Begruendung wie bei --pz-card-pad in pz-base). */
.pagination { gap: 8px; align-items: center; }
/* Die Seitenzahlen liegen ab md IM `.dropdown-menu` (NOVA legt es auf
   display:flex, siehe oben) — der `gap` der `.pagination` erreicht sie
   deshalb nicht, und "1|2" klebten zusammen, waehrend die Pfeile 8px Luft
   hatten. Ein Abstand, drei Mal derselbe Wert (Fehlerregister 3). */
@media (min-width: 768px) {
  .navbar-pagination .dropdown-menu { gap: 8px; }
}
.pagination .page-link,
.pagination .page-text {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: var(--pz-toolbar-row);
  min-height: var(--pz-toolbar-row);
  padding: 0 10px;
  border: 1px solid var(--pz-ctl-line);
  border-radius: 0;
  background: transparent;
  color: var(--pz-ink);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
}
.pagination .page-link i { color: inherit; }
.pagination .page-link:hover {
  border-color: var(--pz-gold);
  background: var(--pz-ivory-2);
  color: var(--pz-ink);
}
/* Aktive Seite — beide Huellen, Balken aus */
.pagination .page-item.active .page-link::after,
.pagination .dropdown-item.page-item.active .page-link::after { content: none; }
.pagination .page-item.active > .page-link,
.pagination .dropdown-item.page-item.active > .page-link {
  background: var(--pz-ink);
  border-color: var(--pz-ink);
  color: #f2ede4;
}
/* NOVAs Menue-Zeile traegt selbst keine Flaeche — der Kasten IST der Link
   (sonst liegt hinter der aktiven Seite eine zweite, blaugraue Flaeche). */
.pagination .dropdown-item.page-item,
.pagination .dropdown-item.page-item:hover,
.pagination .dropdown-item.page-item.active { background-color: transparent; }
/* Deaktivierter Pfeil bleibt sichtbar, aber erkennbar tot.
   ⚠️ Die Kante MUSS hier mitgesetzt werden: Bootstraps
   `.page-item.disabled .page-link` (0,3,0) schlaegt unsere `.pagination
   .page-link` (0,2,0) und faerbte den Rahmen sonst kalt-grau #dee2e6 —
   gemessen 20.08. am gerenderten Pager (Fehlerregister 16: Spezifitaet
   zaehlen, nicht !important stapeln). */
.pagination .page-item.disabled .page-link {
  border-color: var(--pz-ctl-line);
  background-color: transparent;
  color: var(--pz-ink);
  opacity: .35;
}
/* Telefon: der Baustein ist ein Dropdown. Der Toggle traegt bereits die
   Ghost-Knopf-Optik aus pz-base; das Menue bekommt hier den Rahmen, damit es
   nicht randlos ueber der Liste schwebt (Fehlerregister 10: dieselbe Mechanik
   verhaelt sich je Breakpoint anders). */
/* ⚠️ GEMESSEN 20.08. bei 390 (Fehlerregister 11): Pfeilkasten 40x40, der
   Seiten-Toggle daneben 98x44 — er ist ein `.btn` und bekommt aus pz-base die
   44px-Tap-Zielhoehe, die Pfeile nicht. Zwei Hoehen in EINER Gruppe, und die
   Pfeile waren zugleich unter dem 44px-Tap-Ziel. Unterhalb lg tragen deshalb
   alle drei Kaesten dieselben 44px. */
@media (max-width: 991.98px) {
  .pagination .page-link,
  .pagination .page-text {
    min-width: 44px;
    min-height: 44px;
  }
}
@media (max-width: 767.98px) {
  .navbar-pagination .dropdown-menu {
    border: 1px solid var(--pz-ctl-line);
    border-radius: 0;
    padding: 6px;
    background: var(--pz-ivory);
  }
  .navbar-pagination .dropdown-menu .page-link { justify-content: flex-start; }
  .navbar-pagination .dropdown-item + .dropdown-item { margin-top: 6px; }
}
/* ⚠️ "SEITE1" statt "Seite 1" — gemessen 20.08. bei 390 (textContent enthaelt
   das Leerzeichen, gerendert wurde keins). Ursache ist unsere EIGENE
   Tap-Ziel-Regel aus pz-base: unterhalb lg ist jeder `.btn` ein Flex-Container,
   und Flex blockifiziert seine Kinder — das Leerzeichen zwischen
   `<span class="pagination-site">Seite</span>` und der Zahl faellt dabei weg.
   Dasselbe passiert in den Menuezeilen, weil auch `.page-link` hier Flex ist.
   Ein margin am Label wirkt in beiden Faellen und ist unabhaengig davon, ob die
   Umgebung Flex oder Inline ist. Ab md blendet NOVA das Label ohnehin aus. */
.pagination .pagination-site { margin-right: .35em; }

/* ============ SEO-Band am Seitenende ============ */

.pz-catseo {
  background: var(--pz-ivory-2);
  padding: var(--pz-sek) 0;
  margin-top: 0; /* pz: Skala — der Abstand zur Liste ist das Kopfmass des Bandes */
}
.pz-catseo-wrap {
  display: grid;
  grid-template-columns: .82fr 1.18fr;
  gap: 90px;
}
.pz-catseo h2 { font-size: 44px; margin: 0; }
.pz-catseo-text { font-size: 15.5px; line-height: 1.85; color: #4a443c; }
.pz-catseo-text p + p { margin-top: 22px; }

/* ============ Responsive (Mockup ist Desktop-only — eigene Entscheidungen) ============ */

@media (max-width: 991.98px) {
  .pz-chead-wrap { grid-template-columns: 1fr; gap: 20px; }
  .pz-chead h1 { font-size: 44px; }
  .pz-chead-cnt { justify-content: flex-start; margin-bottom: 0; }
  .pz-catseo-wrap { grid-template-columns: 1fr; gap: 28px; }
  .pz-catseo h2 { font-size: 32px; }
}
@media (max-width: 575.98px) {
  .pz-chead h1 { font-size: 34px; }
}

/* ============================================================================
   pz: Sektionsgrenze am Listenende (Skalen-Regel 1).
   pz-base nullt NOVAs 48px-Restpolster an #content; das Schlussmass zur
   dunklen Footerkante traegt hier die Liste selbst. Steht ein SEO-Band am
   Ende, bringt DIESES sein Kopfmass mit -> Liste auf 0, sonst stapelt es.
   ⚠️ 20.08. (Ben/K3): das Schlussmass war --pz-sek (126) und stapelte sich mit
   dem 48px-Margin der Ergebniszeile auf 174px vor der Footerkante. Beides
   halbiert bzw. genullt — die Zeile traegt jetzt kein eigenes Fussmass mehr
   (Regel oben), hier steht die halbe Sektionsgrenze. */
#content-wrapper.is-item-list > #content { padding-bottom: var(--pz-sek-halb); }
#content-wrapper.is-item-list > #content:has(.pz-catseo) { padding-bottom: 0; }

/* ============================================================================
   pz: UNTERKATEGORIE-KACHELN (Reviewer F2).
   ⚠️ Zweimal am falschen Selektor vorbeigebaut, deshalb hier der gemessene
   Befund (19.08., /Ohrringe, 1440):
     - `.subcategories`        existiert im Shop NICHT (Altbestand)
     - `.subcategory-wrapper`  existiert NUR im Megamenu-Panel, nicht in #content
     - richtig ist `.row.content-cats-small > .col > .sub-categories`
       mit `.subcategories-image > img` und `.caption > a`
   (Fehlerregister 13: erst querySelectorAll, dann Regel.)

   Zwei Unterkategorien in NOVAs 4-Spalten-Raster (col-lg-3) liessen 50 % der
   Zeile leer (Fehlerregister 3b) -> fuellendes Raster, Spaltenzahl folgt der
   Item-Zahl.
   Die Bildbuehne bleibt vorbereitet (4/3, cover) — solange die Kategorie kein
   Bild hat, liefert JTL `gfx/keinBild.gif`; eine formatfuellende graue Kamera
   waere schlechter als gar kein Bild, deshalb blendet die :has-Regel genau
   diesen Fall aus. Sobald echte Kategoriebilder da sind, erscheint die
   Buehne von selbst. */
#content .content-cats-small {
  display: grid;
  /* Spaltenzahl folgt der Item-Zahl — dasselbe Idiom wie .pz-prodgrid-n auf
     der Startseite. auto-fit war hier untauglich: gemessen 19.08. liess es
     bei zwei Kacheln die Spuren "288px 288px 288px 0px" stehen, also wieder
     eine leere Spur. Gezaehlt wird mit :has, nicht mit :nth-child auf gut
     Glueck (Bootstrap streut clearfix-Divs — hier zwar nicht, aber die
     Zaehlung soll das ueberleben). */
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
  margin: 0 0 var(--pz-sek-lead);
}
#content .content-cats-small:not(:has(> .col:nth-of-type(4))) { grid-template-columns: repeat(3, 1fr); }
#content .content-cats-small:not(:has(> .col:nth-of-type(3))) { grid-template-columns: repeat(2, 1fr); }
#content .content-cats-small:not(:has(> .col:nth-of-type(2))) { grid-template-columns: minmax(0, 340px); }
#content .content-cats-small > .col {
  flex: none;
  max-width: none;
  padding: 0;
}
#content .content-cats-small .sub-categories {
  height: 100%;
  background: var(--pz-ivory-2);
  border: 1px solid var(--pz-line);
  /* pz: 21.09.2026 — ANKER fuer die volle Klickflaeche (Regel unten).
     Ohne `position: relative` haengt das gefuellte ::after am naechsten
     positionierten Vorfahren und deckt die halbe Seite ab. */
  position: relative;
}
/* pz: 21.09.2026 — DIE GANZE KARTE IST EINE KLICKFLAECHE (cargo FEHLERMUSTER
   12b, Kundenbefund Ralf 07.09.2026 auf cargotrikenord.de: Karten „nicht
   sauber klickbar"; hier prophylaktisch vor der Uebergabe nachgezogen).
   NOVA verlinkt nur das Bild und den Namen — das Polster der Karte und die
   Flaeche neben dem Titel waren tot; gemessen 21.09. (1440, /Ohrringe) traf
   `elementFromPoint` in der rechten Polsterecke das <div>, nicht den Link.
   Bootstrap-Muster „stretched-link": das Namens-<a> bekommt ein absolut
   gefuelltes ::after ueber die ganze Karte. Zweiter Link in der Karte ist
   das Bild-<a> mit DEMSELBEN href — es wird verdeckt, das Ziel bleibt
   dasselbe. Ein Kurztext (`.item_desc`) wird hier nicht gerendert
   (Shop-Einstellung unterkategorien_beschreibung_anzeigen), sonst muesste er
   wie in cargo zusaetzlich gebremst werden. */
#content .content-cats-small .caption a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}
#content .content-cats-small .subcategories-image {
  /* display bleibt NOVAs d-md-flex — eine Bootstrap-Utility mit !important,
     gegen die eine normale Regel nicht ankommt (Fehlerregister 16). */
  aspect-ratio: 4 / 3;
  /* pz: 20.08. — dieselbe Buehne wie die Produktkarte (ivory-2 statt Weiss,
     Review R3/B2). Vorher stand ueber der ivory-2-Beschriftung eine WEISSE
     Bildflaeche: zwei Toene in einer Kachel. */
  background: var(--pz-ivory-2);
  border-bottom: 1px solid var(--pz-line);
  overflow: hidden;
}
/* pz: 21.09.2026 — DAS `<picture>` STAND ZWISCHEN BUEHNE UND BILD.
   NOVA rendert `<picture><source …><img …></picture>`. Die Buehne ist
   `d-md-flex`, das `<picture>` damit FLEX-ITEM und sizt auf seine
   Intrinsic-Groesse; die `width/height: 100%` am `<img>` darunter beziehen
   sich dann auf dieses geschrumpfte `<picture>` und liefen ins Leere.
   Gemessen 21.09. (1440, /Ohrringe): Buehne 437x328, `<picture>` UND `<img>`
   aber 360x360 (Natural 360x360), computed `width: 360px` statt 437 — links
   und rechts je ~38px Ivory-Streifen, `object-fit: cover` ohne Wirkung.
   Das `<picture>` ist reine Quellen-Huelle und bekommt deshalb dieselben
   Masse wie das Bild; `display: block` nimmt ihm zusaetzlich den
   Inline-Zeilenabstand. */
#content .content-cats-small .subcategories-image picture {
  display: block;
  width: 100%;
  height: 100%;
}
#content .content-cats-small .subcategories-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* ⚠️ !important ist hier PFLICHT und kein Nachdruck: die Buehne traegt
   NOVAs Utility-Klasse d-md-flex, und Bootstrap-Utilities setzen
   display mit !important — ohne Gegenstueck blieb die graue
   Platzhalter-Kamera stehen (19.08. gemessen: Regel matchte, display blieb
   flex). */
#content .content-cats-small .sub-categories:has(img[src*="keinBild"]) .subcategories-image { display: none !important; }
#content .content-cats-small .caption {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 74px;
  padding: 18px 20px;
  text-align: center;
}
#content .content-cats-small .caption a {
  font-family: var(--pz-serif);
  font-size: 21px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--pz-ink);
  text-decoration: none;
}
#content .content-cats-small .caption a:hover { color: var(--pz-gold); }

/* ============================================================================
   pz: Spaltenzahl folgt der Item-Zahl (Reviewer F12 / Fehlerregister 3b).
   Gemessen 19.08. auf /Perlenketten: 2 Artikel in einem fest 3-spaltigen
   Raster -> die dritte Spalte blieb als 33 % breite Leerflaeche stehen, und
   die kurze Inhaltsspalte liess neben der langen Filter-/Berater-Sidebar
   ~700px Weiss. Dieselbe Loesung wie im Startseiten-Grid (.pz-prodgrid-n),
   nur ohne Smarty: :has zaehlt die Karten.

   ⚠️ UMBAU 20.08. (loest K3 und K4 an der Wurzel, ersetzt die frueheren
   flex-Breitenregeln).
   Vorher: NOVAs Bootstrap-Flex-Row mit `flex: 0 0 50%` je Karte und
   `margin-bottom: 56px` als Reihenabstand. Zwei gemessene Folgen:
   (1) K4 — die Breitenregel hing an `.product-list` OHNE Ansichts-Scope und
       traf damit auch die Listenansicht: deren Zeilen (NOVA rendert sie als
       col-12) wurden auf 50% gequetscht (gemessen /Perlencolliers?ed=1, 1440:
       zwei Listenzeilen a 462px NEBENEINANDER). In 462px kollabierten NOVAs
       xl-4-Innenspalten — daher "Artikelnummer:" ueber dem Wert und die
       einwortweise umbrechende Verfuegbarkeitsspalte in Bens Screenshot.
   (2) K3 — ein Reihenabstand aus margin-bottom bleibt hinter der LETZTEN
       Reihe stehen (NOVA-Lehre F.5, die `:last-child`-Falle). Dazu eine
       Flex-Stretch-Differenz von 64px zwischen den beiden Karten (gemessen:
       .product-wrapper 602.3 vs. 666.3 bei identischem Inhalt von 546.3).
       Zusammen die ~153px Totraum ueber der "Artikel 1-2 von 2"-Zeile.

   Ein Grid loest beides ohne Ausnahmeregel: `gap` erzeugt Abstand NUR ZWISCHEN
   Reihen (kein Rest am Ende), und Items einer Reihe sind von Haus aus gleich
   hoch. Es ist ausserdem exakt das Idiom, das dieses Projekt schon zweimal
   benutzt (`.pz-prodgrid` Startseite, `.content-cats-small` oben). Der Gap ist
   1:1 der Startseiten-Gap, damit dieselbe Karte nicht zwei Rhythmen hat
   (Review R3, B10).
   ⚠️ `.layout-gallery` ist ab hier PFLICHT an jeder Massregel — NOVA rendert
   Kachel- und Listenansicht unter derselben Klasse `.product-list`. */
#result-wrapper .product-list.layout-gallery {
  display: grid;
  gap: 44px 30px;
  /* Bootstrap-Row-Negativmargins und Spalten-Gutter weg — sonst liegen zwei
     Abstandssysteme uebereinander (wie bei .content-cats-small). */
  margin-left: 0;
  margin-right: 0;
}
#result-wrapper .product-list.layout-gallery > .product-wrapper {
  padding-left: 0;
  padding-right: 0;
  max-width: none;
  /* ⚠️ DIE 64px AUS BENS K3-SCREENSHOT. NOVA setzt im Kompilat
     `#product-list .product-wrapper:not(:last-child){margin-bottom:4rem}`
     (gemessen 20.08. per Regel-Scan) — ein Reihenabstand als Margin, und zwar
     an ALLEN Karten ausser der letzten. In einer einreihigen Liste heisst das:
     Karte 1 traegt 64px Totraum unter sich, Karte 2 nicht. Genau daher kam die
     ungleiche Kartenhoehe (555 vs. 619) und ein Gutteil der Luecke ueber der
     Ergebniszeile. Mit der Kartenplatte (K6) waere es ausserdem als zwei
     verschieden hohe Platten nebeneinander sichtbar geworden.
     Der Reihenabstand liegt jetzt AUSSCHLIESSLICH am grid-gap — nie zwei
     Ebenen stapeln (NOVA-Lehre F.5). Die Listenansicht behaelt NOVAs Margin,
     dort ist sie der richtige Reihenabstand. */
  margin-bottom: 0;
}
@media (min-width: 1200px) {
  #result-wrapper .product-list.layout-gallery { grid-template-columns: repeat(3, 1fr); }
}

/* ============================================================================
   pz: KARTENRASTER-GLEICHLAUF MIT DER STARTSEITE (Review R3, B10).
   Gemessen 20.08.: 390 -> Startseite 1 Karte je Reihe, Kategorie 2 (Karte
   163px breit, der Titel brach in jeder Karte um); 768 -> Kategorie 3
   Spalten, Startseite 2. Zwei Rhythmen fuer dieselbe Karte auf derselben
   Breite ist genau die Beliebigkeit, die Ben beanstandet hat.
   Massgeblich ist der Startseiten-Rhythmus (.pz-prodgrid): 2 Spalten ab 576,
   1 Spalte darunter — inklusive des dortigen Gaps. */
@media (max-width: 1199.98px) {
  #result-wrapper .product-list.layout-gallery {
    grid-template-columns: repeat(2, 1fr);
    gap: 32px 20px;
  }
}
@media (max-width: 575.98px) {
  #result-wrapper .product-list.layout-gallery { grid-template-columns: minmax(0, 1fr); }
}

/* ============================================================================
   pz: FIXRUNDE 8b / N8 — DUENN BESETZTE LISTE: SPUR-DECKEL STATT `1fr`.
   Bis Fixrunde 8 stand hier nur "zwei Artikel, zwei Spalten" — die Spurzahl
   folgte der Item-Zahl, die Spur BREITE aber weiter `1fr`. Gemessen 20.08.
   auf /suche?qs=perle&af=10 (Seite 2, zwei Treffer): Spuren 431px, Bilder
   damit auf 2,19x ihrer nativen Breite hochskaliert (dpr 2) — sichtbarer
   Matsch, genau die Klasse aus Fehlerregister 25 (Skalierung in GERAETE-
   pixeln rechnen, nicht in CSS-Pixeln).
   Es ist zugleich FEHLERMUSTER #4: die Elementgroesse darf nicht mit der
   Datenmenge wachsen. Der Baustein bekommt deshalb dasselbe feste Maximum
   wie das Startseiten-Raster (.pz-prodgrid-1: minmax(0, 340px)) und wird
   linksbuendig gesetzt — die Karte sieht in einer 2-Treffer-Liste damit
   exakt aus wie in einer 20-Treffer-Liste.
   Ab 576px, weil darunter ohnehin eine Karte je Zeile steht (358px < 340px
   Deckel greift dort nicht sinnvoll). */
@media (min-width: 576px) {
  #result-wrapper .product-list.layout-gallery:not(:has(> .product-wrapper:nth-of-type(3))) {
    grid-template-columns: repeat(2, minmax(0, 340px));
    justify-content: start;
  }
  #result-wrapper .product-list.layout-gallery:not(:has(> .product-wrapper:nth-of-type(2))) {
    grid-template-columns: minmax(0, 340px);
  }
}

/* ============================================================================
   pz: TOOLBAR-REIHENFOLGE wie im Mockup (Fehlerregister 6: Reihenfolge und
   Ausrichtung sind Vertragsbestandteil, nicht Geschmack).
   Mockup .toolbar: links die Ergebniszahl ("Artikel 1-12 von 192"), rechts
   Sortierung und Ansicht. NOVA rendert es umgekehrt (gemessen 19.08.:
   .displayoptions bei x=428, .productlist-item-info bei x=1197).
   Umgesetzt ueber `order` — das DOM bleibt unangetastet, die Tab-Reihenfolge
   fuer Tastaturbedienung damit ebenfalls (Bedienelemente vor der Statuszeile). */
#result-wrapper .productlist-page-nav {
  align-items: center;
  /* NOVA verteilt den Rest gleichmaessig (gemessen: je 160px links und in der
     Mitte) — die beiden Bloecke sollen aber an die Aussenkanten. */
  justify-content: space-between;
}
/* NOVA gibt der Ergebniszahl ein ml:auto (gemessen 319,7px) — das schob sie
   trotz order:-1 an die rechte Kante der linken Haelfte. */
#result-wrapper .productlist-page-nav > .productlist-item-info {
  order: -1;
  margin-left: 0;
  text-align: left;
}
#result-wrapper .productlist-page-nav > .displayoptions { order: 1; }

/* pz: FIXRUNDE 8b / N3 — MOBILE TOOLBAR: UMBRUCHZEILE VERSETZT, RESTFLAECHE TOT.
   IST gemessen 20.08. @390 (/Perlencolliers UND /suche — derselbe Baustein in
   derselben Huelle, Fehlerregister 13):
     .displayoptions 358px breit, Kinder als inline-block:
       "FILTER"                x=16  94px
       "SORTIERUNG: STANDARD"  x=122 232px  (Zeilenende 354)
       "20 ARTIKEL PRO SEITE"  x=24  215px  <- zweite Zeile, 8px VERSETZT,
                                              danach 135px leer bis x=374
   Zwei Befunde aus einer Ursache: inhaltsbreite Elemente in einem
   umbrechenden Inline-Fluss (Fehlerregister 3b) — sie stapeln linksbuendig,
   der Rest der Zeile bleibt weiss, und der 8px-Versatz ist der Wortzwischen-
   raum, mit dem der Inline-Fluss die zweite Zeile beginnt.

   Loesung: fuellendes Raster statt Inline-Fluss. `flex: 1 1 232px` statt
   `grid auto-fit` ist hier das robustere Idiom — mit auto-fit haette die
   letzte Zeile bei 768 eine LEERE Spur behalten (3 Elemente in 2 Spuren,
   also derselbe Befund in gruen); bei flex-wrap waechst das einzelne Element
   der letzten Zeile stattdessen auf die volle Breite.
   ⚠️ Die 232px sind gegen den LAENGSTEN Text gemessen ("SORTIERUNG:
   STANDARD"), nicht gegriffen — mit einem kleineren Wert braeche die
   Beschriftung um (Fehlerregister 3b, ausdruecklich).
   Gilt bis 991.98px: genau darueber blendet NOVA den FILTER-Knopf per
   `d-lg-none` aus, der Baustein ist dann ein anderer. */
@media (max-width: 991.98px) {
  #result-wrapper .productlist-page-nav > .displayoptions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--pz-nav-halb);
    margin-left: 0;
    margin-right: 0;
  }
  #result-wrapper .productlist-page-nav > .displayoptions > * {
    flex: 1 1 232px;
    min-width: 0; /* Fehlerregister 15 */
    margin: 0;
  }
  /* Der Knopf IN der Huelle muss mitwachsen, sonst fuellt die Huelle die
     Zeile und der Knopf steht wieder inhaltsbreit darin.
     `.dropdown-menu` bleibt ausgenommen: das ist die absolut positionierte
     Klappe, keine Zeilenspalte (Fehlerregister 10). */
  #result-wrapper .productlist-page-nav > .displayoptions > * > *:not(.dropdown-menu) {
    width: 100%;
  }
  /* ⚠️ Der FILTER-Knopf sitzt VIER Ebenen tief, nicht zwei wie die beiden
     Dropdown-Knoepfe: `.result-option-wrapper > div > div.row >
     div.col.filter-collapsible-control > button` (im DOM nachgesehen, nicht
     aus dem Klassennamen geraten — Lehre N.13). Nach dem ersten Umbau
     gemessen: seine Huelle fuellte die 358px-Zeile, der Knopf darin blieb
     94px — die Zeile sah gefuellt aus und war es nicht.
     Die innere `.row` bringt ausserdem ihre Gutter-Negativraender mit und
     mass dadurch 390px in einem 358px-Kasten (kein Seiten-Overflow, aber der
     Knopf begann 16px links von der Kante der beiden Nachbarn) — deshalb
     hier dieselbe Neutralisierung wie an der Aussenhuelle.
     ⚠️ `.filter-collapsible-control` statt `.btn` allgemein: im selben
     Wrapper steckt auch das Filter-MODAL; dessen Knoepfe duerfen ihre eigene
     Breite behalten (Fehlerregister 14 — der andere Zustand desselben
     Bausteins). */
  #result-wrapper .productlist-page-nav > .displayoptions .result-option-wrapper > div > .row {
    margin-left: 0;
    margin-right: 0;
  }
  #result-wrapper .productlist-page-nav > .displayoptions .filter-collapsible-control {
    flex: 1 1 100%;
    max-width: 100%;
    padding-left: 0;
    padding-right: 0;
  }
  #result-wrapper .productlist-page-nav > .displayoptions .filter-collapsible-control > .btn {
    width: 100%;
  }
}
