/* AQF BUILD VERSION: styles.css clean-core v1 | 2026-06-15 | global shell only; legacy page rules moved to legacy-pages.css; About v4 isolated */

:root {
  --aqua: #00AEEF;
  /* The lighter aqua, established on the Max Hypertrophy SOW page: Stuart
     prefers it over --aqua #00AEEF, which "goes muddy on navy" while this holds
     brightness (9.4:1 on the #061426 field there).
     NAMED --aqua-light, NOT --aqua-soft: this file already uses --aqua-soft for
     the near-white #e8f8fc wash, and the SOW sheet uses that same token name for
     THIS colour. Do not merge them. */
  /* =========================================================================
     COLOUR RULE — a value used on desktop MUST be the same value on mobile.
     Breakpoint overrides may change SIZE, SPACING and LAYOUT. They must not
     introduce a colour that does not exist at the other width: nobody ever sees
     the two side by side, so drift goes unnoticed until it is everywhere.
     Caught this way: a third navy (#071d48) living only in the stacked
     split-feature, and an undefined --aqua-dark running on a fallback.
     ========================================================================= */
  --aqua-light: #7FD1F0;
  /* Deep aqua for LIGHT grounds. --aqua #00AEEF scores only 2.1:1 on white and
     --aqua-light is lighter still, so neither is usable on the white cards.
     THE RULE: --aqua-light on dark grounds, --aqua-dark on light ones, --aqua for
     fills/borders where contrast is not carrying meaning.
     This was previously written as `var(--aqua-dark, #007fa9)` with the token
     never defined — it ran on the fallback. */
  --aqua-dark: #007fa9;
  --aqua-soft: #e8f8fc;
  --aqua-wash: #f0fbfd;
  --orange: #E58A22;
  --brand-orange: #F7931F;
  --navy: #071E2D;
  --royal: #000033;
  --white: #ffffff;
  --soft: #f7f8fa;
  --sand: #f3f0ea;
  --sand-light: #faf8f3;
  --soft-blue: #edf9fc;
  --text: #1f2f3d;
  --muted: #5f6f7f;
  --line: rgba(7, 30, 45, 0.12);
  --shadow: 0 20px 50px rgba(7, 30, 45, 0.12);
  --shadow-strong: 0 30px 70px rgba(7, 30, 45, 0.18);
  --serif: "Libre Baskerville", Georgia, serif;
  --sans: "Montserrat", Arial, sans-serif;
}

/* Self-hosted Dubai (Light/Regular/Medium/Bold) */
@font-face { font-family: "Dubai"; src: url("../fonts/Dubai-Light.ttf") format("truetype"); font-weight: 300; font-display: swap; }
@font-face { font-family: "Dubai"; src: url("../fonts/DUBAI-REGULAR.TTF") format("truetype"); font-weight: 400; font-display: swap; }
@font-face { font-family: "Dubai"; src: url("../fonts/DUBAI-MEDIUM.TTF") format("truetype"); font-weight: 500; font-display: swap; }
@font-face { font-family: "Dubai"; src: url("../fonts/DubaiBold.ttf") format("truetype"); font-weight: 700; font-display: swap; }

/* Self-hosted Montserrat + Libre Baskerville — the two global --sans/--serif
   fonts, used site-wide. Replaces the Google Fonts <link> every page used to
   carry (Stuart: site-wide font localization pass). */
@font-face { font-family: "Montserrat"; src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Montserrat"; src: url("../fonts/Montserrat-Italic-VariableFont_wght.ttf") format("truetype"); font-weight: 100 900; font-style: italic; font-display: swap; }
@font-face { font-family: "Libre Baskerville"; src: url("../fonts/LibreBaskerville-Regular.ttf") format("truetype"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "Libre Baskerville"; src: url("../fonts/LibreBaskerville-Italic.ttf") format("truetype"); font-weight: 400; font-style: italic; font-display: swap; }
@font-face { font-family: "Libre Baskerville"; src: url("../fonts/LibreBaskerville-Bold.ttf") format("truetype"); font-weight: 700; font-style: normal; font-display: swap; }

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--sans);
  color: var(--text);
  background: var(--white);
  line-height: 1.7;
  font-size: 16.5px;
  font-weight: 500;
}

/* Long-press on iOS opens a "Save Image" sheet — the touch equivalent of the
   right-click guard in main.js (Stuart, 2026-07-26). Same caveat: a speed bump,
   not protection; a screenshot still works. */
img { max-width: 100%; display: block; -webkit-touch-callout: none; }
a { color: inherit; }

.container {
  width: min(1180px, calc(100% - 40px));
  margin: 0 auto;
}

/* Nav bar height, site-wide. Scales with viewport height: the full 83px wherever there's room
   (desktop/27" — identical to what it has always been), compacting toward 62px only on short
   windows, where a full-height bar costs more than it's worth. The logo tracks it so the two
   never drift. --nav-h is the single source of truth for the bar's height: the Science of Water
   cover subtracts it from 100vh to sit exactly one screen tall, so anything that changes the
   rendered bar height must go through this variable. */
:root { --nav-h: clamp(62px, 36px + 3.6vh, 83px); }

.site-header {
  background: var(--white);
  border-bottom: 1px solid var(--line);
  position: sticky;
  top: 0;
  z-index: 50;
}

.header-inner {
  /* -1px because .site-header adds a 1px bottom border; min-height + border = --nav-h */
  min-height: calc(var(--nav-h) - 1px);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
}

/* Logo art is trimmed flush to its canvas (ratio 4.1:1), so width drives the mark 1:1 and the
   bar height is the real limiter. 240px = 58.6px tall, which fits the full bar with air to spare. */
.brand-logo { width: clamp(205px, 162px + 6vh, 240px); height: auto; }
.menu-toggle { display: none; }

.main-nav {
  display: flex;
  align-items: center;
  gap: 16px;
  font-family: "Dubai", "Montserrat", sans-serif;
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

.main-nav a {
  text-decoration: none;
  color: var(--navy);
  white-space: nowrap;
  transition: color 160ms ease;
}

/* Top-level nav: animated aqua underline (echoes the site line-motif) */
.nav-item {
  position: relative;
  align-self: stretch;
  display: inline-flex;
  align-items: center;
}

.main-nav > a:not(.nav-cta),
.nav-item > a {
  position: relative;
  padding-bottom: 4px;
}

.main-nav > a:not(.nav-cta)::after,
.nav-item > a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 2px;
  background: var(--aqua);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 0.22s ease;
}

.main-nav > a:not(.nav-cta):hover::after,
.nav-item > a:hover::after,
.main-nav > a.active::after,
.nav-item > a.active::after { transform: scaleX(1); }

.main-nav > a.active,
.nav-item > a.active { color: var(--aqua); }

/* Touch targets for the header nav. Measured 26px on iPad landscape (1024),
   where the desktop nav is still shown but every tap is a finger. Keyed on
   hover:none only — no width component — so a mouse-driven desktop keeps the
   compact header it was designed with and nothing shifts there. */
@media (hover: none) {
  .main-nav > a:not(.nav-cta),
  .nav-item > a { padding-top: 9px; padding-bottom: 13px; }
}

/* ==========================================================================
   SCIENCE OF WATER — nav link + research panel
   --------------------------------------------------------------------------
   Deliberately NOT a second Services dropdown. SOW is its own design system
   (premium magazine), so the panel is dark, wider, and type-led: title plus a
   one-line dek, no thumbnails. Type-led reads as editorial; a picture menu
   reads as e-commerce, and images in a nav are slow and busy.
   The link keeps the row's size/weight/tracking so the header rhythm holds —
   the distinction is a small aqua diamond, an old editorial section mark, not
   a different typeface (which would read as a mistake at this size).
   ========================================================================== */
.nav-item--sow > a { padding-left: 14px; }
.nav-item--sow > a::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 6px;
  height: 6px;
  margin-top: -6px;
  background: var(--aqua);
  transform: rotate(45deg);
  transition: background 160ms ease, transform 220ms ease;
}
.nav-item--sow:hover > a::before,
.nav-item--sow > a.active::before { transform: rotate(135deg); }
/* the underline is drawn from left:0, so pull it past the diamond */
.nav-item--sow > a::after { left: 14px; width: calc(100% - 14px); }

