/* ==========================================================================
   MIAMI CHIROPRACTIC — DESIGN SYSTEM
   assets/css/site.css

   Built for a static, no-build-step, multi-page HTML/CSS/JS site.
   This file is shared by every page (home + 9 interior pages). It is NOT
   homepage-specific: tokens, type scale, layout primitives, components,
   reveal-animation system, and the consent/accessibility widgets all live
   here so interior pages just add page-specific content inside the same
   shells (.section, .container, .card, etc).

   Brand read: sports-medicine chiropractor, not a wellness spa. Deep navy
   grounds, an electric-blue "ring" motif, white type, athletic/clinical
   confidence. See DESIGN-NOTES.md in the project root for the full class
   reference an interior-page builder needs.

   Table of contents:
     1.  Font loading note
     2.  Reset / base
     3.  Design tokens
     4.  Type scale
     5.  Layout primitives
     6.  Accessibility helpers
     7.  Buttons
     8.  Badges / pills / eyebrows
     9.  Cards
     10. Navigation
     11. Hero
     12. Stat strip
     13. Bento (signature treatments)
     14. Feature list (why patients choose us)
     15. Pricing band
     16. Scroll gallery (athlete credibility)
     17. Location split cards
     18. CTA band
     19. Footer
     20. Cookie consent banner
     21. Accessibility widget
     22. Scroll reveal system
     23. Reduced motion
     24. Responsive notes
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. FONT LOADING NOTE
   Fonts are loaded via <link> in the <head> of every page (Google Fonts,
   preconnect + display=swap), not re-declared here, so this stylesheet has
   no network calls of its own:

     <link rel="preconnect" href="https://fonts.googleapis.com">
     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
     <link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">

   Barlow Condensed = display/headline face (athletic, scoreboard-adjacent,
   holds up in uppercase). Inter = body/UI face (neutral, highly legible,
   chosen deliberately for this accessibility-first medical site rather
   than a display serif or a trendier grotesk). Both ship with system-font
   fallback stacks below so the page never blocks on a font that fails to
   load.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   2. RESET / BASE
   -------------------------------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

body {
  margin: 0;
  min-height: 100dvh;
  background: var(--navy-ink);
  color: var(--white);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

img,
picture,
svg {
  display: block;
  max-width: 100%;
  height: auto;
}

a {
  color: inherit;
  text-decoration: none;
}

button {
  font: inherit;
  color: inherit;
  cursor: pointer;
}

ul,
ol {
  margin: 0;
  padding: 0;
  list-style: none;
}

h1,
h2,
h3,
h4,
p,
figure {
  margin: 0;
}

table {
  border-collapse: collapse;
  width: 100%;
}

/* --------------------------------------------------------------------------
   3. DESIGN TOKENS
   Brand colors are fixed by the client's own brand kit (BRIEF.md section 2)
   and are not subject to the design-skill's palette bans. Do not change
   these hexes on interior pages.
   -------------------------------------------------------------------------- */
:root {
  /* Brand colors */
  --navy-ink: #0b1729;   /* deepest ground, page background */
  --navy: #0d1b36;       /* polo navy, primary brand dark */
  --navy-2: #011734;     /* secondary dark, card wells, footer */
  --blue: #0b69db;       /* electric brand blue, solid fills (buttons, badges) */
  --blue-bright: #3b9bff; /* glow / hover / links + accents on dark backgrounds */
  --white: #ffffff;
  --paper: #f5f7fa;      /* light surface: cards/panels on the dark page */
  --slate: #5a6b84;      /* body text on light/paper surfaces */

  /* Derived surface + text tokens (contrast-checked, see DESIGN-NOTES.md) */
  --ink-muted: rgba(255, 255, 255, 0.72);   /* secondary text on dark, ~9.6:1 on navy-ink */
  --ink-faint: rgba(255, 255, 255, 0.5);    /* tertiary / captions on dark */
  --hairline: rgba(255, 255, 255, 0.12);    /* borders on dark surfaces */
  --hairline-strong: rgba(255, 255, 255, 0.2);
  --paper-hairline: rgba(11, 23, 41, 0.1);  /* borders on paper surfaces */
  --card-navy: rgba(255, 255, 255, 0.04);   /* subtle card fill on dark, layered on navy */

  /* Fonts */
  --font-display: "Barlow Condensed", "Arial Narrow", Arial, sans-serif;
  --font-body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

  /* Spacing scale (8px base) */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2rem;
  --space-7: 3rem;
  --space-8: 4rem;
  --space-9: 6rem;
  --space-10: 8rem;

  /* Section rhythm (fluid, VISUAL_DENSITY ~4: "daily app" not "art gallery") */
  --section-pad-y: clamp(3.5rem, 6vw, 6rem);
  --section-pad-y-tight: clamp(2.5rem, 4vw, 4rem);

  /* Radius scale — locked: pill buttons/badges, 16px cards, 10px inputs */
  --radius-card: 16px;
  --radius-card-sm: 12px;
  --radius-input: 10px;
  --radius-pill: 999px;

  /* Shadows, tinted to navy (never pure black) */
  --shadow-card: 0 20px 44px -18px rgba(1, 10, 24, 0.55);
  --shadow-card-sm: 0 10px 24px -12px rgba(1, 10, 24, 0.45);
  --shadow-glow: 0 0 0 1px rgba(59, 155, 255, 0.25), 0 0 32px rgba(11, 105, 219, 0.35);

  /* Motion */
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --dur-fast: 0.18s;
  --dur-base: 0.4s;
  --dur-slow: 0.7s;

  /* Z-index scale — use these tokens, never arbitrary numbers */
  --z-base: 1;
  --z-sticky-nav: 40;
  --z-widget-launcher: 45;
  --z-widget-panel: 50;
  --z-consent: 60;
  --z-skip-link: 70;

  /* Container */
  --container-max: 1240px;
  --container-pad: clamp(1.25rem, 4vw, 2.5rem);
}

/* --------------------------------------------------------------------------
   4. TYPE SCALE
   Display face = Barlow Condensed (headings, stat numbers, eyebrows).
   Body face = Inter. Numbers get tabular figures wherever they appear as
   data (stats, prices, phone numbers).
   -------------------------------------------------------------------------- */
