/* ---------------------------------------------------------------
   Riviera Multi Family Office
   Reference: Auros (auros.global)
   Brand inputs: colors + typography only.
   Architecture: one continuous dark canvas, fixed atmospheric
   backdrop (sphere + glow) behind all content, no per-section
   background colors — sections are distinguished by content
   rhythm, not surfaces.
--------------------------------------------------------------- */

/* Cross-document view transitions. On real page navigation (all pages
   opt in), the browser snapshots the outgoing document, renders the
   incoming one, and cross-fades between them natively. Two reasons this
   is here: (1) the transitions.js custom SPA router bails out on mobile
   so iOS 26 Safari can re-sample its Liquid Glass chrome tint per page
   (soft nav locks the first sample) — this rule is what keeps the visual
   smooth across those real reloads; (2) it's a no-op in browsers that
   don't support cross-document view transitions, so no compat cost. */
@view-transition { navigation: auto; }

:root {
  /* Surface stack — tonal depth, no shadows (Auros pattern).
     Canvas is the brighter ink; cards are pressed-in deeper. */
  --canvas:    #0E1F33;   /* page background — equivalent of Auros #012624 */
  --trench:    #08172A;   /* card surface — equivalent of Auros #011d1c (one shade deeper) */
  --reef:      #050E1A;   /* elevated/interactive — equivalent of Auros #003734 */

  --ink:        #0E1F33;
  --ink-2:      #1B324E;
  --ink-deep:   #08172A;
  --cream:      #F4EDDF;
  --surface:    #F4EDDF;

  --fg:        var(--cream);
  --fg-muted:  rgba(244, 237, 223, 0.62);
  --fg-faint:  rgba(244, 237, 223, 0.32);
  --hairline:  rgba(244, 237, 223, 0.10);
  --hairline-strong: rgba(244, 237, 223, 0.22);

  /* Radius scale — one disciplined ladder. */
  --r-panel: 16px;   /* large container panels */
  --r-card:  14px;   /* cards and tiles */
  --r-btn:   8px;    /* buttons */
  --r-sm:    6px;    /* icon chips, small UI */

  --serif: "Cormorant Garamond", Garamond, "EB Garamond", Georgia, serif;
  --sans:  "Tenor Sans", Inter, "Helvetica Neue", Arial, sans-serif;
  /* Numerals — a clean geometric face (Jost) with lining figures, distinct from
     the calligraphic serif figures. Reads "measured", pairs with Cormorant. */
  --num:   "Jost", "Tenor Sans", sans-serif;

  --s-1: 4px; --s-2: 8px; --s-3: 12px; --s-4: 16px; --s-5: 20px;
  --s-6: 24px; --s-7: 28px; --s-8: 32px; --s-10: 40px; --s-12: 48px;
  --s-16: 64px; --s-17: 68px; --s-20: 80px; --s-24: 96px;
  --s-32: 128px; --s-40: 160px; --s-44: 172px;

  --container: min(1200px, 92vw); /* shared box-collection width — vw-based, one lock for every box group */
  --claim-lg-min-h: 100svh;        /* full-viewport editorial-headline primitive — see .claim--lg block */
  --hero-subtitle-size: 24px;      /* hero subtitle (Bucket 2: Medium — Adel saw 24px after cache fix and approved) — narrow-mobile fallback handled in @media block */

  /* Bucket 2 — MSFO width-per-section-type tokens. These are MSFO's actual
     widths, applied site-wide so equivalent section types match across pages.
     The sphere already provides the visual rhythm; widths stay static and
     consistent with what MSFO has shipped and the client signed off on. */
  --w-bento:        720px;          /* MSFO .msfo-bento .bento-section — bento-style card grids */
  --w-stack:        760px;          /* MSFO .msfo-who .ss — content/copy bands (scroll-stack feel) */
  --w-wrapper:      var(--container); /* MSFO .msfo-bento__head, .msfo-close__inner — header bands, outer wrappers */
  --gutter: clamp(20px, 4.5vw, 56px);  /* shared horizontal breathing room */
  --nav-clear: clamp(96px, 12vh, 140px); /* top safe-area below the fixed nav veil */
  --ease: cubic-bezier(0.2, 0.0, 0.0, 1.0);
}

* { box-sizing: border-box; }

html { scroll-behavior: auto; } /* Lenis takes over */

/* The palette class lives on <body>, so only <body> knows the per-page
   --canvas. Keep <html> transparent and let the body background propagate
   to the viewport canvas; otherwise <html> paints the dark default behind
   short/scrolled light pages (about) and the dark backdrop shows through. */
html { background: transparent; }

html, body {
  margin: 0;
  padding: 0;
  color: var(--fg);
  font-family: var(--serif);
  font-weight: 300;
  font-size: 18px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
}
body { background: var(--canvas); }

body.lenis.lenis-smooth { scroll-behavior: auto; }
body.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
body.lenis.lenis-stopped { overflow: hidden; }
.lenis.lenis-smooth iframe { pointer-events: none; }

img { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; padding: 0; }

main { position: relative; z-index: 2; }

/* --------------------------------------------------------------
   Accessibility & resilience primitives
-------------------------------------------------------------- */
/* Skip link — first focusable element on every page; parks off-screen
   until focused. Theme-agnostic (always cream-on-ink for guaranteed
   contrast against either canvas). */
.skip-link {
  position: fixed;
  top: var(--s-4);
  left: var(--s-4);
  z-index: 100;
  padding: var(--s-3) var(--s-5);
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink);
  background: var(--cream);
  border-radius: var(--r-btn);
  box-shadow: 0 8px 22px rgba(8, 23, 42, 0.32);
  transform: translateY(calc(-100% - var(--s-10)));
  transition: transform 220ms var(--ease);
}
.skip-link:focus { transform: none; }

/* Keyboard focus ring — follows the page foreground, so it stays visible
   across the dark canvas and the white about page. Pointer focus stays
   quiet (only :focus-visible). */
:focus-visible {
  outline: 2px solid var(--fg);
  outline-offset: 3px;
  border-radius: 3px;
}
.btn:focus-visible { outline-offset: 4px; }

/* Deep-linked anchors clear the fixed nav (#monaco, the ten privacy
   sections, the skip-link target). Harmless on non-target ids. */
[id] { scroll-margin-top: calc(var(--nav-clear) + var(--s-4)); }

/* Long unbreakable strings (names, URLs, longer FR labels) wrap instead
   of forcing horizontal overflow. */
body { overflow-wrap: break-word; }

/* --------------------------------------------------------------
   Persistent atmospheric backdrop — sphere + glow
   Fixed to viewport, drives mood across the entire scroll.
-------------------------------------------------------------- */
.atmos {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}

.atmos__glow {
  position: absolute;
  inset: -10%;
  /* Edge / perimeter glow — centre stays clear (sphere lives there),
     gradient hugs the viewport edges. Tokenised so each page can repaint
     in its own palette while keeping the same depth recipe. */
  --glow-mid:           rgba(46, 80, 120, 0.55);
  --glow-deep:          rgba(27, 50, 78, 0.30);
  --glow-fade:          rgba(14, 31, 51, 0);
  --glow-vignette:      rgba(5, 14, 26, 0.92);
  --glow-vignette-fade: rgba(5, 14, 26, 0);
  /* No opaque --canvas base here. This element is transformed (breath) so it
     rides a cached GPU layer that does NOT repaint from the inherited animated
     --canvas — painting the canvas here made the whole backdrop lag behind the
     nav veil during palette transitions. The body owns the canvas (body {
     background: var(--canvas) } transitions cleanly and shows through), and
     this layer carries only the translucent glow accents. */
  background:
    radial-gradient(ellipse 95% 88% at 50% 50%,
      var(--glow-fade) 42%,
      var(--glow-deep) 78%,
      var(--glow-mid) 100%),
    radial-gradient(70% 55% at 50% 110%,
      var(--glow-vignette) 0%,
      var(--glow-vignette-fade) 70%);
  /* Breath: a near-imperceptible scale driven by scroll, no panning. */
  transform: scale(var(--glow-breath, 1));
  transform-origin: 50% 50%;
  will-change: transform;
}

.atmos__sphere {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%) scale(var(--sphere-scale, 1));
  /* Mobile-base width is 68vw so the 1.35x hero scroll-zoom (68*1.35=91.8vw)
     still fits inside the viewport without .atmos overflow:hidden clipping
     it into a tall/skewed shape. Desktop width in @media below. */
  width: min(400px, 68vw);
  height: min(400px, 68vw);
  opacity: calc(var(--sphere-opacity, 0.85) * 0.6);
  will-change: transform, opacity;
}
/* Desktop: full sphere presence. Mobile-base above scales + fades the
   sphere so it stops overlapping hero copy (Backdrop-Is-Not-Content rule). */
@media (min-width: 561px) {
  .atmos__sphere {
    transform: translate(-50%, -50%) scale(var(--sphere-scale, 1));
    width: min(720px, 64vw);
    height: min(720px, 64vw);
    opacity: var(--sphere-opacity, 0.85);
  }
}

/* --------------------------------------------------------------
   Eyebrow
-------------------------------------------------------------- */
.eyebrow {
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.78);   /* slightly above muted so eyebrow holds against sphere glow */
  margin: 0;
}
/* .eyebrow--dot: bullet trope removed. Class kept as no-op so existing
   markup still renders as a plain eyebrow. */
.eyebrow--dot { display: inline; }
.eyebrow--dot::before { content: none; }

/* --------------------------------------------------------------
   Nav — Auros pattern: fixed transparent, NO fill, NO border,
   uppercase tracked sans labels.
   A fixed top atmospheric veil (::before) darkens content scrolling
   under the nav so the labels stay legible without breaking the
   transparent-nav rule.
-------------------------------------------------------------- */
.nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 60;
  padding: var(--s-4) 0;          /* Auros ~64px row, 16px vertical */
  background: transparent;
  border-bottom: 0;
}
.nav::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 120px;
  /* Single-source veil. Derived entirely from the page's --canvas token via
     color-mix, so it interpolates in perfect lockstep with the body background
     on SPA navigation — there is only ONE animating colour, inherited by both
     layers, so drift is impossible by construction. No per-page override needed:
     the mix follows --canvas automatically on dark and light pages alike.
     (The prior per-page hardcoded gradients snapped instantly while the body
     faded over 720ms — that was the async.) No blur: backdrop-filter on the veil
     made headlines passing under it read out-of-focus during scroll. */
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--canvas), transparent 10%) 0%,
    color-mix(in srgb, var(--canvas), transparent 42%) 50%,
    color-mix(in srgb, var(--canvas), transparent 100%) 100%);
  pointer-events: none;
  z-index: -1;
}

.nav__inner {
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--s-10);
}

.nav__brand { justify-self: start; display: inline-flex; align-items: center; }
.nav__brand img { height: 32px; width: auto; }

.nav__links {
  display: inline-flex;
  align-items: center;
  gap: var(--s-7);
  justify-self: center;
}
.nav__links a {
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.144em;        /* Auros: 1.44px on 12px */
  text-transform: uppercase;
  color: var(--fg);
  opacity: 0.55;
  transition: opacity 180ms var(--ease);
  padding: var(--s-2) 0;
  position: relative;
}
.nav__links a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px;
  background: var(--fg);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 240ms var(--ease);
}
.nav__links a:hover { opacity: 1; }
.nav__links a:hover::after { transform: scaleX(1); }

.nav__meta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-6);
  justify-self: end;
}
.nav__lang {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

/* Header contact button (Bucket 3 Phase 1).
   • Interior pages — always visible.
   • Home — hidden until the hero's own contact CTA leaves the viewport
     (toggled by body.nav-cta-out from a pages.js IntersectionObserver).
   Compound .nav__contact.btn selector beats .btn's transition shorthand
   (which lists only transform/box-shadow/background/color, not opacity).
   Add opacity to the list so it actually fades. */
.nav__contact.btn {
  transition: transform 220ms var(--ease),
              box-shadow 240ms var(--ease),
              background 260ms var(--ease),
              color 200ms var(--ease),
              opacity .8s cubic-bezier(.22, .61, .36, 1);
}
body.page-home .nav__contact {
  opacity: 0;
  pointer-events: none;
}
body.page-home.nav-cta-out .nav__contact {
  opacity: 1;
  pointer-events: auto;
}
/* Fouad Review #4 G2 — hide navbar START whenever any in-page primary
   CTA is on screen. Applies to every page (bottom claim CTAs, hero CTA
   on home, MSFO/services/approach bottom heroes). Overrides the home
   nav-cta-out state when a bottom CTA is visible. */
body.nav-cta-hidden .nav__contact {
  opacity: 0 !important;
  pointer-events: none !important;
}
.nav__lang .is-on { color: var(--fg); }
.nav__lang-sep { opacity: 0.4; }

/* --------------------------------------------------------------
   Mobile navigation — burger + full-screen sheet
   Below 960px the inline links/lang/CTA withdraw; this surfaces
   them again. The sheet is a persistent <body> sibling (z below
   the nav bar) so the logo + burger stay on top as the close
   affordance, and it inherits --canvas / --fg — so it flips to
   ink-on-white on the about page with no extra rules.
-------------------------------------------------------------- */
.nav__burger {
  display: none;                 /* shown ≤960px */
  width: 44px;                   /* min touch target */
  height: 44px;
  margin-right: -10px;           /* optical alignment to the gutter edge */
  align-items: center;
  justify-content: center;
  color: var(--fg);
  transition: opacity 160ms var(--ease);
}
.nav__burger:active { opacity: 0.55; }   /* tap feedback */
.nav__burger-box { position: relative; width: 24px; height: 11px; }
.nav__burger-line {
  position: absolute;
  left: 0; right: 0;
  height: 1.5px;
  background: currentColor;
  transition: transform 360ms var(--ease), opacity 200ms var(--ease);
}
.nav__burger-line:nth-child(1) { top: 0; }
.nav__burger-line:nth-child(2) { bottom: 0; }
.nav__burger[aria-expanded="true"] .nav__burger-line:nth-child(1) { transform: translateY(4.75px) rotate(45deg); }
.nav__burger[aria-expanded="true"] .nav__burger-line:nth-child(2) { transform: translateY(-4.75px) rotate(-45deg); }

.nav__sheet {
  display: none;                 /* desktop: never present */
  position: fixed;
  inset: 0;
  z-index: 56;                   /* above content (2) + corner-labels (55), below nav bar (60) */
  flex-direction: column;
  background: var(--canvas);
  padding: var(--nav-clear) var(--gutter)
           max(var(--s-12), env(safe-area-inset-bottom));
  opacity: 0;
  visibility: hidden;
  transition: opacity 420ms var(--ease), visibility 0s linear 420ms;
}
.nav__sheet.is-open {
  opacity: 1;
  visibility: visible;
  transition: opacity 420ms var(--ease);
}
/* Scroll-lock fallback for when Lenis isn't running (CDN blocked). */
body.nav-open { overflow: hidden; }

.nav__sheet-nav {
  display: flex;
  flex-direction: column;
  gap: clamp(2px, 1vh, 8px);
}
.nav__sheet-nav a {
  display: flex;
  align-items: baseline;
  gap: var(--s-5);
  padding: clamp(6px, 1.1vh, 12px) 0;
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(34px, 9vw, 52px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--fg);
  overflow-wrap: break-word;     /* longer FR labels don't overflow */
  min-width: 0;
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 480ms var(--ease), transform 560ms var(--ease);
  -webkit-tap-highlight-color: transparent;
  outline: none;
}
.nav__sheet-nav a[aria-current="page"] { font-style: italic; }
.nav__sheet-idx {
  display: none;
  flex: none;
  min-width: 2.2em;
  font-family: var(--sans);
  font-style: normal;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.24em;
  color: var(--fg-muted);
  transition: color 220ms var(--ease);   /* no reveal-stagger delay */
}
/* Pointer + keyboard feedback: the leading index brightens to full ink.
   (The link's transform/opacity are reserved for the open-stagger, so the
   hover signal rides the numeral colour instead.) */
.nav__sheet-nav a:hover .nav__sheet-idx,
.nav__sheet-nav a:focus-visible .nav__sheet-idx { color: var(--fg); }
.nav__sheet-foot {
  margin-top: auto;
  padding-top: var(--s-10);
  border-top: 1px solid rgba(244, 237, 223, 0.04);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;               /* ≤320px: CTA drops below the lang toggle */
  gap: var(--s-5) var(--s-6);
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 480ms var(--ease), transform 560ms var(--ease);
}
/* The universal glass treatment (end of file) forces every primary button
   to a white frost; on the white about page that's an invisible button on
   white. Override it there (higher specificity + !important to beat the
   glass rule) with a solid ink CTA that reads on the white canvas. Covers
   the nav bar, the mobile sheet, and the footer email button. */
body.page-about .btn--primary {
  background: var(--ink) !important;
  color: var(--cream) !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
  border-color: transparent !important;
  box-shadow: 0 1px 0 rgba(8, 23, 42, 0.4) !important;
}
body.page-about .btn--primary:hover {
  background: var(--ink-2) !important;
  color: var(--cream) !important;
  border-color: transparent !important;
}
.nav__sheet-lang {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
.nav__sheet-lang .is-on { color: var(--fg); }

/* Staggered rise once the sheet opens (collapses to instant under the
   reduced-motion block below, which zeroes transition durations). */
.nav__sheet.is-open .nav__sheet-nav a,
.nav__sheet.is-open .nav__sheet-foot { opacity: 1; transform: none; }
.nav__sheet.is-open .nav__sheet-nav a[aria-current="page"] { opacity: 1; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(1) { transition-delay: 80ms; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(2) { transition-delay: 125ms; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(3) { transition-delay: 170ms; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(4) { transition-delay: 215ms; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(5) { transition-delay: 260ms; }
.nav__sheet.is-open .nav__sheet-nav a:nth-child(6) { transition-delay: 305ms; }
.nav__sheet.is-open .nav__sheet-foot { transition-delay: 360ms; }

/* Windows high-contrast / forced-colors: keep the overlay opaque and the
   burger + skip link legible when author colours are replaced. */
@media (forced-colors: active) {
  .nav__sheet { background: Canvas; }
  .nav__burger-line { background: CanvasText; }
  .skip-link { color: ButtonText; background: ButtonFace; border: 1px solid ButtonText; box-shadow: none; }
  :focus-visible { outline-color: Highlight; }
}

/* --------------------------------------------------------------
   Buttons
-------------------------------------------------------------- */
.btn {
  --btn-pad-y: 14px;           /* Auros recipe: 14×28 */
  --btn-pad-x: 28px;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.144em;     /* recipe: 12px @ 1.44px */
  text-transform: uppercase;
  padding: var(--btn-pad-y) var(--btn-pad-x);
  border-radius: var(--r-btn);
  transition: transform 220ms var(--ease),
              box-shadow 240ms var(--ease),
              background 260ms var(--ease),
              color 200ms var(--ease);
  white-space: nowrap;
  position: relative;
}
.btn--sm { --btn-pad-y: 10px; --btn-pad-x: 18px; font-size: 11px; }

.btn--primary {
  background: var(--cream);
  color: var(--ink);
  box-shadow: 0 1px 0 rgba(8, 23, 42, 0.4);
  transition: background 220ms var(--ease), color 220ms var(--ease),
              transform 220ms var(--ease), box-shadow 240ms var(--ease);
}
.btn--primary:hover {
  background: var(--ink);
  color: var(--cream);
  transform: translateY(-1px);
  box-shadow: 0 8px 22px rgba(14, 31, 51, 0.32);
}
.btn--primary .btn__arrow { transition: transform 220ms var(--ease); }
.btn--primary:hover .btn__arrow { transform: translateX(3px); }

.btn--ghost {
  position: relative;
  color: var(--fg);
  background: transparent;
  border: 1px solid rgba(244, 237, 223, 0.22);
}
.btn--ghost:hover {
  background: rgba(244, 237, 223, 0.06);
  border-color: rgba(244, 237, 223, 0.45);
}

/* --------------------------------------------------------------
   Hero — first viewport
-------------------------------------------------------------- */
.hero {
  position: relative;
  min-height: 100svh;
  /* top padding clears the fixed nav veil; bottom padding hands off to .pin
     with breathing room so the eyebrow never collides with the headline above
     once content stacks tall (narrow viewports / large device fonts). */
  padding: var(--nav-clear) var(--gutter) clamp(64px, 10vh, 120px);
  display: flex;
  flex-direction: column;
}
.hero__inner {
  /* Bucket 2: hero text-block stays INSIDE the sphere edge.
     Sphere is min(720px, 64vw); text wrapper tracks ~88% of that so the
     longest line clears the sphere's left/right edge with comfortable air. */
  max-width: min(640px, 56vw);
  margin: 0 auto;
  width: 100%;
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}
/* Desktop: hero fills the first viewport. Mobile-base leaves .hero at
   content height so 375px doesn't render a half-empty screen before the
   next section. */
@media (min-width: 561px) {
  .hero { min-height: 100dvh; }
}
.hero__eyebrow { margin-bottom: var(--s-7); }
.hero__display {
  font-family: var(--serif);
  font-weight: 300;
  /* NewForm-influenced: tighten leading to 0.94 and tracking to -0.035em so
     the lines visually lock together — the "display headline block" effect. */
  font-size: clamp(60px, 7.6vw, 104px);
  line-height: 0.94;
  letter-spacing: -0.035em;
  margin: 0 0 var(--s-6);
  color: var(--fg);
  max-width: 18ch;
  text-align: center;
}
.hero__display em {
  font-style: italic;
  font-weight: 300;
  letter-spacing: -0.04em;
}
.hero__sub {
  font-family: var(--serif);
  font-weight: 300;
  font-size: var(--hero-subtitle-size);   /* Bucket 2: token-driven (20px Small) */
  line-height: 1.5;
  color: var(--fg-muted);
  margin: 0 auto var(--s-8);
  max-width: 42ch;
}
.hero__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-4);
  justify-content: center;
}

/* --------------------------------------------------------------
   Pinned horizontal-pan statement
   Auros' "Liquidit" pattern — giant word pans across viewport
   while pinned, body line below remains.
-------------------------------------------------------------- */
/* Auros "We Drive Liquidity" pattern — short static band, not a long pin.
   The display word + body line sit centered in a single viewport-tall band.
   No scroll-driven pin — kept deliberately static so the section never
   overlaps the next one. */
.pin {
  position: relative;
  z-index: 3;
  background: transparent;
  /* Negative pull into hero footprint; focus-fade keeps pin hidden until
     user scrolls close (data-fade-radius="0.3"). Same overlap-with-fade
     pattern used on all pages so each content block reads as its own
     hero and transitions seamlessly. */
  margin-top: -30vh;
  padding: 0 var(--gutter) clamp(12px, 1.5vh, 20px);
  pointer-events: none;
}
.pin__stage {
  position: relative;
  max-width: var(--container);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: var(--s-20);                      /* 80px: matches REVIEW_NOTES — body never crowds the giant headline */
}
.pin__pan {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.pin__word {
  font-family: var(--serif);
  font-weight: 300;
  /* Capped so "We Coordinate Wealth" never bleeds to the viewport edges.
     At 1440px the headline is ~98px — fits comfortably with side gutters. */
  font-size: clamp(40px, 6.8vw, 112px);
  line-height: 0.94;
  letter-spacing: -0.035em;
  margin: 0;
  color: var(--fg);
  text-align: center;
  max-width: 18ch;
}
.pin__word em {
  font-style: italic;
  font-weight: 300;
  letter-spacing: -0.04em;
}
.pin__body {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.6;
  color: var(--fg-muted);
  max-width: 46ch;
  margin: 0 auto;
  text-align: center;
  width: 100%;
}
.pin__body em { font-style: italic; color: var(--fg); }

/* --------------------------------------------------------------
   Explore — Auros pattern: stacked cards left, decorative sphere right.
   NO panel wrapper. NO glass. Sections sit directly on the canvas.
-------------------------------------------------------------- */
.explore {
  position: relative;
  z-index: 3;
  /* Big top padding separates pin → explore so focus-fade fully fades pin
     before explore enters. Without enough physical distance, both overlap
     in opacity around the seam. */
  padding: clamp(160px, 22vh, 280px) var(--gutter) 0;
}
.explore__panel {
  /* Bucket 2: panel chrome stripped — content sits on the page bg directly,
     MSFO-style. No dark surface, no border-radius, no panel padding. */
  max-width: var(--container);
  margin: 0 auto;
  padding: 0;
  position: relative;
}
.explore__inner {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: var(--s-3);
  align-items: stretch;
  /* Bucket 2: explore content band aligns with MSFO's scroll-stack width (760px).
     Light pass only — Bucket 8 rebuilds the right column (notification card). */
  max-width: var(--w-stack);
  margin-inline: auto;
  width: 100%;
}
.explore__left { display: flex; flex-direction: column; }
.explore__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--s-8);
}
.explore__index { margin: 0; }
.explore__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(34px, 3.4vw, 56px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0 0 var(--s-8);
  max-width: 18ch;
}

/* Auros pattern: individual rounded cards inside the panel.
   Each card is a clickable link tile with its own slightly lifted fill. */
.explore__cards {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
}
.ex-card {
  position: relative;
  display: block;
  padding: var(--s-7) var(--s-8);
  background: var(--reef);
  border: 1px solid transparent;
  border-radius: var(--r-card);
  text-decoration: none;
  color: inherit;
  transition: background 240ms var(--ease),
              border-color 240ms var(--ease),
              box-shadow 240ms var(--ease),
              transform 240ms var(--ease);
}
.ex-card:hover {
  background: rgba(244, 237, 223, 0.025);
  border-color: rgba(244, 237, 223, 0.32);
  box-shadow: 0 10px 28px -18px rgba(0, 0, 0, 0.55);
  transform: translateY(-2px);
}
.ex-card:hover .ex-card__arrow {
  color: var(--fg);
  border-color: rgba(244, 237, 223, 0.45);
  opacity: 1;
  transform: translateX(3px);
}

/* Accent card — cream by default, flips to deep navy on hover */
.ex-card--accent {
  background: var(--cream);
  color: var(--ink);
}
.ex-card--accent .ex-card__title { color: var(--ink); }
.ex-card--accent .ex-card__body  { color: rgba(14, 31, 51, 0.72); }
.ex-card--accent .ex-card__arrow {
  color: var(--ink);
  border-color: rgba(14, 31, 51, 0.45);
}
.ex-card--accent:hover {
  background: var(--cream);
  border-color: rgba(14, 31, 51, 0.45);
  box-shadow: 0 10px 28px -18px rgba(0, 0, 0, 0.40);
  transform: translateY(-2px);
}
.ex-card--accent:hover .ex-card__arrow {
  color: var(--ink);
  border-color: rgba(14, 31, 51, 0.55);
  transform: translateX(3px);
}
.ex-card__head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--s-4);
  margin-bottom: var(--s-4);
}
.ex-card__title {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2vw, 26px);
  line-height: 1.25;
  letter-spacing: -0.005em;
  margin: 0;
  color: var(--fg);
  transition: color 280ms var(--ease);
}
.ex-card__arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px; height: 28px;
  border-radius: var(--r-sm);
  border: 1px solid var(--hairline-strong);
  color: var(--fg);
  opacity: 0.85;
  flex-shrink: 0;
  transition: opacity 240ms var(--ease),
              transform 240ms var(--ease),
              border-color 240ms var(--ease),
              color 240ms var(--ease);
}
.ex-card:hover .ex-card__arrow {
  opacity: 1;
  transform: translate(2px, -2px);
}
.ex-card__body {
  font-family: var(--sans);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.6;
  letter-spacing: 0.01em;
  color: var(--fg-muted);
  margin: 0;
  max-width: 48ch;
  transition: color 280ms var(--ease);
}

