/* =============================================================================
   prisma-list.css — Kategorie & Suche, ported from the design prototype
   (_handoffs/prisma/Prisma JTL Template.dc.html, screens "Kategorie" / "Suche").

   Loaded last in the chain. Targets the class names the productlist templates
   and the scc/Bootstrap components actually emit, so no markup had to change
   beyond the sub-category pills.
   ========================================================================== */

/* ---------- category hero --------------------------------------------------- */
/* The hero is a dark panel behind a scrim, so its copy has to be the always-dark
   chrome's ink. Headings deliberately inherit their container's colour (so they
   stay legible on light AND dark panels), which means the container has to state
   one — this one did not, so the category title rendered near-black on a
   near-black image and was effectively invisible. --onPanel does not invert with
   the theme, which is right: the hero is dark in both. */
.jtlw .rz-cathero:not(.rz-cathero--plain) .rz-cathero__copy,
.jtlw .rz-cathero:not(.rz-cathero--plain) .rz-cathero__in{color:var(--onPanel)}
.jtlw .rz-cathero:not(.rz-cathero--plain) .rz-cathero__copy p{color:var(--onPanelMuted)}
.jtlw .rz-cathero:not(.rz-cathero--plain) .rz-crumb,
.jtlw .rz-cathero:not(.rz-cathero--plain) .rz-crumb a,
.jtlw .rz-cathero:not(.rz-cathero--plain) .breadcrumb,
.jtlw .rz-cathero:not(.rz-cathero--plain) .breadcrumb a{color:var(--onPanelMuted)}
.jtlw .rz-cathero:not(.rz-cathero--plain) .breadcrumb .active{color:var(--onPanel)}

/* ---------- SHARED PRODUCT CARD ------------------------------------------- */
/* snippets/rz_product_card.tpl is the ONE card used by the home rail, the
   listing grid, the PDP related/x-sell grids, bundles and the basket. Its
   metrics are corrected here rather than in prisma-home.css because this sheet
   loads AFTER that one (see the chain in layout/header.tpl), so the shared
   baseline can be stated once and the home rail can restate the two values the
   design scales up for it. Everything below is measured off the prototype
   (_handoffs/prisma/Prisma JTL Template.dc.html: listing card 670–684,
   PDP related 570–581, home rail 303–317).
   .jtlw is required on each rule: prisma.css skins .jtlw .rz-card at (0,2,0)
   and would otherwise win on radius, hover offset and transition. */
.jtlw .rz-card{border-radius:20px;
  transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s ease}
.jtlw .rz-card:hover{transform:translateY(-4px);box-shadow:var(--shadowLg)}
.jtlw .rz-card__body{padding:14px 15px 15px}
.jtlw .rz-card__name{font-size:14px;line-height:1.3;margin-bottom:8px}
.jtlw .rz-card__rating{gap:6px;margin-bottom:12px}
.jtlw .rz-stars{font-size:12px;letter-spacing:0}
.jtlw .rz-card__rating .rz-rcount{font-family:var(--mono);font-size:10px;color:var(--muted)}
/* the price row must not wrap: at narrow column widths the struck RRP dropped
   under the current price and pushed the card a line taller than its siblings */
