/* =============================================================================
   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)}
/* The scrim CANNOT be a negative-z pseudo-element here. .rz-added is
   position:fixed with z-index:300, so it establishes a stacking context — and
   inside one, a z-index:-1 descendant paints ABOVE the element's own background.
   The 55% overlay was therefore covering the white card, which is why
   `background:var(--surface)!important` had no visible effect and the popup read
   as a grey panel. A spread shadow paints outside the border box instead, so it
   dims the page and can never touch the card. */
.jtlw .rz-added::before{display:none!important}
.jtlw #pushed-success.rz-added,
.jtlw .rz-added{background:var(--surface)!important;color:var(--ink);
  box-shadow:var(--shadowLg)!important}
/* whatever close control the variant emits belongs in the card's top right */
.jtlw .rz-added .close,
.jtlw .rz-added [data-dismiss="modal"].close{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;float:none;border:0;border-radius:999px;
  background:var(--sand);color:var(--ink);font-size:17px;line-height:1;opacity:1;
  text-shadow:none}
@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}
/* NO margin-left:auto here. prisma-ui.css already puts one on .rz-search__hint,
   which is what walks the hint AND the button to the end as a pair. A second
   auto margin on the button does not push it further right - the flexbox rule
   is that free space is divided EQUALLY between auto margins, so the two
   halved it and the hint was left stranded a gap behind the button. */
.jtlw .rz-search button[type="submit"],
.jtlw .rz-search .btn-secondary{flex:0 0 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}

/* the reveal keys off the <dd> that holds both the checkbox and the row, so it
   does not depend on what {formrow} emits or on sibling order */
.jtlw dd:has(.rz-morechk:checked) .rz-sw--extra{display:block!important}
.jtlw dd:has(.rz-morechk:checked) .rz-morebtn{display:none!important}