.explore__right {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 0;
  align-self: stretch;
}
.explore__sphere {
  width: 100%;
  height: 100%;
  display: block;
}

/* --------------------------------------------------------------
   Stats — Auros bento grid: one accent tile + tall right tile +
   two small tiles below. Brand-gradient cream accent stands in for
   Auros' lavender (#fde9ff) tile.
-------------------------------------------------------------- */
.stats {
  padding: var(--s-12) var(--gutter) var(--s-3);
  position: relative;
  z-index: 3;
}
.stats__panel {
  /* Bucket 2: panel chrome stripped — eyebrow + title sit on page bg directly. */
  max-width: var(--container);
  margin: 0 auto;
  padding: 0;
}
.stats__head {
  text-align: center;
  margin-bottom: var(--s-10);
}
.stats__head .eyebrow { justify-content: center; margin-bottom: var(--s-5); }
.stats__eyebrow {
  justify-content: center;
  margin-bottom: var(--s-5);
}
.stats__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(36px, 4vw, 64px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0 0 var(--s-5);
}
.stats__lede {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.55;
  color: var(--fg-muted);
  margin: 0 auto;
  max-width: 52ch;
}
.stats__bento {
  display: grid;
  grid-template-columns: 1.1fr 1fr 1fr;
  grid-template-rows: auto auto;
  gap: var(--s-3);
  /* Bucket 2: bento grid matches MSFO's .msfo-bento .bento-section (720px). */
  max-width: var(--w-bento);
  margin-inline: auto;
  width: 100%;
}
.stat {
  background: var(--trench);
  padding: var(--s-10) var(--s-8);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--s-6);
  min-height: 240px;
  border-radius: var(--r-card);
  text-align: center;
  transition: background 280ms var(--ease), color 280ms var(--ease), transform 280ms var(--ease);
}
/* Hover — text/unit stays put; only the card lifts + glass tints slightly
   (see 4125 hover block for the surface change). No color toggle on text. */
/* Big accent tile — spans 2 rows on the left.
   Breaks the base .stat centering ruling per Adel's H1 note: the tall
   accent tile looks weird centered-with-blank-middle, so value group is
   anchored to the top and the label to the bottom. */
.stat--accent {
  grid-column: 1 / 2;
  grid-row: 1 / span 2;
  background: var(--cream);
  color: var(--ink);
  min-height: 360px;
  justify-content: space-between;
  padding-top: var(--s-12);
  padding-bottom: var(--s-12);
}
.stat--accent:hover {
  background: var(--reef);
  color: var(--fg);
  transform: translateY(-2px);
}
.stat--accent:hover .stat__value { color: var(--fg); }
.stat--accent:hover .stat__unit { color: var(--fg-muted); }
.stat--accent:hover .stat__label { color: var(--fg-muted); }
.stat--accent .stat__value {
  color: var(--ink);
}
.stat--accent .stat__number {
  font-size: clamp(76px, 8.2vw, 128px);
  line-height: 0.92;
  letter-spacing: -0.04em;
}
/* Note: .stat--accent bg/color legacy — see 4100+ where all stat tiles
   are forced to dark glass with light text. Unit + label colors come from
   the base .stat__unit / .stat__label rules (var(--fg-muted)). */
/* Tall right tile — spans 2 rows */
.stat--tall {
  grid-column: 2 / 4;
  grid-row: 1 / 2;
}
.stat--tall .stat__number { font-size: clamp(68px, 7vw, 104px); }
.stat__value {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-3);
  color: var(--fg);
  margin: 0;
  transition: color 280ms var(--ease);
}
.stat__number {
  font-family: var(--num);
  font-weight: 300;
  font-size: clamp(56px, 5vw, 80px);
  line-height: 1;
  letter-spacing: -0.01em;
  font-feature-settings: "tnum" 1, "lnum" 1;
  display: block;
}
.stat__unit {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-muted);
  font-weight: 500;
  transition: color 280ms var(--ease);
  display: block;
}
.stat__label {
  font-family: var(--sans);
  font-size: 15px;
  line-height: 1.5;
  letter-spacing: 0.04em;
  color: var(--fg-muted);
  margin: 0;
  max-width: 24ch;
  transition: color 280ms var(--ease);
}

/* --------------------------------------------------------------
   Claim — Auros' huge centered statement bands ("Helping institutions
   operate with confidence." / "Building systems that keep value moving.").

   Two variants, locked canonical (Bucket 2):
     .claim         — section-height editorial moment (padding-driven).
     .claim claim--lg — FULL-VIEWPORT primitive. Min-height 100vh, flex-centered,
                       brighter halo, bigger type scale. The "Continuity over
                       fragmentation" rhythm. Reusable site-wide; Bucket 4 lands
                       it on the pages where it fits.
-------------------------------------------------------------- */
.claim {
  position: relative;
  z-index: 3;
  padding: clamp(120px, 18vh, 220px) var(--gutter);
}
.claim__inner {
  max-width: var(--container);
  margin: 0 auto;
  text-align: center;
  position: relative;
}
.claim__inner::before {
  content: "";
  position: absolute;
  inset: -10% -10% -10% -10%;
  background: radial-gradient(50% 60% at 50% 50%,
    rgba(244, 237, 223, 0.10) 0%,
    rgba(244, 237, 223, 0.03) 40%,
    rgba(244, 237, 223, 0) 75%);
  pointer-events: none;
  z-index: -1;
}
.claim__text {
  font-family: var(--serif);
  font-weight: 300;
  /* NewForm "display headline block" — pushed bigger and tighter so claim
     bands feel like the loudest editorial moment on the page. */
  font-size: clamp(48px, 6.4vw, 104px);
  line-height: 0.92;
  letter-spacing: -0.04em;
  margin: 0;
  color: var(--fg);
  max-width: 22ch;
  margin-left: auto;
  margin-right: auto;
}
.claim__text em {
  font-style: italic;
  font-weight: 300;
  letter-spacing: -0.045em;
}

/* --- .claim claim--lg — canonical full-viewport editorial primitive --- */
.claim--lg {
  /* svh > vh: respects mobile safe-area (browser chrome) without overflowing.
     Mobile-base drops min-height so 375px doesn't render a viewport-tall
     slot around one headline; desktop restored in @media below. */
  min-height: auto;
  padding: clamp(80px, 12vh, 160px) var(--gutter);
  display: flex;
  align-items: center;
  justify-content: center;
}
.claim--lg .claim__inner {
  width: 100%;
}
.claim--lg .claim__inner::before {
  /* brighter halo on the full-viewport variant — the editorial moment glows */
  background: radial-gradient(50% 60% at 50% 50%,
    rgba(244, 237, 223, 0.14) 0%,
    rgba(244, 237, 223, 0.05) 40%,
    rgba(244, 237, 223, 0) 75%);
  inset: -20% -10% -20% -10%;
}
.claim--lg .claim__text {
  font-size: clamp(56px, 7.6vw, 128px);
  line-height: 0.9;
}
@media (min-width: 561px) {
  .claim--lg { min-height: var(--claim-lg-min-h, 100svh); }
}
@supports not (height: 100svh) {
  /* Fallback for older browsers: classic vh */
  @media (min-width: 561px) {
    .claim--lg { min-height: 100vh; }
  }
}

/* Approach: claim sized to content + padding (no 100svh slot). The
   focus-fade engine gives the editorial "full viewport moment" feel by
   isolating the claim when it wins. Without this override, the claim
   text sat at the center of a 100svh slot, leaving ~437px between the
   last stage body and the claim text — home's last-content → next-text
   gap is ~170px. */
.page-approach .claim--lg { min-height: 0; }


/* --------------------------------------------------------------
   Network — Auros "Global presence": left copy, right map illustration
-------------------------------------------------------------- */
.network {
  padding: var(--s-17) var(--gutter);
  position: relative;
  z-index: 3;
}
.network__inner {
  max-width: var(--container);
  margin: 0 auto;
  background: var(--trench);
  border-radius: var(--r-panel);
  padding: var(--s-12) var(--s-10);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--s-12);
  align-items: center;
  overflow: hidden;
  position: relative;
}
.network__copy { display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-5); }
.network__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(36px, 4vw, 64px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: var(--s-3) 0 0;
  max-width: 14ch;
}
.network__body {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.6;
  color: var(--fg-muted);
  max-width: 42ch;
  margin: 0 0 var(--s-3);
}
.network__map {
  position: relative;
  min-height: 380px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.network__sphere { width: 100%; height: 100%; }

/* --------------------------------------------------------------
   Partners / principles — Auros "What our partners say": 3-col quotes
-------------------------------------------------------------- */
.partners {
  padding: var(--s-17) var(--gutter);
  position: relative;
  z-index: 3;
}
.partners__head { text-align: center; max-width: var(--container); margin: 0 auto var(--s-12); }
.partners__head .eyebrow { justify-content: center; margin-bottom: var(--s-5); }
.partners__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(36px, 4vw, 64px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0;
}
.partners__grid {
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--s-3);
}
/* Title-then-text format (matches .post): tag (role) → title (name) → body. */
.quote {
  background: var(--trench);
  border-radius: var(--r-card);
  padding: var(--s-10) var(--s-8);
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  gap: var(--s-4);
  transition: background 260ms var(--ease);
}
.quote:hover { background: var(--reef); }
.quote__attr { display: flex; flex-direction: column; gap: 6px; }
.quote__role {                 /* the small eyebrow tag, sits above the title */
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0;
}
.quote__name {                 /* the title */
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2vw, 26px);
  line-height: 1.25;
  letter-spacing: -0.005em;
  color: var(--fg);
  margin: 0;
}
.quote__text {                 /* the body text */
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.55;
  color: var(--fg-muted);
  margin: 2px 0 0;
  position: relative;
}

/* Panels need a positioning/clip context for the glass; the actual glass
   styling lives in the site-wide "Universal glass" block at end of file. */
.explore__panel,
.stats__panel {
  position: relative;
  overflow: hidden;
}

/* --------------------------------------------------------------
   Footer — Auros pattern: big serif left, connect block right,
   nav strip + brand-assets row, then social icons + base notice.
-------------------------------------------------------------- */
.ftr {
  position: relative;
  z-index: 5;
  background: transparent;
  padding: var(--s-17) var(--gutter) var(--s-10);
}
.ftr__inner {
  max-width: var(--container);
  margin: 0 auto;
}
.ftr__hero {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: var(--s-12);
  /* Fouad Review #4 N3: content must sit INSIDE the corner brackets,
     not touch them. Equal padding on all four sides so the R of
     'Riviera' and the P of 'Privacy policy' have the same optical
     distance to their neighbouring bracket sides. */
  /* Padding tuned for optical (ink) equality, not bounding-box equality.
     R of 'Riviera' is 26px Cormorant with ~4px whitespace above cap-line;
     P of 'Privacy policy' is 11px caps with ~1px whitespace below baseline.
     Values compensate so R-top and P-bottom sit the same distance from
     their brackets as the left edge does. */
  padding: clamp(44px, 4.6vw, 74px) clamp(48px, 5vw, 80px) clamp(46px, 4.9vw, 78px);
  border-bottom: 1px solid var(--hairline);
  align-items: stretch;
}
.ftr__wordmark { flex: 1; }
.ftr__assets { margin-top: auto; }
.ftr__wordmark { display: flex; flex-direction: column; gap: var(--s-5); }
/* Fouad review #3 N3 — animated Riviera brand sits above the display
   line; clicks back to home. Same size (26px) and collapse-on-hover
   animation as the nav-top brand (Riviera → R). */
.ftr__brand {
  display: inline-flex;
  flex-direction: column;
  align-items: flex-start;
  align-self: flex-start;
  gap: 3px;
  color: var(--fg);
  text-decoration: none;
  margin: 0 0 var(--s-3);
}
.ftr__brand .brandlogo__mfo { font-family: 'Tenor Sans', sans-serif; font-size: 8.5px; letter-spacing: .36em; color: var(--fg); opacity: .55; text-transform: uppercase; line-height: 1; padding-left: 2px; max-height: 12px; overflow: hidden; transition: max-height .55s cubic-bezier(.2,0,0,1), opacity .45s ease, transform .55s cubic-bezier(.2,0,0,1); }
.ftr__brand:hover .brandlogo__mfo, .ftr__brand:focus-visible .brandlogo__mfo { max-height: 0; opacity: 0; transform: translateY(-2px); }
@media (prefers-reduced-motion: reduce) { .ftr__brand .brandlogo__mfo { transition: none; } }
.ftr__brand .brandlogo {
  font-family: var(--serif);
  font-weight: 300;
  font-size: 26px;
  letter-spacing: -0.01em;
  color: var(--fg);
  display: inline-flex;
  align-items: baseline;
  line-height: 1;
  white-space: nowrap;
}
.ftr__brand .brandlogo__r { display: inline-block; }
.ftr__brand .brandlogo__rest {
  display: inline-block;
  max-width: 2.4em;
  opacity: 1;
  overflow: hidden;
  transition: max-width .55s cubic-bezier(.2,0,0,1), opacity .45s ease, transform .55s cubic-bezier(.2,0,0,1);
}
.ftr__brand:hover .brandlogo__rest,
.ftr__brand:focus-visible .brandlogo__rest {
  max-width: 0;
  opacity: 0;
  transform: translateX(-2px);
}
@media (prefers-reduced-motion: reduce) { .ftr__brand .brandlogo__rest { transition: none; } }
.ftr__display {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(40px, 5vw, 88px);
  line-height: 0.94;
  letter-spacing: -0.035em;
  margin: 0;
  max-width: 18ch;
}
.ftr__display em {
  font-style: italic;
  font-weight: 300;
  letter-spacing: -0.04em;
}
.ftr__quick {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3);
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding-left: 0;
  margin-top: var(--s-4);
  white-space: normal;
}
/* Desktop: Fouad Review #4 N3 — nav on the SAME left baseline as
   "Coordinating private family wealth" and on ONE line (nowrap).
   Mobile-base above wraps so the last 1–2 nav items don't clip on 375px. */
