/* Evagrow v9 website drafts — futuristic design system
   Brand palette evolved from the original Evagrow site:
   forest #03331B · teal #2C8A91 · coral #E27D60 · cream #F9F4E0 · Montserrat headings */

:root {
  --bg:        #04140d;
  --bg-2:      #071e14;
  --forest:    #03331b;
  --teal:      #2c8a91;
  --teal-lit:  #45d3c9;
  --coral:     #e27d60;
  --coral-lit: #ff9f7e;
  --cream:     #ffffff; /* Eva's call, 19 July: she prefers white to the original off-white
                            cream and wanted to see it live rather than described. This one
                            variable feeds the gradient text, the cursor dot, the letter-scene
                            pen and the credential badge — swap the hex back to #f9f4e0 to
                            revert everywhere at once if it doesn't land. */
  --text:      #eaf2ec;
  --muted:     #9db3a6;
  --line:      rgba(69, 211, 201, 0.16);
  --panel:     rgba(8, 38, 26, 0.55);
  --panel-2:   rgba(9, 46, 31, 0.75);
  --radius:    18px;
  --maxw:      1320px;
  --ease:      cubic-bezier(0.22, 1, 0.36, 1);
  --grid-y:    0px;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }

/* Lenis smooth scroll (upstream lenis.css, inlined to save a request) */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: clip; }
/* Scoped to lenis-scrolling (active scroll only), NOT lenis-smooth (always on). The blanket
   version disables pointer events on every iframe permanently, which silently makes an embedded
   Calendly/YouTube unclickable — it renders perfectly and just ignores you. This way iframes are
   only inert during scroll momentum, and fully clickable at rest. */
.lenis.lenis-scrolling iframe { pointer-events: none; }

/* Belt-and-braces: embeds we explicitly want interactive stay clickable even mid-scroll.
   Pair with data-lenis-prevent on the wrapper so the wheel scrolls the widget, not the page. */
.calendly-inline-widget iframe,
.embed-interactive iframe { pointer-events: auto !important; }

body {
  font-family: 'Inter', system-ui, -apple-system, sans-serif;
  color: var(--text);
  background: var(--bg);
  line-height: 1.6;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  position: relative;
}

/* Ambient background: grid + drifting glow orbs */
body::before {
  content: "";
  position: fixed; inset: 0;
  background-image:
    linear-gradient(rgba(69,211,201,0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(69,211,201,0.05) 1px, transparent 1px);
  background-size: 64px 64px;
  background-position: 0 var(--grid-y);
  mask-image: radial-gradient(ellipse 80% 60% at 50% 0%, #000 30%, transparent 75%);
  z-index: 0;
  pointer-events: none;
}

.orb {
  position: fixed;
  border-radius: 50%;
  filter: blur(90px);
  opacity: 0.5;
  z-index: 0;
  pointer-events: none;
  animation: drift 18s var(--ease) infinite alternate;
}
.orb.teal  { width: 520px; height: 520px; background: radial-gradient(circle, var(--teal), transparent 65%); top: -140px; right: -120px; }
.orb.coral { width: 460px; height: 460px; background: radial-gradient(circle, var(--coral), transparent 65%); bottom: -160px; left: -120px; animation-delay: -6s; opacity: 0.35; }
@keyframes drift { to { transform: translate3d(-40px, 50px, 0) scale(1.12); } }

/* Layout */
.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; position: relative; z-index: 2; }
section { position: relative; z-index: 2; padding: 96px 0; }
.eyebrow {
  display: inline-flex; align-items: center;
  font-family: 'Montserrat', sans-serif; font-weight: 600;
  font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--teal-lit);
}

