/* =============================================================================
   prisma-product.css — Produkt (PDP), ported from the design prototype
   (_handoffs/prisma/Prisma JTL Template.dc.html, screen "Produkt", lines
   324–596; data bindings 2101–2199).

   The PDP is the design's reference screen — it is field-for-field faithful to
   JTL's article model, so the markup keeps every JTL hook and only the
   presentation is brought onto the design. Loaded last in the chain.

   EVERY rule below carries `.jtlw`, and a handful additionally carry
   !important. That is not defensive habit, it is arithmetic:

     * prisma.css (the vendored jtl-widgets skin) styles `.jtlw .rz-stock`,
       `.jtlw .rz-qty`, `.jtlw .rz-colorsw`, `.jtlw .rz-buy__cat` … at (0,2,0).
       An unprefixed rule here is (0,1,0) and LOSES, even loading last.
     * rz.css pins `.rz-buy h1`, `.rz-buy__price .price` and `.rz-stock__dot`
       with !important. Specificity alone cannot beat that — those five
       declarations need !important back.

   Both traps were live: the H1 was rendering at a 30px cap instead of the
   design's 42px, the price was frozen at 34px and never turned accent on sale,
   the stock line was drawn as a bordered card with its dot suppressed, and the
   add-to-cart button was a 14px rounded rect instead of a pill.
   ========================================================================== */

/* ---------- the page rail --------------------------------------------------- */
/* Measured on the live shop, the product page was running FOUR different rails:
   the masthead at 1320@60, the buy grid at 1232@104, the tab strip at 1218@111
   and each related row at 1200@120 — every band starting at a different left
   edge down the page. The cause is nesting: the design's own .rz-sec (1320/22)
   sits INSIDE Bootstrap's .container (1250/15), and each level adds its gutter
   again. Tagging one wrapper was not enough, because the tabs and the related
   rows are emitted into containers of their own.
   So: on the product page every container IS the design rail, and a .rz-sec
   nested in one stops contributing a second gutter. data-page=1 is the article
   detail page (verified against the live DOM). */
/* The wrappers ABOVE the rail have to stop contributing a gutter of their own,
   or the rail can never reach --maxw: measured, .container.rz-pdpwrap came out
   1276 where the masthead's .rz-wrap is 1320 — exactly one gutter pair short,
   inherited from its parent. */
.jtlw[data-page="1"] #content-wrapper,
.jtlw[data-page="1"] #content{max-width:none;padding-left:0;padding-right:0}
.jtlw .rz-pdpwrap,
.jtlw[data-page="1"] .container{max-width:var(--maxw);padding-left:0;padding-right:0}
.jtlw[data-page="1"] .rz-sec{max-width:none;padding-left:0;padding-right:0}

/* ---------- breadcrumb ------------------------------------------------------ */
/* display:flex is not decoration here — on the live product page this list was
   computing to `block`, so every crumb sat on its own line and the trail ran
   five rows deep above the gallery. The gap/flex-wrap below were written for a
   flex row that was never actually flex. */
/* list-style:none is not cosmetic — this is an <ol>, and its markers were
   printing into the trail ("Startseite2. Bekleidung3. …"). */
.jtlw .breadcrumb{display:flex;align-items:center;font-size:12.5px;color:var(--muted);
  padding:16px 0 0;margin:0;gap:8px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
  list-style:none}
.jtlw .breadcrumb::-webkit-scrollbar{display:none}
.jtlw .breadcrumb-item{white-space:nowrap;list-style:none}
.jtlw .breadcrumb-item::marker{content:none}
/* razan.css hardcodes the separator to #707070 at (0,2,1) and nothing overrides
   it — it did not follow the theme into dark mode. */
.jtlw .breadcrumb-item+.breadcrumb-item::before{color:var(--muted);opacity:.45;padding-right:8px}
.jtlw .breadcrumb-item+.breadcrumb-item{padding-left:8px}
.jtlw .breadcrumb .active{color:var(--ink)}
.jtlw .breadcrumb a:hover{color:var(--red)}

/* ---------- two-column section ---------------------------------------------- */
.jtlw #product-offer.rz-pdp,.jtlw .rz-pdp{grid-template-columns:1.05fr 1fr;
  gap:clamp(24px,3.6vw,56px);align-items:start}

/* ---------- gallery --------------------------------------------------------- */
/* the design's stage is a bordered 24px card that does NOT follow the scroll —
   it was sticky at top:150px, which detached it from the buy column */
.jtlw .rz-gallery{position:static}
/* the stage is a scroll-snap strip of slides; its scrollbar was painting a grey
   bar across the bottom of the product image */
.jtlw .rz-gallery-stage{border-radius:24px;border:1px solid var(--line);margin-bottom:12px;
  scrollbar-width:none;-ms-overflow-style:none}