@media (min-width: 561px) {
  .ftr__quick { flex-wrap: nowrap; white-space: nowrap; }
}
.ftr__quick a {
  color: var(--fg);
  opacity: 0.8;
  transition: opacity 200ms var(--ease);
}
.ftr__quick a:hover { opacity: 1; }
.ftr__sep { color: var(--fg-faint); }
.ftr__assets {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0;
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  /* Fouad Review #4 N3: reset to align with the tagline baseline. */
  padding-left: 0;
}
.ftr__assets a { color: var(--fg-muted); transition: opacity 200ms var(--ease); }
.ftr__assets a:hover { color: var(--fg); }
.ftr__connect {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--s-4);
}
.ftr__connect-title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(32px, 3.4vw, 56px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0;
}
.ftr__social {
  display: inline-flex;
  align-items: center;
  gap: var(--s-4);
  margin-top: var(--s-5);
}
.ftr__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px; height: 46px;
  border-radius: var(--r-sm);
  border: 1px solid var(--hairline-strong);
  color: var(--fg);
  opacity: 0.7;
  transition: opacity 200ms var(--ease), border-color 200ms var(--ease), color 200ms var(--ease), background 200ms var(--ease);
}
.ftr__icon svg { width: 20px; height: 20px; }
.ftr__icon:hover { opacity: 1; border-color: var(--fg); background: color-mix(in srgb, var(--fg), transparent 92%); }
.ftr__base {
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  padding-top: var(--s-8);
  position: relative;
}
.ftr__notice {
  font-family: var(--sans);
  font-size: 11px;
  line-height: 1.55;
  color: var(--fg-muted);
  max-width: 92ch;
  margin: 0;
}
.ftr__meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-family: var(--sans);
  font-size: 11px;
  color: var(--fg-muted);
  letter-spacing: 0.04em;
}
.ftr__address {
  position: absolute;
  top: var(--s-8);
  right: 0;
  font-family: var(--sans);
  font-size: 11px;
  line-height: 1.65;
  color: var(--fg-muted);
  letter-spacing: 0.06em;
  margin: 0;
  text-align: right;
}

/* --------------------------------------------------------------
   Text reveal mechanics
   IMPORTANT: defaults are visible. GSAP overrides to the hidden
   state on init and animates back — this means the page is fully
   readable without JS (search engines, social-card snapshots,
   ad-blockers, slow connections, no-JS mode).
-------------------------------------------------------------- */
.js-on [data-rise] { opacity: 0; transform: translateY(16px); }
.js-on [data-rise].is-in { opacity: 1; transform: translateY(0); transition: opacity 800ms var(--ease), transform 1000ms var(--ease); }
/* Pages arrived via cross-doc view transition skip the intro reveal,
   so the new-page snapshot is already painted when the VT captures it
   — without this the new doc is blank during the crossfade. */
html.vt-arrival .js-on [data-rise],
html.vt-arrival .js-on [data-rise]:not(.is-in) { opacity: 1; transform: none; }
html.vt-arrival .js-on [data-split] .word { opacity: 1; transform: none; }

[data-split] { display: block; }
.js-on [data-split] .word {
  display: inline-block;
  transform: translateY(0.5em);
  opacity: 0;
  will-change: transform, opacity;
}
[data-split] .word-wrap {
  display: inline-block;
  vertical-align: baseline;
  /* Fouad review #3 H1: was 0.22em — added on TOP of the natural space
     character between words, making the gap between hero-title words
     read as too wide (visible on Home 'generational scope.'). Zeroed
     so word gaps match natural typographic rhythm — same reference
     as Services claim__text 'relevance, confidentiality, access.' */
  margin-right: 0;
  /* No overflow clip — italic descenders (e.g. `y` in "family wealth")
     must not be cut. Rise reveal uses opacity + transform instead. */
}

/* --------------------------------------------------------------
   Responsive
-------------------------------------------------------------- */
@media (max-width: 960px) {
  .nav__inner { gap: var(--s-6); }
  .nav__links { display: none; }
  /* Inline links, language and CTA withdraw at this width; the burger
     opens a full-screen sheet that carries all three. */
  .nav__meta .btn { display: none; }
  .nav__lang { display: none; }
  .nav__burger { display: inline-flex; }
  .nav__sheet { display: flex; }
  .hero { padding: var(--nav-clear) var(--gutter) var(--s-12); }
  /* pin: keep the same intent (centered short band) — no leftover 200vh height,
     and the word clamp is sized to the *viewport* with a hard ceiling so it
     never bleeds past the screen edges on mobile. */
  .pin__word { font-size: clamp(48px, 11vw, 88px); }
  .pin__body { font-size: 17px; max-width: 38ch; }
  .explore__panel { padding: 0; }
  .explore__head { flex-wrap: wrap; gap: var(--s-4); }
  .explore__inner { grid-template-columns: 1fr; gap: var(--s-8); }
  .explore__right { min-height: 280px; align-self: auto; }
  .stats { padding: var(--s-12) var(--gutter); }
  .stats__bento { grid-template-columns: 1fr 1fr; }
  .stat--accent { grid-column: 1 / -1; grid-row: auto; min-height: 240px; }
  .stat--tall { grid-column: 1 / -1; grid-row: auto; }
  .stat { min-height: 180px; padding: var(--s-7) var(--s-6); }
  .claim { padding: clamp(80px, 14vh, 160px) var(--gutter); }
  .network__inner { grid-template-columns: 1fr; padding: var(--s-8) var(--s-7); border-radius: 16px; }
  .network__map { min-height: 260px; }
  .partners__grid { grid-template-columns: 1fr; }
  .quote { min-height: 0; padding: var(--s-8) var(--s-7); }
  .ftr { padding: var(--s-12) var(--gutter) var(--s-8); }
  .ftr__hero { grid-template-columns: 1fr; gap: var(--s-10); }
  .ftr__meta { flex-direction: column; gap: var(--s-2); align-items: flex-start; }
}

/* Narrow-mobile pass: prevent any horizontal overflow on phones */
@media (max-width: 560px) {
  .nav__lang { display: none; }
  .hero__display { font-size: clamp(44px, 11vw, 64px); }
  .hero__sub { font-size: 19px; } /* Bucket 2 narrow-mobile fallback for Medium option */
  .explore__title { font-size: clamp(28px, 7.4vw, 38px); }
  .stats__title { font-size: clamp(32px, 8vw, 44px); }
  .stats__bento { grid-template-columns: 1fr; }
  .stat--accent .stat__number { font-size: clamp(56px, 15vw, 84px); }
  .claim__text { font-size: clamp(32px, 8vw, 44px); }
  .claim--lg .claim__text { font-size: clamp(36px, 9vw, 52px); }
  .network__title, .partners__title, .ftr__connect-title { font-size: clamp(28px, 7.4vw, 40px); }
  .ftr__display { font-size: clamp(36px, 9.5vw, 56px); }

}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  [data-rise], [data-split] .word { opacity: 1; transform: none; }
}

/* ===============================================================
   INTERIOR PAGES — extensions added Phase 2.
   Patterns borrowed (where credited):
     - Active Theory   → corner micro-labels
     - Linear          → 1px inset hairlines, single accent
     - Portal          → whispered elevation, generous rounded panels
     - Monopo Saigon   → circular scroll-text affordance, monumental scale
     - GSAP            → sculptural display headlines
     - Dylanbrouwer    → cinematic dark ↔ cream pivot (about page)
   =============================================================== */

/* Active page indicator in nav — full opacity + always-on underline */
.nav__links a[aria-current="page"] { opacity: 1; }
.nav__links a[aria-current="page"]::after { transform: scaleX(1); height: 1.5px; bottom: -3px; }

/* --------------------------------------------------------------
   Corner micro-labels (Active Theory pattern)
   Tiny monospaced/uppercase labels parked at viewport corners
   for instrument-panel chrome that ties pages together.
-------------------------------------------------------------- */
.corner-labels {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 55;
}
.corner-labels__item {
  position: absolute;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--fg-muted);
  opacity: 0.8;
}
.corner-labels__item--bl { left: var(--gutter); bottom: var(--s-6); }
.corner-labels__item--br { right: var(--gutter); bottom: var(--s-6); text-align: right; }
@media (max-width: 960px) { .corner-labels { display: none; } }

/* --------------------------------------------------------------
   Page hero — interior pages (shorter than the home hero)
-------------------------------------------------------------- */
.page-hero {
  position: relative;
  padding: var(--nav-clear) var(--gutter) clamp(64px, 10vh, 120px);
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
@media (min-width: 561px) {
  .page-hero { min-height: 100dvh; }
}
.page-hero__inner {
  max-width: min(640px, 56vw);
  margin: 0 auto;
  width: 100%;
  text-align: center;
}
.page-hero__eyebrow { justify-content: center; margin-bottom: var(--s-7); display: inline-flex; }
.page-hero__title {
  font-family: var(--serif);
  font-weight: 300;
  /* Match home .hero__display exactly */
  font-size: clamp(60px, 7.6vw, 104px);
  line-height: 0.94;
  letter-spacing: -0.035em;
  margin: 0 auto var(--s-6);
  color: var(--fg);
  max-width: 18ch;
}
.page-hero__title em { font-style: italic; font-weight: 300; letter-spacing: -0.04em; }
.page-hero__sub {
  font-family: var(--serif);
  font-weight: 300;
  font-size: var(--hero-subtitle-size);   /* Bucket 2: token-driven (20px Small) */
  line-height: 1.5;
  color: var(--fg-muted);
  margin: 0 auto var(--s-8);
  max-width: 42ch;
}

/* Scroll affordance — circular SVG path text (Monopo Saigon borrow) */
.scroll-mark {
  position: absolute;
  left: var(--gutter);
  bottom: var(--s-10);
  width: 96px;
  height: 96px;
  pointer-events: none;
  opacity: 0.7;
  animation: scroll-mark-spin 24s linear infinite;
}
.scroll-mark text {
  font-family: var(--sans);
  font-size: 9px;
  letter-spacing: 0.32em;
  fill: var(--fg);
  text-transform: uppercase;
}
@keyframes scroll-mark-spin { to { transform: rotate(360deg); } }
@media (max-width: 960px) { .scroll-mark { display: none; } }
@media (prefers-reduced-motion: reduce) { .scroll-mark { animation: none; } }

/* --------------------------------------------------------------
   Editorial — long-form prose with sticky chapter index (privacy)
-------------------------------------------------------------- */
.editorial {
  position: relative;
  z-index: 3;
  padding: var(--s-12) var(--gutter) var(--s-20);
}
.editorial__inner {
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: var(--s-16);
  align-items: flex-start;
}
.editorial__index {
  position: sticky;
  top: var(--nav-clear);
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  padding-top: var(--s-2);
}
.editorial__index .eyebrow { margin-bottom: var(--s-3); }
.editorial__index a {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--fg-muted);
  padding: var(--s-2) 0;
  border-left: 1px solid var(--hairline);
  padding-left: var(--s-4);
  transition: color 200ms var(--ease), border-color 200ms var(--ease);
}
.editorial__index a:hover { color: var(--fg); border-left-color: var(--fg); }
.editorial__body {
  max-width: 64ch;
  font-family: var(--serif);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.7;
  color: var(--fg);
}
.editorial__body h2 {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(28px, 2.6vw, 40px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: var(--s-12) 0 var(--s-4);
  color: var(--fg);
}
.editorial__body h2:first-child { margin-top: 0; }
.editorial__body h3 {
  font-family: var(--serif);
  font-weight: 500;
  font-size: clamp(20px, 1.8vw, 24px);
  margin: var(--s-8) 0 var(--s-3);
  color: var(--fg);
}
.editorial__body p { margin: 0 0 var(--s-5); color: var(--fg); }
.editorial__body p.muted { color: var(--fg-muted); }
.editorial__body ul { padding-left: var(--s-5); margin: 0 0 var(--s-5); color: var(--fg); }
.editorial__body li { margin-bottom: var(--s-2); }
.editorial__body a { border-bottom: 1px solid var(--hairline-strong); }
.editorial__body a:hover { border-bottom-color: var(--fg); }
@media (max-width: 960px) {
  .editorial__inner { grid-template-columns: 1fr; gap: var(--s-8); }
  .editorial__index { position: static; flex-direction: row; flex-wrap: wrap; }
  .editorial__index a { border-left: 0; border-top: 1px solid var(--hairline); padding-left: 0; padding-top: var(--s-2); padding-right: var(--s-4); }
}

/* --------------------------------------------------------------
   Compare — MSFO three-column comparison (Traditional / SFO / MSFO)
-------------------------------------------------------------- */
.compare {
  padding: var(--s-12) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.compare__inner {
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--s-3);
}
.compare__col {
  background: var(--trench);
  border-radius: var(--r-panel);
  padding: var(--s-10) var(--s-8);
  display: flex;
  flex-direction: column;
  gap: var(--s-6);
  transition: background 280ms var(--ease), transform 280ms var(--ease);
}
.compare__col--accent {
  background: linear-gradient(160deg, #F4EDDF 0%, #F4EDDF 60%, #F4EDDF 100%);
  color: var(--ink);
}
.compare__col:hover { transform: translateY(-2px); }
/* Title-then-text body (replaces the old tagged head + bullet list). */
.compare__body {
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0;
}
.compare__head {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  padding-bottom: var(--s-6);
  border-bottom: 1px solid var(--hairline);
}
.compare__col--accent .compare__head { border-bottom-color: rgba(14,31,51,0.18); }
.compare__tag {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0;
}
.compare__col--accent .compare__tag { color: rgba(14,31,51,0.62); }
.compare__title {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2vw, 26px);   /* match homepage box title */
  line-height: 1.25;
  letter-spacing: -0.005em;
  margin: 0;
}
.compare__list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--s-3); }
.compare__list li {
  font-family: var(--serif);
  font-size: 17px;
  line-height: 1.5;
  padding-left: var(--s-5);
  position: relative;
  color: inherit;
}
.compare__list li::before {
  content: "";
  position: absolute;
  left: 0; top: 0.7em;
  width: 8px; height: 1px;
  background: currentColor;
  opacity: 0.55;
}
@media (max-width: 960px) { .compare__inner { grid-template-columns: 1fr; } }

/* --------------------------------------------------------------
   Modes — Services page: 9 modes as alternating editorial rows
-------------------------------------------------------------- */
.modes {
  padding: var(--s-12) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.modes__inner {
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: var(--s-12);
  align-items: flex-start;
}
.modes__index {
  position: sticky;
  top: var(--nav-clear);
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
}
.modes__index .eyebrow { margin-bottom: var(--s-3); }
.modes__index a {
  display: grid;
  grid-template-columns: 28px 1fr;
  gap: var(--s-3);
  align-items: baseline;
  padding: var(--s-2) 0;
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.06em;
  color: var(--fg-muted);
  transition: color 200ms var(--ease);
}
.modes__index a:hover, .modes__index a.is-active { color: var(--fg); }
.modes__index a span:first-child {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--fg-faint);
}
.mode {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-6);
  padding: var(--s-12) 0;
  border-top: 1px solid var(--hairline);
}
.mode:first-child { padding-top: 0; border-top: 0; }
.mode__head {
  display: grid;
  grid-template-columns: 80px 1fr auto;
  gap: var(--s-5);
  align-items: baseline;
}
.mode__num {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.22em;
  color: var(--fg-muted);
  margin: 0;
}
.mode__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(32px, 3.4vw, 48px);
  line-height: 1.05;
  letter-spacing: -0.025em;
  margin: 0;
  color: var(--fg);
  max-width: 22ch;
}
.mode__body {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.65;
  color: var(--fg-muted);
  margin: 0;
  max-width: 64ch;
  padding-left: calc(80px + var(--s-5));
}
.mode__body em { color: var(--fg); font-style: italic; }
@media (max-width: 960px) {
  .modes__inner { grid-template-columns: 1fr; gap: var(--s-8); }
  .modes__index { position: static; flex-direction: row; flex-wrap: wrap; }
  .mode__head { grid-template-columns: 1fr; gap: var(--s-2); }
  .mode__body { padding-left: 0; }
}

/* --------------------------------------------------------------
   Steps — Approach page: 4-stage engagement, vertical stage list
-------------------------------------------------------------- */
.steps {
  padding: var(--s-12) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.steps__inner {
  max-width: var(--container);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
}
.step {
  background: var(--trench);
  border-radius: var(--r-panel);
  padding: var(--s-10) var(--s-10);
  display: grid;
  grid-template-columns: 140px 1fr 200px;
  gap: var(--s-10);
  align-items: flex-start;
  transition: background 280ms var(--ease), transform 280ms var(--ease);
}
.step:hover { background: var(--reef); transform: translateY(-2px); }
.step__num {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(48px, 5vw, 76px);
  line-height: 0.9;
  letter-spacing: -0.04em;
  color: var(--fg);
  margin: 0;
  opacity: 0.9;
}
.step__num sup {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin-left: 4px;
  font-weight: 500;
}
.step__copy { display: flex; flex-direction: column; gap: var(--s-3); }
.step__tag {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0;
}
.step__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(28px, 2.6vw, 40px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--fg);
}
.step__body {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0;
  max-width: 50ch;
}
.step__meta {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  padding-left: var(--s-5);
  border-left: 1px solid var(--hairline);
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--fg-muted);
}
.step__meta strong {
  display: block;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-faint);
  font-weight: 500;
  margin-bottom: 2px;
}
@media (max-width: 960px) {
  .step { grid-template-columns: 1fr; gap: var(--s-5); padding: var(--s-8) var(--s-7); border-radius: 16px; }
  .step__meta { padding-left: 0; border-left: 0; padding-top: var(--s-4); border-top: 1px solid var(--hairline); flex-direction: row; flex-wrap: wrap; gap: var(--s-6); }
}

/* --------------------------------------------------------------
   FAQ — accordion with 1px inset hairlines (Linear borrow)
-------------------------------------------------------------- */
.faq-list {
  padding: var(--s-12) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.faq-list__inner {
  max-width: var(--container);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
}
.faq-item {
  border-top: 1px solid var(--hairline);
}
.faq-item:last-child { border-bottom: 1px solid var(--hairline); }
.faq-item__button {
  display: grid;
  grid-template-columns: 1fr 32px;
  align-items: center;
  gap: var(--s-6);
  width: 100%;
  padding: var(--s-7) 0;
  text-align: left;
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(20px, 1.8vw, 26px);
  line-height: 1.35;
  letter-spacing: -0.005em;
  color: var(--fg);
  cursor: pointer;
  transition: opacity 200ms var(--ease);
}
.faq-item__button:hover { opacity: 0.85; }
.faq-item__icon {
  position: relative;
  width: 32px; height: 32px;
  border-radius: var(--r-sm);
  border: 1px solid var(--hairline-strong);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  transition: border-color 240ms var(--ease), transform 360ms var(--ease);
}
.faq-item__icon::before,
.faq-item__icon::after {
  content: "";
  position: absolute;
  background: var(--fg);
}
.faq-item__icon::before { width: 12px; height: 1px; }
.faq-item__icon::after { width: 1px; height: 12px; transition: transform 280ms var(--ease); }
.faq-item.is-open .faq-item__icon { border-color: var(--fg); }
.faq-item.is-open .faq-item__icon::after { transform: scaleY(0); }
.faq-item__panel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 360ms var(--ease);
}
.faq-item.is-open .faq-item__panel { grid-template-rows: 1fr; }
.faq-item__panel-inner {
  overflow: hidden;
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.65;
  color: var(--fg-muted);
}
.faq-item__panel-inner > div {
  padding: 0 0 var(--s-7);
  max-width: 68ch;
}
.faq-item__panel-inner p { margin: 0 0 var(--s-3); }
.faq-item__panel-inner p:last-child { margin-bottom: 0; }