h1, h2, h3, h4 { font-family: 'Montserrat', sans-serif; line-height: 1.12; letter-spacing: -0.02em; font-weight: 700; }
h1 { font-size: clamp(2.4rem, 5vw, 4.8rem); font-weight: 800; }
h2 { font-size: clamp(1.9rem, 3.6vw, 2.9rem); }
h3 { font-size: 1.25rem; }
p  { color: var(--muted); font-size: 1.02rem; }
.lead { font-size: clamp(1.05rem, 1.6vw, 1.28rem); color: #cdddd2; }

/* Gradient text. Only for elements that are NOT split: background-clip:text breaks the moment
   SplitText wraps lines/chars in their own elements, so split headings use .accent instead. */
.grad-text {
  background: linear-gradient(100deg, var(--teal-lit) 0%, var(--cream) 40%, var(--coral-lit) 70%, var(--teal-lit) 100%);
  background-size: 220% auto;
  -webkit-background-clip: text; background-clip: text; color: transparent;
}

/* Solid accent, safe to split */
.accent { color: var(--teal-lit); }

/* SplitText line masking: each line sits in an overflow-hidden wrapper so it can slide up
   from behind its own edge rather than just fading. */
.split-line { will-change: transform; }
[data-split] { visibility: hidden; }
[data-split].is-split { visibility: visible; }

/* Scroll progress bar (injected by animations.js) */
.scroll-progress {
  position: fixed; top: 0; left: 0; right: 0; height: 2px;
  transform: scaleX(0); transform-origin: 0 50%;
  background: linear-gradient(90deg, var(--teal-lit), var(--coral));
  box-shadow: 0 0 14px rgba(69,211,201,0.7);
  z-index: 100; pointer-events: none;
}

/* Buttons */
.btn {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 0.98rem;
  padding: 15px 28px; border-radius: 100px; border: 0; cursor: pointer;
  text-decoration: none; transition: transform .3s var(--ease), box-shadow .3s var(--ease), filter .3s var(--ease);
}
.btn-primary {
  color: #04140d;
  background: linear-gradient(100deg, var(--teal-lit), var(--teal) 60%, var(--coral));
  box-shadow: 0 8px 30px rgba(69,211,201,0.35), inset 0 0 0 1px rgba(255,255,255,0.25);
}
.btn-primary:hover { transform: translateY(-3px); box-shadow: 0 14px 44px rgba(69,211,201,0.5); filter: brightness(1.06); }
.btn-ghost {
  color: var(--text); background: var(--panel); border: 1px solid var(--line); backdrop-filter: blur(6px);
}
.btn-ghost:hover { transform: translateY(-3px); border-color: var(--teal-lit); color: #fff; }
.btn .arrow { transition: transform .3s var(--ease); }
.btn:hover .arrow { transform: translateX(4px); }
.cta-sub { margin-top: 14px; font-size: 0.9rem; color: var(--muted); }

/* Nav */
.nav {
  position: sticky; top: 0; z-index: 50;
  backdrop-filter: blur(14px);
  background: rgba(4,20,13,0.72);
  border-bottom: 1px solid var(--line);
  transition: background .4s var(--ease), box-shadow .4s var(--ease), border-color .4s var(--ease);
}
.nav.is-stuck {
  background: rgba(4,20,13,0.94);
  border-bottom-color: rgba(69,211,201,0.28);
  box-shadow: 0 10px 40px rgba(0,0,0,0.45);
}
.nav .wrap { display: flex; align-items: center; justify-content: space-between; padding-top: 14px; padding-bottom: 14px; transition: padding .4s var(--ease); }
.nav.is-stuck .wrap { padding-top: 9px; padding-bottom: 9px; }
.nav__logo img { transition: height .4s var(--ease); }
.nav.is-stuck .nav__logo img { height: 31px; }
.nav__logo { display: flex; align-items: center; gap: 10px; text-decoration: none; }
.nav__logo img { height: 34px; width: auto; filter: drop-shadow(0 1px 6px rgba(0,0,0,0.35)); }
.nav__links { display: flex; align-items: center; gap: 30px; }
.nav__links a { color: var(--muted); text-decoration: none; font-size: 0.94rem; font-weight: 500; transition: color .2s; }
.nav__links a:hover { color: var(--text); }
.nav__links .btn { padding: 11px 20px; }
.nav__burger { display: none; background: none; border: 0; color: var(--text); cursor: pointer; padding: 4px; }
.nav__burger .icon { width: 26px; height: 26px; }

/* ---- Nav "Services" dropdown, CSS-only (no JS): hover on desktop, :focus-within for keyboard.
   Site-wide nav unification, 17 July 2026. ---- */
.nav__drop { position: relative; display: flex; align-items: center; }
.nav__drop-trigger {
  display: inline-flex; align-items: center; gap: 5px; cursor: pointer;
  color: var(--muted); font-size: 0.94rem; font-weight: 500; transition: color .2s;
}
.nav__drop-trigger .icon { width: 12px; height: 12px; transition: transform .25s var(--ease); }
.nav__drop:hover .nav__drop-trigger,
.nav__drop:focus-within .nav__drop-trigger { color: var(--text); }
.nav__drop:hover .nav__drop-trigger .icon,
.nav__drop:focus-within .nav__drop-trigger .icon { transform: rotate(180deg); }
.nav__drop-panel {
  position: absolute; top: calc(100% + 18px); left: 50%; transform: translateX(-50%) translateY(6px);
  min-width: 250px; padding: 8px; display: grid; gap: 2px;
  background: rgba(4,20,13,0.97); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 24px 60px rgba(0,0,0,0.5); backdrop-filter: blur(14px);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .25s var(--ease), transform .25s var(--ease), visibility .25s;
  z-index: 60;
}
/* Invisible bridge filling the 18px gap between the trigger and the panel. Without this, the
   cursor leaves .nav__drop's hoverable box the moment it heads toward the panel — :hover drops,
   the panel closes, and the whole menu reads as "not clickable" (Eva's report, 19 July). The
   bridge is a child of the panel so it always exists in that gap, and explicitly opts back into
   pointer-events (it would otherwise inherit none from the panel's own hidden-state default). */
.nav__drop-panel::before {
  content: ""; position: absolute; left: 0; right: 0; top: -18px; height: 18px;
  pointer-events: auto;
}
.nav__drop:hover .nav__drop-panel,
.nav__drop:focus-within .nav__drop-panel { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(-50%) translateY(0); }
.nav__drop-panel a { display: block; padding: 11px 14px; border-radius: 9px; font-size: 0.9rem; color: var(--muted); text-decoration: none; }
.nav__drop-panel a:hover { background: rgba(69,211,201,0.1); color: #fff; }

/* Hero */
.hero { padding: 88px 0 72px; text-align: center; }
.hero .wrap { display: flex; flex-direction: column; align-items: center; }
.hero h1 { margin: 26px 0 22px; max-width: 21ch; }
.hero .lead { max-width: 70ch; }
.hero__cta { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; margin-top: 34px; }
.hero__visual {
  margin: 56px auto 0; max-width: 940px; width: 100%;
  border-radius: 24px; overflow: hidden; position: relative;
  border: 1px solid var(--line);
  box-shadow: 0 40px 120px rgba(0,0,0,0.55), 0 0 0 1px rgba(69,211,201,0.08);
}
.hero__visual img { display: block; width: 100%; height: auto; filter: saturate(1.05) contrast(1.02); }
.hero__visual::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 40%, rgba(4,20,13,0.55) 100%),
              linear-gradient(100deg, rgba(44,138,145,0.28), transparent 60%);
  mix-blend-mode: multiply;
}
.hero__badge {
  position: absolute; left: 20px; bottom: 18px; z-index: 3;
  display: flex; align-items: center; gap: 10px;
  font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 0.86rem;
  padding: 10px 16px; border-radius: 100px;
  background: rgba(4,20,13,0.7); border: 1px solid var(--line); backdrop-filter: blur(8px);
}

/* Section heading */
.sec-head { max-width: 66ch; margin-bottom: 48px; }
.sec-head.center { margin-left: auto; margin-right: auto; text-align: center; }
.sec-head h2 { margin: 18px 0 16px; }

/* Glass cards */
.glass {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  backdrop-filter: blur(10px); transition: transform .35s var(--ease), border-color .35s var(--ease), box-shadow .35s var(--ease);
}
.grid { display: grid; gap: 22px; }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-2 { grid-template-columns: repeat(2, 1fr); }

.stack-card { padding: 30px; }
/* Hover lift is an interaction promise, so only .card-click (a genuinely clickable card,
   whole surface linked via a.stretch) gets it. Static content cards stay still. */
.card-click { position: relative; }
.card-click:hover { transform: translateY(-8px); border-color: var(--teal-lit); box-shadow: 0 24px 60px rgba(0,0,0,0.45); }
.card-click a.stretch::after { content: ""; position: absolute; inset: 0; z-index: 1; }
.stack-card__num {
  font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 0.85rem;
  color: var(--teal-lit); letter-spacing: 0.12em;
}
.stack-card__icon {
  width: 52px; height: 52px; border-radius: 14px; margin: 14px 0 18px;
  display: grid; place-items: center;
  background: linear-gradient(135deg, rgba(69,211,201,0.18), rgba(226,125,96,0.14));
  border: 1px solid var(--line); font-size: 1.5rem;
}
.stack-card h3 { color: #fff; }
.stack-card__sub { color: var(--teal-lit); font-weight: 600; font-size: 0.9rem; margin: 6px 0 14px; font-family: 'Montserrat', sans-serif; }
.stack-card p { font-size: 0.97rem; }

/* Proof */
.proof-grid { grid-template-columns: repeat(2, 1fr); }
.proof-card { padding: 32px; display: flex; flex-direction: column; gap: 16px; }
.proof-card__logo { height: 46px; display: flex; align-items: center; }
.proof-card__logo img { max-height: 46px; max-width: 180px; width: auto; object-fit: contain; background: #fff; padding: 8px 12px; border-radius: 10px; }
.pending {
  display: inline-flex; align-items: center; gap: 7px; align-self: flex-start;
  font-size: 0.76rem; font-weight: 600; font-family: 'Montserrat', sans-serif;
  color: var(--coral-lit); background: rgba(226,125,96,0.12);
  border: 1px solid rgba(226,125,96,0.3); border-radius: 100px; padding: 5px 12px;
  letter-spacing: 0.04em;
}
/* Lucide clock-3, as a mask so it inherits currentColor without touching the markup */
.pending::before {
  content: ""; width: 12px; height: 12px; flex: 0 0 auto; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 6v6h4'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 6v6h4'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* ICP two-column */
.icp-card { padding: 34px; }
.icp-card h3 { color: #fff; margin-bottom: 8px; }
.icp-card .tag { color: var(--teal-lit); font-family: 'Montserrat',sans-serif; font-weight:600; font-size:0.82rem; letter-spacing:0.08em; text-transform:uppercase; }
.icp-card ul { list-style: none; margin-top: 16px; display: flex; flex-wrap: wrap; gap: 8px; }
.icp-card li { font-size: 0.86rem; color: #cdddd2; background: rgba(255,255,255,0.04); border: 1px solid var(--line); padding: 6px 12px; border-radius: 100px; }

/* ---- Icons: Lucide (ISC licence), inlined as an SVG sprite ----
   Inlined rather than loaded from Lucide's CDN script: no dependency, no flash of missing
   icons, renders instantly, and ports into WordPress as plain markup.
   Usage: <svg class="icon"><use href="#i-radar"/></svg> */
.sprite { position: absolute; width: 0; height: 0; overflow: hidden; }
.icon {
  width: 1em; height: 1em; display: inline-block; vertical-align: middle;
  fill: none; stroke: currentColor; stroke-width: 2;
  stroke-linecap: round; stroke-linejoin: round;
}
.stack-card__icon .icon { width: 25px; height: 25px; color: var(--teal-lit); }
.hero__badge .icon { width: 14px; height: 14px; color: var(--teal-lit); }
.founder-card__cred .icon { width: 14px; height: 14px; color: var(--teal-lit); }
.eyebrow .icon { width: 13px; height: 13px; }

/* ---- Custom cursor (desktop, pointer:fine only; injected by animations.js) ---- */
/* z-index sits above every other layer (nav 50/60, progress bar 100, consent 300):
   the cursor is the pointer itself, so nothing should ever render on top of it. */
.cur-dot, .cur-ring {
  position: fixed; top: 0; left: 0; z-index: 9999; pointer-events: none;
  border-radius: 50%; mix-blend-mode: difference;
}
.cur-dot  { width: 7px; height: 7px; background: var(--cream); margin: -3.5px 0 0 -3.5px; }
.cur-ring { width: 40px; height: 40px; border: 1px solid rgba(249,244,224,0.6); margin: -20px 0 0 -20px; }
@media (pointer: coarse) { .cur-dot, .cur-ring { display: none; } }
body.has-cursor, body.has-cursor a, body.has-cursor button { cursor: none; }

/* ---- Marquee ---- */
.marquee {
  position: relative; z-index: 2; overflow: hidden;
  padding: 22px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
  background: rgba(8,38,26,0.4); backdrop-filter: blur(6px);
}
.marquee__track { display: flex; gap: 0; width: max-content; will-change: transform; }
.marquee__group { display: flex; align-items: center; gap: 34px; padding-right: 34px; }
.marquee__group span {
  font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 1.05rem;
  letter-spacing: 0.02em; color: #cdddd2; white-space: nowrap;
}
/* CSS-drawn diamond separator, so no glyph is involved */
.marquee__group i {
  width: 5px; height: 5px; flex: 0 0 auto;
  background: var(--teal-lit); transform: rotate(45deg); display: inline-block;
}

/* Client logo variant: logos ride on white chips because most client marks are dark
   and would vanish on the dark theme. */
.marquee--clients { margin-bottom: -1px; }
.marquee--clients .marquee__group { gap: 26px; padding-right: 26px; }
.client-chip {
  display: flex; align-items: center; justify-content: center;
  background: #fff; border-radius: 10px; padding: 9px 18px; height: 48px;
  flex: 0 0 auto; opacity: 0.92;
}
.client-chip img { max-height: 30px; max-width: 130px; width: auto; display: block; }

/* ---- Image clip reveals ----
   Deliberately NOT hidden here. The from-state is set at runtime by GSAP, so if the CDN
   fails the images just show normally instead of being clipped to nothing forever. */

/* ---- Skew wrapper: scroll velocity leans the cards ---- */
.skewer { will-change: transform; }

/* ---- Letter scene (homepage): a patient letter drawn line-by-line on scroll via DrawSVG.
   Authored FULLY DRAWN — the animation rewinds it to zero at runtime, so if JS or the CDN
   fails the visitor sees a complete letter, never a blank card. ---- */
.letter-scene { padding: 26px; }
.letter-scene svg { width: 100%; height: auto; display: block; }
.ls-card { fill: rgba(4, 20, 13, 0.45); stroke: rgba(69, 211, 201, 0.4); stroke-width: 2; }
.ls-head { stroke: var(--teal-lit); stroke-width: 3.5; stroke-linecap: round; }
.ls-logo { fill: none; stroke: var(--coral); stroke-width: 2.5; }
.ls-line { stroke: #cdddd2; stroke-width: 2.5; stroke-linecap: round; opacity: 0.8; fill: none; }
.ls-sig  { stroke: var(--coral-lit); stroke-width: 2.5; stroke-linecap: round; fill: none; }
.ls-pen-body { fill: var(--cream); }
.ls-pen-nib  { fill: var(--teal-lit); }
.ls-done circle { fill: rgba(69, 211, 201, 0.12); stroke: var(--teal-lit); stroke-width: 2; }
.ls-done path { stroke: var(--teal-lit); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; fill: none; }

/* ---- Shared scroll-scene primitives (19 July) ----
   Three new scroll-drawn scenes reuse this base rather than duplicating .letter-scene's rules:
   answer-scene (homepage, AI search citation), radar-scene (get-found, GEO visibility),
   route-scene (ai-infrastructure, enquiry routing). Each scene keeps its own prefixed classes
   for anything unique to it, but shares card/line/badge/icon treatment so new scenes stay
   visually consistent with the letter scene without hand-tuning colour per scene.
   Icons inside these scenes are the SAME <symbol> defs from the page's Lucide sprite, pulled in
   via <use href="#i-name">, not redrawn — one icon source for the whole page. */
.scroll-scene { padding: 26px; max-width: 400px; margin-left: auto; margin-right: auto; }
.scroll-scene svg { width: 100%; height: auto; display: block; overflow: visible; }
.scene-card   { fill: rgba(4, 20, 13, 0.45); stroke: rgba(69, 211, 201, 0.4); stroke-width: 2; }
.scene-line   { stroke: #cdddd2; stroke-width: 2.5; stroke-linecap: round; opacity: 0.8; fill: none; }
.scene-connector { stroke: rgba(205, 221, 210, 0.55); stroke-width: 1.75; stroke-dasharray: 3 5; fill: none; }
.scene-node   { fill: rgba(4, 20, 13, 0.6); stroke: rgba(69, 211, 201, 0.55); stroke-width: 1.5; }
.scene-icon   { fill: none; stroke: var(--teal-lit); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.scene-icon-coral { fill: none; stroke: var(--coral); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.scene-badge circle { fill: rgba(69, 211, 201, 0.12); stroke: var(--teal-lit); stroke-width: 2; }
.scene-badge .scene-icon { stroke: var(--teal-lit); }
.scene-dot    { fill: var(--coral-lit); }

/* Answer scene (homepage) */
.as-highlight { fill: rgba(226, 125, 96, 0.22); }
.as-pin .scene-icon { stroke: var(--coral); }

/* Radar scene (get-found). No opacity:0 default: if the DrawSVG CDN ever fails, the JS
   block that would set the "from" state simply never runs, so this stays at its raw markup
   state instead of vanishing forever — a static ring rather than a missing one. */
.rs-ping { fill: none; stroke: var(--teal-lit); stroke-width: 1.5; }

/* Route scene (ai-infrastructure). Same reasoning: no baked-in opacity:0. */
.ib-tick { stroke: var(--teal-lit); stroke-width: 2; stroke-linecap: round; }

/* Case-study screenshots (Yanni redesign). Styled so a not-yet-uploaded image still looks
   intentional: the figure keeps its frame and caption while the img area shows the panel. */
.cs-shot {
  margin: 0; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--panel); overflow: hidden;
}
.cs-shot img {
  display: block; width: 100%; height: auto; min-height: 220px;
  object-fit: cover; background: var(--bg-2);
}
.cs-shot figcaption {
  padding: 14px 18px; font-size: 0.88rem; color: var(--muted);
  border-top: 1px solid var(--line);
}

/* ---------------- Photo layer (22 July) ----------------
   AI-generated editorial stills, added as atmosphere alongside the hand-drawn DrawSVG
   scenes, never instead of them. Base component is graceful-degradation-first: the
   aspect-ratio box holds the layout before the image decodes (stops CLS), and the resting
   state is fully visible plain CSS with no JS involved. Two variants layer scroll motion on
   top in animations.js, both inside the reduced-motion matchMedia guard:
   - .photo-panel--parallax: img sits oversized so a scrubbed pan/zoom never exposes an edge.
   - .photo-mask: the panel's own clip-path is the *fully revealed* resting state (inset(0)),
     so a CDN failure just leaves a normal static photo; JS only ever animates FROM a smaller
     inset, never sets a hidden default in CSS. */
.photo-panel {
  position: relative; border-radius: var(--radius); overflow: hidden;
  aspect-ratio: 1376 / 768; background: var(--bg-2); border: 1px solid var(--line);
  clip-path: inset(0); /* resting state for .photo-mask; harmless no-op otherwise */
}
.photo-panel img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
/* v2 imagery direction (22 July, Marco): photos are bright professional photo-shoot style
   and must STAY bright — they carry the contrast against the dark site. The old multiply
   grade darkened them twice over and is gone. What remains is a faint bottom scrim purely
   so a figcaption stays legible when present. */
.photo-panel::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(0deg, rgba(4,20,13,0.22), transparent 30%);
}
.photo-panel figcaption {
  position: absolute; left: 16px; bottom: 14px; z-index: 2;
  font-size: 0.8rem; color: var(--muted); background: rgba(4,20,13,0.55);
  border: 1px solid var(--line); border-radius: 100px; padding: 6px 14px; backdrop-filter: blur(6px);
}
/* Oversized image so the scrubbed pan/zoom tween in animations.js never shows a bare edge. */
.photo-panel--parallax img { transform: scale(1.12); transform-origin: center; will-change: transform; }

/* 22 July fix: standalone photo panels (one per section, not in a grid) were reading as
   oversized against the surrounding copy measure. --capped reins in the width and centres
   the panel instead of letting it span the full content column. */
.photo-panel--capped { max-width: 560px; margin-left: auto; margin-right: auto; }
/* --band: a short, wide letterbox crop for hero-style panels. object-fit: cover on the img
   (set above) already handles the crop, and the parallax/mask JS in animations.js is
   ratio-agnostic, so no JS change is needed to pair this with --parallax or .photo-mask. */
.photo-panel--band { aspect-ratio: 21 / 9; }

/* Founders — two cards side by side on desktop, stacking on mobile (24 July).
   Capped so the photos stay modest; shorter 4/3 crop set on .founder-card__photo. */
.founders-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 28px; max-width: 900px; margin: 0 auto; }
.founder-card { padding: 0; overflow: hidden; display: flex; flex-direction: column; }
/* (Founder cards aren't clickable, so no hover lift.) */
.founder-card__photo {
  position: relative; aspect-ratio: 4 / 3; overflow: hidden;
  background: #000; /* Eva's photo spec, 19 July: black behind, photo layered over it.
                        This is the treatment for every Evagrow photo going forward — done here
                        in CSS rather than pre-baked in Canva, so it's non-destructive: swap the
                        source image and the treatment still applies automatically.
                        21 July: Eva saw it live and asked to brighten it, so opacity moved
                        from 0.7 to 0.92 below. */
  border-bottom: 1px solid var(--line);
}
/* These are candid/lifestyle shots, not headshots, so the subject isn't centred.
   --focal tunes each photo's crop independently: set it per card in the HTML.
   Format: <horizontal> <vertical>, e.g. "70% 55%" pulls right and down. */
.founder-card__photo img {
  width: 100%; height: 100%; object-fit: cover;
  object-position: var(--focal, center 30%);
  opacity: 0.92;
}
.founder-card__body { padding: 26px 30px 32px; }
.founder-card__name { font-family: 'Montserrat',sans-serif; font-weight: 700; color: #fff; font-size: 1.3rem; }
.founder-card__role {
  color: var(--teal-lit); font-family: 'Montserrat',sans-serif; font-weight: 600;
  font-size: 0.82rem; letter-spacing: 0.08em; text-transform: uppercase; margin: 8px 0 14px;
}
.founder-card__body p { font-size: 0.96rem; }
.founder-card__cred {
  display: inline-flex; align-items: center; gap: 7px; margin-top: 16px;
  font-size: 0.78rem; font-weight: 600; font-family: 'Montserrat',sans-serif;
  color: var(--cream); background: rgba(255,255,255,0.05);
  border: 1px solid var(--line); border-radius: 100px; padding: 6px 13px;
}

/* Draft ribbon for pending sections */
.draft-section { position: relative; }
.draft-flag {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 0.72rem; letter-spacing: 0.1em; text-transform: uppercase;
  color: #ffce9e; background: rgba(226,125,96,0.14); border: 1px dashed rgba(226,125,96,0.5);
  padding: 7px 14px; border-radius: 8px; margin-bottom: 20px;
}
/* Lucide flag, masked so it inherits currentColor */
.draft-flag::before {
  content: ""; width: 12px; height: 12px; flex: 0 0 auto; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z'/%3E%3Cline x1='4' x2='4' y1='22' y2='15'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z'/%3E%3Cline x1='4' x2='4' y1='22' y2='15'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* Promise / guarantee */
.promise-list { list-style: none; display: grid; gap: 16px; margin-top: 8px; }
.promise-list li { display: flex; gap: 14px; padding: 20px 22px; }
.promise-list li .k { color: var(--teal-lit); font-weight: 700; font-family: 'Montserrat',sans-serif; min-width: 132px; font-size: 0.92rem; }
.promise-list li .v { color: #cdddd2; font-size: 0.97rem; }

/* Pricing */
.price-grid { grid-template-columns: repeat(3, 1fr); align-items: stretch; }
.price-card { padding: 32px; display: flex; flex-direction: column; }
.price-card.featured { border-color: var(--teal-lit); box-shadow: 0 0 0 1px var(--teal-lit), 0 30px 70px rgba(0,0,0,0.5); }
.price-card .plan { font-family: 'Montserrat',sans-serif; font-weight: 700; color: #fff; font-size: 1.15rem; }
.price-card .rec { font-size: 0.72rem; color: #04140d; background: var(--teal-lit); padding: 4px 10px; border-radius: 100px; font-weight: 700; font-family:'Montserrat',sans-serif; align-self:flex-start; margin-bottom: 12px; }
.price-card .amt { font-family: 'Montserrat',sans-serif; font-weight: 800; font-size: 1.7rem; color: #fff; margin: 12px 0 4px; }
.price-card .amt small { font-size: 0.85rem; color: var(--muted); font-weight: 500; }
.price-card .us { font-size: 0.82rem; color: var(--muted); margin-bottom: 16px; }
.price-card p.desc { font-size: 0.94rem; flex-grow: 1; }
.terms-line { margin-top: 26px; padding: 18px 22px; font-size: 0.9rem; color: #cdddd2; text-align: center; }

/* FAQ */
.faq { display: grid; gap: 14px; max-width: 820px; margin: 0 auto; }
.faq details { padding: 4px 24px; }
.faq summary { list-style: none; cursor: pointer; padding: 20px 0; font-family:'Montserrat',sans-serif; font-weight:600; color:#fff; font-size:1.02rem; display:flex; justify-content:space-between; gap:16px; align-items:center; }
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after { content: "+"; color: var(--teal-lit); font-size: 1.4rem; transition: transform .3s var(--ease); }
.faq details[open] summary::after { transform: rotate(45deg); }
.faq details p { padding-bottom: 22px; font-size: 0.97rem; }

/* Intake list */
.steps { counter-reset: s; display: grid; gap: 14px; }
.checklist { list-style: none; display: grid; gap: 12px; }
.checklist li { display: flex; gap: 12px; align-items: flex-start; color: #cdddd2; font-size: 0.98rem; }
.checklist li::before { content: "→"; color: var(--teal-lit); font-weight: 700; }

/* Live Calendly booking widget */
.booking-live { padding: 10px; overflow: hidden; }
.booking-live .calendly-inline-widget { border-radius: 12px; overflow: hidden; }

/* Booking placeholder */
.booking-ph {
  padding: 40px; text-align: center; border-style: dashed;
  border-color: rgba(69,211,201,0.3);
}
.booking-ph .ph-note { font-size: 0.86rem; color: var(--coral-lit); margin-top: 14px; }

/* Final CTA band */
.cta-band { text-align: center; padding: 84px 0; }
.cta-band .glass { padding: 60px 40px; }
.cta-band h2 { margin-bottom: 16px; }

/* Footer — three-column layout (brand / services / company), unified site-wide 17 July 2026 */
footer { border-top: 1px solid var(--line); padding: 60px 0 36px; position: relative; z-index: 2; }
footer img { height: 34px; filter: brightness(0) invert(1); opacity: 0.85; }
footer .muted { font-size: 0.85rem; color: var(--muted); }
footer a { color: var(--muted); text-decoration: none; font-size: 0.9rem; transition: color .2s; }
footer a:hover { color: var(--text); }
.footer-grid { display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 40px; }
.footer-col h3 {
  font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 0.8rem;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--teal-lit); margin-bottom: 16px;
}
.footer-col a { display: block; margin-bottom: 10px; }
.footer-brand img { height: 38px; width: auto; margin-bottom: 16px; filter: drop-shadow(0 1px 6px rgba(0,0,0,0.35)); }
.footer-brand p { font-size: 0.9rem; color: var(--muted); max-width: 34ch; }
.footer-bottom {
  border-top: 1px solid var(--line); margin-top: 40px; padding-top: 24px;
  text-align: center; font-size: 0.82rem; color: var(--muted);
}
@media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr; gap: 30px; } }

/* Scroll reveal */
.reveal { opacity: 0; transform: translateY(24px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.reveal.in { opacity: 1; transform: none; }

/* ---- Testimonials (testimonials.html), added for site-wide page build 17 July 2026 ---- */
.testi-card { padding: 30px; display: flex; flex-direction: column; gap: 14px; }
.testi-card .icon { width: 26px; height: 26px; color: var(--teal-lit); opacity: 0.6; }
.testi-card .quote { font-size: 0.95rem; color: #cdddd2; flex-grow: 1; }
.testi-card .who { font-family: 'Montserrat', sans-serif; font-weight: 700; color: #fff; font-size: 0.96rem; margin-top: 4px; }
.testi-card .biz { font-size: 0.83rem; color: var(--teal-lit); }

/* Keyboard focus — branded ring instead of the default blue (24 July, ui-ux-pro-max pass).
   :focus-visible only, so mouse clicks don't paint rings. */
:focus-visible { outline: 2px solid var(--teal-lit); outline-offset: 3px; }

/* Responsive */
@media (max-width: 900px) {
  .grid-3, .price-grid { grid-template-columns: 1fr; }
  .grid-2, .proof-grid { grid-template-columns: 1fr; }
  .founders-grid { grid-template-columns: 1fr; max-width: 460px; }
  .nav__links { display: none; }
  .nav__burger { display: block; }
  section { padding: 68px 0; }
  .promise-list li { flex-direction: column; gap: 4px; }

  /* 22 July fix: on tablet/mobile the grid these panels sit in collapses to one column,
     so an uncapped .photo-panel was spanning the full device width. Cap it and centre it
     like the desktop --capped variant, independent of which variant class is present. */
  .photo-panel { max-width: 560px; margin-left: auto; margin-right: auto; }

  /* Mobile nav panel. Toggled by the burger's click handler in animations.js (that JS runs
     unconditionally, before any GSAP check, so this works even if the CDN fails). */
  .nav.is-open .nav__links {
    display: flex; flex-direction: column; align-items: stretch; gap: 2px;
    position: absolute; top: 100%; left: 0; right: 0;
    background: rgba(4,20,13,0.97); border-bottom: 1px solid var(--line);
    padding: 10px 24px 22px; backdrop-filter: blur(14px);
    box-shadow: 0 24px 60px rgba(0,0,0,0.5);
  }
  .nav.is-open .nav__links > a,
  .nav.is-open .nav__links .nav__drop-trigger {
    padding: 13px 6px; font-size: 1.02rem; border-bottom: 1px solid rgba(255,255,255,0.06);
  }
  /* The Services trigger is now a real link to services.html (17 July change), so on mobile
     it just navigates there directly rather than needing its own flyout — the hover panel
     stays hidden here; every service is one tap away either way. */
  .nav.is-open .nav__drop-panel { display: none; }
  .nav.is-open .nav__links .btn-primary { margin: 10px 0 4px; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
  .orb { animation: none; }
  .reveal { transition: none; opacity: 1; transform: none; }
}

/* ---- Case studies build, 19 July 2026: stat tiles, single-hue bar rows, vertical timelines,
   doc/checklist grids and the quote-hero centrepiece. One data accent (teal) throughout; coral
   is status only (pending / in-progress), never a second series. Reuses existing variables. ---- */

/* Stat tiles: a big number is not a chart, and that's the point. */
.stat-grid { grid-template-columns: repeat(4, 1fr); }
.stat-tile { padding: 28px 24px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 8px; }
.stat-tile__num { font-family: 'Montserrat', sans-serif; font-weight: 800; font-size: 2.1rem; line-height: 1.1; }
.stat-tile__cap { font-size: 0.86rem; color: var(--muted); max-width: 26ch; }

/* Bar rows (Lighthouse-style): single teal fill from zero, value labelled at the end in text ink,
   never a coloured number. No dual axes, no second series. */
.bar-list { display: grid; gap: 20px; }
.bar-row { display: flex; align-items: center; gap: 18px; }
.bar-row__label { min-width: 150px; font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 0.92rem; color: #cdddd2; }
.bar-track { flex: 1; height: 10px; border-radius: 100px; background: rgba(255,255,255,0.06); overflow: hidden; }
.bar-fill { height: 100%; border-radius: 100px; background: var(--teal-lit); }
.bar-row__value { min-width: 44px; text-align: right; font-family: 'Montserrat', sans-serif; font-weight: 700; color: var(--text); font-size: 0.92rem; }

/* Vertical timeline: build rounds / roadmap phases. Status (done/in-progress) uses colour as a
   status flag on a single item, not as a second data series on a chart. */
.timeline { display: grid; gap: 28px; border-left: 2px solid var(--line); margin-left: 8px; padding-left: 32px; }
.timeline-item { position: relative; }
.timeline-item::before {
  content: ""; position: absolute; left: -40px; top: 2px; width: 14px; height: 14px; border-radius: 50%;
  background: var(--bg); border: 2px solid var(--line);
}
.timeline-item.is-done::before { border-color: var(--teal-lit); background: var(--teal-lit); box-shadow: 0 0 0 4px rgba(69,211,201,0.15); }
.timeline-item.is-progress::before { border-color: var(--coral); background: var(--coral); box-shadow: 0 0 0 4px rgba(226,125,96,0.15); }
.timeline-item h3, .timeline-item h4 { color: #fff; font-family: 'Montserrat', sans-serif; font-size: 1.02rem; margin-bottom: 4px; font-weight: 700; }
.timeline-item .phase-status { display: inline-block; font-size: 0.7rem; font-weight: 700; font-family: 'Montserrat', sans-serif; letter-spacing: 0.06em; text-transform: uppercase; margin-left: 10px; }
.timeline-item.is-done .phase-status { color: var(--teal-lit); }
.timeline-item.is-progress .phase-status { color: var(--coral-lit); }
.timeline-item p { font-size: 0.92rem; margin-top: 4px; }

/* Status chip: a positive/ready state, teal so it never reads as the pending/coral chip.
   Status only, same rule as .pending: never a second series on a chart. */
.state-chip {
  display: inline-flex; align-items: center; gap: 7px; align-self: flex-start;
  font-size: 0.76rem; font-weight: 600; font-family: 'Montserrat', sans-serif;
  color: var(--teal-lit); background: rgba(69,211,201,0.12);
  border: 1px solid rgba(69,211,201,0.3); border-radius: 100px; padding: 5px 12px; letter-spacing: 0.04em;
}
/* Lucide check, masked so it inherits currentColor without touching the markup */
.state-chip::before {
  content: ""; width: 12px; height: 12px; flex: 0 0 auto; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* Checklist grid: channel build-out tiles (icon + name + status chip) */
.check-grid { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.check-tile { padding: 24px; display: flex; flex-direction: column; gap: 12px; }
.check-tile__icon { width: 44px; height: 44px; border-radius: 12px; display: grid; place-items: center; background: linear-gradient(135deg, rgba(69,211,201,0.18), rgba(226,125,96,0.14)); border: 1px solid var(--line); }
.check-tile__icon .icon { width: 22px; height: 22px; color: var(--teal-lit); }
.check-tile h3, .check-tile h4 { color: #fff; font-family: 'Montserrat', sans-serif; font-size: 0.98rem; }

/* Doc grid: the flagship 12-document brand system, small named tiles */
.doc-grid { grid-template-columns: repeat(4, 1fr); gap: 12px; }
.doc-tile { padding: 16px 14px; display: flex; align-items: center; gap: 10px; }
.doc-tile .icon { width: 18px; height: 18px; color: var(--teal-lit); flex: 0 0 auto; }
.doc-tile span { font-size: 0.85rem; color: #cdddd2; font-weight: 500; }

/* Quote hero: the large pull-quote centrepiece (BZ Clinic verdict, SheerLuxe feature) */
.quote-hero { text-align: center; max-width: 880px; margin: 0 auto; padding: 48px 40px; }
.quote-hero .icon { width: 30px; height: 30px; color: var(--teal-lit); opacity: 0.6; }
.quote-hero blockquote { font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: clamp(1.4rem, 2.6vw, 2.15rem); color: #fff; line-height: 1.35; margin: 20px 0; }
.quote-hero .attribution { font-family: 'Montserrat', sans-serif; font-weight: 600; color: var(--teal-lit); font-size: 0.95rem; }
.quote-hero .attribution span { color: var(--muted); font-weight: 500; }

@media (max-width: 900px) {
  .stat-grid { grid-template-columns: repeat(2, 1fr); }
  .doc-grid { grid-template-columns: repeat(2, 1fr); }
  .bar-row__label { min-width: 110px; font-size: 0.86rem; }
  .timeline { padding-left: 26px; }
}
@media (max-width: 560px) {
  .stat-grid, .doc-grid { grid-template-columns: 1fr; }
}

/* ---- Cookie consent banner (24 July, go-live pack) ---- */
.consent {
  position: fixed; bottom: 18px; left: 18px; right: 18px; z-index: 300;
  max-width: 420px; padding: 20px 22px; border-radius: var(--radius);
  background: var(--panel); border: 1px solid var(--line); backdrop-filter: blur(14px);
  box-shadow: 0 18px 50px rgba(0,0,0,0.5);
}
.consent p { font-size: 0.88rem; margin-bottom: 14px; }
.consent a { color: var(--teal-lit); }
.consent__actions { display: flex; gap: 10px; }
.consent .btn { padding: 10px 18px; font-size: 0.86rem; }