/* the scrim razan.js inserts: clickable, and it cannot cover the card */
.jtlw .rz-added__scrim{position:fixed;inset:0;z-index:299;
  background:rgba(20,13,8,.55);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
.jtlw .rz-added__scrim[hidden]{display:none}
/* the close control is the card's top right corner, whatever its source order */
.jtlw .rz-added .rz-added__close{position:absolute!important;top:14px!important;
  right:14px!important;left:auto!important;bottom:auto!important;z-index:4;margin:0!important;float:none}
/* "Weiter einkaufen" is a ghost button: rz.css states it at (0,1,0) and the solid
   .jtlw .rz-btn fill at (0,2,0) beat it, leaving accent text on an accent ground —
   a pill with no readable label. Stated here at matching weight. */
.jtlw .rz-added .rz-btn--ghost,
.jtlw .rz-btn--ghost{background:var(--surface)!important;color:var(--ink)!important;
  border:1px solid var(--line2)!important}
.jtlw .rz-added .rz-btn--ghost:hover,
.jtlw .rz-btn--ghost:hover{background:var(--sand)!important;color:var(--ink)!important;
  border-color:var(--ink)!important}

/* ---------- colour name on hover, without JS -------------------------------- */
/* The tile carries no visible label, so the name has to arrive on hover. Bootstrap
   tooltips are initialised (jtl.evo.js:393) but depend on that plugin running and
   on a stylesheet this chain was missing entirely — so the name is drawn from the
   data-title JTL already puts on every swatch. No JS, no delay, and it cannot be
   switched off by an init that does not fire. The bootstrap hook is removed from
   this branch in variation.tpl so the two cannot both appear. */
.jtlw .rz-colorpills label.swatches{overflow:visible!important}
.jtlw .rz-colorpills label.swatches img{border-radius:13px}
.jtlw .rz-colorpills label.swatches::after{
  content:attr(data-title);
  position:absolute;bottom:calc(100% + 9px);left:50%;transform:translateX(-50%) translateY(2px);
  padding:7px 12px;border-radius:12px;text-align:center;
  background:var(--surface);color:var(--ink);border:1px solid var(--line);
  box-shadow:var(--shadow);
  font-family:'Outfit',system-ui,sans-serif;font-size:12px;font-weight:500;line-height:1.2;
  white-space:nowrap;letter-spacing:0;text-transform:none;
  opacity:0;pointer-events:none;z-index:30;
  transition:opacity .07s ease,transform .07s ease;transition-delay:0s}
.jtlw .rz-colorpills label.swatches:hover::after,
.jtlw .rz-colorpills label.swatches:focus-within::after{opacity:1;transform:translateX(-50%) translateY(0)}
/* a tile with no data-title must not open an empty bubble */
.jtlw .rz-colorpills label.swatches:not([data-title])::after,
.jtlw .rz-colorpills label.swatches[data-title=""]::after{content:none}

/* ---------- breadcrumb shares the page gutter ------------------------------- */
/* Measured: the trail started at x=60 while the gallery and buy column started at
   x=82. The rail rules at the top of this file zero the container padding so the
   PDP can reach --maxw, and the breadcrumb container lost its 22px with them. */
.jtlw[data-page="1"] .breadcrumb-container,
.jtlw[data-page="1"] .breadcrumb-container.container{padding-left:22px;padding-right:22px}

/* ---------- the stock row must wrap ----------------------------------------- */
/* "Frage zum Artikel" sits at the end of the row with margin-left:auto. With a
   long delivery note the line cannot fit and the link was pushed past the buy
   column. It wraps to its own line now instead of overflowing. */
.jtlw .rz-stock{flex-wrap:wrap;row-gap:6px;column-gap:10px;min-width:0}
.jtlw .rz-stock > *{min-width:0}

/* ---------- the compare action carries its label ---------------------------- */
.jtlw .rz-buy-action .rz-buy-action__label{font-size:14px;font-weight:600;color:inherit}
/* the icon has no glyph in the bundled set; the label speaks for the control */
.jtlw .rz-buy-action .fa-list-alt{display:none}

/* =============================================================================
   FULL-SCREEN IMAGE VIEWER
   productdetails/product_images_modal.tpl is a Bootstrap modal. Left to the base
   sheet it opened as a white dialog box with the page furniture still showing
   through — including the sticky buy bar across the foot, which belongs to the
   page and not to a full-screen view of one photograph.
   Redesigned as a viewer: the page goes dark, the photograph is the only thing
   lit, and the three controls sit on the scrim.
   ========================================================================== */
/* the sticky buy bar is page furniture — never over the viewer */
.jtlw:has(.rz-imgmodal.show) .rz-stickybuy,
.jtlw.modal-open .rz-stickybuy{display:none!important}

/* the modal element itself carries the ground, so no other modal is affected */
.jtlw .rz-imgmodal{background:rgba(20,13,8,.94);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.jtlw .rz-imgmodal__dialog{max-width:none;width:100%;height:100%;margin:0;
  display:flex;align-items:center;justify-content:center}
.jtlw .rz-imgmodal__content{background:none!important;border:0!important;
  box-shadow:none!important;width:100%;height:100%}
.jtlw .rz-imgmodal__body{display:flex;align-items:center;justify-content:center;
  height:100%;padding:clamp(16px,4vw,56px)}
/* the photograph: as large as the viewport allows, on its own light plate */
.jtlw .rz-imgmodal__img{max-width:100%;max-height:86vh;width:auto;height:auto;
  object-fit:contain;border-radius:18px;background:var(--surface);
  box-shadow:0 40px 90px rgba(0,0,0,.45)}

/* close, top right, on the scrim */
.jtlw .rz-imgmodal__close{position:fixed;top:22px;right:26px;z-index:6;
  display:flex;align-items:center;justify-content:center;width:44px;height:44px;
  padding:0;border:0;border-radius:999px;background:var(--scrim);color:var(--onScrim);
  font-size:20px;line-height:1;opacity:1;text-shadow:none;cursor:pointer;
  transition:transform .25s cubic-bezier(.16,1,.3,1)}
.jtlw .rz-imgmodal__close:hover{transform:scale(1.06);opacity:1}

/* prev / next: the chevron glyphs are not in the bundled icon set, so the arrow
   is drawn — the same fix the gallery expand and the pagination needed */
.jtlw .rz-imgmodal__nav{position:fixed;top:50%;transform:translateY(-50%);z-index:6;
  display:flex;align-items:center;justify-content:center;width:52px;height:52px;
  padding:0;border:0;border-radius:999px;background:var(--scrim);color:var(--onScrim);
  cursor:pointer;transition:transform .25s cubic-bezier(.16,1,.3,1),background .25s ease}
.jtlw .rz-imgmodal__prev{left:26px}
.jtlw .rz-imgmodal__next{right:26px}
.jtlw .rz-imgmodal__nav:hover{background:var(--surface);color:var(--ink)}
.jtlw .rz-imgmodal__nav .fas{font-size:0!important;display:block;width:12px;height:12px;
  border:2px solid currentColor;border-right:0;border-bottom:0}
.jtlw .rz-imgmodal__prev .fas{transform:rotate(-45deg);margin-left:4px}
.jtlw .rz-imgmodal__next .fas{transform:rotate(135deg);margin-right:4px}

@media (max-width:640px){
  .jtlw .rz-imgmodal__nav{width:44px;height:44px}
  .jtlw .rz-imgmodal__prev{left:10px}
  .jtlw .rz-imgmodal__next{right:10px}
  .jtlw .rz-imgmodal__img{max-height:74vh}
}

/* =============================================================================
   PDP AT PHONE WIDTH
   Measured at 390: the document was 437px wide, so every page scrolled sideways
   and the sticky header dragged out of frame with it. Three separate causes,
   each of them a piece of vendor markup the design never answered.
   ========================================================================== */

/* ---------- 1. the tab strip scrolls; it does not push the page -------------
   #product-tabs IS the <ul class="nav nav-tabs">, and Bootstrap gives .nav
   flex-wrap:wrap. It never wrapped, because each tab is a nowrap .nav-link with
   18px of padding on each side: Beschreibung + Produktsicherheit + Bewertungen
   measured 415px inside a 346px column, and the 69px difference is exactly the
   page's horizontal scroll. Tabs are a horizontal control, so it becomes a
   horizontal scroller rather than a wrapped stack. */
@media (max-width:767.98px){
  .jtlw #product-tabs,
  .jtlw .product-tabs .nav-tabs{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
    scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;
    /* the fade is the only hint that a tab sits past the right edge */
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 28px),transparent 100%);
    mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 28px),transparent 100%)}
  .jtlw #product-tabs::-webkit-scrollbar,
  .jtlw .product-tabs .nav-tabs::-webkit-scrollbar{display:none}
  .jtlw #product-tabs .nav-item{flex:0 0 auto;scroll-snap-align:start}
  .jtlw #product-tabs .nav-link,
  .jtlw .product-tabs .nav-tabs .nav-link{padding:13px 14px!important;font-size:14px!important;
    white-space:nowrap}
  .jtlw #product-tabs .nav-link::after,
  .jtlw .product-tabs .nav-tabs .nav-link::after{left:14px;right:14px}
}

