/* ═══════════════════════════════════════════════════════════════════════════
   ADDITIONS — styling for the slots the frozen board does not contain.

   The board covers Home, About, Service and Condition. Everything the canon
   stack ADDS (compare-options, candidacy, cost, when-to-seek-care, the
   body-region chip row, the payment strip, the hub and city and index page
   types) arrives as markup in the board's own class idiom with no rule behind
   it. Unstyled markup is the defect check-computed-style exists to catch, so
   these are written in the board's own tokens rather than left to defaults.

   Loaded AFTER the page-type stylesheet, so it may only ADD; it never
   overrides a board declaration.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── shared rhythm ──────────────────────────────────────────────────────── */
.sec-lede { max-width: 62ch; color: rgba(19, 19, 18, .72); margin: .5rem 0 1.4rem; }
.on-dark .sec-lede, .on-black .sec-lede { color: rgba(255, 255, 255, .72); }
.authority-link { margin-top: 1.6rem; font-size: .92rem; color: rgba(19, 19, 18, .66); }
.byline { margin-top: 1.4rem; font-size: .85rem; letter-spacing: .06em; text-transform: uppercase; color: rgba(19, 19, 18, .55); }
.oversight-line { margin-top: .35rem; font-size: .9rem; color: rgba(19, 19, 18, .62); }
.on-dark .byline, .on-dark .oversight-line { color: rgba(255, 255, 255, .6); }
.cost-note, .cand-refer, .results-vary { margin-top: 1rem; font-size: .92rem; color: rgba(19, 19, 18, .66); }

/* ── candidacy ──────────────────────────────────────────────────────────── */
.cand-grid { display: grid; gap: clamp(1.2rem, 2.4vw, 2rem); grid-template-columns: 1fr; }
@media (min-width: 860px) { .cand-grid { grid-template-columns: 1fr 1fr; } }
.cand-col h3 { margin-bottom: .7rem; }
.cand-col--out .cond-checklist .tick { opacity: .45; }
.cand-seal { margin-top: 1.2rem; }

/* ── cost ───────────────────────────────────────────────────────────────── */
.cost-factors { margin-bottom: 1.6rem; }

/* ── the [tblx] comparison table shell ──────────────────────────────────── */
.tbl-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1.4rem 0; border: 1px solid rgba(19, 19, 18, .12); border-radius: 10px; }
.on-dark .tbl-wrap, .on-black .tbl-wrap { border-color: rgba(255, 255, 255, .16); }
.tblx { width: 100%; min-width: 46rem; border-collapse: collapse; font-size: .92rem; }
.tblx th, .tblx td { padding: .8rem .9rem; text-align: left; vertical-align: top; border-bottom: 1px solid rgba(19, 19, 18, .1); }
.tblx thead th { font-size: .74rem; letter-spacing: .1em; text-transform: uppercase; white-space: nowrap; }
.tblx tbody th { font-weight: 500; white-space: nowrap; }
.tblx tr.is-featured { background: rgba(151, 85, 55, .07); }
.tbl-closer { max-width: 68ch; }

/* ── slot-5 sub-blocks (WhatIsBlocks) ───────────────────────────────────── */
.w5 { margin-top: 1.8rem; }
.w5__capsule { max-width: 62ch; font-size: clamp(1.02rem, 1.3vw, 1.16rem); }
.w5__h { font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; margin-bottom: .6rem; }
.w5__steps { display: grid; gap: 1rem; padding: 0; margin: 0; list-style: none; counter-reset: w5; }
@media (min-width: 860px) { .w5__steps { grid-template-columns: repeat(3, 1fr); } }
.w5__step { padding: 1rem 1.1rem; border: 1px solid rgba(19, 19, 18, .12); border-radius: 10px; }
.w5__steph { font-size: 1rem; margin-bottom: .4rem; }
.w5__lists { display: grid; gap: 1.2rem; margin-top: 1.6rem; }
@media (min-width: 860px) { .w5__lists { grid-template-columns: 1fr 1fr; } }
.w5__list ul { margin: 0; padding-left: 1.1rem; }
.w5__note { margin-top: 1.6rem; padding: 1rem 1.1rem; border-left: 3px solid #975537; background: rgba(234, 201, 185, .22); border-radius: 0 8px 8px 0; }
.w5__note h3 { font-size: .95rem; margin-bottom: .5rem; }
.w5__note ul { margin: 0; padding-left: 1.1rem; }
.w5__recheck { margin-top: 1rem; font-size: .92rem; color: rgba(19, 19, 18, .7); }

/* ── condition body extras ──────────────────────────────────────────────── */
.cause-panels { display: grid; gap: 1rem; }
@media (min-width: 860px) { .cause-panels { grid-template-columns: 1fr 1fr; } }
.eval-row { margin-top: 1.2rem; }
.tl-window { font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: rgba(19, 19, 18, .58); }

/* ── hub + index page types ─────────────────────────────────────────────── */
.region-groups { display: grid; gap: 1.2rem clamp(1.2rem, 3vw, 2.4rem); grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); }
.region-group h3 { font-size: .8rem; letter-spacing: .12em; text-transform: uppercase; margin-bottom: .5rem; }
.region-group ul, .hub-svc-list, .city-links, .access-facts, .landmark-list, .cred-wall, .nf-links { list-style: none; margin: 0; padding: 0; }
.region-group li, .hub-svc-list li, .city-links li { margin: .25rem 0; }
.hub-all, .hub-up, .area-all, .city-up, .mega-all, .foot-review { margin-top: 1.2rem; font-size: .92rem; }
.hub-svc-h { font-size: 1.15rem; }
.linkout-band { margin-top: 2rem; padding: 1.2rem 1.3rem; border: 1px solid rgba(19, 19, 18, .12); border-radius: 10px; }
.linkout-band ul { list-style: none; margin: .6rem 0 0; padding: 0; display: flex; gap: 1.2rem; flex-wrap: wrap; }

/* ── home additions ─────────────────────────────────────────────────────── */
.region-chips ul, .hero-trust-row, .pay-chips, .vb-chips, .hero-chips {
  list-style: none; margin: 1.2rem 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: .5rem .6rem;
}
.region-chips a, .hero-chips li {
  display: inline-block; padding: .45rem .9rem; border-radius: 999px;
  border: 1px solid rgba(19, 19, 18, .18); font-size: .88rem; text-decoration: none;
}
.hero-chips li { border-color: rgba(255, 255, 255, .3); color: #fff; }
.pay-chips li { flex: 1 1 14rem; }
.why-grid { display: grid; gap: 1.2rem; margin: 1.4rem 0; }
@media (min-width: 860px) { .why-grid { grid-template-columns: repeat(2, 1fr); } }
.cred-wall li { margin: .3rem 0; }
.book-rail { margin-top: 1.4rem; }
.book-steps { list-style: none; margin: 0; padding: 0; display: grid; gap: .8rem; }
.book-assure { list-style: none; margin: 1rem 0 0; padding: 0; }
.book-reassure { margin-top: .8rem; font-size: .92rem; }
.bs-n { display: inline-block; min-width: 2rem; font-size: .78rem; letter-spacing: .1em; }
.bs-t { font-weight: 500; }
.bs-b { display: block; font-size: .92rem; color: rgba(19, 19, 18, .7); }

/* ── rail extras ────────────────────────────────────────────────────────── */
.rail-snapshot { margin-bottom: 1rem; }
.rail-snapshot ul, .toc ul { list-style: none; margin: .4rem 0 0; padding: 0; }
.rail-snapshot li, .toc li { margin: .25rem 0; font-size: .92rem; }
.rail-offer { font-size: .88rem; }

/* ── city ───────────────────────────────────────────────────────────────── */
.drive-route { font-size: 1.02rem; }
.landmark-list li { margin: .4rem 0; }

/* ── footer additions ───────────────────────────────────────────────────── */
.foot-hours ul { list-style: none; margin: 0; padding: 0; }
.foot-hours li { display: flex; justify-content: space-between; gap: 1rem; font-size: .88rem; margin: .2rem 0; }
.foot-nap { margin-top: .8rem; font-size: .88rem; }

/* ── visit hours table ──────────────────────────────────────────────────── */
.visit-hours { width: 100%; border-collapse: collapse; margin: 1rem 0; }
.visit-hours caption { text-align: left; font-size: .74rem; letter-spacing: .12em; text-transform: uppercase; padding-bottom: .5rem; }
.visit-hours th, .visit-hours td { padding: .35rem 0; text-align: left; font-size: .92rem; font-weight: 400; }
.visit-hours td { text-align: right; }

/* ── 404 ────────────────────────────────────────────────────────────────── */
.nf-links { display: flex; flex-wrap: wrap; gap: .6rem 1.2rem; margin: 1.4rem 0; }

/* ── blog post (VBH canon tokens) ───────────────────────────────────────── */
.article .wrap { width: min(72rem, 100% - 2rem); margin-inline: auto; }
.article-hero { padding: clamp(2.4rem, 6vw, 5rem) 0 0; }
.glance { margin: 1.4rem 0; padding: 1rem 1.1rem; border-left: 3px solid #975537; background: rgba(234, 201, 185, .22); }
.glance-label { display: block; font-size: .74rem; letter-spacing: .12em; text-transform: uppercase; margin-bottom: .4rem; }
.meta { font-size: .88rem; color: rgba(19, 19, 18, .6); }
.meta .dot { margin: 0 .4rem; }
.cover-frame img { width: 100%; height: auto; border-radius: 12px; }
.body-grid { display: grid; gap: 2rem; }
.blog-prose { max-width: 68ch; }
.cta-card { margin-top: 2.4rem; padding: 1.4rem; border: 1px solid rgba(19, 19, 18, .12); border-radius: 12px; }
.cta-actions { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 1rem; }

/* ── OVERFLOW FLOOR ─────────────────────────────────────────────────────────
   ⛔ The board's round-4 mobile fix asserted page scrollWidth == viewport, and
   the coverflow carousel breaks that on any page whose stage is not clipped:
   its off-stage cards stick out past the viewport and the whole document
   scrolls sideways. Clipping the stage, not the body, keeps the effect and
   removes the sideways scroll.

   ⛔⛔ `body { overflow-x: hidden }` WAS HERE AND MUST NOT COME BACK
   (2026-09-22, the owner's "the why-choose scroll-to-reveal now pins at the top
   of the screen instead of the centre"). An `overflow` other than `visible` on
   an ancestor makes that ancestor the nearest scrollport for every
   `position: sticky` descendant. `.se-pin` is sticky inside `.se-track`, and
   `motion-home.js` scrubs the headline from `.se-track`'s rect, so with the body
   clipped the stage stopped travelling with the track and the title sat at the
   top of the viewport for the whole scrub instead of riding the centre. The
   board never had this declaration. Clip the STAGE, never the document. */
.cf-stage { overflow: hidden; }

/* the hub panel head carries the editorial down-link directly, not inside a card. */
.hub-learn--panel{margin-top:.4rem}

/* ═══════════════════════════════════════════════════════════════════════════
   THE 2026-09-22 RESTORE — slots the port introduced that NO board page styles.

   ⛔ WHY. The owner opened staging and found "many sections are a total
   disaster". check-unstyled-classes.mjs put a number on it: 920 class uses in
   the built HTML with no rule in any built stylesheet. 175 of those were the
   board's own classes reaching a page whose sheet did not carry them (fixed by
   the board-rest-*.css global layer). The rest are these: markup the port added
   in the board's idiom with nothing behind it — the four "how care works here"
   cells rendering black on black, the "Who You Will See" list with no chrome,
   the footer hours and address at browser defaults.

   Every value below is a BOARD TOKEN. Nothing here overrides a board rule;
   these selectors exist on no board page.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── #providers, "Who You Will See" (canon; the board has no team section) ── */
.providers { background: var(--white); }
.providers .cred-wall { margin-top: 1.6rem; }

/* ── the four "how care works here" cells, inside the BLACK .se-below band ──
   They inherited nothing, so the H3s were near-black type on #000. */
.why-grid { display: grid; gap: clamp(1rem, 2vw, 1.6rem); grid-template-columns: 1fr; margin-top: 2rem; text-align: left; }
@media (min-width: 720px) { .why-grid { grid-template-columns: 1fr 1fr; } }
.why-cell { padding: clamp(1.1rem, 2vw, 1.5rem); border: 1px solid var(--line-dark); border-radius: var(--r-l); background: rgba(255, 255, 255, .03); }
.why-cell h3 { font-family: var(--f-d); font-weight: 500; font-size: var(--s-1); line-height: 1.25; color: var(--cod); margin: 0 0 .6rem; }
.why-cell p { color: var(--mist); font-weight: 300; line-height: 1.8; font-size: .96rem; margin: 0; }
.se-below-in .why-grid + .btn { margin-top: 2.1rem; }

/* ── condition + service body shells ───────────────────────────────────────── */
.cond-body { background: var(--white); }
.cond-hero-lede { max-width: 62ch; margin-top: 1rem; color: var(--mist); font-weight: 300; line-height: 1.8; font-size: var(--s-1); }
.on-white .cond-hero-lede, .on-bg .cond-hero-lede { color: var(--ink-72); }
.treat-row { display: grid; gap: clamp(1.2rem, 2.4vw, 2rem); grid-template-columns: 1fr; margin-top: 1.6rem; }
@media (min-width: 860px) { .treat-row { grid-template-columns: 1fr 1fr; } }
.svc-article { max-width: 68rem; }

/* ── About: the team bio rows and the opening capsule ──────────────────────── */
.team-member { padding-bottom: 1.6rem; margin-bottom: 1.6rem; border-bottom: 1px solid var(--ink-09); }
.team-member:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: 0; }
.team-member h3 { font-family: var(--f-d); font-weight: 500; font-size: var(--s-1); line-height: 1.25; margin: 0; }
.team-role { font-family: var(--f-b); font-size: var(--s--1); letter-spacing: .18em; text-transform: uppercase; color: var(--clay); margin: .3rem 0 .8rem; }
.about-capsule { max-width: 62ch; font-size: var(--s-1); line-height: 1.75; color: var(--ink-90); }

/* ── small note paragraphs and lists the canon stack adds ──────────────────── */
.device-list { list-style: none; margin: 1.2rem 0 0; padding: 0; display: grid; gap: .7rem; }
.device-list li { padding-left: 1.1rem; position: relative; color: var(--ink-72); font-weight: 300; line-height: 1.7; }
.device-list li::before { content: ""; position: absolute; left: 0; top: .62em; width: 6px; height: 6px; border-radius: 50%; background: var(--beige); }
.on-dark .device-list li, .on-black .device-list li { color: var(--mist); }
.parking-note, .hours-line { margin-top: 1rem; font-size: .92rem; color: var(--ink-62); }
.on-dark .parking-note, .on-dark .hours-line { color: var(--mist); }
/* R-37 (2026-09-26): the empty Journal state, board tokens only. */
.journal-soon { position: relative; overflow: hidden; margin-top: clamp(1.6rem, 1.2rem + 1.4vw, 2.3rem); max-width: 48rem;
  display: grid; grid-template-columns: auto 1fr; gap: clamp(1.1rem, .8rem + 1.2vw, 1.7rem); align-items: center;
  padding: clamp(1.5rem, 1.1rem + 1.6vw, 2.4rem) clamp(1.35rem, 1rem + 2vw, 2.6rem);
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-m); }
.journal-soon::before { content: ""; position: absolute; inset: 0 auto 0 0; width: 4px; background: var(--beige); }
.journal-soon-mark { width: 3.4rem; height: 3.4rem; border-radius: var(--r-s); background: var(--beige-lo); color: var(--clay);
  display: grid; place-items: center; }
