/* 2026-09-14 - retired-template prune: 203 selectors removed from this file.
   Each named a class that exists nowhere - not on any of the 370 published
   URLs, not in any post_content/postmeta/option row in any status, not emitted
   by any theme PHP or JS. See the note at the top of style.css for the method
   and the verification. This file was 26.3 KB at roughly 15% use; the
   .vovn-route-*, .vovn-hub-*, .vvs-* and .vov-mi__* blocks that made up the
   rest were the image-led route system this site stopped using. */
/* Image-led route, article, index, search and error system. */
.vovn-missing{display:grid;grid-template-columns:minmax(0,.9fr) minmax(24rem,1.1fr);min-height:72vh;background:var(--vovn-porcelain)}
.vovn-missing>div{align-self:center;padding:clamp(4rem,9vw,9rem) clamp(1.25rem,6vw,6rem)}
.vovn-missing h1,.vovn-index>header h1{margin:.15em 0;font:500 clamp(4rem,8vw,8rem)/.84 var(--vovn-display);letter-spacing:-.055em}
.vovn-missing figure{position:relative;min-height:72vh;margin:0;overflow:hidden;background:var(--vovn-espresso)}
.vovn-missing figure:after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,rgba(36,27,25,.65),transparent 50%)}
.vovn-missing img{width:100%;height:100%;object-fit:cover;filter:saturate(.8) contrast(1.04)}