.nav-panel {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 60;
  width: 372px;
  padding: 18px 0 8px;
  background: #061426;               /* the SOW navy — see reference_sow_navy_color */
  border: 1px solid rgba(127, 209, 240, 0.16);
  box-shadow: 0 26px 60px rgba(3, 12, 24, 0.42);
  opacity: 0;
  visibility: hidden;
  transform: translateY(6px);
  transition: opacity 180ms ease, transform 180ms ease, visibility 180ms;
}
.nav-item--sow:hover .nav-panel,
.nav-item--sow:focus-within .nav-panel {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.nav-panel__head {
  margin: 0 22px 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(127, 209, 240, 0.16);
  color: var(--aqua-light);          /* dark ground — see the colour rule at top */
  font-size: 0.64rem;
  font-weight: 800;
  letter-spacing: 0.15em;
}
.nav-panel__item {
  display: block;
  /* `.main-nav a` sets white-space:nowrap so top-level links never break. That
     inherits into the panel, where it CLIPPED the long titles and the deks
     instead of wrapping them — measured: "What Happens When You Simply Keep
     Showing Up?" needed 468px inside a 325px column and was silently cut.
     Panel entries are prose, not nav labels, so they must wrap. */
  padding: 11px 22px;
  border-left: 2px solid transparent;
  transition: background 160ms ease, border-color 160ms ease;
}
.nav-panel__item:hover { background: rgba(127, 209, 240, 0.07); border-left-color: var(--aqua); }
.nav-panel__title {
  white-space: normal;   /* beats nowrap inherited from .main-nav a */
  display: block;
  color: var(--white) !important;
  /* MONTSERRAT, NOT the serif. SOW reserves Libre Baskerville for PULL QUOTES
     ONLY ("do not use serif anywhere else") — an earlier build of this panel
     broke that. Montserrat is SOW's stated default AND the only variable sans
     already @font-face'd in styles.css: Cabin and Anton live in sow.css, which
     does not load on the other 11 pages, so either would fall back to a system
     font in the nav everywhere except the SOW pages.
     Distinction from the nav bar comes from WEIGHT, CASE and SIZE — 600 sentence
     case at 15px against the bar's Dubai 700 uppercase at 13px — not from a
     different family. */
  font-family: var(--sans);
  /* ALL CAPS (Stuart, 2026-07-29) for distinction. Caps need tracking to stay
     readable, and they read larger than their point size, so this sits at
     0.86rem/0.09em against the nav bar's Dubai 700 / 0.82rem / 0.05em — same
     case, different family, weight and rhythm, on a dark ground. */
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  line-height: 1.32;
}
.nav-panel__dek {
  white-space: normal;   /* beats nowrap inherited from .main-nav a */
  display: block;
  margin-top: 3px;
  color: rgba(255, 255, 255, 0.62);
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  text-transform: none;
  line-height: 1.4;
}
.nav-panel__all {
  display: block;
  margin: 8px 22px 0;
  padding: 12px 0 4px;
  border-top: 1px solid rgba(127, 209, 240, 0.16);
  color: var(--aqua-light) !important;
  font-size: 0.66rem;
  letter-spacing: 0.12em;
}
.nav-panel__all span { display: inline-block; transition: transform 160ms ease; }
.nav-panel__all:hover span { transform: translateX(4px); }

/* Services dropdown */
.nav-dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 224px;
  background: var(--white);
  border: 1px solid var(--line);
  box-shadow: var(--shadow);
  padding: 8px 0;
  display: flex;
  flex-direction: column;
  opacity: 0;
  visibility: hidden;
  transform: translateY(6px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
  z-index: 60;
}

.nav-item:hover .nav-dropdown,
.nav-item:focus-within .nav-dropdown {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.nav-dropdown a {
  padding: 10px 20px;
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  white-space: nowrap;
  color: var(--navy);
  transition: color 0.16s ease, background 0.16s ease;
}

.nav-dropdown a:hover {
  color: var(--aqua);
  background: var(--aqua-soft);
}

/* current sub-service highlighted inside the dropdown ("you are here") */
.nav-dropdown a.active {
  color: var(--aqua);
  font-weight: 700;
}

.nav-cta {
  background: var(--royal);
  color: var(--white) !important;
  padding: 12px 20px;
  border-radius: 6px;
  font-weight: 600;
  transition: background 160ms ease, color 160ms ease;
}

.nav-cta:hover {
  background: var(--aqua);
  color: var(--navy) !important;
}

.btn {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  min-height: 50px;
  padding: 14px 22px;
  border-radius: 999px;
  text-decoration: none;
  font-weight: 700;
  transition: transform 160ms ease, background 160ms ease, color 160ms ease, border-color 160ms ease;
}

.btn:hover { transform: translateY(-2px); }

.btn-primary { background: var(--brand-orange); color: var(--navy); }
.btn-primary:hover { background: var(--aqua); color: var(--navy); }

.btn-secondary {
  background: transparent;
  border: 2px solid rgba(255,255,255,0.7);
  color: var(--white);
}

.btn-secondary:hover {
  background: transparent;
  border-color: var(--orange);
  color: var(--orange);
}

.btn-outline {
  background: transparent;
  border: 2px solid rgba(0,0,51,0.22);
  color: var(--royal);
}

.btn-outline:hover {
  border-color: var(--aqua);
  color: var(--aqua);
}

/* Inline line-accent CTA — matches About / Client Stories.
   Use for all non-header/footer CTAs. Add .on-dark over imagery. */
.cta-line {
  display: inline-flex;
  align-items: center;
  gap: 16px;
  width: auto;
  padding: clamp(15px, 1.05vw, 21px) clamp(24px, 1.7vw, 34px);
  border: 1px solid rgba(0, 0, 51, 0.72);
  border-radius: 0;
  color: var(--navy);
  background: rgba(255, 255, 255, 0.38);
  font-family: var(--sans);
  font-size: clamp(0.74rem, 0.82vw, 1rem);
  font-weight: 900;
  line-height: 1;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  text-decoration: none;
  transition: border-color 0.22s ease, background 0.22s ease, color 0.22s ease;
}

.cta-line span {
  display: inline-block;
  width: 34px;
  height: 1px;
  background: var(--aqua);
  transition: background 0.22s ease, width 0.22s ease;
}

.cta-line:hover {
  border-color: var(--aqua);
  color: var(--navy);
  background: rgba(0, 174, 239, 0.18);
}

.cta-line:hover span { width: 42px; background: var(--aqua); }

/* On dark backgrounds (hero over imagery) */
.cta-line.on-dark {
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.6);
  background: rgba(255, 255, 255, 0.10);
  backdrop-filter: blur(4px);
}

.cta-line.on-dark:hover {
  border-color: var(--aqua);
  color: var(--white);
  background: rgba(0, 174, 239, 0.22);
}

.btn-row,
.hero-actions,
.center-actions {
  display: flex;
  justify-content: center;
  gap: 14px;
  flex-wrap: wrap;
}

h1, h2, h3 {
  font-family: var(--serif);
  line-height: 1.24;
}

/* Bold aqua qualifier mark (e.g., "Your Pool*") — signals a nuance answered in the body */
.qualifier-star {
  color: var(--aqua);
  font-weight: 900;
}
/* The headline star had nothing to land on, so it read as a broken footnote.
   It is actually doing real work: Stuart does not only train in pools. This
   twin marks the phrase that ANSWERS it ("or open water"), so the eye connects
   headline -> qualifier. Set as a raised, smaller star so it reads as a
   reference mark rather than punctuation inside the sentence. (Stuart's own
   call, 2026-07-26.) */
.qualifier-star--note {
  font-size: 0.7em;
  vertical-align: super;
  line-height: 0;
  margin-left: 1px;
}

.eyebrow,
.pretitle { text-transform: uppercase; }

.hero {
  position: relative;
  /* Fills the screen on a big display instead of stopping at a fixed 610px —
     on a 27" the old value left the hero under half the window (Stuart
     2026-07-26). max() keeps 610px as the FLOOR on short laptop windows, and
     `100vh - --nav-h` makes it exactly one screen below the sticky header on
     anything taller. Source image is 2560x1920 (4:3), so there is ample height
     to crop from as the band gets taller — no upscaling. */
  min-height: max(610px, calc(100vh - var(--nav-h)));
  display: grid;
  place-items: center;
  text-align: center;
  color: var(--white);
  overflow: hidden;
  background:
    linear-gradient(rgba(7, 30, 45, 0.12), rgba(7, 30, 45, 0.22)),
    url("../images/index/hero-lagoon-split.jpg") center center / cover no-repeat;
  background:
    linear-gradient(rgba(7, 30, 45, 0.12), rgba(7, 30, 45, 0.22)),
    image-set(
      url("../images/index/hero-lagoon-split.webp") type("image/webp"),
      url("../images/index/hero-lagoon-split.jpg") type("image/jpeg")
    ) center center / cover no-repeat;
}

.hero-content {
  position: relative;
  z-index: 2;
  max-width: min(1180px, 64vw);
  padding: 80px 0 100px;
}

.pretitle {
  margin: 0 0 22px;
  font-size: 1rem;
  font-weight: 900;
  letter-spacing: 0.16em;
  color: var(--brand-orange);
  text-shadow: 0 1px 2px rgba(0,0,0,0.55), 0 2px 16px rgba(0,0,0,0.4);
}

.pretitle-pill {
  display: inline-flex;
  padding: 10px 20px;
  border-radius: 0;
  background: rgba(255,255,255,0.10);
  border: 1px solid rgba(255,255,255,0.55);
  color: var(--white);
  backdrop-filter: blur(6px);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.22em;
}

/* Bespoke hero eyebrow — flanking aqua rules, no chip (lets imagery read through) */
.pretitle-rule {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  color: var(--white);
  font-size: 0.82rem;
  font-weight: 800;
  letter-spacing: 0.24em;
}

.pretitle-rule::before,
.pretitle-rule::after {
  content: "";
  display: inline-block;
  width: 42px;
  height: 1px;
  background: var(--aqua);
  flex: 0 0 auto;
}

/* Services hero eyebrow names all 3 services — tighten so it holds one line */
.services-hero .pretitle-rule {
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  white-space: nowrap;
}

.services-hero .pretitle-rule::before,
.services-hero .pretitle-rule::after { width: 30px; }

/* Hero-eyebrow SIZE + WEIGHT uniformity (0.82rem / 800). Colors & accent lines left per page. */
.aqfit-hero .pretitle,
.hydro-v3-kicker,
.sp-kicker,
.science-hero .pretitle,
.aqf4-hero-v2-eyebrow {
  font-size: 0.82rem !important;
  font-weight: 800 !important;
}

/* Hero photo credit — editorial, bottom-right */
.hero-credit {
  position: absolute;
  right: 24px;
  bottom: 20px;
  z-index: 2;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;
  padding-left: 12px;
  border-left: 2px solid var(--aqua);
  text-align: left;
  /* Was a flat 0.66rem (10.56px) on desktop and tablet while the phone override
     had already been raised to 0.72rem — so the smallest type on the site sat
     BELOW the 11.5px floor everywhere except the phone. Floor now matches the
     phone value and the vw term lets it grow on a 27" instead of freezing at a
     1440-era size. Nothing below ~1985px changes. */
  font-size: clamp(0.72rem, 0.58vw, 0.95rem);
  font-weight: 600;
  letter-spacing: 0.08em;
  line-height: 1.4;
  color: rgba(255,255,255,0.88);
  text-shadow: 0 1px 6px rgba(0,0,0,0.45);
}

.hero-credit span:first-child {
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.13em;
}

/* The home hero's bottom-right already carries the client/location caption, so
   the photography credit joins that block as a third line rather than floating
   a second credit in the opposite corner (2026-07-26). Set lighter and without
   the caption's wide tracking so the client + location lines stay primary. */
.hero-credit .hero-credit__photo {
  margin-top: 5px;
  font-weight: 500;
  letter-spacing: 0.035em;
  /* Colour matched to .since below (Stuart 2026-07-29): it was rgba(...,0.66)
     against the caption's effective 0.79 and read as fading out. Inheriting the
     block colour with the same 0.9 opacity as .since puts it on exactly the same
     value. Weight (500 vs 600) and the tighter tracking are what keep it
     subordinate to the client/location lines — the colour no longer has to. */
  opacity: 0.9;
}

.hero-credit .since {
  font-weight: 600;
  font-style: normal;
  text-transform: lowercase;
  letter-spacing: 0.06em;
  opacity: 0.9;
}

.hero h1 {
  margin: 0;
  /* Raised with the section headings — once those went to 3.3vw the h1 at 3.2vw
     was SMALLER than every h2 beneath it, inverting the hierarchy. The page
     title has to outrank its sections. */
  font-size: clamp(2.15rem, 4.3vw, 5.4rem);
  line-height: 1.18;
  letter-spacing: -0.025em;
  /* The title sits over sky/cloud, not the waterfall — 38% of that area is
     brighter than 180/255, putting white text at a 2.08:1 contrast ratio (WCAG
     wants 3:1 even for large text). The old shadow was a single WIDE, soft 30%
     glow, which is why the title read worse than the eyebrow above it despite
     being bigger. Two layers now: a tight 1px edge that defines the letterform
     against cloud, plus a soft halo that lifts it off the sky. Thin, not
     embossed. (Stuart's girlfriend spotted this on a phone, 2026-07-26.) */
  text-shadow: 0 1px 2px rgba(4, 20, 38, 0.6), 0 3px 18px rgba(4, 20, 38, 0.5);
}

.hero-subtitle {
  /* The hero lead has to outrank the section callouts beneath it — those went to
     1.14rem, which left this at 1.15rem effectively tied with them. */
  max-width: min(1080px, 58vw);
  margin: 28px auto 0;
  font-size: clamp(1.2rem, 1.47vw, 1.75rem);
  font-weight: 600;
  color: rgba(255,255,255,0.94);
  text-shadow: 0 1px 2px rgba(0,0,0,0.5), 0 2px 16px rgba(0,0,0,0.42);
}

.hero-actions { margin-top: 34px; }

.page-hero {
  background:
    linear-gradient(rgba(0, 0, 51, 0.68), rgba(0, 0, 51, 0.80)),
    url("../images/hero/DSCF1537.JPG") center center / cover no-repeat;
  color: var(--white);
  text-align: center;
  padding: 104px 0 96px;
}

.services-hero {
  /* Fits ONE screen — never make the reader scroll just to see the hero
     (Stuart 2026-07-26). --nav-h is the sticky header's real height, so the box
     tops out at exactly the space below it; the generous padding compresses on
     short windows via clamp instead of pushing the CTA below the fold. */
  min-height: min(560px, calc(100vh - var(--nav-h)));
  display: grid;
  align-items: center;
  text-align: left;
  padding-top: clamp(48px, 8vh, 150px);
  padding-bottom: clamp(48px, 8vh, 150px);
  /* DESKTOP SCRIM — DELIBERATELY UNCHANGED (Stuart, 2026-07-29).
     Item #14 was scoped by Stuart to "phone vert/horz + iPad vert". I briefly
     lightened this to .72 as well; he asked to keep desktop as is, so these are
     the ORIGINAL values. Do not lighten them again without asking.

     WHY lightening this achieves nothing anyway — measured, worth keeping:
     the PHOTOGRAPH's own left 30% is essentially black (mean luminance 9-21 of
     255) and the copy sits over the left 37.5%. The darkness there is the image,
     not the scrim, so dropping .97 -> .72 was visually undetectable. Re-framing
     cannot fix it either: 3460x1440 source in a 1280x575 box means `cover`
     yields only ~102px of horizontal slack (~8%) — far too little to move a
     30%-wide black band off the copy. The real options are a re-crop of the
     source, flipping the copy to the bright right side, or a different frame.
     Stuart has parked that; small screens dodge it via 72% 42% framing below.

     BOTH `background` declarations must stay in sync: first is the plain-url
     fallback, second the image-set upgrade. Editing one silently reverts the
     other path. */
  background:
    linear-gradient(to right, rgba(4, 8, 32, 0.97) 0%, rgba(4, 8, 32, 0.95) 22%, rgba(4, 8, 32, 0.68) 33%, rgba(4, 8, 32, 0.26) 42%, rgba(4, 8, 32, 0) 50%),
    url("../images/services/hero-services.jpg") center center / cover no-repeat;
  background:
    linear-gradient(to right, rgba(4, 8, 32, 0.97) 0%, rgba(4, 8, 32, 0.95) 22%, rgba(4, 8, 32, 0.68) 33%, rgba(4, 8, 32, 0.26) 42%, rgba(4, 8, 32, 0) 50%),
    image-set(
      url("../images/services/hero-services.webp") type("image/webp"),
      url("../images/services/hero-services.jpg") type("image/jpeg")
    ) center center / cover no-repeat;
}

/* Services hero: left-aligned editorial layout so the rule-of-thirds photo reads clean */
.page-hero.services-hero h1 {
  margin: 0;
  max-width: 480px;
  font-size: clamp(2.4rem, 4.6vw, 4.2rem);
  line-height: 1.04;
  text-align: left;
}

.page-hero.services-hero p {
  margin: 24px 0 0;
  max-width: 430px;
}

.page-hero.services-hero .hero-actions { justify-content: flex-start; text-align: left; }

.services-hero .pretitle-rule { justify-content: flex-start; }
.services-hero .pretitle-rule::after { display: none; }

.eyebrow {
  display: inline-flex;
  margin-bottom: 18px;
  padding: 8px 14px;
  border-radius: 999px;
  background: rgba(255,255,255,0.14);
  border: 1px solid rgba(255,255,255,0.24);
  color: var(--brand-orange);
  font-size: 0.78rem;
  font-weight: 900;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  backdrop-filter: blur(6px);
}

.page-hero h1 {
  max-width: 900px;
  margin: 0 auto;
  color: var(--white);
  font-size: clamp(2rem, 3.2vw, 3.75rem);
  letter-spacing: -0.025em;
  text-shadow: 0 4px 22px rgba(0,0,0,0.28);
}

.page-hero p {
  max-width: 770px;
  margin: 28px auto 0;
  color: rgba(255,255,255,0.86);
  font-size: 1.1rem;
  font-weight: 600;
}

.signature,
.intro {
  background:
    radial-gradient(circle at top left, rgba(0,174,239,0.08), transparent 34%),
    var(--white);
  padding: 74px 0 46px;
  text-align: center;
}

.small-label,
.signature .small-label,
.intro .small-label,
.split-content .small-label {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 18px;
  color: var(--royal);
  /* SITE-WIDE. Was a flat 0.74rem, so every eyebrow on every page stayed 11.8px
     on a 2560 monitor — frozen at the size it was drawn for at 1440. The floor
     is unchanged, so NOTHING below ~1910px moves at all (0.62vw only overtakes
     0.74rem past that width); at 2560 it reaches 15.9px. Verified at 1440: still
     11.84px to the decimal. */
  font-size: clamp(0.74rem, 0.62vw, 1rem);
  font-weight: 900;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.small-label::before,
.small-label::after {
  content: "";
  width: 28px;
  height: 2px;
  background: var(--aqua);
  flex-shrink: 0;
}

/* Left-aligned sections: label sits at the margin, line trails after it */
.split-content .small-label::before { display: none; }

/* Color categorization system: default aqua = science/method; add .warm = human/story (orange) */
.small-label.warm::before,
.small-label.warm::after { background: var(--brand-orange); }

.signature h2,
.intro h2,
.why h2,
.services h2,
.method-section h2,
.cta-box h2,
.section-heading h2 {
  margin: 0;
}

.signature h2,
.intro h2 {
  color: var(--navy);
  /* Home section headings ran 34-39px while About's run to ~57px at the same
     width — the home page was quietly the smallest-set page on the site
     (Stuart 2026-07-26). Raised toward About's scale; the sections already had
     the vertical slack, so nothing gets taller. */
  font-size: clamp(1.9rem, 3.3vw, 4rem);
}

.signature p,
.intro p {
  /* Half a step up from 1.03rem — this paragraph carries the site's single best
     differentiator and was reading small next to the other pages (Stuart
     2026-07-26). The measure widens with it (850 -> 940) so the copy still
     lands on THREE lines instead of spilling to four. */
  max-width: min(1180px, 65vw);
  margin: 18px auto 0;
  color: var(--muted);
  font-size: clamp(1.05rem, 1.245vw, 1.5rem);
  font-weight: 600;
}

/* ---------------------------------------------------------------------------
   IMAGE LIGHTBOX  ·  moved here from about-v4.css 2026-07-26
   Was inline to the About page; the home-page triptych now uses it too, so it
   lives in the shared sheet with its class names unchanged (about.html markup
   did not need touching). Behaviour is in main.js — one copy, not two.
   --------------------------------------------------------------------------- */
.aqf4-lightbox-trigger {
  display: block;
  border: 0;
  padding: 0;
  color: inherit;
  text-decoration: none;
  cursor: zoom-in;
}

.aqf4-lightbox-trigger:hover img {
  transform: scale(1.025);
}

.aqf4-lightbox-trigger img {
  transition: transform .32s ease;
}

/* ENVIRONMENT PREMIUM LIGHTBOX
   Section: Real-World Environments
   Purpose: Adds a refined full-screen image preview for environment cards. */
.aqf4-lightbox {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 28px;
  background:
    radial-gradient(circle at 50% 45%, rgba(0,174,239,.13), rgba(0,0,51,0) 42%),
    rgba(0,0,51,.88);
  backdrop-filter: blur(10px);
}

.aqf4-lightbox.is-open {
  display: flex;
}

.aqf4-lightbox-panel {
  width: min(1120px, 92vw);
  max-height: 88vh;
  display: grid;
  gap: 14px;
}

.aqf4-lightbox-img {
  width: 100%;
  max-height: 78vh;
  object-fit: contain;
  border-radius: 18px;
  box-shadow: 0 28px 80px rgba(0,0,0,.42);
  background: rgba(255,255,255,.06);
}

.aqf4-lightbox-caption {
  margin: 0;
  color: #fff;
  font-family: var(--aqf-sans);
  font-size: .78rem;
  font-weight: 900;
  letter-spacing: .14em;
  text-align: center;
  text-transform: uppercase;
  text-shadow: 0 2px 16px rgba(0,0,51,.9);
}

.aqf4-lightbox-close {
  position: fixed;
  top: 22px;
  right: 24px;
  z-index: 10000;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255,255,255,.44);
  border-radius: 999px;
  color: #fff;
  background: rgba(0,0,51,.42);
  font-size: 2rem;
  line-height: 1;
  cursor: pointer;
}

.aqf4-lightbox-close:hover {
  border-color: var(--aqf-blue);
  background: rgba(0,174,239,.16);
}

/* ENVIRONMENT LIGHTBOX ARROWS
   Section: Real-World Environments
   Purpose: Adds premium previous/next controls to the lightbox gallery. */
.aqf4-lightbox-arrow {
  position: fixed;
  top: 50%;
  z-index: 10000;
  width: 52px;
  height: 52px;
  border: 1px solid rgba(255,255,255,.44);
  border-radius: 999px;
  color: #fff;
  background: rgba(0,0,51,.42);
  font-family: Georgia, serif;
  font-size: 3rem;
  line-height: .82;
  cursor: pointer;
  transform: translateY(-50%);
}

.aqf4-lightbox-prev {
  left: 24px;
}

.aqf4-lightbox-next {
  right: 24px;
}

.aqf4-lightbox-arrow:hover {
  border-color: var(--aqf-blue);
  background: rgba(0,174,239,.16);
}

/* ---------------------------------------------------------------------------
   SIGNATURE TRIPTYCH  ·  2026-07-26
   "Your Pool* Becomes the Studio" was the thinnest section on the page despite
   carrying the single best differentiator. Three images prove the claim the
   asterisk makes — it is NOT only pools — faster than the sentence does.

   Deliberately NOT a full-bleed photo band: this section sits directly under the
   hero, which is already a full-bleed photo, and stacking two would dilute both.

   Sized and captioned to MATCH .aqf4-env-grid on the About page (Stuart's call:
   "similar to the about page but three vs 5") — 16:9, capped at 260px, centred,
   caption overlaid bottom-left over a gradient scrim. 16:9 holds on phones too.
   --------------------------------------------------------------------------- */
.signature-triptych {
  display: grid;
  /* 320px, Stuart's call. Wider than About's 260px cap — that value is sized
     for FIVE across and three have more room — but held back from filling the
     row, so the trio still reads as a supporting note under the copy rather
     than a feature band. At 16:9 that is 320x180 per card. */
  grid-template-columns: repeat(3, minmax(240px, 320px));
  gap: 14px;
  justify-content: center;
  width: min(92vw, 1360px);
  max-width: 100%;
  margin: 34px auto 0;
}
/* NB: these are <a class="aqf4-lightbox-trigger">, not <figure> — an earlier
   pass styled `figure` here, so after the lightbox conversion nothing was
   position:relative and the absolutely-positioned captions escaped the cards
   entirely, landing over the hero. Selector must match the anchor. */
.signature-triptych > a {
  display: block;
  position: relative;
  margin: 0;
  aspect-ratio: 16 / 9;
  border-radius: 16px;
  overflow: hidden;
  box-shadow: 0 22px 54px rgba(0, 0, 51, 0.14);
  background: #fff;
}
.signature-triptych img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* scrim so the overlaid caption holds over any image */
.signature-triptych > a::after {
  content: "";
  position: absolute;
  inset: auto 0 0;
  height: 44%;
  background: linear-gradient(0deg, rgba(0, 0, 51, 0.62), rgba(0, 0, 51, 0));
}
.signature-triptych figcaption {
  position: absolute;
  left: 15px;
  bottom: 13px;
  z-index: 2;
  max-width: calc(100% - 30px);
  color: #fff;
  font-family: var(--sans);
  /* floor raised 0.68rem -> 0.74rem: 0.68 rendered at 10.88px, under the 11.5px
     minimum the rest of the page's small type was lifted to. The 0.76vw term
     collapses on a phone, so the FLOOR is the value that ships there. */
  font-size: clamp(0.74rem, 0.76vw, 0.88rem);
  font-weight: 800;
  letter-spacing: 0.14em;
  line-height: 1.25;
  text-transform: uppercase;
  text-shadow: 0 2px 16px rgba(0, 0, 51, 0.92), 0 0 10px rgba(0, 0, 51, 0.45);
}
@media (max-width: 760px) {
  .signature-triptych { grid-template-columns: minmax(0, 340px); gap: 16px; }
}

.credibility-band {
  background: var(--white);
  /* The band used to sit flush against the full-bleed image section below it
     (0px gap) — no visual break at all. Padding gives the tiles room to breathe
     and leaves a white margin between the band and the image (Stuart
     2026-07-26). */
  padding: 18px 0 34px;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  box-shadow: 0 10px 30px rgba(7, 30, 45, 0.04);
  color: var(--text);
}

.credibility-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}