.jtlw .rz-price{flex-wrap:nowrap;min-width:0}
.jtlw .rz-price__now{font-size:18px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.jtlw .rz-price__old{font-family:var(--mono);font-size:11px;color:var(--muted)}
/* the sale price is the ONE colour the base sheet gets wrong at the source:
   rz.css sets --redink, which is #FFFFFF — white on a white card. It is only
   ever visible because prisma.css happens to !important it back to the accent.
   State it here so the card does not depend on that accident. */
.jtlw .rz-price--sale .rz-price__now{color:var(--red)}
.jtlw .rz-card__badge{font-weight:400}
.jtlw .rz-card__wish{width:32px;height:32px}
.jtlw .rz-card__wish svg{width:14px;height:14px}
.jtlw .rz-iadd,.jtlw .rz-iadd.basket-details-add-to-cart{width:34px;height:34px}
.jtlw .rz-iadd svg{width:16px;height:16px}
/* home rail — the design scales the card up by one step there */
.jtlw .rz-prodgrid .rz-card__body{padding:15px 16px 16px}
.jtlw .rz-prodgrid .rz-card__name{font-size:14.5px}
.jtlw .rz-prodgrid .rz-price__now{font-size:19px}
.jtlw .rz-prodgrid .rz-price__old{font-size:11.5px}
.jtlw .rz-prodgrid .rz-card__badge{font-weight:500}
.jtlw .rz-prodgrid .rz-card__wish{width:34px;height:34px}
.jtlw .rz-prodgrid .rz-card__wish svg{width:15px;height:15px}
.jtlw .rz-prodgrid .rz-iadd,
.jtlw .rz-prodgrid .rz-iadd.basket-details-add-to-cart{width:36px;height:36px}
.jtlw .rz-prodgrid .rz-iadd svg{width:17px;height:17px}

/* ---------- PRODUCT GRIDS -------------------------------------------------- */
/* One formula for every product grid, from the prototype's `gridCols`:
   repeat(auto-fill,minmax(216px,1fr)). rz.css pinned the listing to exactly 5
   columns with a flat 16px gap and the PDP grids to minmax(220px) — so the
   listing could not reflow between 5 and 4 columns, the gaps did not match the
   rest of the page, and a 375px viewport got ONE column on the PDP instead of
   two. !important answers rz.css's own !important on #product-list. */
.jtlw .rz-plist,
.jtlw #product-list.rz-plist,
.jtlw .rz-prodgrid{grid-template-columns:repeat(auto-fill,minmax(216px,1fr))!important;
  gap:clamp(12px,1.6vw,20px)!important}
@media (max-width:940px){
  .jtlw .rz-plist,
  .jtlw #product-list.rz-plist,
  .jtlw .rz-prodgrid{grid-template-columns:1fr 1fr!important}
}

/* ---------- sub-category pills -------------------------------------------- */
/* the design's row of outlined pills between the category hero and the toolbar */
.rz-subpills{display:flex;flex-wrap:wrap;gap:12px;margin:22px 0 0}
.jtlw .rz-subpill{display:inline-flex;align-items:center;gap:10px;padding:13px 22px;border-radius:999px;
  border:1px solid var(--line2);background:var(--surface);color:var(--ink);
  font-size:14px;font-weight:600;white-space:nowrap;
  transition:border-color .25s ease,background .25s ease,transform .25s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-subpill:hover{border-color:var(--ink);background:var(--sand);color:var(--ink);transform:translateY(-1px)}
.rz-subpill__count{font-family:var(--mono);font-size:10.5px;color:var(--muted)}

/* ---------- toolbar (Sortierung … | N Artikel) ---------------------------- */
/* one bordered row, matching the design's chrome rather than a bare Bootstrap
   form row */
.jtlw .productlist-nav-top,
.jtlw .pagination-selects{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:12px 18px;margin-bottom:16px}
.jtlw .pagination-entries{font-family:var(--mono);font-size:11px;color:var(--muted);margin:0}
.jtlw .pagination-selects .custom-select,
.jtlw .pagination-selects select{border:none!important;background:none!important;box-shadow:none!important;
  font-size:13.5px;font-weight:700;color:var(--ink);padding:0 22px 0 0;height:auto;width:auto}

/* ---------- active filter chips ------------------------------------------- */
.jtlw .active-filter .btn,
.jtlw .active-filter a.filter-item{display:inline-flex;align-items:center;gap:9px;padding:8px 15px;border-radius:999px;
  background:var(--sand)!important;border:none!important;color:var(--ink2)!important;font-size:12.5px;font-weight:600}
.jtlw .active-filter .btn:hover,
.jtlw .active-filter a.filter-item:hover{background:var(--line2)!important;color:var(--ink)!important}

/* ---------- filter sidebar ------------------------------------------------- */
/* the design's sidebar is ONE bordered card whose sections are split by
   hairlines — not a stack of separate boxes */
/* JTL emits one .box per filter group. The design shows them as a SINGLE card
   whose groups are split by hairlines, so the boxes are joined: only the first
   and last keep rounded corners, each seam is one border, and the inter-box
   margin is removed (rz.css sets it, hence !important). */
/* The radius and bottom border come from the vendor base (razan.css), which
   outranks a plain rule here — confirmed by probing computed style: margin
   collapsed to 0 but border-radius stayed 14px. Answered at the same weight,
   as the rest of this file already does for the widget skin. */
.jtlw #sidepanel_left .box,
.jtlw .productlist-filter > .box{border:1px solid var(--line)!important;border-bottom:none!important;
  background:var(--surface);padding:0;overflow:hidden;margin:0!important;border-radius:0!important}
.jtlw #sidepanel_left .box:first-child,
.jtlw .productlist-filter > .box:first-child{border-radius:20px 20px 0 0!important}
.jtlw #sidepanel_left .box:last-child,
.jtlw .productlist-filter > .box:last-child{border-bottom:1px solid var(--line)!important;border-radius:0 0 20px 20px!important}
.jtlw #sidepanel_left .box:only-child,
.jtlw .productlist-filter > .box:only-child{border-radius:20px!important;border-bottom:1px solid var(--line)!important}

/* group headings are sentence case in the design; prisma.css uppercases them */
.jtlw .productlist-filter-headline,
.jtlw #sidepanel_left .box-title{padding:16px 18px;margin:0;border-bottom:1px solid var(--line);
  font-size:14.5px;font-weight:700;letter-spacing:-.015em;color:var(--ink);
  text-transform:none!important;font-family:'Outfit',sans-serif!important}
.jtlw #sidepanel_left .nav-panel,
.jtlw .productlist-filter .nav-panel{padding:14px 18px}

/* filter rows: label left, count right in mono. rz.css draws a border-bottom on
   each row; the design separates them by spacing alone. */
.jtlw .productlist-filter .filter-item,
.jtlw #sidepanel_left .filter-item{display:flex;align-items:center;justify-content:space-between;gap:12px;
  font-size:13.5px;color:var(--ink2);padding:7px 0;border-bottom:none!important}
.jtlw .productlist-filter .filter-item .badge,
.jtlw #sidepanel_left .filter-item .badge{background:none;color:var(--muted);font-family:var(--mono);font-size:10.5px;padding:0;font-weight:400}