.h1,
h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.5rem, 5.4vw, 4.25rem);
  line-height: 1.04;
  letter-spacing: -0.01em;
  text-wrap: balance;
}

.h2,
h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2rem, 3.6vw, 3rem);
  line-height: 1.08;
  letter-spacing: -0.005em;
  text-wrap: balance;
}

.h3,
h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.18;
  text-wrap: balance;
}

.h4,
h4 {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 1.0625rem;
  line-height: 1.3;
}

.lede {
  font-size: clamp(1.0625rem, 1.6vw, 1.25rem);
  line-height: 1.55;
  color: var(--ink-muted);
  max-width: 62ch;
}

.lede--on-paper {
  color: var(--slate);
}

p {
  max-width: 65ch;
}

.text-body-sm {
  font-size: 0.9375rem;
  line-height: 1.6;
}

.text-caption {
  font-size: 0.8125rem;
  line-height: 1.5;
  color: var(--ink-faint);
}

.tabular {
  font-variant-numeric: tabular-nums;
}

.stat-number {
  font-family: var(--font-display);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1;
  letter-spacing: -0.01em;
}

/* italic emphasis inside headlines: same family, guaranteed descender clearance */
em.accent {
  font-style: italic;
  font-weight: 700;
  color: var(--blue-bright);
  line-height: 1.15;
  padding-bottom: 0.08em;
  display: inline-block;
}

/* --------------------------------------------------------------------------
   5. LAYOUT PRIMITIVES
   -------------------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--container-pad);
}

.container--narrow {
  max-width: 860px;
}

.section {
  position: relative;
  padding-block: var(--section-pad-y);
}

.section--tight {
  padding-block: var(--section-pad-y-tight);
}

/* Section surface variants. The page's base ground is navy-ink; --paper is
   used for elevated CARD surfaces (see section 9), not full-bleed section
   backgrounds, so the page keeps one consistent dark theme throughout
   (see DESIGN-NOTES.md for why this reading of the brand kit was chosen). */
.section--navy-2 {
  background: var(--navy-2);
}

.section--border-t {
  border-top: 1px solid var(--hairline);
}

.section--border-b {
  border-bottom: 1px solid var(--hairline);
}

.grid {
  display: grid;
  gap: var(--space-6);
}

.stack {
  display: flex;
  flex-direction: column;
}

.cluster {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-4);
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   6. ACCESSIBILITY HELPERS
   -------------------------------------------------------------------------- */
.skip-link {
  position: fixed;
  top: -100%;
  left: var(--space-4);
  z-index: var(--z-skip-link);
  background: var(--blue);
  color: var(--white);
  padding: var(--space-3) var(--space-5);
  border-radius: var(--radius-input);
  font-weight: 600;
  transition: top var(--dur-fast) var(--ease-out);
}

.skip-link:focus {
  top: var(--space-4);
}

/* Visible focus states everywhere. Never remove outline without replacing it. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--blue-bright);
  outline-offset: 2px;
  border-radius: 4px;
}

/* --------------------------------------------------------------------------
   7. BUTTONS
   Radius lock: buttons are always pill-shaped. Every variant sets an
   EXPLICIT background, including on <button> elements, so the UA
   `buttonface` grey never leaks through (known contrast trap on this
   fleet). Never ship a .btn without a background declaration.
   -------------------------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  padding: 0.875rem 1.75rem;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 0.9375rem;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-out),
    background-color var(--dur-fast) var(--ease-out),
    border-color var(--dur-fast) var(--ease-out),
    box-shadow var(--dur-fast) var(--ease-out);
}

.btn:active {
  transform: scale(0.98);
}

.btn-primary {
  background: var(--blue);
  color: var(--white);
}

.btn-primary:hover {
  background: var(--blue-bright);
}

.btn-secondary {
  background: transparent;
  color: var(--white);
  border-color: var(--hairline-strong);
}

.btn-secondary:hover {
  background: rgba(255, 255, 255, 0.08);
  border-color: var(--blue-bright);
}

/* For use on paper/light card surfaces */
.btn-primary-on-paper {
  background: var(--navy);
  color: var(--white);
}

.btn-primary-on-paper:hover {
  background: var(--blue);
}

.btn-ghost-on-paper {
  background: transparent;
  color: var(--navy);
  border-color: var(--paper-hairline);
}

.btn-ghost-on-paper:hover {
  background: rgba(11, 27, 54, 0.06);
}

.btn-lg {
  padding: 1.05rem 2.25rem;
  font-size: 1rem;
}

.btn-sm {
  padding: 0.625rem 1.25rem;
  font-size: 0.875rem;
}

.btn-block {
  width: 100%;
}

/* --------------------------------------------------------------------------
   8. BADGES / PILLS / EYEBROWS
   Eyebrow budget is rationed sitewide (max ~1 per 3 sections) — see
   DESIGN-NOTES.md before adding another one to an interior page.
   -------------------------------------------------------------------------- */
.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--blue-bright);
}

.eyebrow--on-paper {
  color: var(--blue);
}

.pill {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.5rem 1rem;
  border-radius: var(--radius-pill);
  font-size: 0.8125rem;
  font-weight: 600;
  background: var(--card-navy);
  border: 1px solid var(--hairline);
  color: var(--white);
}

.pill--paper {
  background: var(--white);
  border-color: var(--paper-hairline);
  color: var(--navy);
}

.badge-credential {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-card-sm);
  background: rgba(11, 23, 41, 0.7);
  border: 1px solid var(--hairline-strong);
  backdrop-filter: blur(16px) saturate(160%);
  -webkit-backdrop-filter: blur(16px) saturate(160%);
}