/* --------------------------------------------------------------
   Contact form — Portal "whispered elevation" (no drop shadow,
   pale glow-ring around the panel)
-------------------------------------------------------------- */
.contact-section {
  padding: var(--s-10) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.contact-section__inner {
  max-width: 980px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1.1fr;
  gap: var(--s-12);
  align-items: flex-start;
}
.contact-aside {
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  position: sticky;
  top: var(--nav-clear);
}
.contact-aside .eyebrow { margin-bottom: 0; }
.contact-aside__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(32px, 3.2vw, 48px);
  line-height: 1.05;
  letter-spacing: -0.025em;
  margin: 0;
  max-width: 18ch;
}
.contact-aside__body {
  font-family: var(--serif);
  font-size: 17px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0;
  max-width: 38ch;
}
.contact-aside__email {
  font-family: var(--sans);
  font-size: 13px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--fg);
  border-bottom: 1px solid var(--hairline-strong);
  padding-bottom: var(--s-2);
  align-self: flex-start;
  transition: border-color 200ms var(--ease);
}
.contact-aside__email:hover { border-bottom-color: var(--fg); }
.contact-form {
  background: var(--trench);
  border-radius: var(--r-panel);
  padding: var(--s-10) var(--s-10);
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  position: relative;
  box-shadow:
    inset 0 0 0 1px rgba(244, 237, 223, 0.06),
    0 24px 48px -24px rgba(0, 0, 0, 0.45);
}
.contact-form::before {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: calc(var(--r-panel) + 1px);
  pointer-events: none;
  background: linear-gradient(135deg, rgba(244,237,223,0.32) 0%, rgba(244,237,223,0.04) 35%, rgba(244,237,223,0) 60%, rgba(244,237,223,0.18) 100%);
  z-index: -1;
}
.field { display: flex; flex-direction: column; gap: var(--s-2); }
.field__label {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
.field__input,
.field__textarea,
.field__select {
  appearance: none;
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--hairline-strong);
  padding: var(--s-3) 0;
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.5;
  color: var(--fg);
  outline: none;
  transition: border-color 200ms var(--ease);
}
.field__input::placeholder,
.field__textarea::placeholder { color: var(--fg-faint); font-style: italic; }
.field__input:focus,
.field__textarea:focus,
.field__select:focus { border-bottom-color: var(--fg); }
.field__textarea { min-height: 120px; resize: vertical; }
.field__select { color: var(--fg-muted); background-image: linear-gradient(45deg, transparent 50%, var(--fg-muted) 50%), linear-gradient(135deg, var(--fg-muted) 50%, transparent 50%); background-position: calc(100% - 14px) 22px, calc(100% - 9px) 22px; background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; padding-right: 28px; }
.field__hint {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.06em;
  color: var(--fg-faint);
  margin: 0;
}
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-5); }
.contact-form__actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-5);
  margin-top: var(--s-4);
}
.contact-form__notice {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--fg-faint);
  margin: 0;
}
@media (max-width: 860px) {
  .contact-section__inner { grid-template-columns: 1fr; gap: var(--s-8); }
  .contact-aside { position: static; }
  .contact-form { padding: var(--s-8) var(--s-7); border-radius: 16px; }
  .field-row { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------
   Login — a focused, centered access surface. Deepest brand ink:
   a private, secure gateway accessed quietly from an office.
-------------------------------------------------------------- */
body.page-login { --canvas: #050E1A; }
body.page-login .atmos__glow {
  --glow-mid:           rgba(40, 70, 130, 0.42);
  --glow-deep:          rgba(20, 40, 80, 0.24);
  --glow-fade:          rgba(5, 14, 26, 0);
  --glow-vignette:      rgba(2, 6, 14, 0.94);
  --glow-vignette-fade: rgba(2, 6, 14, 0);
}
.login {
  min-height: 100dvh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--nav-clear) var(--gutter) clamp(64px, 10vh, 120px);
}
.login__inner { width: 100%; max-width: 384px; text-align: center; }
.login .eyebrow { justify-content: center; display: inline-flex; margin-bottom: var(--s-6); }
.login__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(40px, 6vw, 60px);
  line-height: 0.98;
  letter-spacing: -0.03em;
  margin: 0 0 var(--s-4);
}
.login__title em { font-style: italic; }
.login__sub {
  font-family: var(--serif);
  font-size: 17px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0 auto var(--s-10);
  max-width: 32ch;
}
.login-form { display: flex; flex-direction: column; gap: var(--s-7); text-align: left; }
.login-form__actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-5);
  margin-top: var(--s-2);
}
.login-form .btn--primary { width: 100%; justify-content: center; }
.login__assist {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.08em;
  color: var(--fg-muted);
  transition: color 180ms var(--ease);
}
.login__assist:hover { color: var(--fg); }
.login__notice {
  font-family: var(--sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--fg);
  background: rgba(244, 237, 223, 0.05);
  border: 1px solid var(--hairline-strong);
  border-radius: var(--r-card);
  padding: var(--s-4) var(--s-5);
  margin: 0;
}
.login__access {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.04em;
  line-height: 1.6;
  color: var(--fg-faint);
  margin-top: var(--s-10);
}
.login__access a {
  color: var(--fg-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
  transition: color 180ms var(--ease);
}
.login__access a:hover { color: var(--fg); }

/* --------------------------------------------------------------
   Assets — Brand assets page: logo + palette + type specimens
-------------------------------------------------------------- */
.assets {
  padding: var(--s-12) var(--gutter) var(--s-20);
  position: relative;
  z-index: 3;
}
.assets__inner { max-width: var(--container); margin: 0 auto; }
.assets-block { margin: 0 0 var(--s-16); }
.assets-block__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-6); margin-bottom: var(--s-6); border-bottom: 1px solid var(--hairline); padding-bottom: var(--s-4); }
.assets-block__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(28px, 2.8vw, 40px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0;
}
.assets-block__hint {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0;
}
.logo-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s-3); }
.logo-card {
  background: var(--trench);
  border-radius: var(--r-card);
  padding: var(--s-10) var(--s-6);
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 200px;
  transition: background 260ms var(--ease);
}
.logo-card--cream { background: linear-gradient(160deg, #F4EDDF 0%, #F4EDDF 100%); }
.logo-card--deep { background: var(--ink-deep); }
.logo-card img { max-height: 56px; max-width: 70%; }
.logo-card__caption {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-muted);
  align-self: flex-end;
}
.logo-card { position: relative; }
.logo-card .logo-card__caption { position: absolute; left: var(--s-5); bottom: var(--s-4); }
.logo-card--cream .logo-card__caption { color: rgba(14,31,51,0.55); }
.palette-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--s-3); }
.swatch {
  background: var(--trench);
  border-radius: var(--r-card);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.swatch__chip { height: 140px; }
.swatch__meta { padding: var(--s-4) var(--s-5) var(--s-5); display: flex; flex-direction: column; gap: 4px; }
.swatch__name {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg);
  margin: 0;
}
.swatch__hex {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.06em;
  color: var(--fg-muted);
  margin: 0;
}
.type-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-3); }
.type-card {
  background: var(--trench);
  border-radius: var(--r-card);
  padding: var(--s-10) var(--s-8);
  display: flex;
  flex-direction: column;
  gap: var(--s-6);
  min-height: 240px;
}
.type-card__specimen {
  font-weight: 300;
  font-size: clamp(56px, 6vw, 96px);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--fg);
  margin: 0;
}
.type-card--serif .type-card__specimen { font-family: var(--serif); }
.type-card--sans .type-card__specimen { font-family: var(--sans); letter-spacing: 0.04em; }
.type-card__meta {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-family: var(--sans);
  font-size: 12px;
  color: var(--fg-muted);
  letter-spacing: 0.04em;
}
.type-card__name { font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--fg); }
@media (max-width: 960px) {
  .logo-grid { grid-template-columns: 1fr 1fr; }
  .palette-grid { grid-template-columns: 1fr 1fr; }
  .type-grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------
   Cream pivot — single light section breaking the dark canvas
   (Dylanbrouwer borrow). Used on /about for the founding story.
-------------------------------------------------------------- */
.cream-band {
  position: relative;
  z-index: 4;
  background: linear-gradient(160deg, #F4EDDF 0%, #F4EDDF 100%);
  color: var(--ink);
  padding: clamp(96px, 14vh, 180px) var(--gutter);
  margin: var(--s-10) 0;
  border-radius: 0;
}
.cream-band__inner {
  max-width: 920px;
  margin: 0 auto;
  text-align: center;
}
.cream-band .eyebrow {
  color: rgba(14, 31, 51, 0.55);
  justify-content: center;
  display: inline-flex;
}
.cream-band .eyebrow--dot::before { background: var(--ink); }
.cream-band__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(40px, 5vw, 76px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: var(--s-5) 0 var(--s-6);
  color: var(--ink);
  max-width: 18ch;
  margin-left: auto;
  margin-right: auto;
}
.cream-band__title em { font-style: italic; font-weight: 300; letter-spacing: -0.04em; }
.cream-band__body {
  font-family: var(--serif);
  font-size: clamp(18px, 1.6vw, 22px);
  line-height: 1.65;
  color: rgba(14, 31, 51, 0.72);
  max-width: 52ch;
  margin: 0 auto;
}

/* --------------------------------------------------------------
   Section spacer / common heading for interior pages
-------------------------------------------------------------- */
.section {
  padding: var(--s-17) var(--gutter);
  position: relative;
  z-index: 3;
  max-width: var(--container);
  margin: 0 auto;
}
/* Final section → footer breathing room. Tuned to match home's
   services-case → footer rhythm (~157px between last content text
   and footer display); --s-32 (128px) was too much. */
main > .section:last-child { padding-bottom: var(--s-20); }

/* Services close section — center the content inside the section
   bounds so the magnet's section-centre snap visually lands the
   title + lede + button at viewport centre, not high. */
.page-services main > .section:last-child {
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 60vh;
}
.page-services main > .section:last-child > .section__head {
  margin-bottom: 0;
}

/* About: first content section pulled up into hero's bottom footprint
   to land hero text → section eyebrow at ~80px (matches home rhythm).
   Same .pin trick used on .timeline (approach). Focus-fade keeps hero
   solo until user scrolls past it. */
.page-about main > .section {
  margin-top: -30vh;
  padding-top: var(--s-6);
}
.section__head { text-align: center; margin-bottom: var(--s-12); }
.section__head .eyebrow { justify-content: center; margin-bottom: var(--s-5); display: inline-flex; }
.section__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(36px, 4.4vw, 64px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0 auto var(--s-5);
  max-width: 18ch;
}
.section__lede {
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0 auto;
  max-width: 56ch;
}
/* Target-corner frame around the About "Extension, not substitution" block —
   anchors the white space (Fouad's note). Corners inherit --fg (ink on white). */
.section--framed .section__frame {
  position: relative;
  max-width: min(680px, 90vw);   /* hug the title + prose column */
  margin: 0 auto;
  padding: clamp(24px, 3vw, 40px) clamp(22px, 3vw, 38px);
}

/* --------------------------------------------------------------
   Prose — long-form body copy (the about founding statement).
   One measured column on a lead/body pair, with paragraph rhythm.
   Replaces the identical inline font-size/line-height/margin the
   paragraphs used to repeat four times.
-------------------------------------------------------------- */
.prose {
  --text-lead: 22px;          /* opening paragraph, carries the drop-cap */
  --text-body: 19px;          /* running body */
  max-width: 62ch;            /* keeps lines within the 65-75 CPL band */
  margin-inline: auto;
  font-family: var(--serif);
  font-size: var(--text-body);
  line-height: 1.7;
  color: var(--fg);
}
.prose > p + p { margin-top: var(--s-6); }   /* rhythm between paragraphs */
.prose > .drop-cap { font-size: var(--text-lead); line-height: 1.65; }

@media (max-width: 960px) {
  .editorial { padding: var(--s-8) var(--gutter) var(--s-12); }
  .modes { padding: var(--s-8) var(--gutter) var(--s-12); }
  .steps { padding: var(--s-8) var(--gutter) var(--s-12); }
  .faq-list { padding: var(--s-8) var(--gutter) var(--s-12); }
  .contact-section { padding: var(--s-6) var(--gutter) var(--s-12); }
  .assets { padding: var(--s-8) var(--gutter) var(--s-12); }
  .cream-band { padding: clamp(64px, 12vh, 120px) var(--gutter); }
}

/* ===============================================================
   PHASE 3 — distinct per-page identities
   Only Cormorant Garamond + Tenor Sans are constant.
   Each <body class="page-*"> gets its own canvas, ink, atmospherics
   and motion vocabulary.
   =============================================================== */

/* SPA navigation: pages swap without a full reload, so the .atmos canvas
   (sphere) keeps running continuously. The colored backdrop transitions
   smoothly via registered custom properties — the body background and the
   glow gradient stops interpolate between page palettes. */

/* Register palette tokens as <color> so CSS transitions can interpolate
   them. Without @property the var change is instant and gradients flicker. */
@property --canvas              { syntax: '<color>'; inherits: true; initial-value: #0E1F33; }
@property --glow-mid            { syntax: '<color>'; inherits: true; initial-value: rgba(46, 80, 120, 0.55); }
@property --glow-deep           { syntax: '<color>'; inherits: true; initial-value: rgba(27, 50, 78, 0.30); }
@property --glow-fade           { syntax: '<color>'; inherits: true; initial-value: rgba(14, 31, 51, 0); }
@property --glow-vignette       { syntax: '<color>'; inherits: true; initial-value: rgba(5, 14, 26, 0.92); }
@property --glow-vignette-fade  { syntax: '<color>'; inherits: true; initial-value: rgba(5, 14, 26, 0); }

body {
  /* --canvas is transitioned HERE, on the single source. Every descendant that
     reads var(--canvas) — the body background, the .atmos__glow gradient, and
     the .nav::before veil — inherits this one interpolating value, so they move
     as one. This is what makes the nav veil track the page background exactly. */
  transition: background-color 720ms cubic-bezier(0.4, 0, 0.2, 1),
              color 720ms cubic-bezier(0.4, 0, 0.2, 1),
              --canvas 720ms cubic-bezier(0.4, 0, 0.2, 1);
}

.atmos__glow {
  /* --canvas is NOT transitioned here: it inherits body's already-interpolating
     value. Only the glow-* stops (set on this element per page) transition here. */
  transition:
    --glow-mid            720ms cubic-bezier(0.4, 0, 0.2, 1),
    --glow-deep           720ms cubic-bezier(0.4, 0, 0.2, 1),
    --glow-fade           720ms cubic-bezier(0.4, 0, 0.2, 1),
    --glow-vignette       720ms cubic-bezier(0.4, 0, 0.2, 1),
    --glow-vignette-fade  720ms cubic-bezier(0.4, 0, 0.2, 1);
}

/* Main content rises in as the SPA router swaps it. The persistent .atmos
   (sphere + glow) is untouched — it stays on screen continuously. */
main.is-swap-in {
  animation: main-swap-in 480ms cubic-bezier(0.0, 0.0, 0.2, 1) both;
}
@keyframes main-swap-in {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
main.is-swap-out {
  opacity: 0;
  transition: opacity 220ms cubic-bezier(0.4, 0, 0.2, 1);
}

@media (prefers-reduced-motion: reduce) {
  body, .atmos__glow { transition: none; }
  main.is-swap-in { animation: none; }
  main.is-swap-out { transition: none; }
}

/* ----------------------------------------------------------
   ABOUT — pure white page, brand-deepest foreground (#050E1A).
   Sphere palette flips to ink in sphere.js via .page-about gate.
---------------------------------------------------------- */
/* 404 — quiet on-brand page */
.notfound { min-height: 100dvh; display: flex; align-items: center; justify-content: center; padding: var(--nav-clear) var(--gutter) var(--s-12); }
.notfound__inner { text-align: center; max-width: 640px; }
.notfound__code { font-family: var(--num); font-size: clamp(72px, 12vw, 132px); font-weight: 300; line-height: 1; letter-spacing: -0.02em; color: var(--fg-faint); margin: 0 0 var(--s-6); font-feature-settings: "tnum" 1, "lnum" 1; }
.notfound__title { font-family: var(--serif); font-weight: 300; font-size: clamp(40px, 5vw, 68px); line-height: 1.02; letter-spacing: -0.03em; margin: 0 0 var(--s-6); }
.notfound__body { font-family: var(--serif); font-size: clamp(18px, 1.4vw, 20px); line-height: 1.65; color: var(--fg-muted); max-width: 46ch; margin: 0 auto var(--s-10); }
.notfound__ctas { display: inline-flex; gap: var(--s-4); flex-wrap: wrap; justify-content: center; }

body.page-about {
  /* very light blue-tinted white (Fouad's request) — avoids the pure-white
     "off-white blur" against the ink sphere; keeps animation contrast. */
  --canvas:    #F1F5FA;
  --fg:        #050E1A;
  --fg-muted:  rgba(5, 14, 26, 0.62);
  --fg-faint:  rgba(5, 14, 26, 0.32);
}
body.page-about .atmos__glow {
  --glow-mid:           rgba(5, 14, 26, 0.05);
  --glow-deep:          rgba(5, 14, 26, 0.025);
  --glow-fade:          rgba(255, 255, 255, 0);
  --glow-vignette:      rgba(255, 255, 255, 0);
  --glow-vignette-fade: rgba(255, 255, 255, 0);
}
body.page-about .nav__brand img { filter: invert(1) brightness(0.05); }
/* nav veil auto-derives from --canvas (white here) — no override needed */
/* Fouad review #3 AB1 — hero subheadline needs full-strength ink, not the
   62%-opacity muted default, for readability on the light About canvas. */
body.page-about .page-hero__sub { color: var(--fg); }

.drop-cap::first-letter {
  font-family: var(--serif);
  font-style: italic;
  font-weight: 300;
  font-size: 4.2em;
  line-height: 0.85;
  float: left;
  margin: 0.05em 0.08em 0 0;
  color: rgba(244, 213, 168, 0.92);  /* light gold — legible on dark canvases */
}
/* On the white about page the light gold drops to 1.4:1; use a deep
   antique brass on the same hue (4.97:1) so the initial reads as gold,
   not a near-invisible smudge. */
body.page-about .drop-cap::first-letter { color: oklch(0.55 0.11 72); }
/* SVG variant: the "i" of "iviera" must stay ink, not gold — this override has
   to match the specificity of the page-about gold rule above to win. */
body.page-about .drop-cap--svg::first-letter { color: inherit; font-style: normal; }
/* About body runs at one consistent size — the opening (drop-cap) paragraph
   and the running paragraphs match, instead of 22px vs 19px. */
body.page-about .prose { --text-lead: var(--text-body); }

/* SVG R drop-cap — the paragraph leads with an inline SVG R (Cormorant
   Garamond 300, mirrors the brand wordmark glyph) instead of a styled
   first-letter. Suppress the ::first-letter rule on this variant so it
   doesn't enlarge the first text letter ("i" of "iviera"). */
/* The SVG variant supplies its own R, so the ::first-letter (the "i" of
   "iviera") must be fully neutralised — including font-style and colour, or
   the "i" renders as a stray italic gold letter next to the R. */
.drop-cap--svg::first-letter { font-size: inherit; font-style: normal; float: none; margin: 0; line-height: inherit; color: inherit; }
.drop-cap__svg {
  float: left;
  width: 4.2em;
  height: 4.6em;
  margin: 0.02em 0.12em 0 0;
  color: oklch(0.55 0.11 72);
  fill: currentColor;
  overflow: visible;
}

/* ----------------------------------------------------------
   Homepage — Heritage Navy (Fouad review #3 G2). The identity anchor
   canvas that other pages tint distinct hues away from.
---------------------------------------------------------- */
body.page-home {
  --canvas: #0E1F33;
}

/* ----------------------------------------------------------
   MSFO — Deep aubergine navy (Fouad review #3 G2 — purple tone)
---------------------------------------------------------- */
/* Fouad Review #4 S4 (extended to MSFO per Adel): tighten MSFO hero →
   first content gap to match home's rhythm. Home gap = 258px, MSFO was
   453px. Pull the first .msfo-bento section up into hero footprint. */
body.page-msfo .page-hero + .msfo-bento { margin-top: -22vh; }

body.page-msfo {
  --canvas: #1A1531;
}
body.page-msfo .atmos__glow {
  --glow-mid:           rgba(90, 60, 155, 0.42);
  --glow-deep:          rgba(50, 30, 92, 0.28);
  --glow-fade:          rgba(26, 21, 49, 0);
  --glow-vignette:      rgba(14, 10, 30, 0.94);
  --glow-vignette-fade: rgba(14, 10, 30, 0);
}
.atmos--rings {
  position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
}
.atmos--rings__stage {
  position: absolute;
  width: min(900px, 80vw);
  height: min(900px, 80vw);
  display: flex; align-items: center; justify-content: center;
}
.ring {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 1px solid rgba(244, 237, 223, 0.10);
  transform-origin: center;
  animation-name: ring-spin;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
}
.ring::after {
  content: "";
  position: absolute;
  width: 8px; height: 8px;
  background: rgba(244, 237, 223, 0.5);
  border-radius: 50%;
  top: -4px; left: 50%;
  transform: translateX(-50%);
  box-shadow: 0 0 14px rgba(244, 237, 223, 0.6);
}
.ring-1 { inset: 25%; animation-duration: 60s; border-color: rgba(244, 237, 223, 0.14); }
.ring-2 { inset: 12%; animation-duration: 100s; animation-direction: reverse; border-color: rgba(244, 237, 223, 0.10); }
.ring-3 {
  inset: 0%;
  animation-duration: 140s;
  border-color: rgba(228, 176, 116, 0.30);
  box-shadow:
    0 0 60px rgba(228, 176, 116, 0.10) inset,
    0 0 80px rgba(228, 176, 116, 0.08);
}
.ring-3::after {
  background: #F4EDDF;
  width: 10px; height: 10px;
  box-shadow: 0 0 24px rgba(228, 176, 116, 0.9);
}
@keyframes ring-spin { to { transform: rotate(360deg); } }
.atmos--rings__center {
  position: relative;
  width: 24px; height: 24px;
  border-radius: 50%;
  background: radial-gradient(circle, #F4EDDF 0%, rgba(244, 237, 223, 0) 70%);
  box-shadow: 0 0 80px rgba(244, 237, 223, 0.20);
}
.atmos--rings__sparks {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
}
@media (prefers-reduced-motion: reduce) { .ring { animation: none; } }

/* MSFO compare — observatory legend */
.compare {
  position: relative; z-index: 3;
}
body.page-msfo .compare__col {
  background: rgba(14, 31, 51, 0.55);
  backdrop-filter: blur(8px);
  border: 1px solid rgba(244, 237, 223, 0.06);
}
body.page-msfo .compare__col--accent {
  background: linear-gradient(160deg, rgba(228, 176, 116, 0.95) 0%, rgba(244, 213, 168, 0.92) 60%, rgba(228, 176, 116, 0.90) 100%);
  color: var(--ink);
  border: 1px solid rgba(228, 176, 116, 0.55);
  box-shadow: 0 0 60px rgba(228, 176, 116, 0.18);
}
body.page-msfo .compare__col__ring-label {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(244, 213, 168, 0.85);
  margin: 0;
}

/* ----------------------------------------------------------
   SERVICES — Cream gallery pivot (Apple-ish)
   Full color invert: cream canvas, navy ink
---------------------------------------------------------- */
/* Services inherits the dark canvas + sphere atmos from the home page. */

/* The gallery — 9 modes as horizontal scrollable cards */
.gallery {
  position: relative; z-index: 3;
  padding: clamp(64px, 10vh, 120px) 0 var(--s-20);
}
.gallery__head {
  max-width: var(--container);
  margin: 0 auto var(--s-10);
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: end;
  gap: var(--s-8);
}
.gallery__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(40px, 5vw, 76px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0;
  max-width: 16ch;
}
.gallery__counter {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--fg-muted);
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  text-align: right;
}
.gallery__counter strong {
  font-family: var(--serif);
  font-weight: 300;
  font-size: 48px;
  letter-spacing: -0.02em;
  color: var(--fg);
}
.gallery__rail {
  display: flex;
  gap: var(--s-5);
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  padding: var(--s-5) var(--gutter);
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  cursor: grab;
}
.gallery__rail::-webkit-scrollbar { display: none; }
.gallery__rail.is-dragging { cursor: grabbing; user-select: none; }
.gallery-card {
  flex: 0 0 clamp(280px, 38vw, 460px);
  scroll-snap-align: start;
  background: #FFFFFF;
  border-radius: 22px;
  padding: var(--s-10) var(--s-10) var(--s-8);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-height: 540px;
  position: relative;
  overflow: hidden;
  transition: transform 360ms var(--ease), box-shadow 360ms var(--ease);
  box-shadow: 0 1px 0 rgba(14, 31, 51, 0.06), 0 20px 40px -28px rgba(14, 31, 51, 0.18);
}
.gallery-card:hover { transform: translateY(-6px); box-shadow: 0 1px 0 rgba(14, 31, 51, 0.06), 0 36px 72px -32px rgba(14, 31, 51, 0.30); }
.gallery-card__num-marquee {
  position: absolute;
  bottom: -10%;
  right: -8%;
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(180px, 22vw, 320px);
  line-height: 0.85;
  letter-spacing: -0.06em;
  color: rgba(14, 31, 51, 0.04);
  pointer-events: none;
  white-space: nowrap;
}
.gallery-card__tag {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0 0 var(--s-4);
  position: relative;
  z-index: 2;
}
.gallery-card__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(28px, 2.4vw, 36px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0 0 var(--s-5);
  color: var(--fg);
  position: relative;
  z-index: 2;
  max-width: 14ch;
}
.gallery-card__body {
  font-family: var(--serif);
  font-size: 17px;
  line-height: 1.6;
  color: var(--fg-muted);
  margin: 0;
  position: relative;
  z-index: 2;
  max-width: 36ch;
}
.gallery-card__body em { color: var(--fg); font-style: italic; }
.gallery-card__footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: var(--s-8);
  padding-top: var(--s-5);
  border-top: 1px solid var(--hairline);
  position: relative;
  z-index: 2;
}
.gallery-card__num {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
.gallery__progress {
  max-width: var(--container);
  margin: var(--s-10) auto 0;
  padding: 0 var(--gutter);
  display: flex;
  gap: 4px;
}
.gallery__progress span { flex: 1; height: 1px; background: var(--hairline); position: relative; }
.gallery__progress span.is-active { background: var(--ink); }
@media (max-width: 720px) {
  .gallery__head { grid-template-columns: 1fr; gap: var(--s-4); }
  .gallery-card { flex-basis: 86vw; min-height: 480px; }
}

/* ----------------------------------------------------------
   APPROACH — Linear "command deck"
   Pure black + dot-grid + single amber accent
---------------------------------------------------------- */
body.page-services {
  /* Warm dark umber (Fouad review #3 G2 — distinct hue per page). Reads
     as the idle base; per-service scroll interactions override --canvas
     inline to each service's committed earth-tone pair. */
  --canvas: #221A14;
}
body.page-services .atmos__glow {
  /* Neutralise the site-default blue-tinted mid/vignette glow: it was
     colour-washing over BOTH the bg and the sphere, collapsing them into the
     same navy hue. On services each section is its own committed pair, so
     no additional colour overlay is wanted. */
  --glow-mid:           rgba(0, 0, 0, 0);
  --glow-deep:          rgba(0, 0, 0, 0);
  --glow-fade:          rgba(0, 0, 0, 0);
  --glow-vignette:      rgba(0, 0, 0, 0);
  --glow-vignette-fade: rgba(0, 0, 0, 0);
}
body.page-approach {
  /* Pure black canvas — gradients go light. Ivory haze hugs the edges. */
  --canvas: #000000;
}
body.page-approach .atmos__glow {
  --glow-mid:           rgba(244, 237, 223, 0.18);
  --glow-deep:          rgba(244, 237, 223, 0.09);
  --glow-fade:          rgba(0, 0, 0, 0);
  --glow-vignette:      rgba(0, 0, 0, 0.95);
  --glow-vignette-fade: rgba(0, 0, 0, 0);
}
.atmos--grid {
  position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
  background-image:
    radial-gradient(rgba(244, 237, 223, 0.06) 1px, transparent 1px);
  background-size: 28px 28px;
  background-position: 0 0;
  mask-image: radial-gradient(75% 60% at 50% 40%, #000 0%, transparent 80%);
  -webkit-mask-image: radial-gradient(75% 60% at 50% 40%, #000 0%, transparent 80%);
}
.atmos--grid::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(40% 30% at 50% 50%, rgba(228, 176, 116, 0.10) 0%, rgba(228, 176, 116, 0) 60%);
}
/* nav veil auto-derives from --canvas (near-black here) — no override needed */
.hud {
  position: fixed;
  z-index: 60;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.55);
  pointer-events: none;
}
.hud--tl { top: calc(var(--s-4) + 44px); left: var(--gutter); }
.hud--br { bottom: var(--s-5); right: var(--gutter); text-align: right; }
.hud strong { color: var(--accent); font-weight: 400; }
@media (max-width: 960px) { .hud { display: none; } }

/* Timeline */
.timeline {
  position: relative; z-index: 3;
  /* Pulled up into hero's bottom footprint via -30vh — same trick
     home .pin uses to land within ~81px of hero CTA text. Focus-fade
     keeps hero solo until user scrolls past it. */
  margin-top: -30vh;
  padding: var(--s-6) var(--gutter) var(--s-3);
}
.timeline__panel {
  /* Single fade target wraps head + body together, mirroring
     .stats__panel on home. Otherwise the two children fight to be
     the focus-fade winner and one is always hidden while the other
     is visible. */
  max-width: var(--container);
  margin: 0 auto;
  padding: 0;
}
.timeline .msfo-bento__head {
  /* Head sits at wrapper width above the 760-wide stack body, mirroring
     home .stats (head at .stats__panel 1200; bento body at 720). */
  max-width: var(--container);
  margin: 0 auto var(--s-10);
}
.timeline__inner {
  max-width: var(--w-stack);
  margin: 0 auto;
  position: relative;
}
.timeline__rail {
  position: absolute;
  left: 116px;
  top: 0; bottom: 0;
  width: 1px;
  background: linear-gradient(180deg, transparent 0%, rgba(244, 237, 223, 0.18) 8%, rgba(244, 237, 223, 0.18) 92%, transparent 100%);
}
.timeline__rail::after {
  content: "";
  position: absolute;
  top: 0; bottom: 50%;
  left: -0.5px; width: 2px;
  background: linear-gradient(180deg, transparent 0%, var(--accent) 100%);
  opacity: 0.7;
  transition: bottom 300ms linear;
}
.stage {
  position: relative;
  display: grid;
  grid-template-columns: 116px 1fr 220px;
  gap: var(--s-8);
  padding: var(--s-12) 0;
  align-items: flex-start;
}
.stage::before {
  content: "";
  position: absolute;
  left: 110px;
  top: var(--s-12);
  width: 13px; height: 13px;
  border-radius: 50%;
  background: var(--canvas);
  border: 1px solid rgba(244, 237, 223, 0.45);
  transition: border-color 320ms var(--ease), box-shadow 320ms var(--ease), background 320ms var(--ease);
}
.stage.is-active::before {
  border-color: var(--accent);
  background: var(--accent);
  box-shadow: 0 0 0 6px rgba(228, 176, 116, 0.12), 0 0 24px rgba(228, 176, 116, 0.4);
}
.stage__index {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.55);
  margin: 0;
}
.stage__index strong {
  display: block;
  font-family: var(--serif);
  font-weight: 300;
  font-size: 56px;
  line-height: 0.9;
  letter-spacing: -0.04em;
  color: var(--fg);
  margin-bottom: var(--s-2);
}
.stage.is-active .stage__index strong { color: var(--accent); }
.stage__copy { display: flex; flex-direction: column; gap: var(--s-3); }
.stage__tag {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.55);
  margin: 0;
}
.stage__title {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2vw, 26px);   /* match homepage box title */
  line-height: 1.25;
  letter-spacing: -0.005em;
  margin: 0;
}
.stage__body {
  font-family: var(--sans);
  font-size: 17px;                      /* Fouad review #3 A1: bumped from 14px for readability */
  line-height: 1.6;
  color: rgba(244, 237, 223, 0.62);
  max-width: 50ch;
  margin: 0;
}
.stage__meta {
  /* Bucket 2: panel chrome stripped — meta rows sit on page bg directly,
     MSFO-style (mirrors .stats__panel / .explore__panel chrome strip). */
  display: flex; flex-direction: column; gap: var(--s-3);
  padding: 0;
}
.stage__meta-row { display: flex; justify-content: space-between; gap: var(--s-4); }
.stage__meta-row span:first-child {
  font-family: var(--sans);
  font-size: 9px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.5);
}
.stage__meta-row span:last-child {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.06em;
  color: var(--fg);
  text-align: right;
}
@media (max-width: 960px) {
  .timeline__rail { left: 12px; }
  .stage { grid-template-columns: 1fr; gap: var(--s-4); padding: var(--s-8) 0 var(--s-8) var(--s-8); }
  .stage::before { left: 6px; top: var(--s-8); }
  .stage__index strong { font-size: 40px; }
}