/* ---------- pagination — circular buttons, accent for current ------------- */
.jtlw .pagination{display:flex;align-items:center;justify-content:center;gap:9px;margin:28px 0 0}
.jtlw .pagination .page-item{margin:0}
.jtlw .pagination .page-link{display:flex;align-items:center;justify-content:center;
  min-width:38px;height:38px;padding:0 12px;border-radius:999px!important;
  border:1px solid var(--line2)!important;background:var(--surface)!important;color:var(--ink2)!important;
  font-size:13.5px;font-weight:600;transition:background .25s ease,color .25s ease,border-color .25s ease}
.jtlw .pagination .page-link:hover{background:var(--sand)!important;color:var(--ink)!important;border-color:var(--ink)!important}
.jtlw .pagination .page-item.active .page-link{background:var(--red)!important;border-color:var(--red)!important;color:var(--onRed)!important}
.jtlw .pagination .page-item.disabled .page-link{opacity:.4}

/* ---------- responsive ----------------------------------------------------- */
@media (max-width:940px){
  .rz-subpills{gap:9px}
  .jtlw .rz-subpill{padding:11px 17px;font-size:13.5px}
}

/* =============================================================================
   KATEGORIE — brought onto the handoff design (screen "Kategorie", prototype
   lines 598–668). Written against the markup the shop ACTUALLY emits, read off
   a live capture: JTL renders each filter as its own Bootstrap collapse panel
   (.box.box-filter-*, a .btn-filter-box toggle, a .collapse body of
   .filter-item rows) separated by <hr class="box-normal-hr">. The design is one
   bordered card whose groups are split by hairlines, so the individual panels
   are stripped of their own chrome and the rules between them are removed.
   This section is last in the file on purpose: it settles every earlier rule.
   ========================================================================== */

/* ---------- category hero --------------------------------------------------- */
.jtlw .rz-cathero{position:relative;overflow:hidden;border-radius:24px;
  min-height:clamp(180px,22vw,250px);display:flex;align-items:flex-end;
  padding:clamp(22px,3vw,38px)}
/* the design's scrim: a top-to-bottom wash, dark enough at the foot to carry
   white type over any product photograph */
.jtlw .rz-cathero__scrim,
.jtlw .rz-cathero::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(20,18,15,.15),rgba(20,18,15,.82))}
.jtlw .rz-cathero__in,.jtlw .rz-cathero__copy{position:relative;z-index:1}
.jtlw .rz-cathero h1{font-size:clamp(26px,4vw,48px);color:#fff;margin:0 0 12px}
.jtlw .rz-cathero__copy p,.jtlw .rz-cathero p{color:rgba(255,255,255,.78);max-width:52ch;font-size:15px;margin:0}
.jtlw .rz-cathero .rz-crumb,.jtlw .rz-cathero .breadcrumb{font-family:var(--mono);font-size:10.5px;
  letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.7);margin-bottom:12px;padding:0}
.jtlw .rz-cathero .rz-crumb a,.jtlw .rz-cathero .breadcrumb a,
.jtlw .rz-cathero .breadcrumb .active{color:rgba(255,255,255,.7)}

/* ---------- sub-category pills ---------------------------------------------- */
.jtlw .rz-subpills{display:flex;gap:9px;overflow-x:auto;padding-bottom:2px;margin:16px 0 0;
  scrollbar-width:none}
.jtlw .rz-subpills::-webkit-scrollbar{display:none}
.jtlw .rz-subpill{display:flex;align-items:center;gap:9px;padding:9px 17px;border-radius:999px;
  background:var(--surface);border:1px solid var(--line);color:var(--ink);
  font-size:13.5px;font-weight:600;white-space:nowrap;transition:border-color .3s ease}
.jtlw .rz-subpill:hover{border-color:var(--red);background:var(--surface);transform:none}
.jtlw .rz-subpill__count{font-family:var(--mono);font-size:10px;color:var(--muted)}

/* ---------- filter sidebar = ONE card --------------------------------------- */
/* The aside must NOT be the clipping box. It carried overflow:hidden so its 20px
   radius would clip the group seams — but it is also the sticky box, and when the
   rail is taller than the column beside it (few products, or a long category
   description) its box stops short and overflow:hidden cut the tail off. That is
   why Preisspanne, last in the rail, was sliced through mid-slider.
   So: the aside is chrome + sticky and overflows freely, and .rz-facets — sized by
   its own content — does the clipping. */
.jtlw #sidepanel_left,.jtlw .productlist-filter{border:1px solid var(--line);border-radius:20px;
  background:var(--surface);overflow:visible;position:sticky;top:150px}
.jtlw #sidepanel_left .rz-facets{border-radius:20px;overflow:hidden;flex:0 0 auto;min-height:auto}
/* the rules JTL draws between panels: the card's own hairlines replace them */
.jtlw #sidepanel_left hr,.jtlw .productlist-filter hr,.jtlw hr.box-normal-hr{display:none!important}
/* each panel loses its own chrome and becomes a section of the card */
.jtlw #sidepanel_left .box,.jtlw .productlist-filter .box,
.jtlw #sidepanel_left [class*="box-filter"],.jtlw .productlist-filter [class*="box-filter"]{
  border:0!important;border-bottom:1px solid var(--line)!important;border-radius:0!important;
  background:none!important;box-shadow:none!important;margin:0!important;padding:0!important}