.journal-soon-mark svg { width: 1.65rem; height: 1.65rem; }
.journal-soon-copy { min-width: 0; }
.journal-soon-lead { font-family: var(--f-d); font-weight: 400; font-size: clamp(1.4rem, 1.15rem + 1vw, 1.85rem); line-height: 1.2;
  color: var(--ink); letter-spacing: -.01em; }
.journal-soon-body { margin-top: .5rem; color: var(--ink-72); font-weight: 300; line-height: 1.75; max-width: 56ch; }
@media (max-width: 560px) { .journal-soon { grid-template-columns: 1fr; } }
.area-all { margin-top: 1.4rem; font-size: .92rem; }
.area-all a { color: var(--clay); font-weight: 600; letter-spacing: .04em; }
.area-all a span { display: inline-block; transition: transform .35s var(--ease); }
.area-all a:hover span { transform: translateX(4px); }

/* ── 404 ───────────────────────────────────────────────────────────────────── */
.nf { background: var(--white); }
.nf-call { margin-top: 1.4rem; color: var(--ink-72); }

/* ── the footer NAP + hours column (ARCHITECTURE §7.1; the board footer has
      neither, so address, phone and hours shipped at browser defaults) ─────── */
.foot-hours ul { gap: .55rem; }
.foot-hours li { display: flex; justify-content: space-between; gap: 1.2rem; font-size: .9rem; font-weight: 300; line-height: 1.6; }
.fh-d { color: rgba(255, 255, 255, .74); }
.fh-t { color: var(--beige-lo); white-space: nowrap; }
.foot-nap { margin-top: 1.4rem; color: rgba(255, 255, 255, .74); font-size: .9rem; font-weight: 300; line-height: 1.8; font-style: normal; }
.foot-nap a { color: var(--beige); }
.foot-nap a:hover { color: var(--white); }
.foot-review { margin-top: 1.4rem; font-size: .9rem; }
.foot-review a { color: var(--beige); font-weight: 600; letter-spacing: .04em; }
.foot-review a span { display: inline-block; transition: transform .35s var(--ease); }
.foot-review a:hover span { transform: translateX(4px); }

/* the mega menu's "see all" link reuses the footer's affordance */
.mega-all a { color: var(--beige); font-weight: 600; letter-spacing: .06em; }

/* ⛔ 2026-09-22, found by check-computed-style: the board's `.svc-cond-learn`
   is an inline-flex link and its arrow is `width:1rem` with no `flex`, so the
   arrow SHRINKS when the anchor text is longer than the board's. Our anchor
   text is a full editorial phrase, and the arrow computed 6.5px at 1440 and
   9.5px at 390 instead of 16px. This ADDS flex-basis behaviour the board never
   declared; it does not override a board value. Same for the other inline-flex
   link affordances that carry an arrow. */
