/* =============================================================================
   Product page — premium layer  (v34, 2026-09-02)
   Additive stylesheet loaded after theme.css from templates/catalog/product.tpl.
   The base theme keeps working if this file is removed.

   Direction: "Minimalism & Swiss Style" — spacious grid, hairline structure,
   high-contrast type, restrained depth. Brand tokens (pink #d50075 / Playfair +
   Inter) come from the site-wide system already defined in theme.css.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   0. Playfair Display webfont
   theme.css references 'Playfair Display' in several places but never actually
   loads it, so every serif accent on the site silently fell back to the generic
   `serif` face. These are the self-hosted latin/latin-ext variable subsets.
   (Same @font-face block can be moved to theme-premium.css to fix it site-wide.)
   ------------------------------------------------------------------------ */
@font-face {
  font-family: 'Playfair Display';
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/playfair-display-latin-normal.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Playfair Display';
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/playfair-display-latin-ext-normal.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Playfair Display';
  font-style: italic;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/playfair-display-latin-italic.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Playfair Display';
  font-style: italic;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/playfair-display-latin-ext-italic.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ---------------------------------------------------------------------------
   1. Tokens (scoped to the product page so nothing else can inherit them)
   ------------------------------------------------------------------------ */
.page-product {
  --sk-brand: #d50075;
  --sk-brand-dark: #9e0056;
  --sk-brand-tint: #fef0f7;
  --sk-brand-tint-2: #fce7f2;
  --sk-ink: #1a0010;
  --sk-body: #4b4550;
  --sk-muted: #756e7d;
  --sk-border: #ebe5ed;
  --sk-border-strong: #ddd3e0;
  --sk-surface: #ffffff;
  --sk-surface-2: #faf7fa;
  --sk-ok: #0f7a45;
  --sk-ok-tint: #eaf6ef;
  --sk-warn: #9a6400;
  --sk-warn-tint: #fdf5e3;

  /* spacious scale (density dial 3/10) */
  --sk-2: 8px;   --sk-3: 12px;  --sk-4: 16px;  --sk-5: 24px;
  --sk-6: 32px;  --sk-7: 48px;  --sk-8: 64px;  --sk-9: 96px;

  --sk-r-sm: 10px; --sk-r-md: 14px; --sk-r-lg: 20px; --sk-r-pill: 999px;

  --sk-shadow-sm: 0 1px 2px rgba(26, 0, 16, .05);
  --sk-shadow-md: 0 2px 6px rgba(26, 0, 16, .06), 0 10px 28px rgba(26, 0, 16, .05);
  --sk-shadow-cta: 0 6px 18px rgba(213, 0, 117, .26);

  --sk-dur: 220ms;
  --sk-ease: cubic-bezier(.2, .7, .3, 1);

  --sk-serif: 'Playfair Display', Georgia, 'Times New Roman', serif;
}

/* Consistent, visible keyboard focus everywhere on this page. */
.page-product a:focus-visible,
.page-product button:focus-visible,
.page-product input:focus-visible,
.page-product [tabindex]:focus-visible,
.page-product .thumbnail:focus-visible {
  outline: 2px solid var(--sk-brand);
  outline-offset: 2px;
  border-radius: 4px;
}

/* ---------------------------------------------------------------------------
   2. Page rhythm
   ------------------------------------------------------------------------ */
.page-product .js-product-container {
  margin-top: var(--sk-5);
  margin-bottom: var(--sk-6);
}

/* ---------------------------------------------------------------------------
   3. Gallery
   ------------------------------------------------------------------------ */
.product__images .carousel {
  background: var(--sk-surface);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-lg);
  box-shadow: var(--sk-shadow-md);
  overflow: hidden;
}

.product__images .carousel-inner { padding: var(--sk-2); }

.product__images .carousel-item img {
  border-radius: var(--sk-r-md);
  /* images are square 720x720 with width/height attributes, so no CLS —
     the ratio is restated here in case a non-square source is uploaded later */
  aspect-ratio: 1 / 1;
  object-fit: contain;
  width: 100%;
  height: auto;
}

/* Belt-and-braces: guarantee only the active slide is ever visible, independent of
   whether Bootstrap's own carousel JS has initialised yet. Without this, a slow or
   blocked script can leave every slide stacked and visible instead of behaving
   like a carousel. */
.js-product-carousel .carousel-item:not(.active),
.js-product-images-modal-carousel .carousel-item:not(.active) {
  display: none !important;
}

@keyframes sktCarouselFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.js-product-carousel .carousel-item.active,
.js-product-images-modal-carousel .carousel-item.active {
  animation: sktCarouselFadeIn 0.3s var(--sk-ease);
}

/* "New" / "Sale" flags */
.product__images .product-flags {
  position: absolute;
  top: var(--sk-4);
  left: var(--sk-4);
  z-index: 3;
  display: flex;
  flex-direction: column;
  gap: var(--sk-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.product__images .product-flags .badge {
  display: inline-flex;
  align-items: center;
  padding: 7px 14px;
  border-radius: var(--sk-r-pill);
  background: var(--sk-brand);
  color: #fff;
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  box-shadow: 0 2px 8px rgba(213, 0, 117, .3);
}

.product__images .product-flags .badge.discount,
.product__images .product-flags .badge.on-sale {
  background: var(--sk-ink);
  box-shadow: 0 2px 8px rgba(26, 0, 16, .25);
}

/* Prev / next controls — 48px hit area, revealed on hover for pointer devices,
   always visible where hover doesn't exist. */
.product__images .carousel-control-prev,
.product__images .carousel-control-next {
  width: 48px;
  height: 48px;
  top: 50%;
  bottom: auto;
  transform: translateY(-50%);
  background-color: rgba(255, 255, 255, .95);
  border: 1px solid var(--sk-border);
  border-radius: 50%;
  opacity: 0;
  transition: opacity var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
  box-shadow: var(--sk-shadow-sm);
}

.product__images .carousel-control-prev { left: var(--sk-4); }
.product__images .carousel-control-next { right: var(--sk-4); }

@media (hover: hover) {
  .product__images .carousel:hover .carousel-control-prev,
  .product__images .carousel:hover .carousel-control-next {
    opacity: 1;
  }
  .product__images .carousel-control-prev:hover,
  .product__images .carousel-control-next:hover {
    background-color: #fff;
    box-shadow: var(--sk-shadow-md);
  }
}

@media (hover: none), (pointer: coarse) {
  .product__images .carousel-control-prev,
  .product__images .carousel-control-next { opacity: 1; }
}

.product__images .carousel-control-prev:focus-visible,
.product__images .carousel-control-next:focus-visible { opacity: 1; }

.product__images .carousel-control-prev-icon,
.product__images .carousel-control-next-icon {
  width: 1.1rem;
  height: 1.1rem;
  filter: invert(1) grayscale(100);
}

/* Zoom opener */
.product__images__modal-opener {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .95);
  border: 1px solid var(--sk-border);
  box-shadow: var(--sk-shadow-sm);
  cursor: pointer;
  opacity: 1;
  transition: transform var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .product__images__modal-opener:hover {
    transform: scale(1.06);
    box-shadow: var(--sk-shadow-md);
  }
}

.product__images__modal-opener .material-icons { color: var(--sk-ink); }

/* Thumbnail rail
   NOTE: the active-thumbnail indicator is deliberately left to the base theme
   (a blue border on the <img> itself). A second, pink ring was removed here on
   explicit request — do not re-add one. */
.thumbnails__container { margin-top: var(--sk-4); }

.thumbnails__list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sk-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.thumbnails__list .thumbnail {
  cursor: pointer;
  border-radius: var(--sk-r-sm);
  overflow: hidden;
  opacity: .68;
  transition: opacity var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .thumbnails__list .thumbnail:hover { opacity: 1; }
}

.thumbnails__list .thumbnail.active { opacity: 1; }

/* ---------------------------------------------------------------------------
   4. Buy column
   ------------------------------------------------------------------------ */
.page-product .product__col { padding-top: var(--sk-2); }

/* Eyebrow: brand + reference */
.product__eyebrow {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sk-2) var(--sk-3);
  margin-bottom: var(--sk-3);
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
}

.product__eyebrow-brand { color: var(--sk-brand); }

.product__eyebrow-ref {
  position: relative;
  padding-left: var(--sk-3);
  color: var(--sk-muted);
  font-weight: 500;
  letter-spacing: .06em;
}

.product__eyebrow-brand + .product__eyebrow-ref::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 3px;
  height: 3px;
  margin-top: -1.5px;
  border-radius: 50%;
  background: var(--sk-border-strong);
}

/* Title — Inter, tightened. Beats the theme's `.h4` sizing. */
.page-product h1.product__name,
.page-product .product__name {
  margin: 0 0 var(--sk-4);
  color: var(--sk-ink);
  font-size: clamp(1.625rem, 1.15rem + 1.5vw, 2.25rem);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -.02em;
  text-wrap: balance;
}

/* Price block */
.page-product .product__prices {
  margin: 0 0 var(--sk-4);
  padding: var(--sk-4) var(--sk-5);
  background: var(--sk-brand-tint);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  font-size: 1rem;
}

.page-product .product__prices .prices__wrapper { margin-bottom: 0 !important; }

.page-product .product__current-price,
.page-product .product__current-price .current-price {
  color: var(--sk-ink);
  font-size: clamp(1.75rem, 1.4rem + 1.1vw, 2.125rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.02em;
}

.page-product .product__regular-price,
.page-product .product__discount {
  color: var(--sk-muted);
  font-size: 1rem;
}

.page-product .product__tax-info,
.page-product .product__tax-label {
  color: var(--sk-muted);
  font-size: .8125rem;
  font-weight: 500;
  letter-spacing: .01em;
}

/* Stock pill */
.product__stock {
  display: inline-flex;
  align-items: center;
  gap: var(--sk-2);
  margin: 0 0 var(--sk-4);
  padding: 6px 14px 6px 12px;
  border-radius: var(--sk-r-pill);
  font-size: .8125rem;
  font-weight: 600;
  letter-spacing: .01em;
}

.product__stock-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: currentColor;
  flex: none;
}

.product__stock--in_stock {
  background: var(--sk-ok-tint);
  color: var(--sk-ok);
}

.product__stock--last_remaining_items {
  background: var(--sk-warn-tint);
  color: var(--sk-warn);
}

.product__stock--out_of_stock,
.product__stock--available_later {
  background: #f6f4f7;
  color: var(--sk-muted);
}

/* Short description */
.page-product .product__description-short {
  margin-bottom: var(--sk-5);
  color: var(--sk-body);
  font-size: 1rem;
  line-height: 1.7;
}

.page-product .product__description-short p:last-child { margin-bottom: 0; }
.page-product .product__description-short strong { color: var(--sk-ink); }

/* Actions */
.page-product .product__actions {
  margin-top: 0;
  padding-top: var(--sk-5);
  border-top: 1px solid var(--sk-border);
}

/* Quantity stepper — 48px targets, one pill.
   Shape matches the quick view and the listing card (defined in
   theme-premium.css); this file only sets the product page's larger targets.
   The input's left/right hairlines are gone with it — inside a pill they cut the
   curve into three segments, which is what made this read as three boxes pushed
   together rather than one control. */
.product-actions__quantity .input-group {
  border: 1px solid var(--sk-border-strong);
  border-radius: var(--sk-r-pill);
  overflow: hidden;
  background: var(--sk-surface);
  margin-bottom: 0 !important;
}

.product-actions__quantity .input-group .btn {
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--sk-ink);
  transition: background-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .product-actions__quantity .input-group .btn:hover { background: var(--sk-brand-tint); }
}

.product-actions__quantity .js-quantity-wanted {
  width: 56px;
  min-width: 56px;
  height: 48px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--sk-ink);
  text-align: center;
  font-size: 1rem;
  font-weight: 600;
  font-variant-numeric: lining-nums tabular-nums;
  box-shadow: none;
}

.product-actions__quantity .js-quantity-wanted:focus {
  outline: 2px solid var(--sk-brand);
  outline-offset: -2px;
  box-shadow: none;
}

/* Add to cart */
.product-actions__button .add-to-cart {
  width: 100%;
  min-height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sk-2);
  padding: 0 var(--sk-5);
  border-radius: var(--sk-r-sm);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: .01em;
  box-shadow: var(--sk-shadow-cta);
  transition: transform var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .product-actions__button .add-to-cart:hover {
    transform: translateY(-1px);
    box-shadow: 0 10px 24px rgba(213, 0, 117, .32);
  }
}

.product-actions__button .add-to-cart:active { transform: translateY(0); }

.product-actions__button .add-to-cart[disabled] {
  box-shadow: none;
  opacity: .55;
}

/* Wishlist */
/* NOTE: blockwishlist's JS replaces the `.wishlist-button` wrapper with a bare
   `<button class="wishlist-button-add wishlist-button-product">`. Rules must
   target the button class directly — anything scoped inside the wrapper only
   applies for the split second before the module initialises. */
.page-product .wishlist-button-add,
.page-product .wishlist-button button {
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--sk-border-strong);
  border-radius: var(--sk-r-sm);
  background: var(--sk-surface);
  color: var(--sk-ink);
  transition: border-color var(--sk-dur) var(--sk-ease),
              color var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .page-product .wishlist-button-add:hover,
  .page-product .wishlist-button button:hover {
    border-color: var(--sk-brand);
    background: var(--sk-brand-tint);
    color: var(--sk-brand);
  }
}

/* Share */
.page-product .product__additional-info { margin-top: var(--sk-5); }

.page-product .social-sharing {
  display: flex;
  align-items: center;
  gap: var(--sk-3);
  flex-wrap: wrap;
}

.page-product .social-sharing > span {
  color: var(--sk-muted);
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
}

.page-product .social-sharing ul {
  display: flex;
  align-items: center;
  gap: var(--sk-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* The theme paints each network's glyph as a background-image on the <li>, so
   only background-color may be set here — the `background` shorthand would blank
   the icons out. background-size is narrowed so the glyph sits inside the ring
   instead of filling it. */
.page-product .social-sharing ul li {
  width: 40px;
  height: 40px;
  margin-right: 0;
  border-radius: 50%;
  border: 1px solid var(--sk-border);
  background-color: var(--sk-surface);
  background-size: 18px 18px;
  background-repeat: no-repeat;
  transition: border-color var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .page-product .social-sharing ul li:hover {
    border-color: var(--sk-brand);
    background-color: var(--sk-brand-tint);
  }
}

/* ---------------------------------------------------------------------------
   5. Trust panel  (displayReassurance, moved into the buy column)
   Root class is .blockreassurance_product — the module renders
   displayBlockProduct.tpl, not blockreassurance.tpl.
   ------------------------------------------------------------------------ */
.product__trust {
  margin-top: var(--sk-5);
  padding-top: var(--sk-5);
  border-top: 1px solid var(--sk-border);
}

.page-product .blockreassurance_product {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-4);
  padding: 0;
  margin: 0;
}

.page-product .blockreassurance_product > div {
  display: flex;
  align-items: center;
  gap: var(--sk-3);
  min-height: 0;
}

.page-product .blockreassurance_product .item-product {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--sk-brand-tint);
}

.page-product .blockreassurance_product .item-product img,
.page-product .blockreassurance_product .item-product svg {
  width: 20px;
  height: 20px;
}

.page-product .blockreassurance_product .item-product svg path:not([fill="none"]),
.page-product .blockreassurance_product .item-product svg g[fill]:not([fill="none"]) {
  fill: var(--sk-brand) !important;
}

.page-product .blockreassurance_product .item-product svg [stroke]:not([stroke="none"]) {
  stroke: var(--sk-brand) !important;
}

/* the module prints an inline style="color:#000000" on this <p> */
.page-product .blockreassurance_product .block-title {
  margin: 0;
  color: var(--sk-ink) !important;
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.4;
}

.page-product .blockreassurance_product .clearfix { display: none; }

/* ---------------------------------------------------------------------------
   6. Information section (full width)
   ------------------------------------------------------------------------ */
.product__tabs-row {
  margin-top: var(--sk-7);
}

.page-product .product__infos.accordion .accordion-item {
  border: 0;
  border-bottom: 1px solid var(--sk-border);
  background: transparent;
}

.page-product .product__infos.accordion .accordion-item:first-child {
  border-top: 1px solid var(--sk-border);
}

.page-product .product__infos .accordion-button {
  padding: var(--sk-5) 0;
  background: transparent;
  color: var(--sk-ink);
  font-size: 1.125rem;
  font-weight: 600;
  letter-spacing: -.01em;
  box-shadow: none;
  transition: color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .page-product .product__infos .accordion-button:hover { color: var(--sk-brand); }
}

.page-product .product__infos .accordion-button:not(.collapsed) {
  background: transparent;
  color: var(--sk-brand);
  box-shadow: none;
}

.page-product .product__infos .accordion-button::after {
  width: 1rem;
  height: 1rem;
  background-size: 1rem;
}

.page-product .product__infos .accordion-body {
  padding: 0 0 var(--sk-7);
}

/* ---------------------------------------------------------------------------
   7. Rich-text description
   Applies to every product description in the catalogue, so the rules stay
   generic: measure control for prose, full-width treatment for structure.
   ------------------------------------------------------------------------ */
.page-product .product__description {
  color: var(--sk-body);
  font-size: 1rem;
  line-height: 1.75;
}

/* Prose keeps a comfortable measure; structural blocks below opt back out. */
.page-product .product__description > p,
.page-product .product__description > h4 {
  max-width: 68ch;
}

.page-product .product__description > p {
  margin: 0 0 var(--sk-4);
}

.page-product .product__description h2 {
  max-width: 22ch;
  margin: var(--sk-7) 0 var(--sk-4);
  color: var(--sk-ink);
  font-family: var(--sk-serif);
  font-size: clamp(1.75rem, 1.3rem + 1.6vw, 2.5rem);
  font-weight: 600;
  font-variant-numeric: lining-nums proportional-nums;
  line-height: 1.15;
  letter-spacing: -.01em;
  text-wrap: balance;
}

.page-product .product__description > h2:first-child,
.page-product .product__description > *:first-child + h2 {
  margin-top: 0;
}

.page-product .product__description h3 {
  position: relative;
  margin: var(--sk-7) 0 var(--sk-5);
  padding-bottom: var(--sk-3);
  color: var(--sk-ink);
  font-size: clamp(1.25rem, 1.1rem + .5vw, 1.5rem);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -.01em;
}

.page-product .product__description h3::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 44px;
  height: 3px;
  border-radius: 2px;
  background: var(--sk-brand);
}

.page-product .product__description strong { color: var(--sk-ink); font-weight: 600; }

.page-product .product__description a {
  color: var(--sk-brand);
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}

.page-product .product__description img {
  max-width: 100%;
  height: auto;
  border-radius: var(--sk-r-md);
}

/* Bulleted benefit lists → two-column check grid on wide viewports */
.page-product .product__description ul {
  margin: 0 0 var(--sk-5);
  padding: 0;
  list-style: none;
}

.page-product .product__description ul > li {
  position: relative;
  margin: 0 0 var(--sk-3);
  padding-left: 34px;
  color: var(--sk-body);
  line-height: 1.6;
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
}