/* ---------- 2. Bootstrap's negative gutters inside the buy card -------------
   variation.tpl and its neighbours wrap their content in {row}{col}, and a
   Bootstrap .row carries -15px margins meant to be cancelled by a .container's
   padding. The buy card is not a container, so every one of those rows hung
   16px past the card on BOTH sides — 378px of row inside a 346px box. Visible
   at any width; it just had room to hide in a 560px desktop column. The swatch
   rows already zero their own children (see .rz-colorsw > * above), so the
   gutters are all that is left to undo. */
.jtlw .rz-buy__box > .row,
.jtlw .product-info-inner > .row{margin-left:0;margin-right:0}
.jtlw .rz-buy__box > .row > [class*="col"],
.jtlw .product-info-inner > .row > [class*="col"]{padding-left:0;padding-right:0}

/* ---------- 3. the spec table sets the width of the description grid --------
   .rz-desccols collapses to a single `1fr` track under 900px, and `1fr` is
   minmax(auto,1fr) — so the track cannot go below the min-content width of its
   widest child. JTL prints characteristic values in a Bootstrap .badge, which
   is white-space:nowrap, so "65% Polyester, 35% Baumwolle" made the track 360px
   inside a 346px column and dragged the description column out with it. Both
   halves are needed: the badge has to be allowed to wrap, and the grid items
   have to be allowed to be narrower than their content. */
.jtlw .rz-desccols > *{min-width:0}
.jtlw .rz-specpanel{min-width:0}
.jtlw .rz-specpanel .badge,
.jtlw .rz-specpanel .attr-characteristic .badge{white-space:normal}
.jtlw .rz-specpanel td{overflow-wrap:anywhere}
@media (max-width:560px){
  /* a two-column spec row at 346px leaves ~120px for the value — the label
     takes its own line instead */
  .jtlw .rz-specpanel table,.jtlw .rz-specpanel tbody,.jtlw .rz-specpanel tr{display:block}
  .jtlw .rz-specpanel td{display:block;padding:0 0 4px!important;border-bottom:0!important;
    text-align:left!important}
  .jtlw .rz-specpanel tr{padding:11px 0;border-bottom:1px solid var(--line)}
  .jtlw .rz-specpanel tr:last-child{border-bottom:0}
}

/* ---------- the scroll-to-top button must not sit on the buy bar ------------
   Both are fixed to the bottom-right corner: the sticky buy bar at z-index 88,
   the floating scroll-to-top at 9980. Measured with the bar open, the button
   overlapped it at 390, 560 AND 1440 — so on every product page past the scroll
   trigger, a 48px circle sat over the "In den Warenkorb" button. The bar is the
   page's primary action and stays put; the button moves above it.

   The offsets are measured, not guessed: the bar is 79px on desktop and 110px
   at phone width once the product name is held to one line (below), and the
   button clears 20px + bar + a 12px gap. rz.css states the button's geometry at
   `.smoothscroll-top,.smoothscroll-top.scroll-to-top` (0,2,0), so :has() on the
   body class is what carries these past it. */