.credibility-item {
  padding: 24px 18px;
  text-align: center;
  border-right: 1px solid var(--line);
}

.credibility-item:last-child { border-right: 0; }

.credibility-icon {
  /* 52px, up from 40px (Stuart 2026-07-26). The wrapper is the single control:
     the <img> tags carry an inline width:42px, so without the img rule below
     they would cap at 42 and ignore any wrapper larger than that. */
  width: 52px;
  height: 52px;
  margin: 0 auto 12px;
  color: var(--aqua);
}

/* beat the inline width/height on the base64 <img> icons so the wrapper governs */
.credibility-icon img {
  width: 100% !important;
  height: 100% !important;
  object-fit: contain;
}

.credibility-icon svg {
  width: 100%;
  height: 100%;
  fill: currentColor;
  stroke: none;
}

.credibility-item strong {
  display: block;
  color: var(--royal);
  font-family: var(--serif);
  font-size: 1.28rem;
  line-height: 1.15;
  margin-bottom: 6px;
}

.credibility-item span {
  display: block;
  color: var(--muted);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.045em;
  text-transform: uppercase;
}

/* .page-hero itself is deliberately NOT made relative — it is shared by several
   pages and promoting it would repaint it above non-positioned siblings. Only the
   two variants that carry a photo credit are promoted, and .contact-layout
   already sits at z-index 3 so its hero overlap is unaffected. */
.services-hero,
.contact-hero { position: relative; }

/* Shared photo credit — sits quietly in the bottom-right of a hero image.
   Requires its parent to be position:relative (every hero it is used in
   already is; verified before use). Small, low-contrast and set in the sans
   so it reads as a credit line, never as content. */
.photo-credit {
  position: absolute;
  right: clamp(14px, 2.2vw, 26px);
  /* 18px, not 11px — at 11 the credit read as "right near the edge" against the
     next section on a capped hero (Stuart 2026-07-26). */
  bottom: 18px;
  z-index: 5;
  margin: 0;
  font-family: var(--sans);
  /* 600/0.72rem/.86, not 500/0.66rem/.72 — Stuart: the lighter setting "barely
     shows up" over a photo. Still a credit, not a caption: the home page's own
     .hero-credit__photo stays deliberately quieter because it sits inside an
     existing caption block rather than alone on the image. */
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.035em;
  line-height: 1;
  color: rgba(255, 255, 255, 0.86);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55);
}

/* .page-hero styles its <p> children (size + colour), which would otherwise make
   the credit larger and brighter here than on every other page. Re-assert it so
   the credit reads identically site-wide. */
.page-hero .photo-credit {
  font-size: 0.72rem;
  font-weight: 600;
  line-height: 1;
  color: rgba(255, 255, 255, 0.86);
}
/* The contact form card overlaps this hero by 70px (56px on phones) and paints
   above it, which would bury the credit under the white panel. Lift it clear. */
.contact-hero .photo-credit { bottom: 84px; }

/* Photo credits on AI-enhanced images carry a "View Original" trigger — a few
   images on this site are digitally enhanced versions of Stuart's own photos,
   and the original is one click away. Deliberately NON-INTRUSIVE: no colour
   shift and no underline at rest; only a faint underline on hover reveals it.
   Inherits everything from its parent credit so each page's own credit styling
   wins. Credits on unenhanced photos are plain text and carry no trigger. */
.original-link {
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color 0.22s ease;
}
.original-link:hover { border-bottom-color: currentColor; }
.original-link:focus-visible {
  outline: 2px solid var(--brand-orange);
  outline-offset: 2px;
}

/* --- "View Original" modal (opened by .original-link; markup injected by
   main.js). A small closable panel rather than a page navigation, so the
   reader never loses their place. Sized around a 16:9 photograph. --- */
.original-modal {
  width: min(760px, calc(100% - 40px));
  max-height: min(88vh, 780px);
  padding: 34px 34px 28px;
  border: 0;
  border-radius: 16px;
  background: var(--white);
  color: var(--text);
  box-shadow: 0 30px 80px rgba(7, 30, 45, 0.32);
  overflow-y: auto;
}
.original-modal::backdrop { background: rgba(7, 20, 38, 0.62); }
.original-modal__close {
  position: absolute;
  top: 12px;
  right: 14px;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--muted);
  font-size: 1.6rem;
  line-height: 1;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}
.original-modal__close:hover { background: var(--soft); color: var(--royal); }
.original-modal__label {
  margin: 0 0 14px;
  /* navy, not orange: on the white panel the brand navy reads as a title rather
     than an accent, and it pops harder against the aqua-heavy photo below
     (Stuart, 2026-07-26). */
  color: #000033;
  font-family: var(--sans);
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.original-modal__figure { margin: 0; }
/* Credit sits directly under the photo so a screengrab of the modal carries the
   attribution with it (Stuart, 2026-07-26). */
.original-modal__figure figcaption {
  margin-top: 9px;
  font-family: var(--sans);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: #000033;
  text-align: right;
}
.original-modal__figure img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 10px;
  background: var(--soft);
}
@media (max-width: 560px) {
  .original-modal { padding: 30px 18px 24px; border-radius: 14px; }
}

/* The Miami + Sarasota tile links to the coverage maps — it's the one spot on the
   home page that answers "do they cover me?". No visible link text (Stuart): the
   whole tile is the link, and the hover treatment below signals it. */
.credibility-maplink {
  position: absolute;
  inset: 0;
  text-indent: -9999px;
  /* NOT overflow:hidden — the .hover-tip bubble sits ABOVE this box and would be
     clipped away. The anchor is empty (its name comes from aria-label), so there
     is no stray text for overflow to have been hiding. */
  overflow: visible;
}
.credibility-maplink:focus-visible {
  outline: 2px solid var(--brand-orange);
  outline-offset: 4px;
  text-indent: 0;
}

/* Hovering anywhere on the Miami + Sarasota tile turns its icon AND copy orange,
   so the whole tile reads as one linked object. The icon is a base64 <img>, so
   currentColor can't reach it — a filter chain recolours it to --brand-orange
   (#F7931F), same technique as the SOW cover's book icon. */
.credibility-item:has(.credibility-maplink) strong,
.credibility-item:has(.credibility-maplink) > span,
.credibility-item:has(.credibility-maplink) .credibility-icon img {
  transition: color 0.22s ease, filter 0.22s ease, transform 0.22s ease;
}
/* icon lifts + grows slightly on hover */
.credibility-item:has(.credibility-maplink):hover .credibility-icon img {
  transform: translateY(-3px) scale(1.06);
}
.credibility-item:has(.credibility-maplink):hover strong { color: var(--brand-orange); }
.credibility-item:has(.credibility-maplink):hover > span { color: var(--brand-orange); }
.credibility-item:has(.credibility-maplink):hover .credibility-icon img {
  filter: brightness(0) saturate(100%) invert(64%) sepia(64%) saturate(1943%) hue-rotate(346deg) brightness(101%) contrast(94%) !important;
}
/* whole tile clickable — stretched link, so the hover and the click agree */
.credibility-item:has(.credibility-maplink) { position: relative; cursor: pointer; }
.credibility-maplink::after { content: ""; position: absolute; inset: 0; }

/* ---------------------------------------------------------------------------
   HOVER SWAP — a line of text that becomes a call-to-action on hover.
     <span class="hover-swap" data-tip="View our service areas">Designated service areas</span>
   ...inside a container that also holds the real link.

   The replacement is an ::after pinned to `inset: 0` OF THE LINE ITSELF, so it
   occupies the exact same box as the text it replaces — identical position is
   guaranteed by construction, not by matching offsets by hand (an earlier pass
   positioned it independently and had to chase the numbers).

   The original text goes `color: transparent` rather than `opacity: 0`, because
   ::after is its CHILD and would fade out with it.

   Deliberately plain text, not a bubble: a pill here read as "a pill you want to
   click" (Stuart) — a second button competing with the tile that IS the link.

   NOTE: hover does not exist on touch, so a phone only ever sees the original
   label. Never put information that is ONLY available via .hover-swap.
   --------------------------------------------------------------------------- */
.hover-swap { position: relative; }
.hover-swap::after {
  content: attr(data-tip);
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: var(--brand-orange);
  opacity: 0;
  transition: opacity 0.22s ease;
  pointer-events: none;
  white-space: nowrap;
}
.credibility-item:has(.credibility-maplink) > .hover-swap { transition: color 0.22s ease; }
.credibility-item:has(.credibility-maplink):hover > .hover-swap,
.credibility-item:has(.credibility-maplink):focus-within > .hover-swap { color: transparent; }
.credibility-item:has(.credibility-maplink):hover > .hover-swap::after,
.credibility-item:has(.credibility-maplink):focus-within > .hover-swap::after { opacity: 1; }

/* =============================================================================
   FOUNDER BAND  ·  index.html only  ·  built 2026-07-28
   =============================================================================
   ⚠️  READ BEFORE CHANGING THE IMAGE OR THE COLOUR — three things here are
       COUPLED. Change one without the others and it breaks visibly.

   1. THE BLEND IS BAKED INTO THE JPEG, NOT DONE IN CSS.
      assets/images/index/founder-hat.jpg is a 2560x1150 composite: the photo is
      drawn 2044px wide at x=-350 over a flat #061426 ground, with a gradient
      into that same navy from x=1010 to x=1400. There is NO CSS mask.
      -> You cannot brightness/colour-correct this file. Editing it also edits
         the baked navy. Re-bake from the ORIGINAL frame instead:
         founder-hat-source.jpg (QUARANTINED 2026-07-30 -> aqf-quarantine/unused-assets-2026-07-30/)

   2. THE SECTION BACKGROUND MUST EQUAL THE BAKED NAVY, EXACTLY.
      Both are flat #061426. If they differ by even a shade, the point where the
      image ends becomes a visible vertical seam. Change one, change both.
      (This section uses the ink navy; "The Science Behind the Water" stays on
      the ROYAL navy #000033->#050545 on purpose. Not a site-wide sweep.)

   3. THE GEOMETRY WAS MEASURED, NOT EYEballed. Keep these if you re-bake:
         subject occupies      2% -> 42%   (ends 1075px of 2560)
         fade runs            39% -> 55%   (1010px -> 1400px)
         solid navy from      55%
         copy column starts   52%
      The 42%/52% gap is the whole point: the fade must be SPENT before the copy
      starts, or his raised right hand sits under the text.

   4. background-position X IS INERT HERE. Band is 2.25 aspect, image is 2.23,
      so `cover` fills by WIDTH and there is zero horizontal slack. Nudging the
      X value does nothing — reframe by re-baking. (Same trap as the Showing Up
      hero; see reference_browser_pane_gotchas.)

   WHY IT LOOKS LIKE THIS: the page had no photograph of Stuart anywhere while
   About is full of him. This is the "who delivers it" beat, placed between
   Exclusive Services (what you buy) and Why Choose (why him). Earlier attempts
   as a contained card read as "another box", and as a CSS-masked bleed the
   scrim landed on his face — he occupies half the frame width, and a scrim has
   to clear its subject where a baked blend does not.
   ============================================================================= */