@media (prefers-reduced-transparency: reduce) {
  .badge-credential {
    background: var(--navy-ink);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

.badge-credential__icon {
  flex: none;
  width: 2rem;
  height: 2rem;
  color: var(--blue-bright);
}

.badge-credential__number {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.375rem;
  color: var(--white);
  line-height: 1;
}

.badge-credential__label {
  font-size: 0.75rem;
  color: var(--ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  line-height: 1.3;
}

/* --------------------------------------------------------------------------
   9. CARDS
   Radius lock: cards are 16px (small variants 12px). Shadows tint navy,
   never pure black. Elevation communicates real hierarchy; do not wrap
   flat content in a card just for the sake of it.
   -------------------------------------------------------------------------- */
.card {
  border-radius: var(--radius-card);
  padding: var(--space-6);
}

.card--on-dark {
  background: var(--card-navy);
  border: 1px solid var(--hairline);
}

.card--paper {
  background: var(--paper);
  color: var(--slate);
  box-shadow: var(--shadow-card);
}

.card--paper h3,
.card--paper h4,
.card--paper .h3,
.card--paper .h4 {
  color: var(--navy);
}

.card--navy-solid {
  background: var(--navy);
  border: 1px solid var(--hairline);
  box-shadow: var(--shadow-card-sm);
}

.card--glow {
  box-shadow: var(--shadow-glow);
}

.card-media {
  border-radius: var(--radius-card-sm);
  overflow: hidden;
}

.card-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* --------------------------------------------------------------------------
   10. NAVIGATION
   Single-line desktop nav, height capped, sticky with blur.
   -------------------------------------------------------------------------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: var(--z-sticky-nav);
  background: rgba(11, 23, 41, 0.86);
  backdrop-filter: blur(14px) saturate(160%);
  -webkit-backdrop-filter: blur(14px) saturate(160%);
  border-bottom: 1px solid var(--hairline);
}

@media (prefers-reduced-transparency: reduce) {
  .site-header {
    background: var(--navy-ink);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  height: 76px;
}

.nav__brand {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex: none;
  min-width: 0;
}

.nav__brand-mark {
  width: 40px;
  height: 40px;
  flex: none;
}

.nav__brand-word {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.125rem;
  letter-spacing: 0.01em;
  line-height: 1.1;
  color: var(--white);
}

.nav__brand-word span {
  display: block;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--blue-bright);
}

.nav__links {
  display: none;
  align-items: center;
  gap: var(--space-6);
  font-size: 0.9375rem;
  font-weight: 500;
}

.nav__links a {
  position: relative;
  padding-block: var(--space-2);
  color: var(--ink-muted);
  transition: color var(--dur-fast) var(--ease-out);
}

.nav__links a:hover,
.nav__links a[aria-current="page"] {
  color: var(--white);
}

.nav__links a[aria-current="page"]::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -2px;
  height: 2px;
  background: var(--blue-bright);
  border-radius: var(--radius-pill);
}

.nav__actions {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex: none;
}

.nav__book-label-short {
  display: inline;
}

.nav__book-label-full {
  display: none;
}

@media (min-width: 420px) {
  .nav__book-label-short {
    display: none;
  }

  .nav__book-label-full {
    display: inline;
  }
}

@media (max-width: 480px) {
  .nav__brand-word span {
    display: none;
  }

  .nav {
    gap: var(--space-2);
  }

  .nav__actions {
    gap: var(--space-2);
  }

  .nav__actions .btn-sm {
    padding-inline: 1rem;
  }
}

.nav__phone {
  display: none;
  align-items: center;
  gap: var(--space-2);
  font-weight: 600;
  font-size: 0.9375rem;
  color: var(--white);
}

.nav__phone svg {
  width: 18px;
  height: 18px;
  color: var(--blue-bright);
}

.nav__toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  background: transparent;
  border: 1px solid var(--hairline-strong);
  border-radius: var(--radius-input);
  color: var(--white);
}

.nav__toggle svg {
  width: 20px;
  height: 20px;
}

.nav__mobile {
  display: none;
  flex-direction: column;
  gap: var(--space-1);
  padding: var(--space-4) 0 var(--space-6);
  border-top: 1px solid var(--hairline);
}

.nav__mobile.is-open {
  display: flex;
}

.nav__mobile a {
  padding: var(--space-3) var(--space-2);
  border-radius: var(--radius-input);
  font-weight: 500;
  color: var(--ink-muted);
}

.nav__mobile a:hover,
.nav__mobile a[aria-current="page"] {
  color: var(--white);
  background: var(--card-navy);
}

@media (min-width: 1024px) {
  .nav__links {
    display: flex;
  }

  .nav__phone {
    display: flex;
  }

  .nav__toggle {
    display: none;
  }
}

/* --------------------------------------------------------------------------
   11. HERO
   Asymmetric split: copy left, real photo right. Deliberately not centered
   (anti-center-bias). Hero top padding capped; stack limited to eyebrow-or-
   none, headline, subtext, CTAs.
   -------------------------------------------------------------------------- */
.hero {
  background: radial-gradient(120% 140% at 12% -10%, rgba(11, 105, 219, 0.28), transparent 55%),
    linear-gradient(180deg, var(--navy-ink) 0%, var(--navy) 100%);
  padding-top: clamp(2.5rem, 5vw, 5rem);
  padding-bottom: clamp(3rem, 6vw, 5rem);
  overflow: clip;
}

.hero__grid {
  display: grid;
  gap: var(--space-8);
  align-items: center;
}

.hero__copy {
  max-width: 46ch;
}

.hero__eyebrow {
  margin-bottom: var(--space-4);
}

.hero__title {
  margin-bottom: var(--space-5);
}

.hero__subtext {
  margin-bottom: var(--space-6);
}

.hero__ctas {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
}

.hero__visual {
  position: relative;
  justify-self: center;
  width: 100%;
  max-width: 460px;
}

.hero__frame {
  position: relative;
  border-radius: var(--radius-card);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  box-shadow: var(--shadow-card);
}

.hero__frame img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 20%;
}

.hero__frame::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(11, 23, 41, 0) 55%, rgba(11, 23, 41, 0.75) 100%);
  pointer-events: none;
}

.hero__badge {
  position: absolute;
  left: var(--space-5);
  right: var(--space-5);
  bottom: var(--space-5);
  z-index: 2;
}

.hero__badge-row {
  display: flex;
  gap: var(--space-5);
}

.hero__ring {
  position: absolute;
  z-index: 0;
  border-radius: 50%;
  border: 1px solid rgba(59, 155, 255, 0.35);
  pointer-events: none;
}

.hero__ring--1 {
  width: 120%;
  aspect-ratio: 1;
  top: -20%;
  right: -30%;
}

.hero__ring--2 {
  width: 70%;
  aspect-ratio: 1;
  bottom: -15%;
  right: 10%;
  border-color: rgba(59, 155, 255, 0.2);
}

@media (min-width: 900px) {
  .hero__grid {
    grid-template-columns: 1.1fr 0.9fr;
  }

  .hero__visual {
    justify-self: end;
    max-width: 100%;
  }
}