.jtlw:has(#rz-stickybuy:not([hidden])) .smoothscroll-top,
.jtlw:has(#rz-stickybuy:not([hidden])) .scroll-to-top{bottom:112px}
@media (max-width:560px){
  .jtlw:has(#rz-stickybuy:not([hidden])) .smoothscroll-top,
  .jtlw:has(#rz-stickybuy:not([hidden])) .scroll-to-top{bottom:142px}
}
/* a persistent bar is a reminder of what you are buying, not a second product
   title — two wrapped lines of name pushed it to 128px at 390 */
@media (max-width:560px){
  .jtlw .rz-stickybuy__name{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;
    overflow:hidden}
}
/* rz.css intends a 44px button inset 14px below 640px, but states it at
   `.smoothscroll-top` (0,1,0) while its own base rule is (0,2,0) — so the
   smaller mobile button never applied. Restated at a weight that lands. */
@media (max-width:640px){
  .jtlw .smoothscroll-top,.jtlw .smoothscroll-top.scroll-to-top,
  .jtlw .scroll-to-top{right:14px;width:44px;height:44px}
}

/* ============================================================================
   FRAGE ZUM ARTIKEL - the product-question form
   Rebuilt in productdetails/question_on_item.tpl: question first, contact
   second, as two numbered steps. It had no bespoke styling at all before -
   stock Bootstrap fieldsets and <legend>s - so this is the whole surface.
   Renders in two places: the PDP tab panel and the modal (setting 'P'), which
   is why every width here is fluid and the grid collapses on its own.
   ========================================================================== */
.jtlw .rz-qform{max-width:760px}
.jtlw .rz-qform--popup{max-width:none}

/* --- what you are asking about --- */
.jtlw .rz-qform__ctx{display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 22px;
  border:1px solid var(--line);border-radius:16px;background:var(--sand)}
.jtlw .rz-qform__ctx-img{flex:0 0 56px;width:56px;height:56px;border-radius:12px;
  background:var(--surface);overflow:hidden}
.jtlw .rz-qform__ctx-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.jtlw .rz-qform__ctx-ey{font-family:var(--mono);font-size:10px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted)}
.jtlw .rz-qform__ctx-name{font-weight:600;font-size:15px;color:var(--ink);line-height:1.35}
.jtlw .rz-qform__ctx-sku{font-family:var(--mono);font-size:11px;color:var(--muted)}

/* --- one error summary, at the top where it is read ---
   NOT var(--redSoft): that token is #000000 in the light palette
   (prisma-ui.css:20), so a banner using it paints solid black. Left the token
   alone rather than retuning something eight other components already read;
   --sand is the fallback for engines without color-mix(). */
.jtlw .rz-qform__err{display:flex;align-items:center;gap:10px;margin:0 0 18px;padding:12px 14px;
  border:1px solid var(--red);border-radius:14px;color:var(--red);
  font-size:13.5px;font-weight:600;
  background:var(--sand);
  background:color-mix(in srgb,var(--red) 12%,transparent)}
.jtlw .rz-qform__err-ic{flex:0 0 20px;width:20px;height:20px;border-radius:50%;background:var(--red);
  color:var(--onRed);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}

/* --- the two steps --- */
.jtlw .rz-qform fieldset.rz-qstep{border:0;margin:0 0 26px;padding:0;min-width:0}
.jtlw .rz-qstep__head{display:flex;align-items:baseline;flex-wrap:wrap;gap:10px;width:auto;
  margin:0 0 14px;padding:0;border:0;font-size:inherit;line-height:1.3}
.jtlw .rz-qstep__no{font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--red)}
.jtlw .rz-qstep__ttl{font-family:var(--head);font-weight:700;font-size:18px;color:var(--ink)}
.jtlw .rz-qstep__note{font-size:12.5px;color:var(--muted);font-weight:400}

/* --- fields ---
   The {formgroup} macro emits the <label> AFTER its control, so without this the
   captions land under (or beside) their fields - the same trap prisma-checkout.css
   documents for the shipping estimator. Pin the order for this form. */
.jtlw .rz-qform .form-group,
.jtlw .rz-qform .form-group:has(> .form-control + label),
.jtlw .rz-qform .form-group:has(> .custom-select + label),
.jtlw .rz-qform .form-group:has(> select + label),
.jtlw .rz-qform .form-group:has(> textarea + label){display:flex;flex-direction:column-reverse;
  align-items:stretch;gap:6px;margin:0}
.jtlw .rz-qform .form-group > label,
.jtlw .rz-qfield > label{margin:0;font-size:12.5px;font-weight:600;color:var(--ink2);line-height:1.3}
.jtlw .rz-qform .form-group > label .optional,
.jtlw .rz-qfield > label .optional{font-weight:400;color:var(--muted)}

.jtlw .rz-qform .form-control,
.jtlw .rz-qform .custom-select,
.jtlw .rz-qform select,
.jtlw .rz-qform textarea{width:100%;height:auto;padding:11px 14px;border:1px solid var(--line2);
  border-radius:12px;background:var(--surface);color:var(--ink);font-size:14px;
  font-family:'Outfit',sans-serif;box-shadow:none;appearance:none;-webkit-appearance:none}
.jtlw .rz-qform .custom-select,
.jtlw .rz-qform select{padding-right:34px;
  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),
    linear-gradient(135deg,var(--muted) 50%,transparent 50%);
  background-position:calc(100% - 18px) calc(50% + 1px),calc(100% - 13px) calc(50% + 1px);
  background-size:5px 5px,5px 5px;background-repeat:no-repeat}
.jtlw .rz-qform .form-control:focus,
.jtlw .rz-qform select:focus,
.jtlw .rz-qform textarea:focus{border-color:var(--ink);outline:none;box-shadow:none}
.jtlw .rz-qform textarea{min-height:150px;line-height:1.55;resize:vertical}

/* the message field is a step of its own, so it carries its own label + hint */
.jtlw .rz-qfield--msg{display:flex;flex-direction:column;gap:6px}
.jtlw .rz-qfield--msg > label{order:-1}
.jtlw .rz-qform__hint{margin:2px 0 0;font-size:12.5px;color:var(--muted);line-height:1.5}

/* errors read as errors */
.jtlw .rz-qform .has-error .form-control,
.jtlw .rz-qform .has-error textarea,
.jtlw .rz-qform textarea.has-error,
.jtlw .rz-qform .has-error select{border-color:var(--red)}
.jtlw .rz-qform .form-error-msg{order:-1;font-size:12.5px;font-weight:600;color:var(--red)}

/* --- the contact grid. auto-fit, so a shop that switches most fields off gets a
     packed row instead of the stock md=6 columns' half-empty one. --- */
.jtlw .rz-qgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:16px}
.jtlw .rz-qcell{min-width:0}
.jtlw .rz-qcell--full{grid-column:1/-1}
.jtlw .rz-qcell--sm{grid-column:span 1;max-width:220px}

