/* ==========================================================================
   RASVO — SS26 DESIGN LAYER
   Author: design pass. Safe to edit. Uses only additive rules.
   ========================================================================== */



/* ---------- 0 · BASE ---------------------------------------------------- */
html{scroll-behavior:smooth}
body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
::selection{background:var(--rv-ink);color:var(--rv-cream)}
a:focus-visible,button:focus-visible,input:focus-visible,
.elementor-button:focus-visible{outline:2px solid var(--rv-gold);outline-offset:4px;border-radius:1px}
.elementor-267 img{max-width:100%;height:auto}

/* ---------- 1 · HERO ---------------------------------------------------- */
.rasvo-v2-hero{
  background-image:url('/wp-content/uploads/2026/07/rasvo-hero-ss26.jpg')!important;
  background-size:cover!important;
  background-position:74% center!important;
  background-repeat:no-repeat!important;
  background-color:#0C141F!important;
  min-height:clamp(580px,86vh,980px)!important;
  position:relative;overflow:hidden;isolation:isolate;
}
.rasvo-v2-hero::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(8,13,20,.88) 0%,rgba(8,13,20,.66) 24%,rgba(8,13,20,.22) 54%,rgba(8,13,20,0) 76%),
    linear-gradient(0deg,rgba(8,13,20,.58) 0%,rgba(8,13,20,0) 46%);
}
.rasvo-v2-hero > .e-con-inner,.rasvo-v2-hero > .elementor-element{position:relative;z-index:1}
.rasvo-v2-hero .elementor-heading-title{
  color:var(--rv-cream)!important;letter-spacing:-.022em;
  text-shadow:0 2px 60px rgba(0,0,0,.45);
}
.rasvo-v2-hero p{color:rgba(250,249,246,.80)!important;text-shadow:0 1px 24px rgba(0,0,0,.5)}
/* Primary CTA = terracotta, everywhere (review 2026-08-01, "button colours").
   The purchase funnel (PDP add-to-bag, sticky bar, proceed-to-checkout, place-order)
   was already terracotta; the top of the funnel was cream, so the one colour the
   brand reserves for "this is the action" appeared only after the shopper had
   already committed. Same token, same hover shade (#A84722) as the funnel buttons.
   Only .elementor-button is targeted — the secondary "THE FABRIC" link carries no
   such class and stays a ghost link, preserving the primary/secondary hierarchy.
   Revert = drop this block; the cream fill is Elementor page-level styling. */