.jtlw #sidepanel_left .box:last-child,.jtlw .productlist-filter .box:last-child{border-bottom:0!important}
/* group heading — JTL makes it a collapse toggle button */
.jtlw .btn-filter-box,.jtlw .btn.btn-filter-box{display:flex!important;align-items:center;
  justify-content:space-between;gap:12px;width:100%;padding:16px 17px!important;
  border:0!important;border-radius:0!important;background:none!important;box-shadow:none!important;
  color:var(--ink)!important;font-size:12.5px!important;font-weight:700!important;
  text-align:left;text-decoration:none!important;text-transform:none;letter-spacing:0}
.jtlw .btn-filter-box:hover{background:var(--sand)!important}
.jtlw .btn-filter-box::after{content:"";width:9px;height:9px;flex-shrink:0;
  border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);
  transform:rotate(45deg) translate(-2px,-2px);transition:transform .28s cubic-bezier(.16,1,.3,1)}
.jtlw .btn-filter-box[aria-expanded="true"]::after{transform:rotate(-135deg) translate(-2px,-2px)}
.jtlw #sidepanel_left .collapse,.jtlw #sidepanel_left .collapsing,
.jtlw .productlist-filter .collapse,.jtlw .productlist-filter .collapsing{padding:0 17px 16px}
.jtlw #sidepanel_left .collapse ul,.jtlw .productlist-filter .collapse ul{
  list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}
/* option rows: label left, count right in mono, the whole row a hover target */
.jtlw .filter-item,.jtlw a.filter-item{display:flex!important;align-items:center;gap:11px;
  padding:8px 10px!important;margin:0 -10px;border-radius:12px;border:0!important;
  font-size:13.5px;color:var(--ink2)!important;text-decoration:none;transition:background .18s ease}
.jtlw .filter-item:hover{background:var(--sand);color:var(--ink)!important}
.jtlw .filter-item > span:first-child{flex:1;min-width:0}
.jtlw .filter-item .badge,.jtlw .filter-item .count{margin-left:auto;background:none!important;
  color:var(--muted)!important;font-family:var(--mono);font-size:10px;font-weight:400;padding:0!important}
/* colour filters are 30px rounded squares, not pills */
.jtlw .filter-color,.jtlw .rz-swatch{width:30px;height:30px;border-radius:10px;
  border:1px solid var(--line2);padding:0}
.jtlw .filter-color.active,.jtlw .rz-swatch.is-active{outline:2px solid var(--ink);outline-offset:2px;
  box-shadow:none;border-color:var(--line2)}

/* ---------- toolbar + active chips ------------------------------------------ */
.jtlw .productlist-nav-top,.jtlw .pagination-selects,.jtlw .rz-toolbar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 15px;
  border:1px solid var(--line);border-radius:999px;background:var(--surface);margin-bottom:16px}
.jtlw .pagination-entries{margin-left:auto;font-family:var(--mono);font-size:10.5px;color:var(--muted)}
.jtlw .active-filter .btn,.jtlw .active-filter a.filter-item{
  display:inline-flex!important;align-items:center;gap:8px;margin:0;
  padding:7px 9px 7px 14px!important;border-radius:999px;background:var(--sand)!important;
  border:0!important;color:var(--ink)!important;font-size:12.5px;font-weight:600}
.jtlw .active-filter .btn:hover{background:var(--line2)!important}

@media (max-width:940px){
  .jtlw #sidepanel_left,.jtlw .productlist-filter{position:static}
}

/* ---------- listing toolbar, final form ------------------------------------
   The design is ONE pill-shaped row: the sort control on the left, the article
   count closing it on the right, and the Filter button only on mobile (on
   desktop the sidebar is always open, so a button to reveal it is noise).
   ========================================================================== */
.jtlw .productlist-nav-top,.jtlw .pagination-selects,.jtlw .rz-toolbar{
  justify-content:flex-start;padding:10px 15px;border-radius:999px}
.jtlw .productlist-nav-top label,.jtlw .pagination-selects label,
.jtlw .productlist-nav-top .control-label{margin:0;font-size:13px;font-weight:400;color:var(--muted)}
.jtlw .productlist-nav-top .bootstrap-select > .dropdown-toggle,
.jtlw .pagination-selects .bootstrap-select > .dropdown-toggle{
  padding:0 18px 0 0;border:0;background:none;font-size:13px;font-weight:600;color:var(--ink)}
/* the count closes the row */
.jtlw .productlist-nav-top .pagination-entries,
.jtlw .pagination-selects .pagination-entries{margin-left:auto;font-family:var(--mono);
  font-size:10.5px;color:var(--muted)}
/* desktop has the sidebar; the reveal button is a mobile affordance */
@media (min-width:941px){
  .jtlw .productlist-nav-top .btn-filter,
  .jtlw [data-toggle="collapse"][data-target*="filter"]{display:none!important}
}

/* =============================================================================
   LISTING LAYOUT — head band full width, filter rail left, products right
   (prototype line 615: `grid-template-columns:250px 1fr; gap:clamp(18px,2.4vw,30px);
   align-items:start`, with the hero + sub-category pills as full-width sections
   ABOVE it).

   The stock template opens `#content > .row.justify-content-lg-end > .col-lg-8`
   before the listing renders and appends the filter <aside> as the row's second
   child, so everything productlist/header.tpl emits — hero included — landed in
   the right-hand column and the rail sat BESIDE the hero, starting at the top of
   the page. The band now comes from layout/header.tpl (see productlist/cathero.tpl)
   and the row is re-laid as the design's two-column grid, which also lets the two
   columns keep their edges: Bootstrap's ±1rem row/column gutters are zeroed here
   so the rail and the products line up with the band above them.
   ========================================================================== */