/* --- consent + captcha --- */
.jtlw .rz-qform__consent{margin:0 0 18px}
.jtlw .rz-qform__consent:empty{display:none}
.jtlw .rz-qform__captcha{margin:0 0 18px}
.jtlw .rz-qform__captcha.has-error{border-left:2px solid var(--red);padding-left:12px}

/* --- footer: privacy left, submit right (was a full-width block button) ---
   razan.css pins .btn-primary to background:var(--ink)!important, which no
   amount of specificity beats - the same fight prisma-checkout.css documents,
   so the accent has to be re-asserted with !important here too. */
.jtlw .rz-qform__foot{display:flex;align-items:center;justify-content:space-between;gap:16px;
  flex-wrap:wrap;padding-top:20px;border-top:1px solid var(--line)}
.jtlw .rz-qform__privacy{margin:0;font-size:12.5px;color:var(--muted)}
.jtlw .rz-qform__privacy a{color:var(--muted);text-decoration:underline}
.jtlw .rz-qform__privacy a:hover{color:var(--red)}
.jtlw .rz-qform .rz-qform__submit{width:auto;min-width:200px;padding:13px 26px;border-radius:999px;
  background:var(--red)!important;border:1px solid var(--red)!important;font-size:14px;
  font-weight:700;white-space:nowrap}
.jtlw .rz-qform .rz-qform__submit,
.jtlw .rz-qform .rz-qform__submit:hover{color:var(--onRed)!important}
.jtlw .rz-qform .rz-qform__submit:hover{filter:brightness(1.06)}

@media (max-width:560px){
  .jtlw .rz-qgrid{grid-template-columns:1fr}
  .jtlw .rz-qcell--sm{max-width:none}
  .jtlw .rz-qform__foot{flex-direction:column-reverse;align-items:stretch}
  .jtlw .rz-qform .rz-qform__submit{width:100%;min-width:0}
  .jtlw .rz-qform__privacy{text-align:center}
  .jtlw .rz-qform__ctx{gap:12px;padding:10px 12px}
}