/* --------------------------------------------------------------------------
   12. STAT STRIP
   Sits directly under the hero, not inside it (trust strip rule).
   -------------------------------------------------------------------------- */
.stat-strip {
  border-top: 1px solid var(--hairline);
  background: var(--navy-2);
}

.stat-strip__row {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-6);
  padding-block: var(--space-6);
}

.stat-strip__item {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.stat-strip__item .stat-number {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  color: var(--white);
}

.stat-strip__item span {
  font-size: 0.8125rem;
  color: var(--ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

@media (min-width: 768px) {
  .stat-strip__row {
    grid-template-columns: repeat(4, 1fr);
  }
}

/* --------------------------------------------------------------------------
   13. BENTO (signature treatments)
   Exactly 3 cells for 3 treatments: one wide feature cell + two stacked.
   Each cell has real visual variation (photo / product shot / glow motif),
   not three identical white-on-white text tiles.
   -------------------------------------------------------------------------- */
.bento {
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}

.bento__cell {
  position: relative;
  border-radius: var(--radius-card);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 360px;
  padding: var(--space-6);
  box-shadow: var(--shadow-card-sm);
}

.bento__cell--feature {
  min-height: 420px;
}

.bento__media {
  position: absolute;
  inset: 0;
  z-index: 0;
}

.bento__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.bento__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(1, 23, 52, 0.15) 0%, rgba(1, 23, 52, 0.92) 88%);
  pointer-events: none;
}

.bento__cell--motif {
  background: radial-gradient(120% 140% at 100% 0%, rgba(11, 105, 219, 0.35), transparent 55%),
    var(--navy);
  border: 1px solid var(--hairline);
}

.bento__ring-motif {
  position: absolute;
  top: var(--space-6);
  right: var(--space-6);
  width: 96px;
  height: 96px;
  z-index: 0;
  color: var(--blue-bright);
  opacity: 0.9;
}

.bento__content {
  position: relative;
  z-index: 2;
}

.bento__content .eyebrow {
  margin-bottom: var(--space-2);
}

.bento__content h3 {
  color: var(--white);
  margin-bottom: var(--space-2);
}

.bento__content p {
  color: var(--ink-muted);
  font-size: 0.9375rem;
  margin-bottom: var(--space-4);
}

.bento__link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-weight: 600;
  font-size: 0.9375rem;
  color: var(--blue-bright);
}

.bento__link svg {
  width: 16px;
  height: 16px;
  transition: transform var(--dur-fast) var(--ease-out);
}

.bento__link:hover svg {
  transform: translateX(3px);
}

@media (min-width: 860px) {
  .bento {
    grid-template-columns: 1.3fr 1fr;
  }

  .bento__cell--feature {
    grid-row: 1 / 3;
  }
}

/* --------------------------------------------------------------------------
   14. FEATURE LIST (why patients choose us)
   Deliberately NOT another card grid — plain rows with icon + hairline,
   grouped, to avoid repeating the bento layout family.
   -------------------------------------------------------------------------- */
.feature-list {
  display: grid;
  gap: 0;
  border-top: 1px solid var(--paper-hairline);
}

.feature-list__row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--space-5);
  align-items: start;
  padding-block: var(--space-6);
  border-bottom: 1px solid var(--paper-hairline);
}

.feature-list__icon {
  flex: none;
  width: 2.75rem;
  height: 2.75rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-card-sm);
  background: rgba(11, 105, 219, 0.08);
  color: var(--blue);
}

.feature-list__icon svg {
  width: 1.375rem;
  height: 1.375rem;
}

.feature-list__row h4 {
  color: var(--navy);
  margin-bottom: var(--space-1);
}

.feature-list__row p {
  color: var(--slate);
  font-size: 0.9375rem;
}

@media (min-width: 768px) {
  .feature-list {
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-7);
  }

  .feature-list__row:nth-last-child(-n + 1):nth-child(odd) {
    border-bottom: 1px solid var(--paper-hairline);
  }
}

/* --------------------------------------------------------------------------
   15. PRICING BAND
   Full-width, single-focus band. A different layout family from the bento
   and feature-list sections above it.
   -------------------------------------------------------------------------- */
.pricing-band {
  background: radial-gradient(90% 160% at 90% 10%, rgba(11, 105, 219, 0.25), transparent 60%),
    var(--navy-ink);
  border-top: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
}

.pricing-band__grid {
  display: grid;
  gap: var(--space-7);
  align-items: center;
}

.pricing-band__figure {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
}

.pricing-band__figure .stat-number {
  font-size: clamp(3.5rem, 8vw, 6rem);
  color: var(--white);
}

.pricing-band__figure span {
  font-size: 1.25rem;
  color: var(--ink-muted);
}

.pricing-band__list {
  margin-top: var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.pricing-band__list li {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  color: var(--ink-muted);
  font-size: 0.9375rem;
}

.pricing-band__list svg {
  flex: none;
  width: 1.125rem;
  height: 1.125rem;
  margin-top: 0.15rem;
  color: var(--blue-bright);
}

@media (min-width: 900px) {
  .pricing-band__grid {
    grid-template-columns: 0.9fr 1.1fr;
  }
}

/* --------------------------------------------------------------------------
   16. SCROLL GALLERY (athlete credibility)
   Horizontal scroll-snap strip. Right UI component for a breadth-heavy set
   of real photos instead of a repeated card grid.
   -------------------------------------------------------------------------- */
.scroll-gallery {
  display: flex;
  gap: var(--space-5);
  overflow-x: auto;
  padding-bottom: var(--space-4);
  scroll-snap-type: x mandatory;
  scrollbar-width: thin;
  scrollbar-color: var(--blue) transparent;
  margin-inline: calc(var(--container-pad) * -1);
  padding-inline: var(--container-pad);
}

.scroll-gallery__item {
  flex: none;
  scroll-snap-align: start;
  width: min(78vw, 300px);
}

.scroll-gallery__frame {
  border-radius: var(--radius-card-sm);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  margin-bottom: var(--space-3);
  border: 1px solid var(--hairline);
  background: var(--navy);
  display: flex;
  align-items: center;
  justify-content: center;
}

.scroll-gallery__frame img {
  /* These source images are designed stat-card / press-clipping graphics
     with real names and numbers baked into the pixels at the edges.
     object-fit: contain (not cover) so that text is never cropped,
     regardless of the source image's native aspect ratio. */
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.scroll-gallery__caption {
  font-size: 0.8125rem;
  color: var(--ink-muted);
  line-height: 1.4;
}

/* --------------------------------------------------------------------------
   17. LOCATION SPLIT CARDS
   Exactly 2 cells for 2 real locations.
   -------------------------------------------------------------------------- */
.locations {
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}

.location-card {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.location-card__meta {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.location-card__meta span {
  font-size: 0.8125rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--blue);
  font-weight: 700;
}

.location-card__address {
  font-size: 1rem;
  color: var(--slate);
}

.location-card__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
  margin-top: auto;
  padding-top: var(--space-2);
}

@media (min-width: 768px) {
  .locations {
    grid-template-columns: 1fr 1fr;
  }
}

/* --------------------------------------------------------------------------
   18. CTA BAND
   -------------------------------------------------------------------------- */
.cta-band {
  background: radial-gradient(100% 160% at 50% 0%, rgba(11, 105, 219, 0.35), transparent 60%),
    var(--navy);
  text-align: center;
}

.cta-band__title {
  max-width: 34ch;
  margin-inline: auto;
  margin-bottom: var(--space-3);
}

.cta-band__subtext {
  max-width: 48ch;
  margin-inline: auto;
  margin-bottom: var(--space-6);
}

.cta-band__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-4);
}