@media (min-width:992px){
  .jtlw #content > .row.justify-content-lg-end{
    display:grid!important;grid-template-columns:250px minmax(0,1fr);
    gap:clamp(18px,2.4vw,30px);align-items:start;
    margin-left:0!important;margin-right:0!important}
  /* explicit placement: the aside is the row's LAST child in source order */
  .jtlw #content > .row.justify-content-lg-end > #sidepanel_left{
    grid-column:1;grid-row:1;
    flex:none!important;width:auto!important;max-width:none!important;padding:0!important}
  .jtlw #content > .row.justify-content-lg-end > .col-lg-8,
  .jtlw #content > .row.justify-content-lg-end > .col-xl-9{
    grid-column:2;grid-row:1;min-width:0;
    flex:none!important;width:auto!important;max-width:none!important;
    padding:0!important;margin-left:0!important}
  /* a rail with nothing to show gets no column: ONE column, no 250px gap beside
     an empty card. That happens on a category that only carries sub-categories,
     and whenever the sidebar filters are switched off (filter_placement 'modal'
     suppresses every boxes/box_filter_*.tpl).
     `:not(.box-filter-special)` because rz.css hides that one — a rail holding
     only the special-offers filter has nothing visible in it either.
     Keyed off the boxes themselves rather than a count in the template: if
     :has() is unsupported the rail simply stays, which is the safe direction. */
  .jtlw #content > .row.justify-content-lg-end:not(:has(#sidepanel_left [class*="box-filter"]:not(.box-filter-special))){
    grid-template-columns:minmax(0,1fr)}
  .jtlw #content > .row.justify-content-lg-end:not(:has(#sidepanel_left [class*="box-filter"]:not(.box-filter-special))) > #sidepanel_left{
    display:none}
  .jtlw #content > .row.justify-content-lg-end:not(:has(#sidepanel_left [class*="box-filter"]:not(.box-filter-special))) > .col-lg-8,
  .jtlw #content > .row.justify-content-lg-end:not(:has(#sidepanel_left [class*="box-filter"]:not(.box-filter-special))) > .col-xl-9{
    grid-column:1}
  /* The design's Filter button is a mobile affordance — on desktop the rail is
     already open. But with filter_placement 'modal' that button is the ONLY way
     to filter, so hide it only when the rail is actually carrying the groups. */
  .jtlw #content > .row:has(#sidepanel_left [class*="box-filter"]:not(.box-filter-special)) .filter-collapsible-control{
    display:none!important}
}

/* ---------- the band's own rhythm (prototype 610–616) ----------------------- */
.jtlw .rz-cathero{margin-bottom:16px}
.jtlw .rz-subpills{margin:0 0 18px}

/* ---------- rail head: "Filter" + active count ------------------------------ */
.jtlw #sidepanel_left .rz-facets__head{display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:15px 17px;border-bottom:1px solid var(--line)}
.jtlw #sidepanel_left .rz-facets__title{font-size:14px;font-weight:700;color:var(--ink)}
.jtlw #sidepanel_left .rz-facets__count{font-family:var(--mono);font-size:10px;line-height:1.6;
  padding:3px 9px;border-radius:999px;background:var(--redSoft);color:var(--red)}

/* ---------- below the grid breakpoint: the sheet is the filter UI ----------- */
/* The rail is `order-last`, so under 992px it dropped ~1700px of duplicate filter
   panels at the very foot of the page. The design has a Filter button opening a
   bottom sheet there (productlist/result_options.tpl → #collapseFilter), which is
   already the mobile UI — so the rail itself is hidden rather than stacked. */
@media (max-width:991.98px){
  .jtlw #content-wrapper.is-item-list #sidepanel_left{display:none!important}
}

/* =============================================================================
   THE FILTER RAIL — the design's own, stated here in full
   (_handoffs/prisma/Prisma JTL Template.dc.html, screen "Kategorie", 618-648).

   snippets/filter/rail.tpl builds the rail from $NaviFilter and emits JTL's box
   shape (.box.box-filter-* > .btn-filter-box + .collapse > .filter-item) so the
   data hooks and the price-slider JS keep working. The LOOK is this design's, not
   the base template's: rz.css skins the same hooks for a different storefront and
   uses !important on display / colour / padding, so every declaration it owns is
   answered here at (1,3,0) with !important back.

   Values are measured off the prototype. Reading order in the design:
   head, group title, option rows, price range.
   ========================================================================== */

/* the rail is ONE card; the aside already carries border, radius, surface, sticky */
.jtlw #sidepanel_left .rz-facets{display:block}

/* ---------- head: "Filter" + the active count ------------------------------- */
.jtlw #sidepanel_left .rz-facets__head{display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:15px 17px;border-bottom:1px solid var(--line)}
.jtlw #sidepanel_left .rz-facets__title{font-size:14px;font-weight:700;color:var(--ink)}
.jtlw #sidepanel_left .rz-facets__count{font-family:var(--mono);font-size:10px;line-height:1.6;
  padding:3px 9px;border-radius:999px;background:var(--redSoft);color:var(--red)}