.page-product .product__description ul > li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .18em;
  width: 20px;
  height: 20px;
  background-repeat: no-repeat;
  background-size: 20px 20px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='9.25' fill='%23fef0f7'/%3E%3Cpath d='M5.9 10.4l2.7 2.7 5.5-5.9' fill='none' stroke='%23d50075' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

@media (min-width: 992px) {
  .page-product .product__description ul {
    columns: 2;
    column-gap: var(--sk-7);
  }
}

.page-product .product__description ol { margin: 0 0 var(--sk-5); padding-left: 1.25rem; }
.page-product .product__description ol > li { margin-bottom: var(--sk-3); }

/* ---- Promo strip -------------------------------------------------------
   The Janmashtami banner in this product's stored HTML carries an inline
   `color:#fff` with no background of its own, so it rendered white-on-white
   and was invisible on the page. Both selectors below give it its ground back:
   `.rt-promo` is added by product-premium.js, the attribute selector is the
   no-JS fallback that matches the inline style directly. */
.page-product .product__description .rt-promo,
.page-product .product__description > div[style*="color:#fff"],
.page-product .product__description > div[style*="color: #fff"] {
  max-width: none;
  margin: 0 0 var(--sk-6) !important;
  padding: var(--sk-5) var(--sk-6) !important;
  border-radius: var(--sk-r-lg);
  background: linear-gradient(120deg, #d50075 0%, #9e0056 62%, #6d0039 100%);
  color: #fff;
  box-shadow: 0 10px 30px rgba(157, 0, 86, .22);
}

.page-product .product__description .rt-promo > div:first-child,
.page-product .product__description > div[style*="color:#fff"] > div:first-child {
  color: var(--sk-gold, #ffce54);
  font-weight: 600;
}

.page-product .product__description .rt-promo *,
.page-product .product__description > div[style*="color:#fff"] * {
  max-width: none;
}

/* ---- Tables ------------------------------------------------------------
   Stored descriptions carry inline padding/border on their cells, so the few
   cosmetic properties below need !important to land. Widths and alignment are
   deliberately left to the source markup. */
/* The wrapper only provides the scroll port — all visible chrome lives on the
   table itself, so a table narrower than the wrapper (they carry their own
   inline widths) can't leave a stranded border hanging off to the side. */
.rt-table {
  max-width: 100%;
  margin: 0 0 var(--sk-5);
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

.page-product .product__description table {
  margin: 0 !important;
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  border-collapse: separate;
  border-spacing: 0;
  background: var(--sk-surface);
  box-shadow: var(--sk-shadow-sm);
  font-size: .9375rem;
}

/* border-collapse:separate is required for the radius above to render, which
   means the corners have to be rounded on the corner cells too. */
.page-product .product__description table thead tr:first-child th:first-child,
.page-product .product__description table tbody tr:first-child td:first-child { border-top-left-radius: var(--sk-r-md); }
.page-product .product__description table thead tr:first-child th:last-child,
.page-product .product__description table tbody tr:first-child td:last-child { border-top-right-radius: var(--sk-r-md); }
.page-product .product__description table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--sk-r-md); }
.page-product .product__description table tbody tr:last-child td:last-child { border-bottom-right-radius: var(--sk-r-md); }

.page-product .product__description table th,
.page-product .product__description table td {
  padding: 14px 18px !important;
  border: 0 !important;
  border-bottom: 1px solid var(--sk-border) !important;
  vertical-align: middle;
}

.page-product .product__description table th {
  background: var(--sk-brand-tint) !important;
  color: var(--sk-ink);
  font-size: .75rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  white-space: nowrap;
}

.page-product .product__description table td { color: var(--sk-body); }
.page-product .product__description table tbody tr:last-child td { border-bottom: 0 !important; }

@media (hover: hover) {
  .page-product .product__description table tbody tr {
    transition: background-color var(--sk-dur) var(--sk-ease);
  }
  .page-product .product__description table tbody tr:hover { background: var(--sk-surface-2); }
}

/* ---- FAQ ---------------------------------------------------------------
   An <h4> immediately followed by a <p> is treated as a question/answer pair
   and drawn as one card. product-premium.js additionally groups consecutive
   pairs into a two-column grid; the styling below stands on its own if that
   script never runs. */
.rt-faq {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-4);
  margin-bottom: var(--sk-5);
}

@media (min-width: 992px) {
  .rt-faq { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sk-5); }
}

.rt-faq__item {
  padding: var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
  transition: border-color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .rt-faq__item:hover {
    border-color: var(--sk-border-strong);
    box-shadow: var(--sk-shadow-md);
  }
}

.page-product .product__description .rt-faq__item h4 {
  max-width: none;
  margin: 0 0 var(--sk-3);
  color: var(--sk-ink);
  font-size: 1.0625rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: -.005em;
}

.page-product .product__description .rt-faq__item p {
  max-width: none;
  margin: 0;
  color: var(--sk-body);
  font-size: .9375rem;
  line-height: 1.7;
}

/* Ungrouped fallback (no JS): still reads as a card. */
.page-product .product__description > h4 {
  margin: var(--sk-4) 0 0;
  padding: var(--sk-5) var(--sk-5) 0;
  border: 1px solid var(--sk-border);
  border-bottom: 0;
  border-radius: var(--sk-r-md) var(--sk-r-md) 0 0;
  background: var(--sk-surface);
  color: var(--sk-ink);
  font-size: 1.0625rem;
  font-weight: 600;
  line-height: 1.35;
}

.page-product .product__description > h4 + p {
  max-width: none;
  margin: 0 0 var(--sk-3);
  padding: var(--sk-3) var(--sk-5) var(--sk-5);
  border: 1px solid var(--sk-border);
  border-top: 0;
  border-radius: 0 0 var(--sk-r-md) var(--sk-r-md);
  background: var(--sk-surface);
  font-size: .9375rem;
}

/* ---------------------------------------------------------------------------
   8. Product details table
   ------------------------------------------------------------------------ */
.page-product .product__details {
  margin: 0;
  padding: 0;
  background: transparent;
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  overflow: hidden;
  list-style: none;
  max-width: 720px;
}

.page-product .product__details .detail {
  display: flex;
  align-items: center;
  gap: var(--sk-4);
  padding: var(--sk-4) var(--sk-5);
  border-bottom: 1px solid var(--sk-border);
}

.page-product .product__details .detail:last-child { border-bottom: 0; }
.page-product .product__details .detail:nth-child(odd) { background: var(--sk-surface-2); }

.page-product .product__details .detail__left { width: 40%; flex: none; }

.page-product .product__details .detail__title {
  color: var(--sk-muted);
  font-size: .8125rem;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
}

.page-product .product__details .detail__right {
  color: var(--sk-ink);
  font-size: .9375rem;
  font-weight: 500;
}

/* The brand link fell through to Bootstrap's stock link blue (#0d6efd), which
   is the one off-brand colour left in this panel. */
.page-product .product__details .detail__right a {
  color: var(--sk-brand);
  font-weight: 600;
  text-decoration-color: rgba(213, 0, 117, .35);
  text-underline-offset: 3px;
}

@media (hover: hover) {
  .page-product .product__details .detail__right a:hover { color: var(--sk-brand-dark); }
}

.page-product .product__details .detail__manufacturer-logo {
  max-height: 40px;
  width: auto;
}

/* =============================================================================
   9. Reviews  (rebuilt v11, 2026-08-30)

   Covers the whole reviews experience on the product page: the section header
   and rating summary, the empty state, review cards, pagination, the
   "Write your review" dialog and the alert/confirm dialogs that follow it.

   ---------------------------------------------------------------------------
   Specificity, because this component has THREE stylesheets stacked under it
   ---------------------------------------------------------------------------
   1. `modules/productcomments/views/css/productcomments.css` — the module's own,
      2016-vintage (`#6b868f` slate, 2px radii, PNG sprite stars).
   2. Hummingbird's OWN productcomments SCSS, compiled into
      `assets/cache/theme-<hash>.css`. This is the one that matters: it writes
      selectors like
        `.page-product #post-product-comment-modal #criterions_list .criterion-rating`
      at specificity (2,2,0), and re-declares the star sprite as an inlined
      base64 `background-image: … !important`.
   3. This file, which loads last.

   So a plain `.page-product .sk-rv-…` (0,2,0) rule silently loses to the theme
   bundle. Every selector below that overlaps one of the theme's carries enough
   weight to beat it outright rather than winning on source order — ties are how
   this stops working the next time the theme cache is regenerated.

   The star sprite is the one place `!important` is unavoidable: the bundle marks
   `background-image` important at (0,1,1), so turning it off needs `!important`
   at higher specificity.
   ------------------------------------------------------------------------ */

.page-product {
  /* Gold, not brand pink. A star rating is a convention before it is a brand
     surface, and pink stars read as decoration rather than as a score. This is
     the same amber family as the theme's `--sk-accent` gold. */
  --sk-star: #e29c00;
  --sk-star-hi: #f5b731;
  --sk-star-off: #ded6e1;
  --sk-star-size: 20px;

  --sk-star-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2.4l2.94 5.96 6.58.96-4.76 4.64 1.12 6.55L12 17.42l-5.88 3.09 1.12-6.55-4.76-4.64 6.58-.96z'/%3E%3C/svg%3E");
}

/* ---- 9a. Star rendering ------------------------------------------------
   The sprite is a 20px PNG served at 1x, so it is soft on every retina screen
   and its grey/gold are fixed. Both layers are redrawn as a masked vector.

   The module builds a partial star for fractional averages by giving ONE star
   an inline `width` (computed against a hard-coded 20px), stacking a full-star
   layer over an empty-star layer. That still works here:

     - the empty layer is forced back to five uniform stars, so it is a complete
       grey rail whatever the module wrote inline;
     - the full layer keeps its inline width, and `mask-position: left` means a
       narrower box shows the LEFT part of the star rather than a squashed one.

   `--sk-star-size` therefore stays at the module's 20px anywhere a fraction can
   appear. Only the interactive rating in the dialog — always a whole number —
   is enlarged.
   ------------------------------------------------------------------------ */
@supports ((-webkit-mask-image: url("#a")) or (mask-image: url("#a"))) {
  .page-product .grade-stars .star-content div.star,
  .page-product .grade-stars .star-content div.star-on,
  .page-product .grade-stars .star-content div.star-hover {
    background-image: none !important;
    background-color: var(--sk-star-off);
    height: var(--sk-star-size);
    flex: 0 0 auto;
    -webkit-mask-image: var(--sk-star-svg);
    mask-image: var(--sk-star-svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: left center;
    mask-position: left center;
    -webkit-mask-size: var(--sk-star-size) var(--sk-star-size);
    mask-size: var(--sk-star-size) var(--sk-star-size);
  }

  .page-product .grade-stars .star-content.star-empty div.star {
    width: var(--sk-star-size) !important;
    visibility: visible !important;
  }

  /* A fractional average makes the module split one position into TWO nodes —
     an invisible left part and a visible remainder — so the empty layer holds
     six children for a five-star scale. Forcing them all back to full width
     therefore drew a sixth grey star and pushed the review count into it.
     Whole grades never produce a sixth child, so this only ever hides the
     artefact. */
  .page-product .grade-stars .star-content.star-empty div.star:nth-child(n+6) {
    display: none !important;
  }

  .page-product .grade-stars .star-content.star-full div.star,
  .page-product .grade-stars .star-content.star-full div.star-on {
    width: var(--sk-star-size);
  }

  .page-product .grade-stars .star-content div.star-on,
  .page-product .grade-stars .star-content div.star-hover {
    background-color: var(--sk-star);
  }
}

/* ---- 9b. Section shell, heading and summary ---------------------------- */
.page-product .product-comments-wrapper {
  margin-top: var(--sk-7) !important;
  padding-top: var(--sk-7);
  border-top: 1px solid var(--sk-border);
}

.page-product #product-comments-list-header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--sk-4);
  margin: 0 0 var(--sk-5);
  padding: 0;
}

.page-product #product-comments-list-header .sk-rv-head {
  display: flex;
  flex-direction: column;
  gap: var(--sk-3);
  min-width: 0;
}

.page-product #product-comments-list-header .section-title {
  margin: 0;
  color: var(--sk-ink);
  font-family: var(--sk-serif);
  font-size: clamp(1.5rem, 1.3rem + .8vw, 2rem);
  font-weight: 600;
  letter-spacing: -.01em;
  /* Playfair defaults to old-style figures, which turns a score into a word. */
  font-variant-numeric: lining-nums proportional-nums;
}

/* The score reads first, the stars confirm it, the count qualifies it. */
.page-product .sk-rv-summary {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sk-2);
}

.page-product .sk-rv-summary__score {
  color: var(--sk-ink);
  font-size: 1.75rem;
  font-weight: 700;
  line-height: 1;
  font-variant-numeric: lining-nums tabular-nums;
}

.page-product .sk-rv-summary__of {
  margin-right: var(--sk-2);
  color: var(--sk-muted);
  font-size: .9375rem;
}

.page-product .sk-rv-summary .comments-note { margin: 0; }

.page-product .sk-rv-summary__count {
  color: var(--sk-muted);
  font-size: .9375rem;
}

.page-product #product-comments-list-btn-group { flex: 0 0 auto; }

/* ---- 9c. Empty state ---------------------------------------------------
   `#empty-product-comment` is hidden by list-comments.js with jQuery `.hide()`,
   which writes an inline `display: none`. Nothing here may use
   `display: … !important`, or the empty state would survive the first review.
   ------------------------------------------------------------------------ */
.page-product #empty-product-comment.sk-rv-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--sk-3);
  margin: 0;
  padding: var(--sk-7) var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
  text-align: center;
}

.page-product .sk-rv-empty__icon {
  color: var(--sk-brand);
  opacity: .85;
}

.page-product .sk-rv-empty__title {
  margin: 0;
  color: var(--sk-ink);
  font-size: 1.0625rem;
  font-weight: 600;
}

.page-product .sk-rv-empty__text {
  max-width: 44ch;
  margin: 0;
  color: var(--sk-muted);
  font-size: .9375rem;
}

.page-product .sk-rv-empty__btn {
  margin-top: var(--sk-2);
  padding: 0 var(--sk-5);
  min-height: 44px;
  border-radius: var(--sk-r-pill);
}

/* ---- 9d. Review cards --------------------------------------------------
   The theme bundle styles these at (1,2,0) via `#product-comments-list`, so
   each override adds the `.sk-rv-card` hook to clear it.
   ------------------------------------------------------------------------ */
.page-product #product-comments-list .comment.sk-rv-card {
  margin: 0 0 var(--sk-4);
  padding: var(--sk-5);
  border: 1px solid var(--sk-border);
  border-bottom: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
}

.page-product #product-comments-list .sk-rv-card__head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sk-2) var(--sk-4);
  height: auto;
  min-height: 0;
  margin: 0 0 var(--sk-3);
}

.page-product #product-comments-list .sk-rv-card__head .grade-stars {
  margin: 0;
  min-width: 115px;
}

.page-product #product-comments-list .sk-rv-card__head .grade-stars .star-content {
  margin: 0;
  top: 0;
}

.page-product #product-comments-list .sk-rv-card__byline {
  display: flex;
  align-items: center;
  gap: var(--sk-2);
  margin: 0;
  font-size: .875rem;
}

.page-product #product-comments-list .sk-rv-card .comment-author {
  color: var(--sk-ink);
  font-weight: 600;
}

.page-product #product-comments-list .sk-rv-card__sep { color: var(--sk-border-strong); }

.page-product #product-comments-list .sk-rv-card .comment-date { color: var(--sk-muted); }

.page-product #product-comments-list .sk-rv-card .comment-title {
  margin: 0 0 var(--sk-2);
  color: var(--sk-ink);
  font-size: 1.0625rem;
  font-weight: 600;
  line-height: 1.4;
}

.page-product #product-comments-list .sk-rv-card .comment-text {
  max-width: 68ch;
  margin: 0;
  color: var(--sk-body);
  font-size: 1rem;
  line-height: 1.65;
  /* The module stores newlines verbatim; keep them, but let long words wrap. */
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}

.page-product #product-comments-list .sk-rv-card__actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sk-2);
  margin-top: var(--sk-4);
  padding-top: var(--sk-3);
  border-top: 1px solid var(--sk-border);
}

.page-product #product-comments-list .sk-rv-card__useful-label {
  margin-right: var(--sk-2);
  color: var(--sk-muted);
  font-size: .875rem;
}

/* These were `<a>` elements with no href — unreachable by keyboard. They are
   buttons now, so they need the button reset the theme never applied. */
.page-product #product-comments-list .sk-rv-card__actions button {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 0 var(--sk-3);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface);
  color: var(--sk-muted);
  font-size: .875rem;
  line-height: 1;
  cursor: pointer;
  transition: color var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

.page-product #product-comments-list .sk-rv-card__actions button .material-icons {
  font-size: 18px;
  color: inherit;
}

.page-product #product-comments-list .sk-rv-card__actions .report-abuse {
  margin-left: auto;
  border-color: transparent;
}

@media (hover: hover) {
  .page-product #product-comments-list .sk-rv-card__actions button:hover {
    border-color: var(--sk-brand);
    background: var(--sk-brand-tint);
    color: var(--sk-brand);
  }
}

/* ---- 9e. Pagination ----------------------------------------------------
   The theme bundle already resets this block; what it does not give the page
   controls is a hit area. `.page-link` there is `padding: .25rem .5rem`, which
   is a ~28px target.
   ------------------------------------------------------------------------ */
.page-product #product-comments-list-pagination .pagination .page-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  min-height: 40px;
  padding: 0 var(--sk-2);
  border: 1px solid transparent;
  border-radius: var(--sk-r-pill);
  background: transparent;
  color: var(--sk-body);
  font-variant-numeric: lining-nums tabular-nums;
  transition: color var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

.page-product #product-comments-list-pagination .pagination .page-item.active .page-link {
  background: var(--sk-brand-tint);
  border-color: var(--sk-brand-tint-2);
  color: var(--sk-brand);
  font-weight: 600;
}

@media (hover: hover) {
  .page-product #product-comments-list-pagination .pagination .page-link:hover {
    background: var(--sk-surface-2);
    color: var(--sk-brand);
  }
}

.page-product #product-comments-list-pagination .pagination .page-item.disabled .page-link {
  color: var(--sk-muted);
  opacity: .45;
  cursor: not-allowed;
}

/* ---- 9f. "Write your review" dialog ------------------------------------ */
.page-product .modal.sk-rv-modal .modal-dialog {
  max-width: 43rem;
}

.page-product .modal.sk-rv-modal .modal-content {
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-lg);
  box-shadow: var(--sk-shadow-md);
  overflow: hidden;
}

.page-product .modal.sk-rv-modal .modal-header {
  align-items: flex-start;
  gap: var(--sk-4);
  padding: var(--sk-5) var(--sk-6) var(--sk-4);
  border-bottom: 1px solid var(--sk-border);
  background: var(--sk-surface);
}