/* --------------------------------------------------------------------------
   19. FOOTER
   -------------------------------------------------------------------------- */
.site-footer {
  background: var(--navy-2);
  border-top: 1px solid var(--hairline);
}

.footer__grid {
  display: grid;
  gap: var(--space-7);
  padding-block: var(--space-8);
}

.footer__brand {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-4);
}

.footer__brand-mark {
  width: 36px;
  height: 36px;
}

.footer__brand-word {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.0625rem;
  color: var(--white);
}

.footer__tagline {
  color: var(--ink-muted);
  font-size: 0.9375rem;
  max-width: 34ch;
}

.footer__heading {
  font-size: 0.8125rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: var(--space-4);
}

.footer__links {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.footer__links a {
  color: var(--ink-muted);
  font-size: 0.9375rem;
  transition: color var(--dur-fast) var(--ease-out);
}

.footer__links a:hover {
  color: var(--white);
}

.footer__social {
  display: flex;
  gap: var(--space-3);
  margin-top: var(--space-5);
}

.footer__social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--hairline-strong);
  color: var(--ink-muted);
  transition: color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}

.footer__social a:hover {
  color: var(--white);
  border-color: var(--blue-bright);
}

.footer__social svg {
  width: 1.125rem;
  height: 1.125rem;
}

.footer__bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding-block: var(--space-5);
  border-top: 1px solid var(--hairline);
  font-size: 0.8125rem;
  color: var(--ink-faint);
}

.footer__bottom-links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
}

.footer__bottom-links a {
  color: var(--ink-faint);
}

.footer__bottom-links a:hover {
  color: var(--white);
}

.footer__bottom-links button {
  background: none;
  border: none;
  padding: 0;
  color: var(--ink-faint);
  font-size: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}

.footer__bottom-links button:hover {
  color: var(--white);
}

@media (min-width: 768px) {
  .footer__grid {
    grid-template-columns: 1.4fr 1fr 1fr 1fr;
  }
}

/* --------------------------------------------------------------------------
   20. COOKIE CONSENT BANNER
   Shared across every page. Keyboard accessible: focus-trapped while open,
   Escape does NOT dismiss without a choice (cookie law requires an explicit
   accept/decline, not an implicit close). Buttons have explicit backgrounds.
   -------------------------------------------------------------------------- */
.consent-banner {
  position: fixed;
  left: var(--space-4);
  right: var(--space-4);
  bottom: var(--space-4);
  z-index: var(--z-consent);
  max-width: 640px;
  margin-inline: auto;
  background: var(--navy);
  border: 1px solid var(--hairline-strong);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-card);
  padding: var(--space-6);
  transform: translateY(120%);
  opacity: 0;
  transition: transform var(--dur-slow) var(--ease-out), opacity var(--dur-slow) var(--ease-out);
}

.consent-banner.is-visible {
  transform: translateY(0);
  opacity: 1;
}

.consent-banner[hidden] {
  display: none;
}

.consent-banner__title {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 1rem;
  margin-bottom: var(--space-2);
  color: var(--white);
}

.consent-banner__text {
  font-size: 0.875rem;
  color: var(--ink-muted);
  margin-bottom: var(--space-5);
}

.consent-banner__text a {
  color: var(--blue-bright);
  text-decoration: underline;
  text-underline-offset: 2px;
}

.consent-banner__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
}

@media (prefers-reduced-motion: reduce) {
  .consent-banner {
    transition: opacity var(--dur-fast) linear;
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   21. ACCESSIBILITY WIDGET
   Launcher + panel. Keyboard operable: launcher is a real <button>, panel
   traps focus while open, Escape closes it.
   -------------------------------------------------------------------------- */
.a11y-widget {
  position: fixed;
  right: var(--space-4);
  bottom: var(--space-4);
  z-index: var(--z-widget-launcher);
}

.a11y-widget__launcher {
  width: 3.25rem;
  height: 3.25rem;
  border-radius: var(--radius-pill);
  background: var(--blue);
  color: var(--white);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-card-sm);
  border: none;
  transition: background var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);
}

.a11y-widget__launcher:hover {
  background: var(--blue-bright);
  transform: translateY(-2px);
}

.a11y-widget__launcher svg {
  width: 1.625rem;
  height: 1.625rem;
}

.a11y-widget__panel {
  position: absolute;
  right: 0;
  bottom: calc(100% + var(--space-3));
  z-index: var(--z-widget-panel);
  width: min(320px, 84vw);
  background: var(--navy);
  border: 1px solid var(--hairline-strong);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-card);
  padding: var(--space-5);
  transform-origin: bottom right;
  transform: scale(0.94);
  opacity: 0;
  pointer-events: none;
  transition: transform var(--dur-base) var(--ease-out), opacity var(--dur-base) var(--ease-out);
}