.founder-band {
  position: relative;
  display: flex;
  align-items: center;
  /* The 700px cap used to stop here. On a wide screen that left the band SHORT
     while `cover` still rendered the image at (band width / 2.226) — 1143px at
     2560 — and the 351px surplus was cropped off the top and bottom, taking
     Stuart's cap with it (measured: clipped by 150px at 2560, 11px at 1920).
     Letting the band grow with the viewport keeps the image nearly uncropped.
     44vw is just under the 44.92vw ceiling, so this stays fill-by-width.
     Below ~1590px the 44vw term is what binds, so laptops are unaffected. */
  min-height: clamp(480px, 44vw, 1100px);
  /* ⚠️ THIS PADDING IS A HEIGHT BUDGET, NOT A STYLE CHOICE.
     founder-hat.jpg is 2560x1150 (aspect 2.226). `cover` fills by WIDTH only
     while the band stays wider than that ratio; the moment the band gets TALLER
     than width / 2.226 it flips to filling by HEIGHT, crops horizontally, and
     drags the baked navy field off the mark the copy is positioned against.
     The ceiling is width/2.226 = 575px @1280, 614px @1366, 647px @1440.
     Measured: the band must stay at/below ~570px to clear every laptop width.
     Adding copy or padding here silently breaks the bleed on 1280-1440 screens
     while still looking perfect on a 27". Measure after any change. */
  padding: clamp(34px, 2.9vw, 72px) 0;
  /* FLAT #061426 — must match the navy baked into founder-hat.jpg exactly, or
     the seam where the image ends becomes visible. Stuart's call to use the ink
     navy here; note the Science section stays on the ROYAL navy deliberately
     (see reference_sow_navy_color) — this is not a site-wide sweep. */
  background: #061426;
  color: var(--white);
  overflow: hidden;
  isolation: isolate;
}
.founder-band__media {
  position: absolute;
  inset: 0;
  z-index: 0;
  /* The photo->navy blend is BAKED INTO THE FILE (Stuart's method, same as the
     Max Hypertrophy hero). No CSS mask: the canvas is 2560x1150 with the photo
     drawn 2044px wide at x=-350 and a gradient into #020239 from 44% to 69%.
     Measured result: subject occupies 2%-42%, copy column starts at 52%, so
     there is a 10% gap and nothing lands on his face or shoulders.
     Baking it also sidesteps the inert-X-position trap — the framing is fixed
     in the file rather than negotiated with `cover`. */
  background: url("../images/index/founder-hat.jpg?v=6") center center / cover no-repeat;
}
/* light steadier under the copy only — the blend is already in the image */
.founder-band::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(90deg, rgba(6,20,38,0) 48%, rgba(6,20,38,.16) 62%, rgba(6,20,38,.24) 100%);
}
.founder-band__inner {
  position: relative;
  z-index: 2;
  /* FULL WIDTH on purpose, not the usual 1180px page container. The baked fade
     is positioned as a PERCENTAGE OF THE IMAGE, so the copy has to be measured
     in the same coordinate system. Inside a centred 1180px container the copy
     landed at 50% of the band on a 2560px screen — i.e. before the fade had
     finished resolving at 55% — while looking fine at 1440. */
  width: 100%;
  margin-inline: auto;
}
.founder-band__copy {
  /* 57% clears the baked fade (solid navy at 55%) at EVERY width, because it is
     a share of the band rather than of a fixed-width container.
     The right gutter is deliberately small: a narrower column means more lines,
     more lines means a taller band, and a taller band flips `cover` to fill by
     height and breaks the bleed (see the padding note above). 3% is the widest
     gutter that still clears the ceiling at 1280-1440.
     max-width caps the measure so the copy does not run to ~1050px on a 27". */
  margin-left: 57%;
  margin-right: 3%;
  width: auto;
  max-width: 880px;
}
/* 1280-1400 has no height budget left: at 57% the column drops to ~506-540px,
   gains a line, and overruns the ceiling (by 21px at 1280, by 1px at 1366).
   53% is the furthest right these widths can afford — it starts just inside the
   tail of the fade rather than fully clear of it. Measured, not guessed: 1366
   fails at 57% and passes at 53%, so the cutoff sits above it, not below.
   Re-baking founder-hat.jpg taller would raise the ceiling and let these widths
   match the 57% used everywhere else. */
@media (min-width: 861px) and (max-width: 1400px) {
  .founder-band__copy { margin-left: 53%; }
}
.founder-band__copy .small-label { color: var(--aqua-light); }
.founder-band__copy h2 {
  margin: 12px 0 20px;
  color: var(--white);
  font-size: clamp(1.9rem, 3.3vw, 4rem);
  line-height: 1.12;
}
.founder-band__copy p {
  margin: 0 0 16px;
  color: rgba(255,255,255,0.90);
  font-size: clamp(1.05rem, 1.267vw, 1.5rem);
  font-weight: 500;
  line-height: 1.68;
}
.founder-band__copy .cta-line { margin-top: 12px; }

/* PHONE / SMALL TABLET — photo STACKS above the copy rather than sitting behind
   it. Three reasons this is not just a narrower version of the desktop layout:
     · the image is a BAKED composite whose navy lives in its right 45% — at this
       width that half is cropped away entirely, so there is no baked ground for
       the copy to sit on and it would need a scrim the desktop does not need;
     · the band flips to 0.64 aspect against the image's 2.23, so `cover` fills by
       HEIGHT here (the opposite of desktop) and the horizontal position becomes
       live — left-aligned keeps the subject in frame;
     · the previous version of this block was left over from the CSS-mask attempt
       and applied a VERTICAL mask over the baked horizontal blend, plus a scrim
       still using the old royal navy. Both were wrong once the bake landed. */
@media (max-width: 860px) {
  .founder-band {
    display: block;
    min-height: 0;
    padding: 0 0 clamp(38px, 8vw, 60px);
  }
  .founder-band__media {
    position: relative;
    height: clamp(250px, 60vw, 380px);
    /* DIFFERENT FILE ON PHONE — founder-hat-mobile.jpg, the un-baked frame.
       Stacked, the image sits ABOVE the copy instead of behind it, so the baked
       navy field and its fade have no job to do here: they just showed as a grey
       wash across the right of the photo. This is the plain 1600x900 photo
       (289 KB, downscaled from founder-hat-source.jpg — the 3840x2160 source is
       1.4 MB and must never be served to a phone).
       Centred, not left: this frame is uncropped, so Stuart sits mid-frame. */
    background-image: url("../images/index/founder-hat-mobile.jpg?v=1");
    background-position: center center;
    -webkit-mask-image: none;
    mask-image: none;
  }
  .founder-band::before { display: none; }   /* no copy over the photo here */
  .founder-band__inner { padding-top: clamp(30px, 7vw, 46px); }
  /* reset every part of the desktop 57%/3%/880px anchor — stacked layout here */
  .founder-band__copy {
    width: 100%;
    margin-left: 0;
    margin-right: 0;
    max-width: none;
  }
  .founder-band__inner { width: min(1180px, calc(100% - 40px)); }
}

.split-section {
  padding: 88px 0;
  background: var(--sand-light);
}

.split-grid {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: 58px;
  align-items: center;
}

.split-content h2 {
  margin: 0 0 18px;
  color: var(--navy);
  font-size: clamp(1.9rem, 3.3vw, 4rem);
}

.split-content p {
  color: var(--muted);
  font-weight: 600;
  text-align: justify;
}

.split-image {
  border-radius: 24px;
  overflow: hidden;
  box-shadow: var(--shadow-strong);
}

/* Full-bleed feature band: image bleeds full-width, text panel overlaid left (image reads right). */
.split-section.split-feature {
  min-height: clamp(500px, 62vh, 640px);
  display: grid;
  align-items: center;
  padding: 80px 0;
  /* MEASURED, and the scrim was doing far less than it looked like it was.
     Behind the copy the photo averages rgb(59,122,172) — a mid blue. White text
     on that scores 4.59:1 with NO scrim at all, i.e. it already passes. Only 3%
     of the area is brighter than 170, and it was those few sparkle highlights
     the old 0.76 wash was guarding against — at the cost of making the whole
     left side read like ink poured in the water (Stuart).
     BUT the real problem is TEXTURE, not brightness (Stuart spotted this). The
     bubbles measure std-dev 43.4 behind the callout, range 2-236 — swinging from
     near-black to near-white inside a single line of text. Above ~35 letterforms
     break up regardless of average contrast, which is why a light flat scrim did
     not fix it.
     Fix is a soft ELLIPSE centred on the copy rather than a taller full-height
     wash: it lifts the composited alpha to ~0.62 exactly where the text sits
     (std-dev -> ~16, calm) and feathers to nothing by 88%, so the bubbles and the
     right of the frame stay bright. A backdrop blur would attack the variance
     more directly but costs the composition. Also off rgba(0,0,51) — the purple
     cast, same as the CTA. */
  background:
    radial-gradient(ellipse 58% 82% at 28% 50%, rgba(6,20,38,0.44) 0%, rgba(6,20,38,0.30) 52%, rgba(6,20,38,0.10) 74%, rgba(6,20,38,0) 88%),
    linear-gradient(to right, rgba(6,20,38,0.30) 0%, rgba(6,20,38,0.26) 38%, rgba(6,20,38,0.15) 54%, rgba(6,20,38,0.04) 63%, rgba(6,20,38,0) 70%),
    url("../images/index/index-experience.jpg") center / cover no-repeat;
  background:
    radial-gradient(ellipse 58% 82% at 28% 50%, rgba(6,20,38,0.44) 0%, rgba(6,20,38,0.30) 52%, rgba(6,20,38,0.10) 74%, rgba(6,20,38,0) 88%),
    linear-gradient(to right, rgba(6,20,38,0.30) 0%, rgba(6,20,38,0.26) 38%, rgba(6,20,38,0.15) 54%, rgba(6,20,38,0.04) 63%, rgba(6,20,38,0) 70%),
    image-set(
      url("../images/index/index-experience.webp") type("image/webp"),
      url("../images/index/index-experience.jpg") type("image/jpeg")
    ) center / cover no-repeat;
}
/* Copy runs wider and larger than the 560px/16.5px it inherited (Stuart
   2026-07-26). The scrim behind it is a left-to-right fade — 0.74 at 0%, 0.64 at
   40%, 0.30 at 62%, clear by 80% — and the copy was stopping at 48%, well inside
   the covered zone. 660px lands its right edge near 55%, where the scrim is
   still ~0.41, so the white text keeps its ground. */
.split-feature .split-content { max-width: min(820px, 46vw); }
.split-feature h2 {
  color: #fff;
  /* carries the 3% of bright highlights the scrim no longer covers */
  text-shadow: 0 1px 2px rgba(6,20,38,.55), 0 2px 16px rgba(6,20,38,.45);
}
.split-feature p { color: rgba(255,255,255,0.94); text-shadow: 0 1px 2px rgba(6,20,38,.6), 0 2px 12px rgba(6,20,38,.4); text-align: left; font-size: clamp(1.1rem, 1.333vw, 1.6rem); font-weight: 500; line-height: 1.75; }
.split-feature .small-label { color: var(--aqua-light); }
.split-feature-media { display: none; }

@media (max-width: 960px) {
  /* Tablet + mobile: stacked — clean image banner up top, text on a solid navy panel below.
     Kicks in at 960 (not 820) so the cramped tablet overlay zone never shows. */
  .split-section.split-feature {
    display: block;
    min-height: 0;
    padding: 0 0 46px;
    /* RULE (Stuart 2026-07-28): a colour used on desktop must match on mobile.
       This was #071d48 -> #00081f, a third navy that matched neither the ink
       navy nor the royal one — introduced when only the stacked view used it, so
       nobody saw them side by side. */
    background: #061426;
  }
  .split-feature-media { display: block; }
  .split-feature-media img {
    display: block;
    width: 100%;
    aspect-ratio: 16 / 10;
    object-fit: cover;
    object-position: center 42%;
  }
  .split-feature .container { padding-top: 30px; }
  .split-feature .split-content { max-width: 100%; }
}

.why,
.method-section {
  background:
    radial-gradient(circle at top right, rgba(0,174,239,0.16), transparent 30%),
    linear-gradient(180deg, #000033, #050545);
  padding: 82px 0;
  color: var(--white);
  text-align: center;
}

.why h2,
.services h2,
.method-section h2,
.section-heading h2 {
  font-size: clamp(1.9rem, 3.3vw, 4rem);
}

/* the intro <p> that used to hold this gap was removed as duplicate copy, and
   the grid then collided with the heading (-24px overlap) */
.why h2 { margin-bottom: 52px !important; }

.why > .container > p,
.method-section p {
  max-width: min(1020px, 55vw);
  margin: 14px auto 42px;
  color: rgba(255,255,255,0.82);
  font-size: clamp(1.05rem, 1.267vw, 1.5rem);
  font-weight: 600;
}

.why-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  text-align: left;
}

.why-card,
.why-card:link,
.why-card:visited {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 278px;
  padding: 34px 28px;
  border-radius: 18px;
  background: rgba(255,255,255,0.075);
  border: 1px solid rgba(255,255,255,0.12);
  overflow: hidden;
  text-decoration: none !important;
  color: inherit;
  transition: transform 160ms ease, background 160ms ease, border-color 160ms ease;
}

.why-card::after {
  content: attr(data-number);
  position: absolute;
  right: 18px;
  top: 8px;
  font-family: var(--serif);
  font-size: 4.5rem;
  line-height: 1;
  font-weight: 700;
  color: rgba(247, 147, 31, 0.26);
  z-index: 0;
  pointer-events: none;
  transition: color 160ms ease;
}

.why-card:hover {
  transform: translateY(-4px);
  background: rgba(255,255,255,0.11);
  border-color: rgba(0,174,239,0.42);
}

.why-card:hover::after { color: rgba(0, 174, 239, 0.30); }

.icon {
  position: relative;
  z-index: 1;
  width: 82px;
  height: 82px;
  margin-bottom: 24px;
  border-radius: 20px;
  display: grid;
  place-items: center;
  background: rgba(255,255,255,0.1);
  color: var(--orange);
  transition: color 160ms ease, background 160ms ease, transform 160ms ease;
}

.icon svg,
.mini-icon svg {
  width: 48px;
  height: 48px;
  fill: currentColor;
  stroke: none;
}

.why-card:hover .icon {
  color: var(--aqua);
  background: rgba(255,255,255,0.16);
  transform: translateY(-2px);
}

.why-card h3,
.why-card p,
.card-link {
  position: relative;
  z-index: 1;
  text-decoration: none !important;
}

.why-card h3 {
  margin: 0 0 10px;
  color: var(--white);
  font-size: 1.26rem;
  line-height: 1.3;
}