.page-product .modal.sk-rv-modal .sk-rv-modal__eyebrow {
  display: block;
  margin-bottom: 4px;
  color: var(--sk-brand);
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
}

.page-product .modal.sk-rv-modal .modal-header .h4 {
  color: var(--sk-ink);
  font-family: var(--sk-serif);
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: -.01em;
}

.page-product .modal.sk-rv-modal .modal-body {
  padding: var(--sk-5) var(--sk-6);
}

.page-product .modal.sk-rv-modal .modal-footer {
  justify-content: space-between;
  gap: var(--sk-4);
  padding: var(--sk-4) var(--sk-6) var(--sk-5);
  border-top: 1px solid var(--sk-border);
  background: var(--sk-surface-2);
}

/* Product context strip — which product am I reviewing. It is a reminder, not
   the content of the dialog, so it gets a chip rather than a hero block. */
.page-product .modal.sk-rv-modal .sk-rv-product {
  display: flex;
  align-items: center;
  gap: var(--sk-4);
  margin-bottom: var(--sk-5);
  padding: var(--sk-3);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
}

.page-product #post-product-comment-modal .sk-rv-product__cover,
.page-product #post-product-comment-modal .sk-rv-product__cover img {
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  object-fit: cover;
  border-radius: var(--sk-r-sm);
}

.page-product .modal.sk-rv-modal .sk-rv-product__text { min-width: 0; }

.page-product #post-product-comment-modal .sk-rv-product__name {
  margin: 0;
  color: var(--sk-ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.4;
}

.page-product .modal.sk-rv-modal .sk-rv-product__ref {
  margin: 2px 0 0;
  color: var(--sk-muted);
  font-size: .8125rem;
}

/* --- Rating ------------------------------------------------------------
   The theme bundle owns `#post-product-comment-modal #criterions_list
   .criterion-rating` at (2,2,0); adding `.sk-rv-rating` to the chain makes
   these (2,3,0) so they win on weight, not on file order.
   --------------------------------------------------------------------- */
.page-product #post-product-comment-modal .sk-rv-criterions {
  margin: 0 0 var(--sk-5);
  padding: 0;
  list-style: none;
}

.page-product #post-product-comment-modal .sk-rv-criterions > li { margin: 0 0 var(--sk-3); }

/* The panel lives on the row, not on the <fieldset>. A bordered fieldset puts
   its <legend> INSIDE the border box and notches the top edge around it, which
   here read as a broken frame rather than as a grouped control. Borderless
   fieldset + bordered row keeps the grouping semantics and loses the notch. */
.page-product #post-product-comment-modal #criterions_list .criterion-rating.sk-rv-rating {
  display: block;
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
}

.page-product #post-product-comment-modal .sk-rv-rating .sk-rv-rating__label {
  float: none;
  width: auto;
  margin: 0 0 var(--sk-2);
  padding: 0;
  color: var(--sk-ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.4;
}

.page-product #post-product-comment-modal .sk-rv-rating__row {
  display: flex;
  align-items: center;
  gap: var(--sk-4);
  min-height: 44px;
  padding: var(--sk-3) var(--sk-4);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
}

/* Bigger, always-integer stars: a 32px glyph in a 40x44 hit area. Below the
   44px minimum this page holds everywhere else, five one-shot targets sat at
   20px — the smallest thing on the product page. */
.page-product #post-product-comment-modal .sk-rv-stars {
  --sk-star-size: 32px;
  position: static;
  display: inline-block;
  height: auto;
  min-width: 0;
}

.page-product #post-product-comment-modal .sk-rv-stars .star-content {
  position: static;
  top: auto;
  margin: 0;
  align-items: center;
}

/* Interactive mode puts every star in the full layer; the empty layer is left
   as an empty div that would otherwise take a flex line. */
.page-product #post-product-comment-modal .sk-rv-stars .star-content.star-empty {
  display: none;
}

@supports ((-webkit-mask-image: url("#a")) or (mask-image: url("#a"))) {
  .page-product #post-product-comment-modal .sk-rv-stars .star-content div.star,
  .page-product #post-product-comment-modal .sk-rv-stars .star-content div.star-on,
  .page-product #post-product-comment-modal .sk-rv-stars .star-content div.star-hover {
    width: 40px;
    height: 44px;
    margin: 0;
    -webkit-mask-position: center;
    mask-position: center;
    cursor: pointer;
    transition: background-color 120ms var(--sk-ease), transform 120ms var(--sk-ease);
  }
}

/* Until the visitor actually picks a value, the widget must not claim one.
   The module initialises the hidden input at 3 and paints three gold stars,
   while its own `ratingChosen` flag stays false — so the form showed a rating,
   then refused to send because "you must choose a rating". The class is added
   by reviews-premium.js and removed on the first interaction, so with that
   script absent the behaviour is exactly the module's own. */
.page-product #post-product-comment-modal .sk-rv-rating--pristine .star-content div.star-on {
  background-color: var(--sk-star-off);
}

.page-product #post-product-comment-modal .sk-rv-rating__value {
  color: var(--sk-muted);
  font-size: .9375rem;
  font-weight: 600;
}

.page-product #post-product-comment-modal .sk-rv-rating--chosen .sk-rv-rating__value {
  color: var(--sk-ink);
}

/* Empty until reviews-premium.js fills it; an empty bold span would otherwise
   sit there as a stray gap. */
.page-product #post-product-comment-modal .sk-rv-rating__value:empty { display: none; }

.page-product #post-product-comment-modal .sk-rv-stars:focus-visible {
  outline: 2px solid var(--sk-brand);
  outline-offset: 2px;
  border-radius: var(--sk-r-sm);
}

/* The module appends this into `#criterions_list` on DOM ready and toggles it
   with jQuery show/hide, so it has to stay a block-level child of the list. */
.page-product #post-product-comment-modal #criterions_list #ratingNotChosen {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: var(--sk-2) 0 0;
  padding: var(--sk-2) var(--sk-3);
  border-radius: var(--sk-r-sm);
  background: #fdecef;
  color: #a3123a;
  font-size: .875rem;
  text-align: left;
}

/* --- Fields ------------------------------------------------------------ */
.page-product .modal.sk-rv-modal .modal-body label.form-label {
  margin: 0 0 var(--sk-2);
  color: var(--sk-ink);
  font-size: .875rem;
  font-weight: 600;
}

.page-product #post-product-comment-modal .required {
  margin-left: 3px;
  color: var(--sk-brand);
  font-size: .75rem;
}

.page-product .modal.sk-rv-modal .form-control {
  min-height: 48px;
  padding: var(--sk-3) var(--sk-4);
  border: 1px solid var(--sk-border-strong);
  border-radius: var(--sk-r-sm);
  background: var(--sk-surface);
  color: var(--sk-ink);
  font-size: 1rem;
  transition: border-color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

.page-product .modal.sk-rv-modal textarea.form-control {
  min-height: 132px;
  margin-bottom: 0;
  line-height: 1.6;
  resize: vertical;
}

/* The theme sets `::placeholder { color: #dee2e6 }` — barely a shade off white,
   and unreadable now that these fields carry real placeholder copy. */
.page-product .modal.sk-rv-modal .form-control::placeholder {
  color: var(--sk-muted);
  opacity: .75;
}

/* Bootstrap's stock focus ring is blue #86b7fe with a blue glow. */
.page-product .modal.sk-rv-modal .form-control:focus {
  border-color: var(--sk-brand);
  box-shadow: 0 0 0 3px rgba(213, 0, 117, .16);
  outline: 0;
}

.page-product .modal.sk-rv-modal .sk-rv-help {
  margin: var(--sk-2) 0 0;
  color: var(--sk-muted);
  font-size: .8125rem;
}

/* post-comment.js writes `.error` / `.valid` onto the controls. The stock
   treatment is a pink FILL (#f2dede) over the whole field, which reads as
   disabled rather than as wrong. Border and ring only. */
.page-product #post-product-comment-form .form-control.error {
  border-color: #c62b4f;
  background-color: var(--sk-surface);
  box-shadow: 0 0 0 3px rgba(198, 43, 79, .12);
}

.page-product #post-product-comment-form .form-control.valid {
  border-color: var(--sk-ok);
  background-color: var(--sk-surface);
}

.page-product .modal.sk-rv-modal .sk-rv-gdpr {
  padding-top: var(--sk-3);
  border-top: 1px solid var(--sk-border);
  font-size: .875rem;
}

/* --- Footer ------------------------------------------------------------ */
.page-product .modal.sk-rv-modal .sk-rv-required {
  margin: 0;
  color: var(--sk-muted);
  font-size: .8125rem;
}

.page-product .modal.sk-rv-modal .sk-rv-actions {
  display: flex;
  align-items: center;
  gap: var(--sk-3);
}

.page-product .modal.sk-rv-modal .sk-rv-actions .btn {
  min-height: 48px;
  padding: 0 var(--sk-5);
  border-radius: var(--sk-r-pill);
  font-weight: 600;
}

/* ---- 9g. Alert and confirm dialogs ------------------------------------- */
.page-product .modal.sk-rv-alert .modal-dialog { max-width: 26rem; }

.page-product .modal.sk-rv-alert .modal-content {
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-lg);
  box-shadow: var(--sk-shadow-md);
}

.page-product .modal.sk-rv-alert .modal-header {
  justify-content: flex-end;
  padding: var(--sk-3) var(--sk-3) 0;
  border-bottom: 0;
}

.page-product .modal.sk-rv-alert .modal-body {
  padding: 0 var(--sk-6) var(--sk-5);
  text-align: center;
}

.page-product .modal.sk-rv-alert .sk-rv-alert__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  margin-bottom: var(--sk-4);
  border-radius: 50%;
  background: var(--sk-ok-tint);
  color: var(--sk-ok);
}

.page-product .modal.sk-rv-alert .sk-rv-alert__icon .material-icons {
  font-size: 28px;
  line-height: 1;
  color: inherit;
}

.page-product .modal.sk-rv-alert .sk-rv-alert__icon--error {
  background: #fdecef;
  color: #a3123a;
}

.page-product .modal.sk-rv-alert .sk-rv-alert__icon--feedback {
  background: var(--sk-warn-tint);
  color: var(--sk-warn);
}

.page-product .modal.sk-rv-alert .sk-rv-alert__title {
  margin: 0 0 var(--sk-3);
  color: var(--sk-ink);
  font-family: var(--sk-serif);
  font-size: 1.25rem;
  font-weight: 600;
}

.page-product .modal.sk-rv-alert .sk-rv-alert__message {
  color: var(--sk-body);
  font-size: .9375rem;
}

/* The post-error dialog fills this with a `<ul>` of server messages. */
.page-product .modal.sk-rv-alert .sk-rv-alert__message ul {
  margin: 0;
  padding: 0;
  list-style: none;
  text-align: left;
}

.page-product .modal.sk-rv-alert .sk-rv-alert__message li { margin-bottom: 4px; }

.page-product .modal.sk-rv-alert .modal-footer {
  justify-content: center;
  gap: var(--sk-3);
  padding: 0 var(--sk-6) var(--sk-6);
  border-top: 0;
}

.page-product .modal.sk-rv-alert .modal-footer .btn {
  min-height: 44px;
  padding: 0 var(--sk-5);
  border-radius: var(--sk-r-pill);
  font-weight: 600;
}

/* ---- 9h. Rating row beside the price ----------------------------------- */
.page-product .product-comments-additional-info {
  gap: var(--sk-3);
  margin: var(--sk-4) 0 0;
  font-size: .9375rem;
}

.page-product .product-comments-additional-info .comments-note { margin: 0; }

.page-product .product-comments-additional-info .average-grade {
  color: var(--sk-ink);
  font-weight: 600;
  font-variant-numeric: lining-nums tabular-nums;
}

.page-product .product-comments-additional-info .additional-links .link-comment {
  color: var(--sk-brand);
  font-weight: 500;
  text-decoration: none;
  cursor: pointer;
}

.page-product .product-comments-additional-info .additional-links .link-comment .material-icons {
  color: var(--sk-brand);
}

@media (hover: hover) {
  .page-product .product-comments-additional-info .additional-links .link-comment:hover,
  .page-product .product-comments-additional-info .additional-links .link-comment:hover .material-icons {
    color: var(--sk-brand-dark);
    text-decoration: underline;
  }
}

/* ---- 9i. Responsive ---------------------------------------------------- */
@media (max-width: 575.98px) {
  .page-product .modal.sk-rv-modal .modal-header,
  .page-product .modal.sk-rv-modal .modal-body,
  .page-product .modal.sk-rv-modal .modal-footer {
    padding-left: var(--sk-4);
    padding-right: var(--sk-4);
  }

  .page-product .modal.sk-rv-modal .modal-footer {
    flex-direction: column-reverse;
    align-items: stretch;
    gap: var(--sk-3);
  }

  .page-product .modal.sk-rv-modal .sk-rv-actions {
    flex-direction: column-reverse;
    align-items: stretch;
  }

  .page-product .modal.sk-rv-modal .sk-rv-required { text-align: center; }

  /* 5 x 40px + the label still has to fit a 320px viewport. */
  .page-product #post-product-comment-modal .sk-rv-rating__row {
    flex-wrap: wrap;
    gap: var(--sk-2);
  }

  .page-product #product-comments-list .comment.sk-rv-card { padding: var(--sk-4); }

  .page-product #product-comments-list .sk-rv-card__actions .report-abuse { margin-left: 0; }

  .page-product #empty-product-comment.sk-rv-empty { padding: var(--sk-6) var(--sk-4); }

  .page-product .sk-rv-empty__btn,
  .page-product #product-comments-list-btn-group .btn { width: 100%; }
}

/* ---- 9j. Reduced motion ------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
  .page-product #post-product-comment-modal .sk-rv-stars .star-content div.star,
  .page-product #post-product-comment-modal .sk-rv-stars .star-content div.star-on,
  .page-product #product-comments-list .sk-rv-card__actions button,
  .page-product .modal.sk-rv-modal .form-control {
    transition: none;
  }
}

/* ---------------------------------------------------------------------------
   10. Mobile sticky add-to-cart bar
   ------------------------------------------------------------------------ */
.js-sticky-atc-bar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1030;
  display: none;
  align-items: center;
  justify-content: space-between;
  gap: var(--sk-4);
  background: rgba(255, 255, 255, .96);
  backdrop-filter: saturate(180%) blur(12px);
  -webkit-backdrop-filter: saturate(180%) blur(12px);
  border-top: 1px solid #ebe5ed;
  padding: 10px 16px;
  padding-bottom: calc(10px + env(safe-area-inset-bottom));
  box-shadow: 0 -4px 20px rgba(26, 0, 16, .1);
  transform: translateY(100%);
  transition: transform var(--sk-dur) var(--sk-ease);
}

.js-sticky-atc-bar.is-visible {
  display: flex;
  transform: translateY(0);
}

.js-sticky-atc-bar .sticky-atc__price {
  color: #1a0010;
  font-weight: 700;
  font-size: 1.0625rem;
  letter-spacing: -.01em;
  white-space: nowrap;
}

.js-sticky-atc-bar .sticky-atc__button {
  min-height: 46px;
  background: #d50075;
  color: #fff;
  border: none;
  border-radius: 10px;
  padding: 0 26px;
  font-size: .9375rem;
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
}