/* ---------- one group per filter -------------------------------------------- */
.jtlw #sidepanel_left .rz-facets .box{border:0!important;border-radius:0!important;
  border-bottom:1px solid var(--line)!important;background:none!important;
  box-shadow:none!important;margin:0!important;padding:0!important;overflow:visible}
.jtlw #sidepanel_left .rz-facets .box:last-child{border-bottom:0!important}
/* Group title. JTL makes it a collapse toggle; the design shows a plain heading
   with the group already open, so the chevron goes and the click does nothing. */
.jtlw #sidepanel_left .rz-facets .btn-filter-box,
.jtlw #sidepanel_left .rz-facets .btn.btn-filter-box{display:block!important;width:100%;
  padding:16px 17px 0!important;border:0!important;border-radius:0!important;
  background:none!important;box-shadow:none!important;text-align:left!important;
  font-size:12.5px!important;font-weight:700!important;line-height:1.3;
  color:var(--ink)!important;text-transform:none;letter-spacing:0;
  text-decoration:none!important;pointer-events:none;cursor:default}
.jtlw #sidepanel_left .rz-facets .btn-filter-box::after{display:none!important}
.jtlw #sidepanel_left .rz-facets .btn-filter-box .text-truncate,
.jtlw #sidepanel_left .rz-facets .btn-filter-box .characteristic-collapse-btn-inner{
  overflow:visible;white-space:normal;text-overflow:clip}
/* the design's 13px gap under the title, then 16px down to the seam */
.jtlw #sidepanel_left .rz-facets .collapse,
.jtlw #sidepanel_left .rz-facets .collapse.show,
.jtlw #sidepanel_left .rz-facets .collapsing{display:block!important;height:auto!important;
  visibility:visible!important;padding:13px 17px 16px!important}
.jtlw #sidepanel_left .rz-facets .filter-search-wrapper,
.jtlw #sidepanel_left .rz-facets .nav{display:flex;flex-direction:column;gap:1px;
  padding:0;margin:0;list-style:none}

/* ---------- option row: box, label, count ----------------------------------- */
/* the row is an <a> wrapping a .box-link-wrapper div — display:contents lifts the
   icon, label and count onto the row's own flex line */
.jtlw #sidepanel_left .rz-facets .filter-item .box-link-wrapper{display:contents}
.jtlw #sidepanel_left .rz-facets .filter-item,
.jtlw #sidepanel_left .rz-facets a.filter-item{display:flex!important;align-items:center;gap:11px;
  padding:8px 10px!important;margin:0 -10px;border:0!important;border-radius:12px;
  font-size:13.5px!important;font-weight:400;color:var(--ink2)!important;text-align:left;
  text-decoration:none!important;transition:background .18s ease}
.jtlw #sidepanel_left .rz-facets .filter-item:hover{background:var(--sand)!important;color:var(--ink)!important}
/* The checkbox. JTL prints a FontAwesome square (fa-check-square when active); the
   glyph is switched off and the design's 18px rounded box drawn instead — the tick
   as two borders, because Outfit has no U+2713 (see HANDOFF). */
.jtlw #sidepanel_left .rz-facets .filter-item .snippets-filter-item-icon-right{
  width:18px;height:18px;flex-shrink:0;order:-1;margin:0!important;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line2);border-radius:6px;background:var(--surface);
  font-size:0!important;color:transparent!important}
.jtlw #sidepanel_left .rz-facets .filter-item.active .snippets-filter-item-icon-right{
  background:var(--red);border-color:var(--red)}
.jtlw #sidepanel_left .rz-facets .filter-item.active .snippets-filter-item-icon-right::after{
  content:"";width:9px;height:5px;border-left:2px solid var(--onRed);
  border-bottom:2px solid var(--onRed);transform:rotate(-45deg) translateY(-1px)}
.jtlw #sidepanel_left .rz-facets .filter-item .filter-item-value{flex:1 1 auto;min-width:0;
  font-size:13.5px;color:inherit}
.jtlw #sidepanel_left .rz-facets .filter-item.active{color:var(--ink)!important;font-weight:600}
.jtlw #sidepanel_left .rz-facets .filter-item .badge{margin-left:auto;padding:0!important;
  border:0!important;background:none!important;color:var(--muted)!important;
  font-family:var(--mono);font-size:10px;font-weight:400}
/* Colour groups: the chain maps ~13 German colour names to a dot. Kept as data and
   sized to the design's tile. A value outside that map stays a plain labelled row
   rather than an empty tile — which is why this group is rows and not the
   prototype's swatch grid: JTL carries no hex on a characteristic value. */
.jtlw #sidepanel_left .rz-facets .filter-item .filter-item-value::before{
  width:18px;height:18px;border-radius:6px;border:1px solid var(--line2)}
/* "Alle anzeigen" under a long group */
.jtlw #sidepanel_left .rz-facets .snippets-filter-show-all{padding:6px 0 0}
.jtlw #sidepanel_left .rz-facets .snippets-filter-show-all .btn{padding:0!important;
  border:0!important;background:none!important;font-size:12.5px!important;
  color:var(--ink2)!important;text-decoration:underline;text-underline-offset:2px}