.a11y-widget__panel.is-open {
  transform: scale(1);
  opacity: 1;
  pointer-events: auto;
}

.a11y-widget__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--space-4);
}

.a11y-widget__header h2 {
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--white);
}

.a11y-widget__close {
  width: 2rem;
  height: 2rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--hairline-strong);
  border-radius: var(--radius-input);
  color: var(--ink-muted);
}

.a11y-widget__close:hover {
  color: var(--white);
  border-color: var(--blue-bright);
}

.a11y-widget__close svg {
  width: 1rem;
  height: 1rem;
}

.a11y-widget__group {
  margin-bottom: var(--space-4);
}

.a11y-widget__group-label {
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--ink-faint);
  margin-bottom: var(--space-2);
  display: block;
}

.a11y-widget__row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}

.a11y-widget__option {
  background: var(--card-navy);
  border: 1px solid var(--hairline);
  color: var(--white);
  font-size: 0.8125rem;
  font-weight: 600;
  padding: 0.5rem 0.875rem;
  border-radius: var(--radius-pill);
  transition: background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}

.a11y-widget__option:hover {
  border-color: var(--blue-bright);
}

.a11y-widget__option[aria-pressed="true"] {
  background: var(--blue);
  border-color: var(--blue);
}

.a11y-widget__reset {
  width: 100%;
  justify-content: center;
  background: transparent;
  color: var(--ink-muted);
  border: 1px solid var(--hairline);
}

.a11y-widget__reset:hover {
  color: var(--white);
  border-color: var(--hairline-strong);
}

/* Accessibility widget runtime states, toggled on <html> by site.js */
html.a11y-larger-text {
  font-size: 112%;
}

html.a11y-largest-text {
  font-size: 124%;
}

html.a11y-high-contrast body {
  background: #000;
  color: #fff;
}

html.a11y-high-contrast .site-header,
html.a11y-high-contrast .hero,
html.a11y-high-contrast .stat-strip,
html.a11y-high-contrast .section--navy-2,
html.a11y-high-contrast .pricing-band,
html.a11y-high-contrast .cta-band,
html.a11y-high-contrast .site-footer,
html.a11y-high-contrast .bento__cell--motif,
html.a11y-high-contrast .bento__scrim,
html.a11y-high-contrast .hero-photo__scrim,
html.a11y-high-contrast .bleed-band__panel {
  background: #000 !important;
  border-color: #fff !important;
}

html.a11y-high-contrast .section[style*="--paper"],
html.a11y-high-contrast section[style*="background:var(--paper)"] {
  background: #fff !important;
  color: #000 !important;
}

html.a11y-high-contrast .card--paper,
html.a11y-high-contrast .location-card {
  background: #fff;
  color: #000;
  border: 1px solid #000;
}

html.a11y-high-contrast .card--paper h2,
html.a11y-high-contrast .card--paper h3,
html.a11y-high-contrast .card--paper h4,
html.a11y-high-contrast .card--paper p {
  color: #000 !important;
}

html.a11y-high-contrast a,
html.a11y-high-contrast .eyebrow,
html.a11y-high-contrast .bento__link {
  color: #ffd400;
}

html.a11y-high-contrast .btn-primary,
html.a11y-high-contrast .btn-primary-on-paper {
  background: #ffd400;
  color: #000;
}

html.a11y-high-contrast .btn-secondary,
html.a11y-high-contrast .btn-ghost-on-paper {
  border-color: #ffd400;
  color: #fff;
}

html.a11y-underline-links a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

html.a11y-pause-motion *,
html.a11y-pause-motion *::before,
html.a11y-pause-motion *::after {
  animation-play-state: paused !important;
  transition: none !important;
  scroll-behavior: auto !important;
}

html.a11y-readable-font body {
  font-family: Arial, Helvetica, sans-serif;
  letter-spacing: 0.01em;
}

/* --------------------------------------------------------------------------
   22. SCROLL REVEAL SYSTEM
   Gate matched on the SAME selector (html.js) for both the hide rule and
   the reveal rule, so elements do not flash-then-vanish if JS loads late
   or fails. Without JS, everything is simply visible (progressive
   enhancement, not a requirement).
   -------------------------------------------------------------------------- */
html.js .fade-up {
  opacity: 0;
  transform: translateY(24px);
}

html.js .fade-up.is-visible {
  opacity: 1;
  transform: translateY(0);
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out);
}

html.js .fade-up[data-delay="1"].is-visible {
  transition-delay: 0.08s;
}

html.js .fade-up[data-delay="2"].is-visible {
  transition-delay: 0.16s;
}

html.js .fade-up[data-delay="3"].is-visible {
  transition-delay: 0.24s;
}

/* --------------------------------------------------------------------------
   23. REDUCED MOTION
   Any motion above a static hover state collapses to instant/static.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  html.js .fade-up {
    opacity: 1;
    transform: none;
  }

  *,
  *::before,
  *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

/* --------------------------------------------------------------------------
   24. RESPONSIVE NOTES
   Breakpoints used across this system: 640 / 768 / 900 / 1024 / 1280.
   Mobile-first: base rules are the small-screen layout, min-width queries
   layer on the wider compositions. Every multi-column primitive above
   (.hero__grid, .bento, .feature-list, .locations, .footer__grid,
   .stat-strip__row) has its mobile collapse declared inline, next to the
   desktop rule, rather than assumed.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  .hero__ctas .btn,
  .cta-band__actions .btn {
    width: 100%;
  }

  .hero__badge-row {
    flex-direction: column;
    gap: var(--space-3);
  }
}

/* --------------------------------------------------------------------------
   25. INTERIOR PAGE ADDITIONS
   Components introduced for the interior-page build (see DESIGN-NOTES.md).
   All reuse existing tokens/radius/z-index scale rather than inventing a
   new visual treatment.
   -------------------------------------------------------------------------- */

/* Long-form article copy: blog posts, About narrative. */
.prose {
  max-width: 68ch;
}

.prose p {
  margin-bottom: var(--space-4);
  color: var(--ink-muted);
}

.prose--on-paper p {
  color: var(--slate);
}

.prose h2 {
  margin-top: var(--space-8);
  margin-bottom: var(--space-3);
  color: var(--white);
}

.prose--on-paper h2 {
  color: var(--navy);
}