.js-sticky-atc-bar .sticky-atc__button:active { background: #9e0056; }

@media (min-width: 992px) {
  .js-sticky-atc-bar { display: none !important; }
}

/* ---------------------------------------------------------------------------
   11. Responsive refinements
   ------------------------------------------------------------------------ */
@media (max-width: 991.98px) {
  .product__tabs-row { margin-top: var(--sk-6); }

  .page-product .product__infos .accordion-body { padding-bottom: var(--sk-6); }

}

/* Three trust badges: one per row while the column is narrow, all three abreast
   once the buy column goes full width. Anything in between orphans the third. */
@media (min-width: 768px) and (max-width: 991.98px) {
  .page-product .blockreassurance_product {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

@media (max-width: 767.98px) {
  .page-product .js-product-container { margin-top: var(--sk-4); }

  .product__images .carousel { border-radius: var(--sk-r-md); }

  .page-product .product__prices { padding: var(--sk-4); }

  .page-product .js-product-add-to-cart .row {
    align-items: center;
    row-gap: 0.85rem;
  }

  .page-product .product-actions__quantity {
    order: 1;
    flex: 0 0 auto;
    width: auto;
    max-width: none;
  }

  .page-product .product-actions__quantity .input-group { width: auto; }

  .page-product .product-actions__quantity .js-quantity-wanted {
    flex: 0 0 auto;
    width: 64px;
    min-width: 64px;
  }

  .page-product .js-product-add-to-cart .wishlist-button-add,
  .page-product .js-product-add-to-cart .wishlist-button {
    order: 2;
    margin-left: auto;
    margin-right: 0;
  }

  .page-product .product-actions__button.add {
    order: 3;
    flex: 0 0 100%;
    width: 100%;
    max-width: 100%;
  }

  .page-product .product__description h2 { max-width: none; }
  .page-product .product__description > p,
  .page-product .product__description > h4 { max-width: none; }

  .page-product .product__details .detail {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--sk-2);
  }
  .page-product .product__details .detail__left { width: 100%; }

  /* The sticky-bar clearance used to live here. It is now in §13, scoped to
     the range the bar is actually visible in — see the note there. */
}

@media (max-width: 575.98px) {
  .page-product .product__infos .accordion-button { font-size: 1.0625rem; }
  .rt-faq__item { padding: var(--sk-4); }
  .page-product #empty-product-comment { padding: var(--sk-5) !important; }
}

/* ---------------------------------------------------------------------------
   12. Reduced motion
   ------------------------------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
  .page-product *,
  .js-sticky-atc-bar,
  .js-sticky-atc-bar * {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  .product-actions__button .add-to-cart:hover { transform: none; }
}

/* ---------------------------------------------------------------------------
   13. Enquiry-first buy box, sectioned description, spec tables   (2026-08-27)

   These are quote-driven capital machines, so the conversion is a conversation.
   The enquiry panel is the primary action in the buy column and the cart row is
   demoted to an outline beneath it — Add to cart is never removed, it is still
   the real control for the consumables in this catalogue.

   Hierarchy is carried by weight, scale and position, not by a new colour: the
   whole page stays on the brand tokens declared in §1. Same "Minimalism & Swiss
   Style" direction as the rest of this file.
   ------------------------------------------------------------------------ */

/* ---- Enquiry panel ---------------------------------------------------- */
.page-product .sk-enq {
  margin: var(--sk-5) 0;
  padding: var(--sk-5);
  background: var(--sk-brand-tint);
  border: 1px solid var(--sk-brand-tint-2);
  border-radius: var(--sk-r-md);
}

.page-product .sk-enq__lede {
  margin: 0 0 var(--sk-4);
  color: var(--sk-ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.5;
}

.page-product .sk-enq__actions {
  display: flex;
  flex-direction: column;
  gap: var(--sk-3);
}

/* 52px primary / 48px secondary — both well clear of the 44px minimum, and the
   4px difference is part of what makes the primary read as primary. */
.page-product .sk-enq__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sk-2);
  min-height: 48px;
  padding: 0 var(--sk-4);
  border-radius: var(--sk-r-sm);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease),
              color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

.page-product .sk-enq__icon {
  width: 20px;
  height: 20px;
  flex: 0 0 20px;
}

.page-product .sk-enq__btn--primary {
  min-height: 52px;
  background: var(--sk-brand);
  border: 1.5px solid var(--sk-brand);
  color: #fff;
  box-shadow: var(--sk-shadow-cta);
  font-size: 1rem;
}

.page-product .sk-enq__btn--ghost {
  background: var(--sk-surface);
  border: 1.5px solid var(--sk-brand);
  color: var(--sk-brand);
}

/* Hover transforms are guarded — :hover latches on touch devices. */
@media (hover: hover) {
  .page-product .sk-enq__btn--primary:hover { background: var(--sk-brand-dark); border-color: var(--sk-brand-dark); color: #fff; }
  .page-product .sk-enq__btn--ghost:hover { background: var(--sk-brand); border-color: var(--sk-brand); color: #fff; }
}

.page-product .sk-enq__btn--primary:active { background: var(--sk-brand-dark); border-color: var(--sk-brand-dark); }
.page-product .sk-enq__btn--ghost:active { background: var(--sk-brand-tint-2); }

/* ---- Add to cart, demoted to secondary --------------------------------
   theme.css forces `.btn-primary` to solid pink with `!important` at (0,1,0),
   including a separate `!important` on the glyph and on :hover. Overriding it
   therefore needs both higher specificity AND `!important`, and :hover has to
   be restated or the resting rule below would win over theme.css's hover fill.
   The button keeps a full-strength brand outline: demoted, not hidden. */
.page-product .product__add-to-cart .product-actions__button .add-to-cart {
  background-color: var(--sk-surface) !important;
  border: 1.5px solid var(--sk-brand) !important;
  color: var(--sk-brand) !important;
  box-shadow: none !important;
}

.page-product .product__add-to-cart .product-actions__button .add-to-cart .material-icons {
  color: var(--sk-brand) !important;
}

@media (hover: hover) {
  .page-product .product__add-to-cart .product-actions__button .add-to-cart:hover {
    background-color: var(--sk-brand) !important;
    border-color: var(--sk-brand) !important;
    color: #fff !important;
  }
  .page-product .product__add-to-cart .product-actions__button .add-to-cart:hover .material-icons {
    color: #fff !important;
  }
}

.page-product .product__add-to-cart .product-actions__button .add-to-cart:active {
  background-color: var(--sk-brand-dark) !important;
  border-color: var(--sk-brand-dark) !important;
  color: #fff !important;
}

/* ---- Sectioned description --------------------------------------------
   Built by product-premium.js from the copy's own <h2> headings. If that never
   runs, none of these classes exist and the description renders as one block —
   long, but complete. Nothing here can hide content on its own. */
.page-product .rt-sec__lead > *:last-child { margin-bottom: 0; }

.page-product .rt-sec {
  border-top: 1px solid var(--sk-border);
}

.page-product .rt-sec__head {
  margin: 0;
  font-size: inherit;
}

.page-product .rt-sec__toggle {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--sk-4);
  width: 100%;
  min-height: 56px;
  padding: var(--sk-4) 0;
  background: none;
  border: 0;
  text-align: left;
  cursor: pointer;
  font-family: var(--sk-serif);
  /* Playfair renders old-style figures by default — "1000" would come out with
     descenders at this size. */
  font-variant-numeric: lining-nums;
  font-size: 1.125rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--sk-ink);
}

.page-product .rt-sec__title { flex: 1 1 auto; }

.page-product .rt-sec__chevron {
  width: 20px;
  height: 20px;
  flex: 0 0 20px;
  margin-top: 5px;
  fill: none;
  stroke: var(--sk-muted);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform var(--sk-dur) var(--sk-ease);
}

.page-product .rt-sec.is-open .rt-sec__chevron { transform: rotate(180deg); }

@media (hover: hover) {
  .page-product .rt-sec__toggle:hover { color: var(--sk-brand); }
  .page-product .rt-sec__toggle:hover .rt-sec__chevron { stroke: var(--sk-brand); }
}

.page-product .rt-sec__body { padding-bottom: var(--sk-5); }
.page-product .rt-sec__body[hidden] { display: none; }
.page-product .rt-sec__body > *:first-child { margin-top: 0; }
.page-product .rt-sec__body > *:last-child { margin-bottom: 0; }

/* ---- Spec tables on phones --------------------------------------------
   A two-column table is a parameter/value spec sheet: its reading order runs
   down the page, so below 576px each row becomes a label-over-value card and
   the scroll port is dropped. Tables with three or more columns keep the port.

   The `!important`s are unavoidable and are confined to cosmetics: the stored
   WYSIWYG puts inline padding/border on every cell. Widths and alignment are
   left to the source markup, per the theme's standing rule. */
@media (max-width: 575.98px) {
  .page-product .rt-table--kv-port {
    overflow-x: visible;
    border: 0;
    background: none;
  }

  .page-product .rt-table--kv,
  .page-product .rt-table--kv tbody,
  .page-product .rt-table--kv tr,
  .page-product .rt-table--kv td {
    display: block;
    width: auto !important;
  }

  /* The header row still names the columns for assistive tech. */
  .page-product .rt-table--kv thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .page-product .rt-table--kv tr {
    margin: 0 0 var(--sk-3);
    padding: var(--sk-3) var(--sk-4);
    border: 1px solid var(--sk-border) !important;
    border-radius: var(--sk-r-sm);
  }

  .page-product .rt-table--kv td {
    padding: 0 !important;
    border: 0 !important;
  }

  .page-product .rt-table--kv td:first-child {
    margin-bottom: 4px;
    color: var(--sk-muted) !important;
    font-size: .75rem !important;
    font-weight: 700 !important;
    letter-spacing: .04em;
    text-transform: uppercase;
  }

  .page-product .rt-table--kv td + td {
    color: var(--sk-body) !important;
    font-size: .9375rem;
  }
}

/* ---- Sticky bar: enquiry-first ----------------------------------------
   Extends §10 rather than replacing it. The bar is a single 48px row and the
   layout survives 320px: at that width the price is dropped rather than letting
   any control fall under the 44px minimum.

   Built by product-premium.js only when the enquiry panel exists; without it
   the bar is still price + add-to-cart exactly as before. */
.js-sticky-atc-bar { gap: var(--sk-2); }

.js-sticky-atc-bar .sticky-atc__call {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 48px;
  width: 48px;
  height: 48px;
  border: 1.5px solid #d50075;
  border-radius: 10px;
  background: #fff;
  color: #d50075;
  text-decoration: none;
}

.js-sticky-atc-bar .sticky-atc__call svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentcolor;
}

.js-sticky-atc-bar .sticky-atc__enquire {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  flex: 1 1 auto;
  min-width: 0;
  min-height: 48px;
  padding: 0 14px;
  border: 1.5px solid #d50075;
  border-radius: 10px;
  background: #d50075;
  color: #fff;
  font-size: .9375rem;
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}

.js-sticky-atc-bar .sticky-atc__enquire svg {
  width: 18px;
  height: 18px;
  flex: 0 0 18px;
  fill: currentcolor;
}

.js-sticky-atc-bar .sticky-atc__enquire-label {
  overflow: hidden;
  text-overflow: ellipsis;
}

.js-sticky-atc-bar .sticky-atc__enquire:active { background: #9e0056; border-color: #9e0056; }
.js-sticky-atc-bar .sticky-atc__call:active { background: #fce7f2; }

/* Add to cart, secondary inside the bar. */
.js-sticky-atc-bar .sticky-atc__button--compact {
  flex: 0 0 auto;
  min-height: 48px;
  padding: 0 14px;
  background: #fff;
  border: 1.5px solid #d50075;
  color: #d50075;
  font-size: .875rem;
}

.js-sticky-atc-bar .sticky-atc__button--compact:active { background: #fce7f2; }

/* Below 400px three controls and a price do not fit without pushing something
   under 44px. The price is the one thing already stated on the page above. */
@media (max-width: 399.98px) {
  .js-sticky-atc-bar .sticky-atc__price { display: none; }
}

@media (max-width: 359.98px) {
  .js-sticky-atc-bar { padding-left: 10px; padding-right: 10px; }
  .js-sticky-atc-bar .sticky-atc__button--compact { padding: 0 10px; }
  .js-sticky-atc-bar .sticky-atc__enquire { padding: 0 10px; }
}

/* ---- Sticky bar clearance ---------------------------------------------
   The bar is hidden only at `min-width: 992px` (§10), but its body-padding
   compensation sat inside a `max-width: 767.98px` block. So in the 768–991px
   band the bar rendered over the last ~69px of the page with nothing reserving
   room for it — measured in a real browser at 768px: bar visible, height 69px,
   `body` padding-bottom 0px. It reached the footer's top edge.

   Scoped here to the bar's own visibility range so the two can no longer
   disagree. `env(safe-area-inset-bottom)` mirrors the bar's own padding, which
   grows on notched devices; it resolves to 0 everywhere else. */
@media (max-width: 991.98px) {
  body:has(.js-sticky-atc-bar.is-visible) {
    padding-bottom: calc(4.5rem + env(safe-area-inset-bottom));
  }
}

/* =============================================================================
   15. Editorial polish  (v7, 2026-08-30)

   Additive refinements on top of §§1–14. Nothing here changes a layout the
   earlier sections established — it raises the reading experience of the
   description column and stops the buy column from scrolling away from the
   photograph on a wide screen.
   ========================================================================== */

/* ---- Sticky gallery -----------------------------------------------------
   The buy column on these machine pages is much taller than the photograph
   (enquiry panel + cart row + trust badges), which left ~600px of empty white
   beside it at 1440. Pinning the gallery keeps the product visible for the
   whole of that scroll.

   Only above `lg`, where the two really are side by side; below that the columns
   stack and a sticky image would cover the copy.

   IT IS `.product__images` THAT STICKS, NOT `.product__left` — and that is not a
   detail. `position: sticky` creates a stacking context unconditionally, whatever
   its z-index. `product-cover-thumbnails.tpl` renders the `#product-modal`
   lightbox as a sibling of `.product__images` but still INSIDE the column, so
   sticking the column trapped the modal in that context: its `z-index: 1055`
   stopped competing with `.modal-backdrop`'s 1050 at the root, and the backdrop
   painted over the whole lightbox — image, dialog and all, washed flat under a
   translucent sheet. Sticking the inner wrapper leaves the modal outside the
   context and the two z-indexes comparable again.

   No `align-self` here either: the column must keep Bootstrap's default
   `stretch` so it spans the full row height, which is exactly the travel the
   sticky child needs. */
@media (min-width: 992px) {
  .page-product .product__images {
    position: sticky;
    top: var(--sk-5);
  }
}

/* ---- Key-figure strip ---------------------------------------------------
   The strip is rendered from data by catalog/product.tpl (the figures live in
   _partials/booking-price.tpl); the grid itself is defined once, site-wide, in
   theme-premium.css so the quick view renders it identically. The rules below
   are the product page's own spacing only.

   The second rule suppresses a `.sk-hilite` still authored inside a stored
   `description_short` — the shape these figures used to be held in. Without it a
   product not yet migrated off that markup would print the strip twice. */
.page-product .product__description-short + .sk-hilite {
  margin-top: var(--sk-5);
  margin-bottom: var(--sk-5);
}

.page-product .product__description-short .sk-hilite { display: none; }

/* ---- Description lede and sign-off -------------------------------------- */
.page-product .product__description .rt-sec__lead .rt-lede,
.page-product .product__description > .rt-lede {
  max-width: 46rem;
  margin-bottom: var(--sk-4);
  color: var(--sk-ink);
  font-family: var(--sk-serif);
  font-size: clamp(1.25rem, 1.05rem + .7vw, 1.6rem);
  font-weight: 500;
  font-variant-numeric: lining-nums;
  line-height: 1.35;
  letter-spacing: -.01em;
}

.page-product .product__description .rt-lede strong { font-weight: 600; }

.page-product .product__description .rt-signoff {
  margin-top: var(--sk-5);
  padding-top: var(--sk-4);
  border-top: 1px solid var(--sk-border);
  color: var(--sk-muted);
  font-size: .9375rem;
}

/* ---- Specification table ------------------------------------------------
   A two-column spec sheet reads as label -> value, so the label column is given
   its own ground and weight. Scoped to `.rt-table--kv` (product-premium.js tags
   any two-column table) so genuine multi-column data grids keep the neutral
   treatment from §9. Above `sm` only: below that the same class is what stacks
   each row into a label-over-value block (§14) and a tinted cell there would
   read as a heading for the row beneath it. */
@media (min-width: 576px) {
  .page-product .product__description table.rt-table--kv td:first-child {
    width: 34%;
    background: var(--sk-surface-2);
    color: var(--sk-ink);
    font-weight: 600;
  }

  .page-product .product__description table.rt-table--kv tbody tr:hover td:first-child {
    background: var(--sk-brand-tint);
  }
}

/* Numbers in a spec sheet are compared down the column, so they line up. */
.page-product .product__description table.rt-table--kv td + td {
  font-variant-numeric: tabular-nums lining-nums;
}

/* ---- Lists --------------------------------------------------------------
   §9 puts the description's lists into two columns above `lg`. A benefit list
   whose items run to two lines was free to break across the column boundary
   mid-sentence; these keep each point whole. */
.page-product .product__description ul > li {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
}

/* ---- Q&A cards ----------------------------------------------------------
   product-premium.js now also builds `.rt-faq` out of the
   `<p><strong>Q1: …?</strong> answer</p>` form used across this catalogue, so
   the question is a real heading and gets a quiet marker to sit against. */
.page-product .product__description .rt-faq__item h4 {
  position: relative;
  padding-left: var(--sk-4);
}

.page-product .product__description .rt-faq__item h4::before {
  content: "";
  position: absolute;
  top: .3em;
  left: 0;
  width: 3px;
  height: 1.05em;
  border-radius: 2px;
  background: var(--sk-brand);
}

.page-product .product__description .rt-faq__item p { padding-left: var(--sk-4); }

/* =============================================================================
   16. Booking price panel  (v8, 2026-08-30)

   For machines sold against a booking amount, catalog/product.tpl renders this
   panel instead of the stock price block. Two figures, in the order a buyer
   needs them: what the machine costs, then what the button beside it charges
   today. See templates/_partials/booking-price.tpl for where the numbers live.
   ========================================================================== */
.page-product .sk-book {
  margin-bottom: var(--sk-5);
  padding: var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-lg);
  background: linear-gradient(180deg, var(--sk-brand-tint) 0%, var(--sk-surface) 100%);
  box-shadow: var(--sk-shadow-sm);
}

.page-product .sk-book__label {
  margin: 0 0 var(--sk-2);
  color: var(--sk-brand);
  font-size: .6875rem;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
}

.page-product .sk-book__figure {
  margin: 0;
  color: var(--sk-ink);
  font-size: clamp(2rem, 1.6rem + 1.6vw, 2.75rem);
  font-weight: 700;
  font-variant-numeric: lining-nums;
  letter-spacing: -.02em;
  line-height: 1.05;
}

.page-product .sk-book__note {
  margin: var(--sk-2) 0 0;
  color: var(--sk-muted);
  font-size: .8125rem;
  font-weight: 500;
}

/* ---- No published machine price  (v34, 2026-09-02) ----------------------
   A booking row may declare `figures` and `note` without `full`/`display` —
   see _partials/booking-price.tpl. The panel then says "On request" where the
   number goes, and the rules below stop that phrase from occupying a price's
   visual weight: at the full clamp it read as loudly as ₹14,75,000 does on the
   sibling machine, which is the wrong emphasis for the one thing on the panel
   that is NOT a figure. Set smaller and in body ink, it leaves the booking
   amount below as the only number in brand colour — which is correct, because
   it is the only number the buyer can act on today. */
.page-product .sk-book__figure--quote {
  font-size: clamp(1.375rem, 1.15rem + .9vw, 1.75rem);
  font-weight: 600;
  color: var(--sk-body);
  letter-spacing: -.01em;
}

/* With no headline figure competing for it, the split row is the panel's
   primary content rather than its footnote — so it loses the demoted look. */
.page-product .sk-book--quote .sk-book__split { margin-top: var(--sk-3); }
.page-product .sk-book--quote .sk-book__amount { font-size: 1.5rem; }

/* The rule is the seam between the two figures — it is what stops the booking
   amount from reading as a second, contradictory price for the same thing. */
.page-product .sk-book__split {
  display: flex;
  align-items: center;
  gap: var(--sk-4);
  margin-top: var(--sk-4);
  padding-top: var(--sk-4);
  border-top: 1px solid var(--sk-border);
}

.page-product .sk-book__split-text { flex: 1 1 auto; min-width: 0; }

.page-product .sk-book__split-label {
  margin: 0;
  color: var(--sk-ink);
  font-size: .9375rem;
  font-weight: 600;
}

.page-product .sk-book__split-note {
  margin: 2px 0 0;
  color: var(--sk-muted);
  font-size: .75rem;
  line-height: 1.45;
}

.page-product .sk-book__amount {
  flex: 0 0 auto;
  margin: 0;
  color: var(--sk-brand);
  font-size: 1.375rem;
  font-weight: 700;
  font-variant-numeric: lining-nums;
  letter-spacing: -.01em;
  white-space: nowrap;
}

/* Sits directly above the cart row, so it reads as that button's caption. */
.page-product .sk-book__caption {
  margin: 0 0 var(--sk-4);
  color: var(--sk-body);
  font-size: .8125rem;
  line-height: 1.6;
}

/* NOTE: a CSS suppression of the "ON SALE!" flag used to sit here (and in
   theme-premium.css and quickview-premium.css). It is gone because the cause is
   gone: `on_sale` was cleared on product 20 in both `product` and
   `product_shop` on 2026-08-30, so no product in the catalogue now carries the
   flag without a reduction behind it. If a false sale badge ever reappears,
   check that column before reaching for CSS — hiding it in three stylesheets
   only hides it on the three surfaces those stylesheets reach. */

@media (max-width: 400px) {
  .page-product .sk-book__split { flex-wrap: wrap; }
  .page-product .sk-book__amount { font-size: 1.25rem; }
}

/* =============================================================================
   17. Image lightbox  (v9, 2026-08-30)

   `#product-modal` — the zoom view opened from the magnifier over the cover.
   The stock partial gives it a plain white Bootstrap card and no close control;
   the rules below make it read as a lightbox and give the button a place to sit.
   ========================================================================== */
.js-product-images-modal .modal-content {
  position: relative;
  border: 0;
  border-radius: var(--sk-r-lg);
  background: var(--sk-surface);
  box-shadow: 0 24px 70px rgba(26, 0, 16, .35);
}

.js-product-images-modal .modal-body { padding: var(--sk-5); }

.js-product-images-modal .sk-lightbox__close {
  position: absolute;
  top: var(--sk-3);
  right: var(--sk-3);
  z-index: 2;
  width: 40px;
  height: 40px;
  margin: 0;
  padding: 0;
  border-radius: 50%;
  background-color: var(--sk-surface);
  background-size: 13px;
  border: 1px solid var(--sk-border);
  box-shadow: var(--sk-shadow-sm);
  opacity: 1;
  transition: background-color var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .js-product-images-modal .sk-lightbox__close:hover {
    background-color: var(--sk-brand-tint);
    border-color: var(--sk-brand);
  }
}

.js-product-images-modal .carousel-item img {
  width: 100%;
  height: auto;
  border-radius: var(--sk-r-md);
}

/* The backdrop is the page's own ink rather than Bootstrap's flat black, and it
   has to sit under the dialog — see the stacking-context note in §15. */
.modal-backdrop.show { --bs-backdrop-opacity: .55; }

/* ---- Release the 240px mobile clamp INSIDE the lightbox -----------------
   theme.css's un-scoped "NUCLEAR FIX" block (documented in theme-premium.css
   §2b) clamps every carousel on the site to `max-height: 240px !important` below
   768px. §2b already frees the lightbox's carousel BOX
   (`div.carousel.slide.js-product-images-modal-carousel`) but not the
   `.carousel-inner` or the `<img>` inside it — both were still pinned at 240px,
   so on a phone the zoom view showed a cropped 240px band of the photograph.
   That is the one thing a lightbox exists to do, and it was the only surface
   where it was still broken.

   Specificity has to clear the clamp's own entries; these run (0,3,2)+ and carry
   `!important` because the rules they override do too. */
div.carousel.slide.js-product-images-modal-carousel .carousel-inner,
div.carousel.slide.js-product-images-modal-carousel .carousel-item,
div.carousel.slide.js-product-images-modal-carousel picture,
div.carousel.slide.js-product-images-modal-carousel img {
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
}

/* Now that it is free to grow, keep it inside the viewport. `contain` so a
   non-square photograph is letterboxed rather than cropped. */
.js-product-images-modal .carousel-item img {
  max-height: 74vh !important;
  object-fit: contain;
}

/* =============================================================================
   18. One curve for the buy column  (v10, 2026-08-30)

   The quantity stepper is a pill (§4, and shared in theme-premium.css). Left as
   they were, the controls beside and above it stayed on `--sk-r-sm` (10px), so
   the buy column showed two corner radii in the same 48px row — a pill, a
   rounded rectangle, and a rounded square, reading as three unrelated widgets.

   Everything the visitor can press in this column is now on the same pill, and
   the icon-only wishlist becomes the circle that pill implies at 1:1. The panels
   they sit in (`.sk-book`, `.sk-enq`, the accordion) deliberately keep the
   larger soft-rectangle radii — surfaces and controls are allowed to differ;
   controls sitting shoulder to shoulder are not.
   ========================================================================== */
.page-product .sk-enq__btn,
.page-product .product-actions__button .add-to-cart {
  border-radius: var(--sk-r-pill);
}

.page-product .wishlist-button-add,
.page-product .wishlist-button button {
  border-radius: 50%;
}

/* ---------------------------------------------------------------------------
   Wishlist heart on the title row
   ---------------------------------------------------------------------------
   A second `.wishlist-button` mount point lives beside the <h1> (see the note in
   catalog/product.tpl). The one next to "Add to cart" is well below the fold on
   a long product page, so most visitors never learned the feature existed.

   `.page-product .wishlist-button-add` above already sizes the add-to-cart-row
   heart as a 48px square; this one is scoped inside `.product__wishlist-top` so
   it can be a round, quieter control without disturbing that.
   ------------------------------------------------------------------------ */
.product__title-row {
  display: flex;
  align-items: flex-start;
  gap: 1rem;
}

.product__title-row .product__name {
  flex: 1 1 auto;
  min-width: 0;
  margin-bottom: 0;
}

.product__wishlist-top {
  flex: 0 0 auto;
  margin-top: .1rem;
}

.page-product .product__wishlist-top .wishlist-button-add,
.page-product .product__wishlist-top .wishlist-button button {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid var(--sk-border-strong);
  background: var(--sk-surface);
  color: var(--sk-ink);
}

.page-product .product__wishlist-top .wishlist-button-add .material-icons {
  font-size: 22px;
}

/* The heart glyph computed to rgb(122,122,122) — a grey outline on a white disc,
   which is exactly why nobody found this control. Brand it. The icon SHAPE still
   carries the state (`favorite` vs `favorite_border`), so colour is not the
   signal — it is only what makes the control legible. */
.page-product .wishlist-button-add .material-icons,
.page-product .wishlist-button button .material-icons {
  color: var(--sk-brand);
}

.page-product .product__wishlist-top .wishlist-button-add {
  background: var(--sk-brand-tint);
  border-color: var(--sk-brand-tint-2);
}

/* Filled heart = already on a list. Say so in colour, not only in shape. */
.page-product .wishlist-button-add .material-icons {
  transition: transform .18s cubic-bezier(.2, .7, .3, 1);
}

@media (hover: hover) {
  .page-product .product__wishlist-top .wishlist-button-add:hover {
    border-color: var(--sk-brand);
    background: var(--sk-brand-tint);
    color: var(--sk-brand);
  }

  .page-product .wishlist-button-add:hover .material-icons {
    transform: scale(1.12);
  }
}

.page-product .wishlist-button-add:focus-visible {
  outline: 3px solid var(--sk-brand);
  outline-offset: 2px;
}

@media (max-width: 575.98px) {
  .product__title-row {
    gap: .65rem;
  }

  .page-product .product__wishlist-top .wishlist-button-add {
    width: 40px;
    height: 40px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .page-product .wishlist-button-add .material-icons { transition: none; }
  .page-product .wishlist-button-add:hover .material-icons { transform: none; }
}

/* ---- Add-to-cart success, on the product page --------------------------
   The shared success state lives in theme-premium.css at (0,2,0). The demoted
   outline button above is (0,4,0) and also `!important`, so it won — the PDP
   button swapped its label to "Added" while staying pink-on-white, confirming
   nothing. Restated here through the same selector chain plus `.sk-added`,
   which is (0,5,0) and wins cleanly.

   `.sk-added` is set by theme-premium.js on `.js-product-actions`, the wrapper
   around this form. Same tinted green as the listing card, so the two surfaces
   confirm identically. */
.page-product .sk-added .product__add-to-cart .product-actions__button .add-to-cart,
.page-product .sk-added .product__add-to-cart .product-actions__button .add-to-cart:hover {
  background-color: var(--sk-ok-tint) !important;
  border-color: var(--sk-ok) !important;
  color: var(--sk-ok) !important;
  box-shadow: none !important;
}

.page-product .sk-added .product__add-to-cart .product-actions__button .add-to-cart .material-icons,
.page-product .sk-added .product__add-to-cart .product-actions__button .add-to-cart:hover .material-icons {
  color: var(--sk-ok) !important;
}

/* =============================================================================
   19. Review cards — motion, avatar, paging  (v11, 2026-09-01)

   Additive on top of §9d/§9e. The cards were static boxes with no hover and no
   entrance, and every page turn swapped their contents with nothing to say it
   had happened — list-comments.js empties `#product-comments-list` and rebuilds
   it, so a reader on page 2 saw the text change under a still frame.
   ========================================================================== */

/* ---- Entrance ----------------------------------------------------------
   Because the module REBUILDS every card on each page change, this animation
   replays on its own each time — the page turn animates for free, with no hook
   into the module's JS.

   `translate`, not `transform`: the hover below uses `transform`, and the two
   compose instead of overwriting each other, so a card hovered mid-animation
   does not snap. Same reason the account menu animates `translate`/`scale`. */
@keyframes sk-rv-card-in {
  from { opacity: 0; translate: 0 12px; }
  to   { opacity: 1; translate: 0 0; }
}

.page-product #product-comments-list .comment.sk-rv-card {
  animation: sk-rv-card-in .4s cubic-bezier(.2, .7, .3, 1) both;
  transition: border-color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease);
}

/* Staggered, capped at the page size (PRODUCT_COMMENTS_COMMENTS_PER_PAGE = 5).
   A sixth card would land on the last delay rather than accumulating, which is
   what keeps a long page from feeling slow. */
.page-product #product-comments-list .comment.sk-rv-card:nth-child(1) { animation-delay: 0ms; }
.page-product #product-comments-list .comment.sk-rv-card:nth-child(2) { animation-delay: 55ms; }
.page-product #product-comments-list .comment.sk-rv-card:nth-child(3) { animation-delay: 110ms; }
.page-product #product-comments-list .comment.sk-rv-card:nth-child(4) { animation-delay: 165ms; }
.page-product #product-comments-list .comment.sk-rv-card:nth-child(n+5) { animation-delay: 220ms; }

@media (hover: hover) {
  .page-product #product-comments-list .comment.sk-rv-card:hover {
    transform: translateY(-2px);
    border-color: var(--sk-border-strong);
    box-shadow: var(--sk-shadow-md);
  }
}