.why-card p {
  margin: 0 0 18px;
  color: rgba(255,255,255,0.78);
  font-size: 0.94rem;
  font-weight: 600;
}

.card-link {
  margin-top: auto;
  color: var(--orange);
  font-size: 0.82rem;
  font-weight: 900;
  letter-spacing: 0.04em;
}

.why-card:hover .card-link { color: var(--aqua); }

/* ---------------------------------------------------------------------------
   "WHY CHOOSE" ON LIGHT  ·  2026-07-26
   This section used to share one dark-navy rule with .method-section. Once
   Exclusive Services moved up the page, that left split -> why -> method as
   THREE consecutive dark sections (~2.2 screens of unbroken navy). Lightening
   this one restores the alternation: seafoam -> dark -> light -> dark -> sand.

   Every value below exists because the shared rule assumed a dark ground —
   white text, white-tinted card fills, white-tinted icon tiles. The card icons
   are orange base64 <img>s (measured rgb(229,138,34)), so they read fine here
   and need no filter.
   --------------------------------------------------------------------------- */
.why {
  background:
    radial-gradient(circle at top right, rgba(0, 174, 239, 0.10), transparent 34%),
    linear-gradient(180deg, #f5fbfd, #e9f5fa);
  color: var(--text);
}
.why h2 { color: var(--royal); }

.why .why-card,
.why .why-card:link,
.why .why-card:visited {
  background: var(--white);
  border: 1px solid var(--line);
  box-shadow: 0 10px 26px rgba(7, 30, 45, 0.05);
}
.why .why-card:hover {
  background: var(--white);
  border-color: rgba(0, 127, 169, 0.45);   /* --aqua-dark, matching the icon/number/link */
  box-shadow: 0 16px 36px rgba(7, 30, 45, 0.1);
}
/* the big serif number — 26% orange was tuned for navy and vanishes on white */
.why .why-card::after { color: rgba(247, 147, 31, 0.34); }
/* Hover accent is ONE colour across all three marks — number, icon, link
   (Stuart 2026-07-26). #007fa9, not the neon --aqua: the link needs 4.5:1 on a
   white card and #00AEEF only reaches 2.1:1. The numeral keeps a low alpha
   because it is a 4.5rem decorative serif sitting behind the copy. */
.why .why-card:hover::after { color: rgba(0, 127, 169, 0.38); }   /* --aqua-dark @38% — decorative numeral */

.why .icon { background: var(--aqua-soft); }
.why .why-card:hover .icon { background: #d6f0fa; }

.why .why-card h3 { color: var(--royal); }
.why .why-card p { color: var(--muted); }

/* The card link is orange #E58A22 — fine on navy, but only 2.63:1 on a white
   card, and at 0.82rem it needs 4.5:1. Darkened to #A85C0C (5.0:1) which keeps
   the orange identity and passes. Hover stays aqua-dark (4.56:1) rather than the
   neon --aqua, which would fail on white. */
/* Hover recolours the ICON to match the number and the link, so all three
   accents move together. The icons are base64 <img> with an inline `filter:none`
   — currentColor cannot reach them, so this is a filter chain to #007fa9
   and it must be !important to beat the inline style. Same technique as the
   credibility map icon. */
.why .icon img { transition: filter 160ms ease; }
.why .why-card:hover .icon img {
  /* Computed by sampling the filtered result to a canvas, not tuned by eye —
     the previous chain landed on #0084b1 while the link beside it was #007fa9,
     so the hover quietly used two different blues. This lands within 2/255. */
  filter: brightness(0) saturate(100%) invert(28%) sepia(96%) saturate(1560%) hue-rotate(170deg) brightness(95%) contrast(101%) !important;
}

.why .card-link { color: #a85c0c; }
.why .why-card:hover .card-link { color: var(--aqua-dark); }

.services,
.service-paths {
  padding: 86px 0;
  background:
    radial-gradient(circle at top left, rgba(0,174,239,0.18), transparent 32%),
    linear-gradient(180deg, var(--aqua-wash), #ffffff);
  text-align: center;
}

.service-paths {
  padding: 48px 0 86px;
}

/* Services "get in the water" — pool shot behind the 3 clickable cards.
   NOTE: image shared with client-stories for now; swap for a dedicated shot later. */
.services h2 {
  color: var(--navy);
  font-size: clamp(1.9rem, 3.3vw, 4rem);
}

.services > .container > p {
  /* Callout up from 1.02rem and given a wider measure to match (Stuart) */
  max-width: min(980px, 53vw);
  margin: 16px auto 46px;
  color: var(--muted);
  font-size: clamp(1.05rem, 1.267vw, 1.5rem);
  font-weight: 600;
}

.service-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  text-align: left;
}

.service-card {
  position: relative;
  display: flex;
  flex-direction: column;
  padding: 34px;
  min-height: 330px;
  border-radius: 20px;
  background: var(--white);
  color: var(--text);
  box-shadow: var(--shadow);
  border: 1px solid rgba(7, 30, 45, 0.08);
  text-decoration: none;
  overflow: hidden;
  transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease, background 180ms ease;
}

/* Hairline that WIPES IN from the left on hover — the same gesture the main nav
   already uses (scaleX(0)->scaleX(1), transform-origin left). Replaces a 6px
   solid bar that thickened to 8px on hover: a Bootstrap-era "card with coloured
   top border" that carried no information and grew fatter on hover, which reads
   cheap (Stuart: "looks very amateur... doesn't look premium"). At rest there is
   no bar at all — the card's elevation and its FITNESS/RECOVERY/PERFORMANCE
   label carry it. */
.service-card::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  background: var(--aqua-light);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 0.28s cubic-bezier(.22,.61,.36,1);
}

.service-card:hover {
  transform: translateY(-6px);
  border-color: rgba(0,174,239,0.45);
  box-shadow: var(--shadow-strong);
  background: var(--soft-blue);
}

.service-card:hover::before,
.service-card:focus-visible::before { transform: scaleX(1); }

.service-card-top {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 18px;
  margin-bottom: 24px;
}

.service-label {
  padding-top: 8px;
  color: rgba(0,0,51,0.52);
  font-size: clamp(0.72rem, 0.8vw, 0.94rem);
  font-weight: 900;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-align: right;
  white-space: nowrap;
  transition: color 160ms ease;
}

.service-card .mini-icon {
  flex: 0 0 auto;
  width: 86px;
  height: 86px;
  border-radius: 22px;
  display: grid;
  place-items: center;
  background: rgba(0,0,51,0.08);
  color: var(--royal);
  transition: color 160ms ease, background 160ms ease, transform 160ms ease;
}

.service-card:hover .mini-icon {
  color: var(--aqua);
  background: rgba(255,255,255,0.82);
  transform: translateY(-2px);
}

.service-card .mini-icon svg {
  width: 50px;
  height: 50px;
}

.service-card h3 {
  position: relative;
  z-index: 1;
  margin: 0 0 12px;
  color: var(--royal);
  font-size: clamp(1.48rem, 1.64vw, 2.06rem);
  line-height: 1.25;
  transition: color 160ms ease;
}

.service-card p {
  position: relative;
  z-index: 1;
  margin: 0 0 26px;
  color: var(--muted);
  font-size: clamp(0.96rem, 1.07vw, 1.38rem);
  font-weight: 600;
  transition: color 160ms ease;
}

.availability-line {
  position: relative;
  z-index: 1;
  margin: auto 0 24px;
  min-height: 2.9em;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--royal) !important;
  text-align: center;
  font-size: 0.72rem !important;
  line-height: 1.45;
  font-weight: 600 !important;
  letter-spacing: 0.075em;
  text-transform: uppercase;
}

/* Beat .service-card p specificity so the line pushes to a shared bottom */
.service-card .availability-line { margin-top: auto; }

.service-card:hover h3,
.service-card:hover .service-label,
.service-card:hover span:not(.service-label) {
  color: var(--aqua);
}

.service-card:hover p:not(.availability-line) { color: rgba(7, 30, 45, 0.78); }

.service-card:hover .availability-line {
  color: var(--royal) !important;
}

.service-card ul {
  margin: 0 0 28px;
  padding: 0;
  list-style: none;
}

.service-card li {
  position: relative;
  padding-left: 18px;
  margin-bottom: 9px;
  color: var(--text);
  font-size: 0.92rem;
  font-weight: 600;
}

.service-card li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.74em;
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: var(--aqua);
}

.service-card span:not(.service-label) {
  position: relative;
  z-index: 1;
  color: var(--orange);
  font-weight: 800;
  font-size: clamp(0.92rem, 1.02vw, 1.25rem);
  border-bottom: 1px solid transparent;
  transition: color 160ms ease, border-color 160ms ease;
}

.service-card:hover span:not(.service-label) {
  border-color: var(--aqua);
}

.no-link-card {
  pointer-events: none;
}

.no-link-card:hover {
  transform: none;
  border-color: rgba(7, 30, 45, 0.08);
  box-shadow: var(--shadow);
  background: var(--white);
}

.no-link-card:hover::before {
  height: 6px;
  background: var(--royal);
}

.no-link-card:hover .mini-icon {
  color: var(--royal);
  background: rgba(0,0,51,0.08);
  transform: none;
}

.no-link-card:hover h3,
.no-link-card:hover .service-label,
.no-link-card:hover span:not(.service-label) {
  color: inherit;
}

.no-link-card:hover .availability-line {
  color: var(--royal) !important;
}