/* the in-group search field JTL offers past N options */
.jtlw #sidepanel_left .rz-facets .filter-search-wrapper input{width:100%;margin-bottom:9px;
  padding:8px 12px;border:1px solid var(--line2);border-radius:10px;
  background:var(--surface);color:var(--ink);font-size:13px}

/* ---------- price range: two fields + a filled track ------------------------ */
.jtlw #sidepanel_left .rz-facets .price-range-inputs{display:flex!important;align-items:center;
  gap:9px;margin:0 0 14px;padding:0!important}
.jtlw #sidepanel_left .rz-facets .price-range-inputs > [class*="col-"]{flex:1 1 0;
  max-width:none;padding:0!important}
.jtlw #sidepanel_left .rz-facets .price-range-inputs .input-group{flex-wrap:nowrap}
.jtlw #sidepanel_left .rz-facets .price-range-inputs .input-group-text{display:none!important}
.jtlw #sidepanel_left .rz-facets .price-range-input,
.jtlw #sidepanel_left .rz-facets .price-range-inputs .form-control{width:100%;
  padding:9px 12px!important;border:1px solid var(--line2)!important;border-radius:12px!important;
  background:var(--surface)!important;color:var(--ink)!important;
  font-family:var(--mono);font-size:12px!important;box-shadow:none!important;height:auto!important}
.jtlw #sidepanel_left .rz-facets .price-range-slide{margin:0!important}
.jtlw #sidepanel_left .rz-facets .noUi-target{height:6px!important;border:0!important;
  border-radius:999px!important;background:var(--sand)!important;box-shadow:none!important}
.jtlw #sidepanel_left .rz-facets .noUi-connect{background:var(--red)!important}
.jtlw #sidepanel_left .rz-facets .noUi-handle{width:16px!important;height:16px!important;
  top:-5px!important;right:-8px!important;border:2px solid var(--red)!important;
  border-radius:999px!important;background:var(--surface)!important;box-shadow:none!important;
  cursor:pointer}
.jtlw #sidepanel_left .rz-facets .noUi-handle::before,
.jtlw #sidepanel_left .rz-facets .noUi-handle::after{display:none!important}

/* ---------- the shop's own filter boxes stand down while the rail is up ------ */
/* $boxes.left still prints after the rail, so a group also configured as a box
   would appear twice. Direct children only — the rail's own boxes are nested. */
.jtlw #sidepanel_left:has(.rz-facets) > [class*="box-filter"]{display:none!important}

/* =============================================================================
   THE LISTING PAGE RAIL — the design's width, and four products across
   (prototype line 617: max-width:var(--maxw); padding:18px 22px; columns
   250px 1fr; gap clamp(18px,2.4vw,30px); grid repeat(auto-fill,minmax(216px,1fr))).

   rz.css widens .is-item-list to min(1860px,97vw) from 1200px up — that is what
   ran the listing the full width of the window. The design's page is --maxw
   (1320px), centred, with 22px gutters.

   The column count is not stated anywhere in the design, it falls out of the
   width: at 1320 the content box is 1276, the filter rail takes 250 plus a 30px
   gap, leaving 996 — exactly four 216px tracks at a 20px gap. So restoring the
   design's width IS the four-up grid.
   ========================================================================== */
.jtlw #content-wrapper.is-item-list{max-width:var(--maxw);
  margin-left:auto;margin-right:auto;padding-left:22px;padding-right:22px}
@media (min-width:1200px){
  .jtlw #content-wrapper.is-item-list{max-width:var(--maxw)!important;
    margin-left:auto!important;margin-right:auto!important;
    padding-left:22px!important;padding-right:22px!important}
  .jtlw #content-wrapper.is-item-list #result-wrapper{max-width:none;padding-left:0;padding-right:0}
}

/* ---------- the toolbar the design shows ------------------------------------ */
/* snippets/productlist_page_nav.tpl emits one component for both toolbars. The
   design's header row carries the sort control and the article count, nothing
   else: per-page, the view switch and the pagination are not in it — pagination
   sits at the foot of the grid (prototype 651-658 against 686-691). Hidden here
   rather than cut from the template, because the footer toolbar shares the partial. */
@media (min-width:992px){
  .jtlw .rz-toolbar-header .filter-type-FilterItemLimits,
  .jtlw .rz-toolbar-header .btn-option,
  .jtlw .rz-toolbar-header .navbar-pagination,
  .jtlw .rz-toolbar-header .productlist-pagination{display:none!important}
}
.jtlw .rz-toolbar-header .pagination-entries{margin-left:auto;font-family:var(--mono);
  font-size:10.5px;color:var(--muted)}

/* ---------- active filter chips, the design's row under the toolbar --------- */
/* prototype 659-666: sand pills carrying the value and a x, closed by a quiet
   underlined "Alle entfernen". */
.jtlw .active-filter,
.jtlw .productlist-applied-filter{display:flex;align-items:center;gap:8px;
  flex-wrap:wrap;margin:0 0 18px}
.jtlw .active-filter .btn,
.jtlw .active-filter a.filter-item,
.jtlw .productlist-applied-filter .btn{display:inline-flex!important;align-items:center;gap:8px;
  margin:0!important;padding:7px 9px 7px 14px!important;border:0!important;
  border-radius:999px!important;background:var(--sand)!important;color:var(--ink)!important;
  font-size:12.5px!important;font-weight:600!important;text-decoration:none!important}