/* :hover latches on touch — the card would stay lifted after a tap. */
@media (hover: none), (pointer: coarse) {
  .page-product #product-comments-list .comment.sk-rv-card:active { transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .page-product #product-comments-list .comment.sk-rv-card {
    animation: none;
    transition: none;
  }
  .page-product #product-comments-list .comment.sk-rv-card:hover { transform: none; }
}

/* ---- Reviewer avatar ---------------------------------------------------
   Built by product-premium.js from the author's name. It cannot come from the
   template: the prototype is substituted with `String.replace` and no `g` flag,
   so `@CUSTOMER_NAME@` may appear exactly once and cannot be reused for an
   initial. Absent the script, the byline reads exactly as it does today. */
.page-product #product-comments-list .sk-rv-card__avatar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  margin-right: var(--sk-2);
  border-radius: 50%;
  background: linear-gradient(135deg, var(--sk-brand) 0%, var(--sk-brand-dark) 100%);
  color: #fff;
  font-size: .6875rem;
  font-weight: 700;
  line-height: 1;
  text-transform: uppercase;
  letter-spacing: .02em;
}

/* ---- Summary ------------------------------------------------------------
   The stars sat in a 120px hole between "/ 5" and the review count: the module
   initialises `.grade-stars` only inside `#product-comments-list` and
   `.product-comments-additional-info`, and the summary block is in neither, so
   its container rendered empty. product-premium.js now initialises it with the
   module's own plugin; this just closes the gap the empty box left. */
.page-product .sk-rv-summary .comments-note {
  display: inline-flex;
  align-items: center;
}

/* The rating plugin lays its stars out absolutely inside `.star-content`, so the
   container carries no intrinsic width — it needs one declared or it collapses
   to 0 and the stars vanish a second time, differently. 115px is the width the
   card's stars already use, so the two rows line up. */
.page-product .sk-rv-summary .comments-note .grade-stars {
  min-width: 115px;
  margin: 0;
}

/* ---- Pagination --------------------------------------------------------
   The module hides this entirely while there is one page (`totalPages <= 1`),
   so it appears on its own from the sixth review. */
.page-product #product-comments-list-footer {
  margin-top: var(--sk-5);
  padding-top: var(--sk-4);
  border-top: 1px solid var(--sk-border);
}

.page-product #product-comments-list-pagination .pagination {
  margin: 0;
}

.page-product #product-comments-list-pagination .pagination .page-item.hidden {
  display: none;
}

/* Identity before rating on the card head. With the avatar inserted next to the
   name, the row read "stars, avatar, name" — the face wedged between the score
   and the person it belongs to. `order` reflows it to
   "[KK] Kartik Kaundar · date   ★★★★★" without touching the prototype's DOM,
   which list-comments.js re-parses on every page turn and must stay stable. */
.page-product #product-comments-list .sk-rv-card__byline { order: 1; }
.page-product #product-comments-list .sk-rv-card__head .grade-stars { order: 2; }

/* Below `sm` the head wraps to two lines; keeping the stars on their own line
   under the name is the right break, and `order` already produces it. */
@media (max-width: 575.98px) {
  .page-product #product-comments-list .sk-rv-card__head { gap: var(--sk-2); }
}

/* =============================================================================
   20. Reviews as testimonial cards  (v12, 2026-09-01)

   Reworked to the structure of a testimonial layout the owner supplied as a
   reference: a decorative quote mark, the reviewer in an avatar-and-name pill,
   the rating on its own line, and the review itself set large enough to be the
   thing you actually read.

   The reference was a beige/serif social post for another brand. Only the
   STRUCTURE is taken from it — the palette, the serif and the pill geometry stay
   this site's, so the section still belongs to the page it sits on.
   ========================================================================== */

/* ---- Card --------------------------------------------------------------- */
.page-product #product-comments-list .comment.sk-rv-card {
  position: relative;
  padding: var(--sk-6);
  border-radius: var(--sk-r-lg);
  box-shadow: var(--sk-shadow-sm);
  /* Clips the quote mark below, which is deliberately larger than its corner. */
  overflow: hidden;
}

/* The quote mark belongs to the CARD, not the section: it is what makes each
   one read as a testimonial rather than a comment row, which is the whole point
   of the reference. Anchored to the section header instead, it aligned to that
   header's own narrow box — not the section's right edge — and clipped against
   the block above.

   At this opacity five of them read as texture rather than repetition. A CSS
   glyph is absent from the accessibility tree, so it needs no aria handling. */
.page-product #product-comments-list .comment.sk-rv-card::before {
  content: '\201C';
  position: absolute;
  /* Sits fully inside the card. Bled off the top edge it read as a clipping
     bug rather than a flourish — only the tails of the glyph were visible. */
  top: .02em;
  right: .22em;
  z-index: 0;
  font-family: var(--sk-serif);
  font-size: 6.5rem;
  line-height: 1;
  color: var(--sk-brand);
  opacity: .07;
  pointer-events: none;
}

/* Everything real sits above the watermark. */
.page-product #product-comments-list .comment.sk-rv-card > * {
  position: relative;
  z-index: 1;
}

@media (max-width: 575.98px) {
  .page-product #product-comments-list .comment.sk-rv-card::before { font-size: 4.5rem; }
}

/* Reviewer, rating, then the review — a vertical stack, as in the reference.
   The head was a single row with everything competing on one line. */
.page-product #product-comments-list .sk-rv-card__head {
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sk-3);
  margin-bottom: var(--sk-4);
}

/* The avatar and name read as one object, the way they do in the reference. */
.page-product #product-comments-list .sk-rv-card__byline {
  gap: var(--sk-3);
  padding: 6px 14px 6px 6px;
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface-2);
}

.page-product #product-comments-list .sk-rv-card__avatar {
  width: 2.25rem;
  height: 2.25rem;
  margin-right: 0;
  font-size: .75rem;
}

.page-product #product-comments-list .sk-rv-card .comment-author {
  font-weight: 700;
}

.page-product #product-comments-list .sk-rv-card .comment-date {
  font-size: .8125rem;
}

/* ---- The review itself --------------------------------------------------
   This is what a visitor came to read, and it was set at the same size as the
   helper text under it. */
.page-product #product-comments-list .sk-rv-card .comment-title {
  font-family: var(--sk-serif);
  font-size: clamp(1.125rem, 1rem + .4vw, 1.375rem);
  font-weight: 600;
  font-variant-numeric: lining-nums;
  line-height: 1.3;
  letter-spacing: -.005em;
}

.page-product #product-comments-list .sk-rv-card .comment-text {
  font-size: 1.0625rem;
  line-height: 1.7;
  color: var(--sk-body);
}

/* ---- Rating ------------------------------------------------------------
   The plugin sizes its stars from a background sprite, so the row is scaled
   rather than restyled — `transform-origin` keeps it pinned to the left edge
   instead of drifting right as it grows. */
.page-product #product-comments-list .sk-rv-card__head .grade-stars {
  transform: scale(1.15);
  transform-origin: left center;
}

@media (prefers-reduced-motion: no-preference) {
  .page-product #product-comments-list .sk-rv-card__byline {
    transition: background-color var(--sk-dur) var(--sk-ease);
  }
}

@media (hover: hover) {
  .page-product #product-comments-list .comment.sk-rv-card:hover .sk-rv-card__byline {
    background: var(--sk-brand-tint);
  }
}

@media (max-width: 575.98px) {
  .page-product #product-comments-list .comment.sk-rv-card { padding: var(--sk-5); }
  .page-product #product-comments-list .sk-rv-card .comment-text { font-size: 1rem; }
}

/* =============================================================================
   21. Reviews as a card GRID  (v13, 2026-09-01)

   §20 gave each review a testimonial treatment but left it a full-width strip:
   at 1440 that is a ~1300px bar holding two lines of text, which is a row, not
   a card. Laid out three-up they read as cards — the shape the reference was.

   `#product-comments-list` is emptied and rebuilt by list-comments.js on every
   page turn, so the grid has to live on the CONTAINER. Anything set on the
   cards themselves would be discarded with them.
   ========================================================================== */
.page-product #product-comments-list {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-4);
  align-items: stretch;
}

@media (min-width: 768px) {
  .page-product #product-comments-list {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--sk-5);
  }
}

@media (min-width: 1200px) {
  .page-product #product-comments-list {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* The card fills its cell and lays its own contents out top-to-bottom, so cards
   sharing a row end level however much text each one holds. */
.page-product #product-comments-list .comment.sk-rv-card {
  display: flex;
  flex-direction: column;
  height: 100%;
  /* Spacing is the grid's now — a bottom margin here would double the gap. */
  margin: 0;
  padding: var(--sk-5);
}

/* Pinned to the bottom edge so the helpful/report row lines up across a row of
   cards instead of floating under each block of text.

   `margin-top: auto` only spaces the card that has slack — the TALLEST card in
   a row has none, so its divider landed a few pixels under the last line of
   text while its neighbours had room to spare. The padding is the floor that
   holds under either. */
.page-product #product-comments-list .sk-rv-card__actions {
  margin-top: auto;
  padding-top: var(--sk-5);
}

.page-product #product-comments-list .sk-rv-card .comment-content {
  margin-bottom: var(--sk-2);
}

/* ---- Type, re-fitted to a ~400px column --------------------------------
   The sizes in §20 were chosen against a full-width strip; unchanged in a
   third of that width the title wrapped to three lines on its own. */
.page-product #product-comments-list .sk-rv-card .comment-title {
  font-size: clamp(1.0625rem, 1rem + .25vw, 1.1875rem);
}

.page-product #product-comments-list .sk-rv-card .comment-text {
  font-size: .9375rem;
  line-height: 1.65;
}

/* The byline pill has to survive a long name in a narrow column. */
.page-product #product-comments-list .sk-rv-card__byline {
  max-width: 100%;
  min-width: 0;
  flex-wrap: wrap;
  row-gap: 2px;
}

.page-product #product-comments-list .sk-rv-card .comment-author {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Proportional to the smaller card. */
.page-product #product-comments-list .comment.sk-rv-card::before {
  font-size: 4.5rem;
  top: .06em;
  right: .18em;
}

/* The actions row is built for a wide strip — "Report" is pushed to the far
   right with `margin-left: auto` — and in a narrow card that split it awkwardly
   from the controls it belongs beside. */