.fit-guide-section {
  background: linear-gradient(180deg, #edf8f4 0%, #d7efe8 100%);
}

/* Merged services: DARK clickable cards on light seafoam (seafoam accent). */
.fit-guide-section .service-card {
  background: linear-gradient(165deg, #0b2b47 0%, #061426 100%);
  border-color: transparent;
  color: rgba(255,255,255,0.85);
  box-shadow: 0 26px 60px rgba(0,0,51,0.30);
}
.fit-guide-section .service-card::before { background: var(--aqua-light); }
.fit-guide-section .service-card h3 { color: #fff; }
.fit-guide-section .service-card p { color: rgba(255,255,255,0.80); }
.fit-guide-section .service-label { color: #a9d6c6; }
.fit-guide-section .service-card .mini-icon { background: rgba(255,255,255,0.92); }

/* Distinguishing element: hairline + "Best For" eyebrow separating the service (above) from the guidance (below) */
.fit-guide-section .service-card .best-for-label {
  margin: 2px 0 8px;
  padding-top: 18px;
  border-top: 1px solid rgba(169,214,198,0.28);
  color: #a9d6c6;
  font-size: 0.66rem;
  font-weight: 900;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.fit-guide-section .availability-line { color: rgba(255,255,255,0.58) !important; }
.fit-guide-section .service-card span:not(.service-label) { color: #a9d6c6; font-weight: 800; }

/* Hover: keep the card dark and text light (base hover flips text dark for white cards). */
.fit-guide-section .service-card:hover {
  background: linear-gradient(165deg, #10395c 0%, #081b30 100%);
  border-color: transparent;
  box-shadow: 0 34px 74px rgba(0,0,51,0.42);
}
/* Hover accents all resolve to ONE light blue (#00AEEF), matching the treatment
   on "Why Choose" so the two card sections behave the same (Stuart 2026-07-26).
   Was: top bar #c5e6da, link #ffffff — two different near-whites. */

.fit-guide-section .service-card:hover h3 { color: #fff; }
.fit-guide-section .service-card:hover .service-label { color: #c5e6da; }
.fit-guide-section .service-card:hover p:not(.availability-line) { color: rgba(255,255,255,0.85); }
.fit-guide-section .service-card:hover .availability-line { color: rgba(255,255,255,0.70) !important; }
.fit-guide-section .service-card:hover span:not(.service-label) { color: var(--aqua); }

/* The mini-icon is a base64 <img> at #000033 with an inline `filter:none`, so
   `color` never reaches it — this filter chain takes it to #00AEEF on hover and
   must be !important to beat the inline style. Static stays dark navy. */
.fit-guide-section .service-card .mini-icon img { transition: filter 160ms ease; }
.fit-guide-section .service-card:hover .mini-icon img {
  filter: brightness(0) saturate(100%) invert(58%) sepia(93%) saturate(2000%) hue-rotate(165deg) brightness(101%) contrast(101%) !important;
}

/* REVERTED to the original royal navy (Stuart 2026-07-28). It was briefly
   #061426 to match the site's "true dark navy", but the cards read wrong against
   it: they are a white TINT with no colour of their own, and that tint was tuned
   over a saturated blue. On flat #061426 they lost the relationship and looked
   detached. #000033 -> #050545 keeps the vibrancy/royal cast that makes this
   section distinct. The cards go back to the plain tint — no pinned colour.
   NOTE: this section is the exception; the footer/dark-section sweep to #061426
   should NOT pull it back in. */
.method-section {
  background:
    radial-gradient(circle at top right, rgba(0, 174, 239, 0.16), transparent 30%),
    linear-gradient(180deg, #000033, #050545);
}
.method-section .method-card {
  background: rgba(255, 255, 255, 0.075);
  border-color: rgba(255, 255, 255, 0.12);
}

.method-section.pool-program-section {
  background:
    radial-gradient(circle at top right, rgba(255,255,255,0.28), transparent 28%),
    linear-gradient(135deg, #00AEEF 0%, #0279b8 45%, #000033 100%);
}

.pool-program-section .method-card {
  background: rgba(255,255,255,0.95);
  border: 1px solid rgba(255,255,255,0.45);
  box-shadow: 0 24px 50px rgba(0,0,51,0.20);
}

.pool-program-section .method-card strong {
  color: var(--royal);
}

.pool-program-section .method-card span {
  color: var(--muted);
}

.method-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  margin-top: 44px;
  text-align: left;
}

.method-card {
  /* padding grows with the type so the bigger copy does not crowd the edges */
  padding: clamp(28px, 1.95vw, 40px) clamp(24px, 1.7vw, 34px);
  border-radius: 18px;
  background: rgba(255,255,255,0.075);
  border: 1px solid rgba(255,255,255,0.12);
}

.method-card strong {
  display: block;
  margin-bottom: 8px;
  color: var(--white);
  font-family: var(--serif);
  font-size: clamp(1.15rem, 1.28vw, 1.6rem);
}

.method-card span {
  /* .78 not .75 — at 20px on a dark ground the extra alpha reads noticeably
     easier without turning the copy stark white */
  color: rgba(255,255,255,0.78);
  font-size: clamp(0.91rem, 1.01vw, 1.3rem);
  font-weight: 600;
  line-height: 1.6;
}

.method-icon {
  width: clamp(46px, 3.2vw, 64px);
  height: clamp(46px, 3.2vw, 64px);
  margin-bottom: clamp(18px, 1.3vw, 26px);
  color: var(--aqua);
}

.method-icon svg {
  width: 100%;
  height: 46px;
  fill: currentColor;
}

.method-section .method-card svg,
.pool-program-section .method-card svg,
.method-card svg,
.method-icon svg {
  /* clamped, not pinned — these were hard-locked at 46px, so the icons stayed
     laptop-sized on a 27" while the card type grew around them */
  width: clamp(46px, 3.2vw, 64px) !important;
  height: clamp(46px, 3.2vw, 64px) !important;
  max-width: clamp(46px, 3.2vw, 64px) !important;
  max-height: clamp(46px, 3.2vw, 64px) !important;
  fill: var(--aqua) !important;
  color: var(--aqua) !important;
  display: block !important;
  margin: 0 0 clamp(18px, 1.3vw, 26px) 0 !important;
}

.method-section .method-card svg path,
.pool-program-section .method-card svg path,
.method-card svg path,
.method-icon svg path {
  fill: var(--aqua) !important;
}

.method-section .method-card,
.pool-program-section .method-card {
  text-align: left !important;
}

.testimonials-preview {
  padding: 68px 0;
  /* Warm sand wash (distinct from the seafoam "Exclusive Services" section above, and
     warm = human stories) so the white cards lift off and the page rhythm doesn't repeat. */
  background:
    radial-gradient(circle at top right, rgba(247,147,31,0.06), transparent 42%),
    linear-gradient(180deg, #faf7f1 0%, #f1ebe0 100%);
}

.section-heading {
  text-align: center;
  max-width: 820px;
  margin: 0 auto 44px;
}

.section-heading h2 {
  color: var(--navy);
  font-size: clamp(1.9rem, 3.3vw, 3.15rem);
}

/* ==========================================================================
   CREDIBILITY STRIP  (index — between the founder band and Why Choose)
   --------------------------------------------------------------------------
   Restrained on purpose. Stuart's brief: no logo wall, no oversized cards —
   an editorial strip with generous spacing and discreet external-link arrows.
   The two sources carry DIFFERENT kinds of proof (institutional vs editorial),
   so they are given equal weight and separated by a hairline rather than
   boxed as cards, which would read as advertising.
   Warm --sand-light bridges the navy band above and the cool blue Why below.
   ========================================================================== */
.credibility-strip {
  background: var(--sand-light);
  /* Measured at 2560 with the original 82px padding: the section was 427px tall
     — the height of a whole Why card — but 46% of that was air around only
     231px of content. That is what made it read as "lost", NOT the type size.
     Tightened so the band is dense and deliberate; a short strip reads as
     intentional restraint, a tall one with small type reads as unfinished. */
  padding: clamp(36px, 2.5vw, 58px) 0;
}
/* Centred once the two callouts became centred two-line blocks — a left title
   over a symmetrical pair read as off-axis. Same eyebrow-above-title structure
   as every other section on the site. */
.credibility-strip__heading {
  margin: 0 0 clamp(26px, 2.2vw, 44px);
  text-align: center;
}
.credibility-strip__title {
  /* Libre Baskerville. Sized as a SUB-section title: clearly a heading, but
     still under the 64px section h2s of the founder band and Why Choose so the
     band reads as a pause between them rather than a third full section. */
  margin: 0;
  color: var(--royal);
  font-family: var(--serif);
  font-size: clamp(1.65rem, 2.15vw, 3.4rem);
  font-weight: 700;
  line-height: 1.18;
  letter-spacing: -0.01em;
}
.credibility-strip__list {
  --cs-gap: clamp(30px, 4vw, 72px);   /* one source of truth: gap AND rule offset */
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--cs-gap);
  margin: 0;
  padding: 0;
  list-style: none;
}
/* hairline between the two, echoing the feature testimonial's column rule.
   Padding is on BOTH items, not just the second: an inset on one side only
   shifts that column's centring axis, which measured 73px off at 2560 once the
   content was centred. Equal insets keep the two columns symmetric. */
.credibility-strip__item { padding-inline: clamp(14px, 1.4vw, 30px); }
/* The rule is a pseudo-element sitting HALF THE GAP to the left, not a
   border-left. A border sits on the item's own edge, which puts the whole gap on
   one side of it: measured 349px from column 1's centre vs 277px from column 2's.
   Offsetting by half the gap makes the divider the true axis between them. */
.credibility-strip__item + .credibility-strip__item { position: relative; }
.credibility-strip__item + .credibility-strip__item::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: calc(var(--cs-gap) / -2);
  width: 1px;
  background: rgba(0, 0, 51, 0.12);
}
/* Items are CENTRED, the eyebrow above them is not (Stuart's call). The two
   source names are wildly different lengths — "City of Miami Beach Visitor
   Center" fills its 554px column, "VoyageMIA" uses a fraction of it — so
   left-aligning left a ragged hole on the right of the second column. Centring
   balances them against the divider. The eyebrow stays left so the section keeps
   an editorial anchor and does not turn into a centred heading block competing
   with "Why Choose AquaFit Sports" below. */
.credibility-strip__item { text-align: center; }

.credibility-strip__mark {
  display: block;
  width: 26px;
  height: 2px;
  margin: 0 auto 16px;      /* auto keeps the mark centred over the name */
  background: var(--aqua);
  border-radius: 2px;
}
.credibility-strip__source {
  margin: 0 0 8px;
  color: var(--royal);
  /* Montserrat, NOT the serif. The title above is the only serif in this band,
     so the callout stands apart as the only large sans on the page rather than
     competing with the heading it sits under (Stuart's call). */
  font-family: var(--sans);
  font-weight: 700;
  /* Measured on Stuart's 27": the old clamp ceiling (1.45rem) froze this at
     23.2px, the same size as the founder band's BODY copy (24px) — so the item
     titles read as prose between two 64px section headlines. These are
     sub-section titles: they should sit clearly above the Why cards' h3 (20px)
     without competing with a section h2 (64px). Ceiling raised to 2.4rem so the
     vw term can actually reach on a wide screen. */
  font-size: clamp(1.4rem, 1.75vw, 2.8rem);
  line-height: 1.24;
}
/* second line — the organisation, then what it is */
.credibility-strip__source span { display: block; }


.credibility-strip__desc {
  margin: 0 0 18px;
  color: var(--muted);
  font-family: var(--sans);
  font-weight: 700;          /* bold, not regular — Stuart's call */
  /* was a flat 0.92rem with no vw term, so it never grew past 14.7px */
  font-size: clamp(0.92rem, 0.72vw, 1.22rem);
  line-height: 1.5;
  max-width: 36ch;
  margin-inline: auto;      /* the 36ch cap would otherwise pin it left */
}
.credibility-strip__link {
  display: inline-block;
  color: var(--aqua-dark);          /* light ground — see the colour rule at top */
  font-size: 0.84rem;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-decoration: none;
  border-bottom: 1px solid rgba(0, 127, 169, 0.32);
  padding-bottom: 3px;
}
.credibility-strip__link:hover { border-bottom-color: var(--aqua-dark); }
.credibility-strip__link span { display: inline-block; transition: transform 160ms ease; }
.credibility-strip__link:hover span { transform: translateX(3px); }

@media (max-width: 720px), (hover: none) {
  /* 27px is under the 40px touch target the footer links were raised to. Padding
     the link rather than the text keeps the underline tight to the words. */
  .credibility-strip__link { padding-top: 8px; padding-bottom: 11px; }
}

@media (max-width: 720px) {
  /* Stacked: side by side would give each source a ~150px column. The divider
     has to become horizontal or it separates nothing. */
  .credibility-strip__list { grid-template-columns: 1fr; }
  .credibility-strip__item { padding-inline: 0; }
  /* the vertical rule is a ::before now — it must be switched off, not just
     overridden, or it hangs off the left of the stacked items */
  .credibility-strip__item + .credibility-strip__item::before { display: none; }
  .credibility-strip__item + .credibility-strip__item {
    border-top: 1px solid rgba(0, 0, 51, 0.12);
    padding-top: clamp(26px, 6vw, 34px);
  }
}

.testimonial-grid {
  display: flex;
  gap: 24px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-padding: 4px;
  padding: 4px 4px 20px;
  -webkit-overflow-scrolling: touch;
}
.testimonial-grid > .testimonial-card {
  flex: 0 0 min(400px, 85%);
  scroll-snap-align: start;
}
/* Double-width feature card — see the note above Louise Flynn's card in
   index.html. This SHORTENS the section: the longest quote is 509px tall in a
   400px card and 331px in an 830px one, so the row height stops being set by
   it. Breakpoint is 700px, not 900: measured at 768 the card was 548px tall at
   the standard 400px width and 421px at 88%, so tablet needs this too. Below
   700px one card already fills the viewport and width can no longer buy any
   height back. */
@media (min-width: 700px) {
  /* 730px, NOT 830. The arrows advance one card and left-align it. At 830 the
     feature card was 89px cut off at step 2, and step 3 could only move 97px
     before hitting the scroll end — so it read as "it advanced but nothing
     happened" and took three steps. Measured: at 730 the card is fully visible
     at step 2 AND step 2 is the scroll end, so the dead third step disappears. */
  .testimonial-grid > .testimonial-card--feature { flex: 0 0 min(730px, 88%); }
}

/* Two columns, Stuart's call. A single 752px line is far past a comfortable
   measure; splitting gives ~357px per column, right next to the standard cards'
   322px, so the reading rhythm stays consistent across the scroller. Measured:
   it costs NOTHING in height (125px either way) — the same total lines just
   stack in two shorter columns instead of one wide one.

   900px, NOT the 700px used for the card width above — the two breakpoints are
   deliberately different. At 768 the card is only 611px wide, which gives 254px
   columns (~32 characters per line): choppier than the single 563px column it
   replaced. Columns only pay off once each one is a real measure. */
@media (min-width: 900px) {
  .testimonial-card--feature p {
    column-count: 2;
    column-gap: 38px;
    column-rule: 1px solid rgba(0, 0, 51, 0.14);
  }
  /* Attribution right-aligned so it lands under the second column and closes the
     spread, rather than sitting under the first with dead space beside it. */
  .testimonial-card--feature .testimonial-author { text-align: right; }
  .testimonial-card--feature .testimonial-source {
    display: block;
    width: fit-content;   /* keeps the underline tight to the text, not full-width */
    margin-left: auto;
  }
}
.testimonial-source {
  position: relative;
  z-index: 1;
  display: inline-block;
  margin-top: 14px;
  color: var(--aqua-dark);          /* light ground — see the colour rule at top */
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-decoration: none;
  border-bottom: 1px solid rgba(0, 127, 169, 0.35);
  padding-bottom: 2px;
}
.testimonial-source:hover { border-bottom-color: var(--aqua-dark); }
/* Touch target: this link was 25px at EVERY width — the one link on the page
   that never got the treatment the footer and credibility-strip links did.
   Same scoping as those: by width for phones, by hover:none for any touch
   device (a real iPad reports hover:none at 768 and 1024). */
@media (max-width: 860px), (hover: none) {
  .testimonial-source { padding-top: 8px; padding-bottom: 10px; }
}
.testimonial-source span { transition: transform 160ms ease; display: inline-block; }
.testimonial-source:hover span { transform: translateX(3px); }
.testimonial-headline {
  position: relative;
  z-index: 1;
  margin: 0 0 12px;
  color: var(--royal);
  font-family: var(--serif);
  font-size: 1.4rem;
  line-height: 1.22;
}

.testimonial-scroller { position: relative; }
.t-arrow {
  position: absolute;
  top: 45%;
  transform: translateY(-50%);
  z-index: 3;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  border: 1px solid rgba(7, 30, 45, 0.10);
  background: #fff;
  color: var(--royal);
  box-shadow: 0 10px 26px rgba(7, 30, 45, 0.16);
  font-size: 1.6rem;
  line-height: 1;
  cursor: pointer;
  display: grid;
  place-items: center;
  padding-bottom: 4px;
  transition: background 160ms ease, color 160ms ease;
}
.t-arrow:hover { background: var(--aqua); color: #fff; }
.t-prev { left: -6px; }
.t-next { right: -6px; }

.testimonial-card.testimonial-audio {
  background: linear-gradient(180deg, rgba(0, 174, 239, 0.07), #fff 62%);
}
.testimonial-audio .t-audio {
  position: relative;
  z-index: 1;
  width: 100%;
  margin: 6px 0 22px;
}

@media (max-width: 820px) {
  .t-arrow { display: none; }
}

.testimonial-card {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  padding: 54px 38px 34px;
  border-radius: 22px;
  background: var(--white);
  border: 1px solid rgba(255, 255, 255, 0.9);
  box-shadow: 0 30px 66px rgba(7, 30, 45, 0.14), 0 2px 6px rgba(7, 30, 45, 0.05);
}
/* Pins attribution to the bottom once the cards are stretched to equal height,
   so the names line up across the row instead of floating under each quote. */
.testimonial-author { margin-top: auto; }

/* Equal card heights. The track was align-items:start, which left a ragged
   bottom edge; now that the tallest and shortest text cards are within ~60px
   (measured 322/384/359/371 at 1440) matching them reads as deliberate.
   NOT applied below 700px: there only one card is visible at a time and the
   feature card runs 771px, so stretching would inflate a 7-word quote to match
   an 88-word one. */
@media (min-width: 700px) {
  .testimonial-grid { align-items: stretch; }
}
/* Explicit, NOT just "leave it to the default" — flex defaults to stretch, so
   omitting this inflated every phone card to the feature card's 771px, which is
   the exact failure the old index-level override existed to prevent. */
@media (max-width: 699.98px) {
  .testimonial-grid { align-items: start; }
}

.quote-icon {
  position: absolute;
  top: 4px;
  left: 26px;
  z-index: 0;
  font-family: var(--serif);
  color: rgba(0, 174, 239, 0.16);
  /* Bigger, and now scales with the viewport like the rest of the page. This is
     FREE height-wise: the mark is position:absolute / z-index:0, so it sits
     behind the copy and contributes nothing to card height (verified by hiding
     it — the card stayed 459px). The card is overflow:hidden, so it crops at the
     edge, which is the intended watermark look. Stuart asked for a large
     quotation mark back in July; this honours that at a size that reads on a
     27" instead of getting lost. */
  font-size: clamp(10rem, 10.5vw, 14rem);
  line-height: 1;
  pointer-events: none;
}

.testimonial-card p {
  position: relative;
  z-index: 1;
  margin: 0 0 24px;
  color: rgba(7, 30, 45, 0.72);
  font-family: var(--serif);
  font-style: italic;
  /* 1.7 -> 1.58 and a hair off the size (Stuart wants the section shorter
     without touching a client's words). Applied to ALL quotes, not just the long
     one — mixed type sizes across a row of cards reads as a mistake, not a
     decision. Together these take ~28px off the tallest card. The 128px quote
     mark is the bigger lever but it is deliberate: Stuart asked for a larger
     quotation mark back in July, so it stays. */
  font-size: 0.99rem;
  font-weight: 400;
  line-height: 1.58;
}

/* Feature testimonial only: this card is the tallest in the row, so it sets the
   height for all four — tightening its internal gaps pulls the whole section up.
   MUST stay after `.testimonial-card p` above: same specificity (0,2,0), so
   source order decides. Placed earlier in the file it silently lost and the
   24px gap under the quote never changed. */
.testimonial-card--feature p { margin-bottom: 14px; }
.testimonial-card--feature .testimonial-source { margin-top: 6px; }

/* PHONE: side padding 38px -> 22px. On a 294px card, 38px each side left only a
   218px measure — 26% of the card was gutter — so the quotes ran very long.
   Widening the measure to 250px cut Louise's card from 903px to 755px and the
   section from 927 to 779, with no copy change.
   22px is a measured floor, not a guess: 18px widens the measure another 8px but
   the line count stops dropping, so it gives up whitespace for nothing.
   Vertical padding is untouched — the quote mark is absolutely positioned
   against the 54px top. */
@media (max-width: 699.98px) {
  .testimonial-card { padding-left: 22px; padding-right: 22px; }
}

.testimonial-author strong {
  display: block;
  color: var(--royal);
  font-family: var(--serif);
  font-size: 1.1rem;
}

.testimonial-author span {
  display: block;
  color: var(--muted);
  font-size: 0.86rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.center-actions { margin-top: 34px; }

.cta-section {
  display: grid;
  align-items: center;
  min-height: clamp(600px, 72vh, 760px);
  padding: 96px 0;
  /* Overlay pulled back from .40/.63 to .24/.46 and moved off rgba(0,0,51)
     (Stuart: too dark, and a blue/purple cast). #000033 is a fully saturated
     pure blue — that IS the purple. rgba(6,20,38) is the site's neutral navy.
     Measured: the water behind the copy is rgb(101,140,111); white text sits at
     ~6.5:1 after this change, still well past the 4.5:1 floor, so the water can
     read bright without costing legibility. */
  background:
    linear-gradient(rgba(6,20,38,0.24), rgba(6,20,38,0.46)),
    url("../images/lagoon-cta.jpg") center 60% / cover no-repeat;
  background:
    linear-gradient(rgba(6,20,38,0.24), rgba(6,20,38,0.46)),
    image-set(
      url("../images/lagoon-cta.webp") type("image/webp"),
      url("../images/lagoon-cta.jpg") type("image/jpeg")
    ) center 60% / cover no-repeat;
  color: var(--white);
  text-align: center;
}

/* Card removed — content sits directly on the immersive image */
.cta-box {
  /* Wide enough to hold "Splash Into Adaptive Resistance" on ONE line (Stuart).
     At 720px it broke across two. The paragraph keeps its own narrower measure
     below, so the headline runs full width and the copy stays readable — the
     hierarchy is deliberate, not an accident of the box. */
  max-width: min(1200px, 66vw);
  margin: 0 auto;
  padding: 0;
  text-shadow: 0 2px 18px rgba(0,0,33,0.5);
}

.cta-box h2 {
  color: var(--white);
  /* Ceiling 4.15rem, not 4.3: at 4.3 the one-line headline had only 37px of
     slack inside the 1180px container cap on a 27" — one font-rendering
     difference from wrapping. 4.15 buys ~77px and still sits above the 64px
     section headings, so the closing line keeps its emphasis. */
  font-size: clamp(2rem, 3.6vw, 4.15rem);
}

.cta-box p {
  /* Up from 1.267vw/1.5rem — this is the last thing a reader sees before the
     ask, so it earns more presence than a mid-page callout (Stuart). Measure
     widens with it so the line length stays comfortable. */
  max-width: min(1020px, 56vw);
  margin: 20px auto 34px;
  color: rgba(255,255,255,0.88);
  font-size: clamp(1.12rem, 1.42vw, 1.72rem);
  font-weight: 600;
}

/* Services bottom CTA — underwater editorial treatment (matches client-stories, scoped to services).
   NOTE: background image is a placeholder (client-stories shot) until the chosen image is dropped in. */
.cta-section.cta-editorial {
  position: relative;
  overflow: hidden;
  padding: clamp(72px, 8vw, 120px) 0;
  background:
    linear-gradient(rgba(0,0,51,0.10), rgba(0,0,51,0.28)),
    url("../images/client-stories/cta-underwater.jpg") center 33% / cover no-repeat;
}

.cta-section.cta-editorial::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(circle at 50% 52%, rgba(0,0,51,0.34), rgba(0,0,51,0.08) 48%, rgba(0,0,51,0) 70%);
  pointer-events: none;
}

.cta-section.cta-editorial::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(circle at 58% 18%, rgba(255,255,255,0.18), rgba(255,255,255,0) 25%),
    radial-gradient(circle at 16% 60%, rgba(0,174,239,0.14), rgba(0,174,239,0) 34%);
  mix-blend-mode: screen;
  pointer-events: none;
}

.cta-section.cta-editorial .cta-box {
  position: relative;
  z-index: 2;
  max-width: 820px;
}

.site-footer {
  background:
    radial-gradient(circle at top left, rgba(0,174,239,0.16), transparent 32%),
    var(--royal);
  color: var(--white);
  padding: 56px 0 22px;
  /* Orange keyline, 2px — was 5px (Stuart 2026-07-28). The problem was the
     WEIGHT, not the line: 5px of saturated orange read as a band. Removing it
     entirely left the lightened CTA photo butting straight into flat navy with
     nothing mediating, which read sharper still. At 2px it delineates without
     announcing itself. */
  border-top: 2px solid var(--orange);
}

/* Per-page opt-out: drops the keyline on pages whose last section is dark
   (e.g. SOW cover) where it clashes with a dark→dark transition.
   Add class "no-accent" to <footer class="site-footer premium-footer">. NOT site-wide. */
.site-footer.no-accent { border-top: 0; }

.footer-grid {
  display: grid;
  grid-template-columns: 1.35fr 1fr 0.85fr 0.8fr;
  gap: 34px;
  align-items: start;
}

.footer-brand-row {
  display: flex;
  gap: 14px;
  align-items: center;
  margin-bottom: 18px;
}

.footer-logo-wrap {
  width: 72px;
  height: 72px;
  border-radius: 18px;
  padding: 6px;
  background:
    linear-gradient(145deg, rgba(255,255,255,.18), rgba(255,255,255,.05));
  border: 1px solid rgba(255,255,255,.15);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.25),
    0 8px 18px rgba(0,0,0,.18);
  display: grid;
  place-items: center;
  overflow: hidden;
}

.footer-logo-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 12px;
}

.footer-brand-row strong {
  display: block;
  font-family: var(--sans);
  font-weight: 700;
  font-size: 1.35rem;
  line-height: 1.15;
}

.footer-brand-row span {
  color: rgba(255,255,255,0.7);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.footer-brand-block p,
.footer-column p {
  color: rgba(255,255,255,0.76);
  font-size: 0.92rem;
  font-weight: 500;
  margin: 0 0 14px;
}

.footer-column h3 {
  margin: 0 0 16px;
  color: var(--white);
  font-family: var(--sans);
  font-size: 1.06rem;
  font-weight: 700;
}

.footer-column a {
  display: block;
  color: rgba(255,255,255,0.78);
  text-decoration: none;
  font-size: 0.88rem;
  font-weight: 700;
  margin-bottom: 10px;
}

.footer-column a:hover { color: var(--aqua); }

/* Touch targets. Measured at 768: these links were 24px tall on a 34px pitch —
   a mis-tap risk, and the same older-eyes/older-hands audience the type sizes
   were raised for. Padding takes the target to 40px without moving the text.
   Scoped to small screens AND to any no-hover (touch) device, so a mouse-driven
   desktop keeps the tighter footer it was designed with. */
@media (max-width: 860px), (hover: none) {
  .footer-column a {
    padding: 8px 0;
    margin-bottom: 2px;
  }
}

.footer-contact-line {
  display: flex;
  gap: 10px;
  align-items: flex-start;
}

.footer-contact-line svg {
  width: 16px !important;
  height: 16px !important;
  flex: 0 0 auto;
  margin-top: 5px;
  /* --aqua #00AEEF went muddy on the footer navy; --aqua-light #7FD1F0 holds its
     brightness there (Stuart, same call he made on Max Hypertrophy). Opacity
     raised to 1 — the lighter blue no longer needs dimming to sit calmly. */
  fill: var(--aqua-light) !important;
  opacity: 1;
}

.social-row {
  display: flex;
  gap: 10px;
  margin-bottom: 20px;
}

.social-row a {
  width: 40px;
  height: 40px;
  border-radius: 999px;
  display: grid;
  place-items: center;
  background: rgba(255,255,255,0.10);
  border: 1px solid rgba(255,255,255,0.18);
  color: var(--white);
  margin: 0;
  transition: background 160ms ease, color 160ms ease, transform 160ms ease;
}

.social-row a svg {
  width: 17px !important;
  height: 17px !important;
  fill: currentColor;
}

.social-row a:hover {
  background: var(--aqua);
  color: var(--royal);
  transform: translateY(-2px);
}

.footer-cta {
  display: inline-flex !important;
  width: fit-content;
  padding: 10px 14px;
  border-radius: 999px;
  background: var(--orange);
  color: var(--royal) !important;
  font-weight: 800 !important;
  transition: background 160ms ease, color 160ms ease, transform 160ms ease;
}

.footer-cta:hover {
  background: var(--aqua);
  color: var(--royal) !important;
  transform: translateY(-2px);
}

.footer-bottom {
  margin-top: 38px;
  padding-top: 18px;
  border-top: 1px solid rgba(255,255,255,0.14);
  color: rgba(255,255,255,0.62);
  font-size: 0.82rem;
  font-weight: 600;
}

/* Legacy on-load animation retired — scroll-reveal (.reveal, added by main.js) handles entrances now. */
.slide-card { animation: none; }

.slide-card.delay-1 { animation-delay: 120ms; }
.slide-card.delay-2 { animation-delay: 240ms; }
.slide-card.delay-3 { animation-delay: 360ms; }

@keyframes slideUp {
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .slide-card {
    opacity: 1;
    transform: none;
    animation: none;
  }

  .reveal {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }

  .btn,
  .service-card,
  .why-card,
  .icon,
  .mini-icon {
    transition: none;
  }
}

/* Scroll-reveal: subtle fade + rise as elements enter the viewport (class added by main.js). */
.reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 720ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.reveal.is-visible {
  opacity: 1;
  transform: none;
}

@media (max-width: 900px) {
  .header-inner {
    flex-direction: column;
    align-items: flex-start;
    padding: 18px 0;
    gap: 14px;
  }

  .main-nav {
    flex-wrap: wrap;
    justify-content: flex-start;
    align-items: center;
    gap: 14px 18px;
    font-size: 0.76rem;
    line-height: 1.4;
  }

  .nav-cta { padding: 9px 14px; }

  /* dropdown can't hover on touch — show sub-links inline in the open menu */
  .nav-item { align-self: auto; display: block; }
  .nav-dropdown {
    position: static;
    opacity: 1;
    visibility: visible;
    transform: none;
    box-shadow: none;
    border: 0;
    background: transparent;
    min-width: 0;
    padding: 2px 0 4px 14px;
  }

  /* Same treatment for the SOW panel — it can't hover on touch either. The dark
     card, the section head and the deks are all dropped here: inside an open
     hamburger they would be a second panel-within-a-panel. Just the three
     article titles, indented, exactly like the Services sub-links. */
  .nav-panel {
    position: static;
    width: auto;
    opacity: 1;
    visibility: visible;
    transform: none;
    background: transparent;
    border: 0;
    box-shadow: none;
    padding: 2px 0 4px 14px;
  }
  .nav-panel__head,
  .nav-panel__dek { display: none; }
  .nav-panel__item { padding: 0; border-left: 0; }
  .nav-panel__item:hover { background: transparent; }
  .nav-panel__title {
    color: var(--navy) !important;
    font-family: inherit;
    font-size: inherit;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }
  .nav-panel__all { margin: 4px 0 0; padding: 0; border-top: 0; }
  /* the diamond is a desktop affordance; inline there is nothing to open */
  .nav-item--sow > a { padding-left: 0; }
  .nav-item--sow > a::before { display: none; }

  .credibility-grid { grid-template-columns: repeat(2, 1fr); }

  .credibility-item:nth-child(2) { border-right: 0; }

  .credibility-item:nth-child(1),
  .credibility-item:nth-child(2) {
    border-bottom: 1px solid var(--line);
  }

  .why-grid,
  .method-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .service-grid,
  .split-grid,
  .footer-grid,
  .testimonial-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 900px) {
  /* 36px total = 18px each side. Measured sweep from 14 to 24px each side: the
     testimonial card re-wraps (+24px tall) at 20px and the split-feature grows
     again at 24px, so 18 is the last step before either. Costs +80px on a
     ~10,900px page. Full-bleed sections (hero, founder band, split-feature
     background) sit OUTSIDE .container and do not move at any value. */
  .container { width: min(100% - 36px, 1180px); }

  /* Header stays sticky on mobile too (was position:static), so the hamburger
     bar anchors to the top of the viewport on scroll (Stuart's mobile note).
     Base .site-header is position:sticky; top:0 — just don't override it here. */

  .header-inner {
    min-height: auto;
    padding: 14px 0;
    align-items: center;
    flex-direction: row;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
  }

  .brand-logo { width: 218px; }

  .menu-toggle {
    display: inline-flex;
    width: 46px;
    height: 42px;
    align-items: center;
    justify-content: center;
    border: 1px solid rgba(0,0,51,0.18);
    border-radius: 12px;
    background: var(--white);
    color: var(--royal);
    cursor: pointer;
    padding: 0;
  }

  .menu-toggle span,
  .menu-toggle span::before,
  .menu-toggle span::after {
    display: block;
    width: 22px;
    height: 2px;
    background: var(--royal);
    border-radius: 999px;
    position: relative;
    transition: transform 160ms ease, opacity 160ms ease;
  }

  .menu-toggle span::before,
  .menu-toggle span::after {
    content: "";
    position: absolute;
    left: 0;
  }

  .menu-toggle span::before { top: -7px; }
  .menu-toggle span::after { top: 7px; }

  .menu-toggle[aria-expanded="true"] span { background: transparent; }

  .menu-toggle[aria-expanded="true"] span::before {
    transform: translateY(7px) rotate(45deg);
  }

  .menu-toggle[aria-expanded="true"] span::after {
    transform: translateY(-7px) rotate(-45deg);
  }

  .main-nav {
    width: 100%;
    display: none;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    padding: 10px 0 4px;
    font-size: 0.74rem;
    letter-spacing: 0.04em;
  }

  .main-nav.is-open { display: flex; }

  .main-nav a {
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: 42px;
    line-height: 1.25;
    padding: 10px 12px;
    border: 1px solid rgba(7, 30, 45, 0.10);
    border-radius: 12px;
    background: #ffffff;
  }

  .main-nav a:hover {
    border-color: rgba(0,174,239,0.42);
    background: var(--soft-blue);
    color: var(--aqua);
  }

  .nav-cta {
    background: var(--royal) !important;
    color: var(--white) !important;
    border: 1px solid var(--royal) !important;
    font-size: 0.74rem;
    font-weight: 700;
    box-shadow: none;
  }

  .nav-cta:hover {
    background: var(--aqua) !important;
    color: var(--royal) !important;
    border-color: var(--aqua) !important;
  }

  /* SMALL SCREENS GET THEIR OWN ASSETS + A TOP-ONLY SCRIM
     (Stuart item #14 — ROUND 3, 2026-07-30, and the one that addresses the
     actual complaint.)

     History, so nobody repeats it: the original was a flat navy wash to .80
     ("mud"). Round 1 graduated it to peak .62 — Stuart: "still looks the
     same" (compositing math agreed: effective luminance 28 -> 45, both dark).
     Round 2 went to .42 — Stuart: "still somewhat dark and MONOCHROMATIC".
     Monochromatic was the tell: ANY full-frame navy veil strips the sunset's
     golds at any opacity worth having. Lightening could never fix a hue kill.
     He also called a "strong bleed on the left" in phone landscape — that was
     the PHOTO's own black left third (luminance 9) entering the frame at the
     old 72% framing, not a CSS artifact.

     Round 3 therefore changes the INPUTS, not the veil:
     - hero-services-phone.jpg  (<=640px)  — portrait crop, source x 45-78%:
       Stuart's V-pose with the bells, sun haloed behind his head. Aspect .79
       vs the phone window's .75, so ~94% of the scene is on screen: the
       "zoom out so the viewer sees what is going on behind the copy" he asked
       for. Warmed in Pillow (+12% brightness, +25% saturation).
     - hero-services-mobile.jpg (641-900px) — wide crop, source x 30-100%:
       the black third no longer exists in the file, so the landscape bleed
       is structurally gone. Same warmth pass.
     - The scrim is now TOP-WEIGHTED and gone by ~60%: it grades the bright
       sky behind the eyebrow/h1 into dusk navy and leaves the sun, figure
       and gold reflections in FULL colour. No full-frame veil -> no
       monochrome. Copy below the fade line rides on the 3-layer text-shadow.

     Both assets are jpg-only (no webp built), hence single background
     declarations — nothing to keep in sync here. Desktop keeps image-set and
     its original scrim, untouched, in the base rule far above. */
  .services-hero {
    background:
      linear-gradient(180deg,
        rgba(4, 8, 32, 0.55) 0%,
        rgba(4, 8, 32, 0.44) 24%,
        rgba(4, 8, 32, 0.22) 46%,
        rgba(4, 8, 32, 0.00) 62%),
      url("../images/services/hero-services-mobile.jpg") center 42% / cover no-repeat;
  }

  /* Contrast bound to the type, not the image — with the scrim gone below the
     ~60% line, everything under it (body copy, CTA) rides ONLY on this.
     Kept INSIDE this ≤900px block on purpose: desktop keeps its original
     near-opaque scrim and its original shadow, so it must not inherit this.
     :not(.photo-credit) leaves the credit on its own quieter treatment. */
  .services-hero .pretitle,
  .page-hero.services-hero h1,
  .page-hero.services-hero p:not(.photo-credit) {
    /* Three layers: a tight crisp edge, a mid halo, and a wide soft pool that
       acts as a private mini-scrim around the letterforms only. */
    text-shadow:
      0 1px 2px rgba(4, 8, 32, 0.95),
      0 2px 10px rgba(4, 8, 32, 0.85),
      0 4px 28px rgba(4, 8, 32, 0.70);
  }

  .page-hero.services-hero h1 {
    font-size: clamp(1.9rem, 6vw, 2.8rem);
    max-width: 100%;
  }

  .page-hero.services-hero p { max-width: 100%; }
}

/* Phone VERTICAL: the portrait crop — Stuart's V-pose with the sun haloed
   behind his head. Aspect .79 against the ~.75 window means ~94% of the scene
   is visible: this is the "zoom out" he asked for. Same top-only scrim as the
   641-900px block so the bright sky grades to dusk behind the headline while
   the figure and reflections keep full colour. `center top` pins the palms
   and sky; the figure fills the lower half under the copy. */
@media (max-width: 640px) {
  .services-hero {
    background:
      linear-gradient(180deg,
        rgba(4, 8, 32, 0.55) 0%,
        rgba(4, 8, 32, 0.44) 24%,
        rgba(4, 8, 32, 0.22) 46%,
        rgba(4, 8, 32, 0.00) 62%),
      url("../images/services/hero-services-phone.jpg") center top / cover no-repeat;
  }
}

@media (max-width: 680px) {
  .hero {
    min-height: 520px;
    background:
      linear-gradient(rgba(7, 30, 45, 0.12), rgba(7, 30, 45, 0.22)),
      url("../images/index/hero-lagoon-split.jpg") center 28% / cover no-repeat;
    background:
      linear-gradient(rgba(7, 30, 45, 0.12), rgba(7, 30, 45, 0.22)),
      image-set(
        url("../images/index/hero-lagoon-split.webp") type("image/webp"),
        url("../images/index/hero-lagoon-split.jpg") type("image/jpeg")
      ) center 28% / cover no-repeat;
  }

  .hero-content { padding: 58px 0 72px; }

  .pretitle {
    font-size: 0.78rem;
    letter-spacing: 0.13em;
    margin-bottom: 16px;
  }

  /* eyebrow rules look broken once the text wraps — drop them, keep centered label */
  .pretitle-rule::before,
  .pretitle-rule::after { display: none; }

  /* PHONE CREDIT — centred, no left rule.
     Measured at 390: right-aligned, the aqua border-left landed at x=145, which
     is under the MIDDLE of the centred "Explore Services" button (71-320), with
     only 5px of vertical clearance. It read as part of the button rather than a
     credit. Everything else in the phone hero is centred, so a right-aligned
     block with a vertical rule had no axis to belong to.
     The rule is dropped here (it needs a left edge to sit against) and the block
     is centred under the CTAs with real clearance. Desktop keeps the rule — it
     has the corner placement Stuart specifically liked. */
  .hero-credit {
    position: static;
    align-items: center;
    margin: 22px auto 18px;   /* bottom margin: it was flush to the hero edge */
    padding-left: 0;
    border-left: 0;
    text-align: center;
    /* 0.72rem (11.5px), not 0.6rem (9.6px). Stuart's clients skew older and 9.6px
       is below the point where small caps stay comfortably legible on a phone.
       This is the smallest type on the page — nothing should sit under it. */
    font-size: 0.72rem;
  }

  .hero h1 {
    /* section h2s bottom out at 1.9rem (30.4px); 8vw gave 30px here, so the page
       title tied with its own sections on a phone. Must stay above that floor. */
    font-size: clamp(2.1rem, 9.4vw, 3.1rem);
    line-height: 1.16;
  }

  .hero-subtitle {
    margin-top: 20px;
    font-size: 0.98rem;
    font-weight: 500;
    line-height: 1.6;
    text-shadow: 0 2px 12px rgba(0,0,0,0.58);
  }

  .hero-actions {
    margin-top: 24px;
    gap: 12px;
  }

  .page-hero {
    padding: 96px 0 96px;
  }

  .services-hero {
    /* same one-screen cap as the base rule, at this breakpoint's proportions.
       Bottom padding is deliberately HEAVIER than top: the copy block was
       finishing too close to the section boundary once the hero was capped
       (Stuart 2026-07-26). Still fits one screen — this only spends headroom
       the cap had left over. */
    min-height: min(520px, calc(100vh - var(--nav-h)));
    padding-top: clamp(36px, 6vh, 100px);
    padding-bottom: clamp(68px, 10vh, 132px);
  }

  .page-hero h1 {
    font-size: clamp(2rem, 10vw, 3.1rem);
  }

  .page-hero p {
    font-size: 1rem;
  }

  .btn,
  .btn-row .btn,
  .center-actions .btn {
    width: 100%;
    min-height: 48px;
    padding: 12px 18px;
  }

  .signature,
  .services,
  .service-paths,
  .why,
  .method-section,
  .cta-section,
  .split-section,
  .testimonials-preview,
  .intro {
    padding-top: 62px;
    padding-bottom: 62px;
  }

  .signature p,
  .why > .container > p,
  .services > .container > p,
  .method-section p,
  .intro p {
    font-size: 0.98rem;
  }

  .split-content p {
    text-align: left;
  }

  .credibility-grid { grid-template-columns: repeat(2, 1fr); }

  .credibility-item {
    padding: 16px 8px;
    border-right: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
  }

  .credibility-item:nth-child(2),
  .credibility-item:nth-child(4) {
    border-right: 0;
  }

  .credibility-item:nth-child(3),
  .credibility-item:nth-child(4) {
    border-bottom: 0;
  }

  .credibility-icon {
    width: 38px;
    height: 38px;
    margin-bottom: 8px;
  }

  .credibility-item strong {
    font-size: 1rem;
    margin-bottom: 4px;
  }

  .credibility-item span {
    font-size: 0.74rem;   /* 10.6px -> 11.8px, same reason as the hero credit */
    line-height: 1.3;
  }

  .why-grid,
  .method-grid,
  .service-grid {
    grid-template-columns: 1fr;
  }

  .why-card::after { font-size: 3.8rem; }
  .service-card { min-height: auto; }
  .btn-row { flex-direction: column; }

  .footer-logo-wrap {
    width: 54px;
    height: 54px;
    border-radius: 15px;
    padding: 5px;
  }

  .footer-logo-wrap img {
    width: 100%;
    height: 100%;
  }

  .footer-bottom {
    margin-top: 28px;
  }
}

/* ==========================================================================
   MEASURE FLOOR FOR SMALL SCREENS  (keep this AFTER every measure it lists)
   --------------------------------------------------------------------------
   The `max-width: min(<px>, <n>vw)` measures on this page exist so copy widens
   on a 27" monitor. The vw term has no floor, so it keeps shrinking all the way
   down: measured on a 390px phone it gave the hero 250px, the split-feature
   copy 179px, and wrapped the h1 onto FIVE lines.

   If you add another `min(px, vw)` measure anywhere above, add its selector
   here too, or it will collapse on phones.
   ========================================================================== */
@media (max-width: 900px) {
  .hero-content,
  .hero-subtitle,
  .signature p,
  .intro p,
  .split-feature .split-content,
  .why > .container > p,
  .method-section p,
  .services > .container > p,
  .cta-box,
  .cta-box p { max-width: 100%; }
}

/* ==========================================================================
   LANDSCAPE PHONE  (must stay LAST in this file)
   --------------------------------------------------------------------------
   Measured 844x390: nav 82px leaves 308px of screen, but the hero's 610px
   min-height floor plus 80/100 padding rendered a 579px hero, pushing BOTH
   CTAs below the fold with nothing above them to suggest scrolling.

   This block was first written near the top of the file and silently lost the
   cascade - later `.hero-content` padding rules overrode it and only the
   !important min-height survived. It has to live at the END.

   Type sizes are deliberately NOT reduced here. Shrinking the h1 would buy
   ~40px at the cost of legibility, and legibility for older eyes is a stated
   requirement for this site. Padding and CTA layout give up the space instead.
   ========================================================================== */
@media (orientation: landscape) and (max-height: 560px) {
  .hero { min-height: calc(100vh - var(--nav-h)); }
  .hero .hero-content { padding-top: 30px; padding-bottom: 34px; }
  .hero .hero-content p { margin-bottom: 20px; }

  /* Landscape has width to spare and no height to spare, so trade one for the
     other: the 540px portrait column is widened, which puts the two CTAs on a
     single row (they need 586px) and shortens the h1 by a line. */
  .hero .hero-content { max-width: min(760px, 92vw); }

  /* stacked CTAs cost ~100px of a 308px screen; side by side costs ~43px */
  .hero .hero-actions {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    gap: 14px 28px;
  }
}

/* ==========================================================================
   FOOTER BRAND + CONTACT LINE  (moved out of legacy-pages.css, 2026-07-29)
   --------------------------------------------------------------------------
   These lived in legacy-pages.css, which index/services/contact were loading
   in full — 140 KB — to use these rules and nothing else. Now the footer is a
   single shared partial, EVERY page needs them, so they belong in the shared
   sheet. legacy-pages.css no longer defines them; do not re-add them there.
   ========================================================================== */
.hydrotherapy-page .footer-logo-wrap {
  width: 74px !important;
  height: 74px !important;
  padding: 7px !important;
  border-radius: 22px !important;
  background: var(--brand-orange) !important;
  border: 1px solid rgba(247,147,31,0.50) !important;
  box-shadow: 0 12px 26px rgba(0,0,0,0.18) !important;
  overflow: hidden !important;
}
.hydrotherapy-page .footer-logo-wrap img {
  width: 100% !important;
  height: 100% !important;
  object-fit: contain !important;
  border-radius: 16px !important;
}
.hydrotherapy-page .footer-contact-line svg {
  width: 22px !important;
  height: 22px !important;
  margin-top: 3px !important;
}
.hydrotherapy-page .footer-contact-line strong {
  color: var(--white) !important;
  font-weight: 700 !important;
}
.footer-logo-wrap {
  width: 74px;
  height: 74px;
  padding: 0;
  background: transparent;
  border: 0;
  box-shadow: none;
  overflow: visible;
}
.footer-logo-wrap img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  border-radius: 0;
}
.footer-contact-line {
  gap: 12px;
}
.footer-contact-line svg {
  width: 20px !important;
  height: 20px !important;
  margin-top: 4px;
}
.footer-contact-line strong {
  color: var(--white);
  font-weight: 900;
}
.aquatic-fitness-page .footer-logo-wrap {
  width: 74px;
  height: 74px;
  padding: 7px;
  border-radius: 22px;
  background: linear-gradient(145deg, #ffab45 0%, var(--brand-orange) 46%, #c76d12 100%) !important;
  border: 1px solid rgba(247,147,31,0.55) !important;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.38), 0 12px 28px rgba(0,0,0,0.20) !important;
  overflow: hidden;
}
.aquatic-fitness-page .footer-logo-wrap img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  border-radius: 16px;
}
.aquatic-fitness-page .footer-contact-line svg {
  width: 22px !important;
  height: 22px !important;
}
.aquatic-fitness-page .footer-contact-line strong {
  color: var(--white) !important;
  font-weight: 700 !important;
}
.aquatic-fitness-page .footer-logo-wrap {
  width: 74px !important;
  height: 74px !important;
  padding: 7px !important;
  border-radius: 18px !important;
  background: var(--brand-orange) !important;
  border: 1px solid rgba(247,147,31,0.42) !important;
  box-shadow: 0 12px 28px rgba(0,0,0,0.18) !important;
  overflow: hidden !important;
}
.aquatic-fitness-page .footer-logo-wrap img {
  border-radius: 13px !important;
}
.footer-logo-wrap {
  width: 72px;
  height: 72px;
  border-radius: 18px;
  padding: 6px;
  background: var(--brand-orange);
  border: 0;
  box-shadow: none;
  display: grid;
  place-items: center;
  overflow: hidden;
}
.footer-logo-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 12px;
}
.footer-contact-line {
  gap: 12px;
}
.footer-contact-line svg {
  width: 20px !important;
  height: 20px !important;
  flex: 0 0 20px;
  margin-top: 4px;
  fill: var(--aqua-light) !important;
  opacity: 0.95;
}
.footer-contact-line strong {
  color: var(--white);
  font-weight: 600;
}
@media (max-width: 680px) {

  .footer-logo-wrap {
    width: 54px;
    height: 54px;
    border-radius: 15px;
    padding: 5px;
  }

  .footer-contact-line svg {
    width: 18px !important;
    height: 18px !important;
    flex-basis: 18px;
  }}
/* Footer current approved style */
.footer-logo-wrap {
  background: var(--brand-orange) !important;
  border: 0 !important;
  box-shadow: none !important;
}
.footer-contact-line strong {
  color: var(--white) !important;
  font-weight: 600;
}
.footer-contact-line svg {
  width: 20px !important;
  height: 20px !important;
  flex: 0 0 20px !important;
}