.jtlw .active-filter .btn:hover,
.jtlw .productlist-applied-filter .btn:hover{background:var(--line2)!important}
/* the reset at the end of the row is text, not a pill */
.jtlw .active-filter .btn-unset-all,
.jtlw .active-filter .js-unset-all,
.jtlw .productlist-applied-filter .btn-unset-all,
.jtlw .active-filter a[href*="unsetAll"]{background:none!important;padding:0 4px!important;
  color:var(--muted)!important;font-weight:400!important;
  text-decoration:underline!important;text-underline-offset:2px}

/* ---------- rail group order: price closes the card ------------------------- */
/* $NaviFilter hands the price range over first; the design ends the rail with it
   (Farbe, Material, Verfügbarkeit, Preis). Ordered visually rather than by
   rebuilding the loop — so the seam rules below key off the price box, not
   :last-child, which is a DOM position and no longer the visual one. */
.jtlw #sidepanel_left .rz-facets{display:flex;flex-direction:column}
.jtlw #sidepanel_left .rz-facets .rz-facets__head{order:-1}
.jtlw #sidepanel_left .rz-facets .box-filter-price{order:9}
.jtlw #sidepanel_left .rz-facets:has(.box-filter-price) .box:last-child{
  border-bottom:1px solid var(--line)!important}
.jtlw #sidepanel_left .rz-facets .box-filter-price{border-bottom:0!important}
.jtlw #sidepanel_left .rz-facets:not(:has(.box-filter-price)) .box:last-child{
  border-bottom:0!important}

/* ---------- active filter chips, for the markup that is actually emitted -----
   snippets/filter/active_filter.tpl wraps them in `.active-filters` — PLURAL —
   and each chip is `a.btn.btn-outline-secondary.btn-sm.snippets-filter-item`
   with the x as a trailing `.snippets-filter-item-icon-left` span, closed by
   `a.snippets-filter-item-all`. The earlier rule here targeted `.active-filter`
   and `.productlist-applied-filter`, neither of which that template emits, so the
   chips stayed bare Bootstrap outline buttons.
   Design: prototype 659-666. */
.jtlw .active-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 18px!important}
.jtlw .active-filters .snippets-filter-item,
.jtlw .active-filters a.btn{display:inline-flex!important;align-items:center;gap:8px;
  margin:0!important;padding:7px 9px 7px 14px!important;border:0!important;
  border-radius:999px!important;background:var(--sand)!important;color:var(--ink)!important;
  font-size:12.5px!important;font-weight:600!important;line-height:1.2;
  text-decoration:none!important;box-shadow:none!important}
.jtlw .active-filters .snippets-filter-item:hover,
.jtlw .active-filters a.btn:hover{background:var(--line2)!important;color:var(--ink)!important}
/* the x closes the pill: after the label, quiet until hover */
.jtlw .active-filters .snippets-filter-item-icon-left{order:2;margin:0!important;
  font-size:12px;line-height:1;color:var(--muted)}
.jtlw .active-filters .snippets-filter-item:hover .snippets-filter-item-icon-left{color:var(--ink)}
/* "Alle Filter zurücksetzen" is text at the end of the row, not a pill */
.jtlw .active-filters .snippets-filter-item-all{margin:0 0 0 2px;padding:0 4px!important;
  background:none!important;border:0!important;color:var(--muted)!important;
  font-size:12.5px!important;font-weight:400!important;
  text-decoration:underline!important;text-underline-offset:2px}
.jtlw .active-filters .snippets-filter-item-all:hover{color:var(--ink)!important}

/* ---------- Farbe swatches: the six values this shop uses that had no colour ---
   JTL carries no hex on a characteristic value, so the colour is mapped from the
   option's [title]. rz.css already maps Blau, Rot, Schwarz, Weiß, Gelb, Pink, Grün,
   Grau, Braun, Beige, Orange, Anthrazit, Creme and Natur. Extracted from this
   shop's Farbe filter, six more are in use and were rendering as plain checkbox
   rows: Multicolor, Lila, Rosa, Türkis, Gold, Magenta.

   Stated in Prisma's own sheet, and the pseudo-element is created here — rz.css
   only creates it for the names it knows. Multicolor has no single colour, so it
   gets a conic sweep of the palette rather than a flat fill. */
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Lila" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Rosa" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Türkis" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Tuerkis" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Gold" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Magenta" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Multicolor" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Multicolour" i] .filter-item-value::before{
  content:"";display:inline-block;flex-shrink:0;margin-right:9px;vertical-align:-3px;
  width:18px;height:18px;border-radius:6px;border:1px solid var(--line2)}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Lila" i] .filter-item-value::before{background:#7A4FA3}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Rosa" i] .filter-item-value::before{background:#E9A6B8}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Türkis" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Tuerkis" i] .filter-item-value::before{background:#0F9AA0}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Gold" i] .filter-item-value::before{background:#C9A227}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Magenta" i] .filter-item-value::before{background:#B5197E}
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Multicolor" i] .filter-item-value::before,
.jtlw #sidepanel_left .rz-facets .filter-item[title^="Multicolour" i] .filter-item-value::before{
  background:conic-gradient(#C0342B,#E0752A,#E8C23A,#2E7D46,#0F9AA0,#2B5CA8,#7A4FA3,#C0342B)}