@media (min-width: 768px) {
  .page-product #product-comments-list .sk-rv-card__actions {
    flex-wrap: wrap;
    gap: var(--sk-2) var(--sk-3);
  }

  .page-product #product-comments-list .sk-rv-card__actions .report-abuse {
    margin-left: 0;
  }

  .page-product #product-comments-list .sk-rv-card__useful-label {
    flex: 1 1 100%;
  }
}

/* =============================================================================
   22. The information section as a TAB STRIP, and a gallery that keeps up
       (v35, 2026-09-02)

   Two changes, one goal: get the page down from the 6,167px it measured at
   1440px wide to something a buyer will actually read to the end of.

   22a. THE DEAD COLUMN.  Products 20 and 22 have exactly ONE image each
        (`cj9b_image`), so the gallery column finished around y=1000 while the
        buy column ran on to y=1600. Six hundred pixels of blank white sat
        beside the price, the highlights and the enquiry panel — the most
        important part of the page, framed by nothing. Making the gallery
        sticky spends that emptiness instead of printing it: the photograph
        stays with the buyer while they read down the buy column, which is what
        the space was for.

   22b. THE STACK.  See product-premium.js §22 for why the sections are
        redistributed rather than restyled.

   EVERY rule below is gated behind `.is-tabbed`, which the script adds only
   after all three panels are built and populated. No JavaScript, or a throw
   anywhere in that function, and the page keeps the stacked accordions it has
   always had, fully readable. That is deliberate: this file must never be the
   reason a section becomes unreachable.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   22a. Sticky gallery
   ------------------------------------------------------------------------ */
@media (min-width: 992px) {
  .page-product .product__left {
    position: sticky;
    /* Clears the theme's sticky header; the extra 16px is breathing room so the
       photo does not appear welded to the header's underside. */
    top: calc(var(--sk-header-h, 72px) + 16px);
    align-self: start;
    /* `align-self: start` is what actually makes this work. A Bootstrap grid
       column is a flex item that stretches to the row's height by default, and
       a full-height box has nothing to scroll WITHIN, so `position: sticky`
       silently does nothing. This is the line people miss. */
  }
}

/* Below lg the columns are stacked, so sticky would pin the photo over the
   copy. Explicitly off rather than merely unset. */
@media (max-width: 991.98px) {
  .page-product .product__left { position: static; }
}

/* ---------------------------------------------------------------------------
   22b. The strip
   ------------------------------------------------------------------------ */

/* While tabs are on, the accordion the panels were BUILT from must not also
   render — it is an empty shell by then, but an empty shell still has borders
   and margins. */
.sk-pdp-info.is-tabbed > .product__infos,
.sk-pdp-info.is-tabbed > .sk-reviews-host {
  display: none;
}

.sk-tabs {
  margin-top: var(--sk-6);
}

/* The bar is sticky so a buyer three screens into the specifications can move
   to the reviews without scrolling back up for the control. `barwrap` carries
   the stickiness and the background; `bar` carries the layout — separating them
   is what lets the underline be positioned against the bar while the backdrop
   still spans the full width. */
.sk-tabs__barwrap {
  position: sticky;
  top: var(--sk-header-h, 72px);
  z-index: 20;
  background: var(--sk-surface);
  border-bottom: 1px solid var(--sk-border);
  /* Bleeds the backdrop to the container edges so the bar reads as a rule
     across the page rather than a floating pill. */
  margin: 0 calc(var(--sk-4) * -1);
  padding: 0 var(--sk-4);
}

.sk-tabs__bar {
  position: relative;
  display: flex;
  gap: var(--sk-5);
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}

.sk-tabs__bar::-webkit-scrollbar { display: none; }

.sk-tabs__tab {
  position: relative;
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: var(--sk-2);
  padding: var(--sk-4) 2px calc(var(--sk-4) - 2px);
  border: 0;
  background: none;
  font: inherit;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: .01em;
  color: var(--sk-muted);
  white-space: nowrap;
  cursor: pointer;
  transition: color var(--sk-dur) var(--sk-ease);
}

.sk-tabs__tab:hover { color: var(--sk-ink); }

.sk-tabs__tab.is-active { color: var(--sk-brand); }

/* The count is a fact about the tab, not a badge shouting for attention, so it
   is set quieter than its label and only picks up brand colour when active. */
.sk-tabs__tab-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface-2);
  color: var(--sk-muted);
  font-size: 12px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  transition: background var(--sk-dur) var(--sk-ease), color var(--sk-dur) var(--sk-ease);
}

.sk-tabs__tab.is-active .sk-tabs__tab-count {
  background: var(--sk-brand-tint);
  color: var(--sk-brand);
}

/* One element that slides between tabs. A border-bottom toggled per button
   would give the same picture and none of the movement — and the movement is
   the part that tells the eye the two tabs are the same control in two states,
   rather than two unrelated things lighting up. */
.sk-tabs__ink {
  position: absolute;
  left: 0;
  bottom: 0;
  height: 2px;
  width: 0;
  border-radius: 2px 2px 0 0;
  background: var(--sk-brand);
  transform: translateX(0);
  transition: transform var(--sk-dur) var(--sk-ease), width var(--sk-dur) var(--sk-ease);
  pointer-events: none;
}

.sk-tabs__panel {
  padding-top: var(--sk-5);
  /* A tab panel is focusable so keyboard users land somewhere after choosing a
     tab, but it is not an interactive control and must not wear a focus ring
     for a mouse click. */
  outline: none;
  animation: sk-tab-in var(--sk-dur) var(--sk-ease) both;
}

@keyframes sk-tab-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

/* --- Sections once they are inside a panel --- */

/* In the Specifications tab the sections are forced open and their toggle is
   disabled by the script, so the affordances of a collapsible have to go too —
   a chevron on something that cannot collapse is a broken promise. */
.sk-tabs__panel .rt-sec--plain > .rt-sec__head .rt-sec__toggle {
  cursor: default;
  pointer-events: none;
}

.sk-tabs__panel .rt-sec--plain .rt-sec__chevron { display: none; }

/* The description's first section no longer needs a rule above it: the tab bar
   is already the boundary. */
.sk-tabs__panel > .rt-sec:first-child { border-top: 0; }

.sk-tabs__panel > .rt-sec__lead {
  margin-bottom: var(--sk-5);
}

/* The reviews host was a page-footer block with its own top margin and rule
   sized to separate it from the accessories above it. Inside a tab it is the
   only thing there. */
.sk-tabs__panel .sk-reviews-host {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

/* ---------------------------------------------------------------------------
   22c. Responsive
   ------------------------------------------------------------------------ */
@media (max-width: 767.98px) {
  .sk-tabs__barwrap {
    margin: 0 calc(var(--sk-3) * -1);
    padding: 0 var(--sk-3);
  }

  .sk-tabs__bar { gap: var(--sk-4); }

  .sk-tabs__tab {
    font-size: 14px;
    padding: var(--sk-3) 2px calc(var(--sk-3) - 2px);
  }
}

/* ---------------------------------------------------------------------------
   22d. Reduced motion
   ------------------------------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
  .sk-tabs__ink { transition: none; }
  .sk-tabs__panel { animation: none; }
}

/* =============================================================================
   23. "Runs with this machine" — the consumables rail   (v35, 2026-09-02)

   See the header of `catalog/_partials/product-accessories.tpl` for why this is
   a rail and not a grid, and why the section is not called "You might also
   like".

   The card is deliberately quieter than a listing miniature. A buyer on this
   page has already chosen the machine; the consumables are a reminder, not a
   competing decision, and thirteen cards all shouting would turn the bottom of
   the page into a second shop front. So: no flags, no discount ribbons, one
   accent (the add button), and the price set at body weight.
   ========================================================================== */

/* The spacing lives on the WRAPPER, not on the <section> — see the long note in
   `catalog/_partials/product-accessories.tpl` for why. Short version: a
   `<section>` that is a direct child of `#content-wrapper` has its top margin
   and padding zeroed by an ID-led `!important` rule in Hummingbird's own
   theme.css, which no class-based rule of ours can outrank. The wrapper moves
   the section out of that selector's reach, and then ordinary margins work. */
.sk-runs-wrap {
  margin-top: var(--sk-7);
  padding-top: var(--sk-6);
  border-top: 1px solid var(--sk-border);
}

.sk-runs {
  margin: 0;
  padding: 0;
}

/* --- Header --- */
.sk-runs__head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--sk-4);
  margin-bottom: var(--sk-5);
}

.sk-runs__headings { min-width: 0; }

.sk-runs__title {
  margin: 0;
  font-family: var(--sk-serif);
  font-size: clamp(22px, 2.4vw, 28px);
  font-weight: 700;
  line-height: 1.15;
  color: var(--sk-ink);
}

.sk-runs__sub {
  margin: 6px 0 0;
  font-size: 14px;
  line-height: 1.5;
  color: var(--sk-muted);
  max-width: 62ch;
}

.sk-runs__tools {
  display: flex;
  align-items: center;
  gap: var(--sk-4);
  flex: 0 0 auto;
}

.sk-runs__all {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 14px;
  font-weight: 600;
  color: var(--sk-brand);
  text-decoration: none;
  white-space: nowrap;
}

.sk-runs__all svg { width: 16px; height: 16px; transition: transform var(--sk-dur) var(--sk-ease); }
.sk-runs__all:hover { color: var(--sk-brand-dark); }
.sk-runs__all:hover svg { transform: translateX(3px); }

/* --- Arrows (added by JS only when the rail overflows) --- */
.sk-runs__nav { display: flex; gap: 6px; }

.sk-runs__arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 1px solid var(--sk-border-strong);
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface);
  color: var(--sk-ink);
  cursor: pointer;
  transition: background var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease),
              color var(--sk-dur) var(--sk-ease),
              opacity var(--sk-dur) var(--sk-ease);
}

.sk-runs__arrow svg { width: 18px; height: 18px; }

.sk-runs__arrow:hover:not(:disabled) {
  border-color: var(--sk-brand);
  background: var(--sk-brand-tint);
  color: var(--sk-brand);
}

/* Disabled rather than hidden at the ends: a control that vanishes makes the
   row jump sideways every time you reach an edge. */
.sk-runs__arrow:disabled { opacity: .35; cursor: default; }

/* --- The rail --- */
.sk-runs__rail {
  display: flex;
  gap: var(--sk-4);
  margin: 0;
  /* The negative inline margin plus matching padding lets the first and last
     card sit flush with the page gutter while the row still scrolls edge to
     edge — without it the rail looks inset from everything above it. */
  padding: 4px var(--sk-4) var(--sk-4);
  margin-inline: calc(var(--sk-4) * -1);
  list-style: none;
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x proximity;
  scroll-behavior: smooth;
  scrollbar-width: thin;
  scrollbar-color: var(--sk-border-strong) transparent;
  -webkit-overflow-scrolling: touch;
}

.sk-runs__rail::-webkit-scrollbar { height: 6px; }
.sk-runs__rail::-webkit-scrollbar-track { background: transparent; }
.sk-runs__rail::-webkit-scrollbar-thumb {
  background: var(--sk-border-strong);
  border-radius: var(--sk-r-pill);
}
.sk-runs__rail:hover::-webkit-scrollbar-thumb { background: var(--sk-muted); }

.sk-runs__item {
  flex: 0 0 auto;
  width: 190px;
  scroll-snap-align: start;
}

/* --- The card --- */
.sk-run-card {
  display: flex;
  flex-direction: column;
  height: 100%;
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
  overflow: hidden;
  transition: border-color var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease);
}

.sk-run-card:hover {
  border-color: var(--sk-border-strong);
  box-shadow: var(--sk-shadow-md);
  transform: translateY(-2px);
}

.sk-run-card__media {
  display: block;
  aspect-ratio: 1 / 1;
  background: var(--sk-surface-2);
  overflow: hidden;
}

.sk-run-card__media img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* Small parts photographed on white need room to read as objects rather than
     as a texture filling a tile. */
  padding: 10px;
  transition: transform 420ms var(--sk-ease);
}

.sk-run-card:hover .sk-run-card__media img { transform: scale(1.05); }

.sk-run-card__noimg { display: block; width: 100%; height: 100%; }

.sk-run-card__body {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  gap: var(--sk-3);
  padding: var(--sk-3);
}