.prose h3 {
  margin-top: var(--space-6);
  margin-bottom: var(--space-2);
  color: var(--white);
}

.prose--on-paper h3 {
  color: var(--navy);
}

.prose ul,
.prose ol {
  margin: 0 0 var(--space-4);
  padding-left: 1.25em;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  color: var(--ink-muted);
}

.prose--on-paper ul,
.prose--on-paper ol {
  color: var(--slate);
}

.prose a {
  color: var(--blue-bright);
  font-weight: 600;
}

.prose--on-paper a {
  color: var(--blue);
}

.prose strong {
  color: var(--white);
}

.prose--on-paper strong {
  color: var(--navy);
}

/* Generic 2-up split grid. Same breakpoint as .locations, named generically
   so other pages (Auto Accidents patient/attorney tracks) can reuse the
   identical split without borrowing the Locations-specific class name. */
.grid-2up {
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .grid-2up {
    grid-template-columns: 1fr 1fr;
  }
}

/* Condition groupings: 2-3 up card grid on paper, reuses .card--paper. */
.condition-grid {
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}

@media (min-width: 640px) {
  .condition-grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 1024px) {
  .condition-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

.condition-grid .card--paper h4 {
  color: var(--navy);
  margin-bottom: var(--space-2);
}

.condition-grid .card--paper p {
  color: var(--slate);
  font-size: 0.9375rem;
  margin: 0;
}

/* Numbered phase / step process: Phases of Care, 3-step orthotics process. */
.phase-list {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.phase-list__row {
  display: flex;
  gap: var(--space-5);
  padding: var(--space-5) 0;
  border-top: 1px solid var(--hairline);
}

.phase-list__row:first-child {
  border-top: none;
  padding-top: 0;
}

.phase-list--on-paper .phase-list__row {
  border-top-color: var(--paper-hairline);
}

.phase-list__index {
  flex: none;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: var(--radius-pill);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.25rem;
  background: var(--blue);
  color: var(--white);
}

.phase-list__meta {
  display: block;
  font-size: 0.8125rem;
  color: var(--blue-bright);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-bottom: var(--space-1);
}

.phase-list--on-paper .phase-list__meta {
  color: var(--blue);
}

.phase-list__row h4 {
  margin-bottom: var(--space-1);
}

.phase-list--on-paper .phase-list__row h4 {
  color: var(--navy);
}

.phase-list__row p {
  margin: 0;
  font-size: 0.9375rem;
  color: var(--ink-muted);
}

.phase-list--on-paper .phase-list__row p {
  color: var(--slate);
}

/* Single clinical proof image (annotated MRI). Letterboxed like the
   scroll-gallery frame since it is a graphic with baked-in text/markup,
   not a plain photo (see DESIGN-NOTES.md image notes): cropping would cut
   off the annotation. */
.proof-frame {
  border-radius: var(--radius-card);
  overflow: hidden;
  border: 1px solid var(--hairline);
  background: var(--navy);
  display: flex;
  align-items: center;
  justify-content: center;
  /* Explicit aspect-ratio (matches the source MRI image) rather than a
     max-height: with only a cap and no defined height, a height:100% img
     inside collapses to zero because the container has no resolvable
     height of its own (verified by screenshot, not just reading the CSS). */
  aspect-ratio: 1125 / 893;
  width: 100%;
}

.proof-frame img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.proof-caption {
  margin-top: var(--space-3);
  font-size: 0.875rem;
  color: var(--ink-muted);
}

.proof-caption--on-paper {
  color: var(--slate);
}

/* Blog index grid */
.blog-grid {
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}

@media (min-width: 640px) {
  .blog-grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 1024px) {
  .blog-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

.blog-card {
  display: flex;
  flex-direction: column;
  height: 100%;
}

/* Bleeds the card's top image out to the card's own rounded corners and
   padding edge (negative margin matching .card's padding: var(--space-6)),
   so the thumbnail reads as a photo card rather than an inset image inside
   a text card. Added for the photography upgrade pass, see DESIGN-NOTES.md. */
.blog-card__media {
  margin: calc(var(--space-6) * -1) calc(var(--space-6) * -1) var(--space-4);
  border-radius: var(--radius-card) var(--radius-card) 0 0;
  overflow: hidden;
  aspect-ratio: 3 / 2;
}

.blog-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.blog-card h3 {
  color: var(--navy);
  margin-bottom: var(--space-2);
}

.blog-card p {
  color: var(--slate);
  font-size: 0.9375rem;
  margin-bottom: var(--space-4);
}

.blog-card .bento__link {
  color: var(--blue);
  margin-top: auto;
}

.blog-card .bento__link svg {
  color: var(--blue);
}

/* Safety-note callout for the printable exercise handouts. Deliberately
   outside the blue/navy brand system: a safety warning needs to read as an
   alert, not a design accent, so this is the one place a warning red is
   introduced. Contrast checked: #7a1a13 on #fdecea is ~9.2:1. */
.safety-note {
  display: flex;
  gap: var(--space-3);
  align-items: flex-start;
  background: #fdecea;
  border: 1px solid #f3b7ae;
  border-radius: var(--radius-card-sm);
  padding: var(--space-5);
  color: #7a1a13;
}

.safety-note svg {
  flex: none;
  width: 1.5rem;
  height: 1.5rem;
  margin-top: 0.1rem;
  color: #7a1a13;
}

.safety-note strong {
  display: block;
  margin-bottom: var(--space-1);
  font-size: 1.0625rem;
  color: #7a1a13;
}

.safety-note p {
  margin: 0;
  color: #7a1a13;
  font-size: 0.9375rem;
}

/* Exercise handout: printable protocol sheets */
.exercise-sheet {
  max-width: 760px;
  margin-inline: auto;
}

.exercise-phase {
  border: 1px solid var(--paper-hairline);
  border-radius: var(--radius-card);
  padding: var(--space-5);
  background: var(--white);
}

.exercise-phase + .exercise-phase {
  margin-top: var(--space-5);
}

.exercise-phase h3 {
  color: var(--navy);
  margin-bottom: var(--space-1);
}

.exercise-phase__cue {
  display: block;
  color: var(--blue);
  font-weight: 600;
  font-size: 0.875rem;
  margin-bottom: var(--space-3);
}

.exercise-phase ul {
  margin: 0;
  padding-left: 1.15em;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  color: var(--slate);
}

.exercise-phase li strong {
  color: var(--navy);
}

/* --------------------------------------------------------------------------
   26. HERO PHOTO (full-bleed interior-page hero)
   Design pass (2026-07-25): replaces the old text-only page_intro() hero
   band (eyebrow/h1/lede in a left column, the entire right half empty,
   the "flat navy header" the client rejected) on every interior page. The
   photo fills the section edge to edge behind a real scrim element (not a
   ::before, see the z-index contrast trap in DESIGN-NOTES.md), copy sits
   on top inside the normal .container. Reuses the existing .fade-up /
   html.js / IntersectionObserver reveal system: the media wrapper carries
   .fade-up.media-reveal, a scale-only variant (below) instead of the
   default translateY fade, so the photo settles into place instead of
   sliding up.
   -------------------------------------------------------------------------- */
.hero-photo {
  position: relative;
  display: flex;
  align-items: flex-end;
  min-height: clamp(460px, 92vw, 620px);
  padding: 0;
  overflow: hidden;
  background: var(--navy-ink);
}

.hero-photo__media {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}

.hero-photo__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.hero-photo__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(11, 23, 41, 0.22) 0%, rgba(11, 23, 41, 0.42) 38%, rgba(11, 23, 41, 0.95) 100%);
  pointer-events: none;
}

.hero-photo__content {
  position: relative;
  z-index: 2;
  width: 100%;
  padding-block: clamp(2.75rem, 14vw, 4rem) clamp(2rem, 7vw, 3rem);
}

@media (min-width: 900px) {
  .hero-photo {
    min-height: clamp(540px, 56vw, 700px);
    align-items: center;
  }

  .hero-photo__content {
    padding-block: clamp(4rem, 9vw, 6rem);
  }

  .hero-photo__scrim {
    background: linear-gradient(90deg, rgba(11, 23, 41, 0.9) 0%, rgba(11, 23, 41, 0.58) 42%, rgba(11, 23, 41, 0.2) 78%),
      linear-gradient(180deg, rgba(11, 23, 41, 0.12) 0%, rgba(11, 23, 41, 0.5) 100%);
  }
}

/* Scale-only reveal variant of .fade-up, for full-bleed photo media (hero
   photos and .bleed-band below). The wrapper itself stays at its resting
   opacity/transform (overridden back to visible here); only the photo
   inside scales down into place, so a full-bleed hero never opacity-fades
   to blank on load. */
html.js .fade-up.media-reveal {
  opacity: 1;
  transform: none;
}

html.js .fade-up.media-reveal img {
  transform: scale(1.1);
  transition: transform 1.8s cubic-bezier(0.16, 1, 0.3, 1);
}

html.js .fade-up.media-reveal.is-visible img {
  transform: scale(1);
}

/* --------------------------------------------------------------------------
   27. BLEED BAND (editorial full-bleed photo split)
   New component for this design pass, one per interior page: breaks the
   repeating "white card on grey" rhythm the client rejected. The photo
   bleeds to both viewport edges behind an offset, fully opaque copy panel
   (never a transparent overlay, so text contrast never depends on what is
   under it in the photo).
   -------------------------------------------------------------------------- */
.bleed-band {
  position: relative;
  min-height: clamp(420px, 78vw, 560px);
  display: flex;
  align-items: center;
  overflow: hidden;
}

.bleed-band__media {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}

.bleed-band__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.bleed-band > .container {
  position: relative;
  z-index: 1;
}

.bleed-band__panel {
  max-width: 30rem;
  background: var(--navy-ink);
  border: 1px solid var(--hairline);
  border-radius: var(--radius-card);
  padding: var(--space-7);
  box-shadow: var(--shadow-card);
}

@media (min-width: 900px) {
  .bleed-band {
    min-height: clamp(460px, 46vw, 620px);
  }
}

/* Hover-lift on existing photo cards: bento cells (treatment/condition
   grids) and proof-frame photos both get a slow, subtle scale on hover.
   Purely a pointer-driven hover state, no motion runs unprompted, so this
   needs no prefers-reduced-motion guard of its own (the blanket transition
   override in section 23 still collapses it to instant for that media). */
@media (hover: hover) and (pointer: fine) {
  .bento__media img,
  .proof-frame img {
    transition: transform 0.7s cubic-bezier(0.2, 0.7, 0.3, 1);
  }

  .bento__cell:hover .bento__media img,
  .proof-frame:hover img {
    transform: scale(1.045);
  }
}

/* --------------------------------------------------------------------------
   28. PRINT
   Exercise handouts need to come out of the printer as a clean clinical
   sheet: no nav/footer/widgets, black-on-white, phases not split across a
   page break where avoidable.
   -------------------------------------------------------------------------- */
@media print {
  .site-header,
  .nav__mobile,
  .consent-banner,
  .a11y-widget,
  .site-footer,
  .skip-link,
  .cta-band,
  .hero-photo__media,
  .hero-photo__scrim,
  .bleed-band__media,
  .no-print {
    display: none !important;
  }

  body {
    background: #fff !important;
    color: #000 !important;
  }

  .hero,
  .section {
    background: #fff !important;
    padding-block: var(--space-5) !important;
  }

  .hero__title,
  .hero__subtext,
  h1, h2, h3, h4 {
    color: #000 !important;
  }

  .exercise-phase {
    border: 1px solid #999;
    box-shadow: none !important;
    break-inside: avoid;
    page-break-inside: avoid;
  }

  .exercise-phase h3,
  .exercise-phase__cue,
  .exercise-phase li strong {
    color: #000 !important;
  }

  .exercise-phase ul {
    color: #111;
  }

  .safety-note {
    background: #fff !important;
    border: 2px solid #7a1a13;
    break-inside: avoid;
    page-break-inside: avoid;
  }

  /* Bleed band: photo is already hidden above; the panel degrades to a
     plain bordered text block instead of trying to print a navy card. */
  .hero-photo,
  .bleed-band {
    min-height: auto !important;
  }

  .bleed-band__panel {
    background: #fff !important;
    border: 1px solid #999 !important;
    box-shadow: none !important;
    max-width: none !important;
  }

  .bleed-band__panel .eyebrow,
  .bleed-band__panel p {
    color: #000 !important;
  }

  a[href]:after {
    content: none !important;
  }
}