.jtlw .rz-gallery-stage::-webkit-scrollbar{display:none;width:0;height:0}
.jtlw .rz-gallery-stage-img{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-gallery-slide:hover .rz-gallery-stage-img{transition:transform .12s linear}
/* sale / new flag on the stage */
.jtlw .rz-gallery-badge{position:absolute;top:16px;left:16px;z-index:3;padding:6px 13px;border-radius:999px;
  background:var(--red);color:var(--onRed);font-family:var(--mono);font-size:11px;line-height:1}
/* the expand control: image.tpl has emitted this button all along and NOT ONE
   rule in the whole chain matched it, so it painted as a bare Bootstrap button */
.jtlw .rz-gallery-expand{position:absolute;top:14px;right:14px;z-index:3;width:36px;height:36px;padding:0;
  border:none;border-radius:999px;background:var(--scrim);color:var(--onScrim);
  display:flex;align-items:center;justify-content:center;font-size:14px;cursor:pointer;
  transition:transform .3s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-gallery-expand:hover{transform:scale(1.06)}
/* thumb rail: 36px circular arrows + portrait 74×88 thumbs, accent when picked */
.jtlw .rz-product-slider{display:flex;align-items:center;gap:10px;margin-top:12px}
.jtlw .rz-product-slider-arrow{width:36px;height:36px;flex-shrink:0;border-radius:999px;padding:0;
  display:flex;align-items:center;justify-content:center;font-size:13px}
.jtlw .rz-product-slider-track{display:flex;gap:10px;flex:1;min-width:0}
.jtlw .rz-product-slide{width:74px!important;height:88px!important;aspect-ratio:auto!important;
  border-radius:12px;border:2px solid transparent!important;opacity:1;
  transition:border-color .3s ease,transform .3s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-product-slide:hover{transform:translateY(-2px)}
.jtlw .rz-product-slide.is-selected,.jtlw .rz-product-slide.is-active{border-color:var(--red)!important}

/* ---------- buy-box header -------------------------------------------------- */
/* eyebrow = the Vaterartikel / category line above the H1. prisma.css puts it in
   DM Mono via .jtlw .rz-buy__cat; the design keeps it in the body face. */
.jtlw .rz-buy__cat{font-family:'Outfit',system-ui,sans-serif;font-size:13px;color:var(--muted);
  margin-bottom:10px;letter-spacing:0;text-transform:none;font-weight:400}
/* !important answers rz.css, which caps this at clamp(21px,2.7vw,30px)/600 */
.jtlw .rz-buy h1{font-size:clamp(26px,3.4vw,42px)!important;font-weight:700!important;
  letter-spacing:-.028em!important;line-height:1.06;margin:0 0 10px}
.jtlw .rz-buy__meta{display:flex;align-items:center;gap:12px;margin-bottom:20px}
/* prisma.css uppercases .rz-sku/.product-sku; the design prints "Artikelnummer
   404202" in sentence case, mono, muted. */
.jtlw .rz-sku,.jtlw .product-sku{font-family:var(--mono);font-size:12.5px;color:var(--muted);
  text-transform:none;letter-spacing:0}
/* the buy column has no short-description block in the design */
.jtlw .rz-buy__desc{display:none}

/* ---------- price + PAngV ---------------------------------------------------- */
/* !important answers rz.css's 34px/700/--ink pin, which also meant a reduced
   article never showed its price in the accent. */
.jtlw .rz-buy__price .rz-price__now,
.jtlw .rz-buy__price .price{font-size:clamp(30px,3.8vw,42px)!important;font-weight:800!important;
  letter-spacing:-.035em!important;font-variant-numeric:tabular-nums;line-height:1.05;color:var(--ink)}
.jtlw .rz-buy__price .special-price,
.jtlw .rz-buy__price .price.special-price{color:var(--red)!important}
/* struck RRP and the saving pill belong ON the price baseline, not stacked
   under it as two more block-level lines */
.jtlw .rz-buy__price .price-note{display:flex;flex-wrap:wrap;align-items:baseline;gap:12px}
.jtlw .rz-buy__price .text-stroke,
.jtlw .rz-buy__price .old-price{display:inline!important;font-family:var(--mono);font-size:15px!important;
  color:var(--muted)!important;text-decoration:line-through}
.jtlw .rz-buy__price .yousave{display:inline-flex!important;align-items:center;padding:4px 10px;border-radius:999px;
  background:var(--redSoft);color:var(--red)!important;font-family:var(--mono);font-size:11.5px;margin:0!important}
/* the PAngV line: VAT + shipping + delivery time, muted, with an underlined
   Versand link — legally required and part of the design's price block */
.jtlw .rz-buy__price .vat_info,
.jtlw .rz-buy__price .shipping-hint,
.jtlw .rz-buy__price small{font-size:13px;color:var(--muted);font-weight:400;letter-spacing:0}
.jtlw .rz-buy__price a{color:var(--ink2);text-decoration:underline;text-underline-offset:2px}
.jtlw .rz-buy__price a:hover{color:var(--red)}
.jtlw .rz-buy__price{margin-bottom:26px}

/* ---------- variations as NUMBERED STEPS ------------------------------------ */
/* The design presents each variation as a numbered step ("1 Farbe", "2 Größe").
   variation.tpl already emits one .rz-varblock per variation inside .variations,
   so the index is derived with a CSS counter rather than by rewriting the Smarty
   loop — that keeps every JTL hook (kEigenschaft ids, IMGSWATCHES slider, the
   SELECTBOX that jtl.article.js binds) untouched and the numbering correct for
   any number of variations. */
.jtlw .variations{counter-reset:rzvar}
.jtlw .variations .rz-varblock{counter-increment:rzvar;margin-bottom:22px}
.jtlw .rz-varhead{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px;
  font-family:'Outfit',sans-serif;font-size:13.5px;font-weight:700}
.jtlw .variations .rz-varhead::before{content:counter(rzvar);
  display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;
  border-radius:999px;background:var(--sand);color:var(--muted);align-self:center;
  font-family:var(--mono);font-size:9.5px;font-weight:400;line-height:1;margin-right:10px;order:-1}
/* once a value is chosen the step is done → tick. Two signals, because only
   IMGSWATCHES carries .swatches-selected (jtl.article.js fills it): the swatch
   markup marks the picked value .is-active/.active in EVERY variation type, and
   that is what the pill rows report. */
.jtlw .variations .rz-varblock:has(.swatches-selected:not(:empty)) .rz-varhead::before,
.jtlw .variations .rz-varblock:has(.swatches.is-active) .rz-varhead::before,
.jtlw .variations .rz-varblock:has(.swatches.active) .rz-varhead::before,
.jtlw .variations .rz-varblock:has(input[type="radio"]:checked) .rz-varhead::before{
  content:"\2713";background:var(--ok);color:var(--onRed)}
.jtlw .rz-varhead b{font-weight:700;font-size:13.5px;color:var(--ink)}
/* the right-hand hint — "Bitte wählen" in the accent until a value is picked,
   then the chosen value in ink; "Maßtabelle" where a size chart is linked */
.jtlw .rz-varhead .rz-varhint{margin-left:auto;font-size:13px;color:var(--red);font-weight:400}
.jtlw .variations .rz-varblock:has(.swatches-selected:not(:empty)) .rz-varhint,
.jtlw .variations .rz-varblock:has(.swatches.is-active) .rz-varhint,
.jtlw .variations .rz-varblock:has(.swatches.active) .rz-varhint,
.jtlw .variations .rz-varblock:has(input[type="radio"]:checked) .rz-varhint{display:none}
.jtlw .rz-varhead .swatches-selected{margin-left:auto;color:var(--ink2);font-size:13px;font-weight:400}
.jtlw .rz-varhead a{margin-left:auto;font-size:12.5px;color:var(--ink2);font-weight:400;
  text-decoration:underline;text-underline-offset:2px}
.jtlw .rz-varhead a:hover{color:var(--red)}
/* prisma.css skins .jtlw .rz-colorsw — which is the swatch ROW, not a swatch —
   so it drew a 2px pill outline around the whole row of colours. */
.jtlw .rz-colorsw{border:0!important;border-radius:0!important;display:flex;gap:10px;flex-wrap:wrap;margin:0}
.jtlw .rz-colorsw label.swatches,.jtlw .rz-colorsw .variation{
  width:42px;height:42px;border-radius:14px;border:1px solid var(--line2);box-shadow:none;overflow:hidden;
  transition:transform .3s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-colorsw label.swatches:hover{transform:translateY(-3px)}
.jtlw .rz-colorsw label.swatches.is-active,.jtlw .rz-colorsw label.swatches.active{
  border-color:var(--line2);outline:2px solid var(--ink);outline-offset:3px}
.jtlw .rz-sizes{display:flex;gap:9px;flex-wrap:wrap;margin:0}
.jtlw .rz-sizes label.swatches{padding:12px 20px;border-radius:999px;border:1px solid var(--line2);
  background:var(--surface);color:var(--ink2);font-size:13.5px;font-weight:600;transition:all .28s ease}
.jtlw .rz-sizes label.swatches.is-active,.jtlw .rz-sizes label.swatches.active{
  background:var(--ink);color:var(--paper);border-color:var(--ink)}
/* ---------- variation controls: buttons only, never a dropdown ---------------
   The design has no variation dropdown (prototype 371-396) and variation.tpl no
   longer emits one — a SELECTBOX renders with the TEXTSWATCHES markup — so the
   swatch row and the pill row above are the whole control surface. What is left
   here is a guard, the missing hidden-radio rule, and a fallback.

   The guard, because the rule this block replaces is what broke the live PDP: it
   pinned `border-radius:999px` on the bootstrap-select toggle. A pill radius is
   only a pill on a control of known height — that toggle sized itself to the buy
   column and 999px turned it into a circle some 650px across, with "Bitte wählen
   Sie eine Variation." floating in the middle of it. Nothing in here gets a pill
   radius now; a fixed radius cannot degrade that way. */
.jtlw .variations select,
.jtlw .variations .bootstrap-select,
.jtlw .variations .bootstrap-select > .dropdown-toggle{
  border-radius:12px!important;aspect-ratio:auto!important}
/* The radio inside each swatch label. `.control-hidden` is declared ONLY in
   themes/base/sass/_base.scss, which is not part of the compiled chain
   (razan.css → rz.css → prisma*.css) — so every swatch has been rendering a live
   native radio beside its label. Stated here; the pills make it unmissable. */
.jtlw .variations input.control-hidden{position:absolute;width:1px;height:1px;
  clip:rect(0,0,0,0);clip-path:inset(50%);pointer-events:none;opacity:0}
/* Fallback: should a plugin or the matrix view put a select back inside
   .variations, it reads as an rz field rather than a bare browser control, and
   bootstrap-select's source select stays hidden so only one control shows. */
.jtlw .variations .bootstrap-select > select{position:absolute!important;width:1px!important;
  height:1px!important;opacity:0!important;pointer-events:none;clip-path:inset(50%)}
.jtlw .variations select:not(.control-hidden){width:100%;max-width:100%;
  padding:12px 40px 12px 16px;border:1px solid var(--line2);
  background:var(--surface);color:var(--ink);font-size:13.5px}
.jtlw .variations .bootstrap-select > .dropdown-toggle{
  border:1px solid var(--line2)!important;background:var(--surface)!important;
  color:var(--ink)!important;padding:12px 40px 12px 16px!important;
  font-size:13.5px;font-weight:500;box-shadow:none!important}
.jtlw .variations .bootstrap-select > .dropdown-menu{position:absolute;z-index:60;width:100%;
  margin-top:6px;padding:9px!important;border:1px solid var(--line)!important;
  border-radius:16px!important;background:var(--surface)!important;box-shadow:var(--shadowLg)!important}
.jtlw .variations .bootstrap-select .dropdown-item{border-radius:10px!important;
  padding:9px 12px!important;font-size:14px!important;color:var(--ink2)!important}
.jtlw .variations .bootstrap-select .dropdown-item:hover,
.jtlw .variations .bootstrap-select .dropdown-menu li.selected a{
  background:var(--sand)!important;color:var(--ink)!important}

/* ---------- the rows themselves --------------------------------------------- */
/* Both rows come from {formrow}, so each value arrives wrapped in a Bootstrap
   .col-auto carrying a 1rem gutter — which would sit on top of the design's
   10px/9px gap. The gap is the only spacing. */
.jtlw .variations dl{margin:0}
.jtlw .rz-varblock dd.form-group{margin:0}
.jtlw .rz-colorsw > *,
.jtlw .rz-sizes > *{padding:0;margin:0;width:auto;max-width:none;flex:0 0 auto}
.jtlw .rz-colorsw label.swatches,
.jtlw .rz-sizes label.swatches{margin:0;cursor:pointer}
.jtlw .rz-sizes label.swatches{line-height:1.1}
.jtlw .rz-sizes label.swatches:hover{border-color:var(--ink);color:var(--ink)}
.jtlw .rz-sizes .label-variation{display:block;font:inherit;color:inherit}
/* the swatch image fills its 42px tile */
.jtlw .rz-colorsw label.swatches img{width:100%;height:100%;object-fit:cover;display:block}
/* A value that cannot be combined, or is sold out, stays selectable — JTL answers
   with the reason — but must not read as available. */
.jtlw .rz-sizes label.swatches.swatches-not-in-stock,
.jtlw .rz-sizes label.swatches.swatches-sold-out,
.jtlw .rz-sizes label.swatches.not-available{color:var(--muted);border-color:var(--line);
  text-decoration:line-through;text-decoration-thickness:1px}
.jtlw .rz-colorsw label.swatches.swatches-not-in-stock,
.jtlw .rz-colorsw label.swatches.swatches-sold-out,
.jtlw .rz-colorsw label.swatches.not-available{opacity:.45}
/* the not-available badge JTL prints inside a pill would double its height */
.jtlw .rz-sizes label.swatches .badge-not-available{display:none}

/* ---------- stock row -------------------------------------------------------- */
/* prisma.css draws .jtlw .rz-stock as a bordered surface card; the design's
   stock line is bare type on the page. And rz.css hides the status dot with
   !important, so the pulsing availability signal never rendered at all. */
.jtlw .rz-stock,.jtlw .delivery-status.rz-stock{background:none;border:0;border-radius:0;padding:0;
  margin-bottom:18px;display:flex;align-items:center;gap:10px;font-size:13.5px;flex-wrap:wrap}
.jtlw .rz-stock > ul{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0;padding:0;list-style:none}
.jtlw .rz-stock > ul > li{display:flex;align-items:center;gap:10px}
.jtlw .rz-stock > ul > li + li::before{content:"·";color:var(--muted)}
.jtlw .rz-stock__dot{display:inline-block!important;width:8px;height:8px;flex-shrink:0;border-radius:999px;
  background:var(--ok);animation:pxPulse 2.4s ease-in-out infinite}
.jtlw .rz-stock .rz-stock__on,
.jtlw .rz-stock .status-1,.jtlw .rz-stock .status-2{font-weight:700;color:var(--ok)!important}
.jtlw .rz-stock .estimated-delivery{color:var(--muted)}
/* "Frage zum Artikel" closes the row on the right */
.jtlw .stock-information .question-on-item{margin-left:auto}
/* it is a Bootstrap .btn, so its 600 weight and pill radius have to be undone —
   the design's is a plain underlined link */
.jtlw .btn.question{padding:0;border:0;border-radius:0;background:none;display:inline-flex;align-items:center;
  gap:7px;font-size:13px;font-weight:400!important;color:var(--ink2)!important;text-decoration:underline;
  text-underline-offset:2px}
.jtlw .btn.question:hover{color:var(--red)!important}
.jtlw .btn.question .fa-question-circle{display:inline-block!important;font-size:14px;color:inherit!important}

/* ---------- variation-required notice ---------------------------------------- */
.jtlw .rz-hint.choose-variations{display:flex;align-items:flex-start;gap:11px;padding:14px 16px;
  border-radius:16px;background:var(--sand);border:1px solid var(--line);margin:0 0 16px;
  font-size:13.5px;color:var(--ink2)}
.jtlw .rz-hint.choose-variations::before{content:"\25CF";color:var(--red);flex-shrink:0;line-height:1.4}

/* ---------- quantity stepper + CTA ------------------------------------------- */
/* prisma.css sizes .jtlw .rz-qty button to 38×40 and pins .rz-addbig to a 14px
   radius with !important — the stepper was two sizes small and the primary
   call to action was a rounded rect where the design has a pill. */
.jtlw .rz-buyrow{display:flex;gap:11px;flex-wrap:wrap;margin-bottom:12px}
.jtlw .rz-qty{border:1px solid var(--line2)!important;border-radius:999px;background:var(--surface);min-width:0}
.jtlw .rz-qty button{width:44px!important;height:54px!important;font-size:19px;color:var(--ink2)}
.jtlw .rz-qty input{padding:0!important;min-width:32px;width:32px;font-size:15px;font-weight:700;
  font-variant-numeric:tabular-nums;border:0!important;background:none!important;text-align:center}
.jtlw .rz-addbig{flex:1;min-width:220px;padding:17px 22px;min-height:0;border-radius:999px!important;
  font-size:15px;font-weight:700;background:var(--red)!important;border-color:var(--red)!important;
  box-shadow:0 14px 32px rgba(173,71,8,.3);
  transition:transform .3s cubic-bezier(.16,1,.3,1),background .3s ease,box-shadow .3s ease}
/* prisma.css hardcodes #fff here. In dark mode --red lightens to #FF9448 and
   white on it is ~2.2:1 — --onRed is the paired ink and stays ~9:1. */
.jtlw .rz-addbig,.jtlw .rz-buy-add,
.jtlw .rz-addbig:hover,.jtlw .rz-buy-add:hover{color:var(--onRed)!important}
.jtlw .rz-addbig:hover{transform:translateY(-2px);box-shadow:0 18px 40px rgba(173,71,8,.34)}
.jtlw .rz-addbig[disabled],.jtlw .rz-addbig:disabled{background:var(--line2)!important;
  border-color:var(--line2)!important;color:var(--muted)!important;box-shadow:none;transform:none;cursor:not-allowed}
/* Merken / Vergleichen — a full-width pair under the CTA, as in the design.
   They used to be icon chips floating over the gallery. */
/* These two arrive as `badge badge-circle-1` chips — a 28px circle the base
   theme sizes with its own rules — so the pair rendered as two tiny icons
   instead of the design's full-width labelled buttons. Width/height/border-
   radius have to be stated at a weight that beats the badge chrome. */
.jtlw .rz-buy-actions{display:flex;gap:9px;margin-bottom:24px}
.jtlw .rz-buy-actions > .btn,
.jtlw .rz-buy-actions .wishlist,.jtlw .rz-buy-actions .compare,
.jtlw .rz-buy-actions .rz-buy-action{
  flex:1 1 0!important;width:auto!important;height:auto!important;min-width:0;
  padding:13px!important;border-radius:999px!important;
  border:1px solid var(--line2)!important;background:var(--surface)!important;color:var(--ink)!important;
  font-size:13px;font-weight:600;display:flex!important;align-items:center;justify-content:center;gap:8px}
.jtlw .rz-buy-actions > *:hover{border-color:var(--ink)!important}
.jtlw .rz-buy-actions .badge{position:static;transform:none}

/* Merkmal values come out of JTL as Bootstrap badges — solid accent pills in
   the middle of a spec table. The design lists them as plain right-aligned
   values, like every other row. */
.jtlw .rz-specpanel .badge,
.jtlw .rz-specpanel .attr-characteristic .badge,
.jtlw .rz-specpanel a.badge-primary{background:none!important;color:var(--ink)!important;
  padding:0!important;border-radius:0!important;font-family:'Outfit',sans-serif;
  font-size:13.5px!important;font-weight:600!important;text-transform:none!important;letter-spacing:0}
.jtlw .rz-specpanel a.badge:hover{color:var(--red)!important;text-decoration:underline}

/* ---------- trust block — cell-divided, two across -------------------------- */
.rz-uspstrip--2{grid-template-columns:repeat(2,1fr);border-radius:18px;margin:0 0 16px}
/* with two columns the right-hand cell must not draw a divider, and the top row
   needs a bottom hairline so the block reads as one divided container */
.rz-uspstrip--2 .rz-uspcell{padding:14px 16px}
.rz-uspstrip--2 .rz-uspcell:nth-child(2n){border-right:none}
.rz-uspstrip--2 .rz-uspcell:nth-child(-n+2):not(:nth-last-child(-n+2)){border-bottom:1px solid var(--line)}
.rz-uspstrip--2 .rz-uspcell__no{margin-bottom:0;display:inline-block;margin-right:11px;vertical-align:middle;
  font-size:9.5px;letter-spacing:.14em}
.rz-uspstrip--2 .rz-uspcell__t{display:inline;font-size:12.5px;font-weight:600;color:var(--ink2);
  line-height:1.4;letter-spacing:normal;margin-bottom:0;vertical-align:middle}

/* ---------- Staffelpreise (tier prices) -------------------------------------- */
/* JTL emits these as a <table>; the design lays them out as a 3-cell divided
   panel. Flipping the table to a grid in CSS keeps $Artikel->staffelPreis_arr
   and every JTL hook intact. */
.jtlw .rz-buy__price .bulk-prices{max-width:none;margin:0 0 16px;
  border:1px solid var(--line);border-radius:18px;background:var(--surface);overflow:hidden}
/* rz.css generated its own "MENGENRABATT — MEHR SPAREN" heading here as ::before
   content. Now that the panel has a real heading element, that one has to go or
   the card carries two stacked titles. */
.jtlw .rz-buy__price .bulk-prices::before{content:none;display:none}
.jtlw .bulk-prices__h{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
  padding:14px 18px;border-bottom:1px solid var(--line)}
.jtlw .bulk-prices__h b{font-family:'Outfit',sans-serif;font-size:13.5px;font-weight:700;color:var(--ink)}
.jtlw .bulk-prices__tag{font-family:var(--mono);font-size:9.5px;font-weight:400;letter-spacing:.14em;
  text-transform:uppercase;color:var(--red)}
.jtlw .rz-buy__price .bulk-prices thead{display:none}
/* only the tbody becomes the 3-track grid. Making the <table> a grid too put
   tbody in a single 1fr track, so the whole tier row was squeezed into a third
   of the panel. */
.jtlw .rz-buy__price .bulk-prices table{display:block;width:100%;margin:0;border:0}
.jtlw .rz-buy__price .bulk-prices tbody{display:grid;grid-template-columns:repeat(3,1fr);width:100%}
.jtlw .rz-buy__price .bulk-prices tbody tr{display:block;padding:13px 16px;border-right:1px solid var(--line)}
.jtlw .rz-buy__price .bulk-prices tbody tr:last-child{border-right:none}
.jtlw .rz-buy__price .bulk-prices tbody td{display:block;padding:0!important;border:0!important;
  text-align:left!important;background:none!important}
.jtlw .rz-buy__price .bulk-prices tbody td:first-child{font-family:var(--mono);font-size:9.5px;
  letter-spacing:.08em;color:var(--muted)!important;font-weight:400!important;margin-bottom:6px}
/* both are spans in JTL's markup — they have to stack, or the price and its
   saving line run together as one string */
.jtlw .rz-buy__price .bulk-prices .bulk-price{display:block;font-size:15px;font-weight:700;
  color:var(--ink)!important;font-variant-numeric:tabular-nums}
.jtlw .rz-buy__price .bulk-prices .bulk-base-price{display:block;font-size:11px;color:var(--muted);margin-top:3px}

/* ---------- Produktdetails accordion ----------------------------------------- */
/* the design renders this as a bordered panel headed by a mono index, collapsed
   by default, carrying the field count and a caret. Native <details> — no JS. */
.jtlw .rz-facts{border:1px solid var(--line);border-radius:18px;background:var(--surface);padding:0;
  overflow:hidden;margin-top:14px}
.jtlw .rz-facts__h{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:15px 18px;
  font-size:13.5px;font-weight:700;letter-spacing:-.015em;cursor:pointer;list-style:none;
  transition:background .28s ease}
.jtlw .rz-facts__h::-webkit-details-marker{display:none}
.jtlw .rz-facts__h:hover{background:var(--sand)}
.jtlw .rz-facts__h::before{content:"03";font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;
  color:var(--red);font-weight:400;margin-right:11px}
.jtlw .rz-facts__meta{display:flex;align-items:center;gap:10px;margin-left:auto}
.jtlw .rz-facts__count{font-family:var(--mono);font-size:10px;color:var(--muted);font-weight:400}
.jtlw .rz-facts__caret{color:var(--muted);flex-shrink:0;transition:transform .3s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-facts[open] .rz-facts__caret{transform:rotate(180deg)}
.jtlw .rz-facts .info-essential{margin:0;padding:0;border-top:1px solid var(--line);list-style:none}
.jtlw .rz-facts .info-essential li{display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  padding:12px 18px;border-bottom:1px solid var(--line);font-size:13.5px}
.jtlw .rz-facts .info-essential li:last-child{border-bottom:none}
.jtlw .rz-facts .info-essential li strong{font-weight:400;color:var(--muted);text-transform:none;
  letter-spacing:0;font-family:'Outfit',sans-serif;font-size:13px}
.jtlw .rz-facts .info-essential li span{font-weight:600;text-align:right;text-transform:none;letter-spacing:0;
  font-family:'Outfit',sans-serif;color:var(--ink)}

/* ---------- tabs (Beschreibung / Produktsicherheit / Bewertungen) ---------- */
/* rz.css already strips the Bootstrap tab chrome; the design differs in that the
   marker is the ACCENT and it GROWS from the left rather than switching on. */
/* #product-tabs IS the <ul class="nav nav-tabs"> — not a wrapper around one.
   These rules used to read `#product-tabs .nav-tabs .nav-link`, which asks for a
   .nav-tabs DESCENDANT of #product-tabs; that element does not exist, so on the
   live shop not one of them matched and the tabs fell through to the base theme
   at 17px with 2px of side padding. */
.jtlw #product-tabs,
.jtlw .product-tabs .nav-tabs{gap:2px;border-bottom:1px solid var(--line)}
.jtlw #product-tabs .nav-link,
.jtlw .product-tabs .nav-tabs .nav-link{position:relative;padding:14px 18px!important;font-size:15px!important;
  font-weight:600!important;letter-spacing:normal;color:var(--muted)!important;border:0!important;
  border-bottom-color:transparent!important;
  /* the base theme spaces tabs with a 34px right margin; the design uses a 2px
     gap on the strip, and the two were adding up to 36px */
  margin:0 0 -1px!important}
.jtlw #product-tabs .nav-link:hover,
.jtlw .product-tabs .nav-tabs .nav-link:hover{color:var(--ink)!important}
.jtlw #product-tabs .nav-link.active,
.jtlw .product-tabs .nav-tabs .nav-link.active{color:var(--ink)!important;font-weight:600!important}
.jtlw #product-tabs .nav-link::after,
.jtlw .product-tabs .nav-tabs .nav-link::after{content:"";position:absolute;left:18px;right:18px;bottom:-1px;
  height:2px;background:var(--red);transform:scaleX(0);transform-origin:left;
  transition:transform .42s cubic-bezier(.16,1,.3,1)}
.jtlw #product-tabs .nav-link.active::after,
.jtlw .product-tabs .nav-tabs .nav-link.active::after{transform:scaleX(1)}
.jtlw .tab-navigation + .tab-content,
.jtlw .product-tabs .tab-content{padding-top:28px}

/* ---------- description / safety: copy column + data panel ------------------ */
.jtlw .rz-desccols{display:grid;grid-template-columns:1.3fr 1fr;gap:clamp(24px,3.6vw,52px);align-items:start}
.jtlw .rz-desccols .desc{max-width:66ch;min-width:0}
.jtlw .rz-desccols .desc h3{font-size:19px;margin-bottom:12px}
.jtlw .rz-desccols .desc p{font-size:15px;color:var(--ink2);line-height:1.8;margin-bottom:14px}
/* the design's checkmark list inside the description column */
.jtlw .tab-content .desc ul{list-style:none;padding:0;margin:18px 0 0;
  display:flex;flex-direction:column;gap:10px}
.jtlw .tab-content .desc ul li{position:relative;padding-left:24px;margin:0;
  font-size:14.5px;color:var(--ink2)}
/* the tick is drawn in CSS rather than set as U+2713: Outfit has no glyph for it,
   so the character fell through to whatever the OS substituted and rendered
   differently per machine. Borders + rotate are crisp and font-independent. */
.jtlw .tab-content .desc ul li::before{content:"";position:absolute;left:3px;top:5px;
  width:6px;height:11px;border:solid var(--red);border-width:0 2px 2px 0;transform:rotate(45deg)}
/* The wrapper is the layout cell only. It used to be a card in its own right with
   a mono "Technische Daten" header — but attributes.tpl renders a complete titled
   panel inside it, so the page showed that header alone on an empty card above the
   real one. Chrome dropped; the panel within is the card. */
.jtlw .rz-specpanel{border:0;border-radius:0;background:none;overflow:visible;align-self:start}
/* left in place: a child theme or plugin may still emit the heading */
.jtlw .rz-specpanel__h{display:none}
.jtlw .rz-specpanel table{width:100%;margin:0}
.jtlw .rz-specpanel td{padding:12px 18px!important;border:0!important;border-bottom:1px solid var(--line)!important;
  font-size:13.5px;font-weight:600;text-align:right}
.jtlw .rz-specpanel td:first-child{font-size:13px;color:var(--muted);font-weight:400;text-align:left}
.jtlw .rz-specpanel tr:last-child td{border-bottom:0!important}
/* GPSR */
.jtlw .rz-safetylist{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
.jtlw .rz-safetylist li{display:flex;gap:11px;font-size:14.5px;color:var(--ink2)}
.jtlw .rz-safetylist li::before{content:"\2022";color:var(--red);flex-shrink:0}
.jtlw .rz-kv{display:flex;justify-content:space-between;gap:16px;padding:12px 18px;border-bottom:1px solid var(--line)}
.jtlw .rz-kv:last-child{border-bottom:0}
.jtlw .rz-kv span{font-size:13px;color:var(--muted)}
.jtlw .rz-kv b{font-size:13.5px;font-weight:600;text-align:right;overflow-wrap:anywhere}

/* ---------- reviews ---------------------------------------------------------- */
.jtlw .rz-revgrid{display:grid;grid-template-columns:250px minmax(0,1fr);gap:clamp(24px,3.6vw,48px);
  align-items:start}
.jtlw .reviews .card.rz-revcard{border-radius:20px!important;padding:24px!important;box-shadow:none}
.jtlw .rz-revfig{font-size:48px;font-weight:800;letter-spacing:-.04em;line-height:1}
.jtlw .rz-revstars{color:var(--star);font-size:14px;letter-spacing:1.5px;margin:8px 0 5px}
.jtlw .rz-revcount{font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-bottom:20px}
.jtlw .reviews .progress{height:6px;border-radius:999px;background:var(--sand)}
.jtlw .reviews .progress-bar{background:var(--star)}
.jtlw .reviews .card.review{border-radius:20px!important;padding:20px!important}
.jtlw .reviews blockquote p{max-width:62ch;font-size:14.5px;color:var(--ink2);line-height:1.7}

/* ---------- related products ------------------------------------------------- */
.jtlw #slider-related.rz-sec,.jtlw #slider-xsell.rz-sec,.jtlw .partslist .rz-sec{
  padding:clamp(32px,4.4vw,60px) 22px clamp(52px,7vw,96px)}
.jtlw #slider-related > h2.rz,.jtlw #slider-xsell > h2.rz{font-size:clamp(24px,3.2vw,38px);margin-bottom:20px}

/* ---------- sticky buy bar --------------------------------------------------- */
@keyframes pxBar{from{transform:translateY(110%)}to{transform:none}}
.jtlw .rz-stickybuy{position:fixed;left:0;right:0;bottom:0;z-index:88;background:var(--surface);
  border-top:1px solid var(--line);box-shadow:0 -10px 32px rgba(28,22,12,.12);
  animation:pxBar .38s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-stickybuy[hidden]{display:none}
.jtlw .rz-stickybuy__in{max-width:var(--maxw);margin:0 auto;padding:12px 22px;display:flex;align-items:center;
  gap:16px;flex-wrap:wrap}
.jtlw .rz-stickybuy__thumb{width:44px;height:54px;flex-shrink:0;border-radius:12px;overflow:hidden;
  background:var(--sand)}
.jtlw .rz-stickybuy__thumb img{width:100%;height:100%;object-fit:cover}
.jtlw .rz-stickybuy__txt{flex:1;min-width:140px;display:flex;flex-direction:column}
.jtlw .rz-stickybuy__name{font-size:14px;font-weight:600;line-height:1.3}
.jtlw .rz-stickybuy__var{font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:2px}
.jtlw .rz-stickybuy__price{font-size:20px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.jtlw .rz-stickybuy__btn{padding:14px 26px;border:none;border-radius:999px;background:var(--red);
  color:var(--onRed);font-weight:700;font-size:14px;white-space:nowrap;cursor:pointer;
  transition:background .3s ease}
.jtlw .rz-stickybuy__btn:hover{background:var(--primary-600,#9A3F07)}

/* ---------- responsive ------------------------------------------------------- */
@media (max-width:900px){
  .jtlw .rz-desccols,.jtlw .rz-revgrid{grid-template-columns:1fr}
  /* rz.css collapses the buy grid here, at `.rz-pdp` (0,1,0) — but the rule at the
     top of this file states two columns at `.jtlw .rz-pdp` (0,2,0) and loads after
     it, so the collapse never applied and the PDP stayed two-column all the way
     down. Measured at 390: the buy column came out 157px, which crams the price,
     the variation pills and add-to-cart into a third of the screen. */
  .jtlw #product-offer.rz-pdp,.jtlw .rz-pdp{grid-template-columns:1fr}
}
@media (max-width:560px){
  .rz-uspstrip--2{grid-template-columns:1fr}
  .rz-uspstrip--2 .rz-uspcell{border-right:none;border-bottom:1px solid var(--line)}
  .rz-uspstrip--2 .rz-uspcell:last-child{border-bottom:none}
  .jtlw .rz-buy__price .bulk-prices table,
  .jtlw .rz-buy__price .bulk-prices tbody{grid-template-columns:1fr}
  .jtlw .rz-buy__price .bulk-prices tbody tr{border-right:none;border-bottom:1px solid var(--line)}
  .jtlw .rz-stickybuy__thumb{display:none}
}

/* ---- Technische Daten carries specs only ----
   JTL emits its GPSR compliance block (Angaben zur Produktsicherheit +
   Herstellerinformationen) into this panel. It is legally-required content but
   it is not technical data, and the tab set already has a Produktsicherheit tab
   that is the right home for it — so it is suppressed HERE only, never hidden
   from the page. */
.jtlw .rz-specpanel .gpsr-compliance,
.jtlw .rz-specpanel > .hr-sect{display:none}

/* ---- add-to-cart confirmation as a POPUP ----
   It rendered inline at the very top of the product page, pushing the whole
   article down and leaving the shopper reading a confirmation where the
   breadcrumb should be. The design's behaviour is a modal over the page.
   The scrim is a ::before INSIDE this element's own stacking context, so it
   covers the page without needing a wrapper the template does not emit. */
.jtlw .rz-added{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:300;
  width:min(560px,calc(100% - 40px));max-height:86vh;overflow-y:auto;margin:0;
  border-radius:24px;box-shadow:var(--shadowLg);
  animation:pxPop .26s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-added::before{content:"";position:fixed;inset:0;z-index:-1;
  background:rgba(20,13,8,.55);backdrop-filter:blur(2px)}
@keyframes pxPop{from{opacity:0;transform:translate(-50%,-46%) scale(.98)}}
.jtlw .rz-added[hidden]{display:none}
/* the dismiss control the popup needs and the inline block never had */
.jtlw .rz-added__close{position:absolute;top:14px;right:14px;width:32px;height:32px;
  display:flex;align-items:center;justify-content:center;border:0;border-radius:999px;
  background:var(--sand);color:var(--ink2);font-size:18px;line-height:1;cursor:pointer}
.jtlw .rz-added__close:hover{background:var(--line2);color:var(--ink)}
@media (max-width:560px){.jtlw .rz-added{width:calc(100% - 24px);border-radius:20px}}

/* The card must paint its OWN opaque background. The scrim is this element's
   ::before at z-index:-1, which sits behind the element's background but in
   front of the page — so with no background of its own the card was showing the
   scrim straight through and reading as a grey panel. */
.jtlw .rz-added{background:var(--surface)!important;border:1px solid var(--line)!important;
  padding:22px 24px!important;color:var(--ink)}
.jtlw .rz-added > *{position:relative}

/* ---------- hover text must be a tooltip, not page content ------------------- */
/* Bootstrap's tooltip ruleset is NOT in the compiled chain (`.tooltip` occurs once
   in razan.css, and none of the parts that matter). Without `position:absolute` the
   element jQuery injects lands in the document flow — which is why "Ihre Auswahl ist
   leider nicht verfügbar." pushed itself between the Farbe heading and the swatch
   row. Same failure as `.control-hidden`: declared upstream, never compiled in. */
.jtlw .tooltip{position:absolute;z-index:250;display:block;margin:0;padding:0;
  font-family:'Outfit',system-ui,sans-serif;font-size:12.5px;line-height:1.35;
  font-weight:400;text-align:left;opacity:0;pointer-events:none;
  transition:opacity .18s ease}
.jtlw .tooltip.show{opacity:1}
.jtlw .tooltip .tooltip-inner{display:block;max-width:230px;padding:8px 11px;
  border-radius:10px;background:var(--panel);color:var(--onPanel);text-align:left}
.jtlw .tooltip .arrow,.jtlw .tooltip .tooltip-arrow{display:none}

/* ---------- the gallery's full-screen control -------------------------------- */
/* image.tpl emits <i class="fas fa-expand">, and fa-expand is not in the icon set
   this theme bundles — so the button painted as an empty square over the image.
   The affordance is drawn as two corner brackets instead, which also keeps it
   legible at any zoom. */
.jtlw .rz-gallery-expand i,
.jtlw .rz-gallery-expand .fas,
.jtlw .rz-gallery-expand .fa-expand{display:none!important}
.jtlw .rz-gallery-expand{position:absolute;top:14px;right:14px;z-index:4;
  width:36px;height:36px;border:0;border-radius:999px;
  background:var(--scrim);color:var(--onScrim);cursor:pointer}
.jtlw .rz-gallery-expand::before,
.jtlw .rz-gallery-expand::after{content:"";position:absolute;width:9px;height:9px;
  border:2px solid currentColor}
.jtlw .rz-gallery-expand::before{top:10px;left:10px;border-right:0;border-bottom:0}
.jtlw .rz-gallery-expand::after{bottom:10px;right:10px;border-left:0;border-top:0}
.jtlw .rz-gallery-expand:hover{background:var(--surface)}

/* ---------- Vergleichen, next to Auf Wunschzettel --------------------------- */
/* snippets/comparelist_button.tpl renders it as a `.badge`, so Bootstrap's
   `.badge{color:#fff}` and its 75% font size applied — white label on a white
   button, at the wrong size. It is a buy-column action, so it is stated as one. */
.jtlw .rz-buy-action.badge,
.jtlw .rz-buy-action.badge.compare{font-size:14px!important;font-weight:600!important;
  color:var(--ink)!important;background:var(--surface)!important;
  border:1px solid var(--line2)!important;border-radius:999px!important;
  padding:14px 20px!important;line-height:1.2;white-space:nowrap}
.jtlw .rz-buy-action.badge:hover{border-color:var(--ink)!important;color:var(--ink)!important}
.jtlw .rz-buy-action.badge .far,
.jtlw .rz-buy-action.badge .fas{color:inherit!important}

/* ---------- the search bar's submit closes the field ------------------------- */
/* it was sitting mid-bar with empty space to its right */
.jtlw .rz-search{display:flex;align-items:center;width:100%;min-width:0}
.jtlw .rz-search .form-control,
.jtlw .rz-search input[type="text"],
.jtlw .rz-search input[type="search"]{flex:1 1 auto;min-width:0}
.jtlw .rz-search button[type="submit"],
.jtlw .rz-search .btn-secondary{flex:0 0 auto;margin-left:auto}

/* ---------- add-to-cart confirmation: the eModal dialog ---------------------- */
/* productdetails/popups.tpl hands `.product-popup` to eModal.alert(), which builds
   the dialog around it. So the `.rz-added` rules above never matched this popup —
   they were written for markup this shop does not emit, which is why it kept
   painting as a grey panel with the close button in its footer.
   Targeted through the dialog that CONTAINS .product-popup, so it holds whichever
   wrapper shape eModal produces. */
.jtlw .modal:has(.product-popup) .modal-content,
.jtlw .modal-content:has(.product-popup),
.jtlw .modal-dialog:has(.product-popup) .modal-content{
  position:relative;
  background:var(--surface)!important;
  border:1px solid var(--line)!important;
  border-radius:24px!important;
  box-shadow:var(--shadowLg)!important;
  color:var(--ink)!important}
/* the panel inside must not paint over that white */
.jtlw .product-popup{background:transparent!important;color:inherit}
.jtlw .modal:has(.product-popup) .modal-header,
.jtlw .modal:has(.product-popup) .modal-body,
.jtlw .modal:has(.product-popup) .modal-footer{background:transparent!important;
  border-color:var(--line)!important}
/* close control to the card's top right corner */
.jtlw .modal:has(.product-popup) .close,
.jtlw .modal:has(.product-popup) button[data-dismiss="modal"]{
  position:absolute;top:14px;right:14px;left:auto;bottom:auto;z-index:3;
  display:flex;align-items:center;justify-content:center;
  width:32px;height:32px;margin:0;padding:0;
  border:0;border-radius:999px;background:var(--sand);color:var(--ink);
  font-size:17px;line-height:1;opacity:1;text-shadow:none;float:none}
.jtlw .modal:has(.product-popup) .close:hover{background:var(--line2);color:var(--ink);opacity:1}
/* the footer only carried that button */
.jtlw .modal:has(.product-popup) .modal-footer{border-top:0!important;padding-top:0!important}

/* ---------- Staffelpreise: full width, one row, with the saving ------------- */
/* The panel was sitting at about a third of the buy column and wrapping four
   tiers into 3+1, with a bare quantity and a stray footnote asterisk in every
   cell. The design runs the tiers across the whole column in a single row, each
   labelled and closed by its percentage off (prototype: 1-9 Stk / 10-49 Stk /
   ab 50 Stk with Listenpreis, -8 %, -15 %). */
.jtlw .rz-buy__price,
.jtlw .rz-buy__price .bulk-prices{display:block;width:100%;max-width:none}
/* one row whatever the tier count — repeat(3,1fr) wrapped a fourth tier */
.jtlw .rz-buy__price .bulk-prices tbody{display:grid!important;grid-auto-flow:column;
  grid-auto-columns:minmax(0,1fr);grid-template-columns:none!important;width:100%}
/* the asterisk belongs to the main price line, not inside every tier cell */
.jtlw .rz-buy__price .bulk-prices .footnote-reference{display:none}
/* the saving, in the accent the design uses for it */
.jtlw .rz-buy__price .bulk-prices .bulk-price__off{display:block;margin-top:3px;
  font-family:var(--mono);font-size:10.5px;color:var(--red);white-space:nowrap}
/* the first tier reads as the reference, so it carries the design's tinted cell */
.jtlw .rz-buy__price .bulk-prices tbody tr:first-child{background:var(--redSoft)}

/* =============================================================================
   COLOUR VARIATIONS AS TILES (prototype 377-385)
   variation.tpl tags a colour group `.rz-colorpills`, so the value labels become
   42px tiles instead of named pills. The name is not lost: every label carries
   title + data-toggle="tooltip", so hovering a tile shows it.

   JTL holds no hex on a variation value, so the fill is mapped from
   [data-original]. Prefix matching, so a longer name that starts with a shorter
   one (Rot-Braun after Rot, Naturbeige after Natur, Petrolgrün after Petrol) is
   declared LATER and wins on source order.
   ========================================================================== */
.jtlw .rz-colorpills{display:flex;flex-wrap:wrap;gap:10px;margin:0}
.jtlw .rz-colorpills > *{padding:0;margin:0;width:auto;max-width:none;flex:0 0 auto}
.jtlw .rz-colorpills label.swatches{position:relative;width:42px;height:42px;padding:0!important;
  border-radius:14px;border:1px solid var(--line2)!important;background:var(--sand);
  overflow:hidden;cursor:pointer;
  transition:transform .3s cubic-bezier(.16,1,.3,1),outline-color .2s ease}
.jtlw .rz-colorpills label.swatches:hover{transform:translateY(-3px)}
.jtlw .rz-colorpills label.swatches.is-active,
.jtlw .rz-colorpills label.swatches.active{outline:2px solid var(--ink);outline-offset:3px}
/* the name lives in the tooltip, but stays for screen readers */
.jtlw .rz-colorpills .label-variation{position:absolute;width:1px;height:1px;
  overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.jtlw .rz-colorpills label.swatches.swatches-not-in-stock,
.jtlw .rz-colorpills label.swatches.swatches-sold-out{opacity:.4}

/* ---------- the map -------------------------------------------------------- */
/* neutrals */
.jtlw .rz-colorpills label[data-original^="Weiß" i],
.jtlw .rz-colorpills label[data-original^="Weiss" i]{background:#F7F4EF}
.jtlw .rz-colorpills label[data-original^="Creme" i]{background:#F0E6D2}
.jtlw .rz-colorpills label[data-original^="Natur" i]{background:#E4D7BF}
.jtlw .rz-colorpills label[data-original^="Beige" i]{background:#D9C8AE}
.jtlw .rz-colorpills label[data-original^="Khaki" i]{background:#8F8455}
.jtlw .rz-colorpills label[data-original^="Grau" i]{background:#8C8681}
.jtlw .rz-colorpills label[data-original^="Silber" i]{background:#C3C3C3}
.jtlw .rz-colorpills label[data-original^="Anthrazit" i]{background:#3A3A3C}
.jtlw .rz-colorpills label[data-original^="Schwarz" i]{background:#1C1512}
/* blues */
.jtlw .rz-colorpills label[data-original^="Blau" i]{background:#2B5CA8}
.jtlw .rz-colorpills label[data-original^="Himmelblau" i]{background:#7FB3E0}
.jtlw .rz-colorpills label[data-original^="Royal" i]{background:#1F4FBF}
.jtlw .rz-colorpills label[data-original^="Ultramarin" i]{background:#1B2E97}
.jtlw .rz-colorpills label[data-original^="Marineblau" i],
.jtlw .rz-colorpills label[data-original^="Navy" i]{background:#1B2A46}
.jtlw .rz-colorpills label[data-original^="Petrol" i]{background:#11626E}
.jtlw .rz-colorpills label[data-original^="Türkis" i],
.jtlw .rz-colorpills label[data-original^="Tuerkis" i]{background:#0F9AA0}
/* greens */
.jtlw .rz-colorpills label[data-original^="Grün" i],
.jtlw .rz-colorpills label[data-original^="Gruen" i]{background:#2E7D46}
.jtlw .rz-colorpills label[data-original^="Lime" i]{background:#8CC63E}
.jtlw .rz-colorpills label[data-original^="Wald" i]{background:#28502F}
.jtlw .rz-colorpills label[data-original^="Kiwi" i]{background:#9ACD32}
.jtlw .rz-colorpills label[data-original^="Smaragd" i]{background:#1E7A5A}
/* yellows / oranges */
.jtlw .rz-colorpills label[data-original^="Gelb" i]{background:#E8C23A}
.jtlw .rz-colorpills label[data-original^="Gold" i]{background:#C9A227}
.jtlw .rz-colorpills label[data-original^="Orange" i]{background:#E0752A}
.jtlw .rz-colorpills label[data-original^="Koralle" i]{background:#F2705B}
/* reds / pinks / purples */
.jtlw .rz-colorpills label[data-original^="Rot" i]{background:#C0342B}
.jtlw .rz-colorpills label[data-original^="Bordeaux" i]{background:#6E1F2A}
.jtlw .rz-colorpills label[data-original^="Rosa" i]{background:#E9A6B8}
.jtlw .rz-colorpills label[data-original^="Pink" i]{background:#E3268A}
.jtlw .rz-colorpills label[data-original^="Fuchsia" i]{background:#C4267F}
.jtlw .rz-colorpills label[data-original^="Magenta" i]{background:#B5197E}
.jtlw .rz-colorpills label[data-original^="Lila" i]{background:#7A4FA3}
.jtlw .rz-colorpills label[data-original^="Violett" i]{background:#5E3A8C}
.jtlw .rz-colorpills label[data-original^="Flieder" i]{background:#B49AD1}
.jtlw .rz-colorpills label[data-original^="Braun" i]{background:#7A5230}
/* compound names last: each starts with a shorter one above and must win */
.jtlw .rz-colorpills label[data-original^="Ice Grau" i]{background:#DDE1E3}
.jtlw .rz-colorpills label[data-original^="Hell Türkis" i],
.jtlw .rz-colorpills label[data-original^="Hellturkis" i]{background:#6FD0D4}
.jtlw .rz-colorpills label[data-original^="Helles Gelb" i]{background:#F3E07E}
.jtlw .rz-colorpills label[data-original^="Neongelb" i]{background:#E8FF2A}
.jtlw .rz-colorpills label[data-original^="Hellorange" i]{background:#F5A65B}
.jtlw .rz-colorpills label[data-original^="Neonorange" i]{background:#FF6A00}
.jtlw .rz-colorpills label[data-original^="Lime Grün" i]{background:#8CC63E}
.jtlw .rz-colorpills label[data-original^="Rot-Braun" i]{background:#7B3B2E}
.jtlw .rz-colorpills label[data-original^="Naturbeige" i]{background:#E0D2B6}
.jtlw .rz-colorpills label[data-original^="Petrolgrün" i]{background:#166B5F}
.jtlw .rz-colorpills label[data-original^="Multicolor" i],
.jtlw .rz-colorpills label[data-original^="Multicolour" i]{
  background:conic-gradient(#C0342B,#E0752A,#E8C23A,#2E7D46,#0F9AA0,#2B5CA8,#7A4FA3,#C0342B)}

/* ---------- four colours, then a neutral pill carrying the rest ------------- */
/* The design shows four tiles and a count pill; pressing it reveals the rest
   (prototype 379-383). The toggle is the checkbox variation.tpl emits just before
   the row, so it needs no JS, and the count comes from the value list. */
.jtlw .rz-morechk{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;
  clip-path:inset(50%)}
.jtlw .rz-colorpills .rz-sw--extra{display:none}
.jtlw .rz-morechk:checked + .form-row .rz-sw--extra,
.jtlw .rz-morechk:checked ~ .form-row .rz-sw--extra{display:block}
/* the pill: neutral, tile height, the count in mono — matching the design */
.jtlw .rz-colorpills .rz-morebtn{display:flex;align-items:center;justify-content:center;
  height:42px;min-width:42px;padding:0 12px;margin:0;border-radius:14px;
  background:var(--sand);color:var(--muted);
  font-family:var(--mono);font-size:11.5px;font-weight:400;line-height:1;cursor:pointer;
  transition:background .2s ease,color .2s ease}
.jtlw .rz-colorpills .rz-morebtn:hover{background:var(--line2);color:var(--ink)}
/* once open it has nothing left to announce */
.jtlw .rz-morechk:checked + .form-row .rz-morebtn,
.jtlw .rz-morechk:checked ~ .form-row .rz-morebtn{display:none}