/* ----------------------------------------------------------
   FAQ — cinematic alternation per question
   Each question is a full viewport, alternating dark↔cream
---------------------------------------------------------- */
body.page-faq {
  /* Fouad Review #4 F3 (Adel refinement): canvas now matches the top
     .cine--dark section's colour so the page reads as one continuous
     surface. Was #1C1428 plum (Fouad review #3 G2) which read as a
     different page. */
  --canvas: #0E1F33;
  background: var(--canvas);
}
/* Adel: last question keeps identical rhythm to the other 10 (68dvh
   section, centered). No footer pull-up — pulling the footer up
   overlapped the last section's bottom, visually shortening it and
   breaking the pair-spacing pattern between questions. Footer sits
   naturally after the section; the section's transparent tail + data-fade
   handle the visual bridge into the footer. */
body.page-faq .atmos__glow {
  /* Blue glow tokens (matching site-wide navy family). Old purple tokens
     were tied to the old plum canvas. */
  --glow-mid:           rgba(46, 80, 120, 0.55);
  --glow-deep:          rgba(27, 50, 78, 0.30);
  --glow-fade:          rgba(14, 31, 51, 0);
  --glow-vignette:      rgba(5, 14, 26, 0.92);
  --glow-vignette-fade: rgba(5, 14, 26, 0);
}
.faq-progress {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: rgba(244, 237, 223, 0.08);
  z-index: 80;
}
.faq-progress__fill {
  height: 100%;
  background: linear-gradient(90deg, #F4EDDF, #F4EDDF);
  width: 0;
  transition: width 200ms linear;
}
.cine {
  /* Fouad review #3 F3: was 100dvh + clamp(96,12vh,140) padding -> one
     full viewport per question, 11 viewports of scrolling to reach FAQ
     end. Trimmed height and padding so each section reads as one screen
     of content, not one screen of whitespace.
     Adel Review #4 F3: align-items: flex-start so every .cine__q title
     sits at the SAME position from the section top regardless of answer
     length. Fixes the Q-to-Q vertical spacing that varied when centred. */
  min-height: 68dvh;
  padding: clamp(112px, 18vh, 200px) var(--gutter) clamp(56px, 8vh, 96px);
  display: flex; align-items: flex-start;
  position: relative; z-index: 3;
}
.cine__inner {
  max-width: var(--container);
  margin: 0 auto;
  width: 100%;
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: var(--s-12);
  align-items: flex-start;
}
.cine__num {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: currentColor;
  opacity: 0.55;
  margin: 0;
  position: sticky;
  top: calc(var(--nav-clear) + 8px);
}
.cine__num strong {
  display: block;
  font-family: var(--serif);
  font-weight: 300;
  font-size: 80px;
  line-height: 0.85;
  letter-spacing: -0.04em;
  margin-bottom: var(--s-3);
  opacity: 1;
}
.cine__q {
  /* Fouad Review #4 F1: shrink so each question fits ONE line. Hardcoded
     <br/> tags removed from faq.html; max-width lifted so text can flow
     to the natural column edge. */
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(30px, 3.5vw, 52px);
  line-height: 1.08;
  letter-spacing: -0.03em;
  margin: 0 0 var(--s-10);
  max-width: none;
}
.cine__q em { font-style: italic; }
.cine__a {
  /* Fouad Review #4 F2: description matches hero subtitle size (24px). */
  font-family: var(--serif);
  font-size: var(--hero-subtitle-size);
  line-height: 1.55;
  max-width: 56ch;
  margin: 0;
  opacity: 0.86;
}
.cine__a p { margin: 0 0 var(--s-5); }
.cine__a a { border-bottom: 1px solid currentColor; }
/* Fouad review #3 F2: keep the content zone size (22-78% solid) but
   ease each fade with intermediate stops that progress MONOTONICALLY
   from mid-mix at the edge to solid self at 22%. Adjacent sections
   meet at the same midpoint colour so the seam is continuous.
   --cs = self, --cp = previous, --cn = next. */
.cine {
  background: linear-gradient(to bottom,
    color-mix(in srgb, var(--cs, #0E1F33), var(--cp, var(--cs, #0E1F33))) 0%,
    color-mix(in srgb, var(--cs, #0E1F33) 70%, var(--cp, var(--cs, #0E1F33))) 8%,
    color-mix(in srgb, var(--cs, #0E1F33) 88%, var(--cp, var(--cs, #0E1F33))) 15%,
    var(--cs, #0E1F33) 22%,
    var(--cs, #0E1F33) 78%,
    color-mix(in srgb, var(--cs, #0E1F33) 88%, var(--cn, var(--cs, #0E1F33))) 85%,
    color-mix(in srgb, var(--cs, #0E1F33) 70%, var(--cn, var(--cs, #0E1F33))) 92%,
    color-mix(in srgb, var(--cs, #0E1F33), var(--cn, var(--cs, #0E1F33))) 100%);
}
/* Fouad review #3 F2: retired the navy↔cream alternation (too harsh a
   luminance jump). All sections now cycle through same-family navy
   shades. cream text throughout. */
.cine--dark  { --cs: #0E1F33; color: #F4EDDF; }
.cine--cream { --cs: #1B324E; color: #F4EDDF; }
.cine--deep  { --cs: #050E1A; color: #F4EDDF; }

/* Fouad Review #4 F3 (final): last question.
   - Solid backdrop covering ~88% of section (matches visual size of the
     other 10 sections) then fades to transparent in the last 12% — that
     bottom fade is the visible bridge into the atmos globe.
   - Section opacity is bound to --outro-p (pages.js publishes 0→1 across
     the last 15% of scroll), so the whole thing fades ONLY during outro.
     Solid-and-untouched while a user is scrolling to it, unlike the
     data-fade winner-only behaviour that flashed the section invisible. */
main > .cine:last-of-type {
  background: linear-gradient(to bottom,
    color-mix(in srgb, var(--cs, #0E1F33), var(--cp, var(--cs, #0E1F33))) 0%,
    color-mix(in srgb, var(--cs, #0E1F33) 70%, var(--cp, var(--cs, #0E1F33))) 5%,
    color-mix(in srgb, var(--cs, #0E1F33) 88%, var(--cp, var(--cs, #0E1F33))) 10%,
    var(--cs, #0E1F33) 18%,
    var(--cs, #0E1F33) 82%,
    transparent 100%);
  opacity: calc(1 - var(--outro-p, 0));
  transition: opacity 200ms linear;
}

/* ============================================================
   Services — each service is a scrolling section. Its content fades
   in as the section reaches centre, and the persistent sphere runs
   that service's animation + accent (pages.js → window.__svcMode).
   ============================================================ */
.svc-run {
  position: relative;
  z-index: 3;
  margin-top: -60vh;
}
/* Sections read full-screen at a glance but physically overlap: each pulls up
   into the previous by -46vh, and the focus-fade engine (tight radius 0.28)
   keeps the neighbours invisible so only the centred service is visible.
   Net: 46vh scroll between services instead of 92vh, cleaner rhythm. */
.svc-sec {
  min-height: 92vh;
  margin-top: -46vh;
  display: flex; align-items: center; justify-content: center;
  padding: 0 6vw;
  position: relative;
}
.svc-sec:first-of-type { margin-top: 0; }
.svc-sec__inner { max-width: min(680px, 90vw); text-align: center; }
.svc-sec__icon { width: 60px; height: 60px; color: var(--fg); opacity: .9; margin: 0 auto var(--s-6); }
.svc-sec__icon svg { width: 100%; height: 100%; }
.svc-sec__num { font-family: var(--num); font-size: 14px; letter-spacing: .14em; color: var(--fg-faint); margin: 0; font-feature-settings: "tnum" 1, "lnum" 1; }
.svc-sec__title { font-family: var(--serif); font-weight: 300; font-size: clamp(32px, 4.6vw, 60px); line-height: 1.03; letter-spacing: -.02em; margin: 12px 0 18px; }
.svc-sec__title em { font-style: italic; }
.svc-sec__desc { font-family: var(--sans); font-size: 17px; line-height: 1.7; color: var(--fg-muted); max-width: 48ch; margin: 0 auto; }
.svc-sec__mode { font-family: var(--sans); font-size: 10.5px; letter-spacing: .26em; text-transform: uppercase; color: rgba(var(--svc-accent), .9); margin: var(--s-7) 0 0; transition: color .6s ease; }
/* Per-service backdrop: solid full-viewport wash of the active service's bg
   colour, faded in only when a service is centred (--svc-vis). Idle = default
   canvas shows. Fully opaque per service so the pair (sphere + bg) reads as a
   committed design choice, not a subtle overlay. */
/* Register the tint colour as a proper <color> so CSS can interpolate it
   between services — otherwise the bg snaps at every service boundary. */
@property --svc-bg-c { syntax: '<color>'; inherits: true; initial-value: #050E1A; }

.svc-tint {
  /* Lives inside .atmos as the first child, so the sphere canvas (also inside
     .atmos, later in the DOM) paints on top naturally. */
  position: absolute; inset: 0; pointer-events: none;
  background: var(--svc-bg-c, #050E1A);
  opacity: var(--svc-vis, 0);
  transition: opacity .5s ease, --svc-bg-c .8s ease;
}
.svc-rail { position: fixed; right: 26px; top: 50%; transform: translateY(-50%); z-index: 6; display: flex; flex-direction: column; gap: 12px; pointer-events: none; opacity: var(--svc-vis, 0); transition: opacity .4s ease; }
.svc-rail i { width: 8px; height: 8px; border: 1px solid var(--fg-faint); border-radius: 50%; transition: background .3s, border-color .3s, transform .3s; }
.svc-rail i.is-on { background: rgb(var(--svc-accent)); border-color: rgb(var(--svc-accent)); transform: scale(1.3); }
@media (max-width: 720px) { .svc-rail { display: none; } }
@media (max-width: 720px) {
  .cine__inner { grid-template-columns: 1fr; gap: var(--s-6); }
  .cine__num { position: static; }
  .cine__num strong { font-size: 48px; }
}

/* ----------------------------------------------------------
   CONTACT — Portal twilight gradient that breathes
---------------------------------------------------------- */
body.page-contact {
  /* Twilight — violet glow on plum canvas */
  --canvas: #0E0A1F;
}
body.page-contact .atmos__glow {
  --glow-mid:           rgba(140, 100, 200, 0.50);
  --glow-deep:          rgba(80, 55, 130, 0.30);
  --glow-fade:          rgba(14, 10, 31, 0);
  --glow-vignette:      rgba(5, 3, 14, 0.92);
  --glow-vignette-fade: rgba(5, 3, 14, 0);
}
.atmos--twilight {
  position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
}
.atmos--twilight::before {
  content: "";
  position: absolute;
  inset: -10%;
  background:
    radial-gradient(50% 40% at 18% 32%, rgba(120, 90, 180, 0.45) 0%, rgba(120, 90, 180, 0) 60%),
    radial-gradient(60% 50% at 82% 72%, rgba(228, 112, 110, 0.40) 0%, rgba(228, 112, 110, 0) 65%),
    radial-gradient(50% 45% at 50% 100%, rgba(244, 213, 168, 0.35) 0%, rgba(244, 213, 168, 0) 65%),
    radial-gradient(70% 60% at 50% 0%, rgba(27, 50, 78, 0.85) 0%, rgba(14, 31, 51, 0) 60%);
  animation: twilight-breathe 18s ease-in-out infinite;
}
.atmos--twilight::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(40% 30% at 70% 25%, rgba(244, 213, 168, 0.25) 0%, rgba(244, 213, 168, 0) 60%),
    radial-gradient(50% 40% at 20% 80%, rgba(120, 80, 160, 0.30) 0%, rgba(120, 80, 160, 0) 65%);
  animation: twilight-breathe 22s ease-in-out infinite reverse;
}
@keyframes twilight-breathe {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); opacity: 0.95; }
  50% { transform: translate3d(2%, -2%, 0) scale(1.06); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .atmos--twilight::before, .atmos--twilight::after { animation: none; }
}
body.page-contact .contact-form {
  background: rgba(14, 31, 51, 0.55);
  backdrop-filter: blur(16px) saturate(120%);
  -webkit-backdrop-filter: blur(16px) saturate(120%);
}
body.page-contact .contact-form::before {
  background: linear-gradient(135deg, rgba(244,213,168,0.55) 0%, rgba(120,90,180,0.20) 40%, rgba(228,112,110,0.18) 70%, rgba(244,213,168,0.45) 100%);
}

/* ----------------------------------------------------------
   BRAND ASSETS — Authkit blueprint
   Grid + dimension callouts + cyan accent
---------------------------------------------------------- */
body.page-brand {
  --canvas: #08172A;
  --blueprint: rgba(120, 200, 220, 0.10);
  --blueprint-strong: rgba(120, 200, 220, 0.22);
  background: var(--canvas);
}
.atmos--blueprint {
  position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
}
.atmos--blueprint::before {
  content: "";
  position: absolute; inset: 0;
  background-image:
    linear-gradient(var(--blueprint) 1px, transparent 1px),
    linear-gradient(90deg, var(--blueprint) 1px, transparent 1px);
  background-size: 56px 56px;
  background-position: 0 0;
  mask-image: radial-gradient(80% 70% at 50% 50%, #000 0%, transparent 90%);
  -webkit-mask-image: radial-gradient(80% 70% at 50% 50%, #000 0%, transparent 90%);
}
.atmos--blueprint::after {
  content: "";
  position: absolute; inset: 0;
  background-image:
    linear-gradient(var(--blueprint-strong) 1px, transparent 1px),
    linear-gradient(90deg, var(--blueprint-strong) 1px, transparent 1px);
  background-size: 280px 280px;
  background-position: 0 0;
  mask-image: radial-gradient(80% 70% at 50% 50%, #000 0%, transparent 90%);
  -webkit-mask-image: radial-gradient(80% 70% at 50% 50%, #000 0%, transparent 90%);
}
/* nav veil auto-derives from --canvas — no override needed */
.spec-block {
  margin: 0 0 var(--s-16);
  padding-top: var(--s-8);
  border-top: 1px solid var(--blueprint-strong);
  position: relative;
}
.spec-block__tag {
  position: absolute;
  top: -8px; left: 0;
  background: var(--canvas);
  padding-right: var(--s-3);
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: rgba(120, 200, 220, 0.85);
  margin: 0;
}
.spec-block__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-6); margin-bottom: var(--s-8); }
.spec-block__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(32px, 3.4vw, 56px);
  line-height: 1;
  letter-spacing: -0.025em;
  margin: 0;
}
.spec-block__meta {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.55);
  margin: 0;
}
.dim-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--s-3); }
.dim-swatch {
  position: relative;
  background: var(--trench);
  border-radius: 4px;
  overflow: hidden;
  border: 1px solid rgba(120, 200, 220, 0.18);
  transition: border-color 200ms var(--ease), transform 240ms var(--ease);
}
.dim-swatch:hover { border-color: rgba(120, 200, 220, 0.55); transform: translateY(-2px); }
.dim-swatch__chip { height: 160px; position: relative; }
.dim-swatch__chip::before,
.dim-swatch__chip::after {
  /* corner crosshairs */
  content: "";
  position: absolute;
  width: 10px; height: 10px;
  border: 1px solid rgba(120, 200, 220, 0.85);
}
.dim-swatch__chip::before { top: 8px; left: 8px; border-right: 0; border-bottom: 0; }
.dim-swatch__chip::after { bottom: 8px; right: 8px; border-left: 0; border-top: 0; }
.dim-swatch__meta {
  padding: var(--s-4) var(--s-5);
  display: flex; flex-direction: column; gap: 4px;
  border-top: 1px dashed rgba(120, 200, 220, 0.25);
}
.dim-swatch__name {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--fg);
  margin: 0;
}
.dim-swatch__hex {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.04em;
  color: rgba(120, 200, 220, 0.85);
  margin: 0;
}
.dim-swatch__token {
  font-family: var(--sans);
  font-size: 10px;
  color: rgba(244, 237, 223, 0.45);
  margin: 0;
}
.spec-logos { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s-3); }
.spec-logo {
  position: relative;
  border: 1px solid rgba(120, 200, 220, 0.22);
  border-radius: 4px;
  padding: var(--s-12) var(--s-6);
  display: flex; align-items: center; justify-content: center;
  min-height: 220px;
}
.spec-logo::before,
.spec-logo::after {
  content: "";
  position: absolute;
  width: 14px; height: 14px;
  border: 1px solid rgba(120, 200, 220, 0.85);
}
.spec-logo::before { top: -7px; left: -7px; border-right: 0; border-bottom: 0; background: var(--canvas); }
.spec-logo::after { bottom: -7px; right: -7px; border-left: 0; border-top: 0; background: var(--canvas); }
.spec-logo--cream { background: #F4EDDF; }
.spec-logo--ink { background: #050E1A; }
.spec-logo__caption {
  position: absolute;
  bottom: var(--s-3); left: var(--s-5);
  font-family: var(--sans);
  font-size: 9px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(120, 200, 220, 0.85);
}
.spec-logo--cream .spec-logo__caption { color: rgba(14, 31, 51, 0.55); }
.spec-logo img { max-height: 56px; max-width: 70%; }
.spec-logo--cream img { filter: invert(11%) sepia(20%) saturate(1100%) hue-rotate(180deg) brightness(80%); }
.spec-type { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-3); }
.spec-type__card {
  border: 1px solid rgba(120, 200, 220, 0.22);
  border-radius: 4px;
  padding: var(--s-10);
  display: flex; flex-direction: column; gap: var(--s-6);
  position: relative;
  min-height: 280px;
}
.spec-type__card::before {
  content: "";
  position: absolute;
  inset: 0;
  border-left: 1px dashed rgba(120, 200, 220, 0.18);
  width: 50%;
  pointer-events: none;
}
.spec-type__specimen {
  font-weight: 300;
  font-size: clamp(64px, 7vw, 120px);
  line-height: 1;
  margin: 0;
}
.spec-type__card--serif .spec-type__specimen { font-family: var(--serif); letter-spacing: -0.03em; }
.spec-type__card--sans .spec-type__specimen { font-family: var(--sans); letter-spacing: 0.04em; }
.spec-type__meta {
  display: flex; flex-direction: column; gap: var(--s-2);
  font-family: var(--sans);
  font-size: 11px;
  color: rgba(244, 237, 223, 0.55);
  letter-spacing: 0.04em;
}
.spec-type__meta strong {
  display: block;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(120, 200, 220, 0.85);
  font-weight: 400;
  margin-bottom: 2px;
}
@media (max-width: 960px) {
  .dim-grid { grid-template-columns: 1fr 1fr; }
  .spec-logos { grid-template-columns: 1fr; }
  .spec-type { grid-template-columns: 1fr; }
}

/* ----------------------------------------------------------
   PRIVACY — Brutalist Swiss, graphite
---------------------------------------------------------- */
body.page-privacy {
  --canvas: #1A1C20;
  --fg: #F4EDDF;
  --fg-muted: rgba(244, 237, 223, 0.62);
  --hairline: rgba(244, 237, 223, 0.10);
  background: var(--canvas);
  font-family: var(--sans);
}
/* nav veil auto-derives from --canvas — no override needed */
/* Privacy page — clean editorial layout. Dim the sphere so the document
   is readable; constrain widths; refine the sidebar index and section
   headings into a sober legal-document tone. */
body.page-privacy .atmos { opacity: 0.18; }
body.page-privacy .atmos__glow { opacity: 0.4; }
.brut {
  position: relative; z-index: 3;
  padding: clamp(96px, 12vh, 140px) var(--gutter) var(--s-20);
}
.brut__inner {
  max-width: 1080px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: clamp(48px, 6vw, 96px);
  padding-top: var(--s-8);
}
.brut__index {
  position: sticky;
  top: var(--nav-clear);
  align-self: start;
  display: flex; flex-direction: column;
  border-top: 1px solid rgba(244, 237, 223, 0.18);
  padding-top: var(--s-3);
}
.brut__index a {
  display: grid;
  grid-template-columns: 28px 1fr;
  gap: var(--s-3);
  padding: 10px 0;
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--fg-muted);
  border: 0;
  transition: color 200ms var(--ease);
}
.brut__index a:hover,
.brut__index a.is-active { color: var(--fg); }
.brut__index a span:first-child {
  font-family: var(--sans);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.1em;
  color: rgba(244, 237, 223, 0.42);
  transition: color 200ms var(--ease);
}
.brut__index a.is-active span:first-child { color: var(--fg); }
.brut__body {
  font-family: var(--sans);
  font-size: 15px;
  line-height: 1.7;
  color: var(--fg-muted);
  max-width: 62ch;
}
.brut__body h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(24px, 2.4vw, 32px);
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin: var(--s-12) 0 var(--s-4);
  color: var(--fg);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--s-4);
  align-items: baseline;
  padding-top: var(--s-6);
  border-top: 1px solid rgba(244, 237, 223, 0.10);
}
.brut__body h2:first-of-type { margin-top: 0; padding-top: 0; border-top: 0; }
.brut__body h2 span {
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.42);
}
.brut__meta {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--fg-muted);
  margin: 0 0 var(--s-10);
  padding-bottom: var(--s-6);
  border-bottom: 1px solid rgba(244, 237, 223, 0.18);
}
.brut__body h3 {
  font-family: var(--sans);
  font-weight: 500;
  font-size: 13px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--fg);
  margin: var(--s-8) 0 var(--s-3);
}
.brut__body p { margin: 0 0 var(--s-4); }
.brut__body ul { padding-left: var(--s-5); margin: 0 0 var(--s-5); }
.brut__body li { margin-bottom: var(--s-2); color: var(--fg-muted); }
.brut__body a { color: var(--fg); border-bottom: 1px solid var(--hairline); }
.brut__body a:hover { border-bottom-color: var(--fg); }
.brut__body em { color: var(--fg); font-style: italic; font-family: var(--serif); }
@media (max-width: 960px) {
  .brut__inner { grid-template-columns: 1fr; gap: var(--s-8); }
  .brut__index { position: static; }
}

/* ==============================================================
   Splash — first-visit logo reveal
   ============================================================== */
html.is-splashing { overflow: hidden; }
.splash {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: var(--canvas);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 1;
  transition: opacity 700ms cubic-bezier(0.6, 0, 0.2, 1);
  pointer-events: none;
}
.splash.is-out { opacity: 0; }
.splash__mark {
  width: min(420px, 60vw);
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 900ms cubic-bezier(0.2, 0.6, 0.2, 1) 120ms,
              transform 1100ms cubic-bezier(0.2, 0.6, 0.2, 1) 120ms;
}
.splash.is-in .splash__mark { opacity: 1; transform: translateY(0); }
.splash__svg { width: 100%; height: auto; display: block; }
.splash__word {
  font-family: var(--serif);
  font-weight: 300;
  font-size: 84px;
  letter-spacing: -0.005em;
  fill: var(--cream);
}
.splash__sub {
  font-family: var(--sans);
  font-weight: 400;
  font-size: 10px;
  letter-spacing: 0.20em;
  fill: var(--cream);
  opacity: 0;
  transition: opacity 700ms ease 600ms;
}
.splash.is-in .splash__sub { opacity: 0.7; }
.splash__rule {
  stroke: var(--cream);
  stroke-width: 0.5;
  stroke-dasharray: 120;
  stroke-dashoffset: 120;
  transition: stroke-dashoffset 900ms cubic-bezier(0.6, 0, 0.2, 1) 380ms;
}
.splash.is-in .splash__rule { stroke-dashoffset: 0; }
@media (prefers-reduced-motion: reduce) {
  .splash__mark, .splash__sub, .splash__rule { transition: none; }
}

/* ==============================================================
   Pin block — Section 2 as a literal rectangular statement block
   ============================================================== */
.pin__block {
  position: relative;
  max-width: var(--container);
  margin: 0 auto;
  padding: clamp(56px, 7vw, 96px) clamp(48px, 6vw, 88px);
  display: flex;
  flex-direction: column;
  gap: clamp(28px, 3.4vw, 48px);
}
.pin__block .pin__word {
  margin: 0;
  text-align: left;
  max-width: none;
  font-size: clamp(40px, 6.2vw, 92px);
  line-height: 0.98;
  letter-spacing: -0.035em;
}
.pin__block .pin__body {
  margin: 0;
  text-align: left;
  max-width: 60ch;
  /* Fouad review #3 H2: bumped to match hero subtitle rhythm (24px) */
  font-size: clamp(21px, 1.7vw, 24px);
  line-height: 1.6;
  padding-top: clamp(20px, 2.4vw, 32px);
  border-top: 1px solid var(--hairline);
  align-self: flex-end;
}
.pin__corner {
  position: absolute;
  width: 22px;
  height: 22px;
  pointer-events: none;
}
.pin__corner::before,
.pin__corner::after {
  content: "";
  position: absolute;
  background: var(--cream);
  opacity: 0.55;
}
.pin__corner::before { left: 0; top: 0; width: 22px; height: 1px; }
.pin__corner::after  { left: 0; top: 0; width: 1px; height: 22px; }
.pin__corner--tl { top: 0;       left: 0; }
.pin__corner--tr { top: 0;       right: 0; transform: scaleX(-1); }
.pin__corner--bl { bottom: 0;    left: 0; transform: scaleY(-1); }
.pin__corner--br { bottom: 0;    right: 0; transform: scale(-1, -1); }

/* Generic target-corner bracket. Reusable primitive: adapts to the page via
   currentColor (= --fg), so it reads cream on dark pages and ink on white.
   Used on the footer, the About "Extension" section, and the contact popup. */
.corner {
  position: absolute;
  width: 26px;
  height: 26px;
  pointer-events: none;
  color: var(--fg);
}
.corner::before,
.corner::after {
  content: "";
  position: absolute;
  background: currentColor;
  opacity: 0.5;
}
.corner::before { left: 0; top: 0; width: 26px; height: 1px; }
.corner::after  { left: 0; top: 0; width: 1px; height: 26px; }
.corner--tl { top: 0;    left: 0; }
.corner--tr { top: 0;    right: 0; transform: scaleX(-1); }
.corner--bl { bottom: 0; left: 0; transform: scaleY(-1); }
.corner--br { bottom: 0; right: 0; transform: scale(-1, -1); }

/* Footer target frame — corners bracket the HERO block (the section above the
   divider): title down to the privacy-policy line, at content width. */
.ftr__hero { position: relative; }
@media (max-width: 720px) {
  .pin__block { padding: var(--s-10) var(--s-6); }
  .pin__block .pin__body { align-self: stretch; max-width: none; }
}

/* ==============================================================
   Section label — divider band that visually ties Section 3 → 4
   ============================================================== */
/* Tiles sit on the trench panel — lift them with --reef so they read as cards */
.stats__panel .stat {
  background: var(--reef);
}
.stats__panel .stat:hover {
  background: var(--cream);
  color: var(--ink);
}
.stats__panel .stat--accent {
  background: var(--cream);
}
.stats__panel .stat--accent:hover {
  background: var(--reef);
  color: var(--fg);
}

/* ----------------------------------------------------------
   SERVICES — Turnkey (Boost-style sticky-scroll mechanism)
   Deep-teal section island on the cream page.
   Pinned left visual + 9 scrubbed right items.
---------------------------------------------------------- */
.turnkey {
  background: transparent;
  color: var(--fg);
  /* Pulled up into hero's bottom footprint (same .pin trick used on
     .timeline / about .section / msfo .claim) so hero text → first
     turnkey text gap ≈ home rhythm. Custom fade handles overlap
     visibility so hero and turnkey never both show at once. */
  margin-top: -30vh;
  padding: var(--s-6) 112px 0;
}
.turnkey__wrap {
  display: flex;
  gap: 136px;
  max-width: 1440px;
  margin: 0 auto;
  justify-content: center;
  align-items: stretch;
}
.turnkey__left { width: 460px; }
.turnkey__right {
  width: 586px;
  /* Defensive left-alignment so every child (callout + 9 items)
     starts at the same x coordinate. */
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  /* breathing room so the LAST item (presence) can reach viewport center
     before the sticky panel releases. */
  padding-bottom: 60vh;
}

.turnkey__panel {
  width: 460px;
  height: 440px;
  border-radius: var(--r-panel);
  position: sticky;
  top: max(96px, calc(50vh - 220px));
  overflow: hidden;
  background: var(--trench);
  box-shadow:
    inset 0 1px 0 rgba(244, 237, 223, 0.06),
    0 30px 80px -40px rgba(0, 0, 0, 0.6);
}
.turnkey__panel::before {
  content: "";
  position: absolute; inset: 0;
  border-radius: var(--r-panel);
  padding: 1px;
  background: transparent; /* cream frame removed — glass-box hairline border now provides the edge, matching every other panel */
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  pointer-events: none;
  z-index: 1;
}
.turnkey__lines {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  transition: opacity 0.5s;
  opacity: 1;
}

/* Constellation: all 9 nodes are faint dots; the active node
   expands in place into a full card with icon + numeral. */
.turnkey__container {
  position: absolute;
  width: 90px;
  height: 90px;
  /* Reset padding — defends against bare slug classes (e.g. `.network`) that
     also style unrelated sections elsewhere in the stylesheet. */
  padding: 0;
  margin: 0;
  z-index: 2;
  display: grid;
  place-items: center;
  transform-origin: center;
}
.turnkey__container.network      { top: 30px;  left: 30px;  }
.turnkey__container.financing    { top: 30px;  left: 185px; }
.turnkey__container.expertise    { top: 30px;  left: 340px; }
.turnkey__container.banking      { top: 175px; left: 340px; }
.turnkey__container.cross-border { top: 320px; left: 340px; }
.turnkey__container.real-assets  { top: 320px; left: 185px; }
.turnkey__container.transitions  { top: 320px; left: 30px;  }
.turnkey__container.digital      { top: 175px; left: 30px;  }
.turnkey__container.presence     { top: 175px; left: 185px; }
.turnkey__container.is-active { z-index: 3; }

/* Persistent dot — ALWAYS visible at every cell's center. */
.turnkey__container::before {
  content: "";
  position: absolute;
  width: 10px;
  height: 10px;
  border-radius: 999px;
  background: rgba(244, 237, 223, 0.55);
  box-shadow:
    0 0 0 1px rgba(244, 237, 223, 0.22),
    0 0 14px rgba(244, 237, 223, 0.10);
  z-index: 1;
  transition:
    background 400ms ease,
    box-shadow 400ms ease,
    transform 500ms cubic-bezier(0.22, 0.65, 0.2, 1);
  pointer-events: none;
}
.turnkey__container.is-active::before {
  background: rgba(244, 237, 223, 0.95);
  box-shadow:
    0 0 0 1px rgba(244, 237, 223, 0.4),
    0 0 24px rgba(244, 237, 223, 0.55);
  transform: translateY(26px);
}

/* Card frame — invisible by default, expands AROUND the dot when active. */
.turnkey__inner {
  position: relative;
  width: 0;
  height: 0;
  border-radius: 999px;
  background: rgba(244, 237, 223, 0);
  box-shadow: inset 0 0 0 1px rgba(244, 237, 223, 0);
  transition:
    width 720ms cubic-bezier(0.22, 0.65, 0.2, 1),
    height 720ms cubic-bezier(0.22, 0.65, 0.2, 1),
    border-radius 720ms cubic-bezier(0.22, 0.65, 0.2, 1),
    background 500ms ease,
    box-shadow 500ms ease,
    backdrop-filter 500ms ease;
  z-index: 2;
}
.turnkey__container.is-active .turnkey__inner {
  width: 100%;
  height: 100%;
  border-radius: 14px;
  background: rgba(244, 237, 223, 0.14);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  box-shadow:
    inset 0 0 0 1px rgba(244, 237, 223, 0.55),
    0 24px 48px -20px rgba(0, 0, 0, 0.7),
    0 0 100px -8px rgba(244, 237, 223, 0.32);
}

.turnkey__bolts {
  position: absolute;
  inset: auto 8px 8px auto;
  width: 18px; height: 18px;
  border-radius: 999px;
  background: rgba(244, 237, 223, 0.06);
  box-shadow: inset 0 0 0 1px rgba(244, 237, 223, 0.18);
  opacity: 0;
  transform: scale(0.6);
  transition: opacity 300ms ease 280ms, transform 400ms cubic-bezier(0.22, 0.65, 0.2, 1) 280ms;
}
.turnkey__container.is-active .turnkey__bolts {
  opacity: 1;
  transform: scale(1);
}
.turnkey__bolts::before,
.turnkey__bolts::after {
  content: "";
  position: absolute; inset: 0;
  margin: auto;
  width: 2px; height: 2px;
  background: rgba(244, 237, 223, 0.45);
  border-radius: 999px;
  transform: translate(-3px, -3px);
}
.turnkey__bolts::after { transform: translate(3px, 3px); }

.turnkey__icon {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;
  color: #F4EDDF;
  opacity: 0;
  transform: scale(0.5) translateY(-8px);
  transition:
    opacity 320ms ease 200ms,
    transform 520ms cubic-bezier(0.22, 0.65, 0.2, 1) 200ms;
  pointer-events: none;
  z-index: 3;
}
.turnkey__container.is-active .turnkey__icon {
  opacity: 1;
  transform: scale(1) translateY(-8px);
}
.turnkey__icon svg {
  width: 44%;
  height: auto;
  opacity: 1;
  stroke-width: 1.5;
}
.turnkey__num {
  font-family: var(--serif);
  font-weight: 300;
  font-size: 13px;
  letter-spacing: 0.18em;
  color: rgba(244, 237, 223, 0.98);
}

/* Network lines dim while a node is featured. */
.turnkey__panel[data-active] .turnkey__lines { opacity: 0.6; }

/* Right column */
.turnkey__callout {
  width: 100%;
  max-width: 455px;
  /* Height matches the left panel (440px) so flex-centering its content
     puts its visual middle on the same baseline as the panel's middle. */
  min-height: 440px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  margin-bottom: 250px;
  padding: 0;
  opacity: 0.22;
  transition: opacity 560ms cubic-bezier(0.22, 0.65, 0.2, 1);
}
.turnkey__callout.is-active { opacity: 1; }
.turnkey__eyebrow { margin: 0 0 var(--s-4); color: rgba(244,237,223,0.6); }
.turnkey__title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(52px, 5vw, 76px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  margin: 0 0 var(--s-6);
  color: #F4EDDF;
  /* Never split a word mid-character (the global body break-word would
     otherwise chop "Coordination," into "Coordinatio" / "n,"). */
  overflow-wrap: normal;
  word-break: keep-all;
  hyphens: none;
}
.turnkey__title em { font-style: italic; color: #F4EDDF; }
.turnkey__desc {
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.6;
  color: rgba(244, 237, 223, 0.68);
  max-width: 36ch;
  margin: 0;
}

.turnkey__item {
  display: grid;
  gap: 20px;
  width: 100%;
  max-width: 455px;
  margin: 300px 0 0 0;
  padding: 0;
  opacity: 0.22;
  transition: opacity 560ms cubic-bezier(0.22, 0.65, 0.2, 1);
}
.turnkey__item.is-active { opacity: 1; }
.turnkey__item-tag {
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(244, 237, 223, 0.55);
  margin: 0;
}
.turnkey__item-title {
  font-family: var(--serif);
  font-weight: 300;
  font-size: clamp(40px, 4vw, 64px);
  line-height: 1.0;
  letter-spacing: -0.025em;
  margin: 0;
  color: #F4EDDF;
  overflow-wrap: normal;
  word-break: keep-all;
  hyphens: none;
}
.turnkey__item-desc {
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.6;
  color: rgba(244, 237, 223, 0.68);
  margin: 0;
}
.turnkey__item-desc em { font-style: italic; color: #F4EDDF; }

/* Premium polish: balance display headings so no single word orphans onto its
   own line (e.g. "…manager coordination"). Applies site-wide to all pages. */
.page-hero__title, .section__title, .section__lede, .claim__text,
.turnkey__item-title, .turnkey__desc,
.hero__title, .hero__sub, .ftr__display, .ftr__connect-title,
.quote__text, .editorial__lead { text-wrap: balance; }

@media (max-width: 1024px) {
  .turnkey { padding: 100px 32px 0; }
  .turnkey__wrap { gap: 56px; }
  .turnkey__left, .turnkey__panel { width: 100%; max-width: 460px; }
  .turnkey__right { width: 100%; }
}
@media (max-width: 720px) {
  .turnkey { padding: 64px 20px 0; }
  .turnkey__wrap { flex-direction: column; align-items: stretch; gap: 0; }
  .turnkey__panel { height: 80vw; max-height: 440px; }
  .turnkey__title { font-size: clamp(40px, 9vw, 64px); }
  .turnkey__item { margin-top: 96px; }
  .turnkey__item-title { font-size: clamp(28px, 7vw, 44px); }
}
@media (prefers-reduced-motion: reduce) {
  .turnkey__container { transition: none !important; }
}

/* ==============================================================
   UNIVERSAL GLASS — every box/card structure across the whole site.
   One clear frosted pane recipe: faint white frost + blur + a bright
   top edge. NO colour fill, NO brightness pump (those only make a
   tinted / lightened box, not glass). Light text throughout. Placed
   last in the file so it overrides every per-element background,
   hover, and cream-accent rule defined above.
   ============================================================== */
/* Bucket 2: section-level panels (.explore__panel, .stats__panel) are NO
   LONGER frosted glass — MSFO sections sit on the page bg directly. The
   individual cards inside still get the glass treatment so the box-vs-page
   contrast matches MSFO's .ss-card. */
.ex-card, .ex-card--accent,
.stat, .stat--accent,
.stats__panel .stat, .stats__panel .stat--accent,
.quote, .step,
.compare__col, .compare__col--accent,
.network__inner,
.logo-card, .type-card,
.contact-form,
.turnkey__panel {
  background: rgba(255, 255, 255, 0.022) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  backdrop-filter: blur(20px) !important;
  border: 1px solid rgba(255, 255, 255, 0.08) !important;
  box-shadow:
    0 12px 40px -18px rgba(0, 0, 0, 0.45),
    inset 0 1px 0 rgba(255, 255, 255, 0.10) !important;
}
/* Kill decorative coloured glow-borders behind the glass panes. */
.contact-form::before {
  background: linear-gradient(135deg, rgba(255,255,255,0.40), rgba(255,255,255,0.04) 50%, rgba(255,255,255,0.30)) !important;
}

/* Hover (Option A — "Lift & line") — cream-tinted lift + hairline +
   soft shadow + arrow nudge (arrow nudge handled in per-element rules).
   !important wins against any earlier per-element hover blocks. */
.ex-card:hover, .stat:hover, .quote:hover, .step:hover,
.compare__col:hover,
.stats__panel .stat:hover,
.ex-card--accent:hover, .stat--accent:hover,
.stats__panel .stat--accent:hover {
  background: rgba(244, 237, 223, 0.025) !important;
  border-color: rgba(244, 237, 223, 0.32) !important;
  box-shadow: 0 10px 28px -18px rgba(0, 0, 0, 0.55) !important;
  transform: translateY(-2px);
}

/* Legibility — the former cream/accent tiles carried dark ink text.
   Force light text now that they're dark translucent glass. */
.ex-card--accent, .ex-card--accent .ex-card__title, .ex-card--accent .ex-card__arrow,
.stat--accent, .stat--accent .stat__value,
.compare__col--accent, .compare__col--accent .compare__head,
body.page-msfo .compare__col--accent, body.page-msfo .compare__col--accent .compare__head {
  color: var(--fg) !important;
}
.ex-card--accent .ex-card__body,
.stat--accent .stat__value sup, .stat--accent .stat__label,
.compare__col--accent .compare__tag,
body.page-msfo .compare__col--accent .compare__tag {
  color: var(--fg-muted) !important;
}

/* Hover feedback — brighten EVERY bit of card text to full light so the
   hover reads (the old cream-flip is gone). */
.ex-card:hover, .ex-card:hover .ex-card__title, .ex-card:hover .ex-card__body, .ex-card:hover .ex-card__arrow {
  color: var(--fg) !important;
}
/* Stat tiles: hover keeps text colors static (only surface lifts).
   Fouad Review #4 H1 note: no color toggle on the stat text. */

/* Reduced-transparency: drop the blur, fall back to a solid surface.
   Bucket 2: section-level panels removed from this list — they no longer
   have glass to fall back from. */
@media (prefers-reduced-transparency: reduce) {
  .ex-card, .ex-card--accent, .stat, .stat--accent,
  .stats__panel .stat, .stats__panel .stat--accent,
  .quote, .step, .compare__col, .compare__col--accent,
  .network__inner, .logo-card, .type-card, .contact-form, .turnkey__panel {
    background: var(--trench) !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
  }
}

/* ==============================================================
   GLASS BUTTONS — primary buttons get the same clear-glass pane
   as the boxes (was solid cream). Light text, brighten on hover.
   ============================================================== */
.btn--primary {
  background: rgba(255, 255, 255, 0.025) !important;
  color: var(--fg) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  backdrop-filter: blur(20px) !important;
  border: 1px solid rgba(255, 255, 255, 0.12) !important;
  box-shadow:
    0 6px 20px -10px rgba(0, 0, 0, 0.45),
    inset 0 1px 0 rgba(255, 255, 255, 0.14) !important;
}
.btn--primary:hover {
  background: rgba(255, 255, 255, 0.06) !important;
  color: var(--fg) !important;
  border-color: rgba(255, 255, 255, 0.20) !important;
  transform: translateY(-1px);
}
@media (prefers-reduced-transparency: reduce) {
  .btn--primary {
    background: var(--trench) !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
  }
}

/* ==================================================================
   Focus-fade — global. The unified scroll fade (sphere.js) drives
   inline opacity on [data-fade] wrappers; this just smooths it and
   guarantees full visibility under reduced motion.
   ================================================================== */
[data-fade] { opacity: 0; transition: opacity .45s cubic-bezier(.22,.61,.36,1); will-change: opacity; }

/* Mobile: kill every per-element reveal fade. The only fade allowed on
   mobile is the SPA page-to-page transition (transitions.js fades the
   whole <main> block via GSAP autoAlpha). Everything inside always
   shows. Covers:
     [data-fade]         — sections + footer (pages.js focus-fade)
     [data-split] .word  — hero title stagger (sphere.js bindReveals)
     [data-rise]         — subtitle rise (sphere.js bindReveals)
     .claim__text        — claim scale+fade (sphere.js bindReveals)
     [data-pin-body]     — statement band rise (sphere.js line 1354)
   !important overrides both CSS base states (opacity: 0 / transform:
   translateY(...)) and any GSAP-inline autoAlpha writes. Desktop path
   is untouched. */
@media (max-width: 560px) {
  [data-fade],
  [data-split] .word,
  [data-rise],
  .claim__text,
  [data-pin-body] {
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
    transition: none !important;
  }
  /* MSFO "Who it's for" section has its own dedicated JS opacity writer
     (pages.js:543 msfoWho.style.opacity = op) that runs on the msfo page
     only — not covered by [data-fade]. Force opacity 1 to override that
     writer. Transform is NOT reset here so the scroll-stack scale on
     .ss-card and the __head translateY tracking still work. */
  .msfo-who { opacity: 1 !important; }

  /* Full-viewport HERO only. Hero fills the phone screen; every other
     section below hugs its natural content height, using each section's
     own padding for inter-section spacing.
     dvh handles iOS Safari's collapsible URL bar cleanly; vh is the
     fallback for older browsers. */
  .hero,
  .page-hero {
    min-height: 100vh !important;
    min-height: 100dvh !important;
  }
  /* Undo any pre-existing per-section min-height that would keep a
     below-hero section viewport-tall on mobile after this change.
     Applied only to sections known to force full-viewport by class
     (.cine — 68dvh, .claim--lg — 100svh at min-width:561px). */
  .cine, .claim--lg {
    min-height: 0 !important;
  }

  /* Uniform vertical rhythm between sections. Every below-hero section
     gets the same block padding so the gap between adjacent sections is
     always ~112px (56+56). Sections that measured wildly different
     spacing before (.cine at 153/68, .claim--lg at 119/119, .msfo-bento
     at 64/64) all collapse to the same rhythm. Horizontal padding is
     left untouched so each section keeps its own gutter/max-width. */
  main > section:not(.hero):not(.page-hero) {
    padding-top: 56px !important;
    padding-bottom: 56px !important;
  }

  /* iOS overscroll bleed fix. Vertical bounce is disabled so the
     rubber-band exposure can't happen. The per-page background color
     on <html> is set inline in each HTML file (style="background:...")
     so it's present on the first byte — no flash of the wrong colour
     while CSS parses. Don't set html background here: an !important
     rule would win over the inline per-page value and paint every page
     the same colour. */
  html { overscroll-behavior-y: none; }

  /* iOS 26 Safari "Liquid Glass" URL bar fix.
     Safari 26 composites a translucent frost over pixels near the
     top and bottom edges of the viewport for its URL bar / status
     bar chrome. On this site .atmos__glow paints radial gradients
     across the whole viewport, and on interior pages those gradients
     are a different hue than the page canvas (e.g. msfo's mid glow
     is light violet on aubergine canvas). The frost picks up the glow
     colour → chrome reads as a mismatched "purple box" at both edges.
     Fix on mobile only: push .atmos__glow's paint region inward so
     it stops touching the top and bottom edges. Safari's frost then
     samples only the body canvas colour → chrome tint matches the
     page on every route. Desktop untouched. */
  .atmos__glow {
    -webkit-mask-image: linear-gradient(to bottom,
      transparent 0,
      #000 160px,
      #000 calc(100% - 160px),
      transparent 100%);
    mask-image: linear-gradient(to bottom,
      transparent 0,
      #000 160px,
      #000 calc(100% - 160px),
      transparent 100%);
  }

  /* Mobile header: burger to the true right edge. Base .nav__inner uses
     grid-template-columns: 1fr auto 1fr — with .nav__links display:none
     on mobile, the empty middle column collapses but leaves the meta
     column stuck at ~50% instead of the right edge. Switch to
     auto/1fr/auto so brand hugs the left, empty middle absorbs slack,
     meta (burger) sits flush right. */
  .nav__inner {
    grid-template-columns: auto 1fr auto;
  }

  /* Neutralize every negative-margin "hero-footprint pull". These rules
     make each content section overlap the previous section on desktop,
     relying on the focus-fade module to keep the previous section
     invisible until the user scrolls close. Fade is disabled on mobile
     per product decision, so the overlaps became visible stacks. Reset
     to margin-top:0 so sections lay out sequentially, one per screen.
     Enumerated (rather than a global reset) to avoid touching intentional
     negative margins in unrelated layout code. */
  .pin,
  .page-about main > .section,
  body.page-msfo .page-hero + .msfo-bento,
  .timeline,
  .svc-run,
  .svc-sec,
  .turnkey,
  body.page-services main > .claim {
    margin-top: 0 !important;
  }

}

/* Services .turnkey — section-level custom fade. The diagram + items
   list is 6000px+ tall, so the universal focus-fade engine (centre-based
   winner) mis-times its entry. Instead, fade the section as a whole
   based on simple viewport overlap (visible if ANY part is in view). */
.turnkey__wrap { opacity: 0; transition: opacity .55s cubic-bezier(.22,.61,.36,1); }
.turnkey.in-view .turnkey__wrap { opacity: 1; }

/* ==================================================================
   Outro — when home scroll reaches max, apply contact-page atmosphere
   (plum canvas + violet glow vars), nav fades out. Sphere swaps mode
   via sphere.js (driven by .is-outro). Footer keeps its normal
   data-fade="in" behavior. All driven by CSS transitions for smooth
   in/out as scroll crosses the threshold.
   ================================================================== */
/* Outro transitions apply on every page that participates in the outro
   (everything except page-contact, which IS the destination). Sphere
   swap is driven via JS class flip in sphere.js; the CSS here handles
   bg + glow + nav. */
/* Outro transitions apply on every page that participates in the outro
   (everything except page-contact, which IS the destination). About is
   excluded from the bg + canvas swap only (page is white by design;
   plum swap reads as disruptive). Sphere swap is driven via JS class
   flip in sphere.js; the CSS here handles bg + glow + nav. */
body:not(.page-contact) { transition: background-color .8s ease, --canvas .8s ease; }
body:not(.page-contact) .atmos__glow {
  transition: --canvas .8s ease, --glow-mid .8s ease, --glow-deep .8s ease, --glow-fade .8s ease, --glow-vignette .8s ease, --glow-vignette-fade .8s ease;
}
body:not(.page-contact) .nav { transition: opacity .55s ease; }
body.is-outro:not(.page-contact):not(.page-about) { background-color: #0E0A1F; --canvas: #0E0A1F; }
body.is-outro:not(.page-contact) .atmos__glow {
  --glow-mid:           rgba(140, 100, 200, 0.50);
  --glow-deep:          rgba(80, 55, 130, 0.30);
  --glow-fade:          rgba(14, 10, 31, 0);
  --glow-vignette:      rgba(5, 3, 14, 0.92);
  --glow-vignette-fade: rgba(5, 3, 14, 0);
}
body.is-outro:not(.page-contact) .nav { opacity: 0; pointer-events: none; }

/* ==================================================================
   Services bookcase — homepage section 10. Horizontal expanding spines.
   ================================================================== */
.services-case { padding: clamp(120px, 18vh, 220px) var(--gutter) clamp(120px, 16vh, 200px); position: relative; z-index: 3; }
.services-case .case { display: flex; gap: 8px; height: clamp(300px, 40vh, 380px); max-width: var(--container); margin: 0 auto; }
.services-case .book { flex: 1 1 0; background: rgba(255,255,255,0.022); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); border: 1px solid rgba(244,237,223,0.10); border-radius: var(--r-card); cursor: pointer; overflow: hidden; transition: flex .55s cubic-bezier(.22,.61,.36,1), background .35s ease, border-color .35s ease; display: flex; flex-direction: row; align-items: stretch; min-width: 0; }
.services-case .book:hover { border-color: rgba(244,237,223,0.22); }
.services-case .book.is-active { flex: 6 1 0; background: rgba(255,255,255,0.05); border-color: rgba(244,237,223,0.30); }
.services-case .book__spine { flex: none; width: clamp(56px, 6vw, 72px); display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding: var(--s-6) 0; border-right: 1px solid rgba(244,237,223,0); transition: border-color .35s ease; }
.services-case .book.is-active .book__spine { border-right-color: rgba(244,237,223,0.10); }
.services-case .book__num { font-family: var(--num); font-style: normal; font-weight: 400; font-size: 13px; letter-spacing: 0.08em; font-feature-settings: "tnum" 1, "lnum" 1; color: rgba(244,237,223,0.45); transition: color .35s ease; }
.services-case .book.is-active .book__num { color: rgba(244,237,223,0.95); }
.services-case .book__t { font-family: var(--sans); font-weight: 400; font-size: 15px; line-height: 1.2; letter-spacing: 0.02em; color: rgba(244,237,223,0.82); margin: 0; writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap; transition: color .25s ease; }
.services-case .book:hover .book__t { color: rgba(244,237,223,1); }
.services-case .book.is-active .book__t { color: rgba(244,237,223,1); }
.services-case .book__panel { flex: 1 1 0; min-width: 0; opacity: 0; transform: translateX(8px); transition: opacity .35s ease .1s, transform .45s ease .1s; padding: var(--s-7) var(--s-8); display: flex; flex-direction: column; justify-content: center; overflow: hidden; }
.services-case .book.is-active .book__panel { opacity: 1; transform: none; }
.services-case .book__panel-t { font-family: var(--serif); font-weight: 300; font-style: italic; font-size: clamp(22px, 2.4vw, 32px); line-height: 1.1; letter-spacing: -0.02em; color: var(--fg); margin: 0 0 16px; }
.services-case .book__panel-b { font-family: var(--sans); font-size: 14px; line-height: 1.75; color: var(--fg-muted); margin: 0; max-width: 52ch; }
@media (max-width: 560px) {
  /* Nine-books stacked vertical. Old rule kept row-flex with spine 100%
     width, which forced sibling .book__panel to computed width 0; panel
     text then wrapped one glyph per line, ballooning each book to
     3-4k px (index total: 33k px). Column stack + panel hidden until
     .is-active (JS toggle) gives ~600-900px total. */
  .services-case { padding: clamp(64px, 12vh, 120px) var(--gutter); }
  .services-case .case { flex-direction: column; height: auto; gap: 6px; }
  .services-case .book { flex: 0 0 auto; flex-direction: column; height: auto; min-height: 56px; align-items: stretch; }
  .services-case .book.is-active { flex: 0 0 auto; }
  .services-case .book__spine {
    width: 100%; flex: 0 0 auto; flex-direction: row;
    padding: 16px 20px;
    border-right: none;
    border-bottom: 1px solid rgba(244,237,223,0);
    justify-content: space-between; align-items: center;
  }
  .services-case .book.is-active .book__spine { border-bottom-color: rgba(244,237,223,0.10); }
  .services-case .book__t { writing-mode: horizontal-tb; transform: none; }
  .services-case .book__panel {
    display: none;
    flex: 0 0 auto;
    opacity: 1; transform: none;
    padding: 18px 22px 22px;
  }
  .services-case .book.is-active .book__panel { display: flex; }
  .services-case .book__panel-t { font-size: 20px; }
}
@media (prefers-reduced-motion: reduce) {
  [data-fade] { opacity: 1 !important; }
}

/* ==================================================================
   Page-to-page fade is handled by the SPA router (transitions.js):
   it swaps only <main>+<footer> behind the persistent globe/nav and
   animates them via main.is-swap-out / main.is-swap-in (defined
   above). One consistent animated transition on every navigation.
   ================================================================== */

/* ==================================================================
   Brand logo (Riviera -> R hover) — global. Default shows full
   "Riviera"; hover collapses to just "R".
   ================================================================== */
.nav__brand { display: inline-flex; flex-direction: column; justify-content: center; align-items: flex-start; min-width: 72px; gap: 3px; }
.nav__brand .brandlogo { font-family: var(--serif); font-weight: 300; font-size: 26px; letter-spacing: -.01em; color: var(--fg); display: inline-flex; align-items: baseline; line-height: 1; white-space: nowrap; }
.nav__brand .brandlogo__mfo { font-family: 'Tenor Sans', sans-serif; font-size: 8.5px; letter-spacing: .36em; color: var(--fg); opacity: .55; text-transform: uppercase; line-height: 1; padding-left: 2px; max-height: 12px; overflow: hidden; transition: max-height .55s cubic-bezier(.2,0,0,1), opacity .45s ease, transform .55s cubic-bezier(.2,0,0,1); }
.nav__brand:hover .brandlogo__mfo, .nav__brand:focus-visible .brandlogo__mfo { max-height: 0; opacity: 0; transform: translateY(-2px); }
@media (prefers-reduced-motion: reduce) { .nav__brand .brandlogo__mfo { transition: none; } }
.nav__brand .brandlogo__r { display: inline-block; }
.nav__brand .brandlogo__rest { display: inline-block; max-width: 2.4em; opacity: 1; overflow: hidden; transition: max-width .55s cubic-bezier(.2,0,0,1), opacity .45s ease, transform .55s cubic-bezier(.2,0,0,1); }
.nav__brand:hover .brandlogo__rest, .nav__brand:focus-visible .brandlogo__rest { max-width: 0; opacity: 0; transform: translateX(-2px); }
@media (prefers-reduced-motion: reduce) { .nav__brand .brandlogo__rest { transition: none; } }
/* ==================================================================
   Page-specific styles (moved from per-page inline <style> blocks so the
   SPA router never loses styling on swap). Selectors are page-unique.
   ================================================================== */

/* [explore-fix from index.html] */

  /* bento: full-width point on top; below it the 2-up left stack + right card (right card size unchanged) */
  .explore__inner{
    grid-template-columns:1fr 1fr;
    grid-template-areas:"top top" "left right";
    gap:var(--s-3);
    align-items:stretch;
  }
  .explore__top{grid-area:top;}
  .explore__top .ex-card__body{max-width:80%;}  /* full-width box: span wide but keep a right gutter, not flush to the edge */
  .explore__left{grid-area:left;}
  .explore__right{grid-area:right;}
  /* the two left boxes split the right card's height between them */
  .explore__left{justify-content:stretch;}
  .explore__left .explore__cards{flex:1;display:flex;flex-direction:column;gap:var(--s-3);}
  .explore__left .ex-card{flex:1;display:flex;flex-direction:column;justify-content:center;}
  .explore__right .card{max-width:none; width:100%;}


/* [bento-css from msfo.html] */
.msfo-bento .mb--msfo .magic-bento-card__description{max-width:58ch;}.msfo-bento .mb--msfo{position:relative;} .msfo-bento .mb-logo{position:absolute;top:var(--s-7);right:var(--s-8);font-family:var(--serif);font-weight:300;font-size:28px;line-height:1;color:var(--fg);pointer-events:none;}
  .msfo-bento{padding:var(--s-16) var(--gutter);position:relative;z-index:3;}
  .msfo-bento__head{max-width:var(--container);margin:0 auto var(--s-10);text-align:center;}
  .msfo-bento__head .eyebrow{justify-content:center;}
  .msfo-bento__title{font-family:var(--serif);font-weight:300;font-size:clamp(34px,4vw,56px);line-height:1;letter-spacing:-.03em;margin:14px 0 0;}
  .msfo-bento__title em{font-style:italic;}
  .msfo-bento .bento-section{max-width:720px;margin:0 auto;}
  .msfo-bento .card-grid{display:grid;grid-template-columns:1fr 1fr;align-items:start;gap:14px;}
  .msfo-bento .mb--msfo{grid-column:1 / -1;}
  .magic-bento-card{position:relative;display:flex;flex-direction:column;justify-content:flex-start;overflow:hidden;border-radius:var(--r-card);padding:var(--s-7) var(--s-8);min-height:0;color:var(--fg);background:rgba(255,255,255,0.022);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);
    border:1px solid rgba(255,255,255,0.10);box-shadow:0 12px 40px -18px rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.10);}
  .msfo-bento .mb--msfo{background:rgba(11,26,46,0.6);border-color:rgba(244,237,223,0.30);animation:msfoHalo 5s ease-in-out infinite;}
  @keyframes msfoHalo{0%,100%{box-shadow:0 0 0 1px rgba(244,237,223,.16),0 0 26px -8px rgba(244,237,223,.10);}
    50%{box-shadow:0 0 0 1px rgba(244,237,223,.38),0 0 54px -4px rgba(244,237,223,.30);}}
  @media(prefers-reduced-motion:reduce){.msfo-bento .mb--msfo{animation:none;}}
  .magic-bento-card__label{font-family:var(--sans);font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--fg-faint);}
  .magic-bento-card__title{font-family:var(--serif);font-weight:400;font-size:clamp(24px,2.2vw,28px);line-height:1.25;letter-spacing:-0.005em;margin:0 0 var(--s-4);color:var(--fg);}
  
  .magic-bento-card__description{font-family:var(--sans);font-weight:400;font-size:17px;line-height:1.6;letter-spacing:0.01em;color:var(--fg-muted);margin:0;max-width:44ch;}
  .magic-bento-card__content{}
  .magic-bento-card__header{display:flex;justify-content:space-between;align-items:flex-start;}
  @media(max-width:760px){.msfo-bento .card-grid{grid-template-columns:1fr;}.msfo-bento .mb--msfo{grid-row:auto;}}

  /* Homepage explore: MSFO grid (1 wide top + 2 below), no color/logo. */
  .explore.msfo-bento .mb--wide{grid-column:1 / -1;}
  .explore.msfo-bento .mb--wide .magic-bento-card__description{max-width:58ch;}
  /* Hard caps: title max 1 line, sub max 2 lines. */
  .explore.msfo-bento .magic-bento-card__title{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
  .explore.msfo-bento .magic-bento-card__description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
  /* Side cards are narrower than wide card — shrink title to fit 1 line. */
  .explore.msfo-bento .magic-bento-card:not(.mb--wide) .magic-bento-card__title{font-size:clamp(18px,1.7vw,21px);}


/* [who2-css from msfo.html] */

  .msfo-who{padding:var(--s-16) var(--gutter) 0;position:relative;z-index:3;}
  .msfo-who .ss{max-width:760px;margin:0 auto;position:relative;}
  .msfo-who__head{position:sticky;text-align:center;margin:0 0 26px;z-index:6;will-change:transform;}
  .msfo-who__head .eyebrow{justify-content:center;}
  .msfo-who__title{font-family:var(--serif);font-weight:300;font-size:clamp(34px,4vw,56px);line-height:1;letter-spacing:-.03em;margin:14px 0 0;}
  .msfo-who__title em{font-style:italic;}
  .msfo-who .ss-card{position:sticky;transform-origin:50% 0;border-radius:var(--r-card);padding:var(--s-7) var(--s-8);min-height:0;display:flex;flex-direction:column;justify-content:flex-start;background:color-mix(in srgb, var(--canvas), white 6%);border:1px solid rgba(255,255,255,0.08);box-shadow:0 12px 40px -18px rgba(0,0,0,0.45),inset 0 1px 0 rgba(255,255,255,0.10);margin-bottom:18px;transition:transform .1s linear;overflow:hidden;}
  /* Per-card frost — retired per Fouad review #3 M4 (opaque cards, no
     see-through). JS still injects the canvas but we hide it so cards
     stay fully opaque when stacked. */
  .msfo-who .ss-card__frost {
    display: none;
  }
  .msfo-who .ss-card > *:not(.ss-card__frost) { position: relative; z-index: 1; }
  .msfo-who .ss-t{font-family:var(--serif);font-weight:400;font-size:clamp(24px,2.2vw,28px);line-height:1.25;letter-spacing:-0.005em;margin:0 0 var(--s-4);}
  .msfo-who .ss-d{font-family:var(--sans);font-weight:400;font-size:17px;line-height:1.65;letter-spacing:0.01em;color:var(--fg-muted);max-width:52ch;margin:0;}
  .msfo-who .ss-spacer{height:14vh;}


/* MSFO claim section follows approach pattern — sized to content,
   not 100svh. Focus-fade gives the editorial moment feel. */
.page-msfo .claim--lg,
.page-home .claim--lg { min-height: 0; }

/* CTAs inside the .claim moment. Inside the data-fade wrapper so they
   fade with the line and sit visually coupled to it — not as a separate
   section below. Home closing hero (H6) uses the same pattern. */
/* Fouad Review #4 S3 (Adel refinement) — match home's above/below
   gaps around the .claim bottom hero on services.
   Home .claim--lg above-gap = 222, below-gap = 242.
   Before this rule services was 462 / 296. */
body.page-services main > .claim {
  margin-top: -27vh;
  padding-bottom: clamp(80px, 12vh, 160px);
}

.page-msfo .claim__ctas,
.page-home .claim__ctas,
.page-approach .claim__ctas,
.page-services .claim__ctas {
  display: flex;
  gap: 16px;
  justify-content: center;
  flex-wrap: wrap;
  align-items: center;
  margin-top: var(--s-10);
}


/* [timeline-fix from approach.html] */

      /* rail fill now tracks the active stage's dot — JS sets --rail-bot (CSS hardcoded bottom:50% was a no-op) */
      .timeline__rail::after{ bottom: var(--rail-bot, 100%); }
      /* active stage = circle + number (and its text) at 100%; every other stage dimmed.
         One opacity on the whole .stage carries the dot (::before), the number and the copy together. */
      .stage{ opacity:.3; transition:opacity .45s var(--ease); }
      .stage.is-active{ opacity:1; }
      /* contact form box must follow the universal frosted-glass box (no silver sheen) — kill the ::before gradient */
      .network__form .contact-form::before{ display:none !important; }
      .network__form .contact-form{ padding: var(--s-8) var(--s-8); }
    

/* [turnkey-fix from services.html] */

      /* release the sticky panel when mode 09 aligns (82px=(panelH440-item09H276)/2; 90 = small buffer) */
      .turnkey__right{ padding-bottom: 90px; }
      /* (removed) global .claim margin-top — home convention is 0px gap
         between consecutive sections; this stray rule from a turnkey
         services.html fix was breaking the rhythm on approach. */
      /* closing section full-width */
      main > .section:last-child{ max-width:none; }
    

/* [about-atmos-css from about.html] */
.atmos{transition:filter .55s ease;}

/* ============================================================ */
/* Contact popup — fixed overlay, persists across SPA swaps     */
/* Hosts the .network section verbatim (copy left, form right). */
/* Animation is split per-layer so backdrop-filter renders the   */
/* full transition: animating a parent's opacity defeats the     */
/* browser's backdrop-filter compositor (it snaps in at the end).*/
/* ============================================================ */
.contact-popup {
  position: fixed; inset: 0; z-index: 200;
  display: grid; place-items: center;
  padding: 24px;
  pointer-events: none;
  visibility: hidden;
  transition: visibility 0s linear .55s;
}
.contact-popup.is-open {
  pointer-events: auto;
  visibility: visible;
  transition: visibility 0s linear 0s;
}
/* Backdrop = semi-transparent tint + a STATIC blur (never animated — only the
   opacity transitions, so no Chrome compositor lag). The blur softens the live
   sphere behind, so the running animation reads as the popup's moving
   background. */
.contact-popup__backdrop {
  position: absolute; inset: 0;
  /* Fouad review #3 N2: no tint, blur only — page behind reads as
     blurred without any colour wash on top. */
  background-color: transparent;
  -webkit-backdrop-filter: blur(12px) saturate(115%);
  backdrop-filter: blur(12px) saturate(115%);
  opacity: 0;
  transition: opacity .45s cubic-bezier(.2,.7,.2,1);
}
.contact-popup.is-open .contact-popup__backdrop { opacity: 1; }

/* Panel = a distinct floating card so it reads as a popup, not content on a
   black field. Dark surface, hairline border, lift shadow, rounded, clipped. */
.contact-popup__panel {
  position: relative; z-index: 1;
  /* Fouad review #3 N2: stretched from 900 -> 1120 for a wider composition. */
  width: min(1120px, 100%);
  max-height: calc(100dvh - 40px);
  overflow: hidden;
  padding: clamp(28px, 4vw, 56px);
  background:
    radial-gradient(130% 100% at 50% 0%, rgba(46, 84, 140, 0.18), transparent 62%),
    linear-gradient(180deg, #0B1B30 0%, #081524 100%);
  border: 1px solid var(--hairline-strong);
  border-radius: var(--r-panel);
  box-shadow: 0 44px 120px -34px rgba(0,0,0,0.72), inset 0 1px 0 rgba(255,255,255,0.06);
  opacity: 0;
  transform: translateY(16px) scale(0.985);
  transition: opacity .5s cubic-bezier(.2,.7,.2,1), transform .5s cubic-bezier(.2,.7,.2,1);
}
.contact-popup.is-open .contact-popup__panel {
  opacity: 1;
  transform: none;
}
.contact-popup__panel .network { padding: 0; }
/* Flatten the reused .network card inside the popup — the popup panel IS the
   card, so drop the inner background/padding/radius/border/shadow entirely
   (no card-in-card). !important beats the site-wide glass-panel rule at
   .network__inner that also uses !important. */
.contact-popup__panel .network__inner {
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
  padding: 0 !important;
  max-width: none;
  overflow: visible;
}
.contact-popup__panel .contact-form::before { display: none !important; }
/* Fouad review #3 N2: strip the light-blue frame around the form fields
   (was overridden with !important elsewhere so needs !important here). */
.contact-popup__panel .contact-form {
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
}
/* Content + close sit above the aura; corners frame the card. */
.contact-popup__panel > .network,
.contact-popup__close { position: relative; z-index: 2; }
/* Animated background inside the card — a slow drifting glow. */
.contact-popup__aura {
  position: absolute; inset: -30%;
  z-index: 0; pointer-events: none;
  background: radial-gradient(closest-side, rgba(96, 138, 210, 0.20), transparent 72%);
  animation: cp-drift 15s ease-in-out infinite alternate;
}
@keyframes cp-drift {
  0%   { transform: translate(-14%, -6%) scale(1); }
  50%  { transform: translate(10%, 8%)  scale(1.18); }
  100% { transform: translate(-4%, 12%) scale(1.06); }
}
/* Fouad review #3 N2 — corner markers removed from the popup per Adel
   (not part of Fouad's ask and read as visual noise on the modal). */
.contact-popup__panel > .corner { display: none; }
@media (prefers-reduced-motion: reduce) { .contact-popup__aura { animation: none; } }
.contact-popup__close {
  /* Fouad review #3 N2: sit tight to the top-right corner marker
     (previously top:18px right:18px, felt too far inside the panel). */
  position: absolute; top: 10px; right: 10px;
  width: 32px; height: 32px;
  display: grid; place-items: center;
  background: transparent;
  border: 0;
  color: rgba(244, 237, 223, 0.50);
  cursor: pointer; z-index: 3;
  transition: color .25s ease, transform .25s ease;
}
.contact-popup__close:hover {
  color: var(--fg);
  transform: rotate(90deg);
}
.contact-popup__thanks { color: var(--fg-muted); margin: 16px 0 0; }
body.is-contact-open { overflow: hidden; }
@media (max-width: 860px) {
  .contact-popup__panel .network__inner { grid-template-columns: 1fr; gap: var(--s-8); }
}
@media (prefers-reduced-motion: reduce) {
  .contact-popup,
  .contact-popup__backdrop,
  .contact-popup__panel { transition: none; }
}

/* Fouad Review #4 N2 — About page remaps --fg/--fg-muted/--fg-faint to
   dark ink for the cream page canvas. The contact popup keeps its default
   dark-navy panel (identical to Home/Services/etc), so we scope those three
   tokens back to their cream values INSIDE the popup only. One block, and
   every child element that reads var(--fg*) shows correctly. */
body.page-about .contact-popup__panel {
  --fg:        #F4EDDF;
  --fg-muted:  rgba(244, 237, 223, 0.62);
  --fg-faint:  rgba(244, 237, 223, 0.32);
  color: var(--fg); /* re-set here so body's dark-ink color doesn't inherit
                       through to .network__title (which has no explicit color). */
}
/* Primary button also needs to revert to the site-wide glass style used
   on Home/Services/etc. popups. page-about's dark-ink/cream-text btn
   would render dark-on-dark inside the popup. */
body.page-about .contact-popup__panel .btn--primary {
  background: rgba(255, 255, 255, 0.025) !important;
  color: var(--fg) !important;
  border: 1px solid rgba(255, 255, 255, 0.12) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  backdrop-filter: blur(20px) !important;
}
body.page-about .contact-popup__panel .btn--primary:hover {
  background: rgba(255, 255, 255, 0.05) !important;
  color: var(--fg) !important;
  border-color: rgba(255, 255, 255, 0.24) !important;
}