.vovn-article-body{max-width:90vw;width:100%;margin:auto;padding:clamp(4rem,8vw,8rem) clamp(1.25rem,4vw,2.5rem)}.vovn-index{padding-bottom:5rem}.vovn-index>header{padding:clamp(5rem,10vw,9rem) max(1.25rem,calc((100vw - 80rem)/2));background:var(--vovn-espresso);color:var(--vovn-porcelain)}.vovn-index>header h1{color:inherit}
.vovn-index-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1px;background:var(--vovn-cocoa);border-block:1px solid var(--vovn-cocoa)}.vovn-index-grid article{grid-column:span 4;padding:1.2rem;background:var(--vovn-porcelain)}.vovn-index-grid article:first-child{grid-column:span 7}.vovn-index-grid article:nth-child(2){grid-column:span 5}.vovn-index-image{display:block;height:24rem;overflow:hidden}.vovn-index-image img{width:100%;height:100%;object-fit:cover}.vovn-index-image--none{display:grid;place-items:center;background:linear-gradient(180deg,var(--vovn-cocoa),var(--vovn-ink,#241c19))}.vovn-index-image--none span{font:500 clamp(2.5rem,6vw,5rem)/1 var(--vovn-display);color:rgba(247,240,231,.72);letter-spacing:.02em}.vovn-index-grid h2{font:500 clamp(2rem,3vw,3.2rem)/1 var(--vovn-display)}.vovn-pagination{padding:2rem}.vovn-missing{min-height:80vh}
@media(max-width:760px){.vovn-missing{grid-template-columns:1fr}.vovn-missing figure{min-height:30rem}.vovn-index-grid{display:block}.vovn-index-grid article{border-bottom:1px solid var(--vovn-cocoa)}}
/* Reduced motion: collapse the clock, do not switch the interface off.
   transition:none also removed the hover and focus colour changes that
   tell a reader a control responded. Durations go to a perceptual zero
   instead, so state still lands; travel is removed by the component
   rules that own it. transform is deliberately not reset here — plenty
   of elements use it for centring, not for movement. */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{
    scroll-behavior:auto!important;
    transition-duration:1ms!important;
    animation-duration:1ms!important;
    animation-iteration-count:1!important;
  }
}

/* Spa Intelligence — same framework as Restaurant/Venue Intelligence shells.
   Site palette stays Vanity or Vice. */

body.page-id-44 .vovn-prose{
  max-width:none
}
body.page-id-44 .vovn-prose>p:first-child{
  max-width:46rem;
  font-size:1.06rem;
  line-height:1.62
}
body.page-id-44 .vovn-prose h2{
  max-width:18ch;
  margin:2.4rem 0 .85rem;
  font:500 clamp(2rem,3.4vw,3.2rem)/.98 var(--vovn-display);
  letter-spacing:-.03em
}
body.page-id-44 .vovn-prose h2+p{
  max-width:48rem;
  padding:1.15rem 1.25rem;
  border:1px solid rgba(36,27,25,.16);
  border-top:5px solid var(--vovn-oxblood);
  background:#fff;
  box-shadow:0 24px 70px -58px rgba(36,27,25,.5)
}
body.page-id-44 .vovn-prose h2:nth-of-type(2)+p{border-top-color:var(--vovn-bronze)}


/* Editorial landing-page content system. */
.vov-landing{display:grid;gap:clamp(2rem,4vw,4.5rem)}
.vov-intro{max-width:90vw}.vov-intro p:first-child{font:700 .68rem var(--vovn-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--vovn-oxblood)}
.vov-intro h2{margin:.2em 0;font:500 clamp(2.6rem,5vw,5.4rem)/.92 var(--vovn-display);letter-spacing:-.04em}
.vov-intro p:last-child{font-size:clamp(1.05rem,2vw,1.35rem);line-height:1.55}
.vov-card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;background:var(--vovn-cocoa);border:1px solid var(--vovn-cocoa)}
.vov-card{min-height:0;padding:clamp(1.35rem,3vw,2.4rem);background:var(--vovn-porcelain);display:flex;flex-direction:column;justify-content:space-between}
.vov-card:nth-child(3n+2){background:var(--vovn-champagne)}.vov-card:nth-child(3n){background:var(--vovn-espresso);color:var(--vovn-porcelain)}
/* The card sets porcelain on itself, but its headline, kicker and link each
   pick up an ink colour from a more specific rule elsewhere, so on the dark
   card in the rotation the headline was measuring 1.06:1 against its own
   ground. This was invisible until the --evs-* token scope was fixed, because
   until then .vov-card had no background at all. 14 Sep 2026. */
.vov-card:nth-child(3n) :is(h2,h3,h4,p,li,dt,dd,small,span,strong){color:var(--vovn-porcelain)}
.vov-card:nth-child(3n) a{color:var(--color-accent-metal)}
.vov-card small{font:800 .62rem var(--vovn-mono);letter-spacing:.12em;text-transform:uppercase}.vov-card h3{margin:.5em 0;font:500 clamp(1.65rem,2.6vw,2.8rem)/1 var(--vovn-display)}
.vov-card a,.vov-cta a{font:800 .68rem var(--vovn-mono);letter-spacing:.08em;text-transform:uppercase;text-decoration:none}
.vov-ledger{border-top:5px solid var(--vovn-oxblood)}.vov-ledger div{display:grid;grid-template-columns:5rem 1fr;gap:1rem;padding:1rem 0;border-bottom:1px solid rgba(36,27,25,.25)}.vov-ledger strong{font:700 .65rem var(--vovn-mono);letter-spacing:.08em;text-transform:uppercase}
.vov-cta{padding:clamp(1.75rem,4vw,4rem);background:var(--vovn-oxblood);color:var(--vovn-porcelain)}.vov-cta h2{margin:0 0 .35em;font:500 clamp(2.5rem,5vw,5rem)/.92 var(--vovn-display)}
@media(max-width:760px){.vov-card-grid{grid-template-columns:1fr}.vov-card{min-height:0}.vov-ledger div{grid-template-columns:1fr}}

/* ==========================================================
   LANDING-SYSTEM CONTRAST + CONTAINMENT HARDENING
   Fixes three reported defects across every hub page.

   1) INVISIBLE LINKS ON DARK CARDS.
      .vov-card:nth-child(3n) is espresso with porcelain text, and .vov-cta is
      oxblood with porcelain text — but `.vov-card a, .vov-cta a` never set a
      color, so any global anchor color won a specificity fight against the
      inherited light color and rendered dark-on-dark. This was already patched
      for .vovn-spa-intelligence only; the rule below applies it everywhere.
   2) TEXT SITTING ON THE CARD HAIRLINE.
      .vov-card-grid draws its dividers with a 1px gap over a cocoa background.
      Grid/flex children default to min-width:auto, so a long unbroken word in a
      clamp()-sized display heading could overflow the padding and land on that
      divider. Containment below keeps content inside the padded box.
   3) TOUCH TARGETS.
      Card and CTA links are uppercase mono at .68rem — well under a comfortable
      tap target. Padded to a 44px minimum without changing the visual weight.
   ========================================================== */
.vov-card a,
.vov-cta a,
.vovn-card a {
  color: inherit;
  text-decoration-color: currentColor;
}
/* Champagne/gold cards carry dark text explicitly rather than relying on
   whatever color happens to be inherited from the surrounding surface. */
.vov-card:nth-child(3n+2) {
  color: var(--vovn-ink, #241b19);
}
/* Containment: nothing escapes the padded box onto the divider line. */
.vov-card,
.vov-card-grid > * {
  min-width: 0;
}
.vov-card h3,
.vov-card p,
.vov-card small,
.vov-cta h2,
.vov-cta p {
  overflow-wrap: anywhere;
  word-break: normal;
}
.vov-card > *,
.vov-cta > * {
  max-width: 100%;
}
/* Touch targets: >=44px tappable height, visual size unchanged. */
.vov-card a,
.vov-cta a {
  display: inline-block;
  min-height: 44px;
  line-height: 1.5;
  padding-block: 0.85rem;
}
.vov-card a:focus-visible,
.vov-cta a:focus-visible {
  outline: 3px solid currentColor;
  outline-offset: 3px;
}


/* Spa Intelligence — the page-44 palette.

   This block is the last surviving piece of the retired .vvs-* spa template:
   it rebinds the generic --paper / --ink / --accent / --brass / --quiet /
   --rule names to a wine-and-plum scheme for that one page. It is live —
   removing it changes how /spa-intelligence/ looks — so it was left in place
   during the 2026-09-14 prune rather than swept out with the dead rules.
   It is the one remaining per-page palette on Vanity or Vice and is the next
   thing to decide about: keep it as a deliberate exception, or fold the page
   into the house palette. 14 Sep 2026. */
body.page-id-44{
  --vvs-ink:#171216;
  --vvs-paper:#f5f0eb;
  --vvs-wine:#6f2338;
  --vvs-wine-deep:#4b1728;
  --vvs-plum:#2e1c2b;
  --vvs-violet:#75566f;
  --vvs-blush:#d9b3c1;
  --vvs-mist:#e7dde3;
  --vvs-quiet:#6d6268;
  --vvs-rule:rgba(23,18,22,.2);
  --paper:var(--vvs-paper);
  --ink:var(--vvs-ink);
  --plum:var(--vvs-plum);
  --accent:var(--vvs-wine);
  --brass:var(--vvs-blush);
  --quiet:var(--vvs-quiet);
  --rule:var(--vvs-rule);
  color-scheme:light;
  background:var(--vvs-paper);
  color:var(--vvs-ink)
}
body.page-id-44 .vv-wordmark em,
body.page-id-44 .vv-nav a:hover{color:var(--vvs-wine)}
/* Footer hover on page 44: var(--vvs-wine) #6f2338 measured 1.74:1 on the ink
   footer #151315. #D9A96B is 8.66:1. */
body.page-id-44 .vv-footer a:hover{color:#D9A96B}