.sk-run-card__name {
  margin: 0;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.35;
  /* Names here run to 90 characters ("Diamond Sorting Tray DSSMT-04 — 2.0mm to
     2.5mm (20×40 Deep-Pocket, 800 Stones)"). Clamped to two lines so one long
     name cannot set the height of the whole rail. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.sk-run-card__name a {
  color: var(--sk-ink);
  text-decoration: none;
}

.sk-run-card__name a:hover { color: var(--sk-brand); }

.sk-run-card__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sk-2);
  margin-top: auto;
}

.sk-run-card__price {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.2;
  color: var(--sk-ink);
  font-variant-numeric: tabular-nums;
}

.sk-run-card__price--quote {
  font-size: 13px;
  font-weight: 600;
  color: var(--sk-muted);
}

.sk-run-card__was {
  display: block;
  font-size: 12px;
  font-weight: 500;
  color: var(--sk-muted);
  text-decoration: line-through;
}

.sk-run-card__form { margin: 0; }

.sk-run-card__add {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 1px solid var(--sk-brand);
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface);
  color: var(--sk-brand);
  cursor: pointer;
  text-decoration: none;
  transition: background var(--sk-dur) var(--sk-ease),
              color var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease);
}

.sk-run-card__add svg { width: 18px; height: 18px; }

.sk-run-card__add:hover {
  background: var(--sk-brand);
  color: #fff;
  transform: scale(1.06);
}

.sk-run-card__add:active { transform: scale(.96); }

/* theme-premium.js puts `is-added` on the form (its `closest('form')` wrapper)
   after the cart responds. The button below is reached THROUGH that wrapper for
   the reason documented in theme-premium.js: the theme's own bundle rewrites
   the button's className mid-flight, so a class placed on the button itself
   does not survive. */
.sk-run-card__form.is-added .sk-run-card__add {
  background: var(--sk-ok);
  border-color: var(--sk-ok);
  color: #fff;
}

.sk-run-card__form.is-added .sk-run-card__add-icon path { d: path('M20 6 9 17l-5-5'); }

/* --- Responsive --- */
@media (max-width: 767.98px) {
  .sk-runs-wrap { margin-top: var(--sk-6); padding-top: var(--sk-5); }
  .sk-runs__item { width: 158px; }
  .sk-runs__rail {
    padding-inline: var(--sk-3);
    margin-inline: calc(var(--sk-3) * -1);
  }
  /* Arrows are pointer affordances; the rail is already swipeable here. */
  .sk-runs__nav { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .sk-runs__rail { scroll-behavior: auto; }
  .sk-run-card,
  .sk-run-card__media img,
  .sk-run-card__add,
  .sk-runs__all svg { transition: none; }
  .sk-run-card:hover { transform: none; }
  .sk-run-card:hover .sk-run-card__media img { transform: none; }
}

/* =============================================================================
   24. "Add it while you're here" — consumables inside the cart modal
       (v37, 2026-09-02)

   See product-premium.js §24 for where the cards come from (cloned from the
   rail, not fetched).

   The design problem is that this block sits directly under the cart total, at
   the exact moment the shopper has decided to spend money — so it has to be
   easy to act on and equally easy to ignore. If it competes with "Proceed to
   checkout" it costs an order. Hence: rows, not cards; one line each; the add
   control an outline circle rather than a filled button; and no imagery larger
   than a thumbnail.
   ========================================================================== */

.sk-suggest {
  margin-top: var(--sk-4, 16px);
  padding-top: var(--sk-4, 16px);
  border-top: 1px solid var(--sk-border, #ebe5ed);
}

.sk-suggest__title {
  margin: 0 0 10px;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .01em;
  color: var(--sk-body, #4b4550);
}

.sk-suggest__list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sk-suggest__item { margin: 0; }

/* A row, not a card: three of these have to fit under a cart total without
   turning a confirmation into a catalogue. */
.sk-suggest-card {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px;
  border: 1px solid var(--sk-border, #ebe5ed);
  border-radius: 10px;
  background: var(--sk-surface, #fff);
  transition: border-color 180ms ease, background 180ms ease;
}

.sk-suggest-card:hover {
  border-color: var(--sk-border-strong, #ddd3e0);
  background: var(--sk-surface-2, #faf7fa);
}

.sk-suggest-card__media {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: 8px;
  background: var(--sk-surface-2, #faf7fa);
  overflow: hidden;
}

.sk-suggest-card__media img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  padding: 3px;
}

.sk-suggest-card__body {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex: 1 1 auto;
  min-width: 0;
  padding: 0;
}

.sk-suggest-card__name {
  margin: 0;
  min-width: 0;
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.3;
  /* One line only. In a modal the name is an identifier, not a description —
     the shopper already knows what a 503 nozzle is, and two lines here would
     push the checkout button below the fold on a phone. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.sk-suggest-card__name a {
  color: var(--sk-ink, #1a0010);
  text-decoration: none;
}

.sk-suggest-card__name a:hover { color: var(--sk-brand, #d50075); }

.sk-suggest-card__foot {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  margin: 0;
}

.sk-suggest-card__price {
  margin: 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--sk-ink, #1a0010);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.sk-suggest-card__was { display: none; }

.sk-suggest-card__add {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: 1px solid var(--sk-brand, #d50075);
  border-radius: 999px;
  background: transparent;
  color: var(--sk-brand, #d50075);
  cursor: pointer;
  transition: background 180ms ease, color 180ms ease, transform 180ms ease;
}

.sk-suggest-card__add svg { width: 16px; height: 16px; }

.sk-suggest-card__add:hover {
  background: var(--sk-brand, #d50075);
  color: #fff;
}

.sk-suggest-card__add:active { transform: scale(.94); }

/* Same wrapper-based state as the rail — theme-premium.js marks the FORM,
   because the theme's own bundle rewrites the button mid-request. */
.sk-suggest-card .sk-run-card__form.is-added .sk-suggest-card__add,
.sk-suggest-card form.is-added .sk-suggest-card__add {
  background: var(--sk-ok, #0f7a45);
  border-color: var(--sk-ok, #0f7a45);
  color: #fff;
}

@media (max-width: 575.98px) {
  /* The modal is a bottom sheet at this width (theme-premium.css §11), so the
     suggestions must never be the reason the checkout button needs a scroll.
     Two rows is the most that fits above the fold on a small phone. */
  .sk-suggest__item:nth-child(n + 3) { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .sk-suggest-card,
  .sk-suggest-card__add { transition: none; }
  .sk-suggest-card__add:active { transform: none; }
}

/* =============================================================================
   25. Review photos — upload field, thumbnail strip, lightbox
       (v39, 2026-09-02)

   Stock productcomments has no image support at all; the table, the upload
   handling and the JSON are additions documented in
   `modules/productcomments/SEMSONS-CUSTOMISATIONS.md`.

   The strip in a review card is sized so that a review WITH photos does not
   tower over one without — on a page where most reviews will have none, a
   photographed review that is three times the height reads as promoted rather
   than as merely more helpful.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   25a. The upload field, inside the post-a-review modal
   ------------------------------------------------------------------------ */
.sk-rv-photos__label {
  display: block;
  margin-bottom: 6px;
  font-weight: 600;
}

.sk-rv-photos__optional {
  margin-left: 4px;
  font-weight: 400;
  color: var(--sk-muted, #756e7d);
}

.sk-rv-photos__drop {
  position: relative;
  border: 1px dashed var(--sk-border-strong, #ddd3e0);
  border-radius: var(--sk-r-md, 14px);
  background: var(--sk-surface-2, #faf7fa);
  transition: border-color 180ms ease, background 180ms ease;
}

.sk-rv-photos__drop.is-dragover {
  border-color: var(--sk-brand, #d50075);
  background: var(--sk-brand-tint, #fef0f7);
}

/* Visually hidden, NOT display:none — the input must stay focusable so the
   field is reachable by keyboard and its label actually labels something.
   `display:none` would remove it from the accessibility tree and from the tab
   order, and some browsers then refuse to open the picker from the label. */
.sk-rv-photos__input {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.sk-rv-photos__cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 18px 16px;
  margin: 0;
  cursor: pointer;
  color: var(--sk-body, #4b4550);
  text-align: left;
}

.sk-rv-photos__cta svg { width: 22px; height: 22px; color: var(--sk-brand, #d50075); flex: 0 0 auto; }

.sk-rv-photos__cta-text { display: flex; flex-direction: column; line-height: 1.3; }
.sk-rv-photos__cta-text strong { font-size: 14px; color: var(--sk-ink, #1a0010); }

.sk-rv-photos__cta-hint {
  font-size: 12.5px;
  color: var(--sk-muted, #756e7d);
}

/* The input is visually hidden, so its focus ring has nothing to draw around.
   Move the ring to the drop zone, which is what the user perceives as the
   control. Without this the field is invisible to keyboard users. */
.sk-rv-photos__input:focus-visible + .sk-rv-photos__cta {
  outline: 2px solid var(--sk-brand, #d50075);
  outline-offset: -2px;
  border-radius: var(--sk-r-md, 14px);
}

.sk-rv-photos__list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sk-rv-photos.has-photos .sk-rv-photos__list { margin-top: 10px; }

.sk-rv-photos__thumb {
  position: relative;
  width: 64px;
  height: 64px;
  border-radius: 10px;
  overflow: hidden;
  background: var(--sk-surface-2, #faf7fa);
  border: 1px solid var(--sk-border, #ebe5ed);
}

.sk-rv-photos__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

.sk-rv-photos__remove {
  position: absolute;
  top: 3px;
  right: 3px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  /* Dark rather than brand-coloured: this destroys the thing under it, and a
     pink button on a pink-accented form reads as "confirm". */
  background: rgba(26, 0, 16, .68);
  color: #fff;
  cursor: pointer;
}

.sk-rv-photos__remove svg { width: 11px; height: 11px; }
.sk-rv-photos__remove:hover { background: rgba(26, 0, 16, .88); }

.sk-rv-photos__error {
  margin: 8px 0 0;
  font-size: 12.5px;
  line-height: 1.45;
  color: #b3261e;
}

/* ---------------------------------------------------------------------------
   25b. The strip inside a review card
   ------------------------------------------------------------------------ */
.sk-rv-shots {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 10px 0 0;
  padding: 0;
  list-style: none;
}

.sk-rv-shots__item { margin: 0; }

.sk-rv-shots__btn {
  display: block;
  width: 58px;
  height: 58px;
  padding: 0;
  border: 1px solid var(--sk-border, #ebe5ed);
  border-radius: 8px;
  overflow: hidden;
  background: var(--sk-surface-2, #faf7fa);
  cursor: zoom-in;
  transition: border-color 180ms ease, transform 180ms ease;
}

.sk-rv-shots__btn img { width: 100%; height: 100%; object-fit: cover; display: block; }

.sk-rv-shots__btn:hover {
  border-color: var(--sk-brand, #d50075);
  transform: scale(1.04);
}

/* ---------------------------------------------------------------------------
   25c. The lightbox
   ------------------------------------------------------------------------ */
.sk-rvlb {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  align-items: center;
  justify-content: center;
}

.sk-rvlb[hidden] { display: none; }

.sk-rvlb__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(16, 0, 10, .82);
  animation: sk-rvlb-fade 180ms ease both;
}

.sk-rvlb__frame {
  position: relative;
  display: flex;
  align-items: center;
  gap: 12px;
  max-width: min(92vw, 1100px);
  max-height: 88vh;
  animation: sk-rvlb-pop 220ms cubic-bezier(.2, .7, .3, 1) both;
}

.sk-rvlb__img {
  max-width: 100%;
  /* Leaves room for the counter beneath without the image ever pushing it off
     screen on a short viewport. */
  max-height: 82vh;
  border-radius: 10px;
  background: #fff;
  box-shadow: 0 24px 70px rgba(0, 0, 0, .5);
  object-fit: contain;
}

.sk-rvlb__close,
.sk-rvlb__nav {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, .92);
  color: #1a0010;
  cursor: pointer;
  flex: 0 0 auto;
  transition: background 180ms ease, transform 180ms ease;
}

.sk-rvlb__close { position: absolute; top: -14px; right: -14px; z-index: 2; }
.sk-rvlb__close svg,
.sk-rvlb__nav svg { width: 20px; height: 20px; }

.sk-rvlb__close:hover,
.sk-rvlb__nav:hover { background: #fff; transform: scale(1.06); }

.sk-rvlb__count {
  position: absolute;
  left: 50%;
  bottom: -30px;
  transform: translateX(-50%);
  margin: 0;
  font-size: 13px;
  font-variant-numeric: tabular-nums;
  color: rgba(255, 255, 255, .85);
  white-space: nowrap;
}

@keyframes sk-rvlb-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes sk-rvlb-pop  { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: none; } }

@media (max-width: 575.98px) {
  .sk-rvlb__frame { max-width: 94vw; gap: 4px; }
  .sk-rvlb__close { top: -10px; right: -6px; width: 36px; height: 36px; }
  /* On a phone the arrows would sit over the photo and cover it. Swipe is not
     implemented, so the counter plus tapping the edges is the fallback — the
     arrows stay, just tucked in tighter. */
  .sk-rvlb__nav { width: 34px; height: 34px; }
  .sk-rv-photos__thumb { width: 56px; height: 56px; }
}

@media (prefers-reduced-motion: reduce) {
  .sk-rvlb__backdrop,
  .sk-rvlb__frame { animation: none; }
  .sk-rv-shots__btn,
  .sk-rvlb__close,
  .sk-rvlb__nav { transition: none; }
  .sk-rv-shots__btn:hover { transform: none; }
  .sk-rvlb__close:hover,
  .sk-rvlb__nav:hover { transform: none; }
}

/* =============================================================================
   26. Content-authored fonts are overridden   (v40, 2026-09-02)

   181 of the product descriptions in this catalogue — checked with
   `SELECT ... WHERE description LIKE '%font-family%'` — carry
   `font-family: Arial, sans-serif` hardcoded as an INLINE style, almost always
   on a spec table pasted in from a document:

       <table style="width:100%; border-collapse:collapse;
                     font-family:Arial, sans-serif; font-size:14px;">

   An inline style beats every selector in this file, so those tables rendered
   in Arial while the rest of the page was Inter — two sans faces side by side
   on the same screen, which reads as a rendering fault rather than a choice.

   FIXED IN CSS, NOT IN THE DATABASE, deliberately. Stripping it from the stored
   HTML would be 181 UPDATEs against live product copy, and it would not stay
   fixed: the same markup arrives again with the next description pasted from a
   document. One rule covers every product, today's and tomorrow's.

   `inherit` rather than a named family, so the text picks up whatever its
   container already uses — Inter in prose, and the serif in any context that
   sets one — instead of this rule becoming a second place where the brand font
   is declared.

   `!important` is the only thing that outranks an inline style. It is used here
   for the same reason it is used on the table padding and borders in §7, which
   have exactly this problem.
   ========================================================================== */
.page-product .product__description [style*="font-family"],
.page-product .product__description [style*="font-family"] * {
  font-family: inherit !important;
}

/* The same descriptions also inline `font-size`, which is how a spec table ends
   up at 14px inside prose set at 16px and headings set in rem. Only the table
   case is corrected — an inline font-size on a heading may well be deliberate
   emphasis, and blanket-overriding every one of them would flatten copy this
   file has no business reinterpreting. */
.page-product .product__description table[style*="font-size"],
.page-product .product__description table[style*="font-size"] th,
.page-product .product__description table[style*="font-size"] td {
  font-size: inherit !important;
}

/* Restores the sizes §7 intends for the table, which the line above would
   otherwise flatten to the surrounding prose size. */
.page-product .product__description table[style*="font-size"] {
  font-size: .9375rem !important;
}

.page-product .product__description table[style*="font-size"] th {
  font-size: .75rem !important;
}

/* =============================================================================
   27. The decision sections   (v41, 2026-09-02)

   The block between the buy column and the tab strip: highlights, spec summary,
   suitability, what's included, how it works, applications, documents.

   ONE SHARED SHELL, `.sk-sec`. Seven sections that each invented their own
   heading size and spacing would read as seven different pages stapled
   together. The brief's own warning applies — "a professional page does not
   mean 25 sections + animations + gradients". Restraint here IS the design:
   one heading treatment, one rule between sections, one card style, and colour
   used only where it carries meaning (the tick, the cross, the step number).
   ========================================================================== */

.sk-sections {
  margin-top: var(--sk-7);
}

.sk-sec {
  padding-top: var(--sk-6);
  padding-bottom: var(--sk-6);
  border-top: 1px solid var(--sk-border);
}

.sk-sec:first-child { border-top: 0; padding-top: 0; }

.sk-sec[hidden] { display: none !important; }

.sk-sec__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sk-3);
  margin-bottom: var(--sk-5);
}

.sk-sec__title {
  margin: 0;
  font-family: var(--sk-serif);
  font-size: clamp(20px, 2.1vw, 25px);
  font-weight: 700;
  line-height: 1.15;
  color: var(--sk-ink);
}

.sk-sec__more {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 14px;
  font-weight: 600;
  color: var(--sk-brand);
  text-decoration: none;
  white-space: nowrap;
}

.sk-sec__more svg { width: 16px; height: 16px; transition: transform var(--sk-dur) var(--sk-ease); }
.sk-sec__more:hover { color: var(--sk-brand-dark); }
.sk-sec__more:hover svg { transform: translateX(3px); }

/* ---------------------------------------------------------------------------
   27a. Highlights — the four headline figures
   ------------------------------------------------------------------------ */
.sk-hl {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1px;
  margin: 0;
  padding: 0;
  list-style: none;
  /* The 1px gap over a border-coloured ground draws every divider in the grid
     with no per-cell border rules and no double lines at the joins. */
  background: var(--sk-border);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  overflow: hidden;
}

@media (min-width: 768px) {
  .sk-hl { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.sk-hl__item {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: var(--sk-5) var(--sk-4);
  background: var(--sk-surface);
  text-align: center;
}

.sk-hl__value {
  font-size: clamp(22px, 2.6vw, 30px);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.02em;
  color: var(--sk-ink);
  font-variant-numeric: tabular-nums;
}

.sk-hl__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--sk-muted);
}

/* ---------------------------------------------------------------------------
   27b. Spec summary
   ------------------------------------------------------------------------ */
.sk-specs {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1px;
  margin: 0;
  background: var(--sk-border);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  overflow: hidden;
}

@media (min-width: 768px) {
  /* Two label/value pairs per row. `dt` and `dd` alternate in source order, so
     a four-column grid lays them out in pairs with no wrapper elements. */
  .sk-specs { grid-template-columns: auto 1fr auto 1fr; }
}

.sk-specs__label,
.sk-specs__value {
  margin: 0;
  padding: 14px var(--sk-4);
  background: var(--sk-surface);
  font-size: 14.5px;
  line-height: 1.45;
}

.sk-specs__label {
  font-weight: 600;
  color: var(--sk-ink);
  white-space: nowrap;
}

.sk-specs__value { color: var(--sk-body); }

@media (max-width: 767.98px) {
  /* Stacked: the label sits directly on its value with no rule between them, so
     a pair reads as one unit rather than as two table cells. */
  .sk-specs__label { padding-bottom: 0; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--sk-muted); }
  .sk-specs__value { padding-top: 2px; font-weight: 600; color: var(--sk-ink); }
}

/* ---------------------------------------------------------------------------
   27c. Suitability
   ------------------------------------------------------------------------ */
.sk-fit {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-4);
}

@media (min-width: 768px) {
  .sk-fit { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sk-5); }
}

.sk-fit__col {
  padding: var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
}

/* The "not for" column is deliberately NOT red. It is honest advice, not a
   warning or an error — colouring it like a failure makes a consultative
   section read as a disclaimer. It gets a quieter ground instead. */
.sk-fit__col--no { background: var(--sk-surface-2); }

.sk-fit__head {
  margin: 0 0 var(--sk-3);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--sk-muted);
}

.sk-fit__col--yes .sk-fit__head { color: var(--sk-ok); }

.sk-fit__list {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sk-fit__list li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 15px;
  line-height: 1.5;
  color: var(--sk-body);
}

.sk-fit__icon { flex: 0 0 auto; width: 17px; height: 17px; margin-top: 3px; }
.sk-fit__col--yes .sk-fit__icon { color: var(--sk-ok); }
.sk-fit__col--no .sk-fit__icon { color: var(--sk-muted); }

/* ---------------------------------------------------------------------------
   27d. What's included
   ------------------------------------------------------------------------ */
.sk-inc {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px var(--sk-5);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 576px) { .sk-inc { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 992px) { .sk-inc { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.sk-inc__item {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 15px;
  line-height: 1.5;
  color: var(--sk-body);
}

.sk-inc__icon { flex: 0 0 auto; width: 17px; height: 17px; margin-top: 3px; color: var(--sk-ok); }

.sk-inc-opt {
  margin-top: var(--sk-5);
  padding: var(--sk-4) var(--sk-5);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
  border: 1px solid var(--sk-border);
}

.sk-inc-opt__head {
  margin: 0 0 6px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--sk-muted);
}

.sk-inc-opt__list {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
  margin: 0;
  padding: 0 0 0 18px;
  font-size: 14.5px;
  color: var(--sk-body);
}

/* ---------------------------------------------------------------------------
   27e. How it works
   ------------------------------------------------------------------------ */
.sk-how {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-4);
  margin: 0;
  padding: 0;
  list-style: none;
  counter-reset: none;
}

@media (min-width: 768px) {
  .sk-how { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--sk-5); }
}

.sk-how__step {
  position: relative;
  display: flex;
  gap: var(--sk-3);
  padding: var(--sk-4);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
}

@media (min-width: 768px) {
  .sk-how__step { flex-direction: column; gap: 10px; }
}

.sk-how__num {
  flex: 0 0 auto;
  font-family: var(--sk-serif);
  font-size: 26px;
  font-weight: 700;
  line-height: 1;
  color: var(--sk-brand);
  font-variant-numeric: tabular-nums;
  opacity: .85;
}

.sk-how__title {
  margin: 0 0 2px;
  font-size: 15px;
  font-weight: 700;
  color: var(--sk-ink);
}

.sk-how__text {
  margin: 0;
  font-size: 14px;
  line-height: 1.55;
  color: var(--sk-body);
}

/* ---------------------------------------------------------------------------
   27f. Applications
   ------------------------------------------------------------------------ */
.sk-apps {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sk-apps__item {
  padding: 9px var(--sk-4);
  border: 1px solid var(--sk-border-strong);
  border-radius: var(--sk-r-pill);
  background: var(--sk-surface);
  font-size: 14.5px;
  font-weight: 600;
  color: var(--sk-ink);
}

/* ---------------------------------------------------------------------------
   27g. Documents
   ------------------------------------------------------------------------ */
.sk-docs {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 768px) { .sk-docs { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); } }

.sk-docs__link {
  display: flex;
  align-items: center;
  gap: var(--sk-3);
  padding: var(--sk-4);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
  text-decoration: none;
  transition: border-color var(--sk-dur) var(--sk-ease), box-shadow var(--sk-dur) var(--sk-ease);
}

.sk-docs__link:hover { border-color: var(--sk-brand); box-shadow: var(--sk-shadow-sm); }

.sk-docs__icon { flex: 0 0 auto; width: 26px; height: 26px; color: var(--sk-brand); }
.sk-docs__text { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.sk-docs__name { font-size: 15px; font-weight: 600; color: var(--sk-ink); }
.sk-docs__meta { font-size: 12.5px; color: var(--sk-muted); }
.sk-docs__desc { font-size: 13px; color: var(--sk-body); margin-top: 2px; }
.sk-docs__dl { flex: 0 0 auto; width: 18px; height: 18px; color: var(--sk-muted); }
.sk-docs__link:hover .sk-docs__dl { color: var(--sk-brand); }

@media (prefers-reduced-motion: reduce) {
  .sk-sec__more svg,
  .sk-docs__link { transition: none; }
  .sk-sec__more:hover svg { transform: none; }
}

/* =============================================================================
   28. Buy now   (v42, 2026-09-02)

   Consumables and tools only. The brief asked for a clear hierarchy — "don't
   make all four buttons visually equal" — so this is the one solid brand-filled
   control in the buy column, and "Add to cart" beneath it stays the pink
   outline it already was.

   On a MACHINE this never renders, and the hierarchy there is different by
   design: Enquire is the filled control, because the real conversion on a
   quote-driven capital machine is a conversation.
   ========================================================================== */

.sk-buynow {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  margin-bottom: var(--sk-3);
  padding: 15px var(--sk-5);
  border: 1px solid var(--sk-brand);
  border-radius: var(--sk-r-pill);
  background: var(--sk-brand);
  color: #fff;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: .01em;
  text-decoration: none;
  box-shadow: var(--sk-shadow-cta);
  transition: background var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

.sk-buynow:hover {
  background: var(--sk-brand-dark);
  border-color: var(--sk-brand-dark);
  color: #fff;
  transform: translateY(-1px);
  box-shadow: 0 8px 22px rgba(213, 0, 117, .3);
}

.sk-buynow:active { transform: translateY(0); }

.sk-buynow__icon { width: 19px; height: 19px; flex: 0 0 auto; }

/* While the cart request is in flight. `pointer-events: none` is what actually
   prevents a second submission — the JS guard covers its own handler, but not a
   shopper double-clicking faster than the class is applied. */
.sk-buynow.is-working {
  pointer-events: none;
  opacity: .75;
}

.sk-buynow.is-working .sk-buynow__icon {
  animation: sk-buynow-pulse 900ms ease-in-out infinite;
}

@keyframes sk-buynow-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: .35; }
}

@media (prefers-reduced-motion: reduce) {
  .sk-buynow { transition: none; }
  .sk-buynow:hover { transform: none; }
  .sk-buynow.is-working .sk-buynow__icon { animation: none; }
}

/* =============================================================================
   26. "Complete your setup" — the rail's selection layer   (v1, 2026-09-02)

   Two pieces: a checkbox on each rail card, and the totals panel under the
   rail. See product-premium.js §26 for why the rail is the picker rather than
   a second list of the same products.

   Both ship `hidden` from the template and are unhidden by the script, so
   nothing here hides readable content — the rule in PRODUCT-PAGE-FORMAT §7
   still holds. These are controls that cannot function without JavaScript, not
   copy.
   ========================================================================== */

/* ---- the card checkbox -------------------------------------------------- */

/* The card is the positioning context. `.sk-run-card` sets `overflow: hidden`,
   so the control has to sit fully inside the card's box — it is inset rather
   than straddling the corner. */
.sk-run-card--pickable { position: relative; }

.sk-run-card__pick {
  position: absolute;
  top: var(--sk-2);
  left: var(--sk-2);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  cursor: pointer;
  /* The visible box is 24px but the hit area is padded out to 44px, which is
     the touch-target floor the rest of this page holds to. */
  padding: 10px;
}

/* The real control stays in the DOM and in the tab order — it is made
   transparent, not `display: none`, for the same reason the contact form's file
   input is (THEME.md §4a). Screen readers and keyboards get the genuine
   checkbox; the painted box below is decoration. */
.sk-run-card__pick-input {
  position: absolute;
  width: 44px;
  height: 44px;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.sk-run-card__pick-box {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: 1.5px solid var(--sk-border-strong);
  border-radius: 7px;
  background: var(--sk-surface);
  box-shadow: var(--sk-shadow-sm);
  transition: background-color var(--sk-dur) var(--sk-ease),
              border-color var(--sk-dur) var(--sk-ease);
}

.sk-run-card__pick-box svg {
  width: 14px;
  height: 14px;
  color: #fff;
  opacity: 0;
  transform: scale(.6);
  transition: opacity var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease);
}

.sk-run-card__pick-input:checked + .sk-run-card__pick-box {
  background: var(--sk-brand);
  border-color: var(--sk-brand);
}

.sk-run-card__pick-input:checked + .sk-run-card__pick-box svg {
  opacity: 1;
  transform: scale(1);
}

/* `:focus-visible` on the input, ring drawn on the box beside it — the input
   itself is invisible, so its own ring would be too. */
.sk-run-card__pick-input:focus-visible + .sk-run-card__pick-box {
  outline: 2px solid var(--sk-brand);
  outline-offset: 2px;
}

.sk-run-card.is-picked {
  border-color: var(--sk-brand);
  box-shadow: 0 0 0 1px var(--sk-brand) inset;
}

/* ---- the totals panel --------------------------------------------------- */

.sk-setup {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sk-3) var(--sk-5);
  margin-top: var(--sk-5);
  padding: var(--sk-4) var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
  transition: border-color var(--sk-dur) var(--sk-ease),
              background-color var(--sk-dur) var(--sk-ease);
}

/* The panel only takes on brand weight once it has something to act on.
   Idle, it is a quiet instruction; active, it is a checkout affordance. */
.sk-setup.has-selection {
  border-color: var(--sk-brand);
  background: var(--sk-brand-tint);
}

.sk-setup__intro {
  flex: 1 1 260px;
  min-width: 0;
}

.sk-setup__title {
  margin: 0;
  font-size: 1rem;
  font-weight: 650;
  color: var(--sk-ink);
  letter-spacing: -.01em;
}

.sk-setup__hint {
  margin: 2px 0 0;
  font-size: .8125rem;
  line-height: 1.45;
  color: var(--sk-muted);
}

.sk-setup__totals {
  flex: 0 0 auto;
  text-align: right;
  /* Reserves the row's height so unticking everything does not collapse the
     panel and jump the page. */
  min-height: 2.4rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.sk-setup__count {
  margin: 0;
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--sk-muted);
}

.sk-setup__amount {
  margin: 0;
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--sk-ink);
  font-variant-numeric: lining-nums tabular-nums;
}

.sk-setup__add {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding: 0 var(--sk-5);
  border: 0;
  border-radius: var(--sk-r-pill);
  background: var(--sk-brand);
  color: #fff;
  font-size: .9375rem;
  font-weight: 650;
  cursor: pointer;
  transition: background-color var(--sk-dur) var(--sk-ease),
              transform var(--sk-dur) var(--sk-ease),
              box-shadow var(--sk-dur) var(--sk-ease);
}

.sk-setup__add:hover:not(:disabled) {
  background: var(--sk-brand-dark);
  transform: translateY(-1px);
  box-shadow: var(--sk-shadow-cta);
}

.sk-setup__add:active:not(:disabled) { transform: translateY(0); }

.sk-setup__add:focus-visible {
  outline: 2px solid var(--sk-brand);
  outline-offset: 3px;
}

/* Disabled is the panel's RESTING state — nothing is ticked yet — so it is
   styled as a calm unavailable control, not as an error. */
.sk-setup__add:disabled {
  background: var(--sk-border-strong);
  color: var(--sk-surface);
  cursor: not-allowed;
}

.sk-setup.is-busy .sk-setup__add {
  pointer-events: none;
  opacity: .75;
}

.sk-setup__error {
  flex: 1 1 100%;
  margin: 0;
  font-size: .8125rem;
  line-height: 1.5;
  color: #a11212;
}

/* ---- phones ------------------------------------------------------------- */

@media (max-width: 575.98px) {
  .sk-setup {
    padding: var(--sk-4);
    gap: var(--sk-3);
  }

  .sk-setup__intro { flex: 1 1 100%; }

  /* Figures left, button right, both on one row: the panel stays two lines
     tall on a phone instead of three stacked blocks. */
  .sk-setup__totals {
    flex: 1 1 auto;
    text-align: left;
  }

  .sk-setup__add {
    flex: 0 0 auto;
    padding: 0 var(--sk-4);
  }
}

@media (prefers-reduced-motion: reduce) {
  .sk-setup,
  .sk-setup__add,
  .sk-run-card__pick-box,
  .sk-run-card__pick-box svg { transition: none; }
  .sk-setup__add:hover:not(:disabled) { transform: none; }
}

/* =============================================================================
   29. Trust strip   (v43, 2026-09-02)

   `displayReassurance` moved out of the buy column and onto the page — see the
   note in catalog/product.tpl for why.

   blockreassurance renders a fixed shape we do not control:

       .blockreassurance_product > div > span.item-product > img.svg
                                       > p.block-title

   so the layout here is applied to the module's own elements rather than to
   markup of ours. It is styled, not rebuilt: no template override, nothing to
   re-apply if the module updates.

   Deliberately a LIGHTWEIGHT strip and not five cards. These are page-level
   assurances, not product features — given card weight they would compete with
   the highlights row directly beneath them, which carries the numbers a buyer
   is actually here for.
   ========================================================================== */

.sk-trust {
  margin-top: var(--sk-6);
  padding: var(--sk-4) var(--sk-5);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
}

.sk-trust .blockreassurance_product {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  /* `justify-content: center` would leave a ragged last row on the breakpoint
     where three items wrap to two. Start-aligned with a generous gap stays
     even at every width. */
  gap: var(--sk-3) var(--sk-7);
  margin: 0;
  padding: 0;
}

.sk-trust .blockreassurance_product > div {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  padding: 0;
  border: 0;
}

.sk-trust .blockreassurance_product .item-product {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  flex: 0 0 auto;
  margin: 0;
  border-radius: 50%;
  background: var(--sk-brand-tint);
}

.sk-trust .blockreassurance_product .item-product img,
.sk-trust .blockreassurance_product .item-product svg {
  width: 15px;
  height: 15px;
  /* The module ships these as `<img class="svg invisible">` and un-hides them
     with its own script once it has inlined them. Forcing visibility here would
     show a broken image on the frames before that runs, so opacity is left to
     the module and only the box is sized. */
}

.sk-trust .blockreassurance_product .block-title {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.3;
  /* The module writes `style="color:#000000"` inline on every title, which is
     off-palette against the page's ink. An inline style needs !important to
     override — the same situation as the pasted description fonts in §26. */
  color: var(--sk-ink) !important;
  white-space: nowrap;
}

/* The buy column's own trust styling (§5) no longer has a target, but the class
   is left defined there rather than deleted: `.product__trust` is still the
   documented hook name in THEME.md §5, and a future layout may want it back. */

@media (max-width: 767.98px) {
  .sk-trust {
    padding: var(--sk-3) var(--sk-4);
    /* Bleeds to the gutters so five claims can use the full screen width
       instead of wrapping to four rows inside an inset card. */
    margin-inline: calc(var(--sk-3) * -1);
    border-radius: 0;
    border-inline: 0;
  }

  .sk-trust .blockreassurance_product { gap: 10px var(--sk-5); }
  .sk-trust .blockreassurance_product .block-title { font-size: 13px; }
  .sk-trust .blockreassurance_product .item-product { width: 26px; height: 26px; }
  .sk-trust .blockreassurance_product .item-product img { width: 13px; height: 13px; }
}

/* =============================================================================
   30. "Why this machine"   (v44, 2026-09-02)

   The benefit list moved out of the buy column by product-premium.js §30.

   The copy is authored as `✔ <strong>Claim</strong> — the elaboration`, so each
   bullet already carries its own hierarchy. The styling below reads that shape
   rather than imposing one: the bold lead is the claim, the rest is support,
   and the tick becomes a real mark instead of a character sitting in the text.
   ========================================================================== */

.sk-why > ul {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sk-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 640px)  { .sk-why > ul { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sk-3) var(--sk-5); } }
@media (min-width: 1200px) { .sk-why > ul { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.sk-why > ul > li {
  position: relative;
  margin: 0;
  padding: var(--sk-4) var(--sk-4) var(--sk-4) 44px;
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface);
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--sk-body);
  /* The list-item marker is suppressed above; `break-inside` keeps a bullet
     whole if the grid ever falls back to columns. */
  break-inside: avoid;
  transition: border-color var(--sk-dur) var(--sk-ease);
}

@media (hover: hover) {
  .sk-why > ul > li:hover { border-color: var(--sk-border-strong); }
}

/* The tick is drawn, not typed. The copy opens each bullet with a literal "✔"
   character, which inherits the body font, sits on the text baseline and cannot
   be coloured independently. Hiding it and painting a circled mark in its place
   gives every bullet the same optical alignment regardless of how the copy was
   punctuated — and products whose bullets have no ✔ at all still line up. */
.sk-why > ul > li::before {
  content: "";
  position: absolute;
  left: var(--sk-4);
  top: calc(var(--sk-4) + 1px);
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--sk-brand-tint);
  /* An inline SVG tick as a mask, so it takes the brand colour from
     `background-color` and needs no extra element in the markup. */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d50075' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 12px;
}

.sk-why > ul > li strong,
.sk-why > ul > li b {
  display: block;
  margin-bottom: 2px;
  font-size: 15px;
  font-weight: 700;
  color: var(--sk-ink);
}

@media (prefers-reduced-motion: reduce) {
  .sk-why > ul > li { transition: none; }
}

/* ---------------------------------------------------------------------------
   30b. Rhythm between the decision sections and the tab strip

   `.sk-sec` ends with 32px of its own padding and `.product__tabs-row` opens
   with 48px of margin, so the join carried 80px of dead space — enough that the
   tab strip read as belonging to a different page than the section above it.

   The tab strip is a change of MODE (decision → reference), so it should still
   have the largest gap on the page; it just does not need both. The section's
   trailing padding is dropped where a sections block is present and the margin
   alone provides the break.
   ------------------------------------------------------------------------ */
.sk-sections > .sk-sec:last-child { padding-bottom: 0; }

/* =============================================================================
   31. Collapsed section rows are a control, not a prose heading   (v46)

   Measured on product 20 at 1440px: each COLLAPSED row in the Overview tab was
   taking ~142px for a single line of heading. Eight sections meant roughly
   1,140px of page that is almost entirely empty — by a distance the least dense
   part of the redesigned page.

   The cause is inheritance, not a rule anyone wrote for accordions.
   `sectionizeDescription()` builds each row as an `<h3 class="rt-sec__head">`,
   and that `<h3>` sits inside `.product__description`, so it picks up the prose
   heading treatment from §7:

       margin: 48px 0 24px;  padding-bottom: 12px;  + a 44x3 brand underline

   That styling is right for a heading introducing paragraphs. It is wrong for a
   button: ~85px of decoration on top of the toggle's own 56px min-height and
   padding, and a decorative rule under a row that already has `border-top` as
   its separator — so every collapsed row carried two horizontal lines.

   The row keeps its own border, its min-height and its hit area. Only the
   inherited prose decoration is removed.
   ========================================================================== */

.page-product .product__description .rt-sec__head {
  margin: 0;
  padding-bottom: 0;
}

/* The decorative underline belongs to prose headings. On a collapsed row it is
   a second rule 3px below the first. */
.page-product .product__description .rt-sec__head::after {
  content: none;
}

/* The toggle carries the row's whole hit area, so the padding lives here where
   it is also the touch target. 52px keeps it comfortably above the 44px
   minimum on a phone. */
.page-product .rt-sec__toggle {
  min-height: 52px;
  padding: var(--sk-3) 0;
}

/* An OPEN section still needs air between its heading and its body — that gap
   was previously coming from the h3's bottom margin, which is now gone. */
.page-product .rt-sec.is-open > .rt-sec__head { margin-bottom: var(--sk-3); }

/* In the Specifications tab the sections are forced open and their toggle is
   retired (§22), so the row reads as a heading again rather than a control. It
   gets its weight back — but from padding, not from the 48px prose margin. */
.sk-tabs__panel .rt-sec--plain > .rt-sec__head .rt-sec__toggle {
  min-height: 0;
  padding: var(--sk-4) 0 var(--sk-2);
}

/* =============================================================================
   31. Tiered pricing table   (v1, 2026-09-02)

   Sits directly under the price panel, because it is a statement ABOUT the
   price rather than a separate offer. Quiet by default — it is reference, not a
   banner — with the saving column carrying the only colour.
   ========================================================================== */

.sk-tier {
  margin-top: var(--sk-4);
  padding: var(--sk-4);
  border: 1px solid var(--sk-border);
  border-radius: var(--sk-r-md);
  background: var(--sk-surface-2);
}

.sk-tier__title {
  margin: 0 0 var(--sk-3);
  font-size: .75rem;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--sk-muted);
}

.sk-tier__table {
  width: 100%;
  border-collapse: collapse;
  font-size: .875rem;
}

.sk-tier__table th,
.sk-tier__table td {
  padding: var(--sk-2) 0;
  text-align: left;
  vertical-align: baseline;
}

.sk-tier__table thead th {
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--sk-muted);
  border-bottom: 1px solid var(--sk-border);
  padding-bottom: var(--sk-2);
}

.sk-tier__row + .sk-tier__row th,
.sk-tier__row + .sk-tier__row td {
  border-top: 1px solid var(--sk-border);
}

.sk-tier__qty {
  font-weight: 600;
  color: var(--sk-ink);
  white-space: nowrap;
}

.sk-tier__price {
  font-weight: 650;
  color: var(--sk-ink);
  font-variant-numeric: lining-nums tabular-nums;
  white-space: nowrap;
}

.sk-tier__save {
  color: var(--sk-ok);
  font-weight: 600;
  font-variant-numeric: lining-nums tabular-nums;
  white-space: nowrap;
  text-align: right;
}

/* The prompt that changes with the quantity field. Reads as guidance until the
   threshold is met, then as confirmation. */
.sk-tier__note {
  margin: var(--sk-3) 0 0;
  font-size: .8125rem;
  line-height: 1.5;
  font-weight: 600;
  color: var(--sk-brand);
}

.sk-tier__note.is-unlocked { color: var(--sk-ok); }

/* The cap is a condition of the offer, so it is always present but never
   competes with it. */
.sk-tier__cap,
.sk-tier__remaining {
  margin: var(--sk-2) 0 0;
  font-size: .75rem;
  line-height: 1.5;
  color: var(--sk-muted);
}

.sk-tier__remaining { color: var(--sk-warn); font-weight: 600; }

/* =============================================================================
   32. The sticky purchase bar on DESKTOP   (v1, 2026-09-02)

   §10 built this bar and then switched it off above 992px
   (`display: none !important`), so on a desktop the purchase controls simply
   left the screen once the buy column scrolled away — on a page that is now
   several thousand pixels of decision sections, specs, rail and reviews.

   This turns it back on at that width and re-proportions it: centred, capped
   to the page measure, with the product NAME added (product-premium.js §33),
   which a phone has no room for but a desktop does.

   It is the same element and the same controls as the phone bar — nothing is
   duplicated, and the IntersectionObserver that reveals it is unchanged, so it
   still appears only once the real add-to-cart has scrolled out of view.
   ========================================================================== */

@media (min-width: 992px) {
  /* Overrides §10's `display: none !important`, which is why this needs
     `!important` too — equal specificity would otherwise lose to it. */
  .js-sticky-atc-bar {
    display: flex !important;
    align-items: center;
    gap: var(--sk-4);

    /* Centred and capped rather than edge-to-edge: a 1440px-wide bar with a
       button at each end makes the eye travel the whole screen. */
    left: 50%;
    right: auto;
    transform: translateX(-50%) translateY(120%);
    width: min(1140px, calc(100vw - 48px));
    bottom: var(--sk-4);

    padding: var(--sk-3) var(--sk-4);
    border: 1px solid var(--sk-border);
    border-radius: var(--sk-r-pill);
    box-shadow: var(--sk-shadow-md);
    transition: transform var(--sk-dur) var(--sk-ease);
  }

  .js-sticky-atc-bar.is-visible {
    transform: translateX(-50%) translateY(0);
  }

  /* The product name only exists at this width — §33 adds it, CSS decides
     whether it is seen, so a resize never leaves a stale decision behind. */
  .js-sticky-atc-bar .sticky-atc__name {
    flex: 1 1 auto;
    min-width: 0;
    font-size: .9375rem;
    font-weight: 650;
    color: var(--sk-ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .js-sticky-atc-bar .sticky-atc__price {
    flex: 0 0 auto;
    font-size: 1.0625rem;
    font-weight: 700;
    font-variant-numeric: lining-nums tabular-nums;
  }

  .js-sticky-atc-bar .sticky-atc__button {
    flex: 0 0 auto;
    min-height: 44px;
    padding: 0 var(--sk-5);
    border-radius: var(--sk-r-pill);
  }

  /* On a phone the cart control is demoted to an icon beside WhatsApp (§10).
     A desktop has the room to label it, so the compact treatment is undone. */
  .js-sticky-atc-bar .sticky-atc__button--compact .sticky-atc__button-label {
    position: static;
    width: auto;
    height: auto;
    margin: 0;
    overflow: visible;
    clip: auto;
    clip-path: none;
    white-space: nowrap;
  }

  .js-sticky-atc-bar .sticky-atc__enquire,
  .js-sticky-atc-bar .sticky-atc__call {
    flex: 0 0 auto;
    min-height: 44px;
  }
}

/* The name is phone-only clutter — it is in the DOM at every width so that a
   resize needs no JavaScript, and hidden here rather than not built. */
@media (max-width: 991.98px) {
  .js-sticky-atc-bar .sticky-atc__name { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .js-sticky-atc-bar { transition: none; }
}