.rasvo-v2-hero .elementor-button{
  background-color:var(--rasvo-terracotta,#C2542B)!important;
  color:var(--rasvo-paper,#FFFEFA)!important;
  border:1px solid var(--rasvo-terracotta,#C2542B)!important;
  transition:background-color .5s var(--rv-e),color .5s var(--rv-e),transform .5s var(--rv-e);
  will-change:transform;
}
.rasvo-v2-hero .elementor-button:hover{
  background-color:#A84722!important;border-color:#A84722!important;
  color:var(--rasvo-paper,#FFFEFA)!important;transform:translateY(-2px);
}
.rasvo-v2-hero::after{
  content:"";position:absolute;left:50%;bottom:22px;width:1px;height:56px;z-index:2;
  background:linear-gradient(180deg,rgba(250,249,246,0),rgba(250,249,246,.7));
  animation:rvCue 2.6s var(--rv-e) infinite;
}
@keyframes rvCue{
  0%{opacity:0;transform:translateY(-16px) scaleY(.35)}
  35%{opacity:1}
  100%{opacity:0;transform:translateY(16px) scaleY(1)}
}

/* ---------- 2 · SPEC STRIP ---------------------------------------------- */
.rasvo-v2-strip{
  border-top:1px solid var(--rv-line);
  border-bottom:1px solid var(--rv-line);
}
/* Review 5 issue #5: rgba(12,20,31,.52) on #FAF9F6 measured 3.68:1 at 12px —
   the only AA failure on the homepage, and it hit all four spec-strip items.
   --rasvo-v2-muted-on-light (#4A515C, 7.60:1) is the design system's existing
   "muted text on paper" token, already used across the site; reuse beats a
   bespoke alpha so there is one muted value, not two. */
.rasvo-v2-strip p{color:var(--rasvo-v2-muted-on-light,#4A515C)!important}

/* ---------- 3 · PRODUCT CARDS ------------------------------------------- */
.elementor-loop-container.elementor-grid{
  column-gap:clamp(16px,1.8vw,34px)!important;
  row-gap:clamp(48px,5vw,88px)!important;
}
.rasvo-card{padding:0!important;transition:transform .6s var(--rv-e)}
.rasvo-card__media{
  position:relative;overflow:hidden;
  aspect-ratio:4/5;height:auto!important;min-height:0!important;
  background:var(--rv-sand);
  box-shadow:inset 0 0 0 1px rgba(12,20,31,.055);
}
.rasvo-card__media > .elementor-widget-image{
  position:absolute!important;inset:0;margin:0!important;width:100%;height:100%;
}
.rasvo-card__media > .elementor-widget-image > .elementor-widget-container{width:100%;height:100%}
.rasvo-card__media a{display:block!important;width:100%;height:100%}
.rasvo-card__media img{
  width:100%!important;height:100%!important;padding:0!important;
  object-fit:cover;object-position:center 48%;display:block!important;
  transition:transform 1.15s var(--rv-e),filter .7s var(--rv-e);
}
.rasvo-card:hover .rasvo-card__media img,
.rasvo-card:focus-within .rasvo-card__media img{transform:scale(1.055)}
.rasvo-card__spec{z-index:3;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
/* Session 31: 20px → 12px. The card meta was 103px tall for 68px of content;
   the extra padding was pushing name + price below the fold on the shop grid. */
.rasvo-card__body{padding:12px 2px 0!important}
.rasvo-card__name a{
  text-decoration:none!important;
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .55s var(--rv-e);
}
.rasvo-card:hover .rasvo-card__name a{background-size:100% 1px}
.rasvo-card__colors span{
  box-shadow:0 0 0 1px rgba(12,20,31,.22),inset 0 0 0 2px var(--rv-cream);
  border-radius:50%;
}
.rasvo-card__sizes span{
  transition:color .35s var(--rv-e),opacity .35s var(--rv-e);
  opacity:1;
}
.rasvo-card:hover .rasvo-card__sizes span{opacity:1}
.rasvo-card__sizes span:hover{color:var(--rv-ink)}

/* ---------- 4 · THE COTTON ---------------------------------------------- */
.elementor-element-3a743d3{
  background-image:url('/wp-content/uploads/2026/07/rasvo-fabric-detail.jpg')!important;
  background-size:cover!important;background-position:center!important;background-repeat:no-repeat!important;
  aspect-ratio:2/1;height:auto!important;min-height:0!important;
  box-shadow:inset 0 0 0 1px rgba(250,249,246,.10);
  position:relative;overflow:hidden;
}
.elementor-element-3a743d3::after{
  content:"240 GSM · COMBED · BIO-WASHED";
  position:absolute;left:0;right:0;bottom:0;
  padding:14px 18px;
  font:500 12px/1 "Geist Mono",ui-monospace,monospace;letter-spacing:.22em;
  color:rgba(250,249,246,.72);
  background:linear-gradient(0deg,rgba(8,13,20,.72),rgba(8,13,20,0));
}
.rasvo-v2-cotton .elementor-widget-heading .elementor-heading-title{letter-spacing:-.02em}

/* ---------- 5 · THE FIT -------------------------------------------------- */
.elementor-element-1b6ab5f,
.elementor-element-112e058{
  aspect-ratio:3/2;height:auto!important;min-height:0!important;
  background-size:cover!important;background-position:center!important;background-repeat:no-repeat!important;
  box-shadow:inset 0 0 0 1px rgba(12,20,31,.08);
  transition:transform .8s var(--rv-e),box-shadow .8s var(--rv-e);
}
.elementor-element-1b6ab5f{background-image:url('/wp-content/uploads/2026/07/rasvo-fit-oversized.jpg')!important}
.elementor-element-112e058{background-image:url('/wp-content/uploads/2026/07/rasvo-fit-regular.jpg')!important}
.elementor-element-1b6ab5f:hover,
.elementor-element-112e058:hover{
  transform:translateY(-4px);
  box-shadow:inset 0 0 0 1px rgba(12,20,31,.14),0 22px 48px -28px rgba(12,20,31,.45);
}

/* ---------- 6 · WORN BY YOU (UGC) ---------------------------------------- */
.elementor-element-a861325,
.elementor-element-37d0e49,
.elementor-element-a23dd70,
.elementor-element-fa2f3ce,
.elementor-element-82bfc64{
  aspect-ratio:1/1;height:auto!important;min-height:0!important;
  background-size:cover!important;background-position:center!important;background-repeat:no-repeat!important;
  box-shadow:inset 0 0 0 1px rgba(12,20,31,.07);
  filter:grayscale(.10) contrast(1.02);
  transition:transform .75s var(--rv-e),filter .75s var(--rv-e),box-shadow .75s var(--rv-e);
}
.elementor-element-a861325{background-image:url('/wp-content/uploads/2026/07/rasvo-detail-keycap-print.jpg')!important}
.elementor-element-37d0e49{background-image:url('/wp-content/uploads/2026/07/rasvo-worn-sprint-mode.jpg')!important}
.elementor-element-a23dd70{background-image:url('/wp-content/uploads/2026/07/rasvo-woven-label.jpg')!important}
.elementor-element-fa2f3ce{background-image:url('/wp-content/uploads/2026/07/rasvo-folded-stack.jpg')!important}
.elementor-element-82bfc64{background-image:url('/wp-content/uploads/2026/07/rasvo-detail-increment-print.jpg')!important}
.elementor-element-a861325:hover,
.elementor-element-37d0e49:hover,
.elementor-element-a23dd70:hover,
.elementor-element-fa2f3ce:hover,
.elementor-element-82bfc64:hover{
  transform:translateY(-6px);filter:none;
  box-shadow:inset 0 0 0 1px rgba(12,20,31,.12),0 24px 46px -26px rgba(12,20,31,.5);
}

/* ---------- 7 · MANIFESTO ------------------------------------------------ */
.rasvo-v2-manifesto .elementor-heading-title{letter-spacing:-.025em}

/* ---------- 8 · NEWSLETTER ----------------------------------------------- */
.rasvo-v2-news input[type=email],
.rasvo-v2-news input[type=text]{
  background:transparent!important;
  border:0!important;border-bottom:1px solid var(--rv-line-i)!important;
  border-radius:0!important;color:var(--rv-cream)!important;
  padding:12px 2px!important;
  transition:border-color .45s var(--rv-e);
}
.rasvo-v2-news input::placeholder{color:rgba(250,249,246,.38)}
.rasvo-v2-news input[type=email]:focus{border-bottom-color:var(--rv-gold)!important;box-shadow:none!important;outline:none}
/* Newsletter submit — same primary-CTA treatment as the hero (see note above). */
.rasvo-v2-news button,
.rasvo-v2-news .elementor-button{
  background-color:var(--rasvo-terracotta,#C2542B)!important;
  color:var(--rasvo-paper,#FFFEFA)!important;
  border:1px solid var(--rasvo-terracotta,#C2542B)!important;border-radius:0!important;
  transition:background-color .45s var(--rv-e),color .45s var(--rv-e);
}
.rasvo-v2-news button:hover,
.rasvo-v2-news .elementor-button:hover{
  background-color:#A84722!important;border-color:#A84722!important;
  color:var(--rasvo-paper,#FFFEFA)!important;
}

/* ---------- 9 · HEADER --------------------------------------------------- */
/* BUGFIX 2026-07-31 (Session 28) — the glass used to sit on this element.
   A non-none backdrop-filter does TWO things, and each broke a header flyout:
     1. it makes the element a CONTAINING BLOCK for position:fixed descendants,
        so Elementor's side-cart (top:0;height:100%) resolved against this 81px
        row instead of the viewport, and the cart's own overflow:hidden then
        clipped the panel to 80px — the reported "cut off" cart;
     2. it makes the element a STACKING CONTEXT at z-index:auto, so the hero
        (later in the DOM) painted over it and the mobile/tablet dropdown was
        rendered behind page content — confirmed via elementFromPoint.
   Fix: paint the glass on a ::before CHILD — a child traps nothing — and give
   the row a real z-index so the header's stacking context sits above the page
   AND above the mobile tab bar (z:998), which the full-screen cart must cover.
   Do not move backdrop-filter back onto this element. */
.elementor-location-header .elementor-element-ab8f218{
  background-color:transparent!important;
  border-bottom:1px solid var(--rv-line);
  position:relative;
  z-index:999;
}
.elementor-location-header .elementor-element-ab8f218::before{
  content:"";
  position:absolute;
  inset:0;
  z-index:-1;
  pointer-events:none;
  background-color:rgba(250,249,246,.82);
  -webkit-backdrop-filter:saturate(140%) blur(12px);
  backdrop-filter:saturate(140%) blur(12px);
}
.elementor-location-header a{transition:opacity .35s var(--rv-e)}
.elementor-location-header a:hover{opacity:.55}

/* ---------- 10 · FOOTER -------------------------------------------------- */
.elementor-location-footer a{
  transition:color .35s var(--rv-e),opacity .35s var(--rv-e);
  text-decoration:none;
}
.elementor-location-footer a:hover{color:var(--rv-gold)!important;opacity:1}

/* ---------- 11 · GENERIC LINK / BUTTON POLISH ---------------------------- */
.elementor-267 a.elementor-button,
.elementor-267 .elementor-button-wrapper .elementor-button{
  border-radius:0!important;
  transition:background-color .5s var(--rv-e),color .5s var(--rv-e),transform .5s var(--rv-e);
}
.elementor-267 a.elementor-button:hover{transform:translateY(-2px)}

/* ---------- 12 · MOTION -------------------------------------------------- */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
  .rasvo-v2-hero::after{display:none}
}

/* ---------- 13 · RESPONSIVE ---------------------------------------------- */
@media (max-width:1024px){
  .rasvo-v2-hero{background-position:70% center!important;min-height:clamp(520px,74vh,760px)!important}
  .elementor-element-1b6ab5f,.elementor-element-112e058{aspect-ratio:16/10}
}
@media (max-width:767px){
  /* ---- Mobile hero: contained garment, not a cover-crop -------------------
     rasvo-hero-ss26.jpg is 2560x1000 (2.56:1) composed for a wide desktop band.
     Forced through background-size:cover into a ~375x675 box (0.56:1) only ~22%
     of the image width was visible, which landed on the LEFT SLEEVE — the garment
     read as an abstract dark texture and the print was cut off entirely.
     Vertical repositioning cannot help: at cover the image height exactly fills
     the box, so there is no vertical overflow to pan.
     Fix: stop cropping. Scale to ~37% of hero height and anchor bottom-right so
     the whole tee (and its print) reads, with the navy field carrying the copy
     above it. Desktop/tablet cover behaviour is untouched.
     REVISIT when real photography lands — a purpose-shot vertical crop is better
     than any CSS framing of a landscape composition (IMAGE_CONTRACT.md). */
  /* S34.10 (2026-08-01) — the reserved space and the garment did not agree.
     background-size:auto 37% made the tee 290px tall in a 784px hero, so its top
     edge landed at y=480, but padding-bottom only reserved 212px — content ran to
     y=572. The 92px overlap put the three-line spec caption ("240 GSM — COMBED
     COTTON / BIO-WASHED · PRE-SHRUNK / SCREEN-PRINTED BY HAND") straight across the
     collar and shoulders, and the -22px right anchor clipped the right shoulder.
     Sizing in px instead of % breaks the circular dependency (tee height was a
     percentage of a hero height that the padding itself determines), so the
     reserve can be stated once and stay true: 240 tee + 14 offset = 254 occupied,
     270 reserved, 16px of clear ground between copy and garment. */
  .rasvo-v2-hero{
    background-size:auto 240px!important;
    background-position:right -8px bottom 14px!important;
    background-color:var(--rv-ink)!important;
    min-height:clamp(560px,86vh,780px)!important;
    padding-bottom:270px!important;
  }
  .rasvo-v2-hero::before{
    background:
      linear-gradient(180deg,rgba(8,13,20,.40) 0%,rgba(8,13,20,.08) 30%,rgba(8,13,20,.22) 60%,rgba(8,13,20,.42) 100%);
  }
  .rasvo-v2-hero::after{display:none}
  .rasvo-card__media{aspect-ratio:4/5}
  /* 12px floor pushed the fit line past the 142px column. Tracking absorbs the
     common case ("Regular • 240 GSM" 146 -> 135px); "Oversized • 240 GSM" is two
     characters longer and still wraps, so the row reserves two lines rather than
     tightening further — the label voice survives and every card in a row ends at
     the same height instead of tees running 18px taller than shorts. */
  .rasvo-card__fit,.rasvo-card__fit p{letter-spacing:.06em!important}
  .rasvo-card__fit{min-height:36px}
  .elementor-loop-container.elementor-grid{row-gap:44px!important;column-gap:14px!important}
  .rasvo-card__body{padding:14px 2px 0!important}
  .elementor-element-3a743d3{aspect-ratio:3/2}
  .elementor-element-1b6ab5f,.elementor-element-112e058{aspect-ratio:4/3}
  /* S39.3 · Mobile section rhythm is owned HERE, not by Elementor: these
     !important rules outrank the per-section --padding-top/-bottom vars that
     the editor writes, so changing mobile padding in the Elementor UI has no
     effect on these sections. Desktop (128) and tablet (88) ARE editor-owned.
     Normalised 2026-08-02 to one value — it was .drop/.cotton/.fit at 76 and
     .manifesto at 96, while .community and .news matched nothing here and fell
     through to Elementor's 64, so mobile ran 76/76/76/96/64/64 and the gaps
     between sections came out 152/152/172/160/128. 76 is kept because it is
     what three of the six already used; this normalises, it does not retune. */
  .rasvo-v2-drop,.rasvo-v2-cotton,.rasvo-v2-fit,
  .rasvo-v2-manifesto,.rasvo-v2-community,.rasvo-v2-news{
    padding-top:76px!important;padding-bottom:76px!important}
}

/* ---------- 14 · OVERRIDES FOR THE ELEMENTOR KIT ------------------------- */
/* Kit ships product images as padded "contain" thumbnails. The SS26 photography
   is shot full-bleed at 4:5, so switch the card media to an edge-to-edge crop. */
.rasvo-card .rasvo-card__media .elementor-widget-image img,
.rasvo-card .rasvo-card__media a img,
.elementor-267 .rasvo-card .rasvo-card__media img{
  padding:0!important;
  width:100%!important;height:100%!important;
  object-fit:cover!important;
  object-position:center 50%!important;
}
.rasvo-card .rasvo-card__media{background:#EAE2CF!important}
.rasvo-card:hover .rasvo-card__media img,
.rasvo-card:focus-within .rasvo-card__media img{transform:scale(1.055)}

/* ---------- 15 · SINGLE PRODUCT ------------------------------------------ */
.single-product .woocommerce-product-gallery,
.single-product .woocommerce-product-gallery__wrapper,
.single-product .woocommerce-product-gallery__image{width:100%!important}
.single-product .woocommerce-product-gallery__image > a{display:block}
.single-product .woocommerce-product-gallery__image img{
  width:100%!important;height:auto!important;max-width:100%!important;display:block;
  border-radius:6px;
  box-shadow:0 26px 54px -36px rgba(12,20,31,.6);
}
.elementor-element-05584c8{background-color:#F2ECE0!important}
.single-product .flex-control-thumbs{
  display:flex;gap:10px;list-style:none;margin:12px 0 0;padding:0;
}
.single-product .flex-control-thumbs li{flex:0 0 74px;margin:0}
.single-product .flex-control-thumbs img{
  width:100%;height:auto;display:block;border-radius:4px;cursor:pointer;
  opacity:.5;transition:opacity .4s var(--rv-e);
}
.single-product .flex-control-thumbs img.flex-active,
.single-product .flex-control-thumbs img:hover{opacity:1}
.single-product .woocommerce-product-gallery__trigger{display:none}

/* ---------- 16 · SMALL FIXES --------------------------------------------- */
.elementor-element-0eae12e,
.elementor-element-0eae12e p,
.rasvo-v2-community .elementor-widget-text-editor a{white-space:nowrap}
.rasvo-v2-news button,
.rasvo-v2-news .elementor-button,
.rasvo-v2-news input[type=submit]{white-space:nowrap;min-width:152px}

/* ---------- 17 · RESPONSIVE REFINEMENTS ---------------------------------- */
@media (max-width:767px){
  /* was: .rasvo-v2-hero{background-position:80% center!important}
     Retired 2026-08-01 — superseded by the contained mobile hero in §13. This was
     one of three stacked cover-crop tunings for the same breakpoint; the last one
     to print silently won. See DECISIONS.md D-107. */
  /* spec strip reads as a 2-up grid instead of four stacked lines */
  .rasvo-v2-strip > .e-con-inner{
    display:grid!important;grid-template-columns:1fr 1fr;gap:10px 20px;
  }
  .rasvo-v2-strip > .e-con-inner > *{width:auto!important;max-width:none!important}
  /* UGC becomes a 2-up grid */
  .elementor-element-4b03532{
    display:grid!important;grid-template-columns:1fr 1fr;gap:12px!important;
  }
  .elementor-element-4b03532 > *{width:auto!important;max-width:none!important}
  /* archives go 2-up so the full drop is browsable */
  body.archive .elementor-loop-container.elementor-grid,
  body.post-type-archive-product .elementor-loop-container.elementor-grid,
  body.tax-product_cat .elementor-loop-container.elementor-grid{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
    column-gap:12px!important;row-gap:34px!important;
  }
  body.archive .rasvo-card__name,
  body.archive .rasvo-card__name .elementor-heading-title,
  body.post-type-archive-product .rasvo-card__name .elementor-heading-title{font-size:13px!important}
  .single-product .flex-control-thumbs li{flex:0 0 60px}
}
@media (min-width:768px) and (max-width:1024px){
  /* S40.4 · 84%, not 76%. `cover` crops horizontally as the viewport narrows, and
     at 76% the cut landed mid-graphic — the CHILL keycap was sliced by the right
     edge across the whole 768–1024 band, which reads as a broken image rather
     than a full-bleed crop. 84% brings the complete CTRL/ALT/CHILL lockup into
     frame. Checked against 92% and 100%, which do frame it but push the garment
     left until it collides with "Wear your identity."; 84% is the last value that
     keeps the headline clear of the print. */
  .rasvo-v2-hero{background-position:84% center!important}

  /* S40.4 · Trust strip as a deliberate 2x2 instead of an accidental 3+1.
     The four items measure 183+200+226+287 = 896px plus 3x24px gaps = 968px,
     against 945px of content width at 1024 and 755px at 834 — it physically
     cannot sit on one row anywhere in this band without dropping type below the
     12px floor used sitewide. It was already wrapping; it just wrapped badly,
     orphaning "CASH ON DELIVERY · 7-DAY EXCHANGE" alone on row two while the
     other three stayed spread. Two columns makes the wrap look chosen.
     Hooked on .rasvo-v2-strip, not the generated element id (ids change on
     template re-export — see S33.4). */
  .rasvo-v2-strip{
    display:grid!important;
    grid-template-columns:repeat(2,auto);
    justify-content:space-between;
    align-items:center;
    gap:10px 24px!important;
  }
}

/* ---------- 18 · CONTENT PAGES — BRAND ALIGNMENT -------------------------- */
/* The generated content pages inherit the kit's loud terracotta / chrome-yellow
   globals. Re-map them (outside the shop + homepage) to the SS26 palette so
   every page reads as the same brand. */
body:not(.home):not(.woocommerce):not(.woocommerce-page):not(.single-product){
  --e-global-color-secondary:#111B27;
  --e-global-color-accent:#8C6D44;
}
body:not(.home):not(.woocommerce-page) .elementor-button{
  border-radius:0!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;
  letter-spacing:.16em!important;text-transform:uppercase!important;
  font-size:12px!important;font-weight:500!important;
  padding:16px 26px!important;
  transition:background-color .5s var(--rv-e),color .5s var(--rv-e),border-color .5s var(--rv-e),transform .5s var(--rv-e);
}
body:not(.home):not(.woocommerce-page) .elementor-button:hover{transform:translateY(-2px)}
body:not(.home) h1.elementor-heading-title,
body:not(.home) h2.elementor-heading-title{
  font-weight:300!important;letter-spacing:-.022em!important;
}
/* kill leftover Elementor image placeholders on content pages */
.elementor-widget-image img[src*="placeholder.png"],
.elementor-widget-image img[src*="woocommerce-placeholder"]{display:none!important}
.elementor-widget-image:has(> .elementor-widget-container > img[src*="placeholder.png"]){display:none!important}

/* ---------- 19 · CARD MEDIA — GLOBAL (loop reused on every template) ------ */
.rasvo-card__media .elementor-widget-image .elementor-widget-container img,
.rasvo-card__media .elementor-widget-image img,
.rasvo-card__media > div a img{
  padding:0!important;
  width:100%!important;height:100%!important;
  object-fit:cover!important;object-position:center 50%!important;
  display:block!important;
}
.rasvo-card__media .elementor-widget-image,
.rasvo-card__media > .elementor-widget-image > .elementor-widget-container,
.rasvo-card__media a{height:100%}

/* ---------- 20 · STICKY PRODUCT GALLERY ---------------------------------- */
@media (min-width:1025px){
  .elementor-element-05584c8{position:sticky;top:104px;align-self:flex-start}
}

/* ---------- 21 · CONTENT PAGE HEADER ------------------------------------- */
.page-header{
  max-width:1240px;margin:0 auto;
  padding:clamp(46px,6vw,92px) clamp(20px,4vw,56px) clamp(22px,3vw,38px)!important;
}
.page-header .entry-title{
  font-family:Geist,system-ui,sans-serif!important;
  font-weight:300!important;letter-spacing:-.03em!important;
  font-size:clamp(32px,4.4vw,60px)!important;line-height:1.02!important;
  color:#0C141F!important;margin:0!important;padding:0!important;
}
.page-header::after{
  content:"";display:block;height:1px;background:var(--rv-line);
  margin-top:clamp(20px,2.6vw,34px);
}

/* ---------- 22 · REPLACE LEFTOVER DEMO IMAGERY --------------------------- */
/* The starter template shipped with a grey demo tile. Swap it for real SS26
   photography so no page renders an empty frame. */
img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-fabric-detail.jpg');
  width:100%!important;height:auto!important;
  aspect-ratio:4/3;object-fit:cover;object-position:center;
  border-radius:2px;filter:grayscale(.06);
}
.e-con:nth-child(4n+2) img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-folded-stack.jpg');
}
.e-con:nth-child(4n+3) img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-detail-keycap-print.jpg');
}
.e-con:nth-child(4n+4) img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-woven-label.jpg');
}

/* ---------- 23 · ABOUT — HIDE UNSOURCED TEAM ROSTER ---------------------- */
/* "Meet Our Team" ships with four placeholder people and no photography.
   Delete this rule once real portraits + names are in place. */
.page-id-101 .elementor-element-1ac930b{display:none!important}
.elementor-element-afcbbff{background-image:linear-gradient(rgba(8,13,20,.70),rgba(8,13,20,.78)),url('/wp-content/uploads/2026/07/rasvo-hero-ss26.jpg')!important}
.elementor-element-dfc9a06{background-image:linear-gradient(rgba(8,13,20,.76),rgba(8,13,20,.82)),url('/wp-content/uploads/2026/07/rasvo-detail-increment-print.jpg')!important}
.elementor-element-9fc3676{background-image:linear-gradient(rgba(8,13,20,.74),rgba(8,13,20,.80)),url('/wp-content/uploads/2026/07/rasvo-woven-label.jpg')!important}

/* ---------- 25 · DEMO IMAGE SWAP — SCOPED -------------------------------- */
/* Only content images get replaced; avatars keep their own small treatment. */
.elementor-widget-image img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-fabric-detail.jpg');
  width:100%!important;height:auto!important;
  aspect-ratio:4/3;object-fit:cover;object-position:center;
  border-radius:2px;
}
.elementor-element-76e2a1e .elementor-widget-image img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-folded-stack.jpg');
}
.elementor-element-c85416d .elementor-widget-image img[src*="placeholder-demo-image"]{
  content:url('/wp-content/uploads/2026/07/rasvo-detail-keycap-print.jpg');
}

/* ---------- 26 · CONTENT PAGE BUTTON SYSTEM ------------------------------ */
/* S40.2 · Accent is the brand CTA colour, not ink.
   This previously read #101A26 with the note "move it to ink so every CTA
   matches the primary button on the homepage". That premise was wrong: the
   homepage primary button is terracotta (#C2542B) and always has been, so the
   rule did the opposite of what it claimed — it made every content-page CTA
   disagree with the sitewide one. #101A26 was also off-system entirely: it
   appears 0 times in the locked V2 design exports.
   Accent is Elementor's DEFAULT button fill, so this is not three cosmetic
   fixes — it is the reason "Join Us" (About) and "Send message" (Contact)
   shipped navy, and the reason every NEW button added in the editor would have
   too. Fixing the token fixes the class of bug. */
body:not(.home):not(.woocommerce):not(.woocommerce-page):not(.single-product){
  --e-global-color-accent:#C2542B;
}
body:not(.home):not(.woocommerce-page) .elementor-button{
  border-style:solid!important;border-width:1px!important;
  border-color:currentColor!important;
}
body:not(.home):not(.woocommerce-page) .elementor-button:hover{
  background-color:transparent!important;
}
body:not(.home):not(.woocommerce-page) .e-con[style*="background"] .elementor-button:hover,
body:not(.home):not(.woocommerce-page) .elementor-button:hover{opacity:1}

/* ---------- 27 · CART / BAG ---------------------------------------------- */
.woocommerce-cart .elementor-heading-title,
.woocommerce-checkout .elementor-heading-title,
.page-id-278 .elementor-heading-title{font-style:normal!important}
/* S40.2 · Terracotta, not navy. The cart/checkout pages are outside the accent
   token's scope (they are .woocommerce-page), so this hardcoded fill was the
   OTHER half of the button inconsistency: it painted the empty-bag recovery CTA
   "Explore the drop" navy — the single primary action on a page whose entire job
   is winning a lost shopper back — while PROCEED TO CHECKOUT two clicks away was
   terracotta.
   Measured scope after changing: exactly ONE visible button changes colour —
   "Explore the drop" on the empty bag. Everything else these selectors reach is
   either a transparent link-style button ("View bag", "← Browse the collection",
   "← Back to your bag"), which has no fill to change, or the mini-cart Checkout,
   which sits in the header and is won by the later, more specific
   `.elementor-location-header .elementor-menu-cart__footer-buttons
   .elementor-button--checkout{background-color:var(--rasvo-v2-navy)!important}`.
   That one stays navy on purpose: it is header chrome, and the cart page's own
   PROCEED TO CHECKOUT is already the terracotta primary. */
.page-id-278 .elementor-button,
.woocommerce-cart .elementor-button,
.woocommerce-checkout .elementor-button{
  border-radius:0!important;
  background-color:var(--rasvo-terracotta,#C2542B)!important;color:#FFFEFA!important;
  border:1px solid var(--rasvo-terracotta,#C2542B)!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;
  text-transform:uppercase!important;letter-spacing:.16em!important;
  font-size:12px!important;font-weight:500!important;padding:17px 30px!important;
  transition:background-color .5s var(--rv-e),color .5s var(--rv-e),transform .5s var(--rv-e);
}
.page-id-278 .elementor-button:hover,
.woocommerce-cart .elementor-button:hover,
.woocommerce-checkout .elementor-button:hover{
  /* S40.2 · hover text follows the border to terracotta — it was navy, which
     left a navy label inside a terracotta outline once the fill inverted. */
  background-color:transparent!important;
  color:var(--rasvo-terracotta,#C2542B)!important;transform:translateY(-2px);
}

/* ---------- 28 · SCOPE FIXES --------------------------------------------- */
/* Keep the global button rules out of the sticky header (cart / search). */
.elementor-location-header .elementor-button,
.elementor-location-header .elementor-menu-cart__toggle .elementor-button{
  background-color:transparent!important;
  color:inherit!important;
  border:0!important;
  padding:0!important;
  font-size:inherit!important;
  letter-spacing:inherit!important;
  transform:none!important;
}
.elementor-location-header .elementor-button:hover{background-color:transparent!important}

/* ---------- 29 · MOBILE HERO --------------------------------------------- */
@media (max-width:767px){
  /* Session 30 — the garment edge is back in frame on mobile.
     Previously `22% center`, chosen to "hold on the woven backdrop so the type
     stays razor sharp". The legibility point was right, but it left the phone
     hero reading as an empty dark panel: at 390x675 the visible window is only
     source px 436-1014, and a column scan of rasvo-hero-ss26.jpg (2560x1000)
     puts the garment at 67-81% (centre ~1900px, print peak contrast at 73%) —
     so 22% framed nothing but flat weave.

     Tried 78% first: that centres the whole garment, and it is WORSE — the
     headline lands on the "NO MEETINGS AFTER SIX" print and the body copy sits
     straight on the CTRL/ALT/CHILL keycaps. Contrast passes; it just reads as
     clutter. The original comment was correct about that.

     63% shows the window at source ~1272-1850: the shoulder/sleeve enters from
     the right, the print stays at the far edge, and the entire left column —
     where the eyebrow, headline, body copy and CTAs live — is clean weave.
     Product is present, type is untouched. Scrim mid-stop .46 -> .60 for the
     brighter garment edge (white type ~17:1 on weave, ~6.9:1 on the brightest
     print, which only appears at the frame edge). */
  /* SUPERSEDED 2026-08-01 — kept as the record of why, not as live CSS.
         was: .rasvo-v2-hero{background-position:63% center!important}
         was: ::before scrim 180deg .72 / .60 @40% / .84

     Sessions 30 and 32 were both solving the wrong axis. Every attempt above
     (22%, 78%, 63%) moves the crop HORIZONTALLY while the garment stays BEHIND
     the copy — so the choice was always "empty panel" vs "headline on the print".
     Session 32 concluded a new asset was required and the slot has been empty
     since.

     It is not an asset problem. Drop `cover` and the conflict disappears: scale
     the banner to ~37% of hero height and anchor it to the BOTTOM, then lift the
     copy off it with padding-bottom. Copy now sits on flat navy (better contrast
     than any of the three crops — no scrim needed over type at all) and the whole
     garment INCLUDING the print reads, at the size a phone can actually resolve.
     Live rule is in §13 RESPONSIVE. A purpose-shot vertical banner is still the
     better long-term answer, but it is no longer a blocker. */

  /* ---- Session 32 — separate mobile banner: MECHANISM READY, ASSET MISSING --
     Correct diagnosis, and the swap is a one-line change — but every existing
     asset was tested and none can fill the slot. Tested and rejected:

       ctrl-alt-chill-detail.jpg (1400x1750, portrait, same garment + print)
         `cover` puts 69% of the width in frame (vs 21.7% for the landscape
         hero) and the whole print reads — but the print band sits at 37-63% of
         the frame and the hero copy runs 150-619px of 675 (22-92%). The
         headline landed on "NO MEETINGS AFTER SIX" and the keycaps cut through
         the body copy. No scrim fixes it; this is the same clutter Session 30
         rejected at 78%.
         Same asset at `auto 290%` framed only the clean weave above the print —
         type was perfect, but the weave magnifies into coarse plastic mesh and
         looks cheaper than what ships today.
       rasvo-worn-sprint-mode.jpg / rasvo-folded-stack.jpg (1200x1200)
         light cream flat-lays of a different garment — wrong tone for a dark
         hero and breaks continuity with the desktop banner.

     The blocker is composition, not code: the hero copy occupies 70% of the
     frame, so a mobile banner needs its subject in the TOP ~20% or entering
     from an edge, with the middle left as negative space. No asset does that.

     ASSET SPEC for the shoot (drop it in and delete nothing else):
       portrait 4:5 or 9:16, >=1200px wide (ideally ~800x1440 for 2x),
       low-key / dark to match #0C141F, garment in the upper third or entering
       from one edge, clean negative space from 20% to 92% of the height.

     TO ENABLE once that file exists — this block is the whole change:
       .rasvo-v2-hero{
         background-image:url('/wp-content/uploads/<path>/rasvo-hero-mobile.jpg')!important;
         background-position:50% 20%!important;
       }
     Tracked as KNOWN_ISSUES #105. Desktop/tablet are unaffected either way —
     §1 keeps serving the landscape hero above 767px. */
}


/* ---------- 30 · COMMERCE : NOTICES ------------------------------------ */
.woocommerce-notices-wrapper{max-width:1280px;margin:0 auto;padding:0 clamp(20px,4vw,56px)}
.woocommerce-message,.woocommerce-error,.woocommerce-info{
  list-style:none;border:1px solid var(--rv-line);border-left:2px solid var(--rv-ink);
  background:#F3EFE4;color:var(--rv-ink);border-radius:0;box-shadow:none;
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.13em;
  text-transform:uppercase;line-height:1.7;padding:19px 24px;margin:0 0 30px;
  display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;
  animation:rvNotice .55s var(--rv-e) both}
.woocommerce-error{border-left-color:var(--rv-rust);background:#F7EDE7}
.woocommerce-info{border-left-color:var(--rv-gold)}
.woocommerce-message::before,.woocommerce-error::before,.woocommerce-info::before{
  content:none!important;display:none!important}
.woocommerce-message .button,.woocommerce-error .button,.woocommerce-info .button{
  order:2;margin:0;background:var(--rv-ink);color:var(--rv-cream);border:1px solid var(--rv-ink);
  border-radius:0;padding:12px 22px;font-size:12px;letter-spacing:.18em;line-height:1;
  transition:background .35s var(--rv-e)}
.woocommerce-message .button:hover,.woocommerce-info .button:hover{background:var(--rv-ink-2)}
@keyframes rvNotice{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}

/* ---------- 31 · COMMERCE : SHARED CONTROLS ---------------------------- */
.woocommerce-cart .cart_totals,.woocommerce-cart .coupon,.woocommerce-cart table.shop_table,
.woocommerce-checkout #order_review,.woocommerce-checkout #payment,
.woocommerce-checkout .woocommerce-checkout-review-order-table,
.woocommerce-checkout #customer_details,.woocommerce-checkout .woocommerce-additional-fields{
  border-radius:0!important;box-shadow:none!important}
/* Session 29: rule REMOVED, not decoded. Its selector carried > so it has
   never applied. Decoding it would have forced cart / checkout / account /
   order-received headings to 9.5px Geist Mono at rgba(12,20,31,.5) — which
   (a) reverses D-84 (those headings stay upright Geist 400 21px by decision),
   (b) undoes the Session 27 order-received heading work (330/340 scale), and
   (c) computes to roughly 3.1:1 on paper — a WCAG AA failure at 9.5px.
   Deleting a rule that never applied changes nothing on screen; reviving it
   would have changed three surfaces silently. Re-add deliberately with an
   AA-compliant colour if the mono label treatment is actually wanted. */

/* Session 21 (review): was 9px at rgba(12,20,31,.52) = 3.68:1 — fails WCAG AA on
   the cart/checkout/account forms (37 sub-10px nodes on checkout alone). 11px at
   .78 alpha computes to 6.2:1. Tracking eased from .17em so the wider glyphs
   still fit the two-column billing grid. */
body.woocommerce-cart .woocommerce label,
body.woocommerce-checkout form.checkout label,
body.woocommerce-checkout form.woocommerce-form label,
body.woocommerce-account form label{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.13em!important;text-transform:uppercase!important;color:rgba(12,20,31,.78)!important;
  font-weight:400!important;margin-bottom:7px!important}
body.woocommerce-cart .woocommerce .required,body.woocommerce-checkout form.checkout .required{color:var(--rv-gold)!important;text-decoration:none!important;border:0!important}
.woocommerce-cart input.input-text,.woocommerce-cart textarea,.woocommerce-cart select,
.woocommerce-checkout input.input-text,.woocommerce-checkout textarea,.woocommerce-checkout select,
.woocommerce-account input.input-text,.woocommerce-account input[type=password]{
  border:0!important;border-bottom:1px solid rgba(12,20,31,.5)!important;border-radius:0!important;
  background:transparent!important;box-shadow:none!important;padding:0 2px!important;
  height:46px!important;min-height:46px!important;
  font-family:Geist,system-ui,sans-serif;font-size:16px!important;color:var(--rv-ink);
  transition:border-color .3s var(--rv-e)}
/* Field underline was var(--rv-line) = rgba(12,20,31,.13) → renders #DBDBDA on #FAF9F6 = 1.32:1.
   WCAG 1.4.11 needs 3:1 for a UI component boundary; .5 alpha = 3.42:1. --rv-line stays as-is
   for dividers, which are decorative and correctly quiet.
   height/font-size carried no !important while every sibling did, so both lost the cascade:
   fields rendered 21px tall at 15px. 46px clears the 44px touch target, 16px stops iOS
   zoom-on-focus. Textarea keeps its own height below — now !important so it still wins. */
.woocommerce-checkout textarea,.woocommerce-cart textarea{height:auto!important;min-height:96px!important;padding:12px 2px!important}
.woocommerce-cart input.input-text:focus,.woocommerce-checkout input.input-text:focus,
.woocommerce-checkout textarea:focus,.woocommerce-checkout select:focus{
  outline:none!important;border-bottom-color:var(--rv-ink)!important}
.woocommerce-checkout .form-row{margin-bottom:22px}

/* buttons — scoped to commerce templates only */
.woocommerce-cart .button,.woocommerce-checkout .button,.woocommerce-account .button,
.woocommerce-cart button.button,.woocommerce-checkout button.button{
  border-radius:0!important;box-shadow:none!important;text-shadow:none!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.19em!important;text-transform:uppercase!important;font-weight:400!important;
  padding:16px 28px!important;line-height:1!important;
  background:transparent!important;color:var(--rv-ink)!important;border:1px solid var(--rv-line)!important;
  transition:border-color .35s var(--rv-e),background .35s var(--rv-e),color .35s var(--rv-e)}
.woocommerce-cart .button:hover,.woocommerce-checkout .button:hover,.woocommerce-account .button:hover{
  border-color:var(--rv-ink)!important;background:var(--rv-ink)!important;color:var(--rv-cream)!important}
.woocommerce-cart .button:disabled,.woocommerce-cart .button[disabled]{
  opacity:.34;cursor:not-allowed;border-style:dashed!important}

/* primary CTAs
   S32: these were navy — the same colour as body copy, borders and the
   secondary buttons, so the two money CTAs carried no click urgency.
   Elementor's own post-278.css already painted this button
   var(--e-global-color-secondary,#C2542B); this block was overriding it.
   Restored to terracotta, which also matches the mobile sticky
   add-to-cart bar in rasvo-experience-polish.php.
   #FFFEFA on #C2542B = 4.53:1 — clears AA for the 11px label.
   Single source of truth for CTA colour: change it here and at §41. */
.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,
.woocommerce-checkout #place_order{
  display:block;width:100%;text-align:center;border-radius:0!important;box-shadow:none!important;
  background:var(--rasvo-terracotta,#C2542B)!important;color:var(--rasvo-paper,#FFFEFA)!important;
  border:1px solid var(--rasvo-terracotta,#C2542B)!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.22em!important;text-transform:uppercase!important;font-weight:400!important;
  padding:21px 26px!important;margin-top:8px;line-height:1!important;
  transition:background .4s var(--rv-e),letter-spacing .4s var(--rv-e)}
.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:hover,
.woocommerce-checkout #place_order:hover{background:#A84722!important;letter-spacing:.26em!important}

/* ---------- 32 · CART ------------------------------------------------- */
.woocommerce-cart table.shop_table{border:1px solid var(--rv-line);border-collapse:collapse;background:transparent}
.woocommerce-cart table.shop_table th{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  /* was rgba(12,20,31,.45) = 2.97:1 at 12px — AA fail on the purchase path.
     Same fix and same token as the homepage spec strip (Review 5 issue #5). */
  letter-spacing:.19em!important;text-transform:uppercase;
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important;
  font-weight:400;padding:15px 18px!important;border-bottom:1px solid var(--rv-line);background:transparent}
.woocommerce-cart table.shop_table td{border-top:1px solid var(--rv-line);padding:20px 18px!important;
  vertical-align:middle;background:transparent}
.woocommerce-cart td.product-thumbnail img{width:82px;height:102px;object-fit:cover;
  border:1px solid var(--rv-line);border-radius:0}
.woocommerce-cart td.product-name a{font-weight:500;color:var(--rv-ink);text-decoration:none}
.woocommerce-cart td.product-name a:hover{text-decoration:underline;text-underline-offset:4px}
.woocommerce-cart td.product-name .variation{font-family:"Geist Mono",ui-monospace,monospace;
  font-size:12px;letter-spacing:.13em;text-transform:uppercase;color:rgba(12,20,31,.5);margin-top:6px}
.woocommerce-cart .product-price,.woocommerce-cart .product-subtotal{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px}
.woocommerce a.remove{color:rgba(12,20,31,.35)!important;font-size:17px!important;line-height:1;
  background:none!important;border-radius:0!important;transition:color .3s,transform .3s}
.woocommerce a.remove:hover{color:var(--rv-rust)!important;background:none!important;transform:rotate(90deg)}
.woocommerce .quantity input.qty{border:1px solid var(--rv-line)!important;border-radius:0!important;
  background:transparent!important;height:42px;width:70px;text-align:center;box-shadow:none!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px}
.woocommerce .quantity input.qty:focus{outline:none;border-color:var(--rv-ink)!important}
.woocommerce-cart .coupon{background:transparent!important;padding:0!important;display:flex;gap:0;align-items:stretch;flex-wrap:wrap}
.woocommerce-cart #coupon_code{border:1px solid var(--rv-line)!important;border-right:0!important;
  border-radius:0!important;background:transparent!important;height:50px!important;min-width:210px;
  padding:0 16px!important;font-family:"Geist Mono",ui-monospace,monospace!important;
  font-size:12px!important;letter-spacing:.14em;text-transform:uppercase}
.woocommerce-cart .coupon .button{height:50px;padding:0 26px!important}
body.woocommerce-cart .cart_totals{border:1px solid var(--rv-line)!important;background:#F7F3E9!important;padding:32px 30px!important}
.woocommerce-cart .cart_totals table{border:0;width:100%;margin:0}
.woocommerce-cart .cart_totals th,.woocommerce-cart .cart_totals td{
  border:0!important;border-top:1px solid var(--rv-line)!important;padding:15px 0!important;background:transparent!important}
.woocommerce-cart .cart_totals tr:first-child th,.woocommerce-cart .cart_totals tr:first-child td{border-top:0!important}
.woocommerce-cart .cart_totals th{font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.18em!important;text-transform:uppercase;font-weight:400!important;width:46%;
  /* was rgba(12,20,31,.5) = 3.39:1 at 12px — AA fail (Review 5 issue #5). */
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important}
.woocommerce-cart .cart_totals td{text-align:right;font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px}
.woocommerce-cart .cart_totals .order-total th,.woocommerce-cart .cart_totals .order-total td{
  border-top:1px solid var(--rv-ink)!important;padding-top:18px!important}
.woocommerce-cart .cart_totals .order-total td{font-size:17px!important;font-family:Geist,system-ui,sans-serif!important}
.woocommerce-cart .cart_totals .woocommerce-shipping-methods label,
.woocommerce-cart .cart_totals .woocommerce-shipping-destination{color:rgba(12,20,31,.6)!important;font-size:12px!important}
.woocommerce-cart .shipping-calculator-button{color:var(--rv-ink)!important;text-decoration:underline;
  text-underline-offset:3px;font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.16em;text-transform:uppercase}
.woocommerce-cart .cart_totals .amount,.woocommerce-checkout .amount{color:var(--rv-ink)!important}

/* ---------- 33 · CHECKOUT --------------------------------------------- */
.woocommerce-checkout #customer_details{background:transparent!important;border:1px solid var(--rv-line);padding:34px 30px}
.woocommerce-checkout .woocommerce-additional-fields{border:1px solid var(--rv-line);padding:28px 30px;margin-top:26px}
.woocommerce-checkout #order_review{border:1px solid var(--rv-line);background:#F7F3E9;padding:30px 28px}
.woocommerce-checkout table.woocommerce-checkout-review-order-table{border:0;width:100%}
.woocommerce-checkout table.woocommerce-checkout-review-order-table th,
.woocommerce-checkout table.woocommerce-checkout-review-order-table td{
  border:0!important;border-top:1px solid var(--rv-line)!important;padding:14px 0!important;background:transparent!important}
.woocommerce-checkout table.woocommerce-checkout-review-order-table thead th{
  border-top:0!important;font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.18em!important;text-transform:uppercase;font-weight:400!important;
  /* was rgba(12,20,31,.45) = 2.94:1 at 12px — AA fail (Review 5 issue #5). */
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important}
.woocommerce-checkout .cart_item td{font-size:13px}
.woocommerce-checkout .order-total th,.woocommerce-checkout .order-total td{border-top:1px solid var(--rv-ink)!important;padding-top:17px!important}
.woocommerce-checkout .order-total .amount{font-size:17px}
.woocommerce-checkout #payment{background:transparent!important;border:1px solid var(--rv-line);padding:26px 24px;margin-top:22px}
.woocommerce-checkout #payment ul.payment_methods{border:0!important;padding:0!important;margin:0 0 6px!important;list-style:none}
.woocommerce-checkout #payment ul.payment_methods li{list-style:none;padding:14px 0;border-bottom:1px solid var(--rv-line);margin:0}
.woocommerce-checkout #payment ul.payment_methods li:last-of-type{border-bottom:0}
.woocommerce-checkout #payment label{font-size:12px!important;letter-spacing:.15em!important;color:var(--rv-ink)!important;margin:0!important}
.woocommerce-checkout #payment .payment_box{background:transparent!important;border:0!important;
  margin:10px 0 0!important;padding:0!important;font-size:12px;color:rgba(12,20,31,.58);border-radius:0!important}
.woocommerce-checkout #payment .payment_box::before{content:none!important;display:none!important}
.woocommerce-checkout .woocommerce-privacy-policy-text p{font-size:12px;line-height:1.7;color:rgba(12,20,31,.55)}
.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper{margin:16px 0 4px}
.woocommerce-checkout .woocommerce-terms-and-conditions-checkbox-text{font-size:12px!important;letter-spacing:.02em!important;
  text-transform:none!important;color:rgba(12,20,31,.7)!important}
body.woocommerce-checkout form.checkout a,body.woocommerce-checkout .woocommerce-form-coupon-toggle a,
body.woocommerce-cart a.showcoupon{color:var(--rv-ink)}
.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info{margin-bottom:24px}
.woocommerce-checkout #ship-to-different-address label{font-size:12px!important;letter-spacing:.16em!important;color:var(--rv-ink)!important}

/* order received / thank-you */
.woocommerce-order .woocommerce-order-overview,.woocommerce-order ul.order_details{
  list-style:none;display:flex;flex-wrap:wrap;gap:0;border:1px solid var(--rv-line);padding:0;margin:0 0 34px}
.woocommerce-order ul.order_details li{list-style:none;flex:1 1 180px;padding:22px 24px;border-right:1px solid var(--rv-line);
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:rgba(12,20,31,.5)}
.woocommerce-order ul.order_details li strong{display:block;margin-top:8px;font-family:Geist,system-ui,sans-serif;
  font-size:15px;letter-spacing:-.01em;text-transform:none;color:var(--rv-ink)}

/* ---------- 34 · PAGINATION ------------------------------------------- */
.elementor-pagination{display:flex;flex-wrap:wrap;gap:7px;justify-content:center;align-items:center;margin-top:58px}
.elementor-pagination .page-numbers{
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.12em;
  min-width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--rv-line);color:var(--rv-ink);text-decoration:none;font-weight:400;
  transition:border-color .3s var(--rv-e),background .3s var(--rv-e),color .3s var(--rv-e)}
.elementor-pagination .page-numbers:hover{border-color:var(--rv-ink)}
.elementor-pagination .page-numbers.current{background:var(--rv-ink);color:var(--rv-cream);border-color:var(--rv-ink)}
.elementor-pagination .page-numbers.dots{border-color:transparent}

/* ---------- 35 · SINGLE PRODUCT : CTA + SWATCHES ---------------------- */
/* S33 · Disabled CTA now reads as the buy control, not an inert slab.
   Products default to an in-stock size (pa_size=m), so this state is reached
   only by picking an unavailable combination — it must still look like the
   thing you buy with, in brand accent, or the PDP has no visible CTA at all.
   ponytail: terracotta on the BORDER, label stays ink. Terracotta text on the
   terracotta tint measures 3.92:1 — fails AA at 12px. Accent the frame, not
   the words. */
.single-product .single_add_to_cart_button.disabled,
.single-product .single_add_to_cart_button.wc-variation-selection-needed{
  background:color-mix(in srgb,var(--rasvo-terracotta,#C2542B) 8%,transparent)!important;
  color:transparent!important;
  border:1.5px solid color-mix(in srgb,var(--rasvo-terracotta,#C2542B) 55%,transparent)!important;
  cursor:not-allowed;position:relative}
.single-product .single_add_to_cart_button.disabled::after,
.single-product .single_add_to_cart_button.wc-variation-selection-needed::after{
  content:"SELECT YOUR SIZE";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.22em;
  color:var(--rv-ink,#141A23)}
.single-product .single_add_to_cart_button{transition:background .35s var(--rv-e),letter-spacing .35s var(--rv-e)}
.single-product .single_add_to_cart_button:not(.disabled):hover{letter-spacing:.26em!important}
.single-product .variable-items-wrapper .variable-item{
  border-radius:0!important;box-shadow:none!important;margin:0 8px 8px 0!important;
  transition:border-color .28s var(--rv-e),background .28s var(--rv-e)}
.single-product .variable-items-wrapper .button-variable-item{
  min-width:48px;height:42px;border:1px solid var(--rv-line)!important;background:transparent!important}
.single-product .variable-items-wrapper .button-variable-item:hover{border-color:var(--rv-ink)!important}
.single-product .variable-items-wrapper .button-variable-item.selected{
  background:var(--rv-ink)!important;border-color:var(--rv-ink)!important}
.single-product .variable-items-wrapper .button-variable-item.selected .variable-item-span{color:var(--rv-cream)!important}
.single-product .variable-items-wrapper .button-variable-item .variable-item-span{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;letter-spacing:.13em!important}
.single-product .variable-items-wrapper .color-variable-item.selected{
  box-shadow:0 0 0 1px var(--rv-cream) inset,0 0 0 2px var(--rv-ink)!important}
.single-product .reset_variations{font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;
  letter-spacing:.16em;text-transform:uppercase;color:rgba(12,20,31,.45)}

/* BUY IT NOW pointed at an orphan checkout page and never added the item — hidden.
   Remove this rule to restore it. */
.elementor-element-68a6032{display:none!important}


/* ======================================================================
   40 · MOTION & PREMIUM POLISH
   All motion is opt-out via prefers-reduced-motion (section 46).
   Scroll-driven reveals are feature-gated with @supports so that
   unsupported browsers simply show static content.
   ====================================================================== */

/* ---------- 40.1 · cross-document page transitions -------------------- */
@media (prefers-reduced-motion:no-preference){
  @view-transition{navigation:auto}
}
::view-transition-old(root){animation:rvVtOut .32s var(--rv-e) both}
::view-transition-new(root){animation:rvVtIn .42s var(--rv-e) both}
@keyframes rvVtOut{to{opacity:0}}
@keyframes rvVtIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* ---------- 40.2 · sticky header : glass + hairline -------------------- */
/* Session 28: the sticky-state glass moves to ::before for the same reason as
   the base rule above — putting backdrop-filter back on the element would
   re-trap the cart and the dropdown the moment the header went sticky.
   box-shadow stays on the element (it traps nothing and must sit above ::before). */
.elementor-location-header .elementor-element-ab8f218{
  transition:box-shadow .45s var(--rv-e)}
.elementor-location-header .elementor-element-ab8f218::before{
  transition:background-color .45s var(--rv-e),backdrop-filter .45s var(--rv-e)}
.elementor-location-header .elementor-element-ab8f218.elementor-sticky--active{
  box-shadow:0 1px 0 rgba(12,20,31,.10),0 12px 34px -28px rgba(12,20,31,.55)}
.elementor-location-header .elementor-element-ab8f218.elementor-sticky--active::before{
  background-color:rgba(250,249,246,.80);
  -webkit-backdrop-filter:saturate(150%) blur(14px);backdrop-filter:saturate(150%) blur(14px)}
body.single-product .elementor-location-header .elementor-element-ab8f218.elementor-sticky--active::before,
body.woocommerce-cart .elementor-location-header .elementor-element-ab8f218.elementor-sticky--active::before,
body.woocommerce-checkout .elementor-location-header .elementor-element-ab8f218.elementor-sticky--active::before{
  background-color:rgba(247,243,233,.84)}

/* nav underline slide */
.elementor-location-header .elementor-item{position:relative}
.elementor-location-header .elementor-item::after{
  content:"";position:absolute;left:0;right:0;bottom:-5px;height:1px;background:currentColor;
  transform:scaleX(0);transform-origin:0 50%;transition:transform .45s var(--rv-e);opacity:.6}
.elementor-location-header .elementor-item:hover::after,
.elementor-location-header .elementor-item.elementor-item-active::after{transform:scaleX(1)}

/* ---------- 40.3 · hero entrance --------------------------------------- */
.rasvo-v2-hero .elementor-widget{animation:rvUp 1s var(--rv-e) both}
.rasvo-v2-hero .elementor-widget:nth-of-type(1){animation-delay:.06s}
.rasvo-v2-hero .elementor-widget:nth-of-type(2){animation-delay:.16s}
.rasvo-v2-hero .elementor-widget:nth-of-type(3){animation-delay:.26s}
.rasvo-v2-hero .elementor-widget:nth-of-type(4){animation-delay:.36s}
.rasvo-v2-hero .elementor-widget:nth-of-type(5){animation-delay:.44s}
.rasvo-v2-hero .elementor-widget:nth-of-type(6){animation-delay:.52s}
@keyframes rvUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:none}}

/* ---------- 40.4 · scroll-driven section reveals ----------------------- */
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference){
    .rasvo-v2-strip .elementor-widget,
    .rasvo-v2-drop .elementor-widget-heading,
    .rasvo-v2-drop .elementor-widget-text-editor,
    .rasvo-v2-cotton .elementor-widget,
    .rasvo-v2-fit .elementor-widget,
    .rasvo-v2-manifesto .elementor-widget,
    .rasvo-v2-community .elementor-widget,
    .rasvo-v2-news .elementor-widget,
    .rasvo-card{
      animation:rvReveal 1.1s linear both;
      animation-timeline:view();
      animation-range:entry 2% entry 58%}
    @keyframes rvReveal{from{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}

    /* card stagger inside a row */
    .rasvo-card:nth-child(2){animation-range:entry 6% entry 62%}
    .rasvo-card:nth-child(3){animation-range:entry 10% entry 66%}
    .rasvo-card:nth-child(4){animation-range:entry 14% entry 70%}

    /* eyebrow rules draw themselves in */
    .rasvo-v2-cotton .elementor-widget-divider .elementor-divider-separator,
    .rasvo-v2-fit .elementor-widget-divider .elementor-divider-separator,
    .rasvo-v2-manifesto .elementor-widget-divider .elementor-divider-separator{
      transform-origin:0 50%;animation:rvLine 1.2s linear both;
      animation-timeline:view();animation-range:entry 4% entry 52%}
    @keyframes rvLine{from{transform:scaleX(0)}to{transform:scaleX(1)}}
  }
}

/* ---------- 40.5 · product cards -------------------------------------- */
.rasvo-card{transition:transform .6s var(--rv-e)}
.rasvo-card .rasvo-card__media{overflow:hidden;position:relative}
.rasvo-card .rasvo-card__media img{
  transition:transform 1.3s var(--rv-e),filter .7s var(--rv-e);will-change:transform}
.rasvo-card:hover .rasvo-card__media img{transform:scale(1.05)}
.rasvo-card .rasvo-card__media::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(120deg,rgba(255,255,255,0) 30%,rgba(255,255,255,.30) 48%,rgba(255,255,255,0) 66%);
  transform:translateX(-120%);transition:transform 1.1s var(--rv-e);opacity:.9}
.rasvo-card:hover .rasvo-card__media::after{transform:translateX(120%)}

/* sibling dimming keeps focus on the hovered piece */
@media (hover:hover) and (min-width:1025px){
  .rasvo-v2-drop .rasvo-grid:hover .rasvo-card,
  .woocommerce ul.products:hover .rasvo-card{opacity:.62;transition:opacity .5s var(--rv-e)}
  .rasvo-v2-drop .rasvo-grid:hover .rasvo-card:hover,
  .woocommerce ul.products:hover .rasvo-card:hover{opacity:1}
}

/* ---------- 40.6 · links, buttons, images ----------------------------- */
:where(.elementor-location-single,.elementor-location-archive) .elementor-button{
  transition:transform .45s var(--rv-e),background-color .45s var(--rv-e),
             color .45s var(--rv-e),border-color .45s var(--rv-e),letter-spacing .45s var(--rv-e)}
:where(.elementor-location-single,.elementor-location-archive) .elementor-button:hover{
  transform:translateY(-2px);letter-spacing:.2em}
:where(.elementor-location-single,.elementor-location-archive) .elementor-button:active{transform:translateY(0)}

/* editorial imagery : slow reveal-zoom on hover */
.rasvo-v2-cotton .elementor-widget-image,
.rasvo-v2-fit .elementor-widget-image,
.rasvo-v2-community .elementor-widget-image{overflow:hidden}
.rasvo-v2-cotton .elementor-widget-image img,
.rasvo-v2-fit .elementor-widget-image img,
.rasvo-v2-community .elementor-widget-image img{
  transition:transform 1.6s var(--rv-e);will-change:transform}
.rasvo-v2-cotton .elementor-widget-image:hover img,
.rasvo-v2-fit .elementor-widget-image:hover img,
.rasvo-v2-community .elementor-widget-image:hover img{transform:scale(1.06)}

/* footer + inline link underline slide */
.elementor-location-footer a:not(.elementor-button),
.rasvo-v2-manifesto a:not(.elementor-button){
  position:relative;text-decoration:none;background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .45s var(--rv-e),opacity .35s}
.elementor-location-footer a:not(.elementor-button):hover,
.rasvo-v2-manifesto a:not(.elementor-button):hover{background-size:100% 1px}

/* newsletter field */
.rasvo-v2-news input[type=email],.rasvo-v2-news input[type=text]{
  transition:border-color .4s var(--rv-e),background-color .4s var(--rv-e)}
.rasvo-v2-news input[type=email]:focus,.rasvo-v2-news input[type=text]:focus{
  border-color:var(--rv-cream)!important;background-color:rgba(250,249,246,.06)!important;outline:none}

/* ---------- 40.7 · spec strip hover ----------------------------------- */
.rasvo-v2-strip .elementor-widget{transition:opacity .45s var(--rv-e)}
@media (hover:hover) and (min-width:1025px){
  .rasvo-v2-strip:hover .elementor-widget{opacity:.55}
  .rasvo-v2-strip:hover .elementor-widget:hover{opacity:1}
}

/* ---------- 46 · REDUCED MOTION --------------------------------------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important}
  .rasvo-v2-hero .elementor-widget{animation:none!important;opacity:1!important;transform:none!important}
  .rasvo-card,.rasvo-v2-strip .elementor-widget,.rasvo-v2-cotton .elementor-widget,
  .rasvo-v2-fit .elementor-widget,.rasvo-v2-manifesto .elementor-widget,
  .rasvo-v2-community .elementor-widget,.rasvo-v2-news .elementor-widget{
    animation:none!important;opacity:1!important;transform:none!important}
}


/* ---------- 36 · COMMERCE : FLATTEN THE WIDGET PANELS ------------------ */
body.woocommerce-cart .e-cart-section,
body.woocommerce-cart .e-shop-table,
body.woocommerce-cart .e-cart-totals,
body.woocommerce-cart .e-coupon-box,
body.woocommerce-checkout .e-checkout__order_review,
body.woocommerce-checkout .e-coupon-box,
body.woocommerce-checkout #customer_details .col-1,
body.woocommerce-checkout #customer_details .col-2,
body.woocommerce-checkout .woocommerce-additional-fields{
  background:transparent!important;border-radius:0!important;box-shadow:none!important;padding:0!important}
body.woocommerce-checkout .woocommerce-additional-fields{
  border-top:1px solid var(--rv-line)!important;margin-top:30px!important;padding-top:28px!important;border:0}
body.woocommerce-checkout #customer_details .col-1{padding-bottom:6px!important}
body.woocommerce-cart .e-shop-table{margin-bottom:26px!important}
body.woocommerce-cart .e-coupon-box,body.woocommerce-checkout .e-coupon-box{margin-top:22px!important}

/* ---------- 37 · COMMERCE : TOTAL ROWS -------------------------------- */
body.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot th,
body.woocommerce-cart .cart_totals th,
body.woocommerce-cart .cart_totals .order-total th{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.18em!important;text-transform:uppercase!important;font-weight:400!important;
  /* was rgba(12,20,31,.5) = 3.39:1 at 12px — AA fail (Review 5 issue #5). */
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important;font-style:normal!important}
body.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot .order-total th,
body.woocommerce-cart .cart_totals .order-total th{color:var(--rv-ink)!important;letter-spacing:.2em!important}
body.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot td{
  text-align:right;font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important}
body.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot .order-total td .amount{
  font-family:Geist,system-ui,sans-serif!important;font-size:17px!important;font-weight:500}
body.woocommerce-checkout .woocommerce-checkout-review-order-table .product-name{font-size:13px}
body.woocommerce-checkout .woocommerce-checkout-review-order-table .product-total{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;text-align:right}

/* ---------- 38 · COMMERCE : SELECTS ----------------------------------- */
body.woocommerce-checkout form.checkout select,
body.woocommerce-cart .woocommerce select{
  -webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;
  width:100%!important;height:44px!important;line-height:44px!important;
  border:0!important;border-bottom:1px solid var(--rv-line)!important;border-radius:0!important;
  padding:0 24px 0 2px!important;font-size:14px!important;color:var(--rv-ink)!important;
  background-color:transparent!important;
  background-image:url("data:image/svg+xml;utf8,")!important;
  background-repeat:no-repeat!important;background-position:right 3px center!important;background-size:11px 7px!important;
  cursor:pointer}
body.woocommerce-checkout form.checkout select:focus{border-bottom-color:var(--rv-ink)!important;outline:none!important}
body.woocommerce-checkout .select2-container--default .select2-selection--single,
body.woocommerce-cart .select2-container--default .select2-selection--single{
  border:0!important;border-bottom:1px solid var(--rv-line)!important;border-radius:0!important;
  background:transparent!important;height:44px!important;padding:0!important}
body.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__rendered{
  line-height:44px!important;padding-left:2px!important;color:var(--rv-ink)!important}
body.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:44px!important;right:2px!important}
body.woocommerce-checkout .select2-dropdown{border:1px solid var(--rv-line)!important;border-radius:0!important}
body.woocommerce-checkout .woocommerce-input-wrapper{display:block;width:100%}

/* ---------- 39 · COMMERCE : INLINE NOTICES & LINKS -------------------- */
body.woocommerce-checkout .woocommerce-info a,body.woocommerce-cart .woocommerce-info a,
body.woocommerce-checkout .woocommerce-form-coupon-toggle a{
  color:var(--rv-ink)!important;text-decoration:underline!important;text-underline-offset:3px}
body.woocommerce-checkout form.checkout .woocommerce-input-wrapper strong{
  font-weight:400;font-size:14px;color:var(--rv-ink)}
body.woocommerce-checkout #payment .wc_payment_method input[type=radio]{accent-color:var(--rv-ink)}
body.woocommerce-checkout form.checkout input[type=checkbox]{accent-color:var(--rv-ink)}


/* ---------- 41 · SINGLE PRODUCT : CTA (high specificity) --------------- */
html body.single-product form.cart button.single_add_to_cart_button{
  border-radius:0!important;box-shadow:none!important;text-shadow:none!important;
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.22em!important;text-transform:uppercase!important;font-weight:400!important;
  width:100%!important;padding:21px 26px!important;line-height:1!important;
  /* S32: terracotta — see §31 "primary CTAs". Enabled state only; the
     .disabled / .wc-variation-selection-needed rules below still win and
     keep the "SELECT YOUR SIZE" ghost state, so nothing changes until a
     size is chosen. */
  background:var(--rasvo-terracotta,#C2542B)!important;background-color:var(--rasvo-terracotta,#C2542B)!important;
  color:var(--rasvo-paper,#FFFEFA)!important;
  border:1px solid var(--rasvo-terracotta,#C2542B)!important;
  transition:background-color .4s var(--rv-e),letter-spacing .4s var(--rv-e),opacity .3s}
html body.single-product form.cart button.single_add_to_cart_button:hover{
  background-color:#A84722!important;letter-spacing:.26em!important}
html body.single-product form.cart button.single_add_to_cart_button.disabled,
html body.single-product form.cart button.single_add_to_cart_button.wc-variation-selection-needed{
  background:transparent!important;background-color:transparent!important;color:transparent!important;
  border:1px dashed rgba(12,20,31,.30)!important;cursor:not-allowed!important;
  position:relative!important;opacity:1!important;letter-spacing:.22em!important}
html body.single-product form.cart button.single_add_to_cart_button.disabled::after,
html body.single-product form.cart button.single_add_to_cart_button.wc-variation-selection-needed::after{
  content:"SELECT YOUR SIZE";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.22em;
  color:rgba(12,20,31,.48);pointer-events:none}
html body.single-product form.cart button.single_add_to_cart_button.disabled:hover{
  border-color:rgba(12,20,31,.30)!important;letter-spacing:.22em!important}

/* ---------- 42 · SINGLE PRODUCT : SWATCHES (high specificity) ---------- */
html body.single-product .variations .variable-items-wrapper{display:flex;flex-wrap:wrap;gap:8px;margin:0}
html body.single-product .variations .variable-items-wrapper li.variable-item{
  border-radius:0!important;box-shadow:none!important;margin:0!important;
  transition:border-color .28s var(--rv-e),background-color .28s var(--rv-e),color .28s var(--rv-e)}
html body.single-product .variations .variable-items-wrapper li.button-variable-item{
  min-width:52px!important;width:auto!important;height:44px!important;padding:0 12px!important;
  border:1px solid var(--rv-line)!important;background:transparent!important;background-color:transparent!important;
  display:inline-flex!important;align-items:center;justify-content:center}
html body.single-product .variations .variable-items-wrapper li.button-variable-item:hover{
  border-color:var(--rv-ink)!important}
html body.single-product .variations .variable-items-wrapper li.button-variable-item.selected{
  background-color:var(--rv-ink)!important;border-color:var(--rv-ink)!important}
html body.single-product .variations .variable-items-wrapper li.button-variable-item .variable-item-span{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.14em!important;line-height:1!important;color:var(--rv-ink)!important}
html body.single-product .variations .variable-items-wrapper li.button-variable-item.selected .variable-item-span{
  color:var(--rv-cream)!important}
html body.single-product .variations .variable-items-wrapper li.color-variable-item{
  width:34px!important;height:34px!important;border:1px solid var(--rv-line)!important}
html body.single-product .variations .variable-items-wrapper li.color-variable-item.selected{
  box-shadow:0 0 0 1px #FAF9F6 inset,0 0 0 2px var(--rv-ink)!important}
html body.single-product .variations th.label label,
html body.single-product .variations .label label{
  font-family:"Geist Mono",ui-monospace,monospace!important;font-size:12px!important;
  letter-spacing:.2em!important;text-transform:uppercase!important;
  /* was rgba(12,20,31,.5) = 3.44:1 at 12px — AA fail (Review 5 issue #5).
     This !important copy is the one that actually wins for the SIZE label. */
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important}

/* ---------- 43 · CHECKOUT LINK COLOURS (high specificity) -------------- */
html body.woocommerce-checkout form.checkout a,
html body.woocommerce-checkout .woocommerce-form-coupon-toggle .woocommerce-info a,
html body.woocommerce-checkout .woocommerce-privacy-policy-text a,
html body.woocommerce-checkout .woocommerce-terms-and-conditions-link,
html body.woocommerce-cart .woocommerce-info a{
  color:var(--rv-ink)!important;text-decoration:underline!important;text-underline-offset:3px}
html body.woocommerce-checkout form.checkout a:hover,
html body.woocommerce-cart .woocommerce-info a:hover{opacity:.62}

/* ---------- 44 · REVEAL TIMING TUNING --------------------------------- */
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference){
    .rasvo-card{animation-range:entry 0% entry 34%!important}
    .rasvo-card:nth-child(2){animation-range:entry 3% entry 38%!important}
    .rasvo-card:nth-child(3){animation-range:entry 6% entry 42%!important}
    .rasvo-card:nth-child(4){animation-range:entry 9% entry 46%!important}
    .rasvo-v2-strip .elementor-widget,
    .rasvo-v2-cotton .elementor-widget,
    .rasvo-v2-fit .elementor-widget,
    .rasvo-v2-manifesto .elementor-widget,
    .rasvo-v2-community .elementor-widget,
    .rasvo-v2-news .elementor-widget{animation-range:entry 0% entry 40%!important}
  }
}

/* ---------- 45 · FINAL POLISH ----------------------------------------- */
/* gallery thumbs */
html body.single-product .flex-control-thumbs li img{
  border:1px solid var(--rv-line);border-radius:0;opacity:.55;transition:opacity .35s var(--rv-e),border-color .35s var(--rv-e)}
html body.single-product .flex-control-thumbs li img:hover{opacity:.85}
html body.single-product .flex-control-thumbs li img.flex-active{opacity:1;border-color:var(--rv-ink)}
/* breadcrumb */
/* was rgba(12,20,31,.45) = 2.97:1 at 12px — AA fail (Review 5 issue #5). */
html body.woocommerce-cart .woocommerce-breadcrumb,html body.woocommerce-checkout .woocommerce-breadcrumb{
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--rasvo-v2-muted-on-light,#4A515C)}
html body.woocommerce-cart .woocommerce-breadcrumb a,html body.woocommerce-checkout .woocommerce-breadcrumb a{color:var(--rasvo-v2-muted-on-light,#4A515C)}
html body.woocommerce-cart .woocommerce-breadcrumb a:hover,html body.woocommerce-checkout .woocommerce-breadcrumb a:hover{color:var(--rv-ink)}
/* keyboard focus */
:where(a,button,input,select,textarea,[tabindex]):focus-visible{
  outline:1px solid var(--rv-ink)!important;outline-offset:3px!important}


/* ---------- 47 · NOTICE ACCENT (high specificity) ---------------------- */
html body .woocommerce-message{border-left:2px solid var(--rv-gold)!important;border-top-color:var(--rv-line)!important}
html body .woocommerce-info{border-left:2px solid var(--rv-ink)!important;border-top-color:var(--rv-line)!important}
html body .woocommerce-error{border-left:2px solid var(--rv-rust)!important;border-top-color:var(--rv-line)!important}

/* ---------- 48 · ARCHIVE CARD DETAIL ---------------------------------- */
/* single-colour catalogue: the lone colour dot only added noise */
.rasvo-card .rasvo-card__colors{display:none!important}
.rasvo-card .rasvo-card__sizes{font-family:"Geist Mono",ui-monospace,monospace!important;
  font-size:12px!important;letter-spacing:.2em!important;text-transform:uppercase;
  color:rgba(12,20,31,.42)!important}
.rasvo-card .rasvo-card__sizes .is-oos,.rasvo-card .rasvo-card__sizes .dot.is-oos{
  opacity:.3;text-decoration:line-through}
.rasvo-card{transition:transform .55s var(--rv-e),box-shadow .55s var(--rv-e)}
@media (hover:hover) and (min-width:1025px){
  .rasvo-card:hover{transform:translateY(-4px)}
}
.rasvo-card .rasvo-card__name{transition:opacity .3s var(--rv-e)}

/* ---------- 49 · COMMERCE ON SMALL SCREENS ---------------------------- */
@media (max-width:767px){
  html body.woocommerce-cart table.shop_table td{padding:13px 16px!important;text-align:right}
  html body.woocommerce-cart table.shop_table td::before{
    font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.16em;
    text-transform:uppercase;color:rgba(12,20,31,.45);float:left}
  html body.woocommerce-cart td.product-thumbnail{text-align:right}
  html body.woocommerce-cart td.product-thumbnail img{width:64px;height:80px;display:inline-block}
  html body.woocommerce-cart .coupon{flex-direction:column;gap:10px}
  html body.woocommerce-cart #coupon_code{border-right:1px solid var(--rv-line)!important;width:100%;min-width:0}
  html body.woocommerce-cart .coupon .button{width:100%}
  html body.woocommerce-cart .cart_totals{padding:24px 20px!important}
  html body.woocommerce-checkout #customer_details{padding:24px 18px}
  html body.woocommerce-checkout #order_review{padding:24px 20px}
  html body.woocommerce-checkout #payment{padding:20px 18px}
  html body.woocommerce-checkout .form-row{margin-bottom:18px}
  html body.woocommerce-checkout #place_order,
  html body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button{padding:19px 20px!important;letter-spacing:.16em!important}
  html body .woocommerce-message,html body .woocommerce-error,html body .woocommerce-info{
    padding:16px 18px;font-size:12px;align-items:flex-start;flex-direction:column;gap:14px}
  html body .woocommerce-message .button{width:100%;text-align:center}
  .elementor-pagination .page-numbers{min-width:38px;height:38px;font-size:12px}
  html body.single-product .variations .variable-items-wrapper li.button-variable-item{
    min-width:46px!important;height:42px!important}
}


/* ---------- 50 · SEARCH RESULTS --------------------------------------- */
body.search main.site-main{
  max-width:1280px;margin:0 auto;
  padding:clamp(52px,6.5vw,100px) clamp(20px,4vw,56px) clamp(80px,9vw,130px)}
body.search .page-header{border-bottom:1px solid var(--rv-line);padding-bottom:26px;margin-bottom:46px}
body.search .page-header::before{
  content:"SEARCH · RASVO SS26";display:block;font-family:"Geist Mono",ui-monospace,monospace;
  font-size:12px;letter-spacing:.22em;color:var(--rv-gold);margin-bottom:16px}
body.search .page-header .entry-title{
  font-size:clamp(29px,4.3vw,50px)!important;line-height:1.06!important;letter-spacing:-.02em!important;
  font-weight:400!important;font-style:normal!important;color:var(--rv-ink)!important;margin:0!important}
body.search .page-header .entry-title span{font-style:normal;color:var(--rv-ink)}

/* the catalogue is what customers are looking for — show products only */
body.search .page-content{
  display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(18px,2.2vw,34px) clamp(14px,1.8vw,26px)}
body.search .page-content article.post{display:none;margin:0;padding:0;border:0}
body.search .page-content article.post:has(> h2 > a[href*="/product/"]){
  display:flex;flex-direction:column}
body.search .page-content article.post > a{
  order:1;display:block;overflow:hidden;background:var(--rv-sand);aspect-ratio:4/5;margin:0 0 15px}
body.search .page-content article.post > a img{
  width:100%!important;height:100%!important;object-fit:cover;display:block;
  transition:transform 1.25s var(--rv-e)}
body.search .page-content article.post:hover > a img{transform:scale(1.05)}
body.search .page-content article.post > h2.entry-title{
  order:2;margin:0 0 7px!important;font-size:14px!important;line-height:1.32!important;
  font-weight:500!important;font-style:normal!important;letter-spacing:-.005em!important}
body.search .page-content article.post > h2.entry-title a{color:var(--rv-ink);text-decoration:none}
body.search .page-content article.post > h2.entry-title a:hover{text-decoration:underline;text-underline-offset:4px}
body.search .page-content article.post > p{
  order:3;margin:0!important;font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.14em;
  text-transform:uppercase;color:rgba(12,20,31,.44);line-height:1.7;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* nothing in the catalogue matched (e.g. an empty query only returning pages) */
body.search:not(.search-no-results) .page-content:not(:has(article.post:has(> h2 > a[href*="/product/"])))::after{
  content:"NOTHING IN THE DROP MATCHES THAT SEARCH · TRY A STYLE NAME, OR OPEN SHOP";
  grid-column:1 / -1;display:block;text-align:center;font-family:"Geist Mono",ui-monospace,monospace;
  font-size:12px;letter-spacing:.2em;line-height:2;color:rgba(12,20,31,.5);
  border:1px dashed var(--rv-line);padding:clamp(40px,6vw,72px) 26px}
body.search-no-results .page-content{display:block}
body.search-no-results .page-content p{
  font-family:"Geist Mono",ui-monospace,monospace;font-size:12px;letter-spacing:.18em;text-transform:uppercase;
  color:rgba(12,20,31,.5);border:1px dashed var(--rv-line);
  padding:clamp(40px,6vw,72px) 26px;text-align:center;margin:0}

@media (max-width:1024px){body.search .page-content{grid-template-columns:repeat(3,1fr)}}
@media (max-width:767px){body.search .page-content{grid-template-columns:repeat(2,1fr)}}

/* ---------- 51 · HEADER MUST STAY CLEAN OUTSIDE ELEMENTOR TEMPLATES --- */
html body.search .elementor-location-header .elementor-button,
html body.error404 .elementor-location-header .elementor-button,
html body.search .elementor-location-header .elementor-button:hover,
html body.error404 .elementor-location-header .elementor-button:hover{
  background:transparent!important;background-color:transparent!important;border:0!important;
  box-shadow:none!important;padding:0!important;transform:none!important;color:inherit!important;
  letter-spacing:inherit!important}


/* ---------- 52 · SEARCH PAGE ALIGNMENT -------------------------------- */
body.search .page-header,body.search .page-content{
  padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;
  max-width:none!important;width:auto!important}

/* ---------- 53 · 404 : REPLACE STARTER-TEMPLATE PLACEHOLDERS ----------- */
/* The 404 template shipped with lorem ipsum and a dead button (href="#").
   Copy is swapped in CSS and the dead button hidden — both reversible.
   Recommended: edit template 106 in Elementor for a permanent fix. */
body.error404 .elementor-element-35916ee5 .elementor-heading-title{
  letter-spacing:-.02em!important;font-style:normal!important}
/* S40.3 · The copy now lives in the widget, not in a ::after.
   This was `font-size:0` on the heading plus the real sentence injected through
   ::after content. font-size:0 hides text from SIGHTED users only — the
   accessible name still resolved to "Lorem ipsum dolor sit amet, … That page has
   retired …", so screen readers read the placeholder out first and crawlers
   indexed it, while the zeroed element still reserved 80px of layout.
   Template 106's widget 739d485a now holds the real sentence as actual content
   (backup: postmeta _rasvo_404_copy_backup_20260802 on post 106) — which is what
   this block's own comment recommended. Only presentation is left here. */
body.error404 .elementor-element-739d485a .elementor-heading-title{
  display:block;max-width:38ch;font-family:Geist,system-ui,sans-serif;font-size:15px!important;
  line-height:1.78!important;letter-spacing:0!important;font-weight:400!important;
  color:rgba(12,20,31,.66)}
body.error404 .elementor-element-e6537cf{display:none!important}
body.error404 .elementor-element-28bbd0db{
  background-color:var(--rv-sand)!important;
  background-image:
    radial-gradient(115% 95% at 26% 14%,rgba(255,253,247,.92),rgba(234,226,207,0) 60%),
    repeating-linear-gradient(135deg,rgba(12,20,31,.045) 0 1px,rgba(12,20,31,0) 1px 7px),
    linear-gradient(163deg,#EFE7D6 0%,#E2D8C1 44%,#16202C 44.5%,#0B121C 100%)!important;
  background-size:cover,auto,cover!important;background-position:center!important;background-repeat:no-repeat,repeat,no-repeat!important}
body.error404 .elementor-element-28bbd0db img,
body.error404 .elementor-element-28bbd0db .elementor-widget-image{display:none!important}
body.error404 .elementor-element-35916ee5::before{
  content:"ERROR 404 · PAGE NOT FOUND";display:block;font-family:"Geist Mono",ui-monospace,monospace;
  font-size:12px;letter-spacing:.22em;color:var(--rv-gold);margin-bottom:18px}
@media (max-width:767px){
  body.error404 .elementor-element-739d485a .elementor-heading-title{font-size:14px!important;max-width:100%}
}

body.error404 .elementor-element-35916ee5{display:block}
body.error404 .elementor-element-35916ee5::before{margin-bottom:14px!important}


/* ==================================================================
   49  V3 REFINEMENT LAYER — look & feel, motion, accessibility
   Everything below this marker is additive. Delete this block to revert.
   ================================================================== */

html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
html [id]{scroll-margin-top:104px}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

/* ---- 49.1  reveal timing: copy is never left dimmed while reading -- */
@supports (animation-timeline:view()){
 @media (prefers-reduced-motion:no-preference){
  html .rasvo-card{animation-range:entry 0% entry 20%!important}
  html .rasvo-card:nth-child(2){animation-range:entry 2% entry 23%!important}
  html .rasvo-card:nth-child(3){animation-range:entry 4% entry 26%!important}
  html .rasvo-card:nth-child(4){animation-range:entry 6% entry 29%!important}
  html .rasvo-v2-strip .elementor-widget,
  html .rasvo-v2-drop .elementor-widget-heading,
  html .rasvo-v2-drop .elementor-widget-text-editor,
  html .rasvo-v2-cotton .elementor-widget,
  html .rasvo-v2-fit .elementor-widget,
  html .rasvo-v2-manifesto .elementor-widget,
  html .rasvo-v2-community .elementor-widget,
  html .rasvo-v2-news .elementor-widget{animation-range:entry 0% entry 22%!important}
 }
}

/* ---- 49.2  scroll progress hairline -------------------------------- */
@supports (animation-timeline:scroll()){
 @media (prefers-reduced-motion:no-preference){
  body::after{
    content:"";position:fixed;top:0;left:0;right:0;height:2px;z-index:9999;
    transform:scaleX(0);transform-origin:0 50%;pointer-events:none;
    background:linear-gradient(90deg,var(--rv3-gold),#C2542B 70%,var(--rv3-gold));
    animation:rv3Prog linear both;animation-timeline:scroll(root block)}
  body.admin-bar::after{top:32px}
  @keyframes rv3Prog{to{transform:scaleX(1)}}
 }
}

/* ---- 49.3  fabric-weave placeholder behind every product image ----- */
html .rasvo-card__media,
html .woocommerce-product-gallery__image,
html .flex-control-thumbs li{
  background-color:#EDE6D6;
  background-image:var(--rv3-weave);
  background-size:8px 8px}
html .rasvo-card__media{overflow:hidden}
html .rasvo-card__media img,
html .woocommerce-product-gallery__image img{background:transparent}

/* ---- 49.4  product cards: calm at rest, alive on hover ------------- */
html .rasvo-card{
  transition:transform var(--rv3-t3) var(--rv3-e),box-shadow var(--rv3-t3) var(--rv3-e)}
html .rasvo-card:hover{transform:translateY(-6px);box-shadow:var(--rv3-sh2)}
html .rasvo-card:active{transform:translateY(-2px)}
html .rasvo-card__media img{
  transition:transform 900ms var(--rv3-e),filter 600ms var(--rv3-e-soft)}
html .rasvo-card:hover .rasvo-card__media img{transform:scale(1.05)}
html .rasvo-card__media::before{
  content:"";position:absolute;inset:0;z-index:2;opacity:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(12,20,31,0) 42%,rgba(12,20,31,.30));
  transition:opacity var(--rv3-t2) var(--rv3-e-soft)}
html .rasvo-card:hover .rasvo-card__media::before{opacity:1}

/* the care panel used to sit on the image permanently — now it slides in */
html .rasvo-card__spec{
  z-index:3;opacity:0;transform:translateY(100%);pointer-events:none;
  transition:transform 460ms var(--rv3-e),opacity 240ms linear}
html .rasvo-card:hover .rasvo-card__spec,
html .rasvo-card:focus-within .rasvo-card__spec{opacity:1;transform:translateY(0)}

html .rasvo-card__name{transition:color var(--rv3-t1) linear}
html .rasvo-card:hover .rasvo-card__name{color:var(--rv3-ink)}
html .rasvo-card__price{transition:transform var(--rv3-t2) var(--rv3-e)}
html .rasvo-card:hover .rasvo-card__price{transform:translateX(-2px)}
html .rasvo-card__sizes{transition:opacity var(--rv3-t2) linear;opacity:1}
html .rasvo-card:hover .rasvo-card__sizes{opacity:1}
html .rasvo-card a:focus-visible{outline:none}
html .rasvo-card:focus-within{transform:translateY(-4px);box-shadow:var(--rv3-sh1)}

/* ---- 49.5  buttons: one hover language everywhere ------------------ */
html .elementor-button,
html .woocommerce a.button,
html .woocommerce button.button,
html .woocommerce input.button,
html .rasvo-sticky-atc__btn{
  transition:transform var(--rv3-t2) var(--rv3-e),
             box-shadow var(--rv3-t2) var(--rv3-e),
             background-color var(--rv3-t2) var(--rv3-e-soft),
             color var(--rv3-t2) var(--rv3-e-soft),
             border-color var(--rv3-t2) var(--rv3-e-soft),
             letter-spacing var(--rv3-t2) var(--rv3-e-soft)}
html .elementor-button:hover,
html .woocommerce a.button:hover,
html .woocommerce button.button:hover:not(.disabled),
html .woocommerce input.button:hover,
html .rasvo-sticky-atc__btn:hover{
  transform:translateY(-2px);box-shadow:var(--rv3-sh1)}
html .elementor-button:active,
html .woocommerce a.button:active,
html .woocommerce button.button:active:not(.disabled),
html .rasvo-sticky-atc__btn:active{transform:translateY(0);box-shadow:none}

/* arrow-carrying links drift on hover */
html a[class*="rasvo"][href]:hover,
html .rasvo-fabric-link:hover{--rv3-drift:3px}
html .rasvo-fabric-link{transition:transform var(--rv3-t2) var(--rv3-e),color var(--rv3-t2) linear}
html .rasvo-fabric-link:hover{transform:translateX(3px)}

/* ---- 49.6  shop fit pills ----------------------------------------- */
html .rasvo-fitpill{
  transition:background-color var(--rv3-t2) var(--rv3-e-soft),
             color var(--rv3-t2) var(--rv3-e-soft),
             border-color var(--rv3-t2) var(--rv3-e-soft),
             transform var(--rv3-t2) var(--rv3-e);
  min-height:38px;display:inline-flex;align-items:center}
html .rasvo-fitpill:hover{transform:translateY(-2px);border-color:var(--rv3-ink)}
html .rasvo-fitpill:active{transform:translateY(0)}

/* ---- 49.7  keyboard focus: single visible ring --------------------- */
html a:focus-visible,
html button:focus-visible,
html input:focus-visible,
html select:focus-visible,
html textarea:focus-visible,
html summary:focus-visible,
html [tabindex]:focus-visible,
html .variable-item:focus-visible{
  outline:2px solid var(--rv3-gold);outline-offset:3px;border-radius:2px}
html .skip-link:focus{
  left:16px;top:16px;width:auto;height:auto;padding:12px 18px;clip:auto;
  background:var(--rv3-ink);color:#FAF9F6;z-index:100000;font:var(--rasvo-v2-mono-nav)}

/* ================= 49.8  SINGLE PRODUCT ============================ */
/* spec table: labels were an off-palette blue — bring them home */
html body.single-product .rasvo-pdp-spec dt{
  /* was --rv3-ink-58 = 4.21:1 at 12px — AA fail (Review 5 issue #5). The token
     itself is left alone; it is fine on larger/darker uses. Only this
     12px-label role moves to the AA-safe muted value. */
  color:var(--rasvo-v2-muted-on-light,#4A515C)!important;
  letter-spacing:.14em}
html body.single-product .rasvo-pdp-spec dd{color:var(--rv3-ink-72)}
html body.single-product .rasvo-pdp-spec>div,
html body.single-product .rasvo-pdp-spec dl>div{
  transition:background-color var(--rv3-t1) linear}

/* attribute rows: quieter labels, roomier rhythm */
html body.single-product .variations th.label{padding-bottom:8px}
html body.single-product .variations th.label label{
  font:var(--rasvo-v2-mono-label);letter-spacing:.16em;text-transform:uppercase;
  /* was --rv3-ink-58 / rgba(12,20,31,.5) = 3.44:1 at 12px — AA fail on the
     SIZE selector label, the one thing a shopper must read before buying
     (Review 5 issue #5). */
  color:var(--rasvo-v2-muted-on-light,#4A515C);margin:0}
html body.single-product .variations th.label .woo-selected-variation-item-name{
  font:var(--rasvo-v2-mono-label);letter-spacing:.1em;color:var(--rv3-ink);
  margin-left:2px;text-transform:none}

/* size swatches: real targets, unmistakable selected state */
html body.single-product .button-variable-items-wrapper{gap:8px;flex-wrap:wrap}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item{
  min-width:54px;min-height:46px;margin:0!important;padding:0;
  border:1px solid var(--rv3-line);border-radius:2px;background:transparent;
  box-shadow:none!important;
  transition:background-color var(--rv3-t2) var(--rv3-e-soft),
             color var(--rv3-t2) var(--rv3-e-soft),
             border-color var(--rv3-t2) var(--rv3-e-soft),
             transform var(--rv3-t2) var(--rv3-e)}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item .variable-item-span{
  font:var(--rasvo-v2-mono-nav);letter-spacing:.12em;color:var(--rv3-ink-72);
  transition:color var(--rv3-t2) var(--rv3-e-soft)}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item:hover{
  border-color:var(--rv3-ink);transform:translateY(-2px)}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item.selected,
html body.single-product .variable-items-wrapper .variable-item.button-variable-item[aria-checked="true"]{
  background:var(--rv3-ink)!important;border-color:var(--rv3-ink)!important;transform:none}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item.selected .variable-item-span,
html body.single-product .variable-items-wrapper .variable-item.button-variable-item[aria-checked="true"] .variable-item-span{
  color:#FAF9F6!important}
html body.single-product .variable-items-wrapper .variable-item.button-variable-item.disabled,
html body.single-product .variable-items-wrapper .variable-item.button-variable-item.out-of-stock{
  opacity:.38;text-decoration:line-through}

/* colour chip: smaller, softer, aligned */
html body.single-product .color-variable-items-wrapper .variable-item.color-variable-item{
  width:34px;height:34px;min-width:34px;min-height:34px;padding:3px;
  border:1px solid var(--rv3-line);border-radius:2px;background:transparent;
  box-shadow:none!important;
  transition:border-color var(--rv3-t2) var(--rv3-e-soft),transform var(--rv3-t2) var(--rv3-e)}
html body.single-product .color-variable-items-wrapper .variable-item.color-variable-item:hover{
  transform:translateY(-2px);border-color:var(--rv3-ink)}
html body.single-product .color-variable-items-wrapper .variable-item.color-variable-item.selected{
  border-color:var(--rv3-ink)!important}
html body.single-product .color-variable-item .variable-item-span{border-radius:1px}
/* the tick was heavier than the swatch itself */
html body.single-product .color-variable-item.selected .variable-item-span::after,
html body.single-product .color-variable-item.selected::after{
  transform:scale(.72)!important;opacity:.92}
/* self-labelling swatches don't need a floating tooltip */
html body.single-product .variable-item[data-wvstooltip]::before,
html body.single-product .variable-item[data-wvstooltip]::after{
  display:none!important;content:none!important}

/* add to cart: readable in every state */
html body.single-product .single_add_to_cart_button{
  min-height:56px;letter-spacing:.2em;
  transition:background-color var(--rv3-t2) var(--rv3-e-soft),
             color var(--rv3-t2) var(--rv3-e-soft),
             border-color var(--rv3-t2) var(--rv3-e-soft),
             transform var(--rv3-t2) var(--rv3-e),
             box-shadow var(--rv3-t2) var(--rv3-e)}
html body.single-product .single_add_to_cart_button:not(.disabled):hover{
  transform:translateY(-2px);box-shadow:var(--rv3-sh2);letter-spacing:.24em}
html body.single-product .single_add_to_cart_button:not(.disabled):active{
  transform:translateY(0);box-shadow:none}
html body.single-product .single_add_to_cart_button.disabled,
html body.single-product .single_add_to_cart_button.wc-variation-selection-needed{
  opacity:1!important;cursor:not-allowed;
  background:rgba(20,26,35,.045)!important;
  border:1px dashed rgba(20,26,35,.26)!important;
  box-shadow:none!important;transform:none!important}
html body.single-product .single_add_to_cart_button.disabled::after,
html body.single-product .single_add_to_cart_button.wc-variation-selection-needed::after{
  color:rgba(20,26,35,.6)!important;letter-spacing:.2em}

/* accordion: warm hairlines, real motion, rotating sign */
html body.single-product .e-n-accordion details{
  border-color:var(--rv3-line)!important;
  transition:background-color var(--rv3-t2) linear,border-color var(--rv3-t2) linear}
html body.single-product .e-n-accordion summary{
  cursor:pointer;transition:background-color var(--rv3-t1) linear,color var(--rv3-t1) linear}
html body.single-product .e-n-accordion summary:hover{background:rgba(20,26,31,.03)}
html body.single-product .e-n-accordion summary .e-n-accordion-item-title-icon,
html body.single-product .e-n-accordion summary svg{
  transition:transform 380ms var(--rv3-e)}
html body.single-product .e-n-accordion details[open] summary .e-n-accordion-item-title-icon,
html body.single-product .e-n-accordion details[open] summary svg{transform:rotate(180deg)}
@supports selector(::details-content){
 @media (prefers-reduced-motion:no-preference){
  html body.single-product .e-n-accordion details::details-content{
    height:0;overflow:clip;opacity:0;
    transition:height 420ms var(--rv3-e),opacity 300ms linear,content-visibility 420ms;transition-behavior:allow-discrete}
  html body.single-product .e-n-accordion details[open]::details-content{height:auto;opacity:1}
 }
}

/* gallery: slow breathing zoom, honest thumbs */
html body.single-product .woocommerce-product-gallery__image img{
  transition:transform 1200ms var(--rv3-e)}
html body.single-product .woocommerce-product-gallery:hover .woocommerce-product-gallery__image img{
  transform:scale(1.035)}
html body.single-product .flex-control-thumbs li img{
  transition:opacity 350ms var(--rv3-e),transform 350ms var(--rv3-e),border-color 350ms var(--rv3-e)}
html body.single-product .flex-control-thumbs li img:hover{transform:translateY(-2px)}
html body.single-product .flex-control-thumbs li img.flex-active{opacity:1;border-color:var(--rv3-ink)}

/* sticky buy bar slides rather than pops */
html .rasvo-sticky-atc{
  transition:transform 420ms var(--rv3-e),opacity 300ms linear,box-shadow 420ms var(--rv3-e)}

/* ================= 49.9  HEADER / FOOTER / FORMS =================== */
/* Session 29: these two rules were dead — their selectors carried an HTML-encoded
   child combinator. Decoding made them live, which would have put backdrop-filter back on the
   header row and re-broken the side cart + mobile menu exactly as in Session 28
   (see D-97). Padding and box-shadow stay on the element; the glass goes to the
   ::before child, matching the section 9 fix. Do not merge them back. */
html header.elementor-location-header > .elementor-sticky{
  transition:padding 420ms var(--rv3-e),box-shadow 420ms var(--rv3-e)}
html header.elementor-location-header > .elementor-sticky::before{
  transition:background-color 420ms linear,backdrop-filter 420ms linear}
html.rasvo-scrolled header.elementor-location-header > .elementor-sticky{
  padding-top:11px!important;padding-bottom:11px!important;
  box-shadow:0 1px 0 rgba(20,26,35,.10),0 18px 40px -34px rgba(12,20,31,.45)}
html.rasvo-scrolled header.elementor-location-header > .elementor-sticky::before{
  background-color:rgba(250,249,246,.92);
  -webkit-backdrop-filter:saturate(1.6) blur(18px);
  backdrop-filter:saturate(1.6) blur(18px)}
html header.elementor-location-header .elementor-nav-menu a{
  transition:color var(--rv3-t2) linear,opacity var(--rv3-t2) linear}
html header.elementor-location-header .elementor-menu-cart__toggle a,
html header.elementor-location-header .elementor-menu-cart__toggle_button{
  transition:color var(--rv3-t2) linear,transform var(--rv3-t2) var(--rv3-e)}
html header.elementor-location-header .elementor-menu-cart__toggle_button:hover{
  transform:translateY(-1px)}

html footer a,
html .elementor-location-footer a{transition:color var(--rv3-t2) linear,opacity var(--rv3-t2) linear}
html .elementor-location-footer a:hover{color:var(--rv3-gold)}

/* fields: quiet until focused */
html .elementor-field-textual,
html .woocommerce form .form-row input.input-text,
html .woocommerce form .form-row textarea,
html .woocommerce .quantity input.qty,
html .woocommerce-cart-form input,
html input[type="email"],
html input[type="text"],
html input[type="search"]{
  transition:border-color var(--rv3-t2) var(--rv3-e-soft),
             background-color var(--rv3-t2) var(--rv3-e-soft),
             box-shadow var(--rv3-t2) var(--rv3-e-soft)}
html .elementor-field-textual:focus,
html .woocommerce form .form-row input.input-text:focus,
html input[type="email"]:focus,
html input[type="text"]:focus,
html input[type="search"]:focus{
  border-color:var(--rv3-ink)!important;
  box-shadow:0 1px 0 0 var(--rv3-ink);outline:none}
html ::placeholder{color:rgba(20,26,35,.42);opacity:1}
html ::selection{background:rgba(176,138,60,.28);color:var(--rv3-ink)}

/* ================= 49.10  EXTRA MOTION ============================= */
/* editorial fabric macro drifts as it passes through the viewport */
@supports (animation-timeline:view()){
 @media (prefers-reduced-motion:no-preference) and (min-width:1025px){
  html .rasvo-v2-cotton img{
    animation:rv3Drift linear both;animation-timeline:view();
    animation-range:cover 0% cover 100%}
  @keyframes rv3Drift{
    from{transform:translateY(-2.2%) scale(1.06)}
    to{transform:translateY(2.2%) scale(1.06)}}
 }
}
/* UGC tiles: slow reveal-zoom */
html .rasvo-v2-community img{transition:transform 1100ms var(--rv3-e),filter 700ms var(--rv3-e-soft)}
html .rasvo-v2-community a:hover img,
html .rasvo-v2-community figure:hover img{transform:scale(1.06)}

/* ================= 49.11  CART / COMMERCE ========================== */
html .woocommerce-cart-form__cart-item,
html .woocommerce table.shop_table tbody tr{
  transition:background-color var(--rv3-t2) linear}
html .woocommerce-cart-form__cart-item:hover{background:rgba(20,26,35,.025)}
html .woocommerce a.remove{
  transition:color var(--rv3-t1) linear,transform var(--rv3-t1) var(--rv3-e),background-color var(--rv3-t1) linear}
html .woocommerce a.remove:hover{transform:rotate(90deg)}
html .woocommerce .quantity{transition:border-color var(--rv3-t2) linear}

/* ================= 49.12  RESPONSIVE ============================== */
@media (min-width:1700px){
  html .page-content .e-con-boxed > .e-con-inner{max-width:min(1320px,84vw)}
}
@media (hover:none){
  /* no hover on touch: keep the image clean, specs live in the card body */
  html .rasvo-card__spec{display:none!important}
  html .rasvo-card:hover{transform:none;box-shadow:none}
  html .rasvo-card__sizes{opacity:1}
}
@media (max-width:1024px){
  html [id]{scroll-margin-top:80px}
  html body.single-product .single_add_to_cart_button{min-height:52px}
}
@media (max-width:767px){
  html body.single-product .button-variable-items-wrapper{gap:6px}
  html body.single-product .variable-items-wrapper .variable-item.button-variable-item{
    flex:1 1 calc(33.333% - 6px);min-width:0}
  html body.single-product .variations th.label{padding-bottom:6px}
  html .rasvo-fitpill{min-height:40px}
  html.rasvo-scrolled header.elementor-location-header > .elementor-sticky{
    padding-top:9px!important;padding-bottom:9px!important}
}

/* ================= 49.13  REDUCED MOTION =========================== */
@media (prefers-reduced-motion:reduce){
  html .rasvo-card,
  html .rasvo-card__media img,
  html .rasvo-card__spec,
  html .rasvo-v2-cotton img,
  html .rasvo-v2-community img,
  html .elementor-button,
  html .woocommerce a.button,
  html .woocommerce button.button,
  html body.single-product .single_add_to_cart_button,
  html body.single-product .variable-item{
    transition-duration:1ms!important;animation:none!important}
  html .rasvo-card:hover{transform:none}
  html .rasvo-card__spec{opacity:1;transform:none}
}

/* ---- 49.14  reveal moved to the card wrapper -----------------------
   The reveal animation used to live on .rasvo-card itself, and animated
   values beat normal declarations — so every hover transform on the card
   was silently cancelled. The wrapper reveals, the card stays free to move. */
@supports (animation-timeline:view()){
 @media (prefers-reduced-motion:no-preference){
  html .rasvo-card{animation:none!important}
  html .e-loop-item,
  html .woocommerce ul.products > li.product{
    animation:rv3Reveal linear both;animation-timeline:view();
    animation-range:entry 0% entry 22%}
  html .e-loop-item:nth-child(2),
  html .woocommerce ul.products > li.product:nth-child(2){animation-range:entry 2% entry 25%}
  html .e-loop-item:nth-child(3),
  html .woocommerce ul.products > li.product:nth-child(3){animation-range:entry 4% entry 28%}
  html .e-loop-item:nth-child(4),
  html .woocommerce ul.products > li.product:nth-child(4){animation-range:entry 6% entry 31%}
  @keyframes rv3Reveal{
    from{opacity:0;transform:translateY(26px)}
    to{opacity:1;transform:none}}
 }
}
/* care panel: hover only (needs !important to beat the reveal animation) */
html .rasvo-card__spec{
  animation:none!important;
  opacity:0!important;transform:translateY(100%)!important}
html .rasvo-card:hover .rasvo-card__spec,
html .rasvo-card:focus-within .rasvo-card__spec{
  opacity:1!important;transform:translateY(0)!important}
@media (hover:none){
  html .rasvo-card__spec{display:none!important}
}
@media (prefers-reduced-motion:reduce){
  html .rasvo-card__spec{opacity:0!important;transform:translateY(100%)!important}
  html .rasvo-card:hover .rasvo-card__spec{opacity:1!important;transform:none!important}
}

/* ---- 49.15  specificity escalation (Elementor + swatch plugin) ----- */
/* the disabled CTA was painted at 50% opacity, which made the prompt
   almost unreadable; keep it muted through colour, not transparency */
html body.single-product form.cart button.single_add_to_cart_button.disabled.disabled,
html body.single-product form.cart button.single_add_to_cart_button.wc-variation-selection-needed.wc-variation-selection-needed{
  opacity:1!important;
  background:rgba(20,26,35,.05)!important;
  border:1px dashed rgba(20,26,35,.28)!important;
  color:transparent!important}
html body.single-product form.cart button.single_add_to_cart_button.disabled.disabled::after,
html body.single-product form.cart button.single_add_to_cart_button.wc-variation-selection-needed.wc-variation-selection-needed::after{
  color:rgba(20,26,35,.62)!important;letter-spacing:.2em!important}

/* colour chip: smaller footprint, lighter tick */
html body.single-product .variations .variable-items-wrapper li.color-variable-item.color-variable-item{
  width:36px!important;height:36px!important;
  min-width:36px!important;min-height:36px!important;padding:3px!important}
html body.single-product .variations li.color-variable-item.selected .variable-item-contents::before{
  background-size:13px 13px!important;background-position:center!important;
  width:100%!important;opacity:.92}

/* size swatch: make the selected state unmistakable at any specificity */
html body.single-product .variations .variable-items-wrapper li.button-variable-item.selected,
html body.single-product .variations .variable-items-wrapper li.button-variable-item[aria-checked="true"]{
  background:#141A23!important;border-color:#141A23!important}
html body.single-product .variations .variable-items-wrapper li.button-variable-item.selected .variable-item-span,
html body.single-product .variations .variable-items-wrapper li.button-variable-item[aria-checked="true"] .variable-item-span{
  color:#FAF9F6!important}
html body.single-product .variations .variable-items-wrapper li.button-variable-item{
  min-height:46px!important}

/* ---- 49.16  layout rebalance + final details ----------------------- */
/* ultra-wide screens: boxed content no longer floats in a sea of paper */
@media (min-width:1600px){
  html body .e-con-boxed > .e-con-inner{max-width:min(100%,1320px)}
}
@media (min-width:2000px){
  html body .e-con-boxed > .e-con-inner{max-width:min(100%,1440px)}
}
/* PDP: give the garment the room it deserves */
@media (min-width:1025px){
  html body.single-product .e-con-inner > .e-con.e-child{align-items:flex-start}
  html body.single-product .e-con-inner > .e-con.e-child > .e-con:first-child{
    flex:1 1 56%;max-width:56%}
  html body.single-product .e-con-inner > .e-con.e-child > .e-con:last-child{
    flex:1 1 40%;max-width:40%}
}
/* accordion hairlines were Elementor grey; warm them up */
html body.single-product .e-n-accordion summary,
html body.single-product .e-n-accordion details,
html body.single-product .e-n-accordion .e-n-accordion-item{
  border-color:rgba(20,26,35,.14)!important}

/* ---- 49.17  header must never inherit the content-page button frame -
   body:not(.home):not(.woocommerce-page) .elementor-button was drawing a
   1px box around BAG / SEARCH in the sticky header on content pages. */
html body .elementor-location-header .elementor-button,
html body .elementor-location-header .elementor-menu-cart__toggle_button,
html body .elementor-location-header .elementor-menu-cart__toggle .elementor-button{
  border:0!important;background:transparent!important;padding-inline:0!important}
/* ================= end 49  V3 REFINEMENT LAYER ===================== */

/* ================= 50 · SIDE-CART DRAWER RESTORE (Session 28) =============
   Section 28 above neutralises `.elementor-location-header .elementor-button`
   so the cart TOGGLE renders as plain text — correct, and still needed. But
   Elementor renders the whole side-cart drawer INSIDE the header, so that
   reset also hit the drawer's "View cart" / "Checkout" buttons: padding:0
   collapsed them to height:0. Separately the header template (467) sets
   `.elementor-button-text{display:none}` across the cart widget, which blanked
   their labels. Net effect: two zero-height, text-less anchors — no way to
   reach the cart or checkout from the drawer.

   Both were invisible until the drawer itself was un-clipped (section 9), which
   is why three consolidation passes never caught them. Re-scoped here rather
   than loosening section 28, which the toggle depends on. */
.elementor-location-header .elementor-menu-cart__footer-buttons .elementor-button{
  padding:15px 26px!important;
  font-size:12px!important;
  letter-spacing:.18em!important;
  text-transform:uppercase;
  font-family:'Geist Mono',ui-monospace,monospace;
  border-radius:var(--rasvo-v2-radius,2px);
}
.elementor-location-header .elementor-menu-cart__footer-buttons .elementor-button-text{
  display:inline-block!important;
}
/* Forward action is the only filled button in the drawer — the Session 23
   one-filled-button-per-purchase-screen rule (D-77) applies here too. */
.elementor-location-header .elementor-menu-cart__footer-buttons .elementor-button--checkout{
  background-color:var(--rasvo-v2-navy,#0C141F)!important;
  color:var(--rasvo-v2-paper,#FAF9F6)!important;
}
.elementor-location-header .elementor-menu-cart__footer-buttons .elementor-button--view-cart{
  background-color:transparent!important;
  color:var(--rasvo-v2-ink,#141A23)!important;
  border:1px solid var(--rv-line)!important;
}