.svc-cond-learn svg, .svc-more svg, .hub-learn svg, .area-all a svg, .foot-review a svg { flex: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   METRIC-MATCHED FONT FALLBACKS — the last source of layout shift.

   ⛔ Measured 2026-09-22, board AND build: with fonts blocked both render at
   CLS 0.0000; with Google Fonts reachable both shift when Playfair Display and
   Inter swap in (built Home 0.0153 at 1440, board Home 0.0273 at 390, board
   About 0.0159 at 1440 — it moves run to run because it is network timing).
   The board carries the same `display=swap` link, so this is inherited, not a
   regression. It is still a real jump on a real visit.

   These @font-face rules describe the LOCAL fallback with the web font's
   own metrics, so the fallback occupies the same space and the swap moves
   nothing. This is the one place additions.css re-declares a board token
   (`--f-d` / `--f-b`): it appends the matched family in front of the generic
   fallbacks and changes nothing about which font is used or how it looks once
   it has loaded.

   BUILD-2 (2026-09-25) RE-DERIVED FROM THE REAL FONTS (the fonts are now
   self-hosted, src/lib/fonts.ts). Vertical metrics are the woff2 tables
   (both families set USE_TYPO_METRICS; typo = hhea): Inter 1984/-494/0 of
   2048 = .96875/.24121, Playfair Display 1082/-251/0 of 1000. size-adjust is
   MEASURED in Chromium: the width of the site's own heading / body text in the
   web font over the local face, per weight band (scratch/waves/2026-09-25-wave2/
   build2/font-metrics.mjs). ascent/descent-override = table metric / size-adjust.
   One face per weight band because the width ratio moves with weight (Inter 300
   vs Arial 104.67%, 600 vs Arial Bold 101.07%). Liberation / Arimo / Tinos are
   the metric-compatible Arial / Times clones on Linux and ChromeOS. ═══════ */
@font-face { font-family: "Inter Fallback"; font-style: normal; font-weight: 1 349; src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("Arimo");
  size-adjust: 104.67%; ascent-override: 92.55%; descent-override: 23.04%; line-gap-override: 0%; }
@font-face { font-family: "Inter Fallback"; font-style: normal; font-weight: 350 449; src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("Arimo");
  size-adjust: 106.45%; ascent-override: 91.01%; descent-override: 22.66%; line-gap-override: 0%; }
@font-face { font-family: "Inter Fallback"; font-style: normal; font-weight: 450 549; src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("Arimo");
  size-adjust: 107.53%; ascent-override: 90.09%; descent-override: 22.43%; line-gap-override: 0%; }
@font-face { font-family: "Inter Fallback"; font-style: normal; font-weight: 550 649; src: local("Arial Bold"), local("Arial-BoldMT"), local("Liberation Sans Bold"), local("Arimo Bold");
  size-adjust: 101.07%; ascent-override: 95.85%; descent-override: 23.87%; line-gap-override: 0%; }
@font-face { font-family: "Inter Fallback"; font-style: normal; font-weight: 650 1000; src: local("Arial Bold"), local("Arial-BoldMT"), local("Liberation Sans Bold"), local("Arimo Bold");
  size-adjust: 102.01%; ascent-override: 94.97%; descent-override: 23.65%; line-gap-override: 0%; }
@font-face { font-family: "Playfair Fallback"; font-style: normal; font-weight: 1 549; src: local("Times New Roman"), local("TimesNewRomanPSMT"), local("Liberation Serif"), local("Tinos");
  size-adjust: 109.80%; ascent-override: 98.54%; descent-override: 22.86%; line-gap-override: 0%; }
@font-face { font-family: "Playfair Fallback"; font-style: normal; font-weight: 550 1000; src: local("Times New Roman Bold"), local("TimesNewRomanPS-BoldMT"), local("Liberation Serif Bold"), local("Tinos Bold");
  size-adjust: 105.23%; ascent-override: 102.82%; descent-override: 23.85%; line-gap-override: 0%; }
@font-face { font-family: "Playfair Fallback"; font-style: italic; font-weight: 1 1000; src: local("Times New Roman Italic"), local("TimesNewRomanPS-ItalicMT"), local("Liberation Serif Italic"), local("Tinos Italic");
  size-adjust: 105.10%; ascent-override: 102.95%; descent-override: 23.88%; line-gap-override: 0%; }
:root {
  --f-d: "Playfair Display", "Playfair Fallback", Georgia, "Times New Roman", serif;
  --f-b: "Inter", "Inter Fallback", system-ui, -apple-system, "Segoe UI", sans-serif;
}

/* ── cross-board-page override, patched at the one site it is known to hit ──
   `board-rest-home.css` carries `.contact-copy h2 .i{color:#9C744A}` from the
   SERVICE board page. It outranks Home's own `.i{font-style:italic;color:#000}`
   on specificity, so Home's "Schedule Your <i>Consultation</i>" rendered its
   accent word bronze where the approved board page renders it black — a rule
   from one board page repainting another. `.contact-copy` exists only on Home,
   so this restores the Home board's own value and nothing else. Pinned at
   home/contact-accent, MEASURED ON THE BOARD, so it cannot drift back.
   See the OPEN note in scripts/gen/gen-board-css.mjs for why `@layer` was
   tried as the general fix and rejected. */
.contact-copy h2 .i { color: #000; }

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 5 (2026-09-24) — owner review of About · Spinal Decompression · Back
   Pain. Rulings R-14…R-18 (RULINGS-LEDGER.md), spec scratch/waves/2026-09-24-r5.
   Board tokens only. Every selector below is new to this build EXCEPT the one
   declared override (S0, the hero top padding, ruled by R-18).
   ═══════════════════════════════════════════════════════════════════════════ */

/* utility: visually hidden, still read (compare-chart row headers + caption) */
.r5-sr { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }

/* ── S0 · R-18: the breadcrumb sat FLUSH under the fixed header ─────────────
   ⛔ DECLARED OVERRIDE of a board value. The board's `.nav` pulls every hero up
   under itself (`margin-bottom: calc(-1 * var(--nav-h))`) and `.cond-hero` pads
   its top by clamp(2.6rem…4rem) only, so as soon as a hero is taller than its
   min-height (our heroes carry a sub-head, chips and the trust strip) the crumb
   lands at nav-bottom −5px at 1440 and −11px at 390. It was broken on the
   board too (+12px at 1440, −33px at 390). The top padding now CLEARS the nav
   (--nav-h is measured inline in BaseLayout) and then adds the gap. Pinned by
   check-computed-style's crumb-clearance probe: crumb top ≥ nav bottom + 24px
   on service, condition, hub, city and about, at 1440 and 390. */
.cond-hero { padding-top: calc(var(--nav-h, 76px) + clamp(1.75rem, 1.2rem + 1.6vw, 2.75rem)); }
.apg-hero .crumb { margin-bottom: clamp(1.1rem, .9rem + .8vw, 1.5rem); }

/* ── shared H2 scale for the decision modules (compare / candidacy / cost /
      local access), which carry a bare <h2> under a .vb-eyebrow ─────────────── */
.cmp h2, .cand h2, .cost h2, .la h2 {
  font-family: var(--f-d); font-weight: 400; color: var(--ink);
  font-size: clamp(1.9rem, 1.5rem + 1.6vw, 2.7rem); line-height: 1.1; letter-spacing: -.016em;
  margin-top: 1.1rem; max-width: 30ch;
}

/* ── V1 · "Understanding the therapy" cards ─────────────────────────────────
   The harvested WhatIsBlocks ships scoped defaults from another client (an
   orange #b4491d counter disc, a teal #0e2c30 callout, green/orange list
   washes). Restated here in board tokens, id-scoped so they outrank the
   component's [data-astro-cid] selectors on the three routes that use it. */
:is(#understanding, #what-we-do) .w5__h {
  font-family: var(--f-b); font-size: .66rem; font-weight: 700; letter-spacing: .24em;
  text-transform: uppercase; color: var(--clay); margin: 0 0 1rem; line-height: 1.4;
}
:is(#understanding, #what-we-do) .w5 { margin-top: clamp(2rem, 3.4vw, 2.8rem); }
:is(#understanding, #what-we-do) .w5__steps { gap: clamp(1rem, 1.6vw, 1.4rem); align-items: stretch; }
:is(#understanding, #what-we-do) .w5__step {
  position: relative; display: flex; flex-direction: column; height: 100%;
  padding: clamp(3.6rem, 3.2rem + 1vw, 4.2rem) clamp(1.4rem, 1.1rem + 1vw, 2rem) clamp(1.5rem, 1.2rem + 1vw, 2rem);
  background: var(--white); border: 1px solid var(--ink-09); border-radius: var(--r-l); box-shadow: var(--sh-1);
  transition: transform .35s var(--ease), box-shadow .35s var(--ease);
}
:is(#understanding, #what-we-do) .w5__step:hover { transform: translateY(-4px); box-shadow: var(--sh-2); }
:is(#understanding, #what-we-do) .w5__step::before {
  content: counter(w5, decimal-leading-zero); left: clamp(1.4rem, 1.1rem + 1vw, 2rem); top: clamp(1.3rem, 1.1rem + .6vw, 1.6rem);
  width: auto; height: auto; display: block; background: none; border-radius: 0;
  font-family: var(--f-d); font-style: italic; font-weight: 400; font-size: 1.6rem; line-height: 1; color: var(--clay);
}
:is(#understanding, #what-we-do) .w5__step::after {
  content: ""; position: absolute; left: clamp(4.2rem, 3.8rem + 1vw, 4.8rem); top: clamp(1.75rem, 1.55rem + .6vw, 2.05rem);
  width: 32px; height: 1px; background: var(--beige);
}
:is(#understanding, #what-we-do) .w5__steph { font-family: var(--f-d); font-weight: 500; font-size: clamp(1.1rem, 1rem + .4vw, 1.25rem); line-height: 1.25; color: var(--ink); margin: 0 0 .7rem; }
:is(#understanding, #what-we-do) .w5__stepb { font-size: .94rem; line-height: 1.75; color: var(--ink-72); font-weight: 300; }
:is(#understanding, #what-we-do) .w5__lists { gap: clamp(1rem, 1.6vw, 1.4rem); margin-top: clamp(1.4rem, 2.4vw, 2rem); }
:is(#understanding, #what-we-do) .w5__list {
  padding: clamp(1.4rem, 1.1rem + 1vw, 2rem); border-radius: var(--r-l); border: 1px solid var(--ink-09);
  background: var(--white); box-shadow: var(--sh-1);
}
:is(#understanding, #what-we-do) .w5__list--no { background: var(--white); }
:is(#understanding, #what-we-do) .w5__list ul { list-style: none; padding: 0; gap: 0; }
:is(#understanding, #what-we-do) .w5__list li {
  position: relative; padding: .7rem 0 .7rem 1.9rem; border-bottom: 1px solid var(--ink-09);
  font-size: .94rem; line-height: 1.55; color: var(--ink-90);
}
:is(#understanding, #what-we-do) .w5__list li:last-child { border-bottom: 0; padding-bottom: 0; }
:is(#understanding, #what-we-do) .w5__list--yes li::before {
  content: ""; position: absolute; left: 0; top: .82rem; width: 18px; height: 18px; border-radius: 6px;
  background: var(--beige-lo) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23975537' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6L20.4 8.2 19 6.8z'/%3E%3C/svg%3E") center / 13px no-repeat;
}
:is(#understanding, #what-we-do) .w5__list--no li::before {
  content: ""; position: absolute; left: 3px; top: 1.3rem; width: 12px; height: 2px; border-radius: 2px; background: var(--ink-40);
}
:is(#understanding, #what-we-do) .w5__note {
  border-left: 2px solid var(--clay); background: var(--white); border-radius: 0 var(--r-m) var(--r-m) 0;
  padding: 1.1rem 1.4rem; margin-top: clamp(1.4rem, 2.4vw, 2rem);
}
:is(#understanding, #what-we-do) .w5__notelabel { color: var(--clay); letter-spacing: .24em; font-size: .62rem; }
:is(#understanding, #what-we-do) .w5__notep { color: var(--ink-90); line-height: 1.7; }
:is(#understanding, #what-we-do) .w5__callout { background: var(--black); border-radius: var(--r-l); padding: 1.3rem 1.5rem; }
:is(#understanding, #what-we-do) .w5__calloutp { color: rgba(255, 255, 255, .88); line-height: 1.7; }

/* ── V2 · "Conditions we address": bigger cards, faded person photograph under
      a warm scrim, a self-identify line (the board's .has-bg card pattern) ── */
.svc-cond-grid--r5 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); gap: clamp(1.1rem, 2vw, 1.6rem); }
@media (min-width: 720px) { .svc-cond-grid--r5:has(> :nth-child(4)) { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.svc-cond-grid--r5 .svc-cond-card { min-height: clamp(16rem, 22vw, 20rem); padding: clamp(1.8rem, 1.4rem + 1.6vw, 2.6rem); }
.svc-cond-grid--r5 .cond-card-bg.has-art { background-position: 62% 28%; }
/* R-31 (2026-09-26): the warm (251,245,241) wash + .24 opacity are retired; the
   art now takes the shared .art-wash recipe (end of file). */
.svc-cond-grid--r5 .svc-cond-card h3 { font-size: clamp(1.4rem, 1.15rem + .9vw, 1.8rem); margin-top: 0; }
.svc-cond-self { margin-top: .2rem; max-width: 34ch; font-family: var(--f-d); font-style: italic; }
.svc-cond-grid--r5 .svc-cond-card p.svc-cond-self { color: var(--ink-90); font-weight: 400; font-size: clamp(1.02rem, .96rem + .25vw, 1.14rem); line-height: 1.55; }

/* ── V3 / C4 · options compared: a comparison CHART, still a <table> ──────── */
.cmp-hint { display: flex; align-items: center; gap: .5rem; margin: 0 0 .9rem; font-size: .66rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--ink-62); }
.cmp-hint svg { width: 14px; height: 14px; }
.cmp-rail {
  overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
  padding: .5rem 0 1.3rem; scrollbar-width: thin; scrollbar-color: var(--ink-16) transparent;
}
.cmp-rail:focus-visible { outline: 2px solid var(--clay); outline-offset: 4px; border-radius: var(--r-l); }
.cmp-rail::-webkit-scrollbar { height: 8px; }
.cmp-rail::-webkit-scrollbar-thumb { background: var(--ink-16); border-radius: 99px; }
.cmp-table { border-collapse: separate; border-spacing: clamp(.7rem, 1.2vw, 1rem) 0; table-layout: fixed; width: max-content; margin-inline: calc(-1 * clamp(.7rem, 1.2vw, 1rem)); }
.cmp-corner, .cmp-rowh { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.cmp-h, .cmp-c {
  width: clamp(15.5rem, 70vw, 17.5rem); text-align: left; vertical-align: top; background: var(--white);
  border-left: 1px solid var(--ink-09); border-right: 1px solid var(--ink-09); scroll-snap-align: start;
}
.cmp-h {
  border-top: 1px solid var(--ink-09); border-radius: var(--r-l) var(--r-l) 0 0; padding: 1.5rem 1.35rem 1rem;
  font-family: var(--f-d); font-weight: 500; font-size: 1.2rem; line-height: 1.2; color: var(--ink); vertical-align: bottom;
}
.cmp-name { display: block; }
.cmp-tag {
  display: inline-block; margin-bottom: .7rem; padding: .32rem .7rem; border-radius: var(--r-pill);
  background: var(--beige); color: var(--ink); font-family: var(--f-b); font-size: .6rem; font-weight: 700;
  letter-spacing: .18em; text-transform: uppercase; line-height: 1.3;
}
.cmp-c { padding: .9rem 1.35rem; font-size: .92rem; line-height: 1.6; color: var(--ink-72); box-shadow: inset 0 1px 0 var(--ink-09); }
.cmp-c::before { content: attr(data-label); display: block; margin-bottom: .35rem; font-family: var(--f-b); font-size: .6rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--clay); }
.cmp-last .cmp-c { border-bottom: 1px solid var(--ink-09); border-radius: 0 0 var(--r-l) var(--r-l); padding-bottom: 1.5rem; }
.cmp-h.is-feat, .cmp-c.is-feat { background: var(--ink); border-color: var(--ink); }
.cmp-h.is-feat { color: var(--white); }
.cmp-c.is-feat { color: rgba(255, 255, 255, .84); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12); }
.cmp-c.is-feat::before { color: var(--beige); }
.cmp-mark { display: inline-flex; align-items: center; gap: .55rem; font-size: .88rem; font-weight: 600; line-height: 1.3; }
.cmp-mark svg { width: 1.45rem; height: 1.45rem; padding: .22rem; border-radius: 50%; flex: none; }
.cmp-mark.is-yes { color: var(--ink); }
.cmp-mark.is-yes svg { background: var(--beige-lo); color: var(--clay); }
.cmp-mark.is-no { color: var(--ink-72); font-weight: 500; }
.cmp-mark.is-no svg { background: var(--bg); color: var(--ink-58); }
.is-feat .cmp-mark.is-yes { color: var(--white); }
.is-feat .cmp-mark.is-yes svg { background: var(--beige); color: var(--ink); }
.cmp .tbl-closer { margin-top: clamp(1rem, 2vw, 1.6rem); }
.cmp .tbl-closer p { color: var(--ink-72); font-weight: 300; line-height: 1.8; }
.cmp .tbl-closer p + p { margin-top: .9rem; }

.cmp-tag--rev { background: var(--beige-lo); color: var(--ink); }
.cmp-h.is-rev { box-shadow: inset 0 3px 0 var(--clay); }
.cmp-c.is-rev { background: #fffdfc; }
.cmp-rail.is-scrollable:not(.is-end) { -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 72px), transparent); mask-image: linear-gradient(90deg, #000 calc(100% - 72px), transparent); }
@media (min-width: 860px) { :is(#understanding, #what-we-do) .w5__lists { grid-template-columns: repeat(2, minmax(0, 1fr)); } }


/* ── V4 · candidacy: an obvious self-check ─────────────────────────────────── */
.cand { background: var(--white); }
.cand-wrap { display: grid; gap: clamp(1.4rem, 3vw, 2.6rem); grid-template-columns: minmax(0, 1fr); margin-top: clamp(1.4rem, 2.6vw, 2.2rem); align-items: start; }
@media (min-width: 960px) { .cand-wrap { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); } }
.cand-check { background: var(--bg); border: 1px solid var(--ink-09); border-radius: var(--r-l); padding: clamp(1.3rem, 1rem + 1.6vw, 2.4rem); }
.cand-instr { display: flex; align-items: center; gap: .75rem; margin: 0 0 1.2rem; font-size: .98rem; font-weight: 600; color: var(--ink); line-height: 1.4; }
.cand-instr-ic { width: 36px; height: 36px; flex: none; border-radius: var(--r-s); background: var(--beige-lo); color: var(--clay); display: inline-flex; align-items: center; justify-content: center; }
.cand-instr-ic svg { width: 19px; height: 19px; }
.cand-chips { list-style: none; margin: 0; padding: 0; display: grid; gap: .7rem; grid-template-columns: repeat(auto-fill, minmax(min(100%, 16.5rem), 1fr)); }
.cand-chips li { display: flex; }
.cand-chip {
  width: 100%; display: flex; align-items: flex-start; gap: .85rem; text-align: left; padding: 1rem 1.1rem;
  border-radius: 14px; background: var(--white); border: 1px solid var(--ink-16); color: var(--ink);
  font-size: .95rem; line-height: 1.45; font-weight: 500;
  transition: background-color .3s var(--ease), border-color .3s var(--ease), color .3s var(--ease), transform .3s var(--ease);
}
.cand-chip:hover { border-color: var(--clay); transform: translateY(-2px); }
.cand-chip:focus-visible { outline: 2px solid var(--clay); outline-offset: 2px; }
.cand-box { width: 22px; height: 22px; flex: none; margin-top: .02rem; border-radius: 6px; border: 1.5px solid var(--ink-40); display: inline-flex; align-items: center; justify-content: center; transition: background-color .3s var(--ease), border-color .3s var(--ease); }
.cand-box svg { width: 15px; height: 15px; opacity: 0; transform: scale(.5); transition: opacity .25s var(--ease), transform .3s var(--eout); }
.cand-txt { flex: 1; }
.cand-chip[aria-pressed="true"] { background: var(--ink); border-color: var(--ink); color: var(--white); }
.cand-chip[aria-pressed="true"] .cand-box { background: var(--beige); border-color: var(--beige); color: var(--ink); }
.cand-chip[aria-pressed="true"] .cand-box svg { opacity: 1; transform: none; }
.cand-meter { display: flex; align-items: center; gap: 1rem; margin-top: 1.5rem; }
.cand-bar { flex: 1; height: 8px; border-radius: 99px; background: var(--gray); overflow: hidden; }
.cand-fill { display: block; height: 100%; width: calc(var(--cand-p, 0) * 100%); border-radius: inherit; background: linear-gradient(90deg, var(--beige), var(--clay)); transition: width .55s var(--eout); }
.cand-count { margin: 0; white-space: nowrap; font-size: .8rem; font-weight: 600; letter-spacing: .06em; color: var(--ink-72); }
.cand-n { font-variant-numeric: tabular-nums; }
.cand-result { margin-top: 1.4rem; padding-top: 1.4rem; border-top: 1px solid var(--ink-09); }
.cand-verdict { margin: 0; font-family: var(--f-d); font-size: clamp(1.3rem, 1.1rem + .8vw, 1.75rem); line-height: 1.2; color: var(--ink); transition: color .4s var(--ease); }
.cand-check.is-some .cand-verdict { color: var(--ink); }
.cand-check.is-ready .cand-verdict { color: var(--clay); }
.cand-check.is-live .cand-instr { color: var(--ink); }
.cand-note { margin: .6rem 0 1.2rem; font-size: .88rem; line-height: 1.7; font-weight: 300; color: var(--ink-72); max-width: 60ch; }
.cand-check.is-ready .cand-result .btn { box-shadow: 0 0 0 5px rgba(217, 163, 142, .35); }
.cand-out { background: var(--white); border: 1px solid var(--ink-09); border-radius: var(--r-l); padding: clamp(1.3rem, 1rem + 1.4vw, 2.2rem); box-shadow: var(--sh-1); }
.cand-out h3 { margin: 0 0 .8rem; font-size: 1.25rem; font-weight: 500; line-height: 1.25; }
.cand-out-list { list-style: none; margin: 0; padding: 0; }
.cand-out-list li { display: flex; align-items: flex-start; gap: .85rem; padding: .75rem 0; border-bottom: 1px solid var(--ink-09); font-size: .93rem; line-height: 1.5; color: var(--ink-90); }
.cand-dash { width: 14px; height: 2px; flex: none; margin-top: .68em; border-radius: 2px; background: var(--clay); }
.cand-out .cand-seal { margin-top: 1.2rem; }
.cand-out .cand-seal p { font-size: .92rem; line-height: 1.7; font-weight: 300; color: var(--ink-72); }
.cand-out .cand-refer { font-size: .88rem; }

/* ── V5 · cost: factor tiles with the duotone icons, the consultation raised ─ */
.cost-tiles { list-style: none; margin: clamp(1.6rem, 3vw, 2.4rem) 0 0; padding: 0; display: grid; gap: clamp(1rem, 1.8vw, 1.4rem); grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); }
@media (min-width: 1000px) {
  .cost-tiles[data-n="5"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .cost-tiles[data-n="5"] .cost-tile--offer { grid-column: span 2; }
  .cost-tiles[data-n="4"] { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
.cost-tile { display: flex; flex-direction: column; gap: .55rem; padding: clamp(1.4rem, 1.1rem + 1vw, 1.9rem); background: var(--white); border: 1px solid var(--ink-09); border-radius: var(--r-l); box-shadow: var(--sh-1); }
.cost-tile .ic-tile { margin-bottom: .5rem; }
.cost-tile-h { margin: 0; font-family: var(--f-d); font-weight: 500; font-size: 1.22rem; line-height: 1.25; color: var(--ink); }
.cost-tile-p { margin: 0; font-size: .93rem; line-height: 1.7; font-weight: 300; color: var(--ink-72); }
.cost-tile--offer { background: var(--ink); border-color: var(--ink); color: var(--white); }
.cost-tile--offer .ic-tile { background: rgba(255, 255, 255, .1); }
.cost-tile--offer .cost-tile-h { color: var(--white); font-size: clamp(1.35rem, 1.2rem + .6vw, 1.6rem); }
.cost-tile-body p { font-size: .95rem; line-height: 1.75; font-weight: 300; color: rgba(255, 255, 255, .84); max-width: 58ch; }
.cost-tile-body p + p { margin-top: .7rem; }
.cost-tile-cta { margin-top: auto; padding-top: .9rem; align-self: flex-start; display: inline-flex; align-items: center; gap: .5rem; font-size: .72rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--beige); }
.cost-tile-cta svg { width: 1rem; height: 1rem; transition: transform .35s var(--ease); }
.cost-tile-cta:hover svg { transform: translateX(4px); }
.cost-ins { margin-top: clamp(1.8rem, 3vw, 2.6rem); max-width: 68ch; }
.cost-ins h3 { margin: 0 0 .6rem; font-size: 1.22rem; font-weight: 500; line-height: 1.25; }
.cost-ins p { color: var(--ink-72); font-weight: 300; line-height: 1.8; }
.cost-ins p + p { margin-top: .8rem; }

/* ── V7 · the service markdown body (#detail) rendered at browser defaults ─ */
.svc-detail .svc-article { max-width: var(--maxw); }
.svc-detail .svc-article > * { max-width: 50rem; }
.svc-detail .vb-eyebrow { margin-bottom: 1.4rem; }
.svc-detail .svc-article h2 { font-family: var(--f-d); font-weight: 500; color: var(--ink); font-size: clamp(1.5rem, 1.25rem + 1vw, 2rem); line-height: 1.15; letter-spacing: -.01em; margin: clamp(2.2rem, 3.4vw, 2.9rem) 0 .9rem; }
.svc-detail .svc-article h2::before { content: ""; display: block; width: 32px; height: 1px; margin-bottom: 1.1rem; background: var(--beige); }
.svc-detail .svc-article h2:first-child, .svc-detail .vb-eyebrow + h2 { margin-top: 0; }
.svc-detail .svc-article p { color: var(--ink-72); font-weight: 300; line-height: 1.85; max-width: 64ch; }
.svc-detail .svc-article p + p { margin-top: 1.1rem; }
.svc-detail .svc-article a { color: var(--clay); font-weight: 500; text-decoration: underline; text-underline-offset: 3px; }

/* ── V8 · local access: ProWellness duotone town windows, in Revive tokens ── */
.la { background: var(--white); }
.la-head { display: grid; gap: clamp(1.2rem, 3vw, 3rem); grid-template-columns: minmax(0, 1fr); align-items: end; margin-bottom: clamp(1.8rem, 3.4vw, 2.8rem); }
@media (min-width: 960px) { .la-head { grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); } }
.la-head .sec-lede { margin-bottom: 0; }
.la-body p { color: var(--ink-72); font-weight: 300; line-height: 1.85; max-width: 56ch; }
.la-body p + p { margin-top: .9rem; }
.la-grid { list-style: none; margin: 0; padding: 0; display: grid; gap: clamp(.8rem, 1.6vw, 1.3rem); grid-template-columns: repeat(2, minmax(0, 1fr)); }
.la-grid > li:last-child { grid-column: span 2; }
@media (min-width: 720px) { .la-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .la-grid > li:last-child { grid-column: span 3; } }
@media (min-width: 1100px) { .la-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .la-grid > li:last-child { grid-column: span 2; } }
.la-card { position: relative; isolation: isolate; overflow: hidden; display: flex; height: 100%; min-height: clamp(9.5rem, 16vw, 13rem); border-radius: var(--r-l); background: var(--ink); color: var(--white); }
.la-card--plain { background: var(--ink); }
.la-duo { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.la-duo img { width: 100%; height: 100%; object-fit: cover; filter: grayscale(1) contrast(1.04); transition: filter .7s var(--ease), transform .9s var(--ease); }
.la-duo::after { content: ""; position: absolute; inset: 0; background: linear-gradient(160deg, rgba(217, 163, 142, .95) 0%, rgba(151, 85, 55, .92) 48%, rgba(19, 19, 18, .95) 100%); mix-blend-mode: color; transition: opacity .7s var(--ease); }
.la-card:hover .la-duo img, .la-card:focus-visible .la-duo img { filter: grayscale(0) contrast(1); transform: scale(1.05); }
.la-card:hover .la-duo::after, .la-card:focus-visible .la-duo::after { opacity: .2; }
.la-card:focus-visible { outline: 2px solid var(--clay); outline-offset: 3px; }
.la-scrim { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(180deg, rgba(19, 19, 18, 0) 28%, rgba(19, 19, 18, .6) 62%, rgba(19, 19, 18, .92) 100%); }
.la-label { position: relative; z-index: 2; margin-top: auto; width: 100%; padding: 1rem 1.1rem 1.1rem; display: flex; flex-direction: column; gap: .3rem; }
.la-name { font-family: var(--f-d); font-size: clamp(1.1rem, 1rem + .45vw, 1.35rem); line-height: 1.2; color: var(--white); }
.la-go { display: inline-flex; align-items: center; gap: .4rem; font-size: .64rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--beige-lo); }
.la-go svg { width: .9rem; height: .9rem; flex: none; transition: transform .45s var(--ease); }
.la-card:hover .la-go svg { transform: translateX(4px); }
.la-also { margin-top: clamp(1.1rem, 2vw, 1.5rem); font-size: .9rem; line-height: 1.7; color: var(--ink-72); }
.la-also-k { margin-right: .6rem; font-size: .64rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--clay); }

/* ── C2 · condition treatment options: board treat-card, faded modality photo ─ */
.treat-row--r5 { grid-template-columns: minmax(0, 1fr); gap: clamp(.9rem, 1.6vw, 1.2rem); }
.treat-card--r5 { position: relative; isolation: isolate; height: auto; box-shadow: var(--sh-1); }
.treat-card-bg { position: absolute; inset: 0; z-index: -1; background-size: cover; background-position: 70% 45%; }
.treat-card--r5 .treat-body { padding: clamp(1.4rem, 1.1rem + 1.2vw, 2.1rem) clamp(1.4rem, 1.1rem + 1.4vw, 2.3rem); }
.treat-top { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1rem; }
.treat-card--r5 .treat-num { position: static; padding: 0; background: none; -webkit-backdrop-filter: none; backdrop-filter: none; font-family: var(--f-d); font-style: italic; font-weight: 400; font-size: 1.5rem; letter-spacing: 0; color: var(--clay); }
.treat-card--r5 h3 { font-size: clamp(1.2rem, 1.05rem + .6vw, 1.5rem); font-weight: 500; line-height: 1.2; }
.treat-prose p { max-width: 60ch; color: var(--ink-72); }
.treat-prose a { color: var(--clay); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }

/* ── C3 · figures inside long condition copy ─────────────────────────────── */
.cond-fig { margin: clamp(2.4rem, 4vw, 3.4rem) 0 0; }
.cond-fig img { width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; border-radius: var(--r-l); box-shadow: var(--sh-2); }
.cond-fig figcaption { margin-top: .9rem; display: flex; align-items: baseline; gap: .8rem; font-size: .88rem; line-height: 1.6; font-weight: 300; color: var(--ink-72); }
.cond-fig figcaption::before { content: ""; width: 28px; height: 1px; flex: none; transform: translateY(-.3em); background: var(--beige); }

/* ── A1 · About hours, payment and access (the board's .apg-area pattern) ── */
.hours-dl { margin: 0; border-top: 1px solid var(--line); }
.hours-row { display: flex; justify-content: space-between; gap: 1.2rem; padding: .85rem .4rem; border-bottom: 1px solid var(--line); }
.hours-row dt { font-size: .94rem; font-weight: 600; color: var(--ink); }
.hours-row dd { margin: 0; text-align: right; font-size: .94rem; font-weight: 300; color: var(--ink-72); }
.apg-area .cost-note { margin-top: 1.3rem; }
.access-community { margin-top: 1rem; }
.access-community p { color: var(--ink-72); font-weight: 300; line-height: 1.8; font-size: .95rem; }
.access-list { list-style: none; margin: .55rem 0 0; padding: 0; display: grid; gap: .4rem; }
.access-list li { display: flex; align-items: center; gap: .65rem; font-size: .9rem; line-height: 1.5; font-weight: 300; color: var(--ink-72); }
.access-list li svg { width: 14px; height: 14px; flex: none; color: var(--clay); }

/* ── About team band: the credentials wall, under the bios (canon EEAT) ──── */
.team-creds { margin-top: clamp(1.8rem, 3vw, 2.4rem); padding-top: clamp(1.4rem, 2.4vw, 1.9rem); border-top: 1px solid rgba(255, 255, 255, .16); }
.team-creds-h { margin: 0 0 .9rem; font-family: var(--f-b); font-size: .66rem; font-weight: 700; letter-spacing: .24em; text-transform: uppercase; color: var(--beige); line-height: 1.4; }
.team-creds-list { list-style: none; margin: 0; padding: 0; }
.team-creds-list li { display: flex; align-items: flex-start; gap: .8rem; padding: .6rem 0; border-bottom: 1px solid rgba(255, 255, 255, .1); font-size: .93rem; line-height: 1.5; font-weight: 300; color: rgba(255, 255, 255, .84); }
.team-creds-list li svg { width: 14px; height: 14px; flex: none; margin-top: .2rem; color: var(--beige); }
.apg-hero .about-capsule { color: var(--mist); }
.cand-result .btn { max-width: 100%; white-space: normal; text-align: center; }

/* ═══════════════════════════════════════════════════════════════════════════
   R6 (2026-09-25) — owner rulings R-21 + R-22. Home only.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── M2 · R-21: the #service-hub cards carry a FULL-COLOUR, light-opacity
   background image (one generated image per service, src/data/r6-images.json).
   The image sits UNDER the card copy inside the card's own stacking context
   (isolation) so the card's white stays the ground. It is masked out over the
   foot (mask) so the clay .hub-learn label always sits on white: AA is
   measured over the pixels, not assumed. Absolute + inset:0 = no box of its
   own, so CLS 0. ────────────────────────────────────────────────────────── */
.hub-card.has-r6bg { position: relative; isolation: isolate; }
.hub-card-bg { position: absolute; inset: 0; z-index: -1; overflow: hidden; pointer-events: none;
  /* measured from the FOOT in rem, not in %: the .hub-learn label always sits
     in the bottom ~4.5rem whatever the card height (sentinel cards are short),
     so the image is fully masked out there on every card. */
  -webkit-mask-image: linear-gradient(0deg, transparent 0, transparent 4.75rem, rgba(0,0,0,.45) 8rem, #000 100%);
          mask-image: linear-gradient(0deg, transparent 0, transparent 4.75rem, rgba(0,0,0,.45) 8rem, #000 100%); }
.hub-card-bg img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: .3;
  transition: transform 1.2s var(--eout), opacity .5s var(--ease); }
.hub-card.has-r6bg:hover .hub-card-bg img,
.hub-card.has-r6bg:focus-within .hub-card-bg img { transform: scale(1.045); opacity: .36; }

/* ── R7 · R-24 (2026-09-25): opacity raised .20 -> .30 (hover/focus .26 -> .36)
   by owner ruling; AA re-measured over the pixels at 1440 + 390, rest + hover.
   Every card in a panel is the SAME HEIGHT from 641px up: grid-auto-rows 1fr
   sizes every row to the tallest card (the board grid already stretches each
   card in its row, and .hub-learn already carries margin-top:auto, so the link
   sits on the card foot). At <=640 the board's single-column stack is kept as
   is: each card takes its own height. ───────────────────────────────────── */
@media (min-width: 641px) {
  #service-hub .hub-cards { grid-auto-rows: 1fr; }
}

/* ── M3 · R-22: "Four Treatments Patients Ask About Most" — the specimen grid.
   A component used NOWHERE else on the site. Asymmetric 12-col 2x2 (7|5 over
   5|7) so the row is always full at 1440; checkerboard washes (ink, beige-lo,
   bg, deep clay); the service image full-bleed at low opacity; a wash gradient
   that thickens under the copy (AA); a solid question chip (AA over any pixel);
   an italic Playfair index numeral; a stretched link so the whole panel is the
   touch target. Motion = board primitive 1 on .ask-cell (reveal, 4 staggered
   children) + transform/opacity hover on .ask-card; reduced motion = final
   state. ─────────────────────────────────────────────────────────────────── */
#elevated .ask-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: clamp(1rem, 1.6vw, 1.4rem); margin-top: clamp(2.2rem, 3.6vw, 3rem); }
.ask-cell { display: flex; min-width: 0; }
.ask-cell--1, .ask-cell--4 { grid-column: span 7; }
.ask-cell--2, .ask-cell--3 { grid-column: span 5; }
.ask-card { --wash: var(--ink); --fg: var(--white); --fg-2: rgba(255,255,255,.86); --chip-bg: var(--beige); --chip-fg: var(--ink); --num: var(--beige); --focus: var(--beige);
  position: relative; isolation: isolate; overflow: hidden; flex: 1; display: flex; flex-direction: column;
  min-height: clamp(23rem, 17rem + 12vw, 30rem); padding: clamp(1.5rem, 2.6vw, 2.5rem);
  background: var(--wash); color: var(--fg); border-radius: var(--r-l); box-shadow: var(--sh-1);
  transition: translate .45s var(--ease), box-shadow .45s var(--ease); }
.ask-card--1 { --wash: var(--ink); }
.ask-card--2 { --wash: var(--beige-lo); --fg: var(--ink); --fg-2: rgba(19,19,18,.78); --chip-bg: var(--ink); --chip-fg: var(--white); --num: var(--clay); --focus: var(--ink); }
.ask-card--3 { --wash: var(--bg); --fg: var(--ink); --fg-2: rgba(19,19,18,.74); --chip-bg: var(--ink); --chip-fg: var(--white); --num: var(--clay); --focus: var(--ink); }
.ask-card--4 { --wash: #4a2a1c; --num: var(--beige-lo); }
.ask-bg { position: absolute; inset: 0; z-index: -2; pointer-events: none; }
.ask-bg img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: .22;
  transition: transform 1.2s var(--eout), opacity .5s var(--ease); }
.ask-card::before { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--wash) 0%, transparent) 0%,
    color-mix(in srgb, var(--wash) 35%, transparent) 38%,
    color-mix(in srgb, var(--wash) 88%, transparent) 64%,
    var(--wash) 100%); }
.ask-num { position: absolute; top: clamp(.9rem, 1.6vw, 1.5rem); right: clamp(1.2rem, 2.2vw, 2.1rem);
  font-family: var(--f-d); font-style: italic; font-weight: 400; line-height: .9; letter-spacing: -.02em;
  font-size: clamp(3.6rem, 2.2rem + 4.2vw, 6.6rem); color: var(--num); pointer-events: none; }
.ask-q { align-self: flex-start; display: inline-block; max-width: calc(100% - 5.5rem);
  padding: .5rem 1rem .55rem; border-radius: var(--r-pill); background: var(--chip-bg); color: var(--chip-fg);
  font-family: var(--f-d); font-style: italic; font-weight: 400; font-size: clamp(.98rem, .92rem + .2vw, 1.08rem); line-height: 1.3; }
.ask-b { margin-top: auto; padding-top: clamp(4rem, 8vw, 7rem); max-width: 36rem; display: flex; flex-direction: column; gap: .8rem; }
.ask-t { margin: 0; font-family: var(--f-d); font-weight: 400; color: var(--fg); letter-spacing: -.012em;
  font-size: clamp(1.7rem, 1.3rem + 1.3vw, 2.4rem); line-height: 1.1; }
.ask-p p { margin: 0; font-family: var(--f-b); font-weight: 300; font-size: .95rem; line-height: 1.75; color: var(--fg-2); }
.ask-link { margin-top: .5rem; align-self: flex-start; display: inline-block; max-width: 34rem;
  font-family: var(--f-b); font-weight: 600; font-size: .7rem; letter-spacing: .2em; text-transform: uppercase; line-height: 1.5;
  color: var(--fg); text-decoration: none; }
.ask-link-t { background: linear-gradient(currentColor, currentColor) 0 100% / 0 1px no-repeat; padding-bottom: 2px;
  transition: background-size .45s var(--ease); }
.ask-link svg { display: inline-block; width: 1.1em; height: 1.1em; margin-left: .55rem; vertical-align: -.22em; transition: transform .45s var(--ease); }
/* the stretched link: the whole panel is the tap target (touch), one tab stop (keyboard) */
.ask-link::after { content: ""; position: absolute; inset: 0; z-index: 2; border-radius: inherit; }
.ask-link:focus-visible { outline: none; }
.ask-link:focus-visible::after { outline: 2px solid var(--focus); outline-offset: -6px; border-radius: calc(var(--r-l) - 4px); }
.ask-card:hover, .ask-card:focus-within { translate: 0 -4px; box-shadow: var(--sh-2); }
.ask-card:hover .ask-bg img, .ask-card:focus-within .ask-bg img { opacity: .34; transform: scale(1.045); }
.ask-card:hover .ask-link-t, .ask-card:focus-within .ask-link-t { background-size: 100% 1px; }
.ask-card:hover .ask-link svg, .ask-card:focus-within .ask-link svg { transform: translateX(5px); }
@media (max-width: 1024px) {
  .ask-cell--1, .ask-cell--2, .ask-cell--3, .ask-cell--4 { grid-column: span 6; }
}
@media (max-width: 720px) {
  #elevated .ask-grid { grid-template-columns: minmax(0, 1fr); }
  .ask-cell--1, .ask-cell--2, .ask-cell--3, .ask-cell--4 { grid-column: 1 / -1; }
  .ask-card { min-height: 21rem; }
  .ask-b { padding-top: 4.5rem; }
  .ask-link { letter-spacing: .14em; }
}
@media (prefers-reduced-motion: reduce) {
  .ask-card, .ask-bg img, .ask-link-t, .ask-link svg, .hub-card-bg img, .art-wash-bg { transition: none; }
  .ask-card:hover, .ask-card:focus-within { translate: none; }
  .ask-link-t { background-size: 100% 1px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   R-25 (2026-09-25) — HOME COVERFLOW: AUTO-ADVANCE + 15% LARGER CARDS.
   The card size itself is the inline --cf-card on .cf in HomeTemplate.astro
   (the board's clamp x1.15). The rotation is /scripts/cf-autoplay.js, a
   separate module: motion-home.js stays byte-identical to the board
   (check-board-css.mjs), and every auto step is a click on the board's own
   .cf-next, so it animates exactly like a manual arrow press.

   The pause/play toggle (WCAG 2.2.2) is the board's .c-btn at the gallery
   arrows' 34px size. It is ABSOLUTE, in the top-right corner of .cf above the
   stage's padding, so showing it from JS moves nothing (CLS 0), and it is
   `hidden` in the HTML: no JS or reduced motion = no rotation = no control.
   `.c-btn{display:flex}` would beat the UA `[hidden]` rule, hence the first line. */
.cf-toggle[hidden] { display: none; }
.cf { position: relative; }
.cf-toggle { position: absolute; top: 0; right: 0; z-index: 3; width: 34px; height: 34px;
  background: var(--white); }
.cf-toggle svg { width: 12px; height: 12px; }
.cf-toggle[data-state="playing"] [data-icon="play"],
.cf-toggle[data-state="paused"] [data-icon="pause"] { display: none; }

/* NO JS: the board's rail is absolutely positioned and placed only by script,
   so without it all three cards pile up at left:50%. Lay them out as a plain
   row that wraps, in colour, with the arrows (which would do nothing) removed.
   Every caption is already visible without JS (`.js .cf-cap` hides them). */
html:not(.js) .cf-track { height: auto; display: flex; flex-wrap: wrap; justify-content: center;
  gap: 1rem; transform-style: flat; }
html:not(.js) .cf-card { position: relative; left: auto; top: auto;
  width: min(var(--cf-card), 100%); flex: 0 1 var(--cf-card); }
html:not(.js) .cf-card img { filter: none; }
html:not(.js) .cf-prev, html:not(.js) .cf-next { display: none; }

/* NO JS (P5 cascade, 2026-09-26): the Home service-hub explorer (`home-entity-routing`)
   shows only its active panel (`.hub-panel{display:none}`) and the tabs switch by script.
   INVARIANTS:14 wants the entity routing server-rendered with no JS-hidden reveal, so
   without JS every panel renders, stacked. With JS nothing changes. */
html:not(.js) .hub-panel { display: block; }
html:not(.js) .hub-panel + .hub-panel { margin-top: 2.5rem; }

/* ═══════════════════════════════════════════════════════════════════════════
   R-26 (2026-09-25) — HOME: the copy under the "Why Choose Revive by MWS?"
   scroll-expand. The board's 1.02rem / 52rem block read small and adrift on
   the black band, so it is set as an editorial close to the heading above:
   a short beige hairline, the first paragraph as a Playfair lead, the second
   in Inter at the muted on-dark colour, both on a narrow measure, and less
   air below so it belongs to the section. Board tokens only (--f-d, --f-b,
   --beige, --white, --mist). Copy unchanged. Scoped to #scrollExpand; the pin
   and track (.se-track / .se-pin) are not touched.
   AA on #000: --white 21:1, --mist (rgba 255/.72 = #b8b8b8) 10.5:1. */
#scrollExpand .se-below { padding-top: clamp(1.75rem, 1.2rem + 2.2vw, 2.75rem);
  padding-bottom: clamp(3.5rem, 2.4rem + 3.6vw, 5.75rem); }
#scrollExpand .se-below-in::before { content: ""; display: block; width: 44px; height: 1px;
  margin: 0 auto clamp(1.6rem, 1.2rem + 1.4vw, 2.3rem); background: var(--beige); }
#scrollExpand .se-below-in p { max-width: 40ch; margin-inline: auto; }
#scrollExpand .se-below-in p:first-child { max-width: 36ch; font-family: var(--f-d); font-weight: 400;
  font-size: clamp(1.35rem, 2.2vw, 1.85rem); line-height: 1.5; letter-spacing: -.006em;
  color: var(--white); text-wrap: pretty; }
#scrollExpand .se-below-in p + p { margin-top: clamp(1.3rem, 1rem + 1vw, 1.8rem);
  font-family: var(--f-b); font-weight: 300; font-size: clamp(1.08rem, 1rem + .25vw, 1.18rem);
  line-height: 1.8; color: var(--mist); text-wrap: pretty; }
#scrollExpand .se-below-in .btn { margin-top: clamp(1.9rem, 1.5rem + 1.2vw, 2.5rem); }

/* ═══════════════════════════════════════════════════════════════════════════
   TASK-CLS (2026-09-25) — HOME "Why Choose Revive by MWS?" SCROLL-EXPAND,
   COMPOSITOR-ONLY. Same frames as the board, no layout per scroll frame.

   ⛔ WHY. The board scrub writes #seMedia width/height in px every frame, and
   Chrome scores each frame of that grow as a layout shift: Home CLS 0.1655 @
   1440x900 and 0.2228 @ 390x844 (the frozen board scores the same; >99.9% is
   #seMedia). /scripts/se-compositor.js now drives the effect (the built track
   is #seTrackGpu, so the board's block in motion-home.js — byte-identical, see
   check-board-css.mjs §3 — finds no #seTrack and stays idle). The box is laid
   out ONCE at the board's FINAL size, min(92vw,1180px) x min(82vh,760px), and
   is cut down per frame with clip-path: inset(... round 18px); the <video> is
   scale()d so its picture equals object-fit:cover in the board's W(p) x H(p).
   Both are paint/compositor properties: no box moves, so no shift is scored.
   Declared visual delta: the board's box-shadow (0 40px 90px -36px
   rgba(0,0,0,.65)) is clipped with the box — it is black on the #000 .se-bg,
   i.e. it paints no visible pixel on the board either.
   `.se-gpu` is added by the script only, so with JS off or under reduced
   motion (the board's own `.no-motion` branch) none of this applies. */
.se-track.se-gpu .se-media { width: min(92vw, 1180px); height: min(82vh, 760px); }
.se-track.se-gpu .se-video { transform-origin: 50% 50%; will-change: transform; }

/* ═══════════════════════════════════════════════════════════════════════════
   FIX-BUILD (GATE 2 r1, 2026-09-25)

   D9 · WCAG 1.4.1. A link inside running text must be told apart from the
   text without colour alone. QA measured 232 in-paragraph links (109 of them
   the external authority links) with the parent's colour, no underline and the
   same weight. Board tokens only: a 1px beige underline 3px below the
   baseline, thickening to 2px clay on hover/focus. Scope = links inside a <p>
   in <main>; nav, buttons (.btn) and card links (not inside a <p>) keep the
   board's own styling. */
main p a:not(.btn) {
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-decoration-color: var(--beige);
  text-underline-offset: 3px;
  transition: text-decoration-color .25s var(--ease), text-decoration-thickness .25s var(--ease);
}
main p a:not(.btn):hover,
main p a:not(.btn):focus-visible {
  text-decoration-thickness: 2px;
  text-decoration-color: var(--clay);
}
.on-dark p a:not(.btn):hover, .on-dark p a:not(.btn):focus-visible { text-decoration-color: var(--beige-lo); }

/* M5 · long markdown bodies: an H2/H3 sat flush (0px) on the paragraph above
   on 47 pages. The board's own section-heading rhythm (the V7 #detail value
   clamp(2.2rem,3.4vw,2.9rem) for H2; two thirds of it for H3). */
:is(.svc-article, #detail) :is(p, ul, ol, blockquote) + h2 { margin-top: clamp(2.2rem, 3.4vw, 2.9rem); }
:is(.svc-article, #detail) :is(p, ul, ol, blockquote) + h3 { margin-top: clamp(1.5rem, 2.3vw, 1.95rem); }

/* M14 · the no-JS booking line is for no-JS only. BaseLayout sets html.js
   synchronously in <head>, so with JavaScript on it never paints. */
html.js .fhost-fallback { display: none; }

/* mapEmbed · /contact/ and /locations/: the GBP map, lazy, in a reserved box
   (no shift when the iframe arrives). */
.map-embed { margin-block: clamp(1.6rem, 2.6vw, 2.2rem); border-radius: var(--r-m); overflow: hidden;
  aspect-ratio: 16 / 10; background: var(--gray); max-width: 60rem; }
.map-embed iframe { display: block; width: 100%; height: 100%; border: 0; }
@media (max-width: 640px) { .map-embed { aspect-ratio: 4 / 5; } }

/* D1c footer links (About Us, All Treatments, All Conditions, Journal) join the
   legal links in the bottom row; the board's row does not wrap, so seven links
   overflowed 390px. Wrap it, keeping the board's gap as the column gap. */
.foot-bot .links { flex-wrap: wrap; row-gap: .6rem; }
/* M5 (city pages): "Neighborhoods we see patients from" sat flush on the
   drive-route line; the list/landmark sub-heads take the same H3 rhythm. */
#route .drive-route + h3, #route ul + h3 { margin-top: clamp(1.5rem, 2.3vw, 1.95rem); }

/* ═══════════════════════════════════════════════════════════════════════════
   BUILD-POLISH (2026-09-25) — POLISH-AUDIT.md B1–B24, rulings R-28 / R-29.
   Every card grid carries a faded topic image (≈ .22–.30) under a wash that
   keeps the copy AA; the canon-added blocks get the board's own rhythm.
   Board tokens only. Selectors are new to this build unless marked.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── B6 · the checklist tick was an EMPTY span (0x0): every item sat 21px
   behind a blank gutter. It is now the w5 "Who this care helps" tile: a 20px
   beige-lo square with the clay check. 45 lists. ─────────────────────────── */
.cond-checklist li .tick:empty {
  width: 20px; height: 20px; border-radius: 6px; flex: none;
  background: var(--beige-lo) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23975537' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6L20.4 8.2 19 6.8z'/%3E%3C/svg%3E") center / 13px no-repeat;
}
/* the board fills 4 rows per column, so a 4-item list sat in ONE column with
   the right half empty (sciatica cost). Rows = ceil(n/2) gives a true
   2-column flow at every length. Desktop only; the board's <=640 stack is kept. */
@media (min-width: 641px) { .cond-checklist[style*="--rows"] { grid-template-rows: repeat(var(--rows), auto); } }

/* ── B4 · common causes: 155 cards, each with its generated scene faded on
   the right (the images were composed with quiet space on the left), a white
   wash under the copy, an italic index, and the odd last card spanning the
   row instead of leaving a blank half. ─────────────────────────────────── */
.cause-panel.has-bg { position: relative; isolation: isolate; overflow: hidden; background: var(--white); }
.cause-bg { position: absolute; inset: 0; z-index: -1; pointer-events: none; background-size: cover; background-position: 78% 38%; }
.cause-num { display: block; margin-bottom: .9rem; font-family: var(--f-d); font-style: italic; font-weight: 400; font-size: 1.5rem; line-height: 1; color: var(--clay); }
.cause-panels { gap: clamp(1rem, 1.6vw, 1.3rem); }
@media (min-width: 860px) { .cause-panels > .cause-panel:last-child:nth-child(odd) { grid-column: 1 / -1; } }
.cause-panel p { color: var(--ink-72); }

/* ── B13 / B14 · evaluation + timeline rows in the board's vb-steps
   vocabulary: 01/02/03 in the .n column, hairline dividers. ─────────────── */
.eval-steps { margin-top: clamp(1.2rem, 2vw, 1.6rem); }
.eval-steps .eval-row { margin-top: 0; }
.vb-steps li > div > h3 { margin: 0 0 .45rem; }
#timeline .tl-window { margin: 0 0 .5rem; }

/* ── B1 · city #focus: the condition page's treat-card--r5, two to a row,
   an odd last card spans the row (no orphan); the second grid's sub-head
   gets the section rhythm instead of sitting flush on the first grid. ───── */
@media (min-width: 860px) { .treat-row--city > :last-child:nth-child(odd):not(:first-child) { grid-column: 1 / -1; } }
.treat-row--city .treat-card-bg { background-position: 70% 35%; }
/* (R-31, 2026-09-26: the BUILD-POLISH whole-card white wash is retired; AA over
   the art is now held by the shared .art-wash recipe + its text scrims.) */
.treat-row--city .treat-card--r5 .treat-body { padding: clamp(1.5rem, 1.2rem + 1.2vw, 2.1rem) clamp(1.5rem, 1.2rem + 1.4vw, 2.3rem); }
.focus-sub { margin-top: clamp(2.4rem, 4vw, 3rem); }
#focus h2, #treat h2, .svc-h2-left, .svc-h2-center { text-wrap: balance; }

/* ── B12 · city: the town window after the drive section (R5 duotone
   pattern, as a figure) and the landmark list as hairline rows. ────────── */
.city-fig .la-duo.city-duo { position: relative; inset: auto; display: block; border-radius: var(--r-l); overflow: hidden; box-shadow: var(--sh-2); }
.city-fig .la-duo img { aspect-ratio: 21 / 9; border-radius: 0; box-shadow: none; }
.city-fig:hover .la-duo img { filter: grayscale(0) contrast(1); }
.city-fig:hover .la-duo::after { opacity: .2; }
.landmark-list { margin-top: .4rem; border-top: 1px solid var(--ink-09); }
.landmark-list li { display: flex; align-items: flex-start; gap: .85rem; margin: 0; padding: .85rem 0; border-bottom: 1px solid var(--ink-09); }
.lm-t { flex: 1; }
.lm-t strong { display: block; margin-bottom: .15rem; font-family: var(--f-d); font-weight: 500; font-size: 1.08rem; line-height: 1.3; color: var(--ink); }
.lm-note { font-size: .95rem; font-weight: 300; line-height: 1.65; color: var(--ink-72); }

/* ── B2 · service "Conditions we address": 3 columns from 9 cards up. ───── */
@media (min-width: 1100px) { .svc-cond-grid--r5:has(> :nth-child(9)) { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* ── B7 / B8 · hub treatment cards and the /services/ hub cards: the same
   faded-art card (.cond-card-bg.has-art at .24 under a warm wash). ──────── */
.svc-cond-grid--hub, .svc-cond-grid--hubs { grid-template-columns: minmax(0, 1fr); gap: clamp(1.1rem, 2vw, 1.6rem); }
@media (min-width: 720px) { .svc-cond-grid--hub { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .svc-cond-grid--hub { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 900px) { .svc-cond-grid--hubs { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
:is(.svc-cond-grid--hub, .svc-cond-grid--hubs) .svc-cond-card { padding: clamp(1.6rem, 1.3rem + 1.2vw, 2.3rem); }
:is(.svc-cond-grid--hub, .svc-cond-grid--hubs) .cond-card-bg.has-art { background-position: 60% 40%; }
/* no orphan: 7 treatments = 3 + 3 + one full-width card; 4 = 3 + 1 wide */
@media (min-width: 720px) and (max-width: 1099px) { .svc-cond-grid--hub > :last-child:nth-child(odd) { grid-column: 1 / -1; } }
@media (min-width: 1100px) { .svc-cond-grid--hub > :last-child:nth-child(3n+1) { grid-column: 1 / -1; } }
.svc-cond-grid--hub .hub-svc-h { margin: 0 0 .6em; font-size: clamp(1.25rem, 1.1rem + .5vw, 1.5rem); line-height: 1.2; }
.svc-cond-grid--hub .svc-cond-card p + p { margin-top: .8rem; }
.svc-h2-left + .svc-lede { margin-bottom: clamp(1.6rem, 2.6vw, 2rem); }
.svc-h2-left + .region-groups, .svc-lede + .region-groups, .svc-h2-left + .svc-cond-grid { margin-top: clamp(1.6rem, 2.6vw, 2rem); }
.svc-cond-grid--hubs .svc-cond-card h3 { font-size: clamp(1.35rem, 1.15rem + .7vw, 1.7rem); margin: 0 0 .7rem; }
.hub-svc-list { margin: 1.2rem 0 1rem; border-top: 1px solid var(--ink-09); }
.hub-svc-list li { margin: 0; border-bottom: 1px solid var(--ink-09); }
.hub-svc-list a { display: block; padding: .62rem 0; font-size: .93rem; font-weight: 500; color: var(--ink); text-decoration: none; transition: color .3s var(--ease), padding-left .3s var(--ease); }
.hub-svc-list a:hover { color: var(--clay); padding-left: .35rem; }

/* ── B15 · hub "What the … Does" at section H2 scale. ─────────────────────── */
#what-we-do .svc-h2-wwd { font-family: var(--f-d); font-size: clamp(1.9rem, 1.5rem + 1.9vw, 2.6rem); line-height: 1.1; }

/* ── B16 · body-region groups as cards, faded art from each group's first
   condition (hub #conditions, /conditions/ #groups). ────────────────────── */
.region-groups--cards { grid-template-columns: repeat(auto-fill, minmax(min(100%, 16.5rem), 1fr)); gap: clamp(.9rem, 1.6vw, 1.2rem); }
.region-groups--cards .region-group { position: relative; isolation: isolate; overflow: hidden; padding: clamp(1.3rem, 1.1rem + .8vw, 1.7rem);
  background: var(--white); border: 1px solid var(--ink-09); border-radius: var(--r-l); box-shadow: var(--sh-1);
  transition: transform .35s var(--ease), box-shadow .35s var(--ease); }
.region-groups--cards .region-group:hover { transform: translateY(-3px); box-shadow: var(--sh-2); }
.region-bg { position: absolute; inset: 0; z-index: -1; pointer-events: none; background-size: cover; }
.region-groups--cards .region-group h3 { margin: 0 0 .8rem; font-family: var(--f-b); font-size: .66rem; font-weight: 700; letter-spacing: .22em; text-transform: uppercase; color: var(--clay); line-height: 1.4; }
.region-groups--cards .region-group li { margin: 0; border-top: 1px solid var(--ink-09); }
.region-groups--cards .region-group li a { display: block; padding: .5rem 0; font-size: .95rem; font-weight: 500; line-height: 1.35; color: var(--ink); text-decoration: none; transition: color .3s var(--ease); }
.region-groups--cards .region-group li a:hover { color: var(--clay); }

/* ── B5 · /locations/ #area-detail: pills, directions beside sorted drive
   times, the city pages as town windows, section rhythm on every h3/p. ─── */
.area-chips { margin-top: clamp(1.2rem, 2vw, 1.6rem); }
.area-chips li { background: var(--white); }
.area-cols { display: grid; gap: clamp(1.8rem, 3vw, 3rem); margin-top: clamp(2rem, 3.4vw, 2.8rem); align-items: start; }
@media (min-width: 900px) { .area-cols { grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); } }
#area-detail h3 { margin: 0 0 .9rem; font-family: var(--f-d); font-weight: 500; font-size: clamp(1.25rem, 1.1rem + .5vw, 1.5rem); line-height: 1.2; color: var(--ink); }
.area-dir p { color: var(--ink-72); font-weight: 300; line-height: 1.85; max-width: 60ch; }
.area-dir p + p { margin-top: 1rem; }
.area-drive { min-width: 0; }
.drive-list { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .7rem; }
.drive-list li { display: flex; flex-direction: column; gap: .25rem; margin: 0; padding: .95rem 1.1rem; background: var(--white); border: 1px solid var(--ink-09); border-radius: var(--r-m); box-shadow: var(--sh-1); }
.drive-from { font-size: .64rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--clay); line-height: 1.4; }
.drive-min { font-size: .88rem; font-weight: 300; color: var(--ink-72); line-height: 1.3; }
.drive-num { margin: 0 .12em; font-family: var(--f-d); font-weight: 400; font-size: 1.85rem; line-height: 1; color: var(--ink); }
#area-detail .area-cities-h { margin-top: clamp(2.4rem, 4vw, 3.2rem); }
.city-windows { margin-top: 1.2rem; }
@media (min-width: 720px) { .city-windows { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.la-grid.city-windows > li:last-child { grid-column: auto; }
.city-windows .la-go { text-transform: none; letter-spacing: .02em; font-size: .8rem; font-weight: 500; line-height: 1.4; }

/* ── B9 · IndexTemplate #intro / #detail: the V7 article rhythm, a 68ch
   measure, on the container edge; the authority line closes the band. ─── */
.idx-article { max-width: 68ch; }
.idx-article p { color: var(--ink-72); font-weight: 300; line-height: 1.85; }
.idx-article > * + * { margin-top: 1.1rem; }
.idx-article h2 { margin: clamp(2.2rem, 3.4vw, 2.9rem) 0 .9rem; font-family: var(--f-d); font-weight: 500; color: var(--ink);
  font-size: clamp(1.5rem, 1.25rem + 1vw, 2rem); line-height: 1.15; letter-spacing: -.01em; }
.idx-article h2::before { content: ""; display: block; width: 32px; height: 1px; margin-bottom: 1.1rem; background: var(--beige); }
.idx-article h2:first-child { margin-top: 0; }
.idx-article h3 { margin: 1.8rem 0 .6rem; font-family: var(--f-d); font-weight: 500; font-size: 1.28rem; line-height: 1.25; color: var(--ink); }
.idx-article ul, .idx-article ol { padding-left: 1.2rem; color: var(--ink-72); font-weight: 300; line-height: 1.8; }
.idx-article li + li { margin-top: .4rem; }
.idx-article .authority-link { margin-top: 1.8rem; padding-top: 1.2rem; border-top: 1px solid var(--ink-09); }
.idx-prose + .idx-prose { padding-top: 0; }
/* /contact/: with the second map gone (B20) the "What happens after you send
   the form" H3 met the parking line directly; the section rhythm restored. */
#contact-detail p + p { margin-top: 1rem; }
#contact-detail :is(p, .parking-note) + h3 { margin-top: clamp(1.8rem, 3vw, 2.4rem); }

/* ── B17 · the "What is" block: steps, lists, note and callout share ONE
   right edge (the board's .svc-center shrank each to its content). ─────── */
:is(#understanding, #what-we-do) :is(.w5, .w5__lists, .w5__note, .w5__callout) { align-self: stretch; width: 100%; box-sizing: border-box; }

/* ── B21 · mobile: a grid of more than 6 cards becomes a horizontal snap
   rail with a count, like the compare chart's swipe affordance. ────────── */
.snap-hint { display: none; align-items: center; gap: .5rem; margin: .9rem 0 0; font-size: .66rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--ink-62); }
.snap-hint svg { width: 14px; height: 14px; }
.snap-n { font-variant-numeric: tabular-nums; color: var(--ink); }
@media (max-width: 640px) {
  .svc-cond-grid[data-snap] { display: grid; grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: 86%;
    gap: .9rem; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
    padding: .2rem .1rem 1rem; scrollbar-width: thin; scrollbar-color: var(--ink-16) transparent; }
  .svc-cond-grid[data-snap] > * { scroll-snap-align: start; }
  html.js .snap-hint { display: flex; }
}

/* ── B22 · About: air under the H1; a one-line bio as a compact card. ──── */
.apg-hero h1 + .about-capsule { margin-top: clamp(1.1rem, 1.6vw, 1.5rem); }
.team-member--compact { margin-top: clamp(1.6rem, 2.6vw, 2.2rem); padding: clamp(1.1rem, 1rem + .6vw, 1.5rem) clamp(1.2rem, 1rem + .8vw, 1.7rem);
  border: 1px solid rgba(255, 255, 255, .14); border-radius: var(--r-l); background: rgba(255, 255, 255, .04); }

/* ── B23 · 404 on the board's dark hero at a short height, chips below; the
   long CTA label gives way to the short one at <=400px. ────────────────── */
.nf-page .cond-hero { min-height: 0; padding-bottom: clamp(2.4rem, 4vw, 3.4rem); }
.nf .nf-links { margin: 1rem 0 1.6rem; }
.nf .nf-links li a { color: inherit; text-decoration: none; }
.lbl-s { display: none; }
@media (max-width: 400px) { .lbl-l { display: none; } .lbl-s { display: inline; } }

/* ── B19 · footer: one rule (the .foot-top border; the oversight line's own
   half-width rule is dropped), ONE column-head style (the board's .64rem
   beige; a head that is a link inherits it instead of the list-link face,
   and About's skin no longer enlarges it), times right-aligned, and legal
   separators drawn by CSS so no "|" is ever left at the end of a line. ─── */
.foot-oversight { border-top: 0; padding-top: 0; }
.footer .foot-col h4 { font-family: var(--f-b); font-size: .64rem; font-weight: 600; letter-spacing: .24em; line-height: 1.4;
  text-transform: uppercase; color: var(--beige); margin: 0 0 1.4rem; }
.footer .foot-col h4 a { display: inline; font: inherit; letter-spacing: inherit; text-transform: inherit; color: inherit; opacity: 1; }
.footer .foot-col h4 a:hover { color: var(--white); }
.foot-hours .fh-t { text-align: right; }
.foot-all .nw { white-space: nowrap; }
.foot-all a:hover .nw { transform: none; }
.foot-all a:hover .nw > span { transform: translateX(4px); }
@media (min-width: 1024px) {
  .foot-bot .links { flex-shrink: 0; max-width: 100%; column-gap: .9rem; }
  .foot-bot .links a + a::before { content: "|"; display: inline-block; margin-right: .9rem; color: rgba(255, 255, 255, .28); pointer-events: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   R11 (2026-09-26) — owner rulings R-30 + R-31.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── R-30 · service + condition heroes ~22% taller at 1440 and 390 ─────────
   The board hero is content-sized (min-height clamp(360px,42vw,500px) is
   below the content on every service/condition page), so the lift is added
   as equal padding above and below: the board composition (centred content,
   dark overlay, per-page object-position, R-18 crumb clearance) is kept and
   the photo simply shows more. Measured before: 665px @1440 on both pages;
   789 / 723px @390 (spinal-decompression / back-pain). +2 x 4.6rem @1440,
   +2 x 5.2rem below 900px. Hub, city, index and 404 heroes share
   InteriorHero but do NOT carry data-hero="tall": they are unchanged. ──────────────── */
[data-hero="tall"].cond-hero { --hero-lift: 5.2rem;
  padding-top: calc(var(--nav-h, 76px) + clamp(1.75rem, 1.2rem + 1.6vw, 2.75rem) + var(--hero-lift));
  padding-bottom: calc(clamp(2.6rem, 1.8rem + 3.6vw, 4rem) + var(--hero-lift)); }
@media (min-width: 900px) { [data-hero="tall"].cond-hero { --hero-lift: 4.6rem; } }

/* ── R-31 · ONE card-art recipe for every faded-image card grid ─────────────
   Measured off the Home hub-explorer card (#service-hub .hub-card.has-r6bg,
   the owner's reference): ground = white; the image full colour, no filter,
   at opacity .30 (.36 on hover/focus, scale 1.045); NO wash layer over it;
   a mask that clears the image out of the bottom 4.75rem (ramp to .45 at
   8rem, full above). The old per-grid warm/white ::after washes are deleted
   above. Applies to: condition causes, condition treatment options, service
   "conditions we address", hub treatments, hub + /conditions/ region groups,
   city focus, /services/ hub cards. Not applied: Home hub cards (the source),
   Home #elevated specimen grid (own design), Local Access / town windows
   (dark duotone photo windows with white type), cost tiles (icons, no art). */
:root {
  --art-wash-ground: var(--white);
  --art-wash-op: .3;
  --art-wash-op-hover: .36;
  --art-wash-mask: linear-gradient(0deg, transparent 0, transparent 4.75rem, rgba(0, 0, 0, .45) 8rem, #000 100%);
}
.art-wash { position: relative; isolation: isolate; overflow: hidden; background-color: var(--art-wash-ground); }
.art-wash .art-wash-bg { opacity: var(--art-wash-op); filter: none;
  -webkit-mask-image: var(--art-wash-mask); mask-image: var(--art-wash-mask);
  transition: transform 1.2s var(--eout), opacity .5s var(--ease); }
.art-wash:hover .art-wash-bg, .art-wash:focus-within .art-wash-bg { opacity: var(--art-wash-op-hover); transform: scale(1.045); }

/* ── R-33 · service "Conditions we address": 6 cards max, then the board's
   section link (the hub's .hub-all) to /conditions/, on the grid rhythm. ─── */
.svc-cond-all { margin-top: clamp(1.4rem, 2.4vw, 2rem); }

/* ── R-31 · AA text scrims (measured, r11 aa-probe + aa.py, 1440 + 390) ─────
   With the lighter recipe, two text blocks fell under 4.5:1 over the art:
   the clay .66rem region-group label (2.9 to 4.1:1) and the ink-62 body
   paragraphs on the hub / services-index cards (4.3:1); at hover opacity the
   large italic 01-05 index numerals touched 2.9:1 (need 3:1). Per the ruling, ONLY
   the scrim under those text blocks is strengthened (a soft white patch
   behind the block, painted above the art, below the text), never the card. */
:root { --art-wash-scrim: rgba(255, 255, 255, .72); }
.region-group.art-wash > h3,
:is(.svc-cond-grid--hub, .svc-cond-grid--hubs) .art-wash p,
.art-wash :is(.treat-num, .cause-num) { position: relative; }
.art-wash .cause-num { width: fit-content; }
.region-group.art-wash > h3::before,
:is(.svc-cond-grid--hub, .svc-cond-grid--hubs) .art-wash p::before,
.art-wash :is(.treat-num, .cause-num)::before {
  content: ""; position: absolute; inset: -.35rem -.6rem; z-index: -1; pointer-events: none;
  border-radius: .6rem; background: var(--art-wash-scrim); filter: blur(6px); }

/* ── CATCHUP-BUILD · the pinned rail keeps its CTA in view ──────────────────
   At 1440x900 the condition rail (TOC 10 links + "Treated with" + the contact
   card, ~1,045 px) exceeded its pinned height (100vh - 7.5rem = 780 px) and the
   board's rule scrolled the WHOLE rail, so the phone and the Book button sat
   below an inner scroll on 31/31 condition pages. Now only the navigation part
   (.rail-scroll) scrolls; the black contact card is flex:none at the bottom of
   the pinned rail, so phone + Book are in view at 1440x900, 1366x768 and
   1280x720 without scrolling anything. Below 1025 px the rail is static and
   .rail-scroll is a plain block (the board's mobile rules hide the TOC). */
.rail-scroll { display: flex; flex-direction: column; gap: 1.1rem; }
@media (min-width: 1025px) {
  .svc-sticky-rail { overflow: hidden; }
  .svc-sticky-rail > .rail-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; border-radius: var(--r-l);
    padding-right: 3px; scrollbar-width: thin; scrollbar-color: var(--gray) transparent; }
  .svc-sticky-rail > .rail-scroll::-webkit-scrollbar { width: 8px; }
  .svc-sticky-rail > .rail-scroll::-webkit-scrollbar-track { background: transparent; }
  .svc-sticky-rail > .rail-scroll::-webkit-scrollbar-thumb { background: var(--gray); border-radius: 99px; }
  .svc-sticky-rail > .side-contact { flex: none; }
}

/* ── CATCHUP-BUILD · city #route: the drive as labelled facts (was a
   template-composed sentence, copy-lint A3). The landmark-list's ruled-row
   vocabulary; the label is the board's eyebrow type. ────────────────────── */
.drive-facts { margin: .4rem 0 0; padding: 0; border-top: 1px solid var(--ink-09); }
.drive-facts > div { display: grid; grid-template-columns: 9.5rem minmax(0, 1fr); gap: .25rem 1rem; align-items: baseline;
  padding: .85rem 0; border-bottom: 1px solid var(--ink-09); }
.drive-facts dt { font-size: .66rem; font-weight: 600; letter-spacing: .2em; text-transform: uppercase; color: var(--clay); }
.drive-facts dd { margin: 0; color: var(--ink-72); font-weight: 300; line-height: 1.7; }
.drive-facts dd::first-letter { text-transform: uppercase; }
@media (max-width: 640px) { .drive-facts > div { grid-template-columns: minmax(0, 1fr); } }
#route .drive-facts + h3 { margin-top: clamp(1.5rem, 2.3vw, 1.95rem); }

/* ── GATE3-FIX D1 (2026-09-26) · LAZY CARD ART + LAZY REVIEWS BACKGROUND ──
   LAUNCH-QA measured 390 LCP at 4.7-5.4 s (Lighthouse-mobile profile) on the
   hub, city and conditions-index pages because every card-art background on
   the page downloaded ahead of the hero: CSS backgrounds have no lazy loading.
   bgArt() (src/lib/rimg.ts) now puts the image in --art / --art1 only; it is
   painted here once BaseLayout's observer marks the span `data-art-in` (after
   the window load event, section by section as each nears the viewport).
   Without JavaScript (no html.js) the image paints at once, as before.
   The reviews band's photo (a board ::before background, board CSS is frozen)
   is held back the same way until its section is marked. */
.art-wash-bg { background-image: var(--art1); }
@supports (background-image: image-set(url("x.webp") 1x)) {
  .art-wash-bg { background-image: var(--art); }
}
html.js .art-wash-bg:not([data-art-in]) { background-image: none; }
html.js .reviews:not([data-art-in])::before { background-image: none; }

/* ── GATE3-FIX D3 (2026-09-26) · the declarative WebMCP search form
   (components/chrome/WebMCP.astro): reachable, but visually out of the way. */
.wmcp { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* ── GATE3-FIX D1 (2026-09-26) · DEFERRED RENDERING OF BELOW-THE-FOLD BANDS
   ON PHONES AND TABLETS. After the image fixes, the 390 LCP on the
   Lighthouse-mobile profile (CPU x4) was bound by the MAIN THREAD, not the
   network: the first layout of a whole page took 0.8-0.9 s and the font-swap
   relayout another 0.3-0.45 s, and the hero could not paint until both were
   done (trace: scratch/waves/2026-09-26-p6/logs/fix). `content-visibility:
   auto` lets the browser skip layout and paint of the bands below the first
   content band until they approach the viewport (first layout 916 -> 166 ms).
   Excluded: the hero and first band (above the fold), Home #approach and the
   CTA band (they paint outside their own box, which paint containment would
   clip) and Home #scrollExpand (sticky pin). Desktop (>1024 px) is untouched:
   its sticky rails and map column stay exactly as before, and it was never
   slow. public/scripts/lazy-media.js releases every band section by section
   in idle time after `load` (data-cv-done), and releases them ALL at once
   (html.cv-off) before any in-page #anchor jump, so #book / #faq land on
   target; a page opened with a #hash starts released (inline in <head>).
   No JavaScript = no deferral. */
@media (max-width: 1024px) {
  html.js:not(.cv-off) main > section:nth-of-type(n+3):not(#scrollExpand):not(#approach):not(.cta-band):not([data-cv-done]) {
    content-visibility: auto;
    contain-intrinsic-size: auto 800px;
  }
}

/* ── GATE3-FIX anchor check (2026-09-26): only .cond-sec and .book-band had
   the board's 6.5rem scroll margin, so "#faq" (condition TOC, service rail
   "Questions"), "#reviews", "#visit" and the other band anchors parked the
   band's top under the sticky header. Every id'd band gets the same 6.5rem. */
main > section[id] { scroll-margin-top: 6.5rem; }

/* ── CONSENT CARD (R-42, 2026-09-27; src/components/ConsentGate.astro) ─────
   The footer's own chrome: --black ground, --line-dark hairline, --mist body
   copy at the footer blurb's size (.9rem / 300), the heading in the display
   face, Accept = the board's own .btn.btn-bronze (unchanged sizes, R-03).
   Fixed position, so it can never shift layout. z-index 130: above the nav
   (100/120), under the mobile CTA bar (140) and the mobile menu (150).
   At 768px and below it sits 16px above the sticky .mcta bar: the gate
   measures the bar on show() and sets --consent-offset on the card; the
   :root value below is only the fallback (the bar's 1-line height).
   ⛔ Class prefix `cgate`, NOT the kit's `consent`: the frozen board already
   owns `.consent` (the booking form's consent line: display:flex, margin
   .2rem 0 1.5rem, .86rem), and on the first staging deploy it leaked onto
   the card (flex layout, +24px bottom margin). */
@media (max-width: 768px) { :root { --consent-offset: calc(65px + env(safe-area-inset-bottom, 0px)); } }
.cgate {
  position: fixed; z-index: 130;
  left: 16px; right: 16px;
  bottom: calc(16px + var(--consent-offset, 0px));
  max-width: 380px; margin-left: auto;
  padding: 1.25rem 3.1rem 1.2rem 1.3rem;
  background: var(--black); color: var(--mist);
  border: 1px solid var(--line-dark); border-radius: var(--r-l, 18px);
  box-shadow: 0 24px 56px -20px rgba(0, 0, 0, .55);
  font-family: var(--f-b); font-size: .9rem; font-weight: 300; line-height: 1.7;
}
.cgate[hidden] { display: none; }
.cgate:focus { outline: none; }
.cgate__h {
  margin: 0 0 .4rem; font-family: var(--f-d); font-weight: 400; font-size: var(--s-1);
  letter-spacing: -.012em; line-height: 1.2; color: var(--white);
}
.cgate__p { margin: 0; }
.cgate__p a { color: var(--white); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }
.cgate__p a:hover { color: var(--beige); }
.cgate__stack { display: grid; margin: 1rem -1.8rem 0 0; }
.cgate__accept { width: 100%; }
.cgate__x {
  position: absolute; top: .55rem; right: .55rem;
  width: 40px; height: 40px; display: grid; place-items: center;
  border-radius: 50%; color: var(--white); opacity: .8;
}
.cgate__x svg { width: 14px; height: 14px; }
.cgate__x:hover { opacity: 1; background: rgba(255, 255, 255, .08); }
.cgate__x:focus-visible, .cgate__accept:focus-visible, .cgate__p a:focus-visible {
  outline: 2px solid var(--beige); outline-offset: 2px; opacity: 1;
}
@media (max-width: 520px) { .cgate { left: 16px; right: 16px; max-width: none; } }
@media print { .cgate { display: none !important; } }
@media (prefers-reduced-motion: no-preference) {
  .cgate:not([hidden]) { animation: cgate-in .28s var(--eout, ease-out) both; }
  @keyframes cgate-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
}
/* the policy's #choices heading (R-42): the footer "Privacy choices" link
   without JS lands here, clear of the sticky header */
.idx-article h2[id] { scroll-margin-top: 6.5rem; }

/* ── P8 MOBILE BOOKING FIX (2026-09-27, owner phone report, Android ~412px) ──
   Mobile only (<=768px); desktop and the board's type are untouched.
   1. Home #contact: the board pulls .fhost full-bleed (margin-inline:-gut) and
      hands the gutter back only to .fhost-head/.fhost-alt/.fhost-fallback. The
      Core30 booking rail (.book-rail: steps, assurances, reassurance) sits in
      the same full-bleed box and got no gutter, so its copy ran to x=0.
   2. The board's .book-steps li is display:flex, which laid the home rail's
      three spans out as three squeezed columns (num | title | body): titles
      wrapped a word per line and step 03's body started at another x. At
      mobile it is a 2-column grid: numeral | title over body.
   3. Service/condition/hub/city/about .book-band: the numerals "01" "02" "03"
      are different widths, so the step bodies started 2px apart. Fixed
      numeral column.
   4. Poptin (CORE30-POPTIN-PLAYBOOK §3): Poptin draws the form at 500x500 and
      applies transform:scale(min(box width, box height)/500). At mobile the
      WIDTH is the binding side, so every px of host padding shrinks fields and
      type. The 16px box padding is dropped (Integra's full-bleed pattern:
      412px phone = scale .824, was .76); Poptin's own inner padding keeps the
      labels ~17px off the screen edge. HEIGHT CONTRACT UNCHANGED (560). */
@media (max-width: 768px) {
  #contact .book-rail { padding-inline: var(--gut); }
  #contact .book-steps li {
    display: grid; grid-template-columns: 2.25rem minmax(0, 1fr);
    column-gap: .75rem; row-gap: .25rem; align-items: baseline;
  }
  #contact .book-steps .bs-n { grid-column: 1; grid-row: 1 / span 2; min-width: 0; }
  #contact .book-steps .bs-t,
  #contact .book-steps .bs-b { grid-column: 2; min-width: 0; }
  .book-band .book-steps .n { width: 1.5rem; }
  .fhost-box,
  .book-band .fhost-box { padding-inline: 0; }
}
