/* ---------- Reset ---------- */
*, *::before, *::after { box-sizing: border-box; }

/* Lenis smooth-scroll required hooks. The library adds these classes to
   <html> at runtime; the rules below let the page scroll properly while
   the JS handles the actual smooth-scroll RAF loop. */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: clip; }
.lenis.lenis-scrolling iframe { pointer-events: none; }

/* Kill the rubber-band overscroll on every axis so the white html-bg never
   peeks through the edge of the page-frame on macOS / iOS / trackpads. */
html, body {
  overscroll-behavior: none;
  overflow-x: clip;
}

/* A11y utilities. `.visually-hidden` is the modern clip-path pattern for
   semantic-but-invisible text (page-level h1s on visual moodboard pages,
   etc). `.skip-link` is the keyboard-only "jump to main" affordance —
   parked off-screen until focused, then docks at the top-left. */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.skip-link {
  position: absolute;
  left: -10000px;
  top: 0;
  z-index: 10000;
  background: #fff;
  color: #000;
  padding: 12px 18px;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  text-decoration: none;
  border: 2px solid #000;
}
.skip-link:focus,
.skip-link:focus-visible {
  left: 16px;
  top: 16px;
  outline: 2px solid #000;
  outline-offset: 2px;
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Ink fallback DURING intro only (page-frame scale-up would otherwise show
     a grey viewport edge). After intro completes, swap to paper so the area
     below the altfooter (24px margin + overscroll) is white, not black. */
  background: var(--color-ink);
}
html:has(body:not(.is-preloading):not(.is-intro-running)) {
  background: var(--color-paper);
}
body {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--color-text);
  background: var(--color-ink);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
body:not(.is-preloading):not(.is-intro-running) { background: var(--color-paper); }
img, svg, video { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }
h1, h2, h3, h4, p { margin: 0; }

/* ---------- Utilities ---------- */
.container {
  width: 100%;
  max-width: var(--content-max);
  margin-inline: auto;
  padding-inline: var(--container-pad-x);
}
.eyebrow {
  display: inline-block;
  font-size: var(--fs-eyebrow);
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  font-weight: 500;
  color: var(--color-text-muted);
}
.eyebrow--invert { color: var(--color-text-invert-muted); }
/* Rhombus eyebrow marker — solid-filled diamond, luxury-editorial tone. */
.eyebrow--dot::before {
  content: "";
  display: inline-block;
  width: 7px; height: 7px;
  background: currentColor;
  margin-right: calc(var(--space-2) + 3px);
  transform: translateY(-1px) rotate(45deg);
  vertical-align: middle;
}

/* Display — IvyPresto Display Thin (100) EVERYWHERE. No bolder weights. */
.display { font-family: var(--font-display); font-weight: var(--fw-thin); line-height: var(--lh-display); letter-spacing: var(--tr-tight); }
.display--hero { font-size: var(--fs-hero); line-height: 1.04; letter-spacing: -0.025em; font-weight: var(--fw-thin); }
.display--hero em { font-style: italic; font-weight: var(--fw-thin); color: inherit; }
.display--h2   { font-size: var(--fs-h2); font-weight: var(--fw-thin); }
.display--h2 em { font-style: italic; font-weight: var(--fw-thin); }
.display--h3   { font-size: var(--fs-h3); font-weight: var(--fw-thin); }

/* Lock any titles that used to be heavier — everything display stays Thin */
.service-card__title,
.work-card__title,
.post__title,
.testimonial__quote,
.counter__num,
.about__stat-num,
.plan__price {
  font-weight: var(--fw-thin);
}
.faq-item summary { font-weight: var(--fw-thin); }

.muted { color: var(--color-text-muted); }
.muted-invert { color: var(--color-text-invert-muted); }

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  padding: 14px 24px;
  border-radius: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-light);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  line-height: 1;
  transition: background-color var(--motion-base) var(--motion-ease),
              color var(--motion-base) var(--motion-ease),
              border-color var(--motion-base) var(--motion-ease),
              opacity var(--motion-base) var(--motion-ease);
}
.btn--cta { padding: 10px 10px 10px 24px; }
.btn--sm { padding: 8px 8px 8px 18px; font-size: 0.75rem; letter-spacing: 0.16em; }
.btn--sm .arrow-circle { width: 24px; height: 24px; }
.btn--sm .arrow-circle svg { width: 10px; height: 10px; }

/* Glass variant — translucent white with backdrop-blur.
   Used on hero CTAs and the nav "Book a call" button. */
.btn--glass {
  background: rgba(255,255,255,0.06);
  color: var(--color-text-invert);
  border: 1px solid rgba(255,255,255,0.22);
  backdrop-filter: blur(14px) saturate(1.15);
  -webkit-backdrop-filter: blur(14px) saturate(1.15);
}
.btn--glass:hover {
  background: rgba(255,255,255,0.14);
  border-color: rgba(255,255,255,0.5);
}
.btn--glass .arrow-circle { background: rgba(255,255,255,0.9); color: var(--color-ink); }
.btn--glass .arrow-circle svg { color: var(--color-ink); }

/* Text-swap on hover (Stodio-style): visible label slides up, duplicate slides in from below */
.btn__label {
  position: relative;
  display: inline-flex;
  overflow: hidden;
  line-height: 1.1;
  padding-block: 1px; /* room for descenders */
}
.btn__label > span {
  display: inline-block;
  white-space: nowrap;
  transition: transform 420ms var(--motion-ease);
}
.btn__label > span:nth-child(1) { transform: translateY(0); }
.btn__label > span:nth-child(2) {
  position: absolute;
  inset: 0;
  transform: translateY(110%);
}
.btn:hover .btn__label > span:nth-child(1) { transform: translateY(-110%); }
.btn:hover .btn__label > span:nth-child(2) { transform: translateY(0); }
.btn--primary {
  background: var(--color-accent);
  color: var(--color-accent-ink);
}
.btn--primary:hover { background: var(--color-accent-hover); }
.btn--ghost {
  background: var(--color-paper);
  color: var(--color-text);
}
.btn--ghost:hover { background: var(--color-paper-soft); }
.btn--outline-invert {
  background: transparent;
  color: var(--color-text-invert);
  border: 1px solid var(--color-line-dark);
}
.btn--outline-invert:hover { background: var(--color-line-dark); }

/* Arrow-circle — reusable diagonal-swap CTA icon */
.arrow-circle {
  position: relative;
  display: inline-grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: var(--radius-pill);
  overflow: hidden;
  margin-left: var(--space-1);
  background: currentColor;
  flex: 0 0 auto;
}
.arrow-circle svg {
  grid-area: 1 / 1;
  width: 12px;
  height: 12px;
  transition: transform 420ms var(--motion-ease);
}
.arrow-circle svg:nth-child(1) { transform: translate(0, 0); }
.arrow-circle svg:nth-child(2) { transform: translate(-170%, 170%); }
.btn:hover .arrow-circle svg:nth-child(1) { transform: translate(170%, -170%); }
.btn:hover .arrow-circle svg:nth-child(2) { transform: translate(0, 0); }

/* Arrow colour per button variant */
.btn--primary .arrow-circle { background: var(--color-paper); color: var(--color-accent); }
.btn--primary .arrow-circle svg { color: var(--color-accent); }
.btn--ghost .arrow-circle { background: var(--color-ink); color: var(--color-paper); }
.btn--ghost .arrow-circle svg { color: var(--color-paper); }
.btn--outline-invert .arrow-circle { background: var(--color-paper); color: var(--color-ink); }
.btn--outline-invert .arrow-circle svg { color: var(--color-ink); }


/* ---------- Nav (inside hero panel) ---------- */
.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-5);
  padding-bottom: clamp(var(--space-7), 8vw, var(--space-10));
  color: var(--color-text-invert);
}

/* Floating variant. Pinned to the top of the viewport, present from
   first paint, no entry transition. The nav slides up and out as the
   user scrolls down past the hero (handled by JS toggling
   .nav--floating.is-hidden on .proj-transform--hero, .cs-hero, and
   .cs-single__hero). */
.nav--floating {
  position: fixed;
  top: 0; left: 0; right: 0;
  padding: clamp(var(--space-5), 3vw, var(--space-7)) clamp(var(--space-5), 4vw, var(--space-8));
  padding-bottom: 0;
  z-index: 5;
  pointer-events: auto;
  transform: translateY(0);
  transition: transform 480ms cubic-bezier(0.22, 0.8, 0.24, 1),
              opacity 320ms var(--motion-ease);
}
.nav--floating.is-hidden {
  transform: translateY(-110%);
  opacity: 0;
  pointer-events: none;
}
.nav__brand {
  display: inline-flex;
  align-items: center;
  line-height: 1;
  color: var(--color-text-invert);
  text-decoration: none;
}
.nav__brand img {
  display: block;
  height: 40px;      /* +10% on previous 36px per user direction */
  width: auto;
}
.nav__links {
  display: flex;
  align-items: center;
  gap: var(--space-6);
  list-style: none;
  margin: 0; padding: 0;
}
.nav__links a {
  position: relative;
  display: inline-block;
  padding-block: 4px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: rgba(255,255,255,0.92);        /* solid white-ish, not faded */
  transition: color var(--motion-base) var(--motion-ease);
}
.nav__links a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: rgba(255,255,255,0.8);    /* crisp underline, not hazy */
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 360ms var(--motion-ease);
}
.nav__links a:hover { color: #fff; }
.nav__links a:hover::after { transform: scaleX(1); }
@media (max-width: 840px) {
  .nav__links { display: none; }
}

/* ---------- Hero — full-bleed, video-backed, extended scroll (fluid.glass) ----------
   Hero is a TALL section (~170vh). Video-wrap is absolute inset:0, so it
   stretches to cover the whole hero and scrolls away with the page (no sticky,
   no pinning). First fold (100vh) holds the title + hairline at the bottom;
   the second fold (~70vh) holds tagline + CTAs, revealed via IntersectionObserver.
   Mirrors fluid.glass's two-row hero pattern. */
.hero {
  padding: 0;
  background: #050505;
  position: relative;
}
.hero__panel {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-radius: 0;
  padding: clamp(var(--space-5), 3vw, var(--space-7)) clamp(var(--space-5), 4vw, var(--space-8)) clamp(var(--space-8), 8vw, var(--space-10));
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  isolation: isolate;
  /* Lock to one fold so the video sits edge-to-edge with no extra bezels */
  min-height: 100vh;
  height: 100vh;
}

/* Hero image/video inside-zoom — scale 1.06 → 1. Delay 200ms, 900ms duration. */
.hero__bg, .hero__video-wrap {
  transform: scale(1.06);
  will-change: transform;
  transition: transform 900ms cubic-bezier(0.16, 1, 0.3, 1) 200ms;
}
body:not(.is-preloading) .hero__bg,
body:not(.is-preloading) .hero__video-wrap { transform: scale(1); }

/* Intro fade — nav + title + hairline appear 400ms after .is-preloading drop.
   Excludes .nav--floating (Projects + Case Studies floating nav) so the
   header on those pages is present from first paint, paired with the
   already-darkened hero shadow. The scroll-up hide-on-scroll behaviour
   continues to work normally afterwards. */
.nav:not(.nav--floating), .hero__title, .hero__rule {
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 600ms cubic-bezier(0.16, 1, 0.3, 1) 400ms,
              transform 600ms cubic-bezier(0.16, 1, 0.3, 1) 400ms;
}
body:not(.is-preloading) .nav:not(.nav--floating),
body:not(.is-preloading) .hero__title,
body:not(.is-preloading) .hero__rule {
  opacity: 1;
  transform: translateY(0);
}
.nav--floating { opacity: 1; transform: none; transition: none; }

@media (prefers-reduced-motion: reduce) {
  .hero__bg, .hero__video-wrap { transform: none !important; transition: none; }
  .nav, .hero__title, .hero__rule { animation: none; opacity: 1; transform: none; }
  .hero__ctas { opacity: 1 !important; transform: none !important; }
}

/* Bottom soft blur + fade — TWO-LAYER effect for a smooth fog transition:
   ::before = backdrop-filter blur masked with a gradient so the blur amount
   gently ramps from 0 (top) to full (bottom). ::after = dark gradient sitting
   on top of the blur so the bleeds into the dark trusted-by strip feels
   continuous. */
.hero__panel::before {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: clamp(240px, 32vh, 380px);
  backdrop-filter: blur(22px);
  -webkit-backdrop-filter: blur(22px);
  /* Mask grows from transparent at top to opaque at bottom so the blur
     applies GRADUALLY — smooth "fog rising" effect, not a hard blur strip. */
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.4) 35%, rgba(0,0,0,0.85) 65%, #000 100%);
          mask-image: linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.4) 35%, rgba(0,0,0,0.85) 65%, #000 100%);
  pointer-events: none;
  z-index: 0;
}
.hero__panel::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: clamp(240px, 32vh, 380px);
  background: linear-gradient(180deg,
    rgba(10,10,10,0)    0%,
    rgba(10,10,10,0.1)  28%,
    rgba(10,10,10,0.4)  55%,
    rgba(10,10,10,0.78) 78%,
    rgba(10,10,10,1)   100%
  );
  pointer-events: none;
  z-index: 1;
}
/* Make sure nav + content stay above the blur layer */
.hero .nav, .hero__grid { position: relative; z-index: 2; }

/* ---------- Preloader + page-frame reveal (fluid.glass-style intro) ----------
   Timeline (all times approximate, driven by CSS animation delays):
     0     ms  dark panel covers viewport, logo hidden
     150   ms  logo words fade in with .split-words stagger (60ms per word)
     ~350  ms  logo fully revealed (3 words × 60ms + 200ms word duration)
     1600  ms  HOLD ends. Logo exits upward with stagger, page-frame starts
               sliding up from translateY(100%) scale(0.85) → 0,1.
     1900  ms  Hero video inside the page-frame scales from 1.1 → 1 (soft
               settle, like fluid.glass's main:firstChild zoom).
     2800  ms  page-frame fully revealed; preloader fades out.
     3200  ms  preloader removed from DOM by JS. */
.preloader {
  position: fixed;
  inset: 0;
  z-index: 9999;
  pointer-events: auto;
}
body.is-preloading { overflow: hidden; }

.preloader__panel {
  position: absolute;
  inset: 0;
  background: var(--color-ink);
  z-index: 1;
  transition: opacity 700ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.preloader__veil {
  position: absolute;
  inset: 0;
  z-index: 2;
  background: rgba(10,10,10,0);
  pointer-events: none;
  transition: background 300ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
/* Veil stays transparent on exit — the previous "misty transition" that
   darkened to 0.28 opacity was sitting over the page for ~1s after the
   panel faded, making the hero look dimmed on first paint. Now panel
   fades straight to 0 and the page is fully visible immediately. */
.preloader.is-done .preloader__veil { background: rgba(10,10,10,0); }
.preloader.is-done {
  pointer-events: none;                       /* don't eat clicks while exiting */
}
.preloader.is-done .preloader__panel {
  opacity: 0;
  transition-delay: 0ms;
  transition-duration: 220ms;
}

/* Preloader mark — inline HoA wordmark SVG, split into 3 <g> groups (House /
   of / Advanced). Each group animates in with a 90ms-per-word stagger, holds,
   then animates out with matching stagger. Motion vocabulary (opacity +
   blur + translateY) mirrors the site-wide .split-words title reveals so the
   intro reads as the same language. Total visible life ≈ 2.3s. */
.preloader__mark {
  position: absolute;
  top: 50%; left: 50%;
  z-index: 3;
  transform: translate(-50%, -50%);
  width: min(32vw, 320px);                   /* wordmark sits centred, scales fluidly */
}
.preloader__svg {
  width: 100%;
  height: auto;
  display: block;
  overflow: visible;                          /* don't clip the blur halo on entry */
}
.preloader__word {
  /* SVG <g> elements — CSS transforms operate in the group's bounding box via
     transform-box, so translateY in CSS pixels behaves like it would on a
     block element. */
  transform-box: fill-box;
  transform-origin: 50% 50%;
  opacity: 0;
  filter: blur(8px);
  transform: translateY(12px);
  will-change: opacity, filter, transform;
  animation:
    preloader-word-in  700ms cubic-bezier(0.215, 0.61, 0.355, 1) calc(var(--w, 0) * 90ms + 140ms) both,
    preloader-word-out 520ms cubic-bezier(0.22, 0.8, 0.24, 1)   calc(var(--w, 0) * 60ms + 1700ms) forwards;
}
@keyframes preloader-word-in {
  from { opacity: 0; filter: blur(8px); transform: translateY(12px); }
  to   { opacity: 1; filter: blur(0);   transform: translateY(0); }
}
@keyframes preloader-word-out {
  from { opacity: 1; filter: blur(0);   transform: translateY(0); }
  to   { opacity: 0; filter: blur(6px); transform: translateY(-10px); }
}
@media (max-width: 640px) {
  .preloader__mark { width: min(68vw, 280px); }
}

/* Page-frame reveal REMOVED — the blur/translate/scale transition was
   reading as a "shadow" hanging on the page for ~1s after the preloader
   cleared. Page now appears fully rendered the moment the preloader panel
   fades. Only the preloader's own exit is the entry transition. */

@media (prefers-reduced-motion: reduce) {
  .preloader { transition: opacity 300ms linear; }
  .preloader.is-done { opacity: 0; }
  .preloader__mark {
    animation: none;
    transition: none;
    opacity: 1;
    filter: none;
    transform: translate(-50%, -50%);
  }
}

/* Vimeo iframe hero video — 16:9 cover. Whichever viewport side is wider
   drives the other so the iframe stays full-bleed at any aspect. Poster
   image below keeps paint alive while Vimeo finishes loading. */
.hero__video-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: -1;
  pointer-events: none;
}
.hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border: 0;
  pointer-events: none;
  /* Decoder hint: keep the loop alive even when the tab regains focus. */
  background: var(--color-ink, #050505);
}
@media (prefers-reduced-motion: reduce) {
  .hero__video-wrap { display: none; }
}

/* Hero kicker — sits between H1 and hairline rule, explains the offer in
   one sentence. Thin body copy, restrained width, enters with the H1. */
.hero__kicker {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.55;
  color: rgba(255,255,255,0.78);
  max-width: 62ch;
  margin: clamp(18px, 1.8vw, 28px) 0 0;
  letter-spacing: 0;
}

/* Hairline divider — spans the full width of the title/CTA block so it
   visually ties the headline to the buttons. */
.hero__rule {
  border: 0;
  height: 1px;
  width: 100%;
  max-width: none;
  background: rgba(255,255,255,0.32);
  margin: clamp(24px, 2.6vw, 40px) 0 clamp(22px, 2.2vw, 32px);
}

/* Solid ink fallback only. The bitmap poster has been retired so the
   video iframe is the first background the visitor ever sees, with no
   image-then-video flash. The colour matches the dark video frame so
   the iframe slot reads as black before Vimeo paints. */
.hero__bg {
  position: absolute;
  inset: 0;
  background: var(--color-ink, #0a0a0a);
  z-index: -2;
  will-change: transform;
}
.hero__overlay {
  position: absolute;
  inset: 0;
  /* Diffuse darken across the video. Bottom band is the strongest so the
     H1 + CTAs at the bottom-fold sit on a deep shadow and read cleanly
     without bleaching the upper third of the frame. */
  background:
    linear-gradient(to top, rgba(0,0,0,0.78) 0%, rgba(0,0,0,0.45) 28%, rgba(0,0,0,0.22) 60%, rgba(0,0,0,0.42) 100%),
    rgba(0,0,0,0.22);
  z-index: -1;
}

/* Hero content wrapper — single-fold, title + hairline + CTAs stacked tight
   at the bottom of a 100vh panel. No secondary row, no scroll pin. */
.hero__grid {
  position: relative;
  z-index: 2;
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: flex-start;
  gap: 0;
}

/* Asterisk marks — now a horizontal row above the title (leadestate.com pattern) */
.hero__marks {
  list-style: none;
  margin: 0 0 var(--space-2);
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-invert-muted);
}
.hero__marks li {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
}
.hero__mark-star {
  width: 11px;
  height: 11px;
  color: var(--color-text-invert);
  flex: 0 0 auto;
}

.hero__title {
  /* +20% over previous clamp(2.5, 4.6vw, 4rem) = clamp(3rem, 5.5vw, 4.8rem) */
  font-size: clamp(3rem, 5.5vw, 4.8rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  max-width: none;         /* <br> in HTML controls the break */
  margin: 0;
}
/* Editorial kicker — italic IvyPresto Thin. Legacy rule kept for any other
   template that references it, but the homepage H1 no longer uses it. */
.hero__title-emph {
  font-style: italic;
  font-weight: var(--fw-thin, 200);
}

/* "Luxury Real Estate" — italic IvyPresto Thin with a white → light-silver
   gradient wash. The gradient is applied to EACH .word span (split-words
   wraps every word) because background-clip: text only clips an element's
   own text, not descendants' text. Putting it on the <em> alone made the
   inner word spans render transparent (invisible), which is why "Luxury
   Real Estate" disappeared while "Leading" and "Marketing Agency" stayed. */
.hero__title-lux {
  font-style: italic;
  font-weight: var(--fw-thin, 200);
}
.hero__title-lux,
.hero__title-lux .word {
  background-image: linear-gradient(90deg,
    #ffffff 0%,
    #eaeaea 45%,
    #c8c8c8 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
}
/* Subtle pink → white → light-grey gradient on "great". Low saturation so it
   reads as a tonal shift, not a colour pop. Fallback to soft cream tone in
   browsers without background-clip: text. */
.hero__title-great {
  color: #e8c7d4;
  background: linear-gradient(90deg,
    #e8c7d4 0%,
    #ffffff 48%,
    #d0d0d0 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  opacity: 0.94;
}

.hero__lede {
  display: grid;
  gap: var(--space-4);
  max-width: 72ch;        /* stretched wider, sits directly under title */
  margin-top: var(--space-5);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: var(--color-text-invert-muted);
}
.hero__lede p { margin: 0; }

.hero__ctas {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: center;
  gap: var(--space-6);
  margin-top: 0;
}

/* (Scroll hint removed per user request) */

/* Hero CTA variants — asymmetric: quiet text-link + emphasized glass pill.
   Simpler than the .btn system: no double-span text-swap, no diagonal arrow swap. */
.btn-ct {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  line-height: 1;
  color: var(--color-text-invert);
  text-decoration: none;
  transition: color var(--motion-base) var(--motion-ease),
              background-color var(--motion-base) var(--motion-ease),
              border-color var(--motion-base) var(--motion-ease),
              opacity var(--motion-base) var(--motion-ease);
}

/* Slide-up synced animation — text + arrow move together as one layer,
   duplicate layer rises from below. Both layers use identical content so the
   arrow travels with the label at the same speed, same easing. */
.btn-ct__slide {
  position: relative;
  display: inline-flex;
  overflow: hidden;
  line-height: 1;
  padding-block: 2px;
}
.btn-ct__row {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  white-space: nowrap;
  line-height: 1;
  transition: transform 480ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.btn-ct__row:nth-child(1) { transform: translateY(0); }
.btn-ct__row:nth-child(2) {
  position: absolute;
  inset: 0;
  transform: translateY(120%);
}
.btn-ct:hover .btn-ct__row:nth-child(1) { transform: translateY(-120%); }
.btn-ct:hover .btn-ct__row:nth-child(2) { transform: translateY(0); }

.btn-ct__arrow {
  width: 12px;
  height: 12px;
  color: currentColor;
  flex: 0 0 auto;
  margin-left: 10px;
  overflow: visible;
}

/* Nav "Apply now" arrow → rhombus morph on hover (scoped, no other button).
   Rest: diagonal arrow visible, rhombus hidden.
   Hover: arrow un-draws, rhombus draws itself into a complete outline. */
.apply-arrow-path {
  stroke-dasharray: 24.5 0.1;
  stroke-dashoffset: 0;
  transition: stroke-dasharray 520ms cubic-bezier(0.65, 0, 0.35, 1),
              stroke-dashoffset 520ms cubic-bezier(0.65, 0, 0.35, 1);
}
.apply-arrow-dia {
  stroke-dasharray: 0 34;
  stroke-dashoffset: 0;
  transition: stroke-dasharray 520ms cubic-bezier(0.65, 0, 0.35, 1),
              stroke-dashoffset 520ms cubic-bezier(0.65, 0, 0.35, 1);
}
.btn-ct--nav:hover .apply-arrow-path {
  stroke-dasharray: 0 999999;
  stroke-dashoffset: 0.001;
}
.btn-ct--nav:hover .apply-arrow-dia {
  stroke-dasharray: 34 0.1;
  stroke-dashoffset: 0;
}

/* Morph variant — both glyphs share a unified clockwise rotation AND collapse
   through a scale-0 midpoint, so the arrow reads as genuinely morphing into
   the rhombus rather than cross-fading. Timing bands are staggered: arrow
   shrinks + rotates out over the first half; rhombus expands + rotates in
   over the second half, picking up from exactly the same angle. */
.btn-ct--morph .btn-ct__arrow-wrap {
  position: relative;
  display: inline-grid;
  width: 13px; height: 13px;
  flex: 0 0 auto;
}
.btn-ct--morph .btn-ct__arrow-wrap svg {
  grid-area: 1 / 1;
  width: 13px; height: 13px;
  transform-origin: 50% 50%;
  transition: opacity 260ms cubic-bezier(0.65, 0, 0.35, 1),
              transform 520ms cubic-bezier(0.65, 0, 0.35, 1);
}
/* Resting state: arrow visible at 0°, rhombus hidden, already rotated -180° */
.btn-ct--morph .btn-ct__arrow-wrap svg:nth-child(1) {
  opacity: 1;
  transform: rotate(0deg) scale(1);
}
.btn-ct--morph .btn-ct__arrow-wrap svg:nth-child(2) {
  opacity: 0;
  transform: rotate(-180deg) scale(0.1);
  transition-delay: 0ms;
}
/* Hover: arrow rotates clockwise 180° + shrinks to a point, rhombus
   continues the rotation from -180° → 0° + grows back from 0.1 → 1.
   Same effect when the parent .hstep--outro carries [data-outro-active] —
   the JS-driven scroll-end trigger so the Discover button auto-morphs as
   the carousel finishes, without needing a real hover. */
.btn-ct--morph:hover .btn-ct__arrow-wrap svg:nth-child(1),
.hstep--outro[data-outro-active] .btn-ct--morph .btn-ct__arrow-wrap svg:nth-child(1) {
  opacity: 0;
  transform: rotate(180deg) scale(0.1);
  transition-delay: 0ms;
}
.btn-ct--morph:hover .btn-ct__arrow-wrap svg:nth-child(2),
.hstep--outro[data-outro-active] .btn-ct--morph .btn-ct__arrow-wrap svg:nth-child(2) {
  opacity: 1;
  transform: rotate(0deg) scale(1);
  transition-delay: 180ms;
}
/* Outro card emphasis when auto-highlighted by scroll — the CTA reads as
   already-active (matches the visual state it would have on real hover) so
   the user sees a clear "next move" beacon without having to mouse over. */
.hstep--outro[data-outro-active] .btn-ct--glass {
  background: rgba(255,255,255,0.22);
  border-color: rgba(255,255,255,0.85);
  color: #fff;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.18), 0 12px 36px rgba(0,0,0,0.32);
}

/* Outro card reads as an extra step that links through to the approach
   page. No box outline — the card matches the regular step layout, the
   morph CTA inside fires on scroll-arrival, and the whole card itself is
   wrapped in an anchor (see HTML) so any click navigates to /approach. */
.hstep__outro-link {
  display: flex;
  flex-direction: column;
  height: 100%;
  text-decoration: none;
  color: inherit;
}
.hstep__outro-link:focus-visible {
  outline: 1px solid rgba(255, 255, 255, 0.6);
  outline-offset: 4px;
}

/* Quiet de-emphasized CTA — thin outline pill with a very soft
   light segment that runs slowly around the border perimeter. */
@property --run-angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}
.btn-ct--quiet {
  padding: 14px 22px;
  color: rgba(255,255,255,0.72);
  border: 1px solid rgba(255,255,255,0.10);
  background: transparent;
  --run-angle: 0deg;
  animation: runAngle 9s linear infinite;
}
.btn-ct--quiet::before {
  content: "";
  position: absolute;
  inset: -1px;
  padding: 1px;                         /* thickness of the visible ring */
  background: conic-gradient(
    from var(--run-angle),
    rgba(255,255,255,0) 0%,
    rgba(255,255,255,0.45) 6%,
    rgba(255,255,255,0) 18%,
    rgba(255,255,255,0) 100%
  );
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  pointer-events: none;
}
.btn-ct--quiet:hover { color: var(--color-text-invert); border-color: rgba(255,255,255,0.26); }
@keyframes runAngle { to { --run-angle: 360deg; } }

/* Firefox / older browsers: hide the conic layer and fall back to a static
   soft border — no runtime regression. */
@supports not (background: conic-gradient(from var(--run-angle), red, red)) {
  .btn-ct--quiet::before { display: none; }
  .btn-ct--quiet { animation: none; }
}

/* On-light variant — thin static border, no running gradient */
.btn-ct--on-light {
  color: rgba(10,10,10,0.7);
  border-color: rgba(10,10,10,0.18);
  animation: none;                                   /* disable --run-angle loop */
}
.btn-ct--on-light::before { display: none; }         /* hide conic ring layer */
.btn-ct--on-light:hover {
  color: var(--color-text);
  border-color: rgba(10,10,10,0.45);
  background: rgba(10,10,10,0.03);
}

/* Centre variant — used for section-closing CTAs (stodio pattern). Bigger, more
   generous padding, lightly restored running outline so it reads as a "moment"
   at the end of a grid rather than a bare link. */
.btn-ct--centre {
  padding: 18px 36px;
  font-size: 0.8125rem;
  letter-spacing: 0.2em;
}
.btn-ct--centre.btn-ct--on-light {
  border-color: rgba(10,10,10,0.22);
  animation: runAngle 9s linear infinite;
  --run-angle: 0deg;
}
.btn-ct--centre.btn-ct--on-light::before {
  display: block;
  content: "";
  position: absolute;
  inset: -1px;
  padding: 1px;
  background: conic-gradient(
    from var(--run-angle),
    rgba(10,10,10,0) 0%,
    rgba(10,10,10,0.5) 6%,
    rgba(10,10,10,0) 20%,
    rgba(10,10,10,0) 100%
  );
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  pointer-events: none;
}

/* Emphasized glass pill — the primary on the right */
.btn-ct--glass {
  padding: 14px 22px;
  background: rgba(255,255,255,0.14);
  border: 1px solid rgba(255,255,255,0.32);
  backdrop-filter: blur(14px) saturate(1.15);
  -webkit-backdrop-filter: blur(14px) saturate(1.15);
}
.btn-ct--glass:hover {
  background: rgba(255,255,255,0.22);
  border-color: rgba(255,255,255,0.55);
}

@media (max-width: 840px) {
  .hero__marks {
    gap: var(--space-4);
    font-size: 0.6875rem;
  }
}

/* ---------- Trusted-by strip (label + logo marquee) — DARK, FULL-BLEED ---------- */
.trusted {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding: clamp(var(--space-7), 6.3vw, var(--space-9)) 0;   /* -10% */
  border-bottom: 1px solid rgba(255,255,255,0.08);
  /* Soft inner shadow at the top so the hero's fade-to-ink continues INTO
     the trusted strip — no visible edge where one section stops and the
     next begins. */
  box-shadow: inset 0 32px 56px -32px rgba(0,0,0,0.8);
}
/* Full-bleed strip — label column on the left, marquee fills the rest.
   Label column is narrow enough that the marquee can stretch wide. */
.trusted__inner {
  display: grid;
  grid-template-columns: minmax(240px, 300px) 1fr;
  align-items: center;
  gap: clamp(var(--space-4), 2.5vw, var(--space-6));
  /* Matches the hero panel's horizontal padding so the ✦/Trusted stack
     lines up with the nav logo + hero title above */
  padding-inline: clamp(var(--space-5), 4vw, var(--space-8));
}

/* Stacked label, everything aligns to the left edge of the ✦ icon */
.trusted__label {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-3);
}
.trusted__icon {
  width: 13px;
  height: 13px;
  color: var(--color-text-invert);
  flex: 0 0 auto;
  margin-bottom: var(--space-1);
}
.trusted__head {
  font-family: var(--font-display);
  font-size: clamp(1.35rem, 2.15vw, 1.9rem);     /* -10% */
  font-weight: var(--fw-thin);
  line-height: 1.1;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
}
.trusted__head em {
  font-style: italic;
  color: rgba(255,255,255,0.6);
}
.trusted__sub {
  font-family: var(--font-body);
  font-size: 0.85rem;                             /* -10% */
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: rgba(255,255,255,0.55);
  max-width: 30ch;
}
/* Stylised kicker — "LUXURY REAL ESTATE" in editorial all-caps with tracking */
.trusted__kicker {
  display: inline-block;
  font-family: var(--font-body);
  font-weight: var(--fw-medium);
  font-size: 0.73rem;                             /* -10% */
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-invert);
  margin-right: 0.2em;
}

/* Marquee column */
.trusted__marquee {
  position: relative;
  overflow: hidden;
  --fade: 60px;
}
.trusted__marquee::before,
.trusted__marquee::after {
  content: "";
  position: absolute;
  top: 0; bottom: 0;
  width: var(--fade);
  z-index: 2;
  pointer-events: none;
}
.trusted__marquee::before { left: 0;  background: linear-gradient(to right, var(--color-ink), transparent); }
.trusted__marquee::after  { right: 0; background: linear-gradient(to left,  var(--color-ink), transparent); }

.trusted__track {
  display: flex;
  gap: clamp(var(--space-6), 4.5vw, var(--space-8));   /* denser */
  align-items: center;
  width: max-content;
  animation: trustedMarquee 90s linear infinite;       /* desktop: original */
  will-change: transform;
}
.trusted__track img {
  height: 40px;                                          /* -10% on previous 44px */
  width: auto;
  max-width: none;
  flex: 0 0 auto;
  /* Dark bg: logos are typically dark-on-light files — invert to near-white */
  filter: brightness(0) invert(1) opacity(0.7);
  transition: filter 600ms var(--motion-ease), opacity 600ms var(--motion-ease);
}
.trusted__track:hover img { filter: brightness(0) invert(1) opacity(0.3); }
.trusted__track:hover img:hover { filter: brightness(0) invert(1) opacity(1); }

@keyframes trustedMarquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

@media (max-width: 840px) {
  .trusted__inner { grid-template-columns: 1fr; gap: var(--space-5); }
  .trusted__track img { height: 34px; }
}

/* ---------- Nav CTA — compact glass variant (uses same system as hero) ---------- */
.btn-ct--nav {
  padding: 14px 22px;                         /* roomier — no longer compressed */
  min-height: 44px;                           /* hits the 44px touch-target floor */
  font-size: 0.6875rem;                       /* 11px, matches nav link size weight */
  letter-spacing: 0.14em;
  gap: 10px;
}
.btn-ct--nav .btn-ct__arrow { width: 10px; height: 10px; }

/* ---------- Section scaffold ---------- */
.section {
  padding-block: var(--section-pad-y);
}
.section__head {
  display: grid;
  gap: var(--space-4);
  margin-bottom: var(--space-8);
  max-width: var(--prose-max);
}
.section__head--split {
  grid-template-columns: 1fr 1fr;
  gap: var(--space-7);
  max-width: none;
  align-items: end;
}
@media (max-width: 840px) {
  .section__head--split { grid-template-columns: 1fr; }
}

/* ---------- Featured In — editorial press-credibility strip (LIGHT GREY) ----
   Sits between Case Studies and Approach. Uses `--color-paper-soft` (#f3f3f3)
   instead of the old beige canvas so the strip reads as a neutral press bar,
   not another content section. One editorial card currently; grid of cards
   can be swapped in as more press arrives without restyling. */
.featured {
  background: var(--color-paper-soft, #f3f3f3);
  color: var(--color-ink);
}
.featured__head {
  display: grid;
  gap: var(--space-3);
  margin-bottom: clamp(var(--space-7), 6vw, var(--space-9));
  max-width: 68ch;
}
.featured__title {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.75rem, 3.4vw, 2.75rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0;
}
.featured__title em {
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.55);
}
/* Compact horizontal strip: logo (left) · title + meta (centre) · read (right).
   Lower height than before — reads as a discreet press mention, not a hero. */
.featured__card {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: clamp(var(--space-6), 4vw, var(--space-8));
  padding: clamp(var(--space-5), 2.6vw, var(--space-6)) clamp(var(--space-6), 4vw, var(--space-8));
  border: 1px solid rgba(10,10,10,0.12);
  background: transparent;
  color: var(--color-ink);
  text-decoration: none;
  position: relative;
  isolation: isolate;
  transition: background-color 520ms var(--motion-ease),
              border-color 520ms var(--motion-ease);
}
.featured__card::before,
.featured__card::after {
  content: "";
  position: absolute;
  left: 0; right: 0;
  height: 1px;
  background: var(--color-ink);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 640ms cubic-bezier(0.22, 0.8, 0.24, 1);
  z-index: 2;
}
.featured__card::before { top: -1px; }
.featured__card::after  { bottom: -1px; transform-origin: right center; }
.featured__card:hover {
  background: #eaeaea;
  border-color: rgba(10,10,10,0.2);
}
.featured__card:hover::before,
.featured__card:hover::after { transform: scaleX(1); }
@media (max-width: 840px) {
  .featured__card {
    grid-template-columns: 1fr;
    gap: var(--space-5);
  }
}

.featured__card-logo {
  display: flex;
  align-items: center;
  justify-content: center;
  padding-right: clamp(var(--space-5), 3vw, var(--space-7));
  border-right: 1px solid rgba(10,10,10,0.1);
  min-height: clamp(80px, 10vw, 110px);
}
@media (max-width: 840px) {
  .featured__card-logo {
    border-right: 0;
    border-bottom: 1px solid rgba(10,10,10,0.1);
    padding-right: 0;
    padding-bottom: var(--space-5);
    justify-content: flex-start;
  }
}
.featured__logo {
  width: clamp(86px, 9vw, 120px);
  height: auto;
  opacity: 0.82;                         /* discreet — doesn't dominate */
  filter: saturate(0.85);
  transition: opacity 420ms var(--motion-ease);
}
.featured__card:hover .featured__logo { opacity: 1; }

.featured__card-body {
  display: grid;
  gap: var(--space-2);
  align-content: center;
}
.featured__pub-kicker {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.58);
}
.featured__article {
  font-family: var(--font-display);
  font-style: normal;                    /* NOT italic — IvyPresto Thin regular */
  font-weight: 200;
  font-size: clamp(1.125rem, 1.9vw, 1.5rem);
  line-height: 1.25;
  letter-spacing: -0.01em;
  margin: 0;
  color: var(--color-ink);
  max-width: 46ch;
}
.featured__meta {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.62);
}

.featured__card-action {
  display: flex;
  align-items: center;
  justify-content: flex-end;
}
@media (max-width: 840px) {
  .featured__card-action { justify-content: flex-start; }
}
.featured__read {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-ink);
  white-space: nowrap;
}
.featured__read svg {
  width: 14px;
  height: 14px;
  transition: transform 460ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.featured__card:hover .featured__read svg {
  transform: translate(3px, -3px);
}

/* ---------- About (two-column: content left, stacked media right) — DARK ---------- */
.about {
  position: relative;
  background: var(--color-ink);
  color: var(--color-text-invert);
}
.about .eyebrow { color: rgba(255,255,255,0.55); }
.about__heading { color: var(--color-text-invert); }
.about__lead { color: rgba(255,255,255,0.7) !important; }
.about .values { color: rgba(255,255,255,0.65); }
.about .values__star { color: var(--color-text-invert); }
/* quiet CTA on dark About — slightly different gutter colour */
.about .btn-ct--quiet { color: rgba(255,255,255,0.78); border-color: rgba(255,255,255,0.12); }
.about .btn-ct--quiet:hover { color: var(--color-text-invert); border-color: rgba(255,255,255,0.3); }
/* About CTA — a touch bigger + thin weight so it reads at section scale */
.about__actions .btn-ct {
  font-size: 0.875rem;                 /* from 0.75rem — ~14px */
  letter-spacing: 0.14em;
  font-weight: var(--fw-thin);
  padding: 16px 26px;
}
/* B image's corner gutter must now match the dark panel, not paper */
.about__image--b { /* overridden below, box-shadow swapped to ink */ }
.about__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  gap: clamp(var(--space-7), 6vw, var(--space-10));
  align-items: stretch;
}
.about__content {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  max-width: 58ch;
}
.about__content .eyebrow { justify-self: start; }
.about__heading {
  font-size: clamp(2.25rem, 4vw, 3.5rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0;
  text-wrap: balance;
  max-width: 100%;
}
.about__lead {
  font-family: var(--font-body);
  font-size: clamp(1rem, 1.1vw, 1.125rem);
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: var(--color-text-muted);
  max-width: 56ch;
  margin: 0;
}
.about__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-5);
  margin-top: var(--space-2);
}

/* Secondary text-link — sits next to the primary quiet button, no border,
   underline-on-hover via the nav-link pattern so it feels editorial. */
.about__secondary-link {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.62);
  text-decoration: none;
  padding-block: 6px;
  transition: color 300ms var(--motion-ease);
}
.about__secondary-link::after {
  content: "";
  position: absolute;
  left: 0; right: 22px;
  bottom: 0;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 380ms var(--motion-ease);
}
.about__secondary-link:hover { color: var(--color-text-invert); }
.about__secondary-link:hover::after { transform: scaleX(1); }
.about__secondary-link {
  transition: color var(--motion-base) var(--motion-ease),
              transform 360ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.about__secondary-link:hover { transform: translateY(-2px); }
.about__secondary-link .btn-ct__arrow { width: 11px; height: 11px; }

/* Founders quote box — sits at the bottom of the content column with
   guaranteed breathing room from the paragraph above. */
.founders-box {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  margin-top: auto;
  /* More generous padding — the quote icon hangs above the blockquote,
     so top padding is extra-large to give the mark room to breathe. */
  padding: clamp(var(--space-8), 4.2vw, var(--space-10))
           clamp(var(--space-6), 3.2vw, var(--space-8))
           clamp(var(--space-7), 3.6vw, var(--space-8));
  border: 1px solid rgba(255,255,255,0.10);
  background: rgba(255,255,255,0.025);
}
/* Guaranteed gap from the paragraph above — sits at bottom but never flush */
.about__content > .founders-box {
  margin-top: clamp(var(--space-7), 5vw, var(--space-9));
}
.founders-box__quote {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.founders-box__quote blockquote {
  margin: 0;
  font-family: var(--font-display);
  font-style: normal;                         /* base stays upright; italic reserved for <em> */
  font-weight: var(--fw-thin);                /* 100 — IvyPresto Display Thin */
  font-size: clamp(1.25rem, 2vw, 1.625rem);
  line-height: 1.36;
  letter-spacing: -0.015em;
  color: rgba(255,255,255,0.72);              /* light gray — editorial, emphasises the italic */
  position: relative;
  padding-top: 0.2em;                         /* room for ghost open-quote to hang above */
}
.founders-box__quote blockquote em {
  font-style: italic;
  font-weight: 200;                           /* IvyPresto Thin Italic — editorial emphasis */
  color: var(--color-text-invert);            /* pure white so the phrase sits forward */
}
.founders-box__open {
  position: absolute;
  top: -0.62em;                                /* was -0.32em — sits higher above the first line */
  left: -0.08em;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(3.5rem, 7vw, 5.5rem);
  line-height: 1;
  color: rgba(255,255,255,0.14);
  pointer-events: none;
}
.founders-box__quote figcaption {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: var(--space-3);
}
/* Names — clean Gotham Book, plain title-case — readable */
.founders-box__name {
  font-family: var(--font-body);
  font-weight: var(--fw-regular);
  font-size: 0.8125rem;
  letter-spacing: 0.02em;
  color: var(--color-text-invert);
  text-transform: none;
}
/* "Founders" label — tiny caps underneath, Gotham Light */
.founders-box__role {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.45);
}
/* The quote itself stays IvyPresto italic — artistic, readable */

/* Light variant — used inside the LIGHT-grey Case Studies section.
   Two-column layout when there's space (more breathing room after the cards). */
.founders-box--light {
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
  padding: clamp(var(--space-6), 2.6vw, var(--space-7)) clamp(var(--space-6), 3vw, var(--space-8));
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(var(--space-6), 3vw, var(--space-8));
  background: rgba(255,255,255,0.7);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(0,0,0,0.08);
}
.founders-box--light .founders-box__quote blockquote { color: var(--color-text); }
.founders-box--light .founders-box__name { color: var(--color-text); }
.founders-box--light .founders-box__role { color: var(--color-text-muted); }

@media (max-width: 720px) {
  .founders-box--light { grid-template-columns: 1fr; }
}

/* Ensure content column stretches to match the media column */
.about__content { align-self: stretch; }

/* Trust badge — quiet 5-star strip */
.trust-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) 0;
  border-top: 1px solid var(--color-line);
  border-bottom: 1px solid var(--color-line);
  max-width: 56ch;
}
.trust-badge__stars {
  display: inline-flex;
  gap: 2px;
  color: #d4a656;                  /* warm gold — review-platform convention */
}
.trust-badge__stars svg { width: 15px; height: 15px; display: block; }
.trust-badge__text {
  display: inline-flex;
  align-items: baseline;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--color-text-muted);
}
.trust-badge__text strong {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: 1.5rem;
  color: var(--color-text);
  letter-spacing: -0.01em;
}

/* Pillar strip — lives inside the About section, below the grid.
   Three components of success: Production (Visual Authority) · Marketing
   (Strategic Distribution) · Media (Global Network). Reveals on scroll via
   .reveal-soft. (Legacy .about__stats-grid rules kept below for reference
   but no longer rendered.) */
.about__stats {
  margin-top: clamp(var(--space-8), 8vw, var(--space-10));
}
.about__pillars {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(var(--space-6), 3.5vw, var(--space-8));
}
@media (max-width: 900px) {
  .about__pillars { grid-template-columns: 1fr; gap: var(--space-7); }
}
.about__pillar {
  display: grid;
  gap: var(--space-4);
  padding-top: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(255,255,255,0.14);
  position: relative;
}
.about__pillar-num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.5rem, 2.6vw, 2.25rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: rgba(255,255,255,0.42);
}
.about__pillar-title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.5rem, 2.6vw, 2.125rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--color-text-invert);
}
.about__pillar-title em {
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.62);
}
.about__pillar-body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.72);
  max-width: 40ch;
}
.about__pillar-tag {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: auto;
  padding-top: var(--space-4);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.48);
}
.about__pillar-tag::before {
  content: "";
  width: 18px;
  height: 1px;
  background: currentColor;
  opacity: 0.6;
}

/* About-page THREE COMPONENTS — boxed cards on dark (replaced the old
   4-pair Core Values list). Each box: Roman numeral top-left, discipline tag
   top-right, title in the body, 3-line lede underneath. */
.about-components__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(var(--space-5), 2.4vw, var(--space-6));
}
@media (max-width: 900px) {
  .about-components__grid { grid-template-columns: 1fr; gap: var(--space-5); }
}
.component-box {
  border: 1px solid rgba(255,255,255,0.14);
  background: rgba(255,255,255,0.02);
  padding: clamp(var(--space-6), 3vw, var(--space-7));
  display: grid;
  grid-template-rows: auto auto 1fr;
  gap: var(--space-4);
  position: relative;
  isolation: isolate;
  transition: background-color 520ms var(--motion-ease),
              border-color    520ms var(--motion-ease);
}
.component-box:hover {
  background: rgba(255,255,255,0.05);
  border-color: rgba(255,255,255,0.26);
}
.component-box__num {
  position: absolute;
  top: clamp(18px, 2vw, 24px);
  right: clamp(20px, 2.4vw, 28px);
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.625rem, 2.6vw, 2.125rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: rgba(255,255,255,0.34);
}
.component-box__tag {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
}
.component-box__tag::before {
  content: "";
  width: 16px;
  height: 1px;
  background: currentColor;
  opacity: 0.6;
}
.component-box__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--color-text-invert);
}
.component-box__title em {
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.62);
}
.component-box__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.72);
  max-width: 42ch;
}

/* ============================================================================
   ABOUT PAGE — SECTIONS ADDED IN THE v38 REWRITE
   (Our Numbers head · about-press light-bg logos · timeline · approach quote
   · worldwide CTA)
   ========================================================================= */

/* Our Numbers — section head above the existing .about-stats grid */
.about-stats__head {
  max-width: 62ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-stats__head .eyebrow { color: rgba(255,255,255,0.58); }
.about-stats__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  color: var(--color-text-invert);
}
.about-stats__head h2 em {
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.55);
}

/* ---- About PRESS / CLIENTS — WHITE bg, BLACK logos, STATIC grid ---- */
.about-press {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-press__head {
  max-width: 62ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-press__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-press__title {
  margin-top: var(--space-3);
  font-size: clamp(1.75rem, 3.2vw, 2.625rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.about-press__title em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }

/* 6-col static grid on desktop, 4 on tablet, 3 on mobile. Each logo cell
   has a hairline border, logos are coerced to BLACK via brightness(0). */
.about-press__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 0;
  border-top: 1px solid rgba(10,10,10,0.12);
  border-left: 1px solid rgba(10,10,10,0.12);
}
@media (max-width: 900px) { .about-press__grid { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 600px) { .about-press__grid { grid-template-columns: repeat(3, 1fr); } }
.about-press__grid li {
  aspect-ratio: 4 / 3;
  display: flex;
  align-items: center;
  justify-content: center;
  border-right: 1px solid rgba(10,10,10,0.12);
  border-bottom: 1px solid rgba(10,10,10,0.12);
  padding: clamp(var(--space-4), 2.4vw, var(--space-5));
  position: relative;
  overflow: hidden;
  transition: background-color 420ms var(--motion-ease);
}
.about-press__grid li:hover { background: var(--color-paper-soft, #f3f3f3); }
.about-press__grid img {
  width: 100%;
  max-width: 120px;
  height: auto;
  max-height: 56px;
  object-fit: contain;
  /* Convert WHITE source logos to BLACK (brightness 0 collapses luminance
     to 0, invert flips back to solid). Opacity softens to editorial weight. */
  filter: brightness(0) opacity(0.72);
  transition: filter 420ms var(--motion-ease), transform 520ms var(--motion-ease);
}
.about-press__grid li:hover img {
  filter: brightness(0) opacity(1);
  transform: scale(1.04);
}

/* ---- TIMELINE — horizontal milestone track (DARK) ---- */
.about-timeline {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
  overflow: hidden;
}
.about-timeline__head {
  max-width: 58ch;
  margin-bottom: clamp(var(--space-8), 7vw, var(--space-9));
}
.about-timeline__head .eyebrow { color: rgba(255,255,255,0.58); }
.about-timeline__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  color: var(--color-text-invert);
}
.about-timeline__head h2 em { font-style: italic; font-weight: 200; color: rgba(255,255,255,0.55); }

.about-timeline__track {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(var(--space-6), 4vw, var(--space-8));
  position: relative;
}
/* Connecting hairline across all items */
.about-timeline__track::before {
  content: "";
  position: absolute;
  top: 3.5rem;                         /* vertical alignment with the dot */
  left: 0; right: 0;
  height: 1px;
  background: rgba(255,255,255,0.14);
  pointer-events: none;
}
@media (max-width: 900px) {
  .about-timeline__track { grid-template-columns: 1fr; gap: var(--space-6); }
  .about-timeline__track::before { display: none; }
}

.tl-item {
  display: grid;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  position: relative;
  padding-top: 0.5rem;
  transition: transform 720ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.tl-item:hover { transform: translateY(-6px); }
.tl-item__year {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-style: italic;
  font-size: clamp(2.25rem, 4.2vw, 3.75rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
  transition: color 480ms var(--motion-ease);
}
.tl-item:hover .tl-item__year { color: #fff; }
.tl-item__dot {
  width: 13px;
  height: 13px;
  background: var(--color-text-invert);
  transform: rotate(45deg);
  display: inline-block;
  position: relative;
  z-index: 1;
  margin-top: 0.25rem;
  flex: 0 0 auto;
  transition: transform 720ms cubic-bezier(0.22, 0.8, 0.24, 1),
              background-color 480ms var(--motion-ease);
}
.tl-item:hover .tl-item__dot {
  transform: rotate(45deg) scale(1.5);
  background: #ffffff;
}
.tl-item__label {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.62);
}
.tl-item__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.5;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.72);
  max-width: 26ch;
}

/* ---- APPROACH QUOTE — centered editorial pull quote (LIGHT) ---- */
.about-approach {
  background: var(--color-paper-soft, #f3f3f3);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 9vw, 11rem);
  position: relative;
  overflow: hidden;
}
.about-approach .container { max-width: 62ch; text-align: center; }
.about-approach__quote {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);                 /* 100 — Thin */
  font-size: clamp(1.625rem, 3.4vw, 2.625rem);
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  position: relative;
  padding-top: 0.4em;
}
.about-approach__quote em {
  font-style: italic;
  font-weight: var(--fw-thin);
  /* Ink → lighter-ink text gradient. Background-clip: text paints the
     glyphs with the gradient instead of a flat muted grey. On the light
     paper-soft panel this reads as a soft wash across the italic phrase. */
  background: linear-gradient(90deg, rgba(10,10,10,0.72) 0%, rgba(10,10,10,0.32) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
/* Opening-quote mark — IvyPresto Regular italic &ldquo; at icon scale.
   The glyph itself reads unmistakably as quotation marks; at Regular weight
   (400 rather than Thin 200) the strokes stay crisp rather than ghostly.
   Sits centred above the blockquote, restrained opacity so it punctuates
   rather than dominates. */
.about-approach__openmark {
  display: block;
  text-align: center;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(2.25rem, 4vw, 3rem);
  line-height: 0.55;                          /* tight so the glyph reads icon-like */
  letter-spacing: -0.08em;
  color: rgba(10,10,10,0.42);
  margin: 0 auto clamp(var(--space-4), 2.4vw, var(--space-5));
  /* Optical centering — &ldquo; glyph has a visible left-bias in the metrics */
  padding-left: 0.08em;
  user-select: none;
}
.about-approach__attr {
  margin: clamp(var(--space-6), 4vw, var(--space-7)) auto 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.55);
  text-align: center;
}
/* Small rotated-square ornament — sharp geometric accent. Matches the
   quotation ticks above so quote and credit share the same language. */
.about-approach__diamond {
  width: 6px;
  height: 6px;
  border: 1px solid rgba(10,10,10,0.38);
  background: transparent;
  transform: rotate(45deg);
  display: block;
  margin-bottom: 6px;
}
.about-approach__attr-name {
  font-family: var(--font-body);
  font-weight: var(--fw-medium, 500);
  color: rgba(10,10,10,0.78);
}
.about-approach__attr-role {
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.5);
}

/* Approach redirect block — explicit deeper-read CTA sitting under the
   founders' quote. Pushes the visitor to /approach for the full process. */
.about-approach__redirect {
  margin: clamp(var(--space-8), 7vw, var(--space-10)) auto 0;
  padding-top: clamp(var(--space-6), 4vw, var(--space-7));
  border-top: 1px solid rgba(10,10,10,0.10);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-3), 2vw, var(--space-4));
  text-align: center;
}
.about-approach__redirect-eyebrow {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.5);
}
.about-approach__redirect-title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(1.5rem, 2.6vw, 2.125rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 30ch;
}
.about-approach__redirect-title em {
  font-style: italic;
  font-weight: var(--fw-thin, 100);
  color: rgba(10,10,10,0.55);
}
.about-approach__redirect-lede {
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.62);
  margin: 0;
  max-width: 52ch;
}
.about-approach__redirect-cta { margin-top: clamp(var(--space-3), 2vw, var(--space-4)); }

/* ============================================================
   ABOUT — three-values blend animation (studiod.nu replica).
   The section is a sticky-pinned rail spanning ~360vh of vertical scroll
   so the user is locked into the convergence for ~3 viewport ticks. JS
   writes scroll progress 0→1 into --blend-p; CSS interpolates everything
   smoothly off that single variable. The wordmark begins absent at
   p≤0.40, fades in across 0.40→0.70, then grows in scale across 0.70→1.0
   to fill the centre as the three circles fully merge.
============================================================ */
.about-blend {
  background: #0a0a0a;
  color: var(--color-text-invert);
  padding: 0;
  position: relative;
}

/* Rail = vertical scroll height; sticky inner pin holds the stage in
   place while the rail scrolls past it. ~560vh = ~5 scroll ticks so the
   journey has room: head fade → labels fade → row→pyramid → pyramid→
   single merged circle → wordmark grows large. */
.about-blend__rail {
  position: relative;
  height: 560vh;
}
.about-blend__sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(var(--space-4), 3.2vw, var(--space-6));
  padding: clamp(60px, 8vh, 110px) clamp(var(--space-5), 5vw, var(--space-9));
  overflow: hidden;
}

/* Head — fades + lifts off as the convergence begins, controlled by
   --blend-head (0 at start, 1 once head should be gone, mapped from
   raw progress in JS). */
.about-blend__head {
  text-align: center;
  max-width: 56ch;
  opacity: calc(1 - var(--blend-head, 0));
  transform: translateY(calc(var(--blend-head, 0) * -16px));
  transition: opacity 200ms linear;
  will-change: opacity, transform;
}
.about-blend__head .eyebrow {
  justify-content: center;
  color: rgba(255,255,255,0.6);
}
.about-blend__title {
  margin: clamp(var(--space-3), 2vw, var(--space-4)) 0 0;
  color: var(--color-text-invert);
}
.about-blend__title em {
  color: rgba(255,255,255,0.55);
  font-style: italic;
  font-weight: var(--fw-thin, 100);
}
.about-blend__lede {
  margin: clamp(var(--space-4), 2.4vw, var(--space-5)) auto 0;
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(255,255,255,0.62);
  max-width: 50ch;
}

/* Stage — wide square frame. Bigger circles, with labels anchored to
   the OUTER half of each circle so they never bleed into a neighbour.
   Phases (raw scroll progress):
     0.00–0.18 → head (eyebrow + title + lede) fades up
     0.05–0.40 → labels fade out
     0.20–0.62 → circles travel from HORIZONTAL ROW → PYRAMID VENN
     0.55–0.92 → circles MERGE from pyramid → SINGLE centred ring
     0.40–0.70 → wordmark fades in
     0.62–1.00 → wordmark grows in scale
============================================================ */
.about-blend__stage {
  position: relative;
  width: min(94vmin, 980px);
  height: min(74vmin, 620px);
  margin: 0 auto;
  --blend-p: 0;
  --blend-merge: 0;
}

/* Three ringed circles. Two-stage transform:
     1. Linearly interpolate between row pos (sx0/sy0) and pyramid pos
        (sx1/sy1) via --blend-p (0 = row, 1 = pyramid Venn).
     2. Multiply the final offset by (1 - --blend-merge), so as merge
        climbs toward 1 the circle drifts back to the stage centre,
        leaving a single clean ring at the end. */
.about-blend__circle {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 56%;
  aspect-ratio: 1 / 1;
  border: 1px solid rgba(255,255,255,0.50);
  border-radius: 50%;
  transform: translate(-50%, -50%)
             translate(
               calc((var(--sx0) + (var(--sx1) - var(--sx0)) * var(--blend-p)) * (1 - var(--blend-merge))),
               calc((var(--sy0) + (var(--sy1) - var(--sy0)) * var(--blend-p)) * (1 - var(--blend-merge)))
             );
  display: flex;
  align-items: center;
  justify-content: center;
  will-change: transform;
}

/* Row positions (p=0) and pyramid Venn positions (p=1). Row spread
   wide enough so each circle's INNER half (where the label sits) is
   in the non-overlapping zone of its neighbour. ~32% overlap each
   pair, classic Venn look. */
.about-blend__circle--a {
  --sx0: -64%; --sy0: 0%;
  --sx1: -22%; --sy1: 14%;
}
.about-blend__circle--b {
  --sx0:  0%;  --sy0: 0%;
  --sx1:  0%;  --sy1: -20%;
}
.about-blend__circle--c {
  --sx0:  64%; --sy0: 0%;
  --sx1:  22%; --sy1: 14%;
}

/* Discipline labels — biased toward the OUTER half of each circle so
   they sit in the non-overlapping crescent. Centred inside circle B
   (the middle one). IvyPresto Display Thin, NON-italic. */
.about-blend__label {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-style: normal;
  font-size: clamp(1rem, 1.35vw, 1.25rem);
  line-height: 1.22;
  letter-spacing: -0.005em;
  color: rgba(255,255,255,0.92);
  text-align: center;
  max-width: 11ch;
  white-space: normal;
  opacity: calc(1 - var(--blend-label, 0));
  pointer-events: none;
  will-change: opacity;
}
/* Labels stay centred inside their own circle. The wider start spread
   (sx0 ±64%) means each circle is fully isolated at p=0 so no need to
   bias toward an outer crescent. */
.about-blend__circle--b .about-blend__label { transform: translateY(-4%); }

/* Centre wordmark — STACKED HoA SVG (white). Fades in 0.40→0.70
   (--blend-fade), then grows scale 0.55 → 1.45 across 0.62→1.00
   (--blend-grow). Final state = single centred ring + large wordmark. */
.about-blend__centre {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
  opacity: var(--blend-fade, 0);
  /* Larger start scale (0.7 instead of 0.55) and bigger end scale
     (1.95 instead of 1.45) so the wordmark begins clearly visible
     and finishes prominently. */
  transform: scale(calc(0.7 + 1.25 * var(--blend-grow, 0)));
  transform-origin: center center;
  will-change: transform, opacity;
}
.about-blend__wordmark {
  display: block;
  width: clamp(160px, 26vmin, 320px);
  height: auto;
  user-select: none;
  -webkit-user-drag: none;
}

@media (max-width: 720px) {
  .about-blend__rail { height: 480vh; }
  .about-blend__stage {
    width: min(96vmin, 540px);
    height: min(74vmin, 420px);
  }
  .about-blend__circle { width: 64%; }
  .about-blend__circle--a { --sx0: -36%; --sy0: 0%; --sx1: -16%; --sy1: 12%; }
  .about-blend__circle--b { --sx0:  0%;  --sy0: 0%; --sx1:  0%;  --sy1: -18%; }
  .about-blend__circle--c { --sx0:  36%; --sy0: 0%; --sx1:  16%; --sy1: 12%; }
  .about-blend__label { font-size: 0.9375rem; max-width: 9ch; }
  .about-blend__wordmark { width: clamp(110px, 28vmin, 200px); }
}

/* ---- WORLDWIDE CTA — final invitation (LIGHT paper) ---- */
.about-worldwide {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, 10rem);
}
.about-worldwide__inner {
  max-width: 52ch;
  margin-inline: auto;
  text-align: center;
  display: grid;
  gap: clamp(var(--space-5), 4vw, var(--space-6));
}
.about-worldwide__inner .eyebrow { color: rgba(10,10,10,0.58); margin: 0 auto; }
.about-worldwide__inner h2 {
  font-size: clamp(2.25rem, 4.4vw, 3.75rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0;
}
.about-worldwide__inner h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }
.about-worldwide__lede {
  margin: 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.7);
}
.about-worldwide__ctas {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(var(--space-5), 3vw, var(--space-6));
  margin-top: var(--space-3);
}
.about-worldwide__note {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.5);
  margin: 0;
}

/* Legacy stats grid (unused on index, kept in case ported elsewhere) */
.about__stats-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-7);
}
.about__stat {
  display: grid;
  gap: var(--space-4);
  padding-top: var(--space-6);
  border-top: 1px solid rgba(255,255,255,0.12);
}
.about__stat-num {
  font-family: var(--font-display);
  font-size: clamp(3rem, 6vw, 5rem);
  font-weight: var(--fw-thin);                /* IvyPresto Display Thin — matches old Counter */
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.about__stat-label {
  /* Gotham Light — explanation sentence, muted white so it reads softer
     than the main label above. */
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-light);
  line-height: 1.5;
  color: rgba(255,255,255,0.48);
}
.about__stat-label strong {
  display: block;
  font-family: var(--font-body);
  font-weight: var(--fw-regular);               /* Gotham Book — 400, white */
  color: var(--color-text-invert);
  margin-bottom: var(--space-1);
}

@media (max-width: 840px) {
  .about__stats-grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-6); }
}

/* Our values — horizontal inline row (no wrap on desktop) */
.values {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: nowrap;
  gap: clamp(var(--space-4), 2.5vw, var(--space-6));
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.values li {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  white-space: nowrap;
}
.values__star {
  width: 12px;
  height: 12px;
  color: var(--color-text);
  flex: 0 0 auto;
}

@media (max-width: 840px) {
  .values { flex-wrap: wrap; }
}

/* Media stack — two portrait founder cards layered one over the other, with
   rounded corners (constantoyannis-style). Card A sits back-left with a slight
   counter-rotation; Card B sits forward-right. Subtle hover parallax pushes
   them apart; scroll-linked tilt keeps them alive on entry. */
.about__media {
  position: relative;
  min-height: clamp(440px, 52vw, 600px);
  perspective: 1400px;
  /* Let the grid stretch this column to match the left column's height —
     the cards below are height-based so they rescale with the container,
     keeping the overlap visually consistent at any page height. */
  align-self: stretch;
}
.about__card {
  position: absolute;
  margin: 0;
  overflow: hidden;
  background: #151515;
  border-radius: 0;            /* sharp corners — no rounding */
  box-shadow:
    0 30px 60px -20px rgba(0,0,0,0.55),
    0 8px 24px -12px rgba(0,0,0,0.4);
  transition: transform 900ms cubic-bezier(0.22, 0.8, 0.24, 1);
  will-change: transform;
}
.about__card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1);
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1);
}

/* Card sizing — height-based so both cards scale with the container.
   Each card at 56% height shows ~3/4 of its photo with a gentle overlap.
   POSITIONS: Card A pushed to the LEFT edge (2%), Card B pushed to the
   RIGHT edge (2%) — the diagonal pair with a clear side split, as it was
   before the centring experiment. */
.about__card--a {
  top: 0;
  left: 2%;
  height: 56%;
  aspect-ratio: 3 / 4;
  width: auto;
  z-index: 1;
  transform: rotate(-3deg) translateY(0);
}
.about__card--b {
  bottom: 0;
  right: 2%;
  height: 56%;
  aspect-ratio: 3 / 4;
  width: auto;
  z-index: 2;
  transform: rotate(2deg) translateY(0);
}
/* Hover parallax — pushes the two cards apart diagonally + lifts each */
.about__media:hover .about__card--a {
  transform: rotate(-5deg) translate(-10px, -6px);
}
.about__media:hover .about__card--b {
  transform: rotate(3deg) translate(10px, 6px);
}
.about__card:hover img { transform: scale(1.04); }

@media (max-width: 840px) {
  .about__grid { grid-template-columns: 1fr; }
  .about__media { min-height: 520px; align-self: auto; }
  /* On single-column stack, revert cards to width-based so they fill the
     narrow phone viewport predictably. */
  .about__card--a, .about__card--b {
    height: auto;
    width: 70%;
    aspect-ratio: 3 / 4;
  }
  .about__card--a { top: 0; }
  .about__card--b { bottom: 0; }
}

/* Card image cover + hover (work + post) */
.work-card__frame img,
.post__frame img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--motion-slow) var(--motion-ease);
}
.work-card:hover .work-card__frame img,
.post:hover .post__frame img {
  transform: scale(1.02);
}

/* ---------- Counter — DARK, inline with About/Services band ---------- */
.counter {
  background: var(--color-ink);
  color: var(--color-text-invert);
  /* no top border — About flows straight into Counter without a seam */
}
.counter .eyebrow { color: rgba(255,255,255,0.55); }
.counter__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-7);
}
.counter__cell {
  display: grid;
  gap: var(--space-4);
  padding-top: var(--space-6);
  border-top: 1px solid rgba(255,255,255,0.12);
}
.counter__num {
  font-family: var(--font-display);
  font-size: clamp(3rem, 6vw, 5rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.counter__label { font-size: var(--fs-sm); color: rgba(255,255,255,0.6); line-height: 1.5; }
.counter__label strong { display: block; color: var(--color-text-invert); font-weight: 500; margin-bottom: var(--space-1); }
@media (max-width: 840px) {
  .counter__grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-6); }
}

/* ---------- Case Studies — WHITE band, cards on subtle off-white fill ---------- */
.case-studies {
  background: #ffffff;
  color: var(--color-text);
  padding-block: clamp(var(--space-10), 11vw, var(--space-12));
}
.case-studies .eyebrow { color: var(--color-text-muted); }
.case-studies__heading { color: var(--color-text); }
.case-studies .section__head p { color: var(--color-text-muted); }

/* Head — centred, title on top, hairline divider, description underneath */
.case-studies__head {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  max-width: 60ch;
  margin-inline: auto;
}
.case-studies__heading {
  margin: 0;
  max-width: 22ch;
  text-wrap: balance;
}
.case-studies__rule {
  display: block;
  width: 56px;
  height: 1px;
  background: rgba(0,0,0,0.32);
  margin-top: var(--space-3);
}
.case-studies__lede {
  margin: 0;
  max-width: 56ch;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: var(--color-text-muted);
}

/* Case studies carousel track — 3 visible at desktop, 2 at tablet, 1 at mobile */
.case-studies__carousel {
  margin-top: clamp(var(--space-7), 5vw, var(--space-9));
  position: relative;
  padding-inline: clamp(0px, 5vw, 64px);                /* leaves room for the side arrows */
}
.case-studies__grid {
  display: flex;
  gap: clamp(var(--space-5), 2.5vw, var(--space-7));
  padding-bottom: 4px;
}
.case-studies__grid > * {
  flex: 0 0 calc((100% - 2 * clamp(var(--space-5), 2.5vw, var(--space-7))) / 3);
  min-width: 0;
  scroll-snap-align: start;
}
@media (max-width: 1024px) {
  .case-studies__grid > * { flex-basis: calc((100% - 1 * clamp(var(--space-5), 2.5vw, var(--space-7))) / 2); }
}
@media (max-width: 720px) {
  .case-studies__grid > * { flex-basis: 86%; }
}

/* Side arrows — plain stroke glyphs (no box, no border), larger + bolder so
   they read cleanly without feeling like buttons. */
.cs-arrow--side {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 48px; height: 48px;
  display: grid; place-items: center;
  background: transparent;
  border: 0;
  color: var(--color-text);
  cursor: pointer;
  opacity: 0.7;                              /* from 0.38 — readable without yelling */
  padding: 0;
  border-radius: 0;
  z-index: 2;
  transition: opacity 300ms var(--motion-ease), transform 320ms var(--motion-ease);
}
.cs-arrow--side:hover { opacity: 1; }
.cs-arrow--left  { left: 0; }
.cs-arrow--right { right: 0; }
.cs-arrow--left:hover  { transform: translate(-3px, -50%); }
.cs-arrow--right:hover { transform: translate(3px, -50%); }
.cs-arrow svg { display: block; }
.case-studies__carousel .cs-arrow.is-disabled,
.case-studies__carousel .cs-arrow:disabled { opacity: 0.4; pointer-events: auto; }
@media (max-width: 640px) {
  .case-studies__carousel { padding-inline: 0; }
  .cs-arrow--side { position: static; transform: none; width: 40px; height: 40px; }
}

.case-card {
  display: flex;
  flex-direction: column;
  background: #ffffff;
  border: 1px solid rgba(0,0,0,0.08);
  overflow: hidden;
  position: relative;
  transition: border-color 500ms var(--motion-ease),
              background-color 500ms var(--motion-ease);
}
/* Artistic hover — no shadow, no lift. Instead:
   1. Two hairline rules that draw in from opposite corners (editorial feel)
   2. A diagonal light-sweep that travels across the image once
   3. Subtle image zoom + soft warm bg shift on the card body
   Each motion overlaps in phase so the whole card feels composed, not animated. */
.case-card::before,
.case-card::after {
  content: "";
  position: absolute;
  height: 1px;
  background: var(--color-text);
  transform: scaleX(0);
  transition: transform 640ms cubic-bezier(0.22, 0.8, 0.24, 1);
  z-index: 2;
  pointer-events: none;
}
.case-card::before {
  top: 0; left: 0; right: 0;
  transform-origin: left;
}
.case-card::after {
  bottom: 0; left: 0; right: 0;
  transform-origin: right;
}
.case-card:hover {
  border-color: rgba(0,0,0,0.16);
  background-color: #f2f2f2;
}
.case-card:hover::before,
.case-card:hover::after { transform: scaleX(1); }

/* Image at the top of each card — 4:3 crop with a slow zoom + diagonal light sweep */
.case-card__media {
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--color-paper-soft);
  position: relative;
}
.case-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1);
  filter: brightness(0.96);
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1),
              filter 700ms var(--motion-ease);
}
.case-card:hover .case-card__media img {
  transform: scale(1.04);
  filter: brightness(1.02);
}

/* Subtle scrim — bottom-weighted dark gradient over the image so the meta
   overlay (date + tag) reads cleanly regardless of the photo's brightness. */
.case-card__media::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 42%;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.58) 0%, rgba(0, 0, 0, 0) 100%);
  pointer-events: none;
  z-index: 1;
}

/* Meta overlay — date on the left, tag on the right. Sits ON the image
   bottom, riding the scrim gradient. White text in the standard meta
   typography (Gotham Light uppercase, tight letter-spacing). */
.case-card__meta-overlay {
  position: absolute;
  bottom: 14px;
  left: 16px;
  right: 16px;
  z-index: 2;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  color: #ffffff;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  pointer-events: none;
}
.case-card__meta-overlay .case-card__date,
.case-card__meta-overlay .case-card__tag {
  color: #ffffff;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Premium badge — inspired by the fluid.glass pill. Dark chip in the top-
   right corner of the media, #star-4 glyph + uppercase label. Sits on top
   of the image via z-index, backdrop-blur for legibility over any photo. */
.case-card__badge {
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 7px 11px;
  background: rgba(10, 10, 10, 0.82);
  color: #ffffff;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  pointer-events: none;                        /* badge is decorative — click goes to the media link */
}
.case-card__badge-icon {
  width: 11px;
  height: 11px;
  flex: 0 0 auto;
  color: currentColor;
}
.case-card__badge-label {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-medium, 500);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  line-height: 1;
}

.case-card__body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-4), 1.8vw, var(--space-5));
  padding: clamp(var(--space-5), 2.4vw, var(--space-6)) clamp(var(--space-5), 2.6vw, var(--space-6));
  flex: 1;
}
.case-card__meta {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.case-card__date { white-space: nowrap; }       /* 2025 – 2026 stays on one line */
.case-card__tag  { white-space: nowrap; }
.case-card__tag { color: var(--color-text); }
.case-card__name {
  font-family: var(--font-display);
  font-size: clamp(1.5rem, 2vw, 1.75rem);
  font-weight: var(--fw-thin);
  line-height: 1.1;
  letter-spacing: -0.01em;
  color: var(--color-text);
  margin: 0;
}
.case-card__loc {
  font-style: italic;
  color: var(--color-text-muted);
}
/* Title group — name stacked above a one-line explanation. Slight gap so
   the subtitle reads as a distinct descriptor line, not a kerning tail of
   the title above. */
.case-card__title {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
}
.case-card__sub {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  line-height: 1.4;
  color: var(--color-text-muted);
  letter-spacing: 0;
}

/* 3-column stats — minmax(0, 1fr) lets columns shrink below their content
   width so a long value (e.g. €6.8M+) doesn't push the grid sideways. Each
   number is nowrap so it never breaks under its neighbour. */
.case-card__stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(var(--space-2), 1vw, var(--space-3));
  padding-block: clamp(var(--space-4), 2vw, var(--space-5));
  border-top: 1px solid rgba(0,0,0,0.08);
  border-bottom: 1px solid rgba(0,0,0,0.08);
}
/* Stacked stat: big number on top, short bold label on a single line below.
   Labels are deliberately 1 word / abbreviation (CPL, Leads, Signed, etc.)
   so they fit in the narrow card column without wrapping to 2 lines. */
.case-card__stats > div {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
  overflow: hidden;
}
.case-card__num {
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 2vw, 1.625rem);
  font-weight: var(--fw-thin);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.case-card__label {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-medium, 500);           /* bolder so the short label holds its own */
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: clip;
  line-height: 1;
}

.case-card__production {
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: var(--color-text-muted);
}
.case-card__kicker {
  /* Gotham Light — reads as a clean factual one-liner, not a display pull-quote.
     Carries the descriptive "what the number means" sentence underneath stats. */
  font-family: var(--font-body);
  font-style: normal;
  font-weight: var(--fw-light);
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--color-text);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(0,0,0,0.08);
  margin-top: auto;
}

/* "Read more" CTA inside each case card — small inline link with the site's
   standard NE-arrow glyph. Hover animates the arrow (same vocabulary as
   featured__read / btn-ct arrows). */
.case-card__readmore {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  align-self: flex-start;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-medium, 500);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text);
  text-decoration: none;
  padding-top: var(--space-2);
  transition: color 320ms var(--motion-ease);
}
.case-card__readmore svg {
  width: 12px;
  height: 12px;
  flex: 0 0 auto;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.case-card__readmore:hover { color: var(--color-text-muted); }
.case-card__readmore:hover svg { transform: translate(3px, -3px); }

/* Foot — centred column: quiet proof-line then CTA button, no divider line */
.case-studies__foot {
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-5), 3vw, var(--space-6));
  text-align: center;
}
.case-studies__proof {
  margin: 0;
  max-width: 52ch;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 18px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  border: 1px solid rgba(0,0,0,0.08);
  border-radius: 999px;
  background: #ffffff;
}
.case-studies__proof svg { width: 9px; height: 9px; color: var(--color-text-muted); flex: 0 0 auto; }
.case-studies__proof em {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  text-transform: none;
  letter-spacing: -0.005em;
  color: var(--color-text);
  font-size: 0.9375rem;
  margin-inline: 2px;
}
.case-studies__cta {
  display: flex;
  justify-content: center;
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
}
.case-studies__cta .btn-ct--quiet {
  color: rgba(10,10,10,0.72);
  border-color: rgba(10,10,10,0.12);
}
.case-studies__cta .btn-ct--quiet:hover {
  color: var(--color-text);
  border-color: rgba(10,10,10,0.32);
}
.case-studies__cta .btn-ct--quiet::before {
  background: conic-gradient(
    from var(--run-angle),
    rgba(10,10,10,0) 0%,
    rgba(10,10,10,0.4) 6%,
    rgba(10,10,10,0) 18%,
    rgba(10,10,10,0) 100%
  );
}

/* ---------- Approach — 7-step vertical roadmap (DARK) ---------- */
.approach {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-top: 1px solid rgba(255,255,255,0.12);
}
.approach .eyebrow { color: rgba(255,255,255,0.55); }
.approach .display { color: var(--color-text-invert); }
.approach .muted { color: rgba(255,255,255,0.62) !important; }

.roadmap {
  list-style: none;
  margin: 0;
  padding: 0;
  margin-top: var(--space-7);
  position: relative;
}
/* Vertical thread connecting the numbers — sits behind each step */
.roadmap::before {
  content: "";
  position: absolute;
  left: 22px;                                       /* aligns with centre of circle */
  top: 12px;
  bottom: 12px;
  width: 1px;
  background: linear-gradient(to bottom, rgba(255,255,255,0.1), rgba(255,255,255,0.25), rgba(255,255,255,0.05));
}
.roadmap__step {
  display: grid;
  grid-template-columns: 44px 1fr;
  gap: clamp(var(--space-5), 3vw, var(--space-8));
  padding-block: clamp(var(--space-5), 2.6vw, var(--space-7));
  border-bottom: 1px solid rgba(255,255,255,0.08);
  position: relative;
}
.roadmap__step:last-child { border-bottom: 0; }
.roadmap__num {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
  width: 44px; height: 44px;
  display: grid;
  place-items: center;
  border: 1px solid rgba(255,255,255,0.25);
  background: var(--color-ink);                     /* covers the thread line */
  z-index: 1;
}
.roadmap__body { display: flex; flex-direction: column; gap: var(--space-2); max-width: 64ch; }
.roadmap__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.375rem, 2.4vw, 1.875rem);
  letter-spacing: -0.01em;
  line-height: 1.1;
  color: var(--color-text-invert);
}
.roadmap__desc {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(255,255,255,0.68);
}

/* ---------- Approach v6 — horizontal scroll-pinned process ---------- */
/* Pin duration — user scrolls through this vertical distance to advance all 7 steps.
   Formula: (steps - visible) × step-scroll-multiplier. With ~7 steps and each taking
   about ~80vh of scroll feel, total ≈ 520vh including a lead-in. */
.approach--hscroll {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: 0;
  border-top: 1px solid rgba(255,255,255,0.08);
  border-bottom: 1px solid rgba(255,255,255,0.08);
}

/* Approach unlock — sits as its own band on the dark canvas right after
   the seven-step process pin releases. Eyebrow + title + lede + glass CTA. */
.approach-unlock {
  background: var(--color-ink, #0a0a0a);
  color: var(--color-text-invert);
  padding: clamp(80px, 10vw, 144px) 0 clamp(96px, 11vw, 160px);
  text-align: center;
  border-top: 1px solid rgba(255,255,255,0.06);
  border-bottom: 1px solid rgba(255,255,255,0.06);
}
.approach-unlock__inner {
  max-width: 56ch;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-3), 2vw, var(--space-4));
}
.approach-unlock__eyebrow {
  color: rgba(255,255,255,0.6);
  justify-content: center;
}
.approach-unlock__title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(2rem, 4vw, 3.25rem);
  line-height: 1.06;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--color-text-invert);
}
.approach-unlock__title em {
  font-style: italic;
  font-weight: var(--fw-thin, 100);
  color: rgba(255,255,255,0.6);
}
.approach-unlock__lede {
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(255,255,255,0.62);
  margin: 0;
  max-width: 52ch;
}
.approach-unlock__cta { margin-top: clamp(var(--space-3), 2vw, var(--space-4)); }

.approach-pin {
  position: relative;
  /* 7 slides total (no outro now — CTA lives in the .approach-unlock section
     directly below). End state shows steps 06 and 07 side by side. */
  height: 640vh;
  /* Explicit dark fill so the empty area below the sticky stage cannot
     reveal the page's paper body background as the pin releases. */
  background: var(--color-ink, #0a0a0a);
}
.approach.approach--hscroll + .approach-unlock {
  /* Hairline separator removed when the unlock band sits directly under
     the dark pin so the two read as one continuous black stretch. */
  border-top: 0;
}
.approach-pin__stage {
  position: sticky;
  top: 0;
  height: 100vh;
  display: grid;
  grid-template-rows: auto auto 1fr;
  overflow: hidden;
  padding-block: 48px 48px;
}
.approach-pin__progress {
  position: relative;
}
.approach-pin__progress-head {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--space-5);
  margin-bottom: 14px;
}
.approach-pin__progress-label {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.72);
}
.approach-pin__progress-label svg {
  width: 10px; height: 10px;
  color: rgba(255,255,255,0.55);
}
.approach-pin__phases {
  display: flex;
  justify-content: space-between;
  max-width: 640px;
  margin-inline: auto;
  width: 100%;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: 0.8125rem;
  letter-spacing: -0.005em;
  color: rgba(255,255,255,0.38);
}
.approach-pin__phases span { transition: color 320ms var(--motion-ease); }
.approach-pin__phases span[data-phase-active] { color: rgba(255,255,255,0.92); }
.approach-pin__progress-counter {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: var(--fw-thin, 100);
  font-size: 1.125rem;
  letter-spacing: -0.005em;
  color: rgba(255,255,255,0.85);
  font-variant-numeric: tabular-nums;
  display: inline-flex;
  gap: 6px;
  align-items: baseline;
  margin-left: auto;
}
.approach-pin__progress-counter em {
  color: rgba(255,255,255,0.38);
  font-style: normal;
  font-weight: var(--fw-light);
}
.approach-pin__progress-bar {
  position: relative;
  height: 1px;
  background: rgba(255,255,255,0.15);
}
.approach-pin__progress-fill {
  position: absolute;
  inset: 0;
  background: #fff;
  transform-origin: left;
  transform: scaleX(var(--hscroll-progress, 0));
  will-change: transform;
}
/* Vertical tick marks at phase boundaries */
.approach-pin__progress-tick {
  position: absolute;
  top: -3px;
  bottom: -3px;
  width: 1px;
  background: rgba(255,255,255,0.55);
  transform: translateX(-0.5px);
}
.approach-pin__head {
  padding-block: clamp(20px, 3vw, 36px);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}
.approach-pin__headline {
  margin: 0;
  color: var(--color-text-invert);
  max-width: 22ch;
  font-size: clamp(2rem, 3.4vw, 2.75rem);
}
.approach-pin__headline em { color: rgba(255,255,255,0.6); font-style: italic; }

/* Scroll-right cue under the pin headline. Subtle horizontal arrow with
   a hairline rule, gently nudging right on a long, slow loop so the
   user reads it as "scroll the rail" not "click here". */
.approach-pin__scroll-cue {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: clamp(10px, 1.4vw, 18px);
  color: rgba(255,255,255,0.55);
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  pointer-events: none;
  animation: approach-pin-cue-nudge 2.4s ease-in-out infinite;
}
.approach-pin__scroll-cue-line {
  display: inline-block;
  width: 36px;
  height: 1px;
  background: rgba(255,255,255,0.35);
}
.approach-pin__scroll-cue svg { color: rgba(255,255,255,0.65); }
@keyframes approach-pin-cue-nudge {
  0%, 100% { transform: translateX(0); opacity: 0.7; }
  50%      { transform: translateX(6px); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .approach-pin__scroll-cue { animation: none; }
}

.approach-pin__rail {
  position: relative;
  overflow: hidden;                                 /* hides track translate overflow */
  align-self: stretch;
  display: flex;
  align-items: center;
}
.approach-pin__track {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  align-items: center;
  height: 100%;
  /* 7 slides × 50vw each. (7 × 50) − 100 viewport = 250 translate range,
     so the final two slides sit side by side at the end state. */
  transform: translate3d(calc(var(--hscroll-progress, 0) * -250vw), 0, 0);
  will-change: transform;
  min-width: 350vw;
}

/* Approach-only modifier — approach.html still has 8 step slides for now
   (will be synced to 7 in a later pass alongside the analytical copy). */
.approach--hscroll-8 .approach-pin {
  height: 600vh;
}
.approach--hscroll-8 .approach-pin__track {
  transform: translate3d(calc(var(--hscroll-progress, 0) * -300vw), 0, 0);
  min-width: 400vw;
}
.hstep {
  position: relative;
  flex: 0 0 50vw;
  padding-inline: clamp(40px, 6vw, 100px);
  border-left: 1px solid rgba(255,255,255,0.1);
  height: 100%;
  display: flex;
  align-items: center;
  min-width: 0;
  overflow: hidden;
  transition: opacity 420ms var(--motion-ease);
  opacity: 0.62;
}
.hstep:first-child { border-left: 0; }
.hstep[data-hstep-active] { opacity: 1; }

.hstep__content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  max-width: 42ch;
}

/* Crown — phase label, then a hairline rule, then the step number on one horizontal row.
   Replaces the old ghost+numeral combo so the same digit never repeats on screen. */
.hstep__crown {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: var(--space-2);
}
.hstep__phase {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.72);
  white-space: nowrap;
}
.hstep__phase svg {
  width: 9px; height: 9px;
  color: rgba(255,255,255,0.55);
  flex: 0 0 auto;
}
.hstep__rule {
  flex: 1 1 auto;
  height: 1px;
  background: rgba(255,255,255,0.18);
  max-width: 80px;
}
/* Big ghost step number — positioned absolutely on the right side of each step,
   very transparent, acts as a typographic watermark. Replaces the old small
   crown-row number (same element, escapes the crown flow via position:absolute). */
.hstep__num {
  position: absolute;
  top: 4%;
  right: clamp(24px, 3.5vw, 72px);
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-style: italic;
  font-size: clamp(10rem, 20vw, 22rem);
  line-height: 0.85;
  letter-spacing: -0.04em;
  color: rgba(255,255,255,0.06);
  font-variant-numeric: tabular-nums;
  pointer-events: none;
  z-index: 0;
  transition: color 420ms var(--motion-ease);
}
.hstep__content { position: relative; z-index: 1; }
.hstep[data-hstep-active] .hstep__num { color: rgba(255,255,255,0.09); }

/* Outro slide — final horizontal-scroll slide, unnumbered, prominent CTA */
.hstep.hstep--outro {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.hstep__content--outro {
  max-width: 54ch;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
}
.hstep__outro-title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(1.75rem, 3.2vw, 2.625rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  color: var(--color-text-invert, #fff);
  margin: 0;
  text-wrap: balance;
}
.hstep__outro-desc {
  font-family: var(--font-body);
  font-weight: var(--fw-light, 300);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  color: rgba(255,255,255,0.72);
  margin: 0;
  max-width: 48ch;
  text-wrap: balance;
}
.hstep__outro-cta { margin-top: clamp(var(--space-3), 1.6vw, var(--space-4)); }
.hstep__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.05;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
}
.hstep__desc {
  margin: 0;
  max-width: 42ch;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(255,255,255,0.72);
}
/* Deliverables — 3 small items with a leading ✦ */
.hstep__deliverables {
  list-style: none;
  margin: var(--space-3) 0 0;
  padding: var(--space-3) 0 0;
  border-top: 1px solid rgba(255,255,255,0.1);
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.hstep__deliverables li {
  position: relative;
  padding-left: 18px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.72);
}
.hstep__deliverables li::before {
  content: "";
  position: absolute;
  left: 0; top: 50%;
  width: 8px; height: 1px;
  background: rgba(255,255,255,0.55);
}
/* Pace — small timing indicator at the foot of each step card */
.hstep__pace {
  margin-top: var(--space-5);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(255,255,255,0.08);
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.4);
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.hstep__pace em {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: 0.9375rem;
  letter-spacing: -0.005em;
  color: rgba(255,255,255,0.85);
  text-transform: none;
}

/* CTA on the last process step — invites the reader into the full Approach
   page. Uppercase link + NE arrow, standard motion vocabulary. */
.hstep__cta {
  margin-top: var(--space-5);
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding-top: var(--space-3);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-medium, 500);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-invert);
  text-decoration: none;
  transition: color 320ms var(--motion-ease);
}
.hstep__cta svg {
  width: 12px; height: 12px;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.hstep__cta:hover { color: rgba(255,255,255,0.72); }
.hstep__cta:hover svg { transform: translate(3px, -3px); }

/* Mobile / tablet — disable the pin + horizontal scroll, use a vertical list */
@media (max-width: 900px) {
  .approach-pin { height: auto; }
  .approach-pin__stage {
    position: static;
    height: auto;
    display: block;
    padding-block: clamp(48px, 8vw, 80px);
    overflow: visible;
  }
  .approach-pin__progress { display: none; }
  .approach-pin__rail { overflow: visible; }
  .approach-pin__track {
    flex-direction: column;
    transform: none;
    min-width: 0;
    gap: var(--space-6);
    margin-top: clamp(32px, 5vw, 48px);
  }
  .hstep {
    flex: 1 1 auto;
    border-left: 0;
    border-top: 1px solid rgba(255,255,255,0.1);
    padding: clamp(24px, 4vw, 32px) 0 0;
    height: auto;
    opacity: 1;
    overflow: visible;
  }
  .hstep:first-child { border-top: 0; padding-top: 0; }
  .hstep__content { max-width: 56ch; }
}

/* ---------- Approach v5 — compact centred roadmap (deprecated, kept for safety) ---------- */
.approach--compact {
  padding-block: clamp(var(--space-7), 5vw, var(--space-8));
}
.approach__head {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-4);
  max-width: 54ch;
  margin-inline: auto;
  margin-bottom: clamp(var(--space-6), 4vw, var(--space-8));
}
.approach__headline {
  margin: 0;
  color: var(--color-text-invert);
  max-width: 24ch;
  font-size: clamp(2.25rem, 4vw, 3.25rem);          /* bigger per brief */
  line-height: 1.05;
}
.approach__headline em { color: rgba(255,255,255,0.72); font-style: italic; }
.approach__lede {
  margin: 0;
  max-width: 54ch;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(255,255,255,0.72);
}

.roadmap-min {
  list-style: none;
  margin: clamp(var(--space-6), 4vw, var(--space-8)) 0 clamp(var(--space-5), 3vw, var(--space-7));
  padding: 0;
  position: relative;
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  column-gap: clamp(4px, 0.5vw, 10px);
  min-height: clamp(200px, 20vw, 260px);         /* slimmer than before — titles are shorter */
  align-items: center;
}
/* Single thin line running through all seven stations — the road */
.roadmap-min::before {
  content: "";
  position: absolute;
  top: 50%;
  left: calc(100% / 14);                             /* pad in to the first dot centre */
  right: calc(100% / 14);                            /* pad in from the last dot centre */
  height: 1px;
  background: linear-gradient(90deg,
    rgba(255,255,255,0.05) 0%,
    rgba(255,255,255,0.35) 12%,
    rgba(255,255,255,0.35) 88%,
    rgba(255,255,255,0.05) 100%
  );
  transform: translateY(-0.5px);
}
.roadmap-min__stop {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.roadmap-min__dot {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 10px; height: 10px;
  border-radius: 50%;
  background: var(--color-ink);
  border: 1px solid rgba(255,255,255,0.7);
  transition: transform 420ms var(--motion-ease), border-color 420ms var(--motion-ease), box-shadow 420ms var(--motion-ease);
  z-index: 1;
}
.roadmap-min__stop:hover .roadmap-min__dot {
  transform: translate(-50%, -50%) scale(1.25);
  border-color: #fff;
  box-shadow: 0 0 0 6px rgba(255,255,255,0.06), 0 0 20px rgba(255,255,255,0.18);
}
.roadmap-min__label {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
  width: min(22ch, 100%);
  padding-inline: 4px;
}
/* Stations alternate above and below the line */
.roadmap-min__stop[data-pos="top"]    .roadmap-min__label { bottom: calc(50% + 28px); }
.roadmap-min__stop[data-pos="bottom"] .roadmap-min__label { top: calc(50% + 28px); }

.roadmap-min__num {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.28em;
  color: rgba(255,255,255,0.55);
  font-variant-numeric: tabular-nums;
}
.roadmap-min__title {
  margin: 4px 0 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.125rem, 1.7vw, 1.5rem);      /* bigger per brief */
  line-height: 1.1;
  letter-spacing: -0.005em;
  color: var(--color-text-invert);
}

/* Mobile / tablet — collapse to a vertical line with stops on alternating sides */
@media (max-width: 900px) {
  .roadmap-min {
    grid-template-columns: 1fr;
    row-gap: clamp(40px, 6vw, 64px);
    margin-block: clamp(48px, 8vw, 80px);
    min-height: 0;
    padding-left: 24px;
  }
  .roadmap-min::before {
    left: 24px;
    right: auto;
    top: 24px; bottom: 24px;
    width: 1px;
    height: auto;
    background: linear-gradient(180deg,
      rgba(255,255,255,0.05) 0%,
      rgba(255,255,255,0.35) 10%,
      rgba(255,255,255,0.35) 90%,
      rgba(255,255,255,0.05) 100%
    );
  }
  .roadmap-min__stop { align-items: flex-start; }
  .roadmap-min__dot { left: 24px; top: 14px; transform: none; }
  .roadmap-min__label,
  .roadmap-min__stop[data-pos="top"] .roadmap-min__label,
  .roadmap-min__stop[data-pos="bottom"] .roadmap-min__label {
    position: static;
    transform: none;
    align-items: flex-start;
    text-align: left;
    padding: 0 0 0 56px;
    width: 100%;
    max-width: 48ch;
  }
  .roadmap-min__desc { max-width: 40ch; }
}

/* Worldwide closer — centred, globe is the hero visual */
.approach__worldwide {
  margin-top: clamp(var(--space-9), 9vw, var(--space-11));
  padding-top: clamp(var(--space-7), 5vw, var(--space-9));
  border-top: 1px solid rgba(255,255,255,0.1);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}
.approach__worldwide-head {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  text-align: center;
}
.approach__worldwide-title {
  margin: 0;
  color: var(--color-text-invert);
  max-width: 18ch;
  text-align: center;
}
.approach__worldwide-title em { color: rgba(255,255,255,0.55); font-style: italic; }
.approach__worldwide-globe {
  position: relative;
  width: 100%;
  max-width: clamp(320px, 46vw, 520px);
  aspect-ratio: 1 / 1;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.approach__worldwide-globe.is-grabbing { cursor: grabbing; }
.approach__worldwide-globe .globe-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
.approach__worldwide-hint {
  position: absolute;
  bottom: 10px; left: 10px;
  padding: 4px 10px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
  background: rgba(10,10,10,0.4);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255,255,255,0.12);
  pointer-events: none;
}
.approach__worldwide-meta {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(var(--space-6), 5vw, var(--space-8));
  padding-top: var(--space-4);
  border-top: 1px solid rgba(255,255,255,0.08);
  width: 100%;
  max-width: 520px;
}
.approach__worldwide-meta li {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
}
.approach__worldwide-meta span {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.25rem, 2vw, 1.625rem);
  line-height: 1;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.approach__worldwide-meta em {
  font-family: var(--font-body);
  font-style: normal;
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.4);
}

/* ---------- Approach v3 — DEPRECATED (vertical steps + sticky aside) ---------- */
.approach__grid {
  margin-top: clamp(var(--space-8), 8vw, var(--space-10));
  display: grid;
  grid-template-columns: 1.35fr 1fr;
  gap: clamp(var(--space-7), 6vw, var(--space-10));
  align-items: start;
}
.approach__steps {
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}
/* Vertical thread line running through the icon centres */
.approach__steps::before {
  content: "";
  position: absolute;
  left: 22px;
  top: 14px;
  bottom: 14px;
  width: 1px;
  background: linear-gradient(
    180deg,
    transparent 0%,
    rgba(255,255,255,0.25) 15%,
    rgba(255,255,255,0.18) 85%,
    transparent 100%
  );
  z-index: 0;
}
.approach__step {
  display: grid;
  grid-template-columns: 44px 1fr;
  gap: clamp(var(--space-5), 2.6vw, var(--space-7));
  padding: clamp(var(--space-5), 2.2vw, var(--space-6)) 0;
  border-bottom: 1px solid rgba(255,255,255,0.08);
  position: relative;
}
.approach__step:last-child { border-bottom: 0; }
.approach__icon {
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border: 1px solid rgba(255,255,255,0.22);
  background: var(--color-ink);            /* covers the thread where it passes through */
  color: rgba(255,255,255,0.85);
  position: relative;
  z-index: 1;
  transition: border-color 420ms var(--motion-ease), color 420ms var(--motion-ease);
}
.approach__step:hover .approach__icon {
  border-color: rgba(255,255,255,0.55);
  color: #fff;
}
.approach__body {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: 56ch;
}
.approach__num {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.24em;
  color: rgba(255,255,255,0.42);
  font-variant-numeric: tabular-nums;
}
.approach__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.375rem, 2.2vw, 1.875rem);
  letter-spacing: -0.01em;
  line-height: 1.1;
  color: var(--color-text-invert);
}
.approach__desc {
  margin: 2px 0 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(255,255,255,0.6);
}

/* RIGHT aside: sticky globe + worldwide copy */
.approach__aside { position: relative; }
.approach__aside-sticky {
  position: sticky;
  top: clamp(80px, 12vh, 140px);
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}
.approach__globe-shell {
  position: relative;
  aspect-ratio: 1 / 1;
  width: 100%;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.approach__globe-shell.is-grabbing { cursor: grabbing; }
.approach__globe-shell .globe-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
.approach__globe-hint {
  position: absolute;
  bottom: 12px; left: 12px;
  padding: 4px 10px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
  background: rgba(10,10,10,0.4);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255,255,255,0.12);
  pointer-events: none;
}
.approach__aside-text {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.approach__aside-heading {
  margin: var(--space-2) 0 0;
  color: var(--color-text-invert);
  font-size: clamp(1.375rem, 2.3vw, 1.875rem);
  line-height: 1.1;
  max-width: 14ch;
}
.approach__aside-heading em { color: rgba(255,255,255,0.55); font-style: italic; }
.approach__aside-copy {
  margin: var(--space-2) 0 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(255,255,255,0.62);
}
.approach__aside-meta {
  list-style: none;
  margin: var(--space-3) 0 0;
  padding: var(--space-4) 0 0;
  border-top: 1px solid rgba(255,255,255,0.08);
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-4), 3vw, var(--space-6));
}
.approach__aside-meta li { display: flex; flex-direction: column; gap: 2px; }
.approach__aside-meta span {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: 1.5rem;
  line-height: 1;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.approach__aside-meta em {
  font-family: var(--font-body);
  font-style: normal;
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.4);
}

@media (max-width: 960px) {
  .approach__grid { grid-template-columns: 1fr; gap: var(--space-8); }
  .approach__aside-sticky { position: static; }
}

/* ---------- Approach v2 (horizontal flow) — DEPRECATED, kept for safety ---------- */
.approach-flow {
  list-style: none;
  margin: clamp(var(--space-7), 8vw, var(--space-9)) 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: clamp(12px, 1.4vw, 24px);
  position: relative;
}
/* Horizontal thread through the icon row — desktop only */
.approach-flow::before {
  content: "";
  position: absolute;
  top: 22px;                                      /* centre of 44px icon */
  left: calc(100% / 14);                           /* pad to centre of first icon */
  right: calc(100% / 14);
  height: 1px;
  background: linear-gradient(
    90deg,
    rgba(255,255,255,0.05) 0%,
    rgba(255,255,255,0.28) 50%,
    rgba(255,255,255,0.05) 100%
  );
  z-index: 0;
}
.approach-flow__step {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
  padding-right: 8px;
}
.approach-flow__icon {
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border: 1px solid rgba(255,255,255,0.22);
  background: var(--color-ink);                   /* covers the thread line */
  color: rgba(255,255,255,0.85);
  flex: 0 0 auto;
  transition: border-color 420ms var(--motion-ease), color 420ms var(--motion-ease);
}
.approach-flow__step:hover .approach-flow__icon {
  border-color: rgba(255,255,255,0.55);
  color: #fff;
}
.approach-flow__num {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.45);
  font-variant-numeric: tabular-nums;
  margin-top: 6px;
}
.approach-flow__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1rem, 1.3vw, 1.25rem);
  line-height: 1.15;
  letter-spacing: -0.005em;
  color: var(--color-text-invert);
}
.approach-flow__desc {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: rgba(255,255,255,0.55);
  max-width: 22ch;
}

@media (max-width: 1180px) {
  .approach-flow { grid-template-columns: repeat(4, 1fr); }
  .approach-flow::before { display: none; }
}
@media (max-width: 760px) {
  .approach-flow { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 440px) {
  .approach-flow { grid-template-columns: 1fr; }
}

/* ---------- Approach — Global reach sub-block with rotating globe ---------- */
.approach__global {
  margin-top: clamp(var(--space-9), 10vw, var(--space-11));
  padding-top: clamp(var(--space-7), 6vw, var(--space-9));
  border-top: 1px solid rgba(255,255,255,0.12);
  display: grid;
  grid-template-columns: 1fr 1.1fr;
  gap: clamp(var(--space-6), 5vw, var(--space-9));
  align-items: center;
}
.approach__global-text { display: flex; flex-direction: column; gap: var(--space-4); }
.approach__global-heading {
  margin: var(--space-3) 0 var(--space-2);
  color: var(--color-text-invert);
  max-width: 16ch;
}
.approach__global-heading em { color: rgba(255,255,255,0.55); font-style: italic; }
.approach__global-copy {
  margin: 0;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(255,255,255,0.7);
  max-width: 52ch;
}
.approach__global-meta {
  list-style: none;
  margin: var(--space-5) 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  border-top: 1px solid rgba(255,255,255,0.08);
  padding-top: var(--space-5);
}
.approach__global-meta li {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.approach__global-meta span {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  line-height: 1;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.approach__global-meta em {
  font-family: var(--font-body);
  font-style: normal;
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.45);
}
.approach__global-globe {
  position: relative;
  aspect-ratio: 1 / 1;
  width: 100%;
  max-width: 560px;
  justify-self: end;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.approach__global-globe.is-grabbing { cursor: grabbing; }
.approach__global-globe .globe-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
.approach__global-hint {
  position: absolute;
  bottom: 12px; left: 12px;
  padding: 4px 10px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
  background: rgba(10,10,10,0.4);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255,255,255,0.12);
  pointer-events: none;
}
@media (max-width: 960px) {
  .approach__global {
    grid-template-columns: 1fr;
  }
  .approach__global-globe { justify-self: center; max-width: 420px; }
}

/* ---------- Services (dark section, row list with hover reveal) ---------- */
.services {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-top: 1px solid rgba(255,255,255,0.12);   /* divider between Numbers and Services */
}
.services .eyebrow { color: var(--color-text-invert-muted); }
.services .display { color: var(--color-text-invert); }
.services .muted { color: var(--color-text-invert-muted); }

.service-list {
  display: flex;
  flex-direction: column;
  border-top: 1px solid rgba(255,255,255,0.18);
  border-bottom: 1px solid rgba(255,255,255,0.18);
}
.service-row {
  display: grid;
  grid-template-columns: 64px 1fr auto;
  align-items: flex-start;
  gap: var(--space-5);
  padding: clamp(var(--space-5), 3.5vw, var(--space-7)) var(--space-5);
  position: relative;
  overflow: hidden;
  color: var(--color-text-invert);
  transition: background-color 450ms var(--motion-ease);
}
.service-row + .service-row {
  border-top: 1px solid rgba(255,255,255,0.12);
}

/* Row hover — single unified "open" animation, no background tint so there
   is no perception of two hover events layering. */
.service-row { transition: none; }

/* Expanded detail — 2 short bullets, about-style editorial voice.
   Collapsed by default, opens on row hover via max-height + opacity + margin. */
.service-row__detail {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  margin-top: 0;
  transition: max-height 820ms cubic-bezier(0.22, 0.8, 0.24, 1),
              opacity 640ms var(--motion-ease),
              margin 700ms var(--motion-ease);
}
.service-row:hover .service-row__detail {
  max-height: 240px;
  opacity: 1;
  margin-top: var(--space-4);
}
.service-row__detail ul {
  list-style: none;
  margin: 0;
  padding: var(--space-4) 0 0;
  border-top: 1px solid rgba(255,255,255,0.08);
  display: grid;
  gap: var(--space-2);
  max-width: 64ch;
}
.service-row__detail li {
  display: flex;
  align-items: baseline;
  gap: var(--space-3);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: rgba(255,255,255,0.7);
}
.service-row__detail li::before {
  content: "\2014";                           /* em-dash bullet — editorial */
  color: rgba(255,255,255,0.32);
  flex: 0 0 auto;
}
@media (hover: none) {
  .service-row__detail { max-height: 240px; opacity: 1; margin-top: var(--space-4); }
}

.service-row__num {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-light);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-invert-muted);
  font-variant-numeric: tabular-nums;
  transition: color 400ms var(--motion-ease);
}
.service-row:hover .service-row__num { color: var(--color-text-invert); }

.service-row__name {
  transition: color 300ms var(--motion-ease);
  position: relative;
}
.service-row:hover .service-row__name { color: var(--color-text-invert); }

.service-row__body {
  display: grid;
  gap: var(--space-5);
  max-width: 72ch;
}
.service-row__name {
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 3.8vw, 3rem);     /* shrunk from 2.5–5rem */
  font-weight: var(--fw-thin);
  letter-spacing: -0.01em;
  text-transform: none;
  line-height: 1.05;
}
.service-row__desc {
  font-family: var(--font-body);
  font-size: var(--fs-body);
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: var(--color-text-invert-muted);
  max-width: 58ch;
  margin: 0;
}

/* Deliverables chips — editorial caps tags under each service name.
   Adds specificity without making the row feel busy. */
.service-row__chips {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) 10px;
  margin-top: var(--space-3);
}
.service-row__chips li {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
  padding: 6px 12px;
  border: 1px solid rgba(255,255,255,0.14);
  transition: border-color 400ms var(--motion-ease),
              color 400ms var(--motion-ease),
              background-color 400ms var(--motion-ease);
}
.service-row:hover .service-row__chips li {
  color: rgba(255,255,255,0.85);
  border-color: rgba(255,255,255,0.26);
}

.service-row__arrow {
  display: inline-grid;
  place-items: center;
  width: 40px;
  height: 40px;
  color: var(--color-text-invert-muted);
  transition: color 300ms var(--motion-ease);
}
.service-row:hover .service-row__arrow {
  color: var(--color-text-invert);
}

@media (max-width: 840px) {
  .service-row { grid-template-columns: 44px 1fr auto; gap: var(--space-4); padding-inline: 0; }
  .service-row__name { font-size: 1.375rem; letter-spacing: 0; }
}

/* ---------- Portfolio (cinematic vertical stack of video tiles) ---------- */
.portfolio { background: var(--color-paper); position: relative; }
.portfolio__head {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: clamp(var(--space-6), 4vw, var(--space-8));
  max-width: 60ch;
  margin-inline: auto;
}
.portfolio__heading {
  margin: 0;
  max-width: 26ch;
  font-size: var(--fs-h2);
  line-height: 1.05;
  letter-spacing: -0.015em;
}
/* Foot — stats centred above the CTA, then the big centred CTA (stodio pattern) */
.portfolio__foot {
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  text-align: center;
}
.portfolio__stats {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}
.portfolio__stats li {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.portfolio__stats span {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  line-height: 1;
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
}
.portfolio__stats em {
  font-family: var(--font-body);
  font-style: normal;
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
@media (max-width: 720px) {
  .portfolio__foot { justify-content: center; text-align: center; }
  .portfolio__stats { justify-content: center; }
  .portfolio__capacity { align-items: center; text-align: center; }
}

/* Portfolio capacity meter — mini version of the CTA-close capacity bar, sits
   in portfolio foot as a scarcity signal for the current quarter. */
.portfolio__capacity {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-2), 1.2vw, var(--space-3));
  max-width: 460px;
  flex: 1 1 auto;
}
.portfolio__capacity-kicker {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.portfolio__capacity-meter {
  position: relative;
  height: 2px;
  width: 100%;
  background: rgba(10,10,10,0.12);
  overflow: hidden;
  border-radius: 2px;
}
.portfolio__capacity-fill {
  position: absolute;
  inset: 0 auto 0 0;
  width: var(--fill, 0%);
  background: var(--color-ink, #0a0a0a);
  transition: width 900ms cubic-bezier(0.16, 1, 0.3, 1);
}
.portfolio__capacity-note {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--color-text-muted);
  margin: 0;
}
.portfolio__capacity-note em {
  font-style: normal;
  font-weight: 500;
  color: var(--color-ink);
}
.portfolio__stack {
  margin-top: clamp(var(--space-7), 6vw, var(--space-9));
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-6), 5vw, var(--space-8));
}
/* Second row: two tiles side by side, both 16:9 (same cinematic aspect as the
   hero tile, just smaller — fits video without cropping). */
.portfolio__pair {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(var(--space-5), 4vw, var(--space-7));
}
.portfolio__pair .film-tile__media { aspect-ratio: 16 / 9; }
@media (max-width: 720px) {
  .portfolio__pair { grid-template-columns: 1fr; gap: var(--space-6); }
}
.film-tile {
  margin: 0;
  /* GPU hint + paint isolation — fixes the flicker when two tiles overlap in
     the viewport mid-scroll (transform + filter on the img was thrashing the layer). */
  transform: translateZ(0);
  will-change: transform, opacity;
  contain: layout paint;
}
.film-tile__media {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--color-paper-soft);
  /* Cursor is replaced by the glass View badge once the user enters the tile. */
  cursor: pointer;
  isolation: isolate;
}
.film-tile__media:hover { cursor: none; }
.film-tile__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1) translateZ(0);
  transform-origin: center;
  will-change: transform, filter;
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1),
              filter 600ms var(--motion-ease);
  filter: brightness(0.82);
}
.film-tile__media:hover img {
  transform: scale(1.04) translateZ(0);
  filter: brightness(1);
}
/* Stronger bottom scrim for text legibility. Softens on hover so the full image reads. */
.film-tile__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(0deg,
    rgba(0,0,0,0.78) 0%,
    rgba(0,0,0,0.48) 22%,
    rgba(0,0,0,0.12) 42%,
    rgba(0,0,0,0) 60%
  );
  transition: opacity 600ms var(--motion-ease);
  pointer-events: none;
}
.film-tile__media:hover .film-tile__scrim { opacity: 0.55; }
/* Bottom-left content block — all overlay text lives here, stacked cleanly */
.film-tile__corner {
  position: absolute;
  left: clamp(20px, 3vw, 40px);
  right: clamp(20px, 3vw, 40px);
  bottom: clamp(20px, 3vw, 40px);
  display: flex;
  flex-direction: column;
  gap: 10px;
  color: #fff;
}
.film-tile__kicker {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.92);
}
.film-tile__name {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.75rem, 4vw, 3.25rem);
  line-height: 1.02;
  letter-spacing: -0.015em;
  color: #ffffff;
}
.film-tile__name em { font-style: italic; color: rgba(255,255,255,0.78); font-weight: var(--fw-thin); }
.film-tile__line {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 6px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.82);
}
.film-tile__value {
  font-variant-numeric: tabular-nums;
  color: #fff;
  font-weight: var(--fw-light);
}
.film-tile__dot {
  width: 3px; height: 3px;
  border-radius: 50%;
  background: rgba(255,255,255,0.55);
  display: inline-block;
}
.film-tile__type { color: rgba(255,255,255,0.78); }
/* Cursor-follow "View more" badge — small glass pill that tracks the cursor
   with a slow orbital offset, so it drifts around the cursor point rather than
   sitting on it. JS lerps the position toward the cursor + rotating offset
   (see film-tile cursor-follow block in main.js). Fades in/out on hover. */
.film-tile__view {
  position: absolute;
  left: 0;
  top: 0;
  padding: 10px 16px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.96);
  background: rgba(255,255,255,0.14);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  border: 1px solid rgba(255,255,255,0.42);
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translate3d(0, 0, 0);
  transition: opacity 700ms cubic-bezier(0.22, 0.8, 0.24, 1);
  will-change: transform, opacity;
  z-index: 3;
}
.film-tile__media:hover .film-tile__view { opacity: 1; }

/* Scroll reveal on each tile */
.film-tile.reveal {
  opacity: 0;
  transform: translateY(48px);
  transition: opacity 900ms var(--motion-ease), transform 900ms var(--motion-ease);
}
.film-tile.reveal.is-visible {
  opacity: 1;
  transform: none;
}

.portfolio__cta {
  display: flex;
  justify-content: center;
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
}

.project__media {
  display: block;
  aspect-ratio: 4 / 3;                          /* uniform across all tiles */
  overflow: hidden;
  margin-bottom: var(--space-5);
  background: var(--color-paper-soft);
  position: relative;
  cursor: none;
}
.project__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1);
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.project:hover .project__media img { transform: scale(1.06); }

/* Glass "View" badge — SHARP rectangle, CENTRED on the image, static.
   Fades + rises into place on hover. OS cursor stays visible (no replace). */
.project__cursor {
  position: absolute;
  left: 50%;
  top: 50%;
  padding: 12px 24px;
  border-radius: 0;
  background: rgba(255,255,255,0.1);
  backdrop-filter: blur(18px) saturate(1.2);
  -webkit-backdrop-filter: blur(18px) saturate(1.2);
  border: 1px solid rgba(255,255,255,0.35);
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  line-height: 1;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translate(-50%, -50%) translateY(8px);
  transition: opacity 260ms ease, transform 360ms cubic-bezier(0.22, 0.8, 0.24, 1);
  z-index: 3;
}
.project__media:hover .project__cursor {
  opacity: 1;
  transform: translate(-50%, -50%) translateY(0);
}
.project__media { cursor: pointer; }                 /* OS cursor stays — no hide */

.project__meta {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: baseline;
  gap: var(--space-3) var(--space-5);
  padding-top: var(--space-3);
  border-top: 1px solid var(--color-line);
}
.project__tags {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: var(--fw-light);
  color: var(--color-text-muted);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  grid-column: 1;
  order: 2;
  margin-top: var(--space-2);
}
.project__title {
  font-family: var(--font-display);
  font-size: clamp(1.5rem, 2.4vw, 2.25rem);
  font-weight: var(--fw-thin);
  letter-spacing: -0.005em;
  line-height: 1.1;
  grid-column: 1;
  order: 1;
  margin: 0;
}
.project__year {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: var(--fw-light);
  color: var(--color-text-muted);
  letter-spacing: 0.14em;
  grid-column: 2;
  grid-row: 1;
  order: 1;
  align-self: baseline;
}

/* Larger title for lg-size slots */
.project--lg .project__title { font-size: clamp(1.75rem, 3vw, 2.75rem); }

/* Scroll reveal on the project container (img transform is reserved for hover) */
.project.reveal {
  opacity: 0;
  transform: translateY(48px);
  transition: opacity 900ms var(--motion-ease), transform 900ms var(--motion-ease);
}
.project.reveal.is-visible {
  opacity: 1;
  transform: none;
}

/* Staggered reveal delays per slot */
/* Staggered reveal delays by tile index via :nth-child */
.project:nth-child(1) { transition-delay: 0ms; }
.project:nth-child(2) { transition-delay: 80ms; }
.project:nth-child(3) { transition-delay: 160ms; }
.project:nth-child(4) { transition-delay: 40ms; }
.project:nth-child(5) { transition-delay: 120ms; }
.project:nth-child(6) { transition-delay: 200ms; }

@media (max-width: 840px) {
  .portfolio__grid { row-gap: var(--space-7); }
}

/* ---------- Marquee (continuous auto-scroll for testimonials + reviews) ----------
   Hive-astro-style: cards drift left continuously; hovering or dragging pauses
   the animation so the reader has time. JS duplicates the children so the loop
   is seamless, and translates the track by -50% over the animation duration. */
.marquee {
  overflow: hidden;
  margin-top: clamp(var(--space-6), 4vw, var(--space-8));
}
/* Soft edge mask — cards fade in/out at the edges smoothly for premium feel.
   Applied on both marquee variants (reviews + drag-enabled client experiences). */
.marquee--reviews,
.marquee[data-marquee-drag] {
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, black 2%, black 98%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, black 2%, black 98%, transparent 100%);
}
.marquee__track {
  display: flex;
  width: max-content;
  /* gap: 0 — spacing is carried by each child's right margin so the loop is
     truly seamless (N children + N gaps × 2 halves exactly). */
  gap: 0;
  animation: marquee var(--marquee-duration, 55s) linear infinite;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
  will-change: transform;
}
.marquee__track.is-grabbing { cursor: grabbing; }
.marquee__track > * {
  flex: 0 0 clamp(280px, 26vw, 380px);
  min-width: 0;
  margin-right: clamp(var(--space-5), 2.5vw, var(--space-7));
}
/* Pause on hover OR while manually paused by drag */
.marquee:hover .marquee__track,
.marquee__track.is-paused { animation-play-state: paused; }

/* Reviews variant — slower calm flow, gentle pause on hover so visitors can read */
.marquee--reviews .marquee__track {
  --marquee-duration: 75s;
  animation-duration: var(--marquee-duration);
  transform: translateZ(0);                       /* GPU compositing, prevents jitter */
  backface-visibility: hidden;
}
.marquee--reviews:hover .marquee__track {
  animation-play-state: paused;
}

@keyframes marquee {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .marquee__track { animation: none; }
}

/* ---------- Generic carousel (used by Client Experiences + Reviews) ---------- */
.carousel {
  position: relative;
  margin-top: var(--space-6);
}
.carousel__track {
  display: flex;
  gap: clamp(var(--space-5), 2.5vw, var(--space-7));
  overflow-x: auto;
  overflow-y: hidden;
  /* proximity (not mandatory) stops the page-scroll fight when your finger
     enters the track with any vertical angle; contain keeps the horizontal
     overscroll inside the track so the outer page doesn't jitter. */
  scroll-snap-type: x proximity;
  overscroll-behavior-x: contain;
  overscroll-behavior-y: auto;
  scroll-behavior: smooth;
  cursor: grab;
  scrollbar-width: none;
  -ms-overflow-style: none;
  user-select: none;
  -webkit-user-select: none;
  touch-action: pan-x pan-y;                         /* let the browser handle vertical page scroll over the track */
  padding-bottom: 4px;                              /* breathing space for any shadow */
}
.carousel__track::-webkit-scrollbar { display: none; }
.carousel__track.is-grabbing { cursor: grabbing; }
.carousel__track > * {
  flex: 0 0 calc((100% - 2 * clamp(var(--space-5), 2.5vw, var(--space-7))) / 3);   /* 3 visible */
  scroll-snap-align: start;
  min-width: 0;
}
@media (max-width: 960px) {
  .carousel__track > * { flex-basis: calc((100% - 1 * clamp(var(--space-5), 2.5vw, var(--space-7))) / 2); }
}
@media (max-width: 600px) {
  .carousel__track > * { flex-basis: 86%; }
}
.carousel__controls {
  display: flex;
  gap: var(--space-3);
  justify-content: flex-end;
  margin-top: var(--space-5);
}
/* Arrows are filled/visible by default — the hover look the user liked is now the default.
   Hover adds a subtle lift/scale rather than making the arrow appear. */
.carousel__btn {
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border-radius: 0;
  background: var(--color-ink);
  color: var(--color-paper);
  border: 1px solid var(--color-ink);
  opacity: 1;
  cursor: pointer;
  transition: transform var(--motion-base) var(--motion-ease), background-color var(--motion-base) var(--motion-ease);
}
.carousel__btn:hover {
  transform: scale(1.06);
  background: #1a1a1a;
}
.carousel__btn svg { color: currentColor; }
.carousel__btn.is-disabled,
.carousel__btn:disabled {
  opacity: 0.22;
  cursor: not-allowed;
  pointer-events: none;
}
/* Carousels inside a dark section invert to white bg + ink arrow. */
.sets-apart .carousel__btn,
.work-with-us .carousel__btn {
  background: #ffffff;
  color: var(--color-ink);
  border-color: #ffffff;
}
.sets-apart .carousel__btn:hover,
.work-with-us .carousel__btn:hover { background: rgba(255,255,255,0.88); }

/* ---------- Client Experiences (video testimonials, LIGHT) ---------- */
.client-experiences { background: #ffffff; color: var(--color-text); }
.client-experiences__grid {
  display: flex;                                     /* overrides default grid for marquee */
}
/* Ensure each vtm gets a fixed width inside the marquee track */
.marquee__track .vtm {
  flex: 0 0 clamp(280px, 26vw, 380px);
  min-width: 0;
  margin-right: clamp(var(--space-5), 2.5vw, var(--space-7));
}

.vtm {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}
.vtm__media {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--color-paper-soft);
}
.vtm__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1);
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1), filter 600ms var(--motion-ease);
  filter: brightness(0.88);
}
.vtm__media:hover img { transform: scale(1.04); filter: brightness(0.95); }
.vtm__play {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  width: 64px; height: 64px;
  border-radius: 999px;
  background: rgba(255,255,255,0.14);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  border: 1px solid rgba(255,255,255,0.5);
  color: #fff;
  display: grid;
  place-items: center;
  padding-left: 3px;                              /* optical play triangle nudge */
  transition: transform 360ms var(--motion-ease), background-color 360ms var(--motion-ease);
}
.vtm__media:hover .vtm__play { transform: translate(-50%, -50%) scale(1.06); background: rgba(255,255,255,0.22); }
.vtm__duration {
  position: absolute;
  right: 12px; bottom: 12px;
  padding: 4px 8px;
  background: rgba(0,0,0,0.55);
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  letter-spacing: 0.1em;
  font-variant-numeric: tabular-nums;
}
.vtm__caption { display: flex; flex-direction: column; gap: var(--space-2); }
.vtm__name {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: 1.25rem;
  letter-spacing: -0.005em;
  color: var(--color-text);
}
.vtm__role {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.vtm__quote {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: 1.0625rem;
  line-height: 1.45;
  color: var(--color-text);
  max-width: 48ch;
  padding-top: var(--space-2);
  border-top: 1px solid rgba(0,0,0,0.08);
}

/* ---------- Client Stories (single-card viewer — fluid.glass pattern) ----------
   Portrait-left + oversized italic bold quote right, stepped by prev/next. The
   swap is a plain opacity crossfade (no translate, no pop). One testimonial at
   a time — text is the star, portrait is a sidecar. */
.client-stories {
  background: #ffffff;
  color: var(--color-text);
  position: relative;
}
/* Editorial hairline at the top — anchors the section visually like a magazine
   section divider, same treatment as fluid.glass. Full container width. */
.client-stories .container { position: relative; }
.client-stories .container::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 1px;
  background: rgba(0,0,0,0.12);
}
.cs__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: var(--space-7);
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-9));
  padding-top: clamp(var(--space-6), 4vw, var(--space-8));
}
.cs__head-text { max-width: 30ch; }
.cs__heading {
  margin-top: var(--space-3);
  max-width: 18ch;
}
.cs__heading em {
  font-style: italic;
  color: var(--color-text-muted);
}
.cs__controls {
  display: flex;
  align-items: center;
  gap: var(--space-5);
  flex-shrink: 0;
}
.cs__counter {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: 1.125rem;
  color: rgba(0,0,0,0.46);
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
}
.cs__counter [data-cs-now] { color: rgba(0,0,0,0.9); }
.cs__nav {
  display: flex;
  gap: 10px;
}
.cs__nav-btn {
  appearance: none;
  background: transparent;
  border: 1px solid rgba(0,0,0,0.14);
  border-radius: 0;
  width: 48px; height: 48px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  color: rgba(0,0,0,0.72);
  padding: 0;
  transition: background-color 320ms var(--motion-ease),
              color 320ms var(--motion-ease),
              border-color 320ms var(--motion-ease);
}
.cs__nav-btn:hover {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-color: var(--color-ink);
}
.cs__nav-btn svg { width: 18px; height: 18px; display: block; }

/* Viewer stacks all stories in the same cell; active one is visible.
   Plain opacity crossfade on swap — NO translateY, NO scale, NO pop. */
.cs__viewer {
  position: relative;
  display: grid;
  min-height: clamp(360px, 38vw, 480px);
}
/* Giant ghost index number — decorative typographic watermark behind the story.
   JS (initClientStories) updates its text to match the active index. */
.cs__ghost {
  position: absolute;
  top: -0.25em;
  right: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-style: italic;
  font-size: clamp(12rem, 22vw, 22rem);
  line-height: 0.8;
  letter-spacing: -0.04em;
  color: rgba(0,0,0,0.04);
  font-variant-numeric: tabular-nums;
  pointer-events: none;
  z-index: 0;
  user-select: none;
}
.cs__story { z-index: 1; }
.cs__story {
  grid-area: 1 / 1;
  display: grid;
  grid-template-columns: minmax(0, 320px) minmax(0, 1fr);
  gap: clamp(var(--space-6), 5vw, var(--space-9));
  align-items: start;
  opacity: 0;
  transition: opacity 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
  pointer-events: none;
}
.cs__story.is-active {
  opacity: 1;
  pointer-events: auto;
}
.cs__portrait {
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: var(--color-paper-soft);
  max-width: 320px;
}
.cs__portrait img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  filter: brightness(0.96);
}
.cs__body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  padding-top: var(--space-4);
}
.cs__quote {
  position: relative;
  margin: 0;
  padding-left: clamp(var(--space-5), 3vw, var(--space-7));
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-light);
  font-size: clamp(1.75rem, 3.2vw, 2.875rem);
  line-height: 1.18;
  letter-spacing: -0.015em;
  color: rgba(0,0,0,0.94);
  max-width: 24ch;
}
/* Oversized open-quote glyph as a typographic flourish — sits at the start,
   scaled up, soft-grey, so it doesn't compete with the sentence itself. */
.cs__quote::before {
  content: "\201C";
  position: absolute;
  left: -0.08em;
  top: -0.35em;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-light);
  font-size: 3.2em;
  line-height: 1;
  color: rgba(0,0,0,0.14);
  pointer-events: none;
}
.cs__attr {
  margin: 0;
  position: relative;
  padding-top: clamp(var(--space-4), 2vw, var(--space-5));
}
/* Ornamental ✦ + hairline rule between the quote and the attribution — editorial
   separator, positioned at the top of the attribution block. */
.cs__attr::before {
  content: "";
  display: block;
  width: 48px;
  height: 1px;
  background: rgba(0,0,0,0.28);
  margin-bottom: clamp(var(--space-3), 1.4vw, var(--space-4));
}
.cs__attr::after {
  content: "";
  position: absolute;
  top: calc(-2px + clamp(var(--space-4), 2vw, var(--space-5)));
  left: 0;
  width: 8px;
  height: 8px;
  transform: rotate(45deg);
  border: 1px solid rgba(0,0,0,0.65);
  background: #fff;
}
.cs__name {
  margin: 0;
  font-family: var(--font-body);
  font-weight: var(--fw-medium);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text);
}
.cs__role {
  margin: 6px 0 0;
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-weight: var(--fw-light);
  font-style: italic;
  color: var(--color-text-muted);
}
.cs__proof {
  margin-top: clamp(var(--space-7), 5vw, var(--space-9));
  text-align: center;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  color: rgba(0,0,0,0.58);
  letter-spacing: 0.02em;
  max-width: 70ch;
  margin-inline: auto;
}
.cs__proof em {
  font-style: italic;
  color: rgba(0,0,0,0.86);
}

@media (max-width: 820px) {
  .cs__head { flex-direction: column; align-items: flex-start; gap: var(--space-5); }
  .cs__controls { align-self: flex-end; }
  .cs__viewer { min-height: 0; }
  .cs__story {
    grid-template-columns: 1fr;
    gap: var(--space-5);
  }
  .cs__portrait { max-width: none; aspect-ratio: 4 / 3; max-height: 340px; }
  .cs__body { padding-top: 0; }
}

/* ---------- What Sets Us Apart (3-column industry compare, DARK) ---------- */
.sets-apart {
  position: relative;
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-8), 8vw, var(--space-10));
  border-top: 1px solid rgba(255,255,255,0.08);
}
.sets-apart .eyebrow { color: rgba(255,255,255,0.72); }
.sets-apart__head-wrap {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  max-width: 60ch;
  margin-inline: auto;
}
/* Short kicker that sits between the eyebrow and the headline */
.sets-apart__kicker {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: clamp(1rem, 1.6vw, 1.25rem);
  line-height: 1.45;
  color: rgba(255,255,255,0.7);
  max-width: 48ch;
}
.sets-apart__heading {
  color: var(--color-text-invert);
  max-width: 22ch;
  margin: 0;
}
.sets-apart__heading em { color: rgba(255,255,255,0.72); font-style: italic; }

/* Matrix — table-like with SOFT column dividers (hairlines) and row separators.
   All cells share the same base styling; HoA column differs only through type
   (brighter IvyPresto Display + ✦ mark), not through a separate dark box. */
.sets-apart__matrix-wrap {
  position: relative;
  margin-top: clamp(var(--space-6), 4vw, var(--space-8));
  max-width: 1140px;
  margin-inline: auto;
}
.sets-apart__matrix {
  display: grid;
  grid-template-columns: minmax(120px, 0.55fr) 1fr 1fr;
  column-gap: 0;
  border-top: 1px solid rgba(255,255,255,0.16);
}
.sets-apart__headers,
.sets-apart__row {
  display: contents;
}
/* Dimensions column (first) — same base style as others, just a hairline right divider */
.sets-apart__label {
  padding: clamp(var(--space-4), 1.8vw, var(--space-5)) clamp(var(--space-4), 2vw, var(--space-5));
  border-bottom: 1px solid rgba(255,255,255,0.12);
  border-right: 1px solid rgba(255,255,255,0.14);
  background: transparent;
  display: flex;
  flex-direction: column;
  gap: 6px;
  justify-content: center;
}
.sets-apart__h--cat {
  border-right: 1px solid rgba(255,255,255,0.14);
  background: transparent;
}
.sets-apart__label-num {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.3em;
  color: rgba(255,255,255,0.48);
  font-variant-numeric: tabular-nums;
}
.sets-apart__label-text {
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-medium);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.9);
  line-height: 1.2;
}

/* Column headers — tighter vertical rhythm so the logo sits prominent, not floating */
.sets-apart__h {
  padding: clamp(var(--space-3), 1.2vw, var(--space-4)) clamp(var(--space-4), 2vw, var(--space-5));
  border-bottom: 1px solid rgba(255,255,255,0.14);
  border-right: 1px solid rgba(255,255,255,0.14);
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--space-2);
  min-height: clamp(96px, 9vw, 128px);
  color: rgba(255,255,255,0.78);
}
.sets-apart__h:last-child { border-right: 0; }
.sets-apart__h--cat span {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.4);
}
.sets-apart__h-kicker {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.45);
}
.sets-apart__h-name {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.1;
  letter-spacing: -0.005em;
  color: rgba(255,255,255,0.82);
}
.sets-apart__h-sub {
  margin-top: 4px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  line-height: 1.5;
  color: rgba(255,255,255,0.48);
  max-width: 32ch;
}
/* HoA header cell — SELF-CONTAINED dark tile so the white logo reads clearly.
   No grey wash, no gradient: just a darker-than-section ink fill + hairline border. */
/* HoA header — IDENTICAL padding + alignment as the Other Marketing Agencies header.
   The logo sits where the h-name text sits, scaled to the same line-height so the
   two columns read as equal-weight column titles (logo just replaces the text). */
/* HoA column differentiation — subtle editorial treatment that reads as a
   "premium ticket" column without being loud. Three moves:
   1. Gentle gradient backdrop (top-down wash) to frame the column
   2. A small rhombus accent at top-right of the header
   3. Bigger logo + proper padding matching the Other Agencies h-name rhythm */
.sets-apart__h--hoa {
  background: linear-gradient(180deg, rgba(255,255,255,0.035) 0%, rgba(255,255,255,0) 72%);
  border-left: 1px solid rgba(255,255,255,0.24);
  border-right: 1px solid rgba(255,255,255,0.24);
  position: relative;
}

/* Vertical divider between HoA column (middle) and Other Marketing Agencies column (right) */
.sets-apart__row > *:nth-child(3),
.sets-apart__headers > *:nth-child(3) {
  border-left: 1px solid rgba(255,255,255,0.18);
}
.sets-apart--light .sets-apart__row > *:nth-child(3),
.sets-apart--light .sets-apart__headers > *:nth-child(3) {
  border-left-color: rgba(10,10,10,0.12);
}
.sets-apart__h--hoa::before { display: none; }

/* Small filled rhombus, inline before "Our approach" kicker */
.sets-apart__h-rhombus {
  width: 8px;
  height: 8px;
  display: inline-block;
  vertical-align: middle;
  margin-right: 6px;
  color: currentColor;
}

/* Explicit vertical divider between HoA (middle) and Other Marketing Agencies (right) */
.sets-apart__row > .sets-apart__cell:last-child,
.sets-apart__headers > .sets-apart__h:last-child {
  border-left: 1px solid rgba(255,255,255,0.22);
}
.sets-apart--light .sets-apart__row > .sets-apart__cell:last-child,
.sets-apart--light .sets-apart__headers > .sets-apart__h:last-child {
  border-left-color: rgba(10,10,10,0.14);
}
.sets-apart__h--hoa img {
  /* Horizontal wordmark SVG (~4.7:1 tight). Height calibrated to match the
     visual weight of the 2-line Other Agencies h-name across its full cap height. */
  max-height: clamp(44px, 4vw, 62px);
  max-width: 100%;
  width: auto;
  height: auto;
  display: block;
  opacity: 1;
  align-self: flex-start;
  margin-block: 2px;
}

/* Value cells — soft horizontal + vertical hairlines on every cell. Column gaps
   come from these right borders; the last cell of each row drops its border. */
.sets-apart__cell {
  padding: clamp(var(--space-4), 1.8vw, var(--space-5)) clamp(var(--space-5), 2vw, var(--space-6));
  border-bottom: 1px solid rgba(255,255,255,0.12);
  border-right: 1px solid rgba(255,255,255,0.14);
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.5;
  color: rgba(255,255,255,0.78);
  transition: background-color 480ms var(--motion-ease);
}
.sets-apart__cell:last-child,
.sets-apart__row > .sets-apart__cell--hoa { border-right: 0; }        /* HoA column = last */
.sets-apart__cell:hover { background: rgba(255,255,255,0.01); }       /* very soft hover */
/* HoA column — distinct premium-ticket treatment: darker bg, side borders
   brighter than the neutral cells, more vertical breathing room, IvyPresto. */
.sets-apart__cell--hoa {
  background: #000;
  border-left: 1px solid rgba(255,255,255,0.28);
  border-right: 1px solid rgba(255,255,255,0.28);
  padding-block: clamp(var(--space-5), 2.2vw, var(--space-6));
  font-family: var(--font-display);
  font-style: normal;
  font-weight: var(--fw-thin);
  font-size: clamp(1.1875rem, 1.6vw, 1.4375rem);
  color: var(--color-text-invert);
  line-height: 1.3;
  letter-spacing: -0.005em;
}
.sets-apart__mark {
  width: 14px; height: 14px;
  flex: 0 0 auto;
  color: #fff;
  margin-top: 3px;
  transition: transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.sets-apart__cell--hoa:hover .sets-apart__mark {
  transform: rotate(90deg) scale(1.1);
}
/* Close out the HoA column rectangle on the last row */
.sets-apart__row--last .sets-apart__cell--hoa {
  border-bottom-color: rgba(255,255,255,0.22);
}

/* Quiet bridge link below the matrix — flows to Work-With-Us without duplicating its CTA */
.sets-apart__bridge {
  margin-top: clamp(var(--space-6), 4vw, var(--space-8));
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.82);
  justify-self: center;
  align-self: center;
  padding: 6px 0;
  border-bottom: 1px solid rgba(255,255,255,0.22);
  transition: color 320ms var(--motion-ease), border-color 320ms var(--motion-ease), gap 320ms var(--motion-ease);
}
.sets-apart__matrix-wrap { display: flex; flex-direction: column; align-items: center; }
.sets-apart__matrix { width: 100%; }
.sets-apart__bridge:hover {
  color: #fff;
  border-bottom-color: #fff;
  gap: 14px;
}
.sets-apart__bridge svg { width: 14px; height: 14px; }

@media (max-width: 760px) {
  .sets-apart__matrix { grid-template-columns: 1fr; }
  .sets-apart__h--cat { display: none; }
  .sets-apart__h--hoa,
  .sets-apart__cell--hoa { border-left: 0; border-right: 0; border-bottom: 1px solid rgba(255,255,255,0.28); }
}

/* ---------- Work with us (closing CTA — 2-col: globe + copy, DARK) ---------- */
.work-with-us {
  position: relative;
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-top: 1px solid rgba(255,255,255,0.08);
  padding-block: clamp(var(--space-9), 10vw, var(--space-11));
}
.work-with-us .eyebrow { color: rgba(255,255,255,0.62); }
.work-with-us__grid {
  display: grid;
  grid-template-columns: minmax(320px, 1fr) minmax(280px, 0.9fr);
  gap: clamp(var(--space-7), 6vw, var(--space-9));
  align-items: center;
  max-width: 1140px;
  margin-inline: auto;
}
/* Globe — no container styling (no border / no card), just the orb + tiny hint */
.work-with-us__globe {
  position: relative;
  width: 100%;
  max-width: 416px;
  aspect-ratio: 1 / 1;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
  justify-self: end;
}
.work-with-us__globe.is-grabbing { cursor: grabbing; }
.work-with-us__globe .globe-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
/* Quieter hint — no box, just small muted text */
.work-with-us__globe-hint {
  position: absolute;
  bottom: -26px; left: 0; right: 0;
  text-align: center;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.4);
  pointer-events: none;
}

/* Left column — text + CTA, compact */
.work-with-us__inner {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-4);
  max-width: 52ch;
}
.work-with-us__heading {
  margin: 0;
  color: var(--color-text-invert);
  font-size: clamp(2rem, 3.4vw, 2.75rem);
  line-height: 1.08;
  letter-spacing: -0.02em;
}
.work-with-us__heading em { font-style: italic; color: rgba(255,255,255,0.62); }
.work-with-us__lede {
  margin: 0;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(255,255,255,0.82);
  max-width: 48ch;
}
.work-with-us__actions {
  display: flex;
  gap: var(--space-4);
  margin-top: var(--space-2);
  flex-wrap: wrap;
  align-items: center;
}
/* About-page engagement block: force the two CTAs onto a single horizontal
   row at desktop. They only wrap on narrow viewports. */
@media (min-width: 641px) {
  .about-engagement .work-with-us__actions { flex-wrap: nowrap; }
}
.about-engagement .work-with-us__inner { max-width: 62ch; }

/* WhatsApp-branded variant of .btn-ct — leading green glyph + text pill.
   Inherits the btn-ct sliding-row animation so it matches the other CTA. */
.btn-ct--wa {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding-left: clamp(18px, 1.6vw, 22px);   /* a touch tighter so the icon reads first */
}
.btn-ct__wa-icon {
  width: 18px;
  height: 18px;
  color: #25d366;                            /* WhatsApp green — same as the old wa-button */
  flex: 0 0 auto;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.btn-ct--wa:hover .btn-ct__wa-icon { transform: scale(1.06); }
/* Available-for-projects note — sans body copy (Manrope), upright, with
   a live green dot. Roman not italic so it reads cleanly at small size
   on the dark frame. Letter-spaced uppercase eyebrow scale. */
.work-with-us__available {
  margin: var(--space-3) 0 0;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-style: normal;
  font-weight: var(--fw-light);
  font-size: 0.6875rem;
  line-height: 1.5;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.78);
}
.work-with-us__available-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #9ccfa3;                                /* quiet sage — "we're open" signal */
  box-shadow: 0 0 0 3px rgba(156,207,163,0.15);
  flex: 0 0 auto;
}
@media (max-width: 840px) {
  .work-with-us__grid { grid-template-columns: 1fr; gap: var(--space-7); }
  .work-with-us__grid > * { min-width: 0; }
  .work-with-us__inner { align-items: center; text-align: center; margin-inline: auto; max-width: 100%; }
  .work-with-us__lede { max-width: 100%; }
  .work-with-us__actions { justify-content: center; }
  .work-with-us__globe { justify-self: center; max-width: min(416px, 100%); }
}

/* ---------- Reviews (written Google-style quotes, LIGHT) ---------- */
.reviews { background: #ffffff; color: var(--color-text); }
.reviews__grid {
  display: flex;                                     /* marquee track layout */
}
.marquee__track .review {
  flex: 0 0 clamp(300px, 28vw, 420px);
  min-width: 0;
  margin-right: clamp(var(--space-5), 2.5vw, var(--space-7));
}

.review {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  padding: clamp(var(--space-5), 2.4vw, var(--space-6));
  background: #f7f7f6;
  border: 1px solid rgba(0,0,0,0.06);
  transition: background 500ms var(--motion-ease), border-color 500ms var(--motion-ease), transform 700ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.review:hover { background: #f3f3f3; border-color: rgba(0,0,0,0.1); }
/* Source badge — top of the card, Google vs Trustpilot */
.review__source {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-bottom: var(--space-2);
  margin-bottom: var(--space-2);
  border-bottom: 1px solid rgba(0,0,0,0.08);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.review__source em {
  font-family: var(--font-body);
  font-style: normal;
  font-weight: var(--fw-medium);
  color: var(--color-text);
  text-transform: none;
  letter-spacing: 0.04em;
}
.review__source-icon { width: 14px; height: 14px; flex: 0 0 auto; }
.review__source--google .review__source-icon { color: #4285f4; }
.review__source--trustpilot .review__source-icon { color: #00b67a; }
.review__stars {
  display: inline-flex;
  gap: 2px;
  color: #d4a656;
}
.review__stars svg { width: 14px; height: 14px; display: block; }
.review__quote {
  margin: 0;
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--color-text);
}
.review__person {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-top: var(--space-3);
  border-top: 1px solid rgba(0,0,0,0.08);
}
.review__name {
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: 1.0625rem;
  letter-spacing: -0.005em;
  color: var(--color-text);
  line-height: 1.2;
}
.review__meta {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  color: var(--color-text-muted);
  line-height: 1.4;
}

/* ---------- Pricing ---------- */
.pricing { background: var(--color-paper-soft); }
.pricing__toggle {
  display: inline-flex;
  padding: 4px;
  background: var(--color-paper);
  border: 1px solid var(--color-line);
  border-radius: var(--radius-pill);
  margin-bottom: var(--space-7);
}
.pricing__toggle button {
  padding: 6px 18px;
  border-radius: var(--radius-pill);
  font-size: var(--fs-sm);
  color: var(--color-text-muted);
  transition: background-color var(--motion-base) var(--motion-ease),
              color var(--motion-base) var(--motion-ease);
}
.pricing__toggle button[aria-pressed="true"] {
  background: var(--color-ink);
  color: var(--color-text-invert);
}
.pricing__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-5);
}
.plan {
  padding: var(--space-7);
  border: 1px solid var(--color-line);
  border-radius: var(--radius-lg);
  background: var(--color-paper);
  display: grid;
  gap: var(--space-5);
}
.plan--featured {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-color: var(--color-ink);
}
.plan--featured .plan__features li { border-color: var(--color-line-dark); }
.plan__name { font-size: var(--fs-sm); letter-spacing: var(--tr-eyebrow); text-transform: uppercase; }
.plan__price {
  font-family: var(--font-display);
  font-size: 3rem;
  line-height: 1;
  letter-spacing: var(--tr-tight);
}
.plan__price small { font-size: var(--fs-body); color: var(--color-text-muted); }
.plan--featured .plan__price small { color: var(--color-text-invert-muted); }
.plan__features { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-3); }
.plan__features li {
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--color-line);
  font-size: var(--fs-sm);
  color: var(--color-text-muted);
}
.plan--featured .plan__features li { color: var(--color-text-invert-muted); }
.plan__cta { margin-top: auto; }
@media (max-width: 840px) {
  .pricing__grid { grid-template-columns: 1fr; }
}

/* ---------- FAQ (simple toggle-down — no box icon, no hover wash) ---------- */
.faq__list {
  display: grid;
  gap: 0;
  margin-top: var(--space-7);
  border-top: 1px solid rgba(0,0,0,0.1);
}
/* FAQ tile — high-contrast card treatment (April 2026). White tile, full-ink
   text (not muted), 1px hairline border, sharp corners. On hover/open the
   tile background deepens and the border darkens. No accent stripe, no colour
   shift — the open affordance is a subtle + → − morph (vertical bar of the
   cross collapses) rather than a rotating ×. */
.faq-item {
  position: relative;
  background: #ffffff;
  border: 1px solid rgba(10,10,10,0.10);
  border-radius: 0;
  overflow: hidden;
  transition: background 320ms var(--motion-ease),
              border-color 320ms var(--motion-ease);
}
.faq-item:hover {
  background: #fbfbfb;
  border-color: rgba(10,10,10,0.16);
}
.faq-item[data-open] {
  background: #fafafa;
  border-color: rgba(10,10,10,0.22);
}
.faq-item__summary {
  width: 100%;
  cursor: pointer;
  padding: clamp(18px, 2vw, 26px) clamp(22px, 2.4vw, 34px);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-5);
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.0625rem, 1.6vw, 1.375rem);
  letter-spacing: -0.005em;
  line-height: 1.3;
  text-align: left;
  color: var(--color-text);
  background: transparent;
  border: 0;
  transition: color 260ms var(--motion-ease);
}
.faq-item__summary:hover { color: var(--color-ink); }
.faq-item[data-open] .faq-item__summary { color: var(--color-ink); }
/* Plus → minus morph. The literal "+" text in the span is hidden (font-size: 0),
   and the cross is drawn via ::before (horizontal bar) and ::after (vertical
   bar). On open, the vertical bar scales to 0 so the icon reads as a minus —
   the conventional accordion affordance, no rejection × connotation. */
.faq-item__icon {
  position: relative;
  flex: 0 0 auto;
  width: 22px; height: 22px;
  display: grid; place-items: center;
  background: transparent;
  border: 1px solid rgba(10,10,10,0.14);
  border-radius: 0;
  font-size: 0;                                   /* hide the literal + glyph */
  color: var(--color-ink);
  line-height: 1;
  transition: border-color 260ms var(--motion-ease),
              background 260ms var(--motion-ease);
}
.faq-item__icon::before,
.faq-item__icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  background: currentColor;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.faq-item__icon::before {                         /* horizontal bar */
  width: 10px;
  height: 1.25px;
  transform: translate(-50%, -50%);
}
.faq-item__icon::after {                          /* vertical bar */
  width: 1.25px;
  height: 10px;
  transform: translate(-50%, -50%);
}
.faq-item:hover .faq-item__icon {
  border-color: rgba(10,10,10,0.20);
}
.faq-item[data-open] .faq-item__icon {
  border-color: rgba(10,10,10,0.26);
  background: rgba(10,10,10,0.025);
}
.faq-item[data-open] .faq-item__icon::after {
  transform: translate(-50%, -50%) scaleY(0);     /* vertical bar collapses → minus */
}
/* JS-driven accordion — max-height animates smoothly via inline style set by JS.
   Default closed state: 0 height + fully transparent; when opened, JS sets max-height
   to the scrollHeight so the transition plays correctly in both directions. */
.faq-item__body {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: max-height 520ms cubic-bezier(0.22, 0.8, 0.24, 1),
              opacity 380ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.faq-item[data-open] .faq-item__body {
  opacity: 1;
}
.faq-item__body-inner {
  padding: 0 clamp(22px, 2.4vw, 34px) clamp(18px, 2vw, 26px);
  max-width: 72ch;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.7;
  color: var(--color-ink-soft);
}

/* ---------- Testimonials ---------- */
.testimonials { background: var(--color-ink); color: var(--color-text-invert); }
.testimonials .eyebrow { color: var(--color-text-invert-muted); }
.testimonials .display { color: var(--color-text-invert); }
.testimonials__grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-5);
}
.testimonial {
  padding: var(--space-7);
  border: 1px solid var(--color-line-dark);
  border-radius: var(--radius-lg);
  display: grid;
  gap: var(--space-6);
}
.testimonial__quote {
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: var(--tr-tight);
}
.testimonial__person { display: flex; align-items: center; gap: var(--space-3); }
.testimonial__avatar {
  width: 44px; height: 44px;
  border-radius: var(--radius-pill);
  background: var(--color-paper-alt);
}
.testimonial__meta { font-size: var(--fs-sm); color: var(--color-text-invert-muted); }
@media (max-width: 840px) {
  .testimonials__grid { grid-template-columns: 1fr; }
}

/* ---------- Journal (editorial feature + 2-up grid, brand photography) ---------- */
.journal {
  background: var(--color-paper);
  padding-block: clamp(var(--space-9), 8vw, var(--space-11));
}
.journal__head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--space-5);
  margin-bottom: clamp(var(--space-6), 4vw, var(--space-8));
  flex-wrap: wrap;
}
.journal__head > div { display: flex; flex-direction: column; gap: var(--space-3); }
.journal__top-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  border-bottom: 1px solid rgba(0,0,0,0.14);
  padding-bottom: 4px;
  transition: color 260ms var(--motion-ease), border-color 260ms var(--motion-ease), gap 320ms var(--motion-ease);
}
.journal__top-link:hover {
  color: var(--color-text);
  border-color: var(--color-text);
  gap: 14px;
}
.journal__top-link svg { width: 12px; height: 12px; color: currentColor; }
@media (max-width: 720px) {
  .journal__head { justify-content: flex-start; }
}
.journal__headline {
  margin: 0;
  max-width: 22ch;
}
.journal__headline em { font-style: italic; color: var(--color-text-muted); }
.journal__lede {
  margin: 0;
  max-width: 56ch;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: var(--color-text-muted);
}

/* Volume marker — reads the Journal as a quarterly dispatch rather than a
   generic blog feed. Sits between the section head and the grid. */
.journal__volume {
  margin: clamp(var(--space-6), 4vw, var(--space-7)) 0 clamp(var(--space-5), 3vw, var(--space-6));
  display: flex;
  align-items: center;
  gap: clamp(var(--space-3), 2vw, var(--space-4));
  padding-block: var(--space-3);
  border-top: 1px solid rgba(0,0,0,0.09);
  border-bottom: 1px solid rgba(0,0,0,0.09);
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: clamp(0.9375rem, 1.3vw, 1.0625rem);
  color: var(--color-text-muted);
  letter-spacing: 0.005em;
}
.journal__volume-sep {
  width: 4px; height: 4px;
  background: currentColor;
  opacity: 0.55;
  flex: 0 0 auto;
}

/* 3-col × 1-row grid — stodio pattern */
.journal__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}
@media (max-width: 900px) { .journal__grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .journal__grid { grid-template-columns: 1fr; } }
.journal-post { margin: 0; }
/* Feature spans full width in a single column (image on top, text below),
   separated from the smaller 2-up grid beneath by a soft border + spacing. */
/* Featured post — editorial magazine layout. Image full-width on top, then
   the body splits into 2 columns below: big italic title on the left, a
   smaller excerpt + CTA on the right. Title and excerpt sit on the same line
   so they read as a proper lead article, not a centred blog post. */
.journal-post--feature {
  grid-column: 1 / -1;
  padding-bottom: clamp(var(--space-6), 4vw, var(--space-8));
  margin-bottom: clamp(var(--space-4), 2vw, var(--space-6));
  border-bottom: 1px solid rgba(0,0,0,0.1);
}
.journal-post--feature .journal-post__media {
  aspect-ratio: 21 / 9;
  margin-bottom: clamp(var(--space-5), 3vw, var(--space-6));
}
.journal-post--feature .journal-post__body {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: clamp(var(--space-5), 4vw, var(--space-8));
  align-items: start;
  text-align: left;
}
.journal-post--feature .journal-post__meta {
  grid-column: 1 / -1;                      /* meta bar spans full width */
}
.journal-post--feature .journal-post__title {
  grid-column: 1;
  margin: 0;
}
.journal-post--feature .journal-post__excerpt {
  grid-column: 2;
  margin: 0;
}
.journal-post--feature .journal-post__cta {
  grid-column: 2;
  align-self: start;
  margin-top: var(--space-2);
}
@media (max-width: 860px) {
  .journal-post--feature .journal-post__media { aspect-ratio: 16 / 9; }
  .journal-post--feature .journal-post__body {
    grid-template-columns: 1fr;
    gap: var(--space-4);
  }
  .journal-post--feature .journal-post__title,
  .journal-post--feature .journal-post__excerpt,
  .journal-post--feature .journal-post__cta {
    grid-column: 1;
  }
}
.journal-post__media {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: 0;                  /* sharp corners per brand discipline */
  background: var(--color-paper-soft);
  margin-bottom: var(--space-4);
  border: 1px solid rgba(0,0,0,0.06);
}
.journal-post--feature .journal-post__media {
  aspect-ratio: 21 / 9;
}
.journal-post__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1) translateZ(0);
  transition: transform 1400ms cubic-bezier(0.22, 0.8, 0.24, 1);
  filter: brightness(0.96);
}
.journal-post:hover .journal-post__media img {
  transform: scale(1.035) translateZ(0);
  filter: brightness(1);
}
/* Subtle glass — translucent white, soft border, backdrop-blur. Reads as light glass. */
.journal-post__tag {
  position: absolute;
  top: 16px; left: 16px;
  padding: 6px 12px;
  background: rgba(255,255,255,0.18);
  backdrop-filter: blur(12px) saturate(1.2);
  -webkit-backdrop-filter: blur(12px) saturate(1.2);
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.26em;
  text-transform: uppercase;
  border: 1px solid rgba(255,255,255,0.35);
  text-shadow: 0 1px 6px rgba(0,0,0,0.4);
}
.journal-post__body { display: flex; flex-direction: column; gap: var(--space-3); }
.journal-post--feature .journal-post__body { max-width: 64ch; }
.journal-post__meta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.journal-post__dot {
  width: 3px; height: 3px;
  border-radius: 50%;
  background: var(--color-text-muted);
  opacity: 0.6;
}
.journal-post__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.25rem, 1.8vw, 1.625rem);
  line-height: 1.2;
  letter-spacing: -0.005em;
  color: var(--color-text);
}
.journal-post--feature .journal-post__title {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.1;
  max-width: 26ch;
}
.journal-post__excerpt {
  margin: 0;
  max-width: 60ch;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: var(--color-text-muted);
}
.journal-post__cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: var(--space-2);
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-text);
  padding-bottom: 4px;
  border-bottom: 1px solid var(--color-text);
  align-self: flex-start;
  transition: gap 320ms var(--motion-ease);
}
.journal-post__cta svg {
  width: 12px; height: 12px;
  color: currentColor;
}
.journal-post:hover .journal-post__cta { gap: 12px; }

/* Centred foot — big button stodio-style, nothing else */
.journal__foot {
  margin-top: clamp(var(--space-8), 6vw, var(--space-10));
  display: flex;
  justify-content: center;
}

/* ---------- Blog (deprecated, kept for safety) ---------- */
.blog__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-6);
}
.post__frame {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-md);
  background: var(--color-paper-alt);
  margin-bottom: var(--space-4);
}
.post__meta { display: flex; gap: var(--space-3); font-size: var(--fs-sm); color: var(--color-text-muted); margin-bottom: var(--space-2); }
.post__title { font-family: var(--font-display); font-size: 1.25rem; font-weight: 500; letter-spacing: var(--tr-tight); }
@media (max-width: 840px) { .blog__grid { grid-template-columns: 1fr; } }

/* ---------- CTA strip ---------- */
.cta-strip { background: var(--color-ink); color: var(--color-text-invert); text-align: center; }
.cta-strip .display { color: var(--color-text-invert); max-width: 18ch; margin-inline: auto; }
.cta-strip__actions { display: inline-flex; gap: var(--space-3); margin-top: var(--space-6); }

/* ---------- Footer (DARK with ambient image) ----------
   Layout: top-grid (newsletter + 3 nav cols) → oversized transparent wordmark
   strip → micro-bar. Villa backdrop sits behind a heavy dark gradient so text
   stays readable while the image reads as editorial atmosphere. Wordmark is
   semi-transparent white so it blends into the image rather than sitting on it. */
.footer {
  position: relative;
  color: rgba(255,255,255,0.74);
  padding-block: clamp(var(--space-8), 8vw, var(--space-10)) var(--space-4);
  border-top: 1px solid rgba(255,255,255,0.08);
  background-color: #050505;
  background-image:
    linear-gradient(180deg,
      rgba(5, 5, 5, 0.94) 0%,
      rgba(5, 5, 5, 0.86) 35%,
      rgba(5, 5, 5, 0.82) 65%,
      rgba(5, 5, 5, 0.94) 100%),
    url("../assets/portfolio/villa-rafaella-10.jpg");
  background-size: auto, cover;
  background-position: center, center 30%;
  background-repeat: no-repeat, no-repeat;
  overflow: hidden;
}
.footer > .container,
.footer > .footer__wordmark { position: relative; z-index: 2; }
.footer__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 2fr);
  gap: clamp(var(--space-7), 6vw, var(--space-9));
  padding-bottom: clamp(var(--space-7), 5vw, var(--space-9));
  border-bottom: 1px solid rgba(255,255,255,0.08);
}
.footer__news { max-width: 44ch; }
.footer .eyebrow { color: rgba(255,255,255,0.55); }
.footer__news-title {
  margin: var(--space-3) 0 var(--space-4);
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.5rem, 2.4vw, 2.125rem);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: #fff;
}
.footer__news-title em {
  font-style: italic;
  color: rgba(255,255,255,0.62);
}
.footer__news-lede {
  margin: 0 0 var(--space-5);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: rgba(255,255,255,0.6);
}
.footer__news-form {
  display: flex;
  align-items: stretch;
  gap: var(--space-3);
  border-bottom: 1px solid rgba(255,255,255,0.22);
  padding-bottom: 10px;
  max-width: 460px;
}
.footer__news-form input {
  flex: 1;
  background: transparent;
  border: 0; outline: 0;
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.02em;
  padding: 6px 0;
}
.footer__news-form input::placeholder { color: rgba(255,255,255,0.38); }
.footer__news-form button {
  appearance: none;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.3);
  width: 44px; height: 44px;
  cursor: pointer;
  color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition: background-color 320ms var(--motion-ease),
              border-color 320ms var(--motion-ease),
              color 320ms var(--motion-ease);
}
.footer__news-form button:hover {
  background: #fff;
  color: #000;
  border-color: #fff;
}
.footer__news-form button svg { width: 14px; height: 14px; }

.footer__nav {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(var(--space-6), 5vw, var(--space-8));
}
.footer__col h4 {
  margin: 0 0 var(--space-5);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-medium);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.5);
}
.footer__col ul {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 10px;
}
.footer__col a {
  color: rgba(255,255,255,0.82);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  text-decoration: none;
  transition: color 280ms var(--motion-ease);
}
.footer__col li {
  color: rgba(255,255,255,0.72);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
}
.footer__col a:hover { color: #fff; }

/* Signature box — wordmark + hairline + micro-bar locked to the same width.
   One coherent block. Wordmark is a transparent watermark over the villa image;
   the hairline sits exactly at the wordmark edges because both share width.
   Tight vertical spacing so the block reads as a unit, not three stacked pieces. */
.footer__sig {
  margin-top: clamp(var(--space-6), 4vw, var(--space-8));
}
.footer__wordmark {
  margin: 0;
  line-height: 0;
  pointer-events: none;
}
.footer__wordmark img {
  width: 100%;
  height: auto;
  display: block;
  opacity: 0.22;                /* watermark — lets the villa image read through */
  filter: brightness(1.2);
}

.footer__bottom {
  padding-top: clamp(var(--space-4), 2vw, var(--space-5));
  margin-top: clamp(var(--space-3), 1.5vw, var(--space-4));
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-5);
  border-top: 1px solid rgba(255,255,255,0.24);
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.08em;
  color: rgba(255,255,255,0.56);
}
.footer__copy { flex: 0 0 auto; }
.footer__legal {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: var(--space-5);
  flex: 1 1 auto;
  justify-content: center;
}
.footer__legal a {
  color: rgba(255,255,255,0.56);
  text-decoration: none;
  transition: color 280ms var(--motion-ease);
}
.footer__legal a:hover { color: #fff; }

/* Socials as text-link list — luxury editorial, not icon set. Same typographic
   weight as the copyright line. Animated underline on hover (reveal + travel). */
.footer__socials {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap;
  gap: var(--space-4);
  flex: 0 0 auto;
}

/* Generic animated-underline link used by legal + socials in the micro-bar */
.footer__link {
  position: relative;
  color: rgba(255,255,255,0.7);
  text-decoration: none;
  transition: color 300ms var(--motion-ease);
}
.footer__link::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -3px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.footer__link:hover {
  color: #fff;
}
.footer__link:hover::after {
  transform: scaleX(1);
  transform-origin: left;
}
.footer__legal a { color: inherit; }  /* old selector override — now uses .footer__link */

/* Live "Athens HH:MM" pulse — small italic timestamp with a breathing dot.
   Reads like a studio status indicator rather than a gimmick. */
.footer__pulse {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: 0.875rem;
  letter-spacing: 0.02em;
  color: rgba(255,255,255,0.78);
  font-variant-numeric: tabular-nums;
  flex: 0 0 auto;
  white-space: nowrap;
}
.footer__pulse-dot {
  width: 6px; height: 6px;
  background: #bfe0c2;
  border-radius: 999px;
  box-shadow: 0 0 10px rgba(191,224,194,0.6);
  animation: footer-pulse 2400ms ease-in-out infinite;
  flex: 0 0 auto;
}
.footer__pulse-sep { opacity: 0.55; }
.footer__pulse time { color: #fff; font-style: italic; }
@keyframes footer-pulse {
  0%, 100% { opacity: 0.55; transform: scale(1); }
  50%      { opacity: 1;    transform: scale(1.15); }
}
@media (prefers-reduced-motion: reduce) {
  .footer__pulse-dot { animation: none; }
}

@media (max-width: 900px) {
  .footer__grid { grid-template-columns: 1fr; gap: var(--space-7); }
  .footer__nav { grid-template-columns: repeat(2, 1fr); gap: var(--space-6); }
  .footer__bottom {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-4);
  }
  .footer__legal { justify-content: flex-start; }
}

/* ---------- OPTION B — stodio-inspired alternate footer (for comparison) ---------- */
.altfooter-banner {
  background: #fff;
  color: #0a0a0a;
  padding: 20px 24px;
  text-align: center;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  font-weight: var(--fw-medium);
  border-top: 1px solid rgba(0,0,0,0.08);
  border-bottom: 1px solid rgba(0,0,0,0.08);
}
.altfooter {
  position: relative;
  margin: 24px;
  padding: clamp(40px, 5vw, 72px) clamp(28px, 5vw, 64px) clamp(24px, 3vw, 40px);
  background: #0a0a0a;
  color: #fff;
  overflow: hidden;
  isolation: isolate;
  /* Sharp edges — matches the site discipline (all zero radii) */
}
/* Cursor-tracking spotlight — a soft radial that follows the mouse with lerp
   (slower trailing). CSS vars driven by JS (see main.js altfooter block). */
.altfooter__spot {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(
    circle 640px at var(--mx, 50%) var(--my, 50%),
    rgba(255,255,255,0.18),
    rgba(255,255,255,0.06) 30%,
    transparent 62%
  );
  opacity: 0;
  transition: opacity 900ms var(--motion-ease);
  z-index: 0;
}
.altfooter:hover .altfooter__spot { opacity: 1; }
.altfooter__inner {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: clamp(32px, 4vw, 56px);
}

/* Top zone — newsletter + socials (left) · 3 nav columns (right) */
.altfooter__top {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr);
  gap: clamp(40px, 6vw, 80px);
  align-items: start;
}
.altfooter__news { max-width: 44ch; }
.altfooter__news-title {
  margin: 0 0 var(--space-3);
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(1.5rem, 2.4vw, 2.125rem);
  line-height: 1.12;
  letter-spacing: -0.01em;
  color: #fff;
}
.altfooter__news-title em { font-style: italic; color: rgba(255,255,255,0.62); }
.altfooter__news-lede {
  margin: 0 0 var(--space-5);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  line-height: 1.55;
  color: rgba(255,255,255,0.6);
}
/* Sharp newsletter — bordered rectangle, no pill. Submit button = sharp square
   that inverts on hover, arrow slides the same way the .btn-ct system does. */
.altfooter__news-form {
  display: flex;
  align-items: stretch;
  gap: 8px;
  padding: 4px 4px 4px 20px;
  border: 1px solid rgba(255,255,255,0.22);
  max-width: 440px;
  margin-bottom: var(--space-5);
  position: relative;
}
.altfooter__news-bot { position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; }
.altfooter__news-form input {
  flex: 1;
  background: transparent; border: 0; outline: 0;
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  padding: 10px 0;
}
.altfooter__news-form input::placeholder { color: rgba(255,255,255,0.42); }
.altfooter__news-form button {
  appearance: none;
  background: #fff;
  color: #0a0a0a;
  border: 0;
  width: 44px; height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  overflow: hidden;
  transition: background 320ms var(--motion-ease);
}
.altfooter__news-form button svg {
  width: 16px; height: 16px;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.altfooter__news-form button:hover { background: #e6e6e6; }
/* Arrow slides up + right on hover — same motion language as the .btn-ct buttons */
.altfooter__news-form button:hover svg {
  transform: translate(3px, -3px);
}

/* Submit-status line for the newsletter form. Lives outside the bordered
   pill so the input + button row stays clean; absolute-positioned just
   beneath the form. */
.altfooter__news-status {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  right: 0;
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.02em;
  color: rgba(255,255,255,0.62);
  min-height: 1.2em;
}
.altfooter__news-status:empty { display: none; }
.altfooter__news-status[data-state="ok"] { color: rgba(255,255,255,0.92); }
.altfooter__news-status[data-state="error"] { color: rgba(255,200,200,0.92); }

/* Socials as horizontal text names — Instagram · TikTok · LinkedIn · YouTube.
   Animated underline on hover (same motion language as the nav links above). */
.altfooter__socials {
  list-style: none;
  margin: var(--space-5) 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-4), 2.5vw, var(--space-5));
}
.altfooter__socials a {
  position: relative;
  display: inline-block;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.02em;
  color: rgba(255,255,255,0.82);
  text-decoration: none;
  transition: color 300ms var(--motion-ease);
}
.altfooter__socials a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.altfooter__socials a:hover { color: #fff; }
.altfooter__socials a:hover::after { transform: scaleX(1); transform-origin: left; }

/* Newsletter kicker — matches the site's eyebrow treatment */
.altfooter__news-kicker {
  display: inline-block;
  margin-bottom: var(--space-3);
  color: rgba(255,255,255,0.55);
}

/* Nav columns — each has a small UPPERCASE title + link list underneath */
.altfooter__nav {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(24px, 3vw, 48px);
}
.altfooter__col { display: flex; flex-direction: column; }
.altfooter__col-title {
  margin: 0 0 var(--space-5);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-medium);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.48);
}
.altfooter__nav ul {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 12px;
}
.altfooter__nav a,
.altfooter__nav a:link,
.altfooter__nav a:visited,
.altfooter__nav a:hover,
.altfooter__nav a:active,
.altfooter__nav li {
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.82);
  text-decoration: none;
  line-height: 1.4;
  -webkit-tap-highlight-color: transparent;
}
.altfooter__nav li { color: rgba(255,255,255,0.72); }
/* tel: and mailto: links inherit a UA-default dark visited colour on
   dark backgrounds across iOS Safari and some Android browsers. The
   tel: phone link in the Connect column was rendering nearly black,
   which made the number invisible against the ink footer. We override
   every state explicitly with !important so no UA stylesheet wins. */
.altfooter__nav a[href^="tel:"],
.altfooter__nav a[href^="tel:"]:link,
.altfooter__nav a[href^="tel:"]:visited,
.altfooter__nav a[href^="tel:"]:hover,
.altfooter__nav a[href^="tel:"]:active,
.altfooter__nav a[href^="mailto:"],
.altfooter__nav a[href^="mailto:"]:link,
.altfooter__nav a[href^="mailto:"]:visited,
.altfooter__nav a[href^="mailto:"]:hover,
.altfooter__nav a[href^="mailto:"]:active {
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
}
.altfooter__nav a[href^="tel:"]:hover,
.altfooter__nav a[href^="mailto:"]:hover {
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
  opacity: 0.92;
}
/* Animated underline on link hover — same motion language as footer__link */
.altfooter__nav a {
  position: relative;
  display: inline-block;
  transition: color 300ms var(--motion-ease);
}
.altfooter__nav a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.altfooter__nav a:hover {
  color: #fff;
}
.altfooter__nav a:hover::after {
  transform: scaleX(1);
  transform-origin: left;
}

/* Massive wordmark, full width of the card, white. The wordmark is now
   wrapped in an anchor so the footer logo doubles as a return-home
   link. The block-level hit area covers the whole image. */
.altfooter__wordmark {
  line-height: 0;
  opacity: 0.95;
}
.altfooter__wordmark-link {
  display: block;
  width: 100%;
  line-height: 0;
  transition: opacity 320ms var(--motion-ease);
}
.altfooter__wordmark-link:hover { opacity: 0.78; }
.altfooter__wordmark img {
  width: 100%;
  height: auto;
  display: block;
}

/* Bottom bar — copyright + clock on LEFT, social pills on RIGHT. */
.altfooter__bottom {
  padding-top: clamp(var(--space-4), 2vw, var(--space-5));
  margin-top: clamp(var(--space-3), 1.5vw, var(--space-4));
  border-top: 1px solid rgba(255,255,255,0.14);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-5);
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.08em;
  color: rgba(255,255,255,0.55);
}
.altfooter__bottom-left {
  display: inline-flex;
  align-items: center;
  gap: var(--space-5);
  flex-wrap: wrap;
}
.altfooter__legal {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap;
  gap: var(--space-4);
}
.altfooter__legal a {
  color: rgba(255,255,255,0.55);
  text-decoration: none;
  transition: color 280ms var(--motion-ease);
}
.altfooter__legal a:hover { color: #fff; }

/* Clock bottom-right — NORMAL font (not italic), regular body typography */
.altfooter__pulse {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-style: normal;
  font-weight: var(--fw-light);
  font-size: 0.8125rem;
  letter-spacing: 0.08em;
  color: rgba(255,255,255,0.82);
  font-variant-numeric: tabular-nums;
}
/* Rhombus mark — replaces the circle dot. Sharp, same breathing animation,
   matches the site's eyebrow marker vocabulary. */
.altfooter__pulse-mark {
  width: 7px; height: 7px;
  background: currentColor;
  transform: rotate(45deg);
  animation: footer-pulse 2400ms ease-in-out infinite;
  color: rgba(255,255,255,0.82);
  flex: 0 0 auto;
}
.altfooter__pulse-sep { opacity: 0.55; }

/* ===========================================================
   Standardised editorial pulse meta. Used on Approach, About,
   Journal and Contact only (Home, Case Studies and Projects
   keep their own footer signature). The bar carries:
     bottom-left :  rhombus + "Athens, Greece"
     bottom-right:  time + rhombus
   Mirrors the about-hero meta chips so the pages share one
   visual vocabulary for location + time of day.
   =========================================================== */
.altfooter__bottom--meta {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: clamp(var(--space-4), 2vw, var(--space-6));
}
.altfooter__bottom--meta .altfooter__copy {
  text-align: center;
  color: rgba(255,255,255,0.45);
  font-size: 0.6875rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.altfooter__chip {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.78);
  font-variant-numeric: tabular-nums;
}
.altfooter__chip--left  { justify-self: start; }
.altfooter__chip--right { justify-self: end; }
.altfooter__chip-mark {
  width: 7px; height: 7px;
  background: currentColor;
  transform: rotate(45deg);
  display: inline-block;
  flex: 0 0 auto;
  animation: footer-pulse 2400ms ease-in-out infinite;
}
@media (max-width: 720px) {
  .altfooter__bottom--meta {
    grid-template-columns: 1fr;
    justify-items: start;
    gap: var(--space-3);
  }
  .altfooter__bottom--meta .altfooter__copy { text-align: left; }
  .altfooter__chip--left,
  .altfooter__chip--right { justify-self: start; }
}
@media (prefers-reduced-motion: reduce) {
  .altfooter__chip-mark { animation: none; }
}

@media (max-width: 900px) {
  .altfooter { margin: 16px; padding: 40px 24px 24px; border-radius: 14px; }
  .altfooter__top { grid-template-columns: 1fr; gap: 40px; }
  .altfooter__nav { grid-template-columns: repeat(2, 1fr); }
  .altfooter__bottom { flex-direction: column; align-items: flex-start; gap: var(--space-4); }
  .altfooter__bottom-left { gap: var(--space-4); }
}
@media (prefers-reduced-motion: reduce) {
  .altfooter__pulse-dot { animation: none; }
}

/* ---------- Scroll reveals ---------- */
.reveal {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--motion-slow) var(--motion-ease),
              transform var(--motion-slow) var(--motion-ease);
}
.reveal.is-visible { opacity: 1; transform: none; }

/* Softer reveal with blur + lift — used on counters */
.reveal-soft {
  opacity: 0;
  filter: blur(6px);
  transform: translateY(32px);
  transition: opacity 900ms var(--motion-ease),
              filter 900ms var(--motion-ease),
              transform 900ms var(--motion-ease);
  transition-delay: var(--reveal-delay, 0ms);
}
.reveal-soft.is-visible { opacity: 1; filter: blur(0); transform: none; }

/* Word-by-word reveal (applied by JS to .split-words) */
.split-words .word {
  display: inline-block;
  opacity: 0;
  filter: blur(6px);
  transform: translateY(0.5em);
  transition: opacity 700ms var(--motion-ease),
              filter 700ms var(--motion-ease),
              transform 700ms var(--motion-ease);
  transition-delay: calc(var(--word-index, 0) * 60ms);
}
.split-words.is-visible .word { opacity: 1; filter: blur(0); transform: none; }
.split-words em { font-style: normal; color: var(--color-text-muted); }
.display em.text-mute,
.split-words em.text-mute { color: var(--color-text-muted); font-style: normal; }

/* ============================================================================
   ABOUT PAGE
   Dedicated second page at /about.html. Reuses all shared chrome (preloader,
   page-frame, nav, altfooter, split-words, .reveal) and adds sections below:
     1. .about-hero       — dark page-header with small image
     2. .about-story      — founder narrative + pull quote
     3. .about-stats      — 4 locked numbers (count-up via data-count)
     4. .about-founders   — 2 portrait cards side by side
     5. .about-team-note  — single-paragraph team mention
     6. .about-values     — 4 principle-pairs
     7. .about-approach-tease — linked promo for /approach
     8. .about-cta        — final invitation
   ========================================================================= */

/* ---- 1. ABOUT HERO — CENTERED "About" on full-bleed photo ---- */
.about-hero {
  background: #050505;
  position: relative;
}
.about-hero__panel {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding: clamp(var(--space-5), 3vw, var(--space-7)) clamp(var(--space-5), 4vw, var(--space-8));
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  isolation: isolate;
  min-height: 100vh;
}
.about-hero__bg {
  position: absolute;
  inset: 0;
  background-image: url("../assets/about-studio-a.jpg");
  /* Stretch to fill the full panel rect on every inner-page hero. We
     used `cover` previously, which kept aspect — but each source has a
     different native ratio, so the framing read differently on About
     vs Approach vs Journal vs Contact. 100% 100% forces an identical
     box on all four pages, so the bottom-left location chip and the
     bottom-right time chip land at the same coordinate every time. */
  background-size: 100% 100%;
  background-position: center;
  background-repeat: no-repeat;
  z-index: -2;
  opacity: 1;
  transform: scale(1.04);
  will-change: transform;
  transition: transform 900ms cubic-bezier(0.16, 1, 0.3, 1) 200ms;
}
body:not(.is-preloading) .about-hero__bg { transform: scale(1); }

/* Optional Vimeo hero video — sits as the page hero background. When a video
   is present we hide the static bg image (no double-stacking) and let the
   video play at full opacity; the radial overlay alone provides the shadow
   for text legibility. */
.about-hero__panel:has(.about-hero__video-wrap) .about-hero__bg {
  display: none;
}
.about-hero__video-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: -2;
  pointer-events: none;
  opacity: 1;
}
.about-hero__video {
  position: absolute;
  top: 50%; left: 50%;
  width: max(100%, calc(100vh * 16 / 9));
  height: max(100%, calc(100vw * 9 / 16));
  transform: translate(-50%, -50%);
  border: 0;
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  .about-hero__video-wrap { display: none; }
}
/* Hero overlay — diffuse shadow over the image so the white headline
   and kicker read cleanly. Deeper top + bottom bands, stronger central
   tint, no photo bleach. Applies to about / approach / journal / contact
   inner-page heroes. */
.about-hero__overlay {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(to bottom, rgba(10,10,10,0.78) 0%, rgba(10,10,10,0.40) 22%, rgba(10,10,10,0.40) 78%, rgba(10,10,10,0.72) 100%),
    rgba(10,10,10,0.55);
  z-index: -1;
}
/* Video variant — deeper still for moving footage legibility. */
.about-hero__panel:has(.about-hero__video-wrap) .about-hero__overlay {
  background:
    linear-gradient(to bottom, rgba(10,10,10,0.70) 0%, rgba(10,10,10,0.30) 24%, rgba(10,10,10,0.30) 76%, rgba(10,10,10,0.62) 100%),
    rgba(10,10,10,0.44);
}
/* Centered stack — sits in the middle of the viewport */
.about-hero__center {
  position: relative;
  z-index: 2;
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: clamp(var(--space-8), 12vh, 14rem) clamp(var(--space-5), 4vw, var(--space-7));
  max-width: 58ch;
  margin: 0 auto;
}
.about-hero__eyebrow {
  color: rgba(255,255,255,0.72);
  margin-bottom: clamp(var(--space-5), 4vw, var(--space-6));
}
.about-hero__display {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(2.25rem, 4.8vw, 4.5rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0 0 clamp(var(--space-5), 3vw, var(--space-6));
  color: var(--color-text-invert);
  max-width: 28ch;
}
/* Forced 2-line variant — each .hero-line span breaks onto its own line
   regardless of viewport width. Used on journal hero + similar 2-line
   editorial displays. Inner .word spans (added by split-words JS) stay
   inline within their parent .hero-line. */
.about-hero__display--2lines {
  max-width: none;
}
.about-hero__display .hero-line {
  display: block;
}
.about-hero__display em {
  font-style: italic;
  font-weight: var(--fw-thin, 200);
  color: rgba(255,255,255,0.72);
}
.about-hero__kicker {
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.78);
  max-width: 54ch;
  margin: 0 0 clamp(var(--space-6), 4vw, var(--space-7));
}
.about-hero__ctas {
  display: flex;
  flex-wrap: nowrap;                  /* horizontal ALWAYS, never stacked */
  justify-content: center;
  align-items: center;
  gap: clamp(var(--space-5), 3vw, var(--space-6));
}
@media (max-width: 520px) {
  .about-hero__ctas { flex-wrap: wrap; gap: var(--space-4); }
}
/* Meta chips — editorial tags overlaid bottom-left / bottom-right */
.about-hero__meta {
  position: absolute;
  bottom: clamp(var(--space-6), 4vw, var(--space-7));
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.72);
  z-index: 2;
}
.about-hero__meta em { font-style: italic; font-weight: 300; color: rgba(255,255,255,0.82); }
.about-hero__meta--left  { left: clamp(var(--space-5), 4vw, var(--space-8)); }
.about-hero__meta--right { right: clamp(var(--space-5), 4vw, var(--space-8)); }
/* Editorial top-left masthead: live date chip. Same typography as the
   bottom chips, anchored to the top edge instead of the bottom. */
.about-hero__meta--top-left {
  top: clamp(var(--space-6), 4vw, var(--space-7));
  left: clamp(var(--space-5), 4vw, var(--space-8));
  bottom: auto;
}
.about-hero__meta--top-right {
  top: clamp(var(--space-6), 4vw, var(--space-7));
  right: clamp(var(--space-5), 4vw, var(--space-8));
  bottom: auto;
}
.about-hero__meta-mark {
  width: 7px; height: 7px;
  background: currentColor;
  transform: rotate(45deg);
  display: inline-block;
  flex: 0 0 auto;
}
/* Live pulse — 1s cycle, in time with the seconds tick. Subtle scale +
   opacity wave so the chip reads as "live" without a hard blink. Honours
   prefers-reduced-motion. */
.about-hero__meta-mark--pulse {
  animation: hero-mark-pulse 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite;
  transform-origin: center center;
}
@keyframes hero-mark-pulse {
  0%, 100% { transform: rotate(45deg) scale(1);    opacity: 0.86; }
  50%      { transform: rotate(45deg) scale(1.18); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .about-hero__meta-mark--pulse { animation: none; opacity: 0.92; }
}
/* Numeric tabular look for the time span so digits don't dance as they
   tick second-by-second. */
.about-hero__meta [data-clock],
.about-hero__meta [data-clock-athens] {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  color: rgba(255,255,255,0.92);
}
@media (max-width: 640px) {
  .about-hero__meta { font-size: 0.625rem; letter-spacing: 0.16em; }
}

/* ---- 2. ABOUT STORY — narrative + pull quote + 2-col split variant ---- */
.about-story {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-story__head {
  max-width: 58ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
/* Our Story — simplest possible wrap: 100% of the viewport width with a
   small horizontal padding. NO max-width cap. NO auto margins. Text spans
   the ENTIRE viewport minus the side padding. */
.about-story__wrap {
  width: 100%;
  max-width: none;
  margin: 0;
  padding-inline: clamp(24px, 4vw, 80px);
  box-sizing: border-box;
}

/* Plain full-width single-column prose. Smaller, more compact type per user
   feedback — text extends to the end of the wider container. */
.about-story__prose {
  display: grid;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  max-width: none;
  font-family: var(--font-body);
  font-size: clamp(0.875rem, 1vw, 1rem);
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.82);
}
.about-story__prose p { margin: 0; }
.about-story__prose strong { font-weight: var(--fw-medium, 500); color: var(--color-ink); }
.about-story__prose em { font-style: italic; color: var(--color-ink); }

/* Mission — distinct card below the story. Italic display block with
   a leading hairline and bigger type so it reads as a pull-statement. */
.about-mission {
  margin-top: clamp(var(--space-8), 6vw, var(--space-9));
  padding-top: clamp(var(--space-7), 5vw, var(--space-8));
  padding-bottom: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(10,10,10,0.12);
  border-bottom: 1px solid rgba(10,10,10,0.12);
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.2fr);
  gap: clamp(var(--space-5), 4vw, var(--space-7));
  align-items: start;
}
@media (max-width: 760px) {
  .about-mission { grid-template-columns: 1fr; gap: var(--space-4); }
}
.about-mission__eyebrow { color: rgba(10,10,10,0.58); }
.about-mission__body {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.25rem, 2.2vw, 1.75rem);
  line-height: 1.35;
  letter-spacing: -0.01em;
  color: var(--color-ink);
  max-width: 62ch;
}
.about-mission__body strong { font-weight: var(--fw-medium, 500); }
.about-mission__body em {
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.62);
}
.about-story__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-story__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.about-story__body {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  gap: clamp(var(--space-7), 5vw, var(--space-9));
  align-items: start;
}
@media (max-width: 900px) {
  .about-story__body { grid-template-columns: 1fr; }
}
.about-story__prose {
  font-family: var(--font-body);
  font-size: clamp(1rem, 1.2vw, 1.125rem);
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.82);
  display: grid;
  gap: var(--space-5);
  max-width: 58ch;
}
.about-story__prose em { font-style: italic; color: var(--color-ink); }
.about-story__quote {
  margin: 0;
  padding: clamp(var(--space-6), 3vw, var(--space-7));
  border: 1px solid rgba(10,10,10,0.1);
  background: var(--color-paper-soft, #f3f3f3);
  display: grid;
  gap: var(--space-4);
}
.about-story__quote-mark { width: 20px; height: 20px; color: var(--color-ink); opacity: 0.55; }
.about-story__quote blockquote {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 300;
  font-size: clamp(1.25rem, 1.8vw, 1.625rem);
  line-height: 1.3;
  letter-spacing: -0.01em;
  color: var(--color-ink);
}
.about-story__quote figcaption {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.56);
}

/* ---- 3. STATS — 4 locked numbers ---- */
.about-stats {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-8), 6vw, var(--space-9));
}
.about-stats__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}
@media (max-width: 900px) {
  .about-stats__grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-7); }
}
.about-stats__item {
  display: grid;
  gap: var(--space-2);
  padding-top: var(--space-4);
  border-top: 1px solid rgba(255,255,255,0.14);
}
.about-stats__num {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);          /* IvyPresto Display Thin */
  font-size: clamp(3rem, 5.4vw, 5rem);       /* bigger so the thin weight reads */
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--color-text-invert);
  font-variant-numeric: tabular-nums;
}
.about-stats__label {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.62);
}

/* ---- 4. FOUNDERS — 2 portrait cards ---- */
.about-founders {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-founders__head {
  max-width: 60ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-founders__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-founders__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.about-founders__head h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }
.about-founders__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.7);
  max-width: 56ch;
}
.about-founders__grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(var(--space-6), 4vw, var(--space-8));
}
@media (max-width: 900px) {
  .about-founders__grid { grid-template-columns: 1fr; }
}

.founder-card {
  border: 1px solid rgba(10,10,10,0.1);
  background: transparent;
  position: relative;
  isolation: isolate;
  transition: border-color 480ms var(--motion-ease);
}
.founder-card:hover { border-color: rgba(10,10,10,0.22); }
.founder-card__portrait {
  /* Smaller, tighter frame (4:5 portrait, max 280px wide) — the old 5:4
     landscape filled too much of the card. */
  width: clamp(180px, 24vw, 260px);
  aspect-ratio: 4 / 5;
  margin: clamp(var(--space-5), 3vw, var(--space-6)) clamp(var(--space-5), 3vw, var(--space-6)) 0;
  overflow: hidden;
  border: 1px solid rgba(10,10,10,0.1);
  filter: saturate(0.92);
}
.founder-card__portrait img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 900ms var(--motion-ease);
}
.founder-card:hover .founder-card__portrait img { transform: scale(1.03); }
.founder-card__body {
  padding: clamp(var(--space-5), 3vw, var(--space-6));
  position: relative;
}
.founder-card__num {
  position: absolute;
  top: var(--space-5);
  right: var(--space-5);
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.25rem, 2vw, 1.75rem);
  color: rgba(10,10,10,0.45);
  line-height: 1;
}
.founder-card__name {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin: 0 0 var(--space-2);
  color: var(--color-ink);
}
.founder-card__role {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.58);
  margin: 0 0 var(--space-4);
}
.founder-card__bio {
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.72);
  margin: 0 0 var(--space-5);
}
.founder-card__meta {
  list-style: none;
  margin: 0;
  padding: var(--space-4) 0 0;
  border-top: 1px solid rgba(10,10,10,0.1);
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.58);
}
.founder-card__meta li::before {
  content: "\25C6";                        /* rhombus marker */
  display: inline-block;
  margin-right: 8px;
  font-size: 7px;
  transform: translateY(-2px);
  color: rgba(10,10,10,0.62);
}
.founder-card__meta li {
  display: inline-flex;
  align-items: center;
}
/* Per-founder social icons — sits under the meta chips on every card */
.founder-card__socials {
  list-style: none;
  margin: var(--space-4) 0 0;
  padding: var(--space-4) 0 0;
  border-top: 1px solid rgba(10,10,10,0.08);
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
}
.founder-card__socials a {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.7);
  text-decoration: none;
  transition: color 320ms var(--motion-ease);
}
.founder-card__socials a:hover { color: var(--color-ink); }
.founder-card__socials svg {
  width: 15px;
  height: 15px;
  flex: 0 0 auto;
  transition: transform 360ms var(--motion-ease);
}
.founder-card__socials a:hover svg { transform: translateY(-2px); }
/* Placeholder sockets (URL pending) — muted + no transform on hover */
.founder-card__socials a[data-placeholder] {
  opacity: 0.42;
  cursor: default;
  pointer-events: none;
}

/* Standalone WhatsApp CTA — sits below the founder grid. Black pill with a
   WhatsApp glyph, two-line label (headline + number), trailing NE arrow.
   Clearly distinct from the personal IG/LinkedIn icons above. */
.about-founders__whatsapp {
  margin-top: clamp(var(--space-7), 5vw, var(--space-8));
  display: flex;
  justify-content: center;
}
.wa-button {
  display: inline-flex;
  align-items: center;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  padding: clamp(14px, 1.4vw, 18px) clamp(var(--space-5), 2.6vw, var(--space-6));
  background: var(--color-ink);
  color: var(--color-text-invert);
  text-decoration: none;
  border: 1px solid var(--color-ink);
  transition: background-color 420ms var(--motion-ease),
              transform 520ms var(--motion-ease);
}
.wa-button:hover {
  background: #1e1e1e;
  transform: translateY(-1px);
}
.wa-button__icon {
  width: 22px;
  height: 22px;
  color: #25d366;               /* WhatsApp green accent only on the glyph */
  flex: 0 0 auto;
}
.wa-button__label {
  display: flex;
  flex-direction: column;
  gap: 2px;
  line-height: 1.2;
}
.wa-button__line {
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-medium, 500);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.wa-button__sub {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
}
.wa-button__arrow {
  width: 14px;
  height: 14px;
  color: currentColor;
  flex: 0 0 auto;
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.wa-button:hover .wa-button__arrow { transform: translate(3px, -3px); }

/* ---- ABOUT page Press Features — generous head-to-card spacing ----
   Light-grey panel (matches .about-approach) so the editorial card
   separates clearly from the white sections above and below. */
.about-press-features {
  background: var(--color-paper-soft, #f3f3f3);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-press-features__head {
  max-width: 64ch;
  /* Extra bottom margin so the Luxury Playbook card sits clearly below
     the title, not crowded against it. User explicitly asked for more
     breathing room here. */
  margin-bottom: clamp(var(--space-8), 7vw, 7rem);
}
.about-press-features__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-press-features__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.about-press-features__head h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }

/* ---- ABOUT REVIEWS — static minimal dark grid (distinct from homepage) ---- */
.about-reviews {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-reviews__head {
  max-width: 58ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-reviews__head .eyebrow { color: rgba(255,255,255,0.58); }
.about-reviews__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  color: var(--color-text-invert);
}
.about-reviews__head h2 em { font-style: italic; font-weight: 200; color: rgba(255,255,255,0.55); }
.about-reviews__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.7);
  max-width: 54ch;
}
.about-reviews__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0;
  border-top: 1px solid rgba(255,255,255,0.14);
}
@media (max-width: 760px) {
  .about-reviews__grid { grid-template-columns: 1fr; }
}
.review-card {
  padding: clamp(var(--space-6), 3vw, var(--space-7)) clamp(var(--space-5), 3vw, var(--space-6));
  border-bottom: 1px solid rgba(255,255,255,0.14);
  border-right: 1px solid rgba(255,255,255,0.14);
  display: grid;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  position: relative;
}
.review-card:nth-child(2n) { border-right: 0; }
@media (max-width: 760px) {
  .review-card { border-right: 0; }
}
.review-card__source {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.48);
}
.review-card blockquote {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-style: italic;
  font-size: clamp(1.125rem, 1.7vw, 1.375rem);
  line-height: 1.35;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
  max-width: 42ch;
}
.review-card cite {
  font-style: normal;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 14px;
  align-items: baseline;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.68);
}
.review-card__name { color: var(--color-text-invert); }
.review-card__org  { color: rgba(255,255,255,0.52); position: relative; }
.review-card__org::before {
  content: "\25C6";
  display: inline-block;
  margin-right: 8px;
  font-size: 6px;
  color: rgba(255,255,255,0.36);
  transform: translateY(-3px);
}

/* Editorial separator between two adjacent About sections — used before
   the Apply-for-engagement globe section so it sits distinctly from the
   press-features row above it. A tall dark band with a centered hairline
   + small rhombus mark. */
.about-section-sep {
  background: var(--color-ink);
  height: clamp(80px, 10vw, 140px);
  position: relative;
  display: block;
}
.about-section-sep::before,
.about-section-sep::after {
  content: "";
  position: absolute;
  top: 50%;
  width: clamp(80px, 14vw, 200px);
  height: 1px;
  background: rgba(255,255,255,0.16);
}
.about-section-sep::before { left: calc(50% - clamp(100px, 16vw, 220px)); }
.about-section-sep::after  { right: calc(50% - clamp(100px, 16vw, 220px)); }
.about-section-sep::marker { display: none; }
/* Centered rhombus mark via a child span placed with ::before on the
   parent wouldn't work, so we paint one using box-shadow trick — but
   simplest: drop an inline element. Instead, use a gradient-line trick: */
.about-section-sep {
  background:
    var(--color-ink)
    linear-gradient(180deg, var(--color-ink), var(--color-ink)) no-repeat;
}
/* Small rhombus dot at the exact center */
.about-section-sep::before {
  /* override to place dot instead — keep the left hairline via another pseudo */
}

/* Reset the dual-pseudo approach: do it with ONE element carrying a
   pseudo dot + two hairlines via radial-gradient / linear-gradient layers. */
.about-section-sep {
  background-color: var(--color-ink);
  background-image:
    /* left hairline */
    linear-gradient(90deg, transparent 0%, transparent calc(50% - 100px), rgba(255,255,255,0.18) calc(50% - 100px), rgba(255,255,255,0.18) calc(50% - 14px), transparent calc(50% - 14px)),
    /* right hairline */
    linear-gradient(90deg, transparent 0%, transparent calc(50% + 14px), rgba(255,255,255,0.18) calc(50% + 14px), rgba(255,255,255,0.18) calc(50% + 100px), transparent calc(50% + 100px));
  background-position: center center, center center;
  background-size: 100% 1px, 100% 1px;
  background-repeat: no-repeat;
}
/* Rhombus dot at the center */
.about-section-sep::before,
.about-section-sep::after { content: none; }
.about-section-sep {
  position: relative;
}
.about-section-sep::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 8px; height: 8px;
  background: rgba(255,255,255,0.42);
  transform: translate(-50%, -50%) rotate(45deg);
}

/* Team note — single paragraph under the founder grid. */
.about-team-note {
  margin-top: clamp(var(--space-7), 5vw, var(--space-8));
  max-width: 68ch;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1vw, 1rem);
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.72);
  padding-top: var(--space-5);
  border-top: 1px solid rgba(10,10,10,0.1);
}
.about-team-note strong { font-weight: var(--fw-medium, 500); color: var(--color-ink); }

/* ---- 5. VALUES — 4 principle-pairs ---- */
.about-values {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-values__head {
  max-width: 62ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-values__head .eyebrow { color: rgba(255,255,255,0.58); }
.about-values__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
}
.about-values__head h2 em {
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.55);
}
.about-values__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.7);
  max-width: 58ch;
}
.about-values__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(var(--space-6), 3vw, var(--space-7));
}
@media (max-width: 760px) {
  .about-values__list { grid-template-columns: 1fr; }
}
.value-item {
  padding: clamp(var(--space-5), 3vw, var(--space-6)) 0;
  border-top: 1px solid rgba(255,255,255,0.14);
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr;
  column-gap: var(--space-6);
  row-gap: var(--space-3);
}
.value-item__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  line-height: 1;
  color: rgba(255,255,255,0.35);
  grid-row: span 2;
}
.value-item__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
}
.value-item__title em {
  font-style: normal;
  color: rgba(255,255,255,0.42);
  margin: 0 6px;
  font-weight: 200;
}
.value-item__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.72);
  max-width: 42ch;
}

/* ---- 6. APPROACH TEASE — horizontal ---- */
.about-approach-tease {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-8), 6vw, var(--space-9));
}
.about-approach-tease__inner {
  display: grid;
  grid-template-columns: minmax(0, 1.6fr) auto;
  gap: clamp(var(--space-7), 5vw, var(--space-9));
  align-items: end;
  padding-block: clamp(var(--space-6), 3vw, var(--space-7));
  border-top: 1px solid rgba(10,10,10,0.1);
  border-bottom: 1px solid rgba(10,10,10,0.1);
}
@media (max-width: 760px) {
  .about-approach-tease__inner { grid-template-columns: 1fr; align-items: start; }
}
.about-approach-tease__title {
  margin: var(--space-3) 0 var(--space-4);
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.1;
  max-width: 22ch;
}
.about-approach-tease__title em {
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.55);
}
.about-approach-tease__text p {
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1vw, 1rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.72);
  max-width: 54ch;
}

/* ---- 7. CTA — centered final invitation ---- */
.about-cta {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, 10rem);
}
.about-cta__inner {
  max-width: 52ch;
  margin-inline: auto;
  text-align: center;
  display: grid;
  gap: clamp(var(--space-6), 4vw, var(--space-7));
}
.about-cta__inner h2 {
  font-size: clamp(2rem, 3.8vw, 3.2rem);
  line-height: 1.08;
  letter-spacing: -0.02em;
}
.about-cta__inner h2 em {
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.55);
}
.about-cta__buttons {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: var(--space-5);
}
.about-cta__note {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.5);
}

/* Light-bg variant of .btn-ct — swaps white defaults to ink for use on
   paper sections (about-approach-tease, about-cta). */
.btn-ct--on-light { color: var(--color-ink); }
.btn-ct--on-light.btn-ct--glass {
  border: 1px solid rgba(10,10,10,0.22);
  padding: 14px 22px;
  background: rgba(10,10,10,0.03);
}
.btn-ct--on-light.btn-ct--glass:hover { background: rgba(10,10,10,0.06); border-color: rgba(10,10,10,0.42); }
.btn-ct--on-light.btn-ct--quiet { color: var(--color-ink); }

/* ============================================================================
   ABOUT — EXPANDED SECTIONS (manifesto · pillars · rules · exclusions · clients)
   ========================================================================= */

/* ---- Manifesto pull quote (DARK) — one dramatic editorial line ---- */
.about-manifesto {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 9vw, 10rem);
  position: relative;
  overflow: hidden;
}
.about-manifesto .container {
  max-width: 64ch;
  text-align: center;
}
.about-manifesto__quote {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.625rem, 3.4vw, 2.625rem);
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--color-text-invert);
  position: relative;
  padding-top: 0.4em;
}
.about-manifesto__quote em {
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.65);
}
.about-manifesto__open {
  position: absolute;
  top: -0.35em; left: -0.2em;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(4rem, 10vw, 8rem);
  line-height: 1;
  color: rgba(255,255,255,0.08);
  pointer-events: none;
}
.about-manifesto__attr {
  margin: clamp(var(--space-6), 4vw, var(--space-7)) auto 0;
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
}
.about-manifesto__rule {
  width: 40px;
  height: 1px;
  background: rgba(255,255,255,0.28);
  display: inline-block;
}

/* ---- What we do — 3 pillars (LIGHT) ---- */
.about-pillars {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-pillars__head {
  max-width: 66ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-pillars__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-pillars__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
}
.about-pillars__head h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }
.about-pillars__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.7);
  max-width: 58ch;
}
.about-pillars__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(var(--space-6), 3vw, var(--space-7));
}
@media (max-width: 900px) {
  .about-pillars__grid { grid-template-columns: 1fr; }
}
.pillar-card {
  display: grid;
  gap: var(--space-4);
  padding: clamp(var(--space-6), 3vw, var(--space-7)) 0 0;
  border-top: 1px solid rgba(10,10,10,0.14);
  position: relative;
}
.pillar-card__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: rgba(10,10,10,0.45);
}
.pillar-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.5rem, 2.3vw, 2rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--color-ink);
}
.pillar-card__title em {
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.55);
}
.pillar-card__lede {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 300;
  font-size: clamp(1rem, 1.3vw, 1.125rem);
  line-height: 1.4;
  color: rgba(10,10,10,0.78);
}
.pillar-card__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.72);
  max-width: 42ch;
}

/* ---- Five rules (DARK) — playbook of luxury marketing ---- */
.about-rules {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-rules__head {
  max-width: 64ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-rules__head .eyebrow { color: rgba(255,255,255,0.58); }
.about-rules__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  color: var(--color-text-invert);
}
.about-rules__head h2 em { font-style: italic; font-weight: 200; color: rgba(255,255,255,0.55); }
.about-rules__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.7);
  max-width: 58ch;
}
.about-rules__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0;
}
.rule-item {
  display: grid;
  grid-template-columns: clamp(70px, 10vw, 120px) 1fr;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  padding: clamp(var(--space-6), 3vw, var(--space-7)) 0;
  border-top: 1px solid rgba(255,255,255,0.14);
  align-items: start;
}
.rule-item:last-child { border-bottom: 1px solid rgba(255,255,255,0.14); }
.rule-item__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(2rem, 3.8vw, 3rem);
  line-height: 1;
  color: rgba(255,255,255,0.25);
  letter-spacing: -0.02em;
}
.rule-item__body { display: grid; gap: var(--space-3); }
.rule-item__title {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-family: var(--font-display);
  font-weight: 300;
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
}
.rule-item__gr {
  font-size: clamp(1.5rem, 2.6vw, 2.125rem);
}
.rule-item__en {
  font-size: clamp(0.875rem, 1.2vw, 1.0625rem);
  font-style: italic;
  font-weight: 200;
  color: rgba(255,255,255,0.5);
  letter-spacing: 0;
}
.rule-item__body p {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.6;
  font-weight: var(--fw-light);
  color: rgba(255,255,255,0.72);
  max-width: 60ch;
}

/* ---- What we don't do — exclusion list (LIGHT) ---- */
.about-exclusions {
  background: var(--color-paper-soft, #f3f3f3);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.about-exclusions__head {
  max-width: 62ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-exclusions__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-exclusions__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
}
.about-exclusions__head h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }
.about-exclusions__lede {
  margin-top: var(--space-4);
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.7);
  max-width: 56ch;
}
.about-exclusions__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0;
  border-top: 1px solid rgba(10,10,10,0.14);
}
@media (max-width: 760px) {
  .about-exclusions__list { grid-template-columns: 1fr; }
}
.exclusion-item {
  padding: clamp(var(--space-5), 3vw, var(--space-6)) clamp(var(--space-5), 3vw, var(--space-6));
  border-bottom: 1px solid rgba(10,10,10,0.14);
  border-right: 1px solid rgba(10,10,10,0.14);
  position: relative;
  display: grid;
  gap: var(--space-3);
}
.exclusion-item:nth-child(2n) { border-right: 0; }
@media (max-width: 760px) {
  .exclusion-item { border-right: 0; }
}
.exclusion-item::before {
  content: "\2715";                            /* small × mark */
  position: absolute;
  top: clamp(18px, 2.6vw, 28px);
  right: clamp(18px, 2.6vw, 28px);
  font-size: 12px;
  color: rgba(10,10,10,0.62);
}
.exclusion-item h3 {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.125rem, 1.6vw, 1.375rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-ink);
  padding-right: 32px;
}
.exclusion-item p {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.875rem;
  line-height: 1.55;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.68);
  max-width: 42ch;
}

/* ---- Clients — named editorial strip (LIGHT) ---- */
.about-clients {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-8), 7vw, var(--space-9));
}
.about-clients__head {
  margin-bottom: clamp(var(--space-6), 4vw, var(--space-7));
}
.about-clients__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-clients__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.1;
}
.about-clients__head h2 em { font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55); }
.about-clients__list {
  list-style: none;
  margin: 0;
  padding-top: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(10,10,10,0.14);
  display: flex;
  flex-wrap: wrap;
  row-gap: clamp(var(--space-3), 1.5vw, var(--space-4));
  column-gap: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 300;
  font-size: clamp(1.25rem, 2vw, 1.75rem);
  line-height: 1.25;
  letter-spacing: -0.01em;
  color: var(--color-ink);
}
.about-clients__list li {
  display: inline-flex;
  align-items: center;
}
.about-clients__list li + li::before {
  content: "\25C6";                            /* rhombus separator */
  display: inline-block;
  margin: 0 clamp(14px, 1.4vw, 22px);
  font-size: 8px;
  color: rgba(10,10,10,0.62);
  transform: translateY(-3px);
}

/* =============================================================
   2b. ABOUT STORY — VARIANT B
   Duplicate of the Our Story section using the SAME structural
   pattern as .about-stats / .about-press / .about-timeline etc:
   <section><div class="container">head + body</div></section>.
   Placed directly below variant A so the two can be compared on
   the same page and the more reliable layout can be kept.
   ============================================================= */
.about-story-v2 {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
  border-top: 1px solid rgba(10,10,10,0.08);
}
.about-story-v2__head {
  max-width: 58ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.about-story-v2__head .eyebrow { color: rgba(10,10,10,0.58); }
.about-story-v2__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
/* Chapter grid — Roman-numeral kicker on the left, body prose on the right.
   display:contents on .story-row lets both children flow as grid cells. */
.about-story-v2__prose {
  display: grid;
  grid-template-columns: minmax(140px, 1fr) minmax(0, 4.2fr);
  column-gap: clamp(var(--space-5), 4vw, var(--space-7));
  row-gap: clamp(var(--space-6), 3vw, var(--space-7));
  max-width: 1120px;
}
.story-row { display: contents; }
.story-row__kicker {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-medium, 500);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-ink);
  padding-top: 0.4em;                        /* optical align with first line */
}
.story-row__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  line-height: 1.65;
  font-weight: var(--fw-light);
  color: rgba(10,10,10,0.82);
}
.story-row__body strong {
  font-weight: var(--fw-medium, 500);
  color: var(--color-ink);
}
.story-row__body em {
  font-style: italic;
  color: var(--color-ink);
  /* Gotham Light Italic — scoped ONLY to Our Story chapter paragraphs.
     Rest of the site keeps IvyPresto Display italic. Sans italic here gives
     the body prose a grounded, editorial-journal voice distinct from the
     display quotes. */
  font-family: var(--font-body);
  font-weight: 300;
}

@media (max-width: 760px) {
  .about-story-v2__prose {
    grid-template-columns: 1fr;
    row-gap: var(--space-5);
  }
  .story-row__kicker {
    padding-top: 0;
    margin-bottom: calc(var(--space-2) * -1);  /* pull kicker close to body */
  }
}

/* Editorial pull quote between chapters and mission. Hairline + rotated
   rhombus ornament at top — same vocabulary as .about-approach & .cs__attr.
   Quote text stays on a SINGLE LINE: font-size uses min(...) so it shrinks
   fluidly with the viewport and never wraps. */
.about-story-v2__pullquote {
  margin: clamp(var(--space-8), 6vw, var(--space-9)) 0 0;
  padding-top: clamp(var(--space-7), 5vw, var(--space-8));   /* extra room so star + hairline sit clean */
  position: relative;
  /* NO overflow:hidden here — it was clipping the top half of the star
     ornament. Narrow-viewport safety net now lives on the blockquote. */
}
.about-story-v2__pullquote-rule {
  position: absolute;
  top: 0; left: 0;
  width: 72px;
  height: 1px;
  background: rgba(10,10,10,0.26);
}
/* 4-point star ornament — replaces the small rhombus, reads as a typographic
   asterisk. Rendered vertically (N/S/E/W points), sits just above the
   hairline so it visually interrupts the rule rather than being clipped. */
.about-story-v2__pullquote-star {
  position: absolute;
  top: -6px;                                 /* centred on the hairline: 14px/2 − 1px = 6px */
  left: 84px;
  width: 14px;
  height: 14px;
  color: rgba(10,10,10,0.44);
  display: block;
}
.about-story-v2__pullquote blockquote {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  /* min() clamps to whichever is smaller — so on narrow viewports the text
     scales DOWN automatically to keep on one line. Cap at 2.25rem desktop. */
  font-size: min(2.25rem, 3.7vw);
  line-height: 1.22;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  white-space: nowrap;
}
.about-story-v2__pullquote blockquote em {
  /* IvyPresto Display Thin Italic — muted italic lift inside the display quote. */
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  color: rgba(10,10,10,0.55);
}
/* split-words word spans need to respect the nowrap on their parent */
.about-story-v2__pullquote blockquote .word { white-space: nowrap; }
.about-story-v2__pullquote figcaption {
  margin-top: clamp(var(--space-4), 2.2vw, var(--space-5));
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.5);
}

.about-mission-v2 {
  margin-top: clamp(var(--space-8), 6vw, var(--space-9));
  padding-top: clamp(var(--space-7), 5vw, var(--space-8));
  padding-bottom: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(10,10,10,0.12);
  border-bottom: 1px solid rgba(10,10,10,0.12);
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.2fr);
  gap: clamp(var(--space-5), 4vw, var(--space-7));
  align-items: start;
}
@media (max-width: 760px) {
  .about-mission-v2 { grid-template-columns: 1fr; gap: var(--space-4); }
}
.about-mission-v2__eyebrow { color: rgba(10,10,10,0.58); }
.about-mission-v2__body {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);                 /* 100 — Thin */
  font-size: clamp(1.25rem, 2.2vw, 1.75rem);
  line-height: 1.35;
  letter-spacing: -0.01em;
  color: var(--color-ink);
  max-width: 62ch;
}
.about-mission-v2__body strong { font-weight: var(--fw-medium, 500); }
.about-mission-v2__body em {
  font-style: italic;
  font-weight: var(--fw-thin);
  /* Same ink → lighter gradient wash as the approach quote — one voice
     for italics across the About page display copy. */
  background: linear-gradient(90deg, rgba(10,10,10,0.72) 0%, rgba(10,10,10,0.32) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* =============================================================
   APPROACH PAGE
   Dedicated /approach.html — reuses the about-page chrome (preloader,
   page-frame, nav, altfooter) and adds:
     1. .approach-hero       — reuses .about-hero--centered shell
     2. .approach-process    — four-phase vertical, Roman-numeral
     3. .approach-tiers      — 2×2 engagement tier grid
     4. .approach-services   — 8-card service stack (4×2 on desktop)
     5. .approach-benefits   — soft partner benefits list
   ============================================================= */

/* ---- 2. PROCESS — four-phase vertical list, big Roman numerals ---- */
.approach-process {
  background: var(--color-paper);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.approach-process__head {
  max-width: 64ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.approach-process__head .eyebrow { color: rgba(10,10,10,0.58); }
.approach-process__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.approach-process__head h2 em {
  font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55);
}
.approach-process__lede {
  margin: var(--space-4) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(10,10,10,0.74);
  max-width: 62ch;
}
.approach-process__track {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  counter-reset: step;
  border-top: 1px solid rgba(10,10,10,0.1);
}
.approach-step {
  display: grid;
  grid-template-columns: minmax(72px, 120px) minmax(0, 1fr);
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  align-items: start;
  padding-block: clamp(var(--space-6), 4vw, var(--space-7));
  border-bottom: 1px solid rgba(10,10,10,0.1);
}
.approach-step__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(3rem, 6vw, 5rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: rgba(10,10,10,0.38);
}
.approach-step__title {
  margin: 0 0 var(--space-3);
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.375rem, 2vw, 1.75rem);
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--color-ink);
}
.approach-step__title em {
  font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55);
}
.approach-step__body-text {
  margin: 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(10,10,10,0.78);
  max-width: 68ch;
}
@media (max-width: 720px) {
  .approach-step { grid-template-columns: 1fr; gap: var(--space-3); }
  .approach-step__num { font-size: clamp(2.5rem, 8vw, 3.5rem); }
}

/* ---- 3. ENGAGEMENT TIERS — 2×2 grid of four cards ---- */
.approach-tiers {
  background: var(--color-paper-soft, #f3f3f3);
  color: var(--color-ink);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}

/* =====================================================================
   APPROACH FLAGSHIP — standalone private-tier band
   Lifted out of the public-tiers grid so the invitation register reads
   as its own thing. Ink-on-paper, editorial, two-column horizontal
   composition with a hairline rule running between the lead column and
   the CTA aside. Stays in the same monochrome vocabulary as the rest of
   the page; no red, no accent fills, no bold panels. ================== */
.approach-flagship {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-8), 7vw, var(--space-10));
  border-top: 1px solid rgba(255,255,255,0.08);
}
.approach-flagship__panel {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: clamp(var(--space-7), 6vw, var(--space-10));
  padding: clamp(var(--space-8), 5.5vw, var(--space-10)) clamp(var(--space-7), 5vw, var(--space-9));
  background: rgba(255,255,255,0.025);
  border: 1px solid rgba(255,255,255,0.10);
}
.approach-flagship__lead { display: grid; gap: clamp(18px, 1.8vw, 26px); }
.approach-flagship__lede {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  line-height: 1.18;
  letter-spacing: -0.015em;
  color: var(--color-text-invert, #fff);
  max-width: 30ch;
}
.approach-flagship__lede em {
  font-style: italic;
  color: rgba(255,255,255,0.78);
}
.approach-flagship__pillars {
  list-style: none;
  margin: clamp(12px, 1.4vw, 18px) 0 0;
  padding: 0;
  /* Horizontal row — three pillar items sit side by side. Wraps to a
     stack only at narrow viewports. ============================== */
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(20px, 2.4vw, 36px);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0.02em;
  color: rgba(255,255,255,0.74);
  max-width: none;
}
.approach-flagship__pillars li {
  display: inline-flex;
  align-items: center;
  gap: 12px;
}
@media (max-width: 760px) {
  .approach-flagship__pillars {
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }
}
.approach-flagship__pillar-mark {
  width: 5px; height: 5px;
  background: rgba(255,255,255,0.56);
  transform: rotate(45deg);
  flex: 0 0 auto;
  display: inline-block;
}
/* "By invitation only" eyebrow — IvyPresto Display Thin, italic, no
   uppercase or letterspacing tracking. Reads like a hand-set editorial
   line above the Flagship name. ============================== */
.approach-flagship__eyebrow {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: var(--fw-thin);
  font-size: clamp(1.0625rem, 1.45vw, 1.25rem);
  letter-spacing: 0;
  text-transform: none;
  color: rgba(255,255,255,0.72);
  line-height: 1.1;
}
.approach-flagship__name {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(2rem, 3.4vw, 2.875rem);
  letter-spacing: -0.02em;
  line-height: 1.05;
  display: flex;
  align-items: baseline;
  gap: clamp(14px, 1.4vw, 22px);
  color: var(--color-text-invert);
}
.approach-flagship__numeral {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1rem, 1.4vw, 1.25rem);
  color: rgba(255,255,255,0.50);
  letter-spacing: -0.02em;
}
.approach-flagship__lock {
  width: 0.5em;
  height: 0.5em;
  margin-left: 0.18em;
  color: rgba(255,255,255,0.62);
  vertical-align: 0.34em;
  transition: color 320ms var(--motion-ease), transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.approach-flagship__panel:hover .approach-flagship__lock {
  color: var(--color-text-invert);
  transform: translateY(-1px);
}
.approach-flagship__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(255,255,255,0.78);
  max-width: 64ch;
}
.approach-flagship__aside {
  display: grid;
  grid-template-columns: 80px auto;
  align-items: center;
  gap: clamp(20px, 2vw, 32px);
}
.approach-flagship__rule {
  display: block;
  height: 1px;
  width: 100%;
  background: rgba(255,255,255,0.22);
}
.approach-flagship__cta.btn-ct {
  padding: 14px 22px;
  white-space: nowrap;
  color: rgba(255,255,255,0.92);
  border-color: rgba(255,255,255,0.32);
}
.approach-flagship__cta.btn-ct:hover {
  background: rgba(255,255,255,0.06);
  border-color: rgba(255,255,255,0.55);
}
@media (max-width: 760px) {
  .approach-flagship__panel {
    grid-template-columns: 1fr;
    gap: clamp(var(--space-5), 4vw, var(--space-7));
  }
  .approach-flagship__aside { grid-template-columns: 1fr; gap: var(--space-3); }
  .approach-flagship__rule { display: none; }
}
.approach-tiers__head {
  max-width: 64ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.approach-tiers__head .eyebrow { color: rgba(10,10,10,0.58); }
.approach-tiers__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.approach-tiers__head h2 em {
  font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55);
}
.approach-tiers__lede {
  margin: var(--space-4) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(10,10,10,0.74);
  max-width: 62ch;
}
/* =====================================================================
   ENGAGEMENT TIERS, refactored for proper UX/UI balance.

   Layout:
     - Three public tiers in a row (Project · Essential · Signature),
       every card is a vertical flex column with five fixed zones:
         numeral → name → tagline → divider → CTA
       all gaps and paddings come from the same scale so the cards
       align at every horizontal baseline.
     - Flagship is one full-width row underneath, dark, three editorial
       zones separated by hairline rules:
         lead (numeral + name + lock + tagline)  |  status pill
         + CTA (right column).

   The `--tier-pad` token below is the single source of truth for card
   padding. Bumping it scales the whole component cleanly.
===================================================================== */
.approach-tiers__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  --tier-pad: clamp(28px, 2.6vw, 44px);
}

/* ---- BASE TIER CARD (public 3 + flagship inherit this) ----
   Bottom padding gets a touch more breathing space than the top so the
   CTA sits with proper visual weight, never crowded against the lower
   edge of the card. */
.tier-card {
  position: relative;
  display: flex;
  flex-direction: column;
  padding: var(--tier-pad);
  padding-bottom: clamp(36px, 3.4vw, 56px);
  border: 1px solid rgba(10,10,10,0.10);
  min-height: clamp(560px, 44vw, 640px);
  background: var(--color-paper);
  transition:
    transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1),
    border-color 320ms var(--motion-ease),
    box-shadow 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.tier-card--white { background: var(--color-paper); border-color: rgba(10,10,10,0.10); }
.tier-card--black {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border: 1px solid rgba(255,255,255,0.14);
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.06);
}

/* Hover. Whole card lifts, border brightens, the small rhombus on the
   top-right fades in. The big name nudges left a touch. */
.tier-card::after {
  content: "";
  position: absolute;
  top: var(--tier-pad); right: var(--tier-pad);
  width: 10px; height: 10px;
  border: 1px solid currentColor;
  transform: rotate(45deg) scale(0.6);
  opacity: 0;
  transition: opacity 420ms var(--motion-ease),
              transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
  pointer-events: none;
}
.tier-card:hover { transform: translateY(-4px); border-color: rgba(10,10,10,0.22); box-shadow: 0 20px 40px -24px rgba(10,10,10,0.18); }
.tier-card:hover::after { opacity: 0.46; transform: rotate(45deg) scale(1); }
.tier-card--black:hover { border-color: rgba(255,255,255,0.28); box-shadow: 0 24px 50px -28px rgba(0,0,0,0.6), inset 0 0 0 1px rgba(255,255,255,0.10); }
.tier-card__name { transition: transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1); }
.tier-card:hover .tier-card__name { transform: translateX(-2px); }

/* ---- NUMERAL ---- */
.tier-card__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: clamp(1.25rem, 1.6vw, 1.5rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: rgba(10,10,10,0.38);
  display: block;
  margin: 0 0 clamp(28px, 3vw, 44px);
}
.tier-card--black .tier-card__num { color: rgba(255,255,255,0.44); }

/* ---- NAME (the dominant typographic element) ---- */
.tier-card__name {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-thin);
  font-size: clamp(2.25rem, 3.6vw, 3rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  display: inline-flex;
  align-items: center;
  gap: 0;
}
.tier-card--black .tier-card__name { color: var(--color-text-invert); }

/* ---- TAGLINE ---- */
.tier-card__tagline {
  margin: clamp(20px, 1.8vw, 28px) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1rem);
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(10,10,10,0.74);
  max-width: 28ch;
}
.tier-card--black .tier-card__tagline { color: rgba(255,255,255,0.78); }

/* ---- SCOPE (analytical paragraph after tagline) ----
   The body copy that gives the reader operational clarity about the tier:
   what's in scope, what isn't, how it relates to the seven-step chain.
   Sits between tagline and the bullet list. ============================ */
.tier-card__scope {
  margin: clamp(14px, 1.2vw, 20px) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.8125rem, 0.92vw, 0.9375rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(10,10,10,0.62);
  max-width: 38ch;
}
.tier-card--black .tier-card__scope { color: rgba(255,255,255,0.66); }

/* ---- INCLUSIONS LIST ----
   Minimal four-bullet rundown of what the tier ships. Pinned above the
   CTA, with the same hairline divider language as the rest of the site. */
.tier-card__list {
  list-style: none;
  margin: clamp(20px, 1.6vw, 28px) 0 clamp(28px, 2vw, 36px);
  padding: clamp(16px, 1.4vw, 22px) 0 0;
  border-top: 1px solid rgba(10,10,10,0.08);
  display: grid;
  gap: clamp(6px, 0.6vw, 10px);
  font-family: var(--font-body);
  font-size: clamp(0.75rem, 0.85vw, 0.8125rem);
  font-weight: var(--fw-light);
  letter-spacing: 0.01em;
  color: rgba(10,10,10,0.78);
}
.tier-card--black .tier-card__list {
  border-top-color: rgba(255,255,255,0.10);
  color: rgba(255,255,255,0.78);
}
.tier-card__list li {
  position: relative;
  padding-left: 14px;
}
.tier-card__list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 6px;
  height: 1px;
  background: currentColor;
  opacity: 0.55;
}

/* The min-height on the cards needs to grow now that scope + list sit
   inside. Bumping the floor ensures all three white cards align cleanly
   at the bottom even when scope copy lengths vary. ===================== */

/* ---- CTA + divider rule ----
   Anchored to the bottom of the card via margin-top: auto so all three
   cards line up at the same baseline regardless of tagline length. The
   hairline rule sits above the button at a fixed 24-36px top-padding,
   the button itself has its own 14x22px internal padding (.btn-ct--quiet),
   and the card's bottom padding (36-56px) gives the button room beneath
   it. Result: the action reads as a deliberate, balanced moment, not
   crammed against the card edge. */
/* CTAs inside tier cards keep the boxed .btn-ct--quiet treatment, so
   they read as part of the same button vocabulary used elsewhere on
   the site. The base button properties (border, padding, animation)
   are preserved. We only constrain layout: the four CTAs are all
   forced to the same visual width and to centred text content, so
   "See details", "Request a snapshot" and "Enquire privately" all
   render as identically-sized boxes. */
.tier-card__cta.btn-ct {
  width: 100%;
  max-width: clamp(220px, 22vw, 280px);
  justify-content: center;
  text-align: center;
  padding: 16px 22px;
}
.tier-card__cta.btn-ct .btn-ct__slide,
.tier-card__cta.btn-ct .btn-ct__row {
  justify-content: center;
  width: 100%;
}

.tier-card__cta {
  margin-top: auto;
  align-self: flex-start;
  position: relative;
}
/* The hairline rule that previously sat above the CTA has been
   retired. Now that the CTA is a boxed .btn-ct--quiet button, the rule
   would compete visually with the button's own border. The boxed
   button is the divider. */
.tier-card__cta::before { content: none; display: none; }

/* ---- FLAGSHIP LOCK GLYPH ---- */
.tier-card__lock {
  width: 0.5em;
  height: 0.5em;
  margin-left: 0.32em;
  color: rgba(255,255,255,0.78);
  vertical-align: 0.34em;
  transition: color 320ms var(--motion-ease), transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.tier-card--black:hover .tier-card__lock { color: #ffffff; transform: translateY(-1px); }

/* =====================================================================
   FLAGSHIP HORIZONTAL ROW
   Two main editorial zones, one structural balance:

     [ LEAD ]                                         |  [ ASIDE ]
     IV ─── (rule)                                    |
     Flagship 🔒                                      |  By invitation
     Tagline copy across two lines max.               |  ──── (rule)
                                                      |  Enquire privately →

   The aside is a self-contained mini-card: status pill on top, a
   hairline rule, then the CTA. Both columns share the same vertical
   padding, so the vertical hairline that separates them runs the full
   height cleanly.
===================================================================== */
.approach-tiers__grid .tier-card--black {
  grid-column: 1 / -1;
  flex-direction: row;
  align-items: stretch;
  min-height: clamp(240px, 22vw, 300px);
  padding: 0;
  overflow: hidden;
  gap: 0;
}
.approach-tiers__grid .tier-card--black > .tier-card__lead,
.approach-tiers__grid .tier-card--black > .tier-card__aside {
  padding: clamp(36px, 3.2vw, 56px) clamp(36px, 3.4vw, 64px);
  display: flex;
  flex-direction: column;
}
.approach-tiers__grid .tier-card--black > .tier-card__aside {
  border-left: 1px solid rgba(255,255,255,0.12);
}

/* LEAD column. Vertical-centred, IV numeral with its own short rule
   above the title for editorial weight. */
.tier-card__lead {
  flex: 1 1 60%;
  min-width: 0;
  justify-content: center;
  gap: 0;
}
.approach-tiers__grid .tier-card--black .tier-card__lead .tier-card__num {
  margin: 0 0 clamp(14px, 1.4vw, 20px);
  padding-bottom: clamp(10px, 1vw, 14px);
  border-bottom: 1px solid rgba(255,255,255,0.20);
  width: clamp(56px, 5vw, 80px);
  font-style: normal;
  letter-spacing: 0.16em;
  font-size: 0.8125rem;
  font-weight: 300;
  color: rgba(255,255,255,0.78);
}
.approach-tiers__grid .tier-card--black .tier-card__name {
  font-size: clamp(2rem, 3.2vw, 2.75rem);
  letter-spacing: -0.02em;
  margin: 0;
}
.approach-tiers__grid .tier-card--black .tier-card__tagline {
  max-width: 50ch;
  margin: clamp(14px, 1.4vw, 20px) 0 0;
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
}

/* ASIDE column. Pill on top, hairline rule, CTA underneath. All three
   cluster tightly together and vertically centre as one unit, so there
   is no awkward dead space between the pill and the CTA. */
.tier-card__aside {
  flex: 0 0 clamp(300px, 28vw, 380px);
  justify-content: center;
  align-items: flex-end;
  text-align: right;
  gap: clamp(22px, 2vw, 30px);
}
.approach-tiers__grid .tier-card--black .tier-card__aside::before {
  content: "By invitation";
  display: inline-flex;
  align-items: center;
  padding: 11px 18px;
  border: 1px solid rgba(255,255,255,0.36);
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.6875rem;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: #ffffff;
  background: rgba(255,255,255,0.04);
  align-self: flex-end;
}
.approach-tiers__grid .tier-card--black .tier-card__cta {
  align-self: flex-end;
  margin-top: 0;
  padding-top: 0;
  font-size: 0.75rem;
}
/* Flagship CTA matches the public tier CTA width so all four button
   boxes share the same proportions across the section. */
.approach-tiers__grid .tier-card--black .tier-card__cta.btn-ct {
  width: 100%;
  max-width: clamp(220px, 22vw, 280px);
  justify-content: center;
  text-align: center;
  padding: 16px 22px;
}

/* ---- RESPONSIVE ---- */
@media (max-width: 1024px) {
  .approach-tiers__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 720px) {
  .approach-tiers__grid { grid-template-columns: 1fr; }
  .tier-card { min-height: 0; }
  .approach-tiers__grid .tier-card--black {
    flex-direction: column;
    align-items: stretch;
    min-height: 0;
  }
  .approach-tiers__grid .tier-card--black > .tier-card__aside {
    border-left: 0;
    border-top: 1px solid rgba(255,255,255,0.12);
    align-items: flex-start;
    text-align: left;
    flex: 0 0 auto;
  }
  .approach-tiers__grid .tier-card--black .tier-card__aside::before { align-self: flex-start; }
  .approach-tiers__grid .tier-card--black .tier-card__cta {
    align-self: flex-start;
  }
  .approach-tiers__grid .tier-card--black .tier-card__cta::before { left: 0; right: auto; }
}

/* Legacy aliases, kept so other templates that reference these classes
   still render correctly. */
.tier-card--light-grey { background: var(--color-paper-soft, #f3f3f3); }
.tier-card--silver {
  background: linear-gradient(135deg, #ffffff 0%, #e4e4e4 100%);
  border-color: rgba(10,10,10,0.05);
}
.tier-card__meta {
  list-style: none;
  margin: var(--space-2) 0 0;
  padding: clamp(var(--space-3), 1.6vw, var(--space-4)) 0 0;
  border-top: 1px solid rgba(10,10,10,0.12);
  display: flex;
  flex-wrap: wrap;
  gap: clamp(var(--space-3), 1.6vw, var(--space-4));
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.64);
}
.tier-card--silver .tier-card__meta { border-top-color: rgba(10,10,10,0.14); }
.tier-card--black .tier-card__meta { border-top-color: rgba(255,255,255,0.14); color: rgba(255,255,255,0.66); }

/* ---- 4. SERVICES — 8 mini cards, 4×2 grid on desktop, 2×4 on tablet ---- */
.approach-services {
  background: var(--color-ink);
  color: var(--color-text-invert);
  padding-block: clamp(var(--space-9), 8vw, var(--space-10));
}
.approach-services__head {
  max-width: 64ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.approach-services__head .eyebrow { color: rgba(255,255,255,0.6); }
.approach-services__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
}
.approach-services__head h2 em {
  font-style: italic; font-weight: 200; color: rgba(255,255,255,0.55);
}
.approach-services__lede {
  margin: var(--space-4) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(255,255,255,0.74);
  max-width: 62ch;
}
.approach-services__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  /* Nine departments laid out 3 × 3 so the section reads as a clean
     square bento, not a wide 4-col strip. ─────────────────────────── */
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(var(--space-4), 1.8vw, var(--space-5));
}
@media (max-width: 1100px) {
  .approach-services__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  .approach-services__grid { grid-template-columns: 1fr; }
}
.service-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-3), 1.4vw, var(--space-4));
  padding: clamp(var(--space-5), 2.4vw, var(--space-6));
  background: rgba(255,255,255,0.03);
  border: 1px solid rgba(255,255,255,0.1);
  transition: background 320ms var(--motion-ease), border-color 320ms var(--motion-ease);
}
.service-card:hover {
  background: rgba(255,255,255,0.06);
  border-color: rgba(255,255,255,0.22);
}
.service-card__num {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 200;
  font-size: 1.25rem;
  line-height: 1;
  letter-spacing: -0.01em;
  color: rgba(255,255,255,0.4);
}
.service-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.125rem, 1.5vw, 1.375rem);
  line-height: 1.22;
  letter-spacing: -0.01em;
  color: var(--color-text-invert);
}
.service-card__title em {
  font-style: italic; font-weight: 200; color: rgba(255,255,255,0.58);
}
.service-card__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(255,255,255,0.74);
}
.service-card__meta {
  list-style: none;
  margin: auto 0 0;
  padding: clamp(var(--space-3), 1.4vw, var(--space-4)) 0 0;
  border-top: 1px solid rgba(255,255,255,0.12);
  display: grid;
  gap: 6px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  line-height: 1.4;
  color: rgba(255,255,255,0.6);
}
.service-card__meta li::before {
  content: "\2014\2009";                              /* em-dash + thin space bullet */
  color: rgba(255,255,255,0.32);
}

/* ---- 5. PARTNER BENEFITS — stacked list with leading star glyph ---- */
.approach-benefits {
  background: var(--color-paper);
  color: var(--color-ink);
  /* Extra top spacing so it sits clearly separated from the service stack
     section above (a separator space, as requested). */
  padding-top: clamp(var(--space-10), 9vw, 9rem);
  padding-bottom: clamp(var(--space-9), 8vw, var(--space-10));
  margin-top: clamp(var(--space-6), 4vw, var(--space-7));
}
.approach-benefits__head {
  max-width: 64ch;
  margin-bottom: clamp(var(--space-7), 5vw, var(--space-8));
}
.approach-benefits__head .eyebrow { color: rgba(10,10,10,0.58); }
.approach-benefits__head h2 {
  margin-top: var(--space-3);
  font-size: clamp(2rem, 3.6vw, 2.875rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.approach-benefits__head h2 em {
  font-style: italic; font-weight: 200; color: rgba(10,10,10,0.55);
}
.approach-benefits__lede {
  margin: var(--space-4) 0 0;
  font-family: var(--font-body);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  font-weight: var(--fw-light);
  line-height: 1.65;
  color: rgba(10,10,10,0.74);
  max-width: 62ch;
}
.approach-benefits__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(10,10,10,0.1);
  padding-top: clamp(var(--space-6), 3vw, var(--space-7));
}
@media (max-width: 760px) {
  .approach-benefits__list { grid-template-columns: 1fr; }
}
.benefit-item {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  gap: clamp(var(--space-3), 1.4vw, var(--space-4));
  align-items: start;
  position: relative;
  padding: clamp(var(--space-3), 1.6vw, var(--space-4)) clamp(var(--space-3), 1.6vw, var(--space-4));
  padding-left: 0;
  padding-top: clamp(var(--space-3), 1.6vw, var(--space-4));
  cursor: default;
  transition: padding-left 520ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
/* Editorial corner — two hairlines that draw inward from the top-left
   corner of the card on hover. Top hairline scales horizontally from the
   mark column rightward; left hairline scales vertically from the same
   point downward. Together they form a thin L-shaped frame that completes
   itself in 520ms, the same easing as the rest of the site's reveals.
   Stays monochrome to fit the no-red lock + editorial vocabulary. ====== */
.benefit-item::before,
.benefit-item::after {
  content: "";
  position: absolute;
  background: var(--color-ink);
  pointer-events: none;
  transition: transform 520ms cubic-bezier(0.22, 0.61, 0.36, 1) 0ms,
              opacity 200ms ease;
  opacity: 0;
}
/* Top hairline: spans the full card width, draws left-to-right. */
.benefit-item::before {
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  transform: scaleX(0);
  transform-origin: 0 0;
}
/* Left hairline: spans the card height, draws top-to-bottom (delayed by
   ~120ms so the L completes itself with deliberate cadence). */
.benefit-item::after {
  top: 0;
  left: 0;
  bottom: 0;
  width: 1px;
  transform: scaleY(0);
  transform-origin: 0 0;
  transition-delay: 120ms;
}
.benefit-item:hover::before,
.benefit-item:focus-within::before { transform: scaleX(1); opacity: 1; }
.benefit-item:hover::after,
.benefit-item:focus-within::after  { transform: scaleY(1); opacity: 1; }
/* Whole row nudges right when the corner appears so the title pulls
   slightly out of its anchored position, reinforcing the L-frame.  ===== */
.benefit-item:hover,
.benefit-item:focus-within { padding-left: clamp(var(--space-2), 1vw, 12px); }

.benefit-item__mark {
  display: grid; place-items: center;
  width: 24px; height: 24px;
  color: rgba(10,10,10,0.42);
  padding-top: 2px;
  transition: transform 520ms cubic-bezier(0.22, 0.61, 0.36, 1),
              color 320ms ease;
}
.benefit-item__mark svg { width: 14px; height: 14px; }
/* Mark rotates 45° + opacifies on hover, locking it visually to the
   corner that just completed (rhombus alignment, mirrors btn-ct--morph
   language used elsewhere on the site). =============================== */
.benefit-item:hover .benefit-item__mark,
.benefit-item:focus-within .benefit-item__mark {
  transform: rotate(45deg) scale(1.15);
  color: var(--color-ink);
}

.benefit-item__title {
  margin: 0 0 var(--space-2);
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.125rem, 1.6vw, 1.375rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-ink);
  transition: letter-spacing 520ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.benefit-item:hover .benefit-item__title,
.benefit-item:focus-within .benefit-item__title { letter-spacing: 0; }

.benefit-item__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: clamp(0.875rem, 1vw, 0.9375rem);
  font-weight: var(--fw-light);
  line-height: 1.6;
  color: rgba(10,10,10,0.76);
  max-width: 56ch;
  transition: color 320ms ease;
}
.benefit-item:hover .benefit-item__body,
.benefit-item:focus-within .benefit-item__body { color: rgba(10,10,10,0.92); }

@media (prefers-reduced-motion: reduce) {
  .benefit-item,
  .benefit-item::before,
  .benefit-item::after,
  .benefit-item__mark,
  .benefit-item__title,
  .benefit-item__body { transition: none !important; }
}

/* =============================================================
   .sets-apart--light — approach-page variant of the compare matrix
   Section background: paper (white). Dimension labels + Industry Standard
   column in ink text on paper. The HoA column becomes a full DARK column
   (ink bg + white text) so it stands out dramatically against the light
   table, leadestate.com style. All default white colors inherited from
   the dark-version CSS are explicitly overridden here because some of
   them (.sets-apart__label-text, .sets-apart__label-num, etc.) have
   hardcoded white values that win over a parent-level override.
   ============================================================= */
.sets-apart--light {
  background: var(--color-paper);
  color: var(--color-ink);
  border-top: 1px solid rgba(10,10,10,0.08);
  padding-top: clamp(var(--space-10), 10vw, 10rem);
  padding-bottom: clamp(var(--space-10), 10vw, 10rem);
  margin-top: clamp(var(--space-7), 5vw, var(--space-8));
  margin-bottom: clamp(var(--space-6), 4vw, var(--space-7));
}
.sets-apart--light .eyebrow { color: rgba(10,10,10,0.6); }
.sets-apart--light .sets-apart__kicker { color: rgba(10,10,10,0.62); }
.sets-apart--light .sets-apart__heading { color: var(--color-ink); }
.sets-apart--light .sets-apart__heading em { color: rgba(10,10,10,0.55); }

/* Table — ink-tinted borders everywhere (default rules use white) */
.sets-apart--light .sets-apart__matrix { border-top-color: rgba(10,10,10,0.16); }
.sets-apart--light .sets-apart__row { border-bottom-color: rgba(10,10,10,0.08); }
.sets-apart--light .sets-apart__label { border-bottom-color: rgba(10,10,10,0.1); border-right-color: rgba(10,10,10,0.12); }
.sets-apart--light .sets-apart__h--cat { border-right-color: rgba(10,10,10,0.12); }
.sets-apart--light .sets-apart__h { border-bottom-color: rgba(10,10,10,0.12); border-right-color: rgba(10,10,10,0.12); color: var(--color-ink); }
.sets-apart--light .sets-apart__cell { border-bottom-color: rgba(10,10,10,0.08); border-right-color: rgba(10,10,10,0.08); }

/* Dimensions column (leftmost) — labels in INK (the user saw these as white) */
.sets-apart--light .sets-apart__h--cat span { color: rgba(10,10,10,0.5); }
.sets-apart--light .sets-apart__label-num { color: rgba(10,10,10,0.4); }
.sets-apart--light .sets-apart__label-text { color: var(--color-ink); }

/* Industry Standard column — ink on paper */
.sets-apart--light .sets-apart__h-kicker { color: rgba(10,10,10,0.5); }
.sets-apart--light .sets-apart__h-name { color: var(--color-ink); }
.sets-apart--light .sets-apart__h-sub { color: rgba(10,10,10,0.6); }
.sets-apart--light .sets-apart__cell:not(.sets-apart__cell--hoa) { color: rgba(10,10,10,0.7); }

/* HoA column — DARK standout within the light section.
   Background fills top to bottom, white text, white mark, white wordmark. */
.sets-apart--light .sets-apart__h--hoa {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-left: 0;
  border-right: 0;
  border-bottom-color: rgba(255,255,255,0.12);
}
.sets-apart--light .sets-apart__h--hoa .sets-apart__h-kicker { color: rgba(255,255,255,0.62); }
.sets-apart--light .sets-apart__h--hoa .sets-apart__h-name { color: var(--color-text-invert); }
.sets-apart--light .sets-apart__h--hoa .sets-apart__h-sub { color: rgba(255,255,255,0.76); }
.sets-apart--light .sets-apart__cell--hoa {
  background: var(--color-ink);
  color: var(--color-text-invert);
  border-left: 0;
  border-right: 0;
  border-bottom-color: rgba(255,255,255,0.08);
}
.sets-apart--light .sets-apart__cell--hoa span { color: var(--color-text-invert); }
.sets-apart--light .sets-apart__cell--hoa .sets-apart__mark { color: #ffffff; }

/* HoA wordmark — stays WHITE on the dark column (no filter flip). */
.sets-apart--light .sets-apart__h--hoa img { filter: none; }

/* Hover: star glyph rotates + scales — same interaction language as homepage */
.sets-apart--light .sets-apart__mark {
  transition: transform 420ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.sets-apart--light .sets-apart__cell--hoa:hover .sets-apart__mark {
  transform: rotate(90deg) scale(1.1);
}

/* Last row: no bottom border on HoA cell to round out the dark column cleanly */
.sets-apart--light .sets-apart__row--last .sets-apart__cell--hoa {
  border-bottom: 0;
}

/* ============================================================
   CASE STUDIES — listing page (case-studies.html)
   New v=149 system:
     1. .cs-hero — fluid-glass slider (top 3 latest cases auto-rotate)
     2. .cs-rows — row-based stack of all cases (image L, body M, cue R)
   The legacy .cs-list and .cs-row component is no longer rendered, but
   its CSS lives below for reference until any other page reuses it.
============================================================ */

/* ─── HERO · fluid-glass auto-rotating slider ─── */
.cs-hero {
  position: relative;
  background: #0a0a0a;
  color: var(--color-text-invert);
  min-height: 100vh;
  overflow: hidden;
  isolation: isolate;
}

.cs-hero__background {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.cs-hero__bg-layer {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center;
  opacity: 0;
  transition: opacity 1100ms cubic-bezier(0.4, 0, 0.2, 1);
}
.cs-hero__bg-layer.is-active { opacity: 1; }

.cs-hero__overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(to bottom, rgba(10,10,10,0.55) 0%, rgba(10,10,10,0.18) 22%, rgba(10,10,10,0.32) 70%, rgba(10,10,10,0.62) 100%),
    rgba(10,10,10,0.22);
  pointer-events: none;
}

/* Slide stack — anchored bottom-LEFT, sitting above the persistent footer
   strip. Title is the hooky "breaking-news" headline (2 short bold lines,
   IvyPresto Display Thin) with a short description directly underneath. */
.cs-hero__container {
  position: absolute;
  inset: 0;
  z-index: 5;
  pointer-events: none;
}
.cs-hero__slide {
  position: absolute;
  left: clamp(var(--space-5), 5vw, var(--space-9));
  right: auto;
  bottom: clamp(150px, 18vh, 220px);
  width: min(760px, 56vw);
  max-width: none;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: clamp(14px, 1.6vw, 22px);
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 700ms cubic-bezier(0.4, 0, 0.2, 1),
              transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
  pointer-events: none;
}
.cs-hero__slide.is-active {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.cs-hero__title-link {
  display: inline-block;
  text-decoration: none;
  color: inherit;
  position: relative;
  z-index: 2;
  cursor: pointer;
}
.cs-hero__title-link:hover .cs-hero__title { opacity: 0.92; }
.cs-hero__title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(2.25rem, 5vw, 4.25rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--color-text-invert);
  margin: 0;
  width: 100%;
  max-width: 760px;
  text-wrap: balance;
  transition: opacity 300ms cubic-bezier(0.16, 1, 0.3, 1);
}
.cs-hero__title em {
  font-style: italic;
  font-weight: var(--fw-thin, 100);
  color: rgba(255,255,255,0.82);
}

.cs-hero__desc {
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.55;
  color: rgba(255,255,255,0.78);
  margin: 0;
  max-width: 52ch;
}

/* Footer strip — pinned to the bottom edge. Layout (top→bottom):
     full-page-width progress bar
     tag (left-aligned) ⟷ numbering (right-aligned)
   The prev/next arrows are taken OUT of the footer flow and floated
   to the right at the SAME baseline as the title (.cs-hero__nav
   absolute positioned), so title-bottom and arrow-bottom align
   perfectly on a single horizontal line. */
.cs-hero__footer {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 6;
  display: flex;
  flex-direction: column;
  gap: clamp(10px, 1.4vw, 16px);
  padding: 0 clamp(var(--space-5), 5vw, var(--space-9)) clamp(var(--space-5), 3vw, var(--space-7));
  pointer-events: none;
}
.cs-hero__footer > * { pointer-events: auto; }

.cs-hero__nav {
  position: absolute;
  right: clamp(var(--space-5), 5vw, var(--space-9));
  bottom: clamp(150px, 18vh, 220px);
  display: inline-flex;
  gap: 10px;
  z-index: 8;
}
.cs-hero__btn {
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255,255,255,0.32);
  background: rgba(10,10,10,0.28);
  color: rgba(255,255,255,0.85);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background 320ms var(--motion-ease),
              border-color 320ms var(--motion-ease),
              color 320ms var(--motion-ease);
}
.cs-hero__btn:hover {
  background: rgba(255,255,255,0.10);
  border-color: rgba(255,255,255,0.72);
  color: #fff;
}
.cs-hero__btn svg { width: 16px; height: auto; }

/* Progress bar — direct port of the fluid.glass /projects bar:
   1px hairline track, 1px hairline fill, no CSS transition, the JS
   writes scaleX every animation frame so the line draws itself in
   lock-step with the slide timer. Track is 20% white, fill is 80%
   white, both pinned across the full width of the hero footer. */
.cs-hero__progress {
  position: relative;
  width: 100%;
  height: 1px;
  background: rgba(255,255,255,0.20);
  overflow: hidden;
}
/* The premium completion dial — small circular ring whose stroke draws
   clockwise from 12 o'clock as the bar fills. Lives in the strip row
   to the right of the slide counter. Pure SVG, the JS writes
   stroke-dashoffset on its inner circle so it stays in lock-step with
   the bar. */
.cs-hero__progress-glyph {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}
.cs-hero__progress-glyph-fill {
  transition: stroke-dashoffset 80ms linear;
}
.cs-hero__strip-right {
  display: inline-flex;
  align-items: center;
  gap: clamp(10px, 1.2vw, 14px);
  flex: 0 0 auto;
}
.cs-hero__progress-bar {
  width: 100%;
  height: 100%;
  background: rgba(255,255,255,0.80);
  transform: scaleX(0);
  transform-origin: 0 50%;
  transition: none;
  will-change: transform;
  /* CSS keyframe driver — far more reliable than the previous rAF
     loop, which the preloader and the IntersectionObserver were
     occasionally starving on first paint. The keyframe runs forever
     and restarts cleanly on prev/next via a JS class flip. */
  animation: cs-progress-fill var(--cs-prog-dur, 9000ms) linear infinite;
}
@keyframes cs-progress-fill {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
.cs-hero__progress-bar.is-restarting { animation: none; }
@media (prefers-reduced-motion: reduce) {
  .cs-hero__progress-bar { animation: none; transform: scaleX(0); }
}

/* Premium completion dial, paired with the bar. Same keyframe duration,
   draws the stroke clockwise from 12 o'clock. */
.cs-hero__progress-glyph-fill {
  animation: cs-progress-glyph-fill var(--cs-prog-dur, 9000ms) linear infinite;
}
@keyframes cs-progress-glyph-fill {
  from { stroke-dashoffset: 100; }
  to   { stroke-dashoffset: 0; }
}
.cs-hero__progress-glyph-fill.is-restarting { animation: none; }
@media (prefers-reduced-motion: reduce) {
  .cs-hero__progress-glyph-fill { animation: none; }
}

/* Footer phone + email: belt-and-braces against UA stylesheets that
   were stretching the tel: link across the whole column. The bug
   reported as "I cannot see the phone, even if I copy-paste it" was
   that the four number chunks were spreading across ~1300px because
   the anchor was ending up as wide as the column. Force inline width,
   keep word-spacing normal so the chunks read together, and lock the
   colour to white on every state. */
.altfooter__nav a[href^="tel:"],
.altfooter__nav a[href^="mailto:"] {
  display: inline-block !important;
  width: max-content !important;
  max-width: 100% !important;
  text-align: left !important;
  word-spacing: normal !important;
  letter-spacing: normal !important;
  white-space: nowrap;
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
}
.altfooter__nav a[href^="tel:"]:hover,
.altfooter__nav a[href^="mailto:"]:hover {
  color: rgba(255,255,255,0.82) !important;
  -webkit-text-fill-color: rgba(255,255,255,0.82) !important;
}

/* Strip — tag on the left (e.g. "Luxury real estate brokerage · Athens"),
   numbering on the right ("01 / 03"). Both share the same eyebrow scale. */
.cs-hero__strip {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: clamp(var(--space-4), 3vw, var(--space-6));
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.78);
}
.cs-hero__tag {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 1 1 auto;
  color: rgba(255,255,255,0.68);
}
.cs-hero__indicator {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  flex: 0 0 auto;
}
.cs-hero__indicator-divider {
  color: rgba(255,255,255,0.38);
  margin: 0 4px;
}
.cs-hero__indicator-meta {
  margin-left: 12px;
  padding-left: 12px;
  border-left: 1px solid rgba(255,255,255,0.22);
  color: rgba(255,255,255,0.55);
  font-size: 0.6875rem;
  letter-spacing: 0.16em;
}
@media (max-width: 760px) {
  .cs-hero__indicator-meta { display: none; }
}

/* Glass cursor-follow "View case" pill — pinned to the VIEWPORT
   (position: fixed) so it tracks the native cursor as the page scrolls
   inside the hero. JS lerps the pill toward screen-space clientX/clientY
   with a slow factor (0.10) for the fluid.glass feel. The pill fades
   on enter (.is-visible) and is suppressed (.is-suppressed) when the
   pointer hovers any interactive zone — arrows, top nav, footer strip,
   case-study links — so those clicks aren't intercepted. */
.cs-hero__cursor {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 7;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 12px 22px;
  border: 1px solid rgba(255,255,255,0.55);
  background: rgba(10,10,10,0.30);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.94);
  text-decoration: none;
  pointer-events: none;
  opacity: 0;
  transform: translate3d(-9999px, -9999px, 0) translate(-50%, -50%) scale(0.92);
  transition:
    opacity 320ms cubic-bezier(0.4, 0, 0.2, 1),
    border-color 320ms cubic-bezier(0.4, 0, 0.2, 1);
  will-change: transform, opacity;
}
.cs-hero__cursor.is-visible {
  opacity: 1;
  pointer-events: auto;
}
.cs-hero__cursor.is-suppressed {
  opacity: 0;
  pointer-events: none;
  transition: opacity 80ms cubic-bezier(0.4, 0, 0.2, 1);
}
.cs-hero__cursor svg {
  width: 12px;
  height: 12px;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.1;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* On touch / no-hover devices the View pill is irrelevant. */
@media (hover: none) {
  .cs-hero__cursor { display: none; }
}

@media (max-width: 760px) {
  .cs-hero__slide { bottom: clamp(150px, 22vh, 220px); }
  .cs-hero__footer { gap: 8px; padding-bottom: clamp(var(--space-4), 4vw, var(--space-6)); }
  .cs-hero__strip { font-size: 0.6875rem; }
  .cs-hero__tag { letter-spacing: 0.14em; }
}

/* (Legacy bottom-right .cs-hero__nav rules removed — nav now lives inside
   .cs-hero__footer, see the footer-strip block above.) */

/* ─── ROW LIST · all case studies stacked, simple ─── */
.cs-rows {
  background: var(--color-paper, #fafafa);
  padding: clamp(80px, 9vw, 144px) clamp(var(--space-5), 5vw, var(--space-9)) clamp(96px, 11vw, 160px);
}

.cs-rows__intro {
  max-width: 1280px;
  margin: 0 auto clamp(var(--space-8), 8vw, var(--space-10));
  text-align: left;
}
.cs-rows__intro .eyebrow { color: rgba(10,10,10,0.58); margin-bottom: var(--space-4); }
.cs-rows__title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(2rem, 4.4vw, 3.5rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 22ch;
}
.cs-rows__title em {
  font-style: italic;
  font-weight: var(--fw-thin, 100);
  color: rgba(10,10,10,0.55);
}
.cs-rows__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(10,10,10,0.62);
  margin: clamp(var(--space-4), 2vw, var(--space-5)) 0 0;
  max-width: 58ch;
}
.cs-rows__meta {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(var(--space-3), 1.4vw, var(--space-4));
  margin-top: clamp(var(--space-5), 3vw, var(--space-6));
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.5);
}
.cs-rows__meta > span { display: inline-flex; align-items: baseline; gap: 6px; }
.cs-rows__meta > span > span {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: 0.875rem;
  letter-spacing: -0.005em;
  text-transform: none;
  color: var(--color-ink);
}
.cs-rows__meta-sep {
  display: inline-block;
  width: 18px;
  height: 1px;
  background: rgba(10,10,10,0.18);
}

.cs-rows__list {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 1280px;
  margin: 0 auto;
  border-top: 1px solid rgba(10,10,10,0.10);
}
.cs-rows__item {
  border-bottom: 1px solid rgba(10,10,10,0.10);
}

.cs-rows__link {
  display: grid;
  grid-template-columns: minmax(220px, 32%) minmax(0, 1fr) auto;
  gap: clamp(var(--space-5), 4vw, var(--space-8));
  align-items: center;
  padding: clamp(var(--space-5), 3vw, var(--space-6)) 0;
  text-decoration: none;
  color: inherit;
  transition: padding 360ms var(--motion-ease);
}
.cs-rows__link:hover {
  padding-left: clamp(var(--space-3), 1.6vw, var(--space-4));
}

.cs-rows__media {
  position: relative;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: #111;
  border-radius: 0;
}
.cs-rows__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 720ms cubic-bezier(0.16, 1, 0.3, 1);
}
.cs-rows__link:hover .cs-rows__media img {
  transform: scale(1.04);
}

.cs-rows__body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-2), 1.2vw, var(--space-3));
  min-width: 0;
}

.cs-rows__row-meta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.48);
}
.cs-rows__sep { color: rgba(10,10,10,0.28); }

.cs-rows__name {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(1.625rem, 2.8vw, 2.5rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
}
.cs-rows__name em {
  font-style: italic;
  font-weight: var(--fw-thin, 100);
  color: rgba(10,10,10,0.55);
}

.cs-rows__sub {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.55;
  color: rgba(10,10,10,0.72);
  margin: 0;
  max-width: 56ch;
}

.cs-rows__services {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.06em;
  color: rgba(10,10,10,0.48);
  margin-top: clamp(var(--space-2), 1vw, var(--space-3));
}

.cs-rows__cue {
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(10,10,10,0.18);
  color: rgba(10,10,10,0.72);
  transition: background 360ms var(--motion-ease),
              border-color 360ms var(--motion-ease),
              color 360ms var(--motion-ease);
  flex-shrink: 0;
}
.cs-rows__cue svg {
  width: 14px;
  height: 14px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.1;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.cs-rows__link:hover .cs-rows__cue {
  background: var(--color-ink);
  border-color: var(--color-ink);
  color: #fff;
}

@media (max-width: 760px) {
  .cs-rows__link {
    grid-template-columns: 1fr;
    gap: var(--space-4);
  }
  .cs-rows__cue { justify-self: flex-start; }
}

/* ─── Legacy .cs-page-hero override kept only so nothing else breaks if
   referenced elsewhere; the new hero is .cs-hero, not .about-hero. ─── */
.cs-page-hero .about-hero__bg {
  background-image: url("../assets/hero-bg.jpg");
}

/* List section — tighter top entry, generous but not excessive airspace */
.cs-list {
  background: var(--color-paper, #fafafa);
  padding: clamp(64px, 8vw, 112px) 0 clamp(80px, 10vw, 144px);
}

/* WIDE intro variant — stretches to the corners, editorial 2-column layout */
.cs-list__intro--wide {
  max-width: none;
  margin: 0 0 clamp(72px, 10vw, 144px);
  padding: 0 clamp(var(--space-5), 6vw, var(--space-10));
  text-align: left;
  align-items: stretch;
  display: block;
}

.cs-list__intro-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  gap: clamp(var(--space-6), 6vw, var(--space-10));
  align-items: end;
  padding-bottom: clamp(var(--space-6), 4vw, var(--space-8));
  border-bottom: 1px solid rgba(10,10,10,0.1);
}

.cs-list__intro-head .eyebrow {
  margin-bottom: clamp(var(--space-4), 2vw, var(--space-5));
  justify-content: flex-start;
}

.cs-list__heading {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2.25rem, 5.6vw, 5rem);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 12ch;
}

.cs-list__heading em {
  font-style: italic;
  font-weight: 100;
}

.cs-list__intro-side {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  justify-content: flex-end;
  padding-bottom: clamp(var(--space-2), 0.8vw, var(--space-3));
}

.cs-list__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.68;
  color: rgba(10,10,10,0.66);
  max-width: 52ch;
  margin: 0;
}

/* Summary meta strip — stays on the right column, left-aligned */
.cs-list__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(12px, 1.8vw, 20px);
  margin: 0;
  padding: 0;
  border: 0;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.5);
}

.cs-list__meta-item {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
}

.cs-list__meta-item > span {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: clamp(1.0625rem, 1.35vw, 1.1875rem);
  letter-spacing: -0.01em;
  color: var(--color-ink);
  text-transform: none;
  line-height: 1;
}

.cs-list__meta-sep {
  display: inline-block;
  width: 5px;
  height: 5px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.3);
}

@media (max-width: 860px) {
  .cs-list__intro-grid {
    grid-template-columns: 1fr;
    gap: var(--space-5);
    align-items: start;
  }
  .cs-list__heading { max-width: 18ch; }
  .cs-list__intro-side { justify-content: flex-start; padding-bottom: 0; }
}

.cs-list__meta-item {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
}

.cs-list__meta-item > span {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: clamp(1.0625rem, 1.4vw, 1.25rem);
  letter-spacing: -0.01em;
  color: var(--color-ink);
  text-transform: none;
  line-height: 1;
}

.cs-list__meta-sep {
  display: inline-block;
  width: 5px;
  height: 5px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.3);
}

@media (max-width: 520px) {
  .cs-list__meta {
    gap: 10px 14px;
    font-size: 0.625rem;
  }
  .cs-list__meta-item > span {
    font-size: 1rem;
  }
}

/* ROW — full-bleed horizontal editorial layout, alternating L/R */
.cs-row {
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(0, 1fr);
  gap: clamp(var(--space-6), 5vw, var(--space-10));
  align-items: center;
  width: 100%;
  padding: clamp(var(--space-8), 8vw, var(--space-12)) clamp(var(--space-5), 6vw, var(--space-10));
  border-top: 1px solid rgba(10,10,10,0.08);
  position: relative;
}

.cs-row:last-of-type {
  border-bottom: 1px solid rgba(10,10,10,0.08);
}

/* Reverse: image on right, body on left */
.cs-row--reverse .cs-row__media { grid-column: 2; grid-row: 1; }
.cs-row--reverse .cs-row__body  { grid-column: 1; grid-row: 1; }

/* MEDIA — big 4:3 image with badge + meta overlay */
.cs-row__media {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: #111;
  text-decoration: none;
  color: inherit;
  transition: transform 600ms cubic-bezier(0.22, 1, 0.36, 1);
}

.cs-row__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1200ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 800ms ease;
  will-change: transform;
}

.cs-row:hover .cs-row__media img {
  transform: scale(1.045);
  filter: brightness(1.02);
}

/* Bottom gradient scrim for meta legibility */
.cs-row__media::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 44%;
  background: linear-gradient(180deg, transparent 0%, rgba(10,10,10,0.62) 100%);
  pointer-events: none;
}

.cs-row__badge {
  position: absolute;
  top: clamp(14px, 1.8vw, 22px);
  right: clamp(14px, 1.8vw, 22px);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px 6px 8px;
  background: rgba(255,255,255,0.94);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  z-index: 2;
}

.cs-row__badge svg {
  width: 13px;
  height: 13px;
}

.cs-row__meta-overlay {
  position: absolute;
  left: clamp(16px, 2vw, 24px);
  right: clamp(16px, 2vw, 24px);
  bottom: clamp(16px, 2vw, 22px);
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  color: rgba(255,255,255,0.92);
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: 400;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  z-index: 2;
}

.cs-row__meta-tag { font-style: italic; letter-spacing: 0.04em; text-transform: none; opacity: 0.9; }

/* BODY — stacked editorial content */
.cs-row__body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-3), 1.6vw, var(--space-4));
  position: relative;
  padding-right: clamp(0px, 2vw, var(--space-5));
}

.cs-row--reverse .cs-row__body {
  padding-right: 0;
  padding-left: clamp(0px, 2vw, var(--space-5));
}

.cs-row__index {
  font-family: var(--font-display);
  font-weight: 100;
  font-style: italic;
  font-size: clamp(1.125rem, 1.35vw, 1.375rem);
  color: rgba(10,10,10,0.3);
  letter-spacing: 0.02em;
  margin-bottom: -4px;
}

.cs-row__eyebrow {
  margin: 0;
}

.cs-row__title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2.25rem, 4.4vw, 3.875rem);
  line-height: 1;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: var(--space-1) 0 0;
}

.cs-row__title em {
  font-style: italic;
  font-weight: 100;
}

.cs-row__sub {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  color: rgba(10,10,10,0.62);
  margin: 0;
}

.cs-row__quote {
  font-family: var(--font-display);
  font-weight: 300;
  font-style: italic;
  font-size: clamp(1.125rem, 1.55vw, 1.4375rem);
  line-height: 1.38;
  color: var(--color-ink);
  margin: var(--space-2) 0 var(--space-1);
  max-width: 44ch;
}

/* STATS — 3 horizontal items with hairline dividers */
.cs-row__stats {
  list-style: none;
  margin: var(--space-3) 0 0;
  padding: var(--space-4) 0 var(--space-4);
  display: flex;
  gap: clamp(var(--space-4), 3vw, var(--space-8));
  border-top: 1px solid rgba(10,10,10,0.1);
  border-bottom: 1px solid rgba(10,10,10,0.1);
}

.cs-row__stats li {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.cs-row__stat-num {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.625rem, 2.6vw, 2.25rem);
  line-height: 1;
  color: var(--color-ink);
  letter-spacing: -0.01em;
}

.cs-row__stat-label {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.52);
}

/* SERVICES — tag row with rhombus separator */
.cs-row__services {
  list-style: none;
  margin: var(--space-1) 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 12px 18px;
  align-items: center;
}

.cs-row__services li {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.68);
  position: relative;
  padding-right: 18px;
}

.cs-row__services li::after {
  content: "";
  position: absolute;
  right: 0;
  top: 50%;
  width: 5px;
  height: 5px;
  transform: translateY(-50%) rotate(45deg);
  border: 1px solid rgba(10,10,10,0.3);
}

.cs-row__services li:last-child { padding-right: 0; }
.cs-row__services li:last-child::after { display: none; }

.cs-row__cta {
  align-self: flex-start;
  margin-top: var(--space-3);
}

/* Hover — subtle lift on the whole body (title nudges, row border brightens) */
.cs-row:hover {
  background: rgba(10,10,10,0.015);
}

.cs-row:hover .cs-row__title {
  transform: translateX(-3px);
}

.cs-row__title {
  transition: transform 480ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* MOBILE — stack, image on top always */
@media (max-width: 900px) {
  .cs-row,
  .cs-row--reverse {
    grid-template-columns: 1fr;
    gap: var(--space-6);
    padding: clamp(var(--space-6), 9vw, var(--space-9)) clamp(var(--space-4), 6vw, var(--space-6));
  }

  .cs-row--reverse .cs-row__media,
  .cs-row__media {
    grid-column: 1;
    grid-row: 1;
  }

  .cs-row--reverse .cs-row__body,
  .cs-row__body {
    grid-column: 1;
    grid-row: 2;
    padding-left: 0;
    padding-right: 0;
  }

  .cs-row__stats {
    gap: var(--space-4);
  }

  .cs-row__stat-num {
    font-size: clamp(1.375rem, 6vw, 1.75rem);
  }
}

@media (max-width: 520px) {
  .cs-row__media {
    aspect-ratio: 3 / 2;
  }

  .cs-row__stats {
    flex-wrap: wrap;
  }

  .cs-row__stats li {
    min-width: 30%;
  }
}

/* ============================================================
   CASE STUDIES — interstitial bands between rows
   3 creative elements: method quote · aggregate metrics · booking CTA
============================================================ */

.cs-band {
  display: block;
  width: 100%;
  padding: clamp(80px, 9vw, 144px) clamp(var(--space-5), 6vw, var(--space-10));
  border-top: 1px solid rgba(10,10,10,0.08);
  border-bottom: 1px solid rgba(10,10,10,0.08);
}

.cs-band__inner {
  max-width: 1280px;
  margin: 0 auto;
}

.cs-band__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: rgba(10,10,10,0.6);
}

.cs-band__eyebrow svg {
  width: 12px;
  height: 12px;
  color: var(--color-ink);
}

.cs-band__eyebrow--light {
  color: rgba(255,255,255,0.64);
}

.cs-band__eyebrow--light svg {
  color: rgba(255,255,255,0.9);
}

/* ─── BAND A · Method pull-quote ─── */
.cs-band--quote {
  background: var(--color-paper, #fafafa);
  text-align: center;
}

.cs-band--quote .cs-band__inner {
  max-width: 960px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
}

.cs-band__quote {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: clamp(1.5rem, 3.2vw, 2.625rem);
  line-height: 1.22;
  letter-spacing: -0.012em;
  color: var(--color-ink);
  margin: 0;
  max-width: 22ch;
  position: relative;
}

.cs-band__quote em {
  font-style: italic;
  font-weight: 300;
  background: linear-gradient(90deg, rgba(10,10,10,1) 0%, rgba(10,10,10,0.72) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
}

.cs-band__mark {
  display: block;
  font-family: var(--font-display);
  font-weight: 100;
  font-style: italic;
  font-size: clamp(3rem, 6vw, 5rem);
  line-height: 0.6;
  color: rgba(10,10,10,0.18);
  margin-bottom: clamp(var(--space-2), 1vw, var(--space-3));
}

.cs-band__attr {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-style: normal;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: rgba(10,10,10,0.56);
}

.cs-band__attr-rhombus {
  display: inline-block;
  width: 6px;
  height: 6px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.4);
}

/* ─── BAND B · Aggregate metrics (dark full-bleed) ─── */
.cs-band--metrics {
  background: var(--color-ink, #0a0a0a);
  color: #fff;
  border-color: transparent;
  padding-top: clamp(96px, 10vw, 160px);
  padding-bottom: clamp(96px, 10vw, 160px);
}

.cs-band--metrics .cs-band__inner {
  max-width: 1360px;
}

.cs-band__metrics-head {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-4), 2.2vw, var(--space-5));
  margin-bottom: clamp(var(--space-8), 6vw, var(--space-10));
  max-width: 680px;
}

.cs-band__metrics-title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.875rem, 3.8vw, 3.25rem);
  line-height: 1.05;
  letter-spacing: -0.015em;
  color: #fff;
  margin: 0;
}

.cs-band__metrics-title em {
  font-style: italic;
  font-weight: 100;
  color: rgba(255,255,255,0.82);
}

.cs-band__metrics {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0;
}

.cs-band__metrics li {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: clamp(var(--space-5), 3vw, var(--space-7)) clamp(var(--space-4), 2.6vw, var(--space-6));
  border-left: 1px solid rgba(255,255,255,0.12);
}

.cs-band__metrics li:first-child {
  padding-left: 0;
  border-left: 0;
}

.cs-band__metric-num {
  font-family: var(--font-display);
  font-weight: 100;
  font-style: italic;
  font-size: clamp(2.5rem, 5.4vw, 4.75rem);
  line-height: 0.95;
  letter-spacing: -0.02em;
  color: #fff;
}

.cs-band__metric-label {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.8125rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(255,255,255,0.88);
}

.cs-band__metric-note {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.8125rem;
  line-height: 1.5;
  color: rgba(255,255,255,0.52);
  font-style: italic;
}

@media (max-width: 860px) {
  .cs-band__metrics {
    grid-template-columns: repeat(2, 1fr);
  }
  .cs-band__metrics li {
    padding: var(--space-5);
    border-left: 0;
    border-top: 1px solid rgba(255,255,255,0.12);
  }
  .cs-band__metrics li:first-child,
  .cs-band__metrics li:nth-child(2) {
    border-top: 0;
    padding-top: 0;
  }
}

@media (max-width: 520px) {
  .cs-band__metrics {
    grid-template-columns: 1fr;
  }
  .cs-band__metrics li {
    border-top: 1px solid rgba(255,255,255,0.12);
    padding-top: var(--space-5);
  }
  .cs-band__metrics li:first-child {
    border-top: 0;
    padding-top: 0;
  }
}

/* ─── BAND C · Currently booking (light, centered, conversion CTA) ─── */
.cs-band--booking {
  background: var(--color-paper, #fafafa);
  text-align: center;
}

.cs-band--booking .cs-band__inner {
  max-width: 820px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-5), 2.6vw, var(--space-6));
}

.cs-band--booking .cs-band__eyebrow {
  align-items: center;
}

.cs-band__pulse {
  position: relative;
  width: 8px;
  height: 8px;
  transform: rotate(45deg);
  background: #2a8a5a;
  border: 1px solid rgba(42,138,90,0.4);
  animation: cs-band-pulse 2400ms ease-in-out infinite;
}

@keyframes cs-band-pulse {
  0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(42,138,90,0.35); }
  50%      { opacity: 0.6; box-shadow: 0 0 0 6px rgba(42,138,90,0); }
}

.cs-band__booking-title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.75rem, 3.6vw, 2.875rem);
  line-height: 1.08;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 24ch;
}

.cs-band__booking-title em {
  font-style: italic;
  font-weight: 100;
}

.cs-band__booking-lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.65;
  color: rgba(10,10,10,0.62);
  max-width: 54ch;
  margin: 0;
}

.cs-band__booking-ctas {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-3);
  margin-top: var(--space-2);
}

/* Capacity meter — small trust signal below CTAs */
.cs-band__booking-meta {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  margin-top: clamp(var(--space-4), 2vw, var(--space-5));
  padding-top: clamp(var(--space-5), 3vw, var(--space-6));
  border-top: 1px solid rgba(10,10,10,0.1);
  width: 100%;
  max-width: 480px;
  justify-content: center;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.54);
}

.cs-band__booking-meta em {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: 1rem;
  color: var(--color-ink);
  text-transform: none;
  letter-spacing: -0.01em;
  margin-right: 2px;
}

.cs-band__booking-bar {
  position: relative;
  display: inline-block;
  width: 96px;
  height: 3px;
  background: rgba(10,10,10,0.12);
  overflow: hidden;
}

.cs-band__booking-fill {
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: var(--fill, 0%);
  background: var(--color-ink);
}

@media (max-width: 520px) {
  .cs-band__booking-ctas {
    flex-direction: column;
    width: 100%;
  }
  .cs-band__booking-ctas .btn-ct {
    width: 100%;
    justify-content: center;
  }
}

/* ============================================================
   PROJECTS PAGE — hero bg · transform morph · 2-col grid · dump gallery
============================================================ */

/* ─── TRANSFORM · sticky day→night scroll morph (fluid.glass pattern) ───
   Used in two modes:
     1. Standalone section (default) — paper background, padded intro above
     2. .proj-transform--hero — page entry, dark, full-bleed, no intro,
        nav floats over the frame, "Day / Night" caption at bottom-center
*/
.proj-transform {
  background: var(--color-paper, #fafafa);
  padding: clamp(64px, 8vw, 128px) 0 0;
  position: relative;
}

.proj-transform--hero {
  background: #0a0a0a;
  padding: 0;
}

/* Top-only shadow under the floating nav. Pinned to the viewport, present
   from first paint, never animates in. When the floating nav slides up
   on scroll-down, the shadow rides with it via the `body.nav-hidden`
   hook on the body, so the two read as a single piece of UI. */
.proj-transform--hero::before {
  content: "";
  position: fixed;
  top: 0; left: 0; right: 0;
  height: clamp(180px, 22vh, 260px);
  background: linear-gradient(to bottom,
              rgba(10,10,10,0.92) 0%,
              rgba(10,10,10,0.72) 35%,
              rgba(10,10,10,0.42) 70%,
              rgba(10,10,10,0) 100%);
  z-index: 4;
  pointer-events: none;
  transform: translateY(0);
  opacity: 1;
  transition: transform 480ms cubic-bezier(0.22, 0.8, 0.24, 1),
              opacity 320ms var(--motion-ease);
}
body.nav-hidden .proj-transform--hero::before {
  transform: translateY(-110%);
  opacity: 0;
}

.proj-transform__intro {
  text-align: center;
  max-width: 720px;
  padding: 0 clamp(var(--space-4), 4vw, var(--space-6));
  margin: 0 auto clamp(48px, 6vw, 96px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-4);
}

.proj-transform__intro .eyebrow {
  justify-content: center;
}

.proj-transform__heading {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.875rem, 4vw, 3.25rem);
  line-height: 1.06;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 16ch;
}

.proj-transform__heading em {
  font-style: italic;
  font-weight: 100;
}

.proj-transform__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.65;
  color: rgba(10,10,10,0.6);
  max-width: 48ch;
  margin: 0;
}

/* Rail is a tall scroll container. Inside, the sticky frame pins to the
   viewport while the page scrolls, absorbing the scroll to drive the
   day→night crossfade. Total rail = 500vh → 100vh pin + 400vh scroll range
   (~4 scroll ticks). Fluid-glass feel: long opacity smoothstep, subtle scale
   + blur on the day layer as it dissolves, glass-tinted overlay during
   transition. Slow, deliberate, "unlock" rather than swap. */
.proj-transform__rail {
  position: relative;
  height: 500vh;
}

/* Hero mode — shorter pin so the user reaches the projects grid quickly */
.proj-transform--hero .proj-transform__rail {
  height: 220vh;
}

.proj-transform__sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.proj-transform__frame {
  position: relative;
  width: min(94vw, 1280px);
  aspect-ratio: 16 / 9;
  background: #0a0a0a;
  overflow: hidden;
  box-shadow:
    0 8px 24px rgba(0,0,0,0.06),
    0 32px 80px rgba(0,0,0,0.08),
    0 80px 160px rgba(0,0,0,0.08);
}

/* Hero mode — full-bleed frame fills the viewport, no shadow, no aspect cap */
.proj-transform__frame--bleed {
  width: 100%;
  height: 100vh;
  aspect-ratio: auto;
  box-shadow: none;
}

.proj-transform { padding-bottom: clamp(64px, 8vw, 128px); }
.proj-transform--hero { padding-bottom: 0; }

@media (max-width: 760px) {
  .proj-transform__rail { height: 260vh; }
  .proj-transform--hero .proj-transform__rail { height: 200vh; }
}

/* Both layers share exact bounds — pixel-identical overlay.
   object-fit: cover + object-position: center locks framing so even if
   day/night aspects differ slightly, they sit on top of each other cleanly. */
.proj-transform__layer {
  position: absolute;
  inset: 0;
  will-change: opacity, transform, filter;
}
/* Glass tint — held at zero opacity. The dissolve is driven entirely by the
   day/night layer crossfade so luminance flows smoothly from one state to
   the next, with no mid-transition darken→lighten ramp. The element stays
   in the DOM in case a future variant wants to enable it. */
.proj-transform__overlay {
  position: absolute;
  inset: 0;
  background: transparent;
  opacity: 0;
  pointer-events: none;
  z-index: 2;
}

/* Gradient fallbacks — only visible while the images load or if they fail */
.proj-transform__layer--day {
  opacity: 1;
  background: linear-gradient(135deg, #e8c896 0%, #c9a37a 55%, #9f7e5c 100%);
}

.proj-transform__layer--night {
  opacity: 0;
  background: linear-gradient(135deg, #1c2540 0%, #0f1629 55%, #050811 100%);
  /* Lighten blend during the crossfade so the bright pixels of the
     night image (lit windows, lamps, reflections) take precedence
     over the day pixels below as soon as opacity ramps up. The
     image itself is unmodified — no boosted brightness — so the
     lights end up at their TRUE source intensity from start to end
     without dimming during the transition. */
  mix-blend-mode: lighten;
}

.proj-transform__layer img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
  display: block;
  transform-origin: center center;
}

/* Framing calibration — tune these values if day and night were shot from
   slightly different camera positions. Each layer exposes --scale, --x, --y
   as CSS custom properties so you can nudge one image to align with the other
   without touching the HTML or JS. Default is no transform (images as-is). */
.proj-transform__layer--day img {
  --scale: 1;
  --x: 0%;
  --y: 0%;
  transform: scale(var(--scale)) translate(var(--x), var(--y));
}

.proj-transform__layer--night img {
  --scale: 1;
  --x: 0%;
  --y: 0%;
  transform: scale(var(--scale)) translate(var(--x), var(--y));
}

.proj-transform__layer.is-missing img {
  display: none;
}

/* Label strip — day/night indicator with hairline between */
.proj-transform__labels {
  position: absolute;
  top: clamp(18px, 2.4vw, 32px);
  left: 50%;
  transform: translateX(-50%);
  display: inline-flex;
  align-items: center;
  gap: clamp(10px, 1.4vw, 16px);
  padding: 8px 16px;
  background: rgba(0,0,0,0.28);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  z-index: 3;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.2em;
}

/* Bottom-positioned variant — used in hero mode so the caption sits at the
   foot of the viewport, leaving the upper portion clean for the image. */
.proj-transform__labels--bottom {
  top: auto;
  bottom: clamp(28px, 4vw, 56px);
  padding: 10px 18px;
  background: rgba(0,0,0,0.22);
  letter-spacing: 0.28em;
  font-size: 0.75rem;
}

.proj-transform__label {
  color: rgba(255,255,255,0.92);
  transition: opacity 240ms ease;
}

.proj-transform__label-divider {
  display: inline-block;
  width: 16px;
  height: 1px;
  background: rgba(255,255,255,0.4);
}

@media (max-width: 760px) {
  .proj-transform__frame { aspect-ratio: 3 / 4; }
}

/* ─── PROJECTS GRID · stodio-style 2-col stretched ─── */
.projects-grid {
  background: var(--color-paper, #fafafa);
  padding: clamp(80px, 9vw, 144px) clamp(var(--space-5), 5vw, var(--space-9));
}

.projects-grid__head {
  max-width: 1480px;
  margin: 0 auto clamp(56px, 7vw, 104px);
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  gap: clamp(var(--space-5), 4vw, var(--space-8));
  align-items: end;
  padding-bottom: clamp(var(--space-5), 3vw, var(--space-6));
  border-bottom: 1px solid rgba(10,10,10,0.1);
}

.projects-grid__title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2rem, 5.2vw, 4.5rem);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 13ch;
}

.projects-grid__title em {
  font-style: italic;
  font-weight: 100;
}

.projects-grid__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.65;
  color: rgba(10,10,10,0.62);
  max-width: 52ch;
  margin: 0;
  padding-bottom: clamp(var(--space-2), 1vw, var(--space-3));
}

.projects-grid__body {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(var(--space-6), 5vw, var(--space-10)) clamp(var(--space-5), 3.2vw, var(--space-7));
  max-width: 1480px;
  margin: 0 auto;
}

/* Clean aligned 2-col grid (stodio pattern) — no stagger, 16:9 rows. */
.projects-grid__cell {
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  min-width: 0;
  /* Render-perf hint: skip painting off-screen cells to keep scrolling
     smooth on long pages with media-heavy tiles. The intrinsic-size hint
     reserves a stable scroll height so the page doesn't reflow as cells
     enter/leave the rendering set. */
  content-visibility: auto;
  contain-intrinsic-size: 720px 540px;
}

/* Slower, softer reveal on the grid head + cells — the Day/Night hero pins
   for a long scroll, so when the user finally crosses into the grid we want
   the entry to feel like a slow exhale, not a hard pop. */
.projects-grid__head.reveal,
.projects-grid__body > .projects-grid__cell.reveal {
  transform: translateY(28px);
  transition: opacity 1100ms var(--motion-ease),
              transform 1100ms var(--motion-ease);
}
.projects-grid__head.reveal { transition-delay: 80ms; }
.projects-grid__body > .projects-grid__cell.reveal {
  transition-delay: calc(220ms + var(--col, 0) * 120ms);
}

.projects-grid__body > .projects-grid__cell:nth-child(2n+1) { --col: 0; }
.projects-grid__body > .projects-grid__cell:nth-child(2n+2) { --col: 1; }

@media (max-width: 760px) {
  .projects-grid__body > .projects-grid__cell.reveal {
    --col: 0;
    transition-delay: 0ms;
  }
}

@media (prefers-reduced-motion: reduce) {
  .projects-grid__body > .projects-grid__cell.reveal {
    transition-delay: 0ms;
  }
}

.projects-grid__media {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: #111;
}

.projects-grid__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1200ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 800ms ease;
  will-change: transform;
}

.projects-grid__cell:hover .projects-grid__media img {
  transform: scale(1.04);
  filter: brightness(1.02);
}

/* Cursor-follow "View more" glass badge — mirrors the home film-tile pattern.
   JS positions the badge at the cursor inside .projects-grid__media; CSS
   fades it in on :hover. Sharp rectangle, blurred glass, no border-radius. */
.projects-grid__media { cursor: pointer; }
.projects-grid__cell:hover .projects-grid__media { cursor: none; }
.projects-grid__cursor {
  position: absolute;
  left: 0;
  top: 0;
  padding: 10px 16px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.96);
  background: rgba(255,255,255,0.14);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  border: 1px solid rgba(255,255,255,0.42);
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translate3d(0, 0, 0);
  transition: opacity 700ms cubic-bezier(0.22, 0.8, 0.24, 1);
  will-change: transform, opacity;
  z-index: 3;
}
.projects-grid__cell:hover .projects-grid__cursor { opacity: 1; }

.projects-grid__media::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: 40%;
  background: linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.55) 100%);
  pointer-events: none;
}

.projects-grid__meta-overlay {
  position: absolute;
  left: clamp(14px, 1.8vw, 22px);
  right: clamp(14px, 1.8vw, 22px);
  bottom: clamp(14px, 1.8vw, 18px);
  display: flex;
  justify-content: space-between;
  gap: var(--space-3);
  color: rgba(255,255,255,0.92);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  z-index: 2;
}

.projects-grid__footer {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  padding: clamp(var(--space-4), 2vw, var(--space-5)) 0 0;
  gap: 12px;
  border-top: 1px solid rgba(10,10,10,0);
  transition: border-color 400ms ease;
}
/* Top row: project name on the left, valuation block on the right.
   The valuation uses an uppercase Property Valuation label set above
   the price, both right-aligned, locked to the same top edge as the
   project name through alignment-baseline: text-top on the row. */
.projects-grid__row--head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-4);
}
.projects-grid__row--head .projects-grid__name {
  margin-top: 0;
}
.projects-grid__valuation {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 6px;
  text-align: right;
  white-space: nowrap;
  /* Pull the valuation baseline up so the small label rides level
     with the top of the project name, not floating mid-row. */
  margin-top: 4px;
}
.projects-grid__valuation-label {
  font-family: var(--font-body);
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.20em;
  color: rgba(10,10,10,0.55);
  font-weight: 500;
  line-height: 1;
}
.projects-grid__valuation-amount {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.15rem, 1.5vw, 1.4rem);
  letter-spacing: -0.005em;
  color: var(--color-ink);
  line-height: 1;
}
.projects-grid__desc {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.875rem;
  line-height: 1.55;
  color: rgba(10,10,10,0.72);
  margin: 0;
  max-width: 64ch;
}
.projects-grid__row--foot {
  display: flex;
  justify-content: flex-end;
  margin-top: 2px;
}

.projects-grid__name {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.25rem, 1.8vw, 1.625rem);
  line-height: 1.2;
  color: var(--color-ink);
  margin: 0;
  letter-spacing: -0.01em;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.projects-grid__name em {
  font-style: italic;
  font-weight: 100;
}

.projects-grid__cell:hover .projects-grid__name {
  transform: translateX(-2px);
}

.projects-grid__services {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.55);
  text-align: right;
  white-space: nowrap;
}

@media (max-width: 760px) {
  .projects-grid__head {
    grid-template-columns: 1fr;
    gap: var(--space-4);
  }
  .projects-grid__body {
    grid-template-columns: 1fr;
    gap: var(--space-7);
  }
  .projects-grid__services { text-align: left; white-space: normal; }
}

/* ─── DUMP · mixed photos + reels masonry ─── */
.projects-dump {
  background: var(--color-paper-soft, #f3f3f3);
  padding: clamp(80px, 9vw, 144px) clamp(var(--space-5), 5vw, var(--space-9));
}

.projects-dump__head {
  max-width: 1480px;
  margin: 0 auto clamp(var(--space-5), 3vw, var(--space-6));
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  align-items: flex-start;
}

.projects-dump__head .eyebrow {
  margin-bottom: var(--space-1);
}

/* Filter bar — elegant editorial toggles above the dump grid */
.projects-dump__filters {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(20px, 2.6vw, 36px);
  max-width: 1480px;
  margin: 0 auto clamp(var(--space-6), 4vw, var(--space-7));
  padding: clamp(var(--space-4), 2.2vw, var(--space-5)) 0;
  border-top: 1px solid rgba(10,10,10,0.12);
  border-bottom: 1px solid rgba(10,10,10,0.12);
}

.projects-dump__filter {
  appearance: none;
  background: transparent;
  border: 0;
  padding: 2px 0 3px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: rgba(10,10,10,0.52);
  cursor: pointer;
  position: relative;
  transition: color 320ms ease;
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
}

.projects-dump__filter::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 1px;
  background: var(--color-ink);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.projects-dump__filter:hover {
  color: var(--color-ink);
}

.projects-dump__filter:hover::after,
.projects-dump__filter.is-active::after {
  transform: scaleX(1);
  transform-origin: left center;
}

.projects-dump__filter.is-active {
  color: var(--color-ink);
}

.projects-dump__filter-count {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: 0.75rem;
  color: rgba(10,10,10,0.38);
  letter-spacing: -0.01em;
  text-transform: none;
  transition: color 320ms ease;
}

.projects-dump__filter.is-active .projects-dump__filter-count,
.projects-dump__filter:hover .projects-dump__filter-count {
  color: rgba(10,10,10,0.68);
}

@media (max-width: 520px) {
  .projects-dump__filters {
    gap: 16px;
    font-size: 0.6875rem;
  }
  .projects-dump__filter {
    font-size: 0.6875rem;
    letter-spacing: 0.16em;
  }
}

/* Filter state: hide cells that don't match */
.projects-dump__cell.is-hidden {
  display: none;
}

.projects-dump__title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.5rem, 2.8vw, 2.375rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
}

.projects-dump__title em {
  font-style: italic;
  font-weight: 100;
}

.projects-dump__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.875rem, 1.05vw, 1rem);
  line-height: 1.55;
  color: rgba(10,10,10,0.6);
  max-width: 56ch;
  margin: 0;
}

/* Justified-row gallery. Cells render at their native aspect ratio,
   then JS scales each row uniformly so the row fills the container
   width edge-to-edge. No gaps, no cropping, flush left/right edges.
   The JS layer (in projects.html) sets per-cell width/height in px. */
.projects-dump__grid {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(6px, 0.5vw, 10px);
  max-width: 1480px;
  margin: 0 auto;
}

.projects-dump__cell {
  position: relative;
  overflow: hidden;
  background: #111;
  margin: 0;
  display: block;
  flex: 0 0 auto;
  cursor: pointer;
  /* JS sets explicit width / height in px per row pass. */
}

.projects-dump__cell img,
.projects-dump__cell .va__vp {
  width: 100%;
  height: 100%;
  display: block;
}

.projects-dump__cell img {
  object-fit: cover;
  transition: transform 800ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 500ms ease;
}

.projects-dump__cell:hover img {
  transform: scale(1.04);
  filter: brightness(1.05);
}

/* Hidden cells must take no space at all so the justified rows reflow
   cleanly when the filter changes. */
.projects-dump__cell.is-hidden { display: none; }

/* Legacy span modifiers — no-op in justified-row layout. */
.projects-dump__cell--wide,
.projects-dump__cell--tall,
.projects-dump__cell--big { /* no-op */ }

.projects-dump__tag {
  position: absolute;
  top: 10px;
  left: 10px;
  padding: 4px 9px;
  background: rgba(10,10,10,0.68);
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 2;
}

.projects-dump__play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: clamp(44px, 5vw, 62px);
  height: clamp(44px, 5vw, 62px);
  border-radius: 50%;
  background: rgba(255,255,255,0.16);
  border: 1px solid rgba(255,255,255,0.55);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2;
  transition: transform 340ms cubic-bezier(0.22, 1, 0.36, 1),
              background 240ms ease,
              border-color 240ms ease;
}

.projects-dump__cell:hover .projects-dump__play {
  transform: translate(-50%, -50%) scale(1.08);
  background: rgba(255,255,255,0.26);
  border-color: rgba(255,255,255,0.85);
}

.projects-dump__play svg {
  width: 16px;
  height: 16px;
  fill: #ffffff;
  margin-left: 3px;
}

/* Justified-row layout reflows automatically per viewport via JS;
   no per-breakpoint column count needed. */

/* ============================================================
   CTA-CLOSE — reusable closing section across every page
   Light paper bg, massive bar-style action, supporting links.
   Every CTA lands on contact.html (universal lead form).
============================================================ */

.cta-close {
  position: relative;
  background: var(--color-paper, #fafafa);
  padding: clamp(88px, 11vw, 168px) clamp(var(--space-5), 5vw, var(--space-9));
  border-top: 1px solid rgba(10,10,10,0.08);
}

/* (cta-close--dark variant retired — all pages now use the default
   white closing treatment per direction. To re-enable a dark closing
   band on a specific page, scope new rules with a body class.) */

.cta-close__inner {
  max-width: 1180px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: clamp(var(--space-5), 2.8vw, var(--space-7));
}

.cta-close__eyebrow {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: rgba(10,10,10,0.64);
}

.cta-close__pulse {
  display: inline-block;
  width: 7px;
  height: 7px;
  transform: rotate(45deg);
  background: #2a8a5a;
  box-shadow: 0 0 0 0 rgba(42,138,90,0.5);
  animation: cta-close-pulse 2400ms ease-in-out infinite;
}

@keyframes cta-close-pulse {
  0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(42,138,90,0.45); }
  50%      { opacity: 0.65; box-shadow: 0 0 0 8px rgba(42,138,90,0); }
}

.cta-close__display {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.875rem, 4.6vw, 4rem);
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 28ch;
  text-wrap: balance;
}

/* Italic emphasis — solid color, no gradient (prevents disappearing glyphs
   on browsers that drop background-clip: text). */
.cta-close__display em {
  font-style: italic;
  font-weight: 100;
  color: var(--color-ink);
}

.cta-close__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.65;
  color: rgba(10,10,10,0.6);
  max-width: 52ch;
  margin: 0;
}

/* The creative bar-style CTA — full-width hairline borders,
   fills with ink on hover, arrow translates diagonally.
   Refined: smaller padding, thinner borders, restrained type. */
.cta-close__action {
  display: flex;
  align-items: center;
  gap: 0;
  width: 100%;
  max-width: 780px;
  padding: clamp(18px, 2vw, 26px) clamp(20px, 2.4vw, 32px);
  border-top: 1px solid rgba(10,10,10,0.18);
  border-bottom: 1px solid rgba(10,10,10,0.18);
  text-decoration: none;
  color: var(--color-ink);
  position: relative;
  overflow: hidden;
  margin-top: clamp(var(--space-3), 1.4vw, var(--space-4));
  isolation: isolate;
}

/* Ink fill sweeps in from left on hover */
.cta-close__action::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--color-ink);
  transform: translateX(-101%);
  transition: transform 680ms cubic-bezier(0.76, 0, 0.24, 1);
  z-index: 0;
}

.cta-close__action:hover::before,
.cta-close__action:focus-visible::before {
  transform: translateX(0);
}

.cta-close__action-label,
.cta-close__action-rule,
.cta-close__action-cue {
  position: relative;
  z-index: 1;
  transition: color 420ms ease, background 420ms ease;
}

.cta-close__action-label {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.125rem, 1.9vw, 1.625rem);
  line-height: 1;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  flex-shrink: 0;
}

.cta-close__action-label em {
  font-style: italic;
  font-weight: 100;
}

.cta-close__action-rule {
  flex: 1;
  height: 1px;
  background: rgba(10,10,10,0.26);
  margin: 0 clamp(var(--space-4), 3vw, var(--space-7));
}

.cta-close__action-cue {
  flex-shrink: 0;
  width: clamp(26px, 2.4vw, 34px);
  height: clamp(26px, 2.4vw, 34px);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
}

.cta-close__action-arrow {
  width: 100%;
  height: 100%;
  color: var(--color-ink);
  transition: transform 520ms cubic-bezier(0.22, 1, 0.36, 1),
              color 420ms ease;
}

/* Keep the arrow strokes thin regardless of displayed size */
.cta-close__action-arrow path {
  vector-effect: non-scaling-stroke;
  stroke-width: 1;
}

.cta-close__action:hover .cta-close__action-label {
  color: var(--color-paper, #fafafa);
}

.cta-close__action:hover .cta-close__action-rule {
  background: rgba(255,255,255,0.38);
}

.cta-close__action:hover .cta-close__action-arrow {
  color: var(--color-paper, #fafafa);
  transform: translate(5px, -5px);
}

/* Supporting links row — small editorial trio with rhombus separators */
.cta-close__links {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin-top: clamp(var(--space-2), 1vw, var(--space-3));
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.16em;
}

.cta-close__links a {
  color: rgba(10,10,10,0.56);
  text-decoration: none;
  position: relative;
  padding: 3px 0;
  transition: color 320ms ease;
}

.cta-close__links a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: var(--color-ink);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.cta-close__links a:hover {
  color: var(--color-ink);
}

.cta-close__links a:hover::after {
  transform: scaleX(1);
  transform-origin: left center;
}

.cta-close__links-sep {
  display: inline-block;
  width: 5px;
  height: 5px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.32);
}

/* Capacity meter — optional trust signal under the links */
.cta-close__meter {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  margin-top: clamp(var(--space-4), 2.4vw, var(--space-5));
  padding-top: clamp(var(--space-4), 2.6vw, var(--space-5));
  border-top: 1px solid rgba(10,10,10,0.1);
  width: 100%;
  max-width: 480px;
  justify-content: center;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.54);
}

.cta-close__meter em {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: 0.9375rem;
  color: var(--color-ink);
  text-transform: none;
  letter-spacing: -0.01em;
  margin-right: 3px;
}

/* FOMO line — italic accent that wraps under the bar at narrow widths */
.cta-close__meter-fomo {
  font-style: italic;
  font-weight: 300;
  text-transform: none;
  letter-spacing: 0.01em;
  color: rgba(10,10,10,0.78);
  margin-left: 4px;
}

.cta-close__meter-bar {
  position: relative;
  display: inline-block;
  width: 100px;
  height: 3px;
  background: rgba(10,10,10,0.12);
  overflow: hidden;
}

.cta-close__meter-fill {
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: var(--fill, 0%);
  background: var(--color-ink);
}

@media (max-width: 640px) {
  .cta-close__action {
    padding: 22px 20px;
    gap: var(--space-3);
  }
  .cta-close__action-rule { display: none; }
  .cta-close__action-label { font-size: 1.375rem; }
  .cta-close__action-cue { width: 40px; height: 40px; }
  .cta-close__links {
    flex-direction: column;
    gap: 10px;
  }
  .cta-close__links-sep { display: none; }
}

/* ============================================================
   JOURNAL PAGE — hero override · wide intro · filter bar · 3-col grid
============================================================ */

/* Hero bg — Dusit Suites Athens, rooftop pool at twilight (HOA-DSP1).
   Swapped in from the Dusit page hero; the previous hero-journal.jpg
   has moved over to be the Dusit page hero. */
.journal-page-hero .about-hero__bg {
  background-image: url("../assets/portfolio/dusit-suites-athens/gallery/HOA-DSP1.jpg");
}
/* Journal hero title — force exactly 2 lines (not 3) at all viewports.
   Each .hero-line wraps as one unbroken line. Font-size scales down on
   narrow viewports so the text never overflows horizontally. ───────── */
.journal-page-hero .about-hero__display .hero-line {
  white-space: nowrap;
}
.journal-page-hero .about-hero__display {
  font-size: clamp(1.75rem, 4.2vw, 4.5rem);
}

/* Journal list wrapper — generous bottom padding for breathing before CTA */
.journal-list {
  background: var(--color-paper, #fafafa);
  padding: clamp(64px, 8vw, 112px) clamp(var(--space-5), 5vw, var(--space-9)) clamp(112px, 14vw, 192px);
}

/* Wide intro — heading LEFT, lede+meta RIGHT (case-studies pattern) */
.journal-list__intro {
  max-width: 1480px;
  margin: 0 auto clamp(var(--space-7), 5vw, var(--space-9));
}

.journal-list__intro-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  gap: clamp(var(--space-6), 6vw, var(--space-10));
  align-items: end;
  padding-bottom: clamp(var(--space-6), 4vw, var(--space-8));
  border-bottom: 1px solid rgba(10,10,10,0.1);
}

.journal-list__intro-head .eyebrow {
  margin-bottom: clamp(var(--space-4), 2vw, var(--space-5));
  justify-content: flex-start;
}

.journal-list__heading {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2.25rem, 5.6vw, 5rem);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 12ch;
}

.journal-list__heading em {
  font-style: italic;
  font-weight: 100;
}

.journal-list__intro-side {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-5), 3vw, var(--space-7));
  justify-content: flex-end;
  padding-bottom: clamp(var(--space-2), 0.8vw, var(--space-3));
}

.journal-list__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.68;
  color: rgba(10,10,10,0.66);
  max-width: 52ch;
  margin: 0;
}

.journal-list__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(12px, 1.8vw, 20px);
  margin: 0;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.5);
}

.journal-list__meta span:not(.journal-list__meta-sep) {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
}

.journal-list__meta em {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: clamp(1.0625rem, 1.35vw, 1.1875rem);
  letter-spacing: -0.01em;
  color: var(--color-ink);
  text-transform: none;
  line-height: 1;
}

.journal-list__meta-sep {
  display: inline-block;
  width: 5px;
  height: 5px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.3);
}

@media (max-width: 860px) {
  .journal-list__intro-grid {
    grid-template-columns: 1fr;
    gap: var(--space-5);
    align-items: start;
  }
  .journal-list__heading { max-width: 18ch; }
  .journal-list__intro-side { justify-content: flex-start; padding-bottom: 0; }
}

/* Filter bar — same editorial toggle pattern as dump */
.journal-list__filters {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(20px, 2.6vw, 36px);
  max-width: 1480px;
  margin: 0 auto clamp(var(--space-7), 5vw, var(--space-9));
  padding: clamp(var(--space-4), 2.2vw, var(--space-5)) 0;
  border-top: 1px solid rgba(10,10,10,0.12);
  border-bottom: 1px solid rgba(10,10,10,0.12);
}

.journal-list__filter {
  appearance: none;
  background: transparent;
  border: 0;
  padding: 2px 0 3px;
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: rgba(10,10,10,0.52);
  cursor: pointer;
  position: relative;
  transition: color 320ms ease;
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
}

.journal-list__filter::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 1px;
  background: var(--color-ink);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.journal-list__filter:hover {
  color: var(--color-ink);
}

.journal-list__filter:hover::after,
.journal-list__filter.is-active::after {
  transform: scaleX(1);
  transform-origin: left center;
}

.journal-list__filter.is-active {
  color: var(--color-ink);
}

.journal-list__filter-count {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: 0.75rem;
  color: rgba(10,10,10,0.38);
  letter-spacing: -0.01em;
  text-transform: none;
  transition: color 320ms ease;
}

.journal-list__filter.is-active .journal-list__filter-count,
.journal-list__filter:hover .journal-list__filter-count {
  color: rgba(10,10,10,0.68);
}

@media (max-width: 520px) {
  .journal-list__filters { gap: 16px; }
  .journal-list__filter { font-size: 0.6875rem; letter-spacing: 0.16em; }
}

/* Grid — 9 cards, 3-col desktop, 2-col tablet, 1-col mobile */
.journal-list__body {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(var(--space-6), 4vw, var(--space-9)) clamp(var(--space-5), 3vw, var(--space-7));
  max-width: 1480px;
  margin: 0 auto;
}

@media (max-width: 900px) {
  .journal-list__body {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 600px) {
  .journal-list__body {
    grid-template-columns: 1fr;
    gap: var(--space-7);
  }
}

/* Individual card — simple per-column stagger, no forced GPU layers.
   Browser auto-composites opacity + transform; we don't hint. */
.journal-card {
  display: block;
  position: relative;
  outline: 1px solid transparent;
  outline-offset: clamp(10px, 1.2vw, 14px);
  transition: outline-color 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Whole-card hover — subtle hairline frame distinguishes the card from siblings.
   Signals "you can click anywhere" without shouting. */
.journal-card:hover {
  outline-color: rgba(10,10,10,0.16);
}

.journal-list__body > .journal-card.reveal {
  transition-delay: calc(var(--col, 0) * 60ms);
}

.journal-list__body > .journal-card:nth-child(3n+1) { --col: 0; }
.journal-list__body > .journal-card:nth-child(3n+2) { --col: 1; }
.journal-list__body > .journal-card:nth-child(3n+3) { --col: 2; }

@media (max-width: 900px) {
  .journal-list__body > .journal-card:nth-child(2n+1) { --col: 0; }
  .journal-list__body > .journal-card:nth-child(2n+2) { --col: 1; }
  .journal-list__body > .journal-card:nth-child(3n+3) { --col: 1; }
}

@media (max-width: 600px) {
  .journal-list__body > .journal-card.reveal { --col: 0; transition-delay: 0ms; }
}

@media (prefers-reduced-motion: reduce) {
  .journal-list__body > .journal-card.reveal {
    transition-delay: 0ms;
  }
}

/* Card is NOT one big link anymore — media / title / more are 3 separate <a>s.
   This lets us keep card-wide hover subtle while the "Read dispatch" button
   has its own prominent hover. */
.journal-card__media {
  display: block;
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: #111;
  margin-bottom: clamp(var(--space-4), 2.2vw, var(--space-5));
  text-decoration: none;
  color: inherit;
}

.journal-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1200ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 800ms ease;
  will-change: transform;
}

/* Media hover: subtle image lift */
.journal-card__media:hover img,
.journal-card:hover .journal-card__media img {
  transform: scale(1.025);
  filter: brightness(1.02);
}

.journal-card__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,0.14) 0%, transparent 28%, transparent 68%, rgba(0,0,0,0.38) 100%);
  pointer-events: none;
}

/* Ghost index number — top-left of media, large italic, low opacity */
.journal-card__num {
  position: absolute;
  top: clamp(12px, 1.6vw, 18px);
  left: clamp(14px, 1.8vw, 22px);
  font-family: var(--font-display);
  font-weight: 100;
  font-style: italic;
  font-size: clamp(1rem, 1.4vw, 1.25rem);
  letter-spacing: 0.02em;
  color: rgba(255,255,255,0.68);
  z-index: 2;
  text-shadow: 0 1px 6px rgba(0,0,0,0.22);
}

/* Category chip — top-right of media, glass pill */
.journal-card__cat {
  position: absolute;
  top: clamp(12px, 1.6vw, 18px);
  right: clamp(14px, 1.8vw, 22px);
  padding: 4px 9px;
  background: rgba(255,255,255,0.92);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 2;
}

.journal-card__body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-2), 1.2vw, var(--space-3));
}

/* Date + reading time — hairline divider treatment */
.journal-card__meta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.5);
}

.journal-card__meta time,
.journal-card__meta span {
  white-space: nowrap;
}

.journal-card__meta-sep {
  display: inline-block;
  width: 4px;
  height: 4px;
  transform: rotate(45deg);
  border: 1px solid rgba(10,10,10,0.3);
  flex-shrink: 0;
}

/* Title — editorial IvyPresto with italic emphasis. The <a> inside inherits
   typography; the h3 is just a spacing wrapper. */
.journal-card__title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.25rem, 1.7vw, 1.625rem);
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 4px 0 0;
}

.journal-card__title em {
  font-style: italic;
  font-weight: 100;
}

.journal-card__title-link {
  color: inherit;
  text-decoration: none;
  display: inline-block;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1),
              color 240ms ease;
}

.journal-card__title-link:hover {
  transform: translateX(-2px);
  color: rgba(10,10,10,0.82);
}

/* Excerpt — 2-line body */
.journal-card__excerpt {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.9375rem;
  line-height: 1.55;
  color: rgba(10,10,10,0.6);
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* "Read the dispatch" — a real outlined button. Sharp corners, 1px hairline
   border, ink-fill sweep on direct hover. Card-wide hover darkens the border
   subtly. Gotham Light (300) per brand direction. */
.journal-card__more {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: clamp(var(--space-3), 1.6vw, var(--space-4));
  padding: 10px 16px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--color-ink);
  position: relative;
  width: fit-content;
  text-decoration: none;
  border: 1px solid rgba(10,10,10,0.26);
  background: transparent;
  overflow: hidden;
  isolation: isolate;
  transition: color 320ms ease,
              border-color 320ms ease;
}

/* Sharp thin NE arrow */
.journal-card__more svg {
  width: 12px;
  height: 12px;
  color: currentColor;
  transition: transform 520ms cubic-bezier(0.22, 1, 0.36, 1);
  stroke-width: 1;
  stroke-linecap: butt;
  stroke-linejoin: miter;
  flex-shrink: 0;
}

/* Ink fill sweep — covers the button from left to right on direct hover */
.journal-card__more::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--color-ink);
  transform: translateX(-101%);
  transition: transform 560ms cubic-bezier(0.76, 0, 0.24, 1);
  z-index: -1;
}

/* Card-wide hover → subtle: border darkens, arrow barely nudges */
.journal-card:hover .journal-card__more {
  border-color: rgba(10,10,10,0.52);
}

.journal-card:hover .journal-card__more svg {
  transform: translate(2px, -2px);
}

/* Direct button hover → full invert: ink fills, text/arrow flip to paper color,
   arrow translates more. Clear CTA moment. */
.journal-card__more:hover,
.journal-card__more:focus-visible {
  color: var(--color-paper, #fafafa);
  border-color: var(--color-ink);
  outline: none;
}

.journal-card__more:hover::before,
.journal-card__more:focus-visible::before {
  transform: translateX(0);
}

.journal-card__more:hover svg,
.journal-card__more:focus-visible svg {
  transform: translate(5px, -5px);
}

/* Filter state: hidden cards don't take up grid space */
.journal-card.is-hidden {
  display: none;
}

/* ============================================================
   CONTACT PAGE — hero + 2-col (companies image · form placeholder)
============================================================ */

/* Hero bg — Villa Bond exterior (HOA-VBP51) */
.contact-page-hero .about-hero__bg {
  background-image: url("../assets/portfolio/hero-contact.jpg");
}

/* About page hero — Villa Selene exterior (HOA-VSP1) */
.about-page-hero .about-hero__bg {
  background-image: url("../assets/portfolio/hero-about.jpg");
}

/* Approach page hero — Villa Rafaella exterior (HOA-VRP48) */
.approach-hero .about-hero__bg {
  background-image: url("../assets/portfolio/hero-approach.jpg");
}

/* Full-screen parity lock for the four inner-page heroes. The contact
   page is the reference: every page now uses the EXACT same fixed
   panel height (not `min-height`, which let the panel grow when the
   inner content stack was taller than the viewport, so Approach was
   rendering taller than About / Journal / Contact and the chips were
   landing in different places). With `height: 100vh` + `overflow:
   hidden` the four panels are pixel-identical, the bg image renders at
   the same dimensions, and the bottom-left location chip + bottom-right
   time chip land at the same coordinate on every page. ================ */
.about-page-hero .about-hero__panel,
.approach-hero .about-hero__panel,
.journal-page-hero .about-hero__panel,
.contact-page-hero .about-hero__panel {
  height: 100vh;
  min-height: 100vh;
  max-height: 100vh;
  padding: clamp(var(--space-5), 3vw, var(--space-7)) clamp(var(--space-5), 4vw, var(--space-8));
  overflow: hidden;
}
/* Inner stack is allowed to shrink to fit so a long title doesn't push
   the panel taller than the viewport. ============================= */
.about-page-hero .about-hero__center,
.approach-hero .about-hero__center,
.journal-page-hero .about-hero__center,
.contact-page-hero .about-hero__center {
  padding-block: clamp(var(--space-7), 8vh, var(--space-10));
}

.contact-form-section {
  background: var(--color-paper, #fafafa);
  padding: clamp(48px, 6vw, 88px) clamp(var(--space-5), 5vw, var(--space-9)) clamp(56px, 7vw, 104px);
}

.contact-form-grid {
  max-width: 1480px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(var(--space-7), 6vw, var(--space-12));
  align-items: stretch;
}
/* Solo variant — image column removed, form runs full-width inside a
   tighter measure so the long-form brief still reads comfortably. */
.contact-form-grid--solo {
  grid-template-columns: minmax(0, 1fr);
  max-width: 980px;
}

/* ── LEFT: companies image + compact list ── */
.contact-form-side {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-6), 4vw, var(--space-8));
  position: sticky;
  top: clamp(32px, 4vw, 56px);
}

.contact-form-image {
  position: relative;
  /* Tall portrait — fills the form column width and runs longer than a
     standard 9:16, so the still reads as a true vertical photograph
     instead of a boxy crop next to the form. */
  aspect-ratio: 3 / 5;
  width: 100%;
  height: auto;
  margin: 0;
  overflow: hidden;
  background: #111;
}

.contact-form-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.contact-form-side-body {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-3), 1.6vw, var(--space-4));
}

.contact-form-side-title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.5rem, 2.6vw, 2rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 18ch;
}

.contact-form-side-title em {
  font-style: italic;
  font-weight: 100;
}

.contact-form-side-lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.05vw, 1rem);
  line-height: 1.6;
  color: rgba(10,10,10,0.62);
  max-width: 50ch;
  margin: 0;
}

.contact-form-side-list {
  list-style: none;
  padding: 0;
  margin: clamp(var(--space-3), 1.4vw, var(--space-4)) 0 0;
  display: flex;
  flex-direction: column;
  border-top: 1px solid rgba(10,10,10,0.1);
}

.contact-form-side-list li {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: clamp(var(--space-3), 1.4vw, var(--space-4)) 0;
  border-bottom: 1px solid rgba(10,10,10,0.08);
}

.contact-form-side-name {
  font-family: var(--font-display);
  font-weight: 200;
  font-style: italic;
  font-size: clamp(1.0625rem, 1.35vw, 1.1875rem);
  letter-spacing: -0.01em;
  color: var(--color-ink);
}

.contact-form-side-note {
  font-family: var(--font-body);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(10,10,10,0.5);
}

/* ── RIGHT: form panel ── */
.contact-form-panel {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
}

.contact-form-title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2rem, 4.2vw, 3.25rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 18ch;
}

.contact-form-title em {
  font-style: italic;
  font-weight: 100;
}

.contact-form-lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(10,10,10,0.6);
  max-width: 52ch;
  margin: 0;
}

.contact-form {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-4), 2vw, var(--space-5));
  margin-top: clamp(var(--space-3), 1.6vw, var(--space-4));
}

/* Tally form slot — modal-launch button + supporting hint */
.contact-form__tally {
  margin-top: clamp(var(--space-3), 1.6vw, var(--space-4));
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: clamp(var(--space-3), 1.4vw, var(--space-4));
}

.contact-form__tally-btn {
  font-family: var(--font-body);
  cursor: pointer;
  font-size: inherit;
  line-height: inherit;
}

.contact-form__tally-placeholder {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 12px;
  padding: clamp(var(--space-5), 3vw, var(--space-7));
  border: 1px dashed rgba(10,10,10,0.22);
  background: rgba(10,10,10,0.015);
  min-height: inherit;
}

.contact-form__tally-dot {
  display: inline-block;
  width: 7px;
  height: 7px;
  transform: rotate(45deg);
  background: rgba(10,10,10,0.4);
  margin-bottom: 6px;
}

.contact-form__tally-label {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.22em;
  color: rgba(10,10,10,0.6);
}

.contact-form__tally-hint {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.8125rem;
  line-height: 1.5;
  color: rgba(10,10,10,0.5);
  max-width: 40ch;
}

.contact-form__tally-hint code {
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-size: 0.75rem;
  background: rgba(10,10,10,0.06);
  padding: 2px 6px;
  color: rgba(10,10,10,0.7);
}

/* When a real iframe is embedded, hide the placeholder */
.contact-form__tally:has(iframe) .contact-form__tally-placeholder {
  display: none;
}

.contact-form__tally iframe {
  width: 100% !important;
  min-height: 520px;
  border: 0;
}

/* ============================================================
   CONTACT NOT-FOR — soft qualification standards below the form
============================================================ */

.contact-not-for {
  background: var(--color-paper, #fafafa);
  padding: clamp(80px, 10vw, 144px) clamp(var(--space-5), 5vw, var(--space-9)) clamp(112px, 12vw, 176px);
  border-top: 1px solid rgba(10,10,10,0.08);
}

/* ============================================================
   FAQ PAGE — 3-category accordion body (/faq)
============================================================ */

.faq-page {
  background: var(--color-paper, #fafafa);
  padding: clamp(80px, 10vw, 128px) clamp(var(--space-5), 5vw, var(--space-9)) clamp(96px, 11vw, 160px);
  border-top: 1px solid rgba(10,10,10,0.08);
}
.faq-page__inner { max-width: 1000px; margin: 0 auto; }

.faq-page__cat { margin-bottom: clamp(var(--space-8), 9vw, var(--space-10)); }
.faq-page__cat:last-child { margin-bottom: 0; }

.faq-page__cat-head {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-2), 1.2vw, var(--space-3));
  margin-bottom: clamp(var(--space-5), 3vw, var(--space-6));
  padding-bottom: clamp(var(--space-4), 2.4vw, var(--space-5));
  border-bottom: 1px solid rgba(10,10,10,0.12);
}

.faq-page__cat-title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: clamp(1.625rem, 3vw, 2.25rem);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--color-ink, #0a0a0a);
  margin: 0;
  max-width: 36ch;
}

.faq-page__cat-sub {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1rem);
  line-height: 1.55;
  color: rgba(10,10,10,0.58);
  margin: 0;
  max-width: 56ch;
}

.faq-page__list { display: flex; flex-direction: column; gap: clamp(8px, 0.9vw, 12px); }

.contact-not-for__inner {
  max-width: 1280px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(var(--space-7), 6vw, var(--space-12));
  align-items: start;
}

.contact-not-for__head {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-3), 1.6vw, var(--space-4));
  position: sticky;
  top: clamp(32px, 4vw, 64px);
}

.contact-not-for__title {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(2rem, 4.4vw, 3.5rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--color-ink);
  margin: 0;
  max-width: 14ch;
}

.contact-not-for__title em {
  font-style: italic;
  font-weight: 100;
}

.contact-not-for__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(10,10,10,0.6);
  max-width: 48ch;
  margin: 0;
}

.contact-not-for__list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
}

.contact-not-for__item {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(var(--space-4), 2.2vw, var(--space-5));
  padding: clamp(var(--space-4), 2.4vw, var(--space-5)) 0;
  border-bottom: 1px solid rgba(10,10,10,0.08);
}
/* No row-level hover background or padding shift — the only hover affordance
   is the × mark itself lifting up. Keeps first/last rows clean (no clipped
   shadow visible) and the editorial look unbroken. */

.contact-not-for__item:first-child {
  padding-top: 0;
}

.contact-not-for__item:last-child {
  border-bottom: 0;
  padding-bottom: 0;
}

/* Soft × mark — thin italic; on row hover, very gentle scale + deeper ink, no rotation */
.contact-not-for__mark {
  font-family: var(--font-display);
  font-weight: 100;
  font-style: italic;
  font-size: 1.75rem;
  line-height: 1;
  color: rgba(10,10,10,0.28);
  padding-top: 4px;
  display: inline-block;
  transform-origin: center center;
  transition:
    color 480ms cubic-bezier(0.4, 0, 0.2, 1),
    transform 520ms cubic-bezier(0.4, 0, 0.2, 1);
}

.contact-not-for__item:hover .contact-not-for__mark,
.contact-not-for__item:focus-within .contact-not-for__mark {
  color: var(--color-ink);
  transform: translateY(-3px);
}

.contact-not-for__item-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.contact-not-for__item-title {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(1rem, 1.2vw, 1.125rem);
  line-height: 1.5;
  color: rgba(10,10,10,0.82);
  letter-spacing: 0;
  transition: color 360ms cubic-bezier(0.4, 0, 0.2, 1);
}

.contact-not-for__item:hover .contact-not-for__item-title,
.contact-not-for__item:focus-within .contact-not-for__item-title {
  color: var(--color-ink);
}

.contact-not-for__item-note {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.875rem, 1vw, 0.9375rem);
  line-height: 1.58;
  color: rgba(10,10,10,0.58);
  max-width: 64ch;
}

@media (max-width: 760px) {
  .contact-not-for__inner {
    grid-template-columns: 1fr;
    gap: clamp(var(--space-6), 6vw, var(--space-8));
  }
  .contact-not-for__head { position: static; }
}

.contact-form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(var(--space-4), 2.2vw, var(--space-5));
}

.contact-form__field {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.contact-form__field label {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: rgba(10,10,10,0.6);
}

.contact-form__hint {
  text-transform: none;
  letter-spacing: 0;
  color: rgba(10,10,10,0.38);
  font-weight: 300;
  font-style: italic;
}

.contact-form input,
.contact-form select,
.contact-form textarea {
  appearance: none;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(10,10,10,0.22);
  padding: 10px 0;
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.9375rem;
  line-height: 1.4;
  color: var(--color-ink);
  transition: border-color 320ms ease;
  border-radius: 0;
}

.contact-form textarea {
  resize: vertical;
  min-height: 120px;
}

.contact-form input:focus,
.contact-form select:focus,
.contact-form textarea:focus {
  outline: none;
  border-bottom-color: var(--color-ink);
}

/* Keyboard-only focus ring: the border-bottom color change alone is too subtle
   for sighted keyboard users. Show a 2px ink ring on `:focus-visible` only,
   so mouse users keep the clean look. */
.contact-form input:focus-visible,
.contact-form select:focus-visible,
.contact-form textarea:focus-visible {
  outline: 2px solid var(--color-ink);
  outline-offset: 2px;
}

.contact-form input::placeholder,
.contact-form textarea::placeholder {
  color: rgba(10,10,10,0.34);
  font-weight: 300;
}

.contact-form select {
  cursor: pointer;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgba(10,10,10,0.5)' stroke-width='1' stroke-linecap='butt'><path d='M4 6 L8 10 L12 6'/></svg>");
  background-repeat: no-repeat;
  background-position: right 4px center;
  padding-right: 24px;
}

.contact-form__note {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: clamp(var(--space-3), 1.6vw, var(--space-4));
  background: rgba(10,10,10,0.04);
  border-left: 2px solid rgba(10,10,10,0.4);
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.8125rem;
  line-height: 1.55;
  color: rgba(10,10,10,0.7);
}

.contact-form__note a {
  color: var(--color-ink);
  text-decoration: underline;
  text-decoration-color: rgba(10,10,10,0.4);
  text-underline-offset: 3px;
}

.contact-form__note-dot {
  display: inline-block;
  width: 7px;
  height: 7px;
  transform: rotate(45deg);
  background: rgba(10,10,10,0.5);
  margin-top: 5px;
  flex-shrink: 0;
}

/* Submit button — same bar-style as cta-close__action (for visual parity) */
.contact-form__submit {
  display: flex;
  align-items: center;
  gap: 0;
  width: 100%;
  max-width: 520px;
  padding: clamp(18px, 2vw, 24px) clamp(20px, 2.4vw, 28px);
  border: 1px solid rgba(10,10,10,0.2);
  background: transparent;
  text-decoration: none;
  color: var(--color-ink);
  position: relative;
  overflow: hidden;
  isolation: isolate;
  font-family: var(--font-body);
  cursor: pointer;
  margin-top: clamp(var(--space-2), 1vw, var(--space-3));
}

.contact-form__submit[disabled] {
  cursor: not-allowed;
  opacity: 0.52;
}

.contact-form__submit::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--color-ink);
  transform: translateX(-101%);
  transition: transform 620ms cubic-bezier(0.76, 0, 0.24, 1);
  z-index: -1;
}

.contact-form__submit:not([disabled]):hover::before {
  transform: translateX(0);
}

.contact-form__submit-label {
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.125rem, 1.8vw, 1.5rem);
  line-height: 1;
  letter-spacing: -0.015em;
  flex-shrink: 0;
  transition: color 420ms ease;
}

.contact-form__submit-rule {
  flex: 1;
  height: 1px;
  background: rgba(10,10,10,0.26);
  margin: 0 clamp(var(--space-4), 3vw, var(--space-6));
  transition: background 420ms ease;
}

.contact-form__submit-cue {
  flex-shrink: 0;
  width: clamp(26px, 2.4vw, 32px);
  height: clamp(26px, 2.4vw, 32px);
  display: flex;
  align-items: center;
  justify-content: center;
}

.contact-form__submit-cue svg {
  width: 100%;
  height: 100%;
  color: var(--color-ink);
  transition: transform 520ms cubic-bezier(0.22, 1, 0.36, 1), color 420ms ease;
}

.contact-form__submit:not([disabled]):hover .contact-form__submit-label {
  color: var(--color-paper);
}

.contact-form__submit:not([disabled]):hover .contact-form__submit-rule {
  background: rgba(255,255,255,0.38);
}

.contact-form__submit:not([disabled]):hover .contact-form__submit-cue svg {
  color: var(--color-paper);
  transform: translate(5px, -5px);
}

/* Direct contact row — email, WhatsApp, phone */
.contact-form__direct {
  margin-top: clamp(var(--space-3), 1.6vw, var(--space-5));
  padding-top: clamp(var(--space-4), 2vw, var(--space-5));
  border-top: 1px solid rgba(10,10,10,0.1);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.contact-form__direct-title {
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: rgba(10,10,10,0.5);
}

.contact-form__direct ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 14px 24px;
}

.contact-form__direct a {
  font-family: var(--font-body);
  font-size: 0.875rem;
  color: rgba(10,10,10,0.72);
  text-decoration: none;
  position: relative;
  padding: 3px 0;
  transition: color 240ms ease;
}

.contact-form__direct a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: var(--color-ink);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.contact-form__direct a:hover {
  color: var(--color-ink);
}

.contact-form__direct a:hover::after {
  transform: scaleX(1);
  transform-origin: left center;
}

@media (max-width: 900px) {
  .contact-form-grid {
    grid-template-columns: 1fr;
    gap: clamp(var(--space-7), 8vw, var(--space-10));
  }
  .contact-form-side {
    position: static;
  }
  .contact-form-image {
    aspect-ratio: 16 / 10;
  }
}

@media (max-width: 600px) {
  .contact-form__row {
    grid-template-columns: 1fr;
    gap: clamp(var(--space-4), 4vw, var(--space-5));
  }
  .contact-form__submit-rule { display: none; }
}

/* ============================================================
   HAMBURGER + SIDE MENU — appears after hero scroll, panel from right
============================================================ */

.hamburger {
  position: fixed;
  top: clamp(16px, 2vw, 24px);
  right: clamp(16px, 2vw, 24px);
  width: clamp(44px, 3.4vw, 52px);
  height: clamp(44px, 3.4vw, 52px);
  background: var(--color-ink, #0a0a0a);
  color: #fff;
  border: 0;
  padding: 0;
  cursor: pointer;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-14px) scale(0.86);
  filter: blur(4px);
  transition: opacity 640ms cubic-bezier(0.22, 1, 0.36, 1),
              transform 640ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 480ms cubic-bezier(0.22, 1, 0.36, 1),
              background 240ms ease,
              visibility 0ms linear 640ms;
}

.hamburger.is-active {
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1);
  filter: blur(0);
  transition: opacity 640ms cubic-bezier(0.22, 1, 0.36, 1),
              transform 640ms cubic-bezier(0.22, 1, 0.36, 1),
              filter 480ms cubic-bezier(0.22, 1, 0.36, 1),
              background 240ms ease,
              visibility 0ms linear 0ms;
}

/* Tablet / mobile: the hamburger is the ONLY nav available (`.nav__links` is
   hidden ≤840px). Show it unconditionally on small viewports so users on
   pages without a hero-scroll trigger (about, approach, faq, contact, all
   project pages, journal, privacy, terms) still see a menu above the fold. */
@media (max-width: 840px) {
  .hamburger {
    opacity: 1;
    visibility: visible;
    transform: none;
    filter: none;
  }
}

.hamburger:hover {
  background: #141414;
}

.hamburger__box {
  width: 22px;
  height: 12px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  position: relative;
}

.hamburger__line {
  display: block;
  height: 1px;
  background: currentColor;
  transition: transform 380ms cubic-bezier(0.76, 0, 0.24, 1),
              opacity 240ms ease,
              width 380ms cubic-bezier(0.22, 1, 0.36, 1);
}

.hamburger__line:nth-child(1) { width: 100%; }
.hamburger__line:nth-child(2) { width: 70%; align-self: flex-end; }
.hamburger__line:nth-child(3) { width: 100%; }

.hamburger:hover .hamburger__line:nth-child(2) {
  width: 100%;
}

/* Open state — morph into X */
.hamburger.is-open .hamburger__line:nth-child(1) {
  transform: translateY(5.5px) rotate(45deg);
}
.hamburger.is-open .hamburger__line:nth-child(2) {
  opacity: 0;
}
.hamburger.is-open .hamburger__line:nth-child(3) {
  transform: translateY(-5.5px) rotate(-45deg);
  width: 100%;
}

/* Overlay */
.side-menu__overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.55);
  z-index: 98;
  opacity: 0;
  visibility: hidden;
  transition: opacity 420ms cubic-bezier(0.22, 1, 0.36, 1),
              visibility 0ms linear 420ms;
  cursor: pointer;
}

.side-menu__overlay.is-open {
  opacity: 1;
  visibility: visible;
  transition: opacity 420ms cubic-bezier(0.22, 1, 0.36, 1),
              visibility 0ms linear 0ms;
}

/* Side panel — slides in from right, sharp edges */
.side-menu {
  position: fixed;
  top: 0;
  right: 0;
  width: min(560px, 100vw);
  height: 100vh;
  background: var(--color-ink, #0a0a0a);
  color: #fff;
  transform: translateX(100%);
  transition: transform 560ms cubic-bezier(0.76, 0, 0.24, 1),
              visibility 0ms linear 560ms;
  z-index: 99;
  overflow-y: auto;
  overflow-x: hidden;
  overscroll-behavior: contain;
  visibility: hidden;
  box-shadow: -40px 0 80px -20px rgba(0,0,0,0.4);
}

.side-menu.is-open {
  transform: translateX(0);
  visibility: visible;
  transition: transform 560ms cubic-bezier(0.76, 0, 0.24, 1),
              visibility 0ms linear 0ms;
}

.side-menu__close {
  position: absolute;
  top: clamp(18px, 2vw, 26px);
  right: clamp(18px, 2vw, 26px);
  width: 44px;
  height: 44px;
  background: transparent;
  color: rgba(255,255,255,0.72);
  border: 0;
  cursor: pointer;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color 240ms ease,
              transform 480ms cubic-bezier(0.22, 1, 0.36, 1);
}

.side-menu__close:hover {
  color: #fff;
  transform: rotate(90deg);
}

.side-menu__inner {
  padding: clamp(80px, 9vw, 108px) clamp(32px, 4vw, 56px) clamp(40px, 5vw, 56px);
  display: flex;
  flex-direction: column;
  min-height: 100%;
  gap: clamp(24px, 3.2vw, 40px);
}

.side-menu__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: rgba(255,255,255,0.52);
}

.side-menu__eyebrow::before {
  content: "";
  display: inline-block;
  width: 7px;
  height: 7px;
  transform: rotate(45deg);
  background: currentColor;
}

.side-menu__nav {
  flex: 1;
}

.side-menu__nav ul,
.side-menu__foot ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.side-menu__nav a {
  display: block;
  font-family: var(--font-display);
  font-weight: 200;
  font-size: clamp(1.375rem, 2.6vw, 2rem);
  line-height: 1.15;
  color: #fff;
  text-decoration: none;
  padding: clamp(10px, 1.4vw, 14px) 0;
  border-bottom: 1px solid rgba(255,255,255,0.1);
  letter-spacing: -0.012em;
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1),
              color 240ms ease;
  position: relative;
}

.side-menu__nav a::before {
  content: "";
  position: absolute;
  left: -14px;
  top: 50%;
  width: 5px;
  height: 5px;
  transform: translateY(-50%) rotate(45deg) scale(0);
  background: rgba(255,255,255,0.78);
  transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
}

.side-menu__nav a:hover {
  transform: translateX(10px);
}

.side-menu__nav a:hover::before {
  transform: translateY(-50%) rotate(45deg) scale(1);
}

/* Active page marker */
.side-menu__nav a[aria-current="page"] {
  font-style: italic;
  font-weight: 100;
}

/* Foot row — Follow left, Contact right. Contact needs more room for the
   full email + multi-line address, so it gets a wider fr. */
.side-menu__foot {
  display: grid;
  grid-template-columns: 0.8fr 1.4fr;
  gap: clamp(20px, 2.8vw, 40px);
  padding-top: clamp(22px, 3vw, 32px);
  border-top: 1px solid rgba(255,255,255,0.1);
}

.side-menu__col-title {
  display: block;
  font-family: var(--font-body);
  font-size: 0.625rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.4);
  margin-bottom: clamp(var(--space-3), 1.4vw, var(--space-4));
}

.side-menu__foot ul {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.side-menu__foot li {
  border-bottom: 1px solid rgba(255,255,255,0.06);
}

.side-menu__foot li:last-child { border-bottom: 0; }

.side-menu__foot a {
  display: block;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  line-height: 1.45;
  color: rgba(255,255,255,0.72);
  text-decoration: none;
  padding: 7px 0;
  transition: color 240ms ease, transform 320ms ease;
  /* Allow long email addresses to break if the column is narrow */
  word-break: break-word;
  overflow-wrap: anywhere;
}

.side-menu__foot a:hover {
  color: #fff;
  transform: translateX(4px);
}

/* "The End" — wordmark centered + copyright line beneath */
.side-menu__end {
  margin-top: auto;
  padding-top: clamp(var(--space-6), 4vw, var(--space-8));
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(var(--space-3), 1.6vw, var(--space-4));
  text-align: center;
  padding-bottom: clamp(var(--space-2), 1vw, var(--space-3));
}

.side-menu__wordmark {
  width: 100%;
  display: flex;
  justify-content: center;
}

.side-menu__wordmark img {
  width: 100%;
  max-width: 260px;
  opacity: 0.5;
  display: block;
}

.side-menu__end-copy {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.38);
}

/* When menu is open, prevent body scroll */
body.has-side-menu-open {
  overflow: hidden;
}

@media (max-width: 520px) {
  .side-menu__foot {
    grid-template-columns: 1fr;
    gap: var(--space-5);
  }
  .side-menu__wordmark { max-width: 160px; }
}

/* ============================================================
   CONTACT FORM — custom 3-page brief (Netlify Forms)
   Typography: IvyPresto Display for questions, Gotham for input.
   Clear hierarchy, generous spacing, no red hover on checkboxes.
============================================================ */

.cform[hidden] {
  display: none !important;
}

.cform {
  display: flex;
  flex-direction: column;
  gap: clamp(var(--space-5), 3vw, var(--space-6));
  margin: 0;
  padding: 0;
  border: 0;
}

.cform-bot {
  position: absolute;
  left: -9999px;
  top: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* Progress bar — dynamic segments (auto-sized by count) */
.cform-progress {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: 6px;
  margin: 0 0 var(--space-4);
}

.cform-progress__seg {
  height: 2px;
  background: rgba(10,10,10,0.1);
  transition: background-color var(--motion-base) var(--motion-ease);
}

.cform-progress__seg[data-active] {
  background: var(--color-ink);
}

/* Page container — one visible at a time */
.cform-page {
  display: none;
  flex-direction: column;
  gap: clamp(var(--space-4), 2.4vw, var(--space-5));
  margin: 0;
  padding: 0;
  border: 0;
  animation: cformSlideIn var(--motion-base) var(--motion-ease);
}

.cform-page[data-active] {
  display: flex;
}

@keyframes cformSlideIn {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Page header: step eyebrow / title / lede / back */
.cform-pagehead {
  display: flex;
  flex-direction: column;
  gap: 8px;
  position: relative;
  padding-bottom: var(--space-4);
  border-bottom: 1px solid rgba(10,10,10,0.08);
  margin-bottom: var(--space-1);
}

.cform-step {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.22em;
  color: rgba(10,10,10,0.45);
}

.cform-pagetitle {
  font-family: var(--font-display);
  font-weight: 100;
  font-size: clamp(1.75rem, 3.4vw, 2.5rem);
  line-height: 1.08;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 22ch;
}

.cform-pagetitle em {
  font-style: italic;
  font-weight: 100;
}

.cform-pagelede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.9375rem;
  line-height: 1.55;
  color: rgba(10,10,10,0.58);
  margin: 0;
  max-width: 46ch;
}

.cform-back {
  position: absolute;
  right: 0;
  top: 0;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  background: none;
  border: 0;
  color: rgba(10,10,10,0.55);
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  cursor: pointer;
  transition: color var(--motion-fast) var(--motion-ease);
}

.cform-back:hover {
  color: var(--color-ink);
}

.cform-back svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
}

/* Two-column grid for First / Last name */
.cform-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(var(--space-4), 2.2vw, var(--space-5)) clamp(var(--space-4), 2.4vw, var(--space-5));
}

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

/* Fields — the container. Spacing between a field's question+input is
   intentional: question on top, gap, then input below. */
.cform-field {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 0;
  padding: 0;
  border: 0;
  min-width: 0;
}

.cform-field--full {
  grid-column: 1 / -1;
}

/* Question labels — IvyPresto Display Thin, NOT uppercase, readable size.
   This is the primary visual hierarchy marker. */
.cform-q {
  font-family: var(--font-display);
  font-weight: 100;
  font-size: clamp(1.0625rem, 1.5vw, 1.25rem);
  line-height: 1.3;
  letter-spacing: -0.005em;
  color: var(--color-ink);
  padding: 0;
  margin: 0;
}

.cform-qhint {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: rgba(10,10,10,0.5);
  margin: 4px 0 8px;
  font-style: italic;
}

/* Question row — label on the left, mini note on the right (inline).
   Used when a hint is short enough to live next to the question. */
.cform-qrow {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-4);
  flex-wrap: wrap;
}

.cform-qnote {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.75rem;
  line-height: 1.4;
  color: rgba(10,10,10,0.45);
  font-style: italic;
  text-align: right;
  flex-shrink: 0;
}

.cform-opt {
  margin-left: 8px;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  letter-spacing: 0.16em;
  color: rgba(10,10,10,0.4);
  font-weight: 400;
  font-style: italic;
  text-transform: lowercase;
  vertical-align: 2px;
}

/* Inputs — Gotham Light, generous padding, subtle bottom border.
   Border goes solid on focus, accent on invalid. */
.cform input[type="text"],
.cform input[type="email"],
.cform input[type="tel"],
.cform select,
.cform textarea {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(10,10,10,0.18);
  padding: 9px 0;
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 1rem;
  line-height: 1.45;
  color: var(--color-ink);
  transition: border-color var(--motion-base) var(--motion-ease);
  border-radius: 0;
  width: 100%;
  max-width: 100%;
  min-width: 0;
}

.cform textarea {
  resize: vertical;
  min-height: 84px;
  border: 1px solid rgba(10,10,10,0.12);
  padding: 11px 14px;
  background: #fcfcfc;
  transition: border-color var(--motion-base) var(--motion-ease), background var(--motion-base) var(--motion-ease);
}

.cform textarea:focus {
  border-color: var(--color-ink);
  background: #ffffff;
}

.cform input:focus,
.cform select:focus {
  outline: none;
  border-bottom-color: var(--color-ink);
}

.cform textarea:focus {
  outline: none;
}

/* Keyboard-only focus ring (see note on .contact-form). */
.cform input:focus-visible,
.cform select:focus-visible,
.cform textarea:focus-visible {
  outline: 2px solid var(--color-ink);
  outline-offset: 2px;
}

.cform input::placeholder,
.cform textarea::placeholder {
  color: rgba(10,10,10,0.28);
  font-weight: 300;
}

.cform select {
  cursor: pointer;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgba(10,10,10,0.5)' stroke-width='1' stroke-linecap='butt'><path d='M4 6 L8 10 L12 6'/></svg>");
  background-repeat: no-repeat;
  background-position: right 4px center;
  padding-right: 28px;
}

/* Phone with country code — custom picker on the left, input on the right.
   Phone input explicitly sits at z-index: 1 so nothing from the picker
   column can mask it even during paint/layout transitions. */
.cform-phone {
  display: grid;
  grid-template-columns: 150px 1fr;
  gap: var(--space-4);
  align-items: end;
  position: relative;
}

.cform-phone input[data-cp-phone] {
  position: relative;
  z-index: 1;
}

@media (max-width: 520px) {
  .cform-phone { grid-template-columns: 120px 1fr; }
}

/* Tap-target accessibility: bump form fields to >=44px on mobile (Apple HIG /
   Google Material guidance). On the qualification (.cform) and brief
   (.contact-form) inputs the desktop styles set padding to ~9-11px which on
   the iOS soft-keyboard sizes computes to ~38px tall — too small. */
@media (max-width: 900px) {
  .cform input[type="text"],
  .cform input[type="email"],
  .cform input[type="tel"],
  .cform select,
  .cform textarea,
  .cform-cp__button,
  .contact-form input,
  .contact-form select,
  .contact-form textarea,
  .altfooter__news-form input {
    padding-top: 13px;
    padding-bottom: 13px;
    min-height: 44px;
    font-size: 16px; /* prevents iOS Safari from auto-zooming on focus */
  }
  .cform textarea,
  .contact-form textarea {
    min-height: 110px;
  }
  /* Newsletter pill keeps its tighter padding-y but the input sits at 16px. */
  .altfooter__news-form input { padding-top: 10px; padding-bottom: 10px; }
}

/* Custom country picker — flag graphic (SVG from flag-icons) + dial code */
.cform-cp {
  position: relative;
}

.cform-cp__button {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 12px 4px;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(10,10,10,0.18);
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 1rem;
  color: var(--color-ink);
  cursor: pointer;
  text-align: left;
  border-radius: 0;
  transition: border-color var(--motion-base) var(--motion-ease);
}

.cform-cp__button:hover,
.cform-cp__button[aria-expanded="true"] {
  border-bottom-color: var(--color-ink);
}

.cform-cp__flag {
  width: 22px;
  height: 16px;
  flex-shrink: 0;
  box-shadow: 0 0 0 1px rgba(10,10,10,0.08);
  border-radius: 1px;
}

.cform-cp__code {
  font-weight: 300;
  flex: 1;
}

.cform-cp__caret {
  width: 12px;
  height: 12px;
  color: rgba(10,10,10,0.5);
  transition: transform var(--motion-base) var(--motion-ease);
}

.cform-cp__button[aria-expanded="true"] .cform-cp__caret {
  transform: rotate(180deg);
}

.cform-cp__list {
  position: absolute;
  z-index: 40;
  top: calc(100% + 4px);
  left: 0;
  right: 0;
  min-width: 320px;
  max-height: 320px;
  overflow-y: auto;
  list-style: none;
  margin: 0;
  padding: 8px 0;
  background: #ffffff;
  border: 1px solid rgba(10,10,10,0.1);
  box-shadow: 0 8px 32px rgba(10,10,10,0.08);
}

.cform-cp__list[hidden] { display: none; }

.cform-cp__list li {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  cursor: pointer;
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.875rem;
  color: var(--color-ink);
  transition: background var(--motion-fast) var(--motion-ease);
}

.cform-cp__list li:hover,
.cform-cp__list li:focus {
  background: rgba(10,10,10,0.04);
  outline: none;
}

.cform-cp__list .fi {
  width: 22px;
  height: 16px;
  flex-shrink: 0;
  box-shadow: 0 0 0 1px rgba(10,10,10,0.08);
  border-radius: 1px;
}

.cform-cp__name {
  flex: 1;
}

.cform-cp__dim {
  color: rgba(10,10,10,0.5);
  font-variant-numeric: tabular-nums;
}

/* Inline submit error — used instead of alert() */
.cform-submit-error {
  padding: 14px 18px;
  background: rgba(222, 50, 45, 0.06);
  border-left: 2px solid var(--color-accent);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.875rem;
  line-height: 1.5;
  margin-bottom: var(--space-3);
}

.cform-submit-error[hidden] { display: none; }

/* Checkboxes block — larger tap targets, no red hover, cleaner state */
.cform-checks {
  display: flex;
  flex-direction: column;
  gap: 0;
  padding: 0;
}

.cform-checks > .cform-q {
  margin-bottom: 4px;
}

.cform-check {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 2px;
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: 300;
  color: var(--color-ink);
  cursor: pointer;
  border-bottom: 1px solid rgba(10,10,10,0.08);
  transition: border-color var(--motion-fast) var(--motion-ease);
}

.cform-check:first-of-type {
  border-top: 1px solid rgba(10,10,10,0.08);
}

.cform-check:hover {
  border-bottom-color: rgba(10,10,10,0.28);
}

.cform-check:hover input[type="checkbox"] {
  border-color: var(--color-ink);
}

.cform-check input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 18px;
  height: 18px;
  border: 1px solid rgba(10,10,10,0.28);
  background: transparent;
  border-radius: 0;
  cursor: pointer;
  position: relative;
  flex-shrink: 0;
  transition: all var(--motion-fast) var(--motion-ease);
}

.cform-check input[type="checkbox"]:checked {
  background: var(--color-ink);
  border-color: var(--color-ink);
}

.cform-check input[type="checkbox"]:checked::after {
  content: "";
  position: absolute;
  left: 5px;
  top: 1.5px;
  width: 5px;
  height: 10px;
  border: solid #fff;
  border-width: 0 1.5px 1.5px 0;
  transform: rotate(45deg);
}

.cform-check input[type="checkbox"]:checked ~ span {
  color: var(--color-ink);
  font-weight: 400;
}

.cform-check input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--color-ink);
  outline-offset: 2px;
}

/* Error state — subtle, accent-only on the field, no aggressive full borders */
.cform-field.is-invalid .cform-q {
  color: var(--color-accent);
}

.cform-field.is-invalid input,
.cform-field.is-invalid select {
  border-bottom-color: var(--color-accent);
}

.cform-field.is-invalid textarea {
  border-color: var(--color-accent);
}

.cform-field.is-invalid.cform-checks {
  padding-left: 12px;
  border-left: 2px solid var(--color-accent);
  margin-left: -14px;
}

/* GDPR consent row — required checkbox above the submit on the
   qualification form (page 4). Custom box visualisation so the native
   checkbox stays accessible but doesn't fight the brand vocabulary. */
.cform-field--consent { margin-top: var(--space-4); }
.cform-consent {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  cursor: pointer;
  padding: 14px 16px;
  border: 1px solid rgba(10,10,10,0.10);
  background: #fcfcfc;
  transition: border-color var(--motion-base) var(--motion-ease), background var(--motion-base) var(--motion-ease);
}
.cform-consent:hover { border-color: rgba(10,10,10,0.22); background: #fafafa; }
.cform-consent input[type="checkbox"] {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}
.cform-consent__box {
  flex: 0 0 auto;
  width: 18px; height: 18px;
  margin-top: 2px;
  border: 1.5px solid rgba(10,10,10,0.32);
  background: #fff;
  position: relative;
  transition: border-color 200ms ease, background 200ms ease;
}
.cform-consent__box::after {
  content: "";
  position: absolute;
  inset: 2px;
  background: var(--color-ink, #0a0a0a);
  transform: scale(0);
  transform-origin: center;
  transition: transform 180ms cubic-bezier(0.22, 0.8, 0.24, 1);
}
.cform-consent input[type="checkbox"]:checked ~ .cform-consent__box {
  border-color: var(--color-ink, #0a0a0a);
}
.cform-consent input[type="checkbox"]:checked ~ .cform-consent__box::after {
  transform: scale(1);
}
.cform-consent input[type="checkbox"]:focus-visible ~ .cform-consent__box {
  outline: 2px solid var(--color-ink, #0a0a0a);
  outline-offset: 2px;
}
.cform-consent__text {
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 300;
  line-height: 1.55;
  color: rgba(10,10,10,0.78);
}
.cform-consent__text a {
  color: var(--color-ink, #0a0a0a);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.cform-field--consent.is-invalid .cform-consent {
  border-color: #c14b4b;
  background: #fff5f5;
}
.cform-field--consent.is-invalid .cform-consent__box {
  border-color: #c14b4b;
}

/* Actions row — Back on left is in header; primary button on the right
   for natural reading flow. Notice text next to it. */
.cform-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-5);
  flex-wrap: wrap;
  margin-top: var(--space-4);
  padding-top: var(--space-5);
  border-top: 1px solid rgba(10,10,10,0.06);
}

.cform-notice {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: 300;
  color: rgba(10,10,10,0.45);
  letter-spacing: 0.02em;
  max-width: 32ch;
  order: -1;
}

/* Primary action button — black, right-aligned. Slide animation on hover
   (two rows of label+arrow, one slides up, the other rises from below).
   No red anywhere — the brand accent is reserved for required markers,
   error state, and the success panel rule. */
.cform-btn {
  display: inline-flex;
  align-items: center;
  padding: 18px 32px;
  background: var(--color-ink);
  color: #fff;
  border: 1px solid var(--color-ink);
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  line-height: 1;
  cursor: pointer;
  border-radius: 0;
  transition: background var(--motion-base) var(--motion-ease), border-color var(--motion-base) var(--motion-ease);
  white-space: nowrap;
  margin-left: auto;
  overflow: hidden;
}

.cform-btn__slide {
  position: relative;
  display: inline-flex;
  overflow: hidden;
  line-height: 1;
}

.cform-btn__row {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  white-space: nowrap;
  line-height: 1;
  transition: transform 520ms cubic-bezier(0.22, 0.8, 0.24, 1);
}

.cform-btn__row:nth-child(1) { transform: translateY(0); }
.cform-btn__row:nth-child(2) {
  position: absolute;
  inset: 0;
  transform: translateY(120%);
}

.cform-btn:hover .cform-btn__row:nth-child(1) { transform: translateY(-120%); }
.cform-btn:hover .cform-btn__row:nth-child(2) { transform: translateY(0); }

.cform-btn__arrow {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  flex: 0 0 auto;
}

.cform-btn:hover {
  background: #1a1a1a;
  border-color: #1a1a1a;
}

.cform-btn:focus-visible {
  outline: 2px solid var(--color-ink);
  outline-offset: 3px;
}

/* Disabled / submitting state */
.cform.is-submitting .cform-btn {
  opacity: 0.6;
  pointer-events: none;
}

/* Success panel — ONLY shown when submission completes. Default hidden via [hidden]. */
.cform-success[hidden] {
  display: none !important;
}

.cform-success {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  padding: clamp(var(--space-7), 6vw, var(--space-9));
  background: var(--color-paper-soft);
  border-left: 2px solid var(--color-accent);
  animation: cformSlideIn 480ms var(--motion-ease);
}

.cform-success__title {
  font-family: var(--font-display);
  font-weight: 100;
  font-size: clamp(1.75rem, 3.4vw, 2.5rem);
  line-height: 1.08;
  letter-spacing: -0.015em;
  color: var(--color-ink);
  margin: 0;
  max-width: 18ch;
}

.cform-success__title em {
  font-style: italic;
  font-weight: 100;
}

.cform-success__lede {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: clamp(0.9375rem, 1.1vw, 1.0625rem);
  line-height: 1.6;
  color: rgba(10,10,10,0.62);
  max-width: 50ch;
  margin: 0;
}

/* Narrower image column — give more room to the form.
   Image stretches to match form height so the two columns always end
   at the same baseline (no dangling empty space below the form). */
.contact-form-grid {
  grid-template-columns: minmax(0, 0.72fr) minmax(0, 1fr);
  align-items: stretch;
}

.contact-form-side {
  position: sticky;
  top: clamp(80px, 12vh, 140px);
  height: auto;
  align-self: start;
}

/* 1080x1350 portrait — image fills its column at native 4:5 ratio
   (no height cap). The aside is sticky so the photograph stays visible
   as the form scrolls past it. */
.contact-form-image {
  aspect-ratio: 4 / 5;
  height: auto;
  min-height: 0;
  max-height: none;
}

.contact-form-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* 9:16 placeholder when no portrait image is wired yet. Subtle ink panel
   with a hairline border and a single discreet label. The aspect ratio
   on .contact-form-image already locks the slot to 9:16. */
.contact-form-image--placeholder {
  background: rgba(10,10,10,0.04);
  border: 1px solid rgba(10,10,10,0.10);
  display: flex;
  align-items: flex-end;
  justify-content: flex-start;
  padding: clamp(var(--space-3), 1.6vw, var(--space-4));
}
.contact-form-image__label {
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.6875rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.45);
}

/* Form panel — no forced min-height; the form drives its own height now
   that the section is compressed. The image stays sticky alongside it. */
.contact-form-panel {
  min-height: 0;
}

@media (max-width: 960px) {
  .contact-form-grid { grid-template-columns: 1fr; }
  .contact-form-side { position: relative; top: auto; }
  /* Keep the 4:5 portrait at native ratio on narrow viewports too —
     the photograph reads as a full vertical above the form. */
  .contact-form-image {
    aspect-ratio: 4 / 5;
    max-height: none;
    width: 100%;
    margin-inline: auto;
  }
}

/* Mobile tweaks for the form panel */
@media (max-width: 720px) {
  .cform-pagehead { padding-top: 0; }
  .cform-back {
    position: static;
    margin-bottom: var(--space-2);
    align-self: flex-start;
  }
  .cform-actions {
    flex-direction: column;
    align-items: stretch;
  }
  .cform-btn {
    margin-left: 0;
    justify-content: center;
  }
}

/* ============================================================
   APPROACH V2 — Circular step indicator engine (shared between
   approach-v2-preview.html and approach.html). 7 scroll-locked
   frames, single ring on the right that fills clockwise per step
   and ticks 01 → 07. Editorial copy bottom-left per step. Bottom-
   right scroll cue. No spiral, no ornament.
============================================================ */
.av2-rail {
  position: relative;
  height: calc(100vh * 7 + 60vh);
  background: #0a0a0a;
  color: #fff;
}
.av2-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
}
.av2-stage::before,
.av2-stage::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
}
.av2-stage::before {
  background:
    radial-gradient(ellipse 70% 60% at 0% 0%, rgba(255,255,255,0.04), transparent 70%),
    radial-gradient(ellipse 80% 70% at 100% 100%, rgba(255,255,255,0.03), transparent 65%);
}
.av2-stage::after {
  background: radial-gradient(circle at 50% 50%, transparent 40%, rgba(0,0,0,0.55) 100%);
}

.av2-step-indicator {
  position: absolute;
  right: clamp(24px, 5vw, 80px);
  top: 50%;
  z-index: 3;
  width: clamp(120px, 12vw, 180px);
  height: clamp(120px, 12vw, 180px);
  transform: translateY(-50%);
  display: flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.av2-step-indicator__track,
.av2-step-indicator__fill {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  overflow: visible;
}
.av2-step-indicator__track-circle {
  fill: none;
  stroke: rgba(255,255,255,0.16);
  stroke-width: 1;
}
.av2-step-indicator__fill-circle {
  fill: none;
  stroke: rgba(255,255,255,0.94);
  stroke-width: 1.4;
  stroke-linecap: round;
  /* Drawn from 12 o'clock clockwise. No CSS transition — rAF writes
     the offset every frame, so the ring fills smoothly with scroll. */
  transform: rotate(-90deg);
  transform-origin: 50% 50%;
}
.av2-step-indicator__num {
  position: relative;
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-style: normal;
  font-size: clamp(1.5rem, 1.9vw, 2rem);
  letter-spacing: 0.04em;
  color: #fff;
  line-height: 1;
}
.av2-step-indicator__count {
  position: absolute;
  bottom: -34px; left: 50%;
  transform: translateX(-50%);
  font-family: var(--font-body);
  font-weight: var(--fw-regular, 400);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: #ffffff;
  white-space: nowrap;
  text-shadow: 0 1px 14px rgba(0,0,0,0.45);
}

/* Editorial copy block — pinned to the MIDDLE-LEFT of the viewport,
   inside the left column of an imaginary 3×3 grid (box position 4 =
   row 2, column 1). The block spans the full stage HEIGHT and uses
   grid-stack layout so the active step's bounding box (kicker + title
   + body + deliv) is genuinely centred vertically by the grid's
   align-items: center, instead of just having its top edge at the
   midline (which is what made the visible block fall low on screen). */
.av2-copy {
  position: absolute;
  left: clamp(20px, 4vw, 64px);
  top: 0;
  bottom: 0;
  z-index: 5;
  /* Wider copy column so each step's body breathes across two natural
     lines instead of three. Caps at the right edge of the right-rail
     ring indicator. */
  width: min(640px, 42vw);
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 1fr;
  align-items: center;
  justify-items: start;
  pointer-events: none;
}
/* All 7 step blocks share the same grid cell — they OVERLAP in row 1
   col 1 of the copy grid. Only the active one is opaque, everything
   else stays at opacity 0 but contributes to layout via grid stacking
   so the cell height matches the tallest step. */
.av2-step {
  grid-column: 1;
  grid-row: 1;
  width: 100%;
  padding: 0;
  opacity: 0;
  transform: translateY(12px);
  transition:
    opacity 600ms cubic-bezier(0.4, 0, 0.2, 1),
    transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
  pointer-events: none;
}
.av2-step.is-active {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}
.av2-step__kicker {
  display: inline-flex; align-items: center; gap: 14px;
  font-family: var(--font-body);
  font-weight: var(--fw-regular, 400);
  font-size: 0.75rem;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.92);
  margin: 0 0 clamp(20px, 2.4vw, 32px);
  /* Asymmetric: a bit more breathing room on the right so the
     last letter of the step name (e.g. the "G" in "REPORTING")
     does not crowd the box edge. The 0.28em tracking pushes the
     final letter out visually; we compensate. */
  padding: 8px 22px 8px 14px;
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.18);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.av2-step__kicker::before {
  content: ""; display: inline-block;
  width: 8px; height: 8px;
  background: #ffffff;
  transform: rotate(45deg);
  box-shadow: 0 0 10px rgba(255,255,255,0.35);
}
.av2-step__num { color: #ffffff; font-weight: var(--fw-regular, 500); }
.av2-step__divider { color: rgba(255,255,255,0.55); margin: 0 6px; }
.av2-step__title {
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-style: normal;
  font-size: clamp(2rem, 3.6vw, 3.25rem);
  line-height: 1.06;
  letter-spacing: -0.015em;
  color: #fff;
  margin: 0 0 clamp(18px, 2vw, 28px);
  text-wrap: balance;
}
.av2-step__title em {
  font-style: italic;
  color: rgba(255,255,255,0.66);
  font-weight: var(--fw-thin, 100);
}
.av2-step__body {
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: clamp(0.9375rem, 1.05vw, 1.0625rem);
  line-height: 1.65;
  color: rgba(255,255,255,0.82);
  margin: 0 0 clamp(18px, 2vw, 26px);
  max-width: 100%;
}
.av2-step__deliv {
  font-family: var(--font-body);
  font-weight: var(--fw-regular, 400);
  font-size: 0.6875rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.78);
}

/* Bottom-right scroll cue — sits CENTRED directly below the circular
   step indicator, mirroring its horizontal position. Slightly bolder
   text + a longer, more visible thread so the affordance reads at a
   glance. The right offset matches the indicator's right offset and
   the indicator's half-width via translateX so the cue lines up with
   the ring's vertical axis. */
.av2-scroll {
  position: absolute;
  right: calc(clamp(24px, 5vw, 80px) + clamp(120px, 12vw, 180px) / 2);
  transform: translateX(50%);
  bottom: clamp(56px, 6vh, 88px);
  z-index: 5;
  display: inline-flex; flex-direction: column; align-items: center; gap: 12px;
  font-family: var(--font-body);
  font-weight: var(--fw-light);
  font-size: 0.6875rem;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.92);
  opacity: var(--av2-scroll-fade, 1);
  transition: opacity 500ms linear;
  pointer-events: none;
}
.av2-scroll__line {
  width: 1px; height: 56px;
  background: linear-gradient(to bottom, rgba(255,255,255,0.92), rgba(255,255,255,0));
  animation: av2-scroll-pulse 1800ms ease-in-out infinite;
  transform-origin: top center;
}
@keyframes av2-scroll-pulse {
  0%, 100% { transform: scaleY(0.5); opacity: 0.55; }
  50%      { transform: scaleY(1);   opacity: 1; }
}

@media (max-width: 760px) {
  .av2-copy { width: calc(100% - 40px); }
  .av2-step__title { font-size: 1.875rem; }
  .av2-step__body { font-size: 0.9375rem; }
  .av2-step-indicator { width: 80px; height: 80px; }
  .av2-scroll { right: 20px; bottom: 70px; }
}
@media (prefers-reduced-motion: reduce) {
  .av2-step { transition: none; }
}

/* ============================================================
   SALT-CINEMA video player (shared).
   Inline tile = poster + scrim + rhombus glyph + 2px playhead
   that fills as the video previews on hover. Click any tile and
   the same source opens in a glass fullscreen modal with custom
   chrome (play/pause toggle, volume, fullscreen, time, rotating
   ×). The modal markup is injected by js/main.js if not already
   on the page, so any HTML page only needs the inline tile
   markup. Lifted from ck-realtors.html so every project page can
   share the same handler.
   - Default tile aspect = 9 / 16 (vertical reel).
   - Add `.va__vid-frame--landscape` for 16/9 hero films.
   - Add `.va__vid-frame--square` for 1/1.
   - Modal stage detects the video's intrinsic ratio after meta-
     loaded and toggles `.va__player.is-landscape` so landscape
     films render in a wide stage instead of the portrait stage.
============================================================ */
.va__vid-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 9 / 16;
  overflow: hidden;
  background: var(--va-paper-soft, #f4f1ec);
  border: 1px solid var(--va-line, rgba(0,0,0,0.08));
  cursor: pointer;
}
.va__vid-frame--landscape { aspect-ratio: 16 / 9; }
.va__vid-frame--square    { aspect-ratio: 1 / 1; }
.va__vid-player {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  background: var(--va-paper-soft, #f4f1ec);
}
.va__vid-frame::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(0,0,0,0.10) 0%, rgba(0,0,0,0.32) 100%);
  transition: opacity 540ms cubic-bezier(0.22, 0.61, 0.36, 1);
  opacity: 1;
  z-index: 2;
}
.va__vid-frame:hover::after { opacity: 0.55; }
/* Default tile (Salt-Cinema mode): centred glass play disc + triangle.
   No hover preview, no rhombus corner glyph. Click opens the modal. */
.va__vid-frame::before {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: clamp(64px, 5.4vw, 88px);
  height: clamp(64px, 5.4vw, 88px);
  border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.62);
  background-color: rgba(255,255,255,0.10);
  background-image: url("data:image/svg+xml;utf8,<svg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path d='M9 6 L18 12 L9 18 Z' fill='white'/></svg>");
  background-size: 26%;
  background-position: 56% 50%;
  background-repeat: no-repeat;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  transform: translate(-50%, -50%);
  z-index: 3;
  pointer-events: none;
  transition: background-color 320ms cubic-bezier(0.22, 0.61, 0.36, 1),
              border-color 320ms cubic-bezier(0.22, 0.61, 0.36, 1),
              transform 480ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__vid-frame:hover::before {
  background-color: rgba(255,255,255,0.22);
  border-color: rgba(255,255,255,0.92);
  transform: translate(-50%, -50%) scale(1.06);
}
/* Hover-play variant (CK Realtors only): restores the corner rhombus
   glyph + the inline tile playhead. Hover-to-preview is reactivated
   from JS by checking this modifier. */
.va__vid-frame--hover-play::before {
  top: auto; left: auto;
  bottom: clamp(14px, 1.6vw, 22px);
  right: clamp(14px, 1.6vw, 22px);
  width: 14px; height: 14px;
  border-radius: 0;
  background: transparent;
  background-image: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  transform: rotate(45deg);
}
.va__vid-frame--hover-play:hover::before {
  opacity: 0;
  background: transparent;
  border-color: rgba(255,255,255,0.86);
  transform: rotate(45deg) scale(0.7) translate(6px, -6px);
}
.va__vid-frame--hover-play:hover::after { opacity: 0; }
.va__vid-bar {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 2px;
  background: rgba(255,255,255,0.18);
  z-index: 4;
  pointer-events: none;
  opacity: 0;
  transition: opacity 220ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__vid-frame--hover-play:hover .va__vid-bar { opacity: 1; }
.va__vid-bar-fill {
  display: block;
  height: 100%;
  width: 0%;
  background: rgba(255,255,255,0.92);
  transform-origin: 0 50%;
  transition: width 80ms linear;
}

.va__player {
  position: fixed;
  inset: 0;
  display: none;
  place-items: center;
  z-index: 9999;
  background: rgba(10,10,10,0.72);
  backdrop-filter: blur(24px) saturate(1.05);
  -webkit-backdrop-filter: blur(24px) saturate(1.05);
  opacity: 0;
  transition: opacity 460ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__player.is-open { display: grid; opacity: 1; }
.va__player-stage {
  position: relative;
  width: min(420px, 88vw);
  height: min(746px, 84vh);
  background: #000;
  overflow: hidden;
  transform: scale(0.96);
  transition: transform 560ms cubic-bezier(0.22, 0.61, 0.36, 1);
  box-shadow: 0 40px 120px -20px rgba(0,0,0,0.7);
}
.va__player.is-landscape .va__player-stage {
  width: min(1280px, 92vw);
  height: min(720px, 80vh);
}
.va__player.is-square .va__player-stage {
  width: min(720px, 88vw);
  height: min(720px, 80vh);
}
.va__player.is-open .va__player-stage { transform: scale(1); }
.va__player-video {
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #000;
  display: block;
}
.va__player-close {
  position: absolute;
  top: clamp(20px, 3vw, 32px);
  right: clamp(20px, 3vw, 32px);
  width: 44px; height: 44px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.32);
  color: #fff;
  cursor: pointer;
  display: grid; place-items: center;
  z-index: 4;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  transition: background 220ms ease, transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__player-close:hover {
  background: rgba(255,255,255,0.18);
  transform: rotate(90deg);
}
.va__player-close::before,
.va__player-close::after {
  content: "";
  position: absolute;
  width: 18px; height: 1px;
  background: #fff;
}
.va__player-close::before { transform: rotate(45deg); }
.va__player-close::after  { transform: rotate(-45deg); }
/* Bottom playhead, time, volume, fullscreen — all glass chrome.
   Hidden until pointer enters the stage; fades in/out. */
.va__player-bar {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 2px;
  background: rgba(255,255,255,0.16);
  z-index: 3;
  cursor: pointer;
}
.va__player-bar-fill {
  display: block;
  height: 100%;
  width: 0%;
  background: #fff;
  transform-origin: 0 50%;
  transition: width 80ms linear;
}
.va__player-time {
  position: absolute;
  left: clamp(16px, 2.4vw, 24px);
  bottom: clamp(16px, 2.4vw, 24px);
  color: rgba(255,255,255,0.86);
  font-family: var(--va-font-body, var(--font-body));
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  font-variant-numeric: tabular-nums;
  z-index: 3;
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
  opacity: 0;
  transition: opacity 240ms ease;
  pointer-events: none;
}
.va__player.is-open .va__player-time { opacity: 1; }
.va__player-toggle {
  position: absolute;
  inset: 0;
  background: transparent;
  border: 0;
  cursor: pointer;
  color: #fff;
  z-index: 1;
  display: grid; place-items: center;
}
.va__player-toggle::after {
  content: "";
  width: 14px; height: 14px;
  border: 1px solid rgba(255,255,255,0.86);
  transform: rotate(45deg) scale(0.9);
  opacity: 0;
  transition: opacity 240ms ease, transform 420ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__player.is-paused .va__player-toggle::after {
  opacity: 1;
  transform: rotate(45deg) scale(1);
}
/* Glass control row anchored bottom-right of the stage. Holds
   volume slider + fullscreen toggle. Same blur/border treatment
   as the close button. =========================================== */
.va__player-controls {
  position: absolute;
  right: clamp(16px, 2.4vw, 24px);
  bottom: clamp(16px, 2.4vw, 24px);
  display: inline-flex;
  align-items: center;
  gap: 10px;
  z-index: 3;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 240ms ease, transform 240ms ease;
  pointer-events: none;
}
.va__player.is-open .va__player-controls {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}
.va__player-ctl {
  width: 36px; height: 36px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.28);
  color: #fff;
  cursor: pointer;
  display: grid; place-items: center;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  transition: background 220ms ease;
  position: relative;
  padding: 0;
}
.va__player-ctl:hover { background: rgba(255,255,255,0.18); }
.va__player-ctl svg {
  width: 16px; height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.va__player-vol-wrap {
  display: inline-flex;
  align-items: center;
  height: 36px;
  border: 1px solid rgba(255,255,255,0.28);
  background: rgba(255,255,255,0.08);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  padding: 0 10px 0 8px;
  gap: 8px;
}
.va__player-vol-btn {
  width: 24px; height: 24px;
  background: transparent;
  border: 0;
  color: #fff;
  cursor: pointer;
  display: grid; place-items: center;
  padding: 0;
}
.va__player-vol-btn svg {
  width: 16px; height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.va__player-vol {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  width: 64px;
  height: 16px;
  margin: 0;
  cursor: pointer;
}
.va__player-vol::-webkit-slider-runnable-track {
  height: 1px;
  background: rgba(255,255,255,0.36);
  border: 0;
}
.va__player-vol::-moz-range-track {
  height: 1px;
  background: rgba(255,255,255,0.36);
  border: 0;
}
.va__player-vol::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 8px; height: 8px;
  border-radius: 0;
  background: #fff;
  margin-top: -3.5px;
  border: 0;
  transform: rotate(45deg);
}
.va__player-vol::-moz-range-thumb {
  width: 8px; height: 8px;
  border-radius: 0;
  background: #fff;
  border: 0;
  transform: rotate(45deg);
}
@media (max-width: 540px) {
  .va__player-vol-wrap { display: none; }
}
body.va-player-open { overflow: hidden; }

/* ============================================================
   INLINE VIDEO PLAYER (Salt-Cinema style).
   The poster sits in place. Click → plays inline AT THE TILE's
   own location (no modal). Chrome (time + volume + settings +
   fullscreen + hairline progress) is permanently in the player
   frame, fading slightly when the cursor leaves so it never
   covers the work. Only the fullscreen button moves the video
   into native fullscreen — that's the single mode-change.
   First applied to villa-rafaella.html as the reference; will
   replace the modal-click pattern site-wide once locked.
============================================================ */
.va__vp {
  position: relative;
  width: 100%;
  background: #000;
  overflow: hidden;
  isolation: isolate;
  cursor: pointer;
  /* Default = portrait reel (9:16). Modifiers override for landscape /
     square / custom inline aspect-ratio. ============================== */
  aspect-ratio: 9 / 16;
}
.va__vp--landscape { aspect-ratio: 16 / 9; }
.va__vp--portrait  { aspect-ratio: 9 / 16; }
.va__vp--square    { aspect-ratio: 1 / 1; }
/* Hover-darken at rest. The whole frame deepens when the cursor enters
   the player BEFORE play has been pressed, so the centred play disc
   reads against any bright frame. The moment the user hits play, this
   shadow (and everything else) disappears and the video runs clean. */
.va__vp::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0,0,0,0.34);
  opacity: 0;
  z-index: 1;
  pointer-events: none;
  transition: opacity 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__vp:hover::before { opacity: 1; }
.va__vp.is-playing::before,
.va__vp.is-playing:hover::before { opacity: 0; }
.va__vp__video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  background: #000;
}
/* Soft bottom shade — gives chrome readable contrast on bright frames. */
.va__vp__shade {
  position: absolute;
  left: 0; right: 0;
  bottom: 0;
  height: 38%;
  background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.62) 100%);
  pointer-events: none;
  z-index: 2;
  opacity: 1;
  transition: opacity 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
/* Top vignette — so the centered play button has the same dark feel
   from above as Salt Cinema's reference. Lighter than the bottom. */
.va__vp__shade-top {
  position: absolute;
  left: 0; right: 0;
  top: 0;
  height: 22%;
  background: linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,0.32) 100%);
  pointer-events: none;
  z-index: 2;
  opacity: 1;
  transition: opacity 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* Centred play button — Salt-Cinema spec.
   Smaller, denser disc with a larger triangle that DOMINATES the disc
   (≈40% width). No outline ring, soft outer shadow. ====================== */
.va__vp__play {
  position: absolute;
  top: 50%; left: 50%;
  width: clamp(72px, 5.6vw, 96px);
  height: clamp(72px, 5.6vw, 96px);
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.58);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 0;
  outline: 0;
  box-shadow: 0 16px 42px -10px rgba(0,0,0,0.58);
  cursor: pointer;
  color: #fff;
  display: grid;
  place-items: center;
  padding: 0;
  z-index: 4;
  transform: translate(-50%, -50%);
  transition: background 240ms ease,
              box-shadow 320ms ease,
              transform 380ms cubic-bezier(0.22, 0.61, 0.36, 1),
              opacity 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__vp__play:hover {
  background: rgba(0,0,0,0.72);
  box-shadow: 0 20px 52px -10px rgba(0,0,0,0.72);
  transform: translate(-50%, -50%) scale(1.04);
}
.va__vp__play:focus-visible { outline: 2px solid rgba(255,255,255,0.55); outline-offset: 4px; }
.va__vp__play svg {
  width: 44%;
  height: 44%;
  fill: #fff;
  /* No optical x-shift — the triangle sits at true geometric centre. */
}
.va__vp.is-playing .va__vp__play {
  opacity: 0;
  pointer-events: none;
}

/* Chrome row — time on the left, control cluster on the right. Sits
   above the hairline progress bar with breathing room. */
.va__vp__chrome {
  position: absolute;
  left: 0; right: 0;
  bottom: clamp(20px, 2vw, 28px);
  padding: 0 clamp(20px, 2.4vw, 32px);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  z-index: 5;
  color: #fff;
  pointer-events: none;
}
.va__vp__chrome > * { pointer-events: auto; }
.va__vp__time {
  font-family: var(--font-body);
  font-size: clamp(0.8125rem, 1vw, 0.9375rem);
  font-weight: var(--fw-light, 300);
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
  text-shadow: 0 1px 4px rgba(0,0,0,0.42);
  user-select: none;
}
.va__vp__ctrls {
  display: inline-flex;
  align-items: center;
  gap: clamp(16px, 1.6vw, 24px);
}
.va__vp__btn {
  background: transparent;
  border: 0;
  cursor: pointer;
  color: #fff;
  width: clamp(22px, 1.7vw, 26px);
  height: clamp(22px, 1.7vw, 26px);
  padding: 0;
  display: grid;
  place-items: center;
  opacity: 0.94;
  transition: opacity 200ms ease, transform 200ms ease;
  filter: drop-shadow(0 1px 3px rgba(0,0,0,0.45));
}
.va__vp__btn:hover {
  opacity: 1;
  transform: scale(1.08);
}
.va__vp__btn svg {
  width: 100%;
  height: 100%;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.va__vp__btn .vp-fill { fill: currentColor; stroke: none; }
/* The Lucide gear path fills the full 24×24 viewBox edge-to-edge, so
   visually it lands ~14% larger than the speaker / fullscreen icons.
   Scale the inner SVG to bring optical weight in line. */
.va__vp__btn[data-vp-set] svg { transform: scale(0.86); }

/* Volume control: speaker icon + a horizontal slider that grows out
   from zero width on hover. The slider stays inside the chrome row so
   the layout doesn't jump when it appears. ============================== */
.va__vp__vol {
  display: inline-flex;
  align-items: center;
  gap: 0;
}
.va__vp__vol-slider {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  width: 0;
  height: 16px;
  margin: 0;
  cursor: pointer;
  opacity: 0;
  transition: width 320ms cubic-bezier(0.22, 0.61, 0.36, 1),
              opacity 240ms ease,
              margin-left 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.va__vp__vol:hover .va__vp__vol-slider,
.va__vp__vol:focus-within .va__vp__vol-slider {
  width: clamp(64px, 7vw, 96px);
  margin-left: 10px;
  opacity: 1;
}
.va__vp__vol-slider::-webkit-slider-runnable-track {
  height: 1px;
  background: rgba(255,255,255,0.32);
  border: 0;
}
.va__vp__vol-slider::-moz-range-track {
  height: 1px;
  background: rgba(255,255,255,0.32);
  border: 0;
}
.va__vp__vol-slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 9px; height: 9px;
  border-radius: 50%;
  background: #fff;
  border: 0;
  margin-top: -4px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
}
.va__vp__vol-slider::-moz-range-thumb {
  width: 9px; height: 9px;
  border-radius: 50%;
  background: #fff;
  border: 0;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
}

/* Hairline progress — sits a small distance above the bottom edge so
   the bar reads as a deliberate UI element rather than a screen border.
   On hover the bar lifts subtly (drop-shadow + slight thickness) so the
   user can see exactly where the duration is. =========================== */
.va__vp__progress {
  position: absolute;
  left: clamp(20px, 2.4vw, 32px);
  right: clamp(20px, 2.4vw, 32px);
  bottom: clamp(8px, 0.9vw, 12px);
  height: 2px;
  background: rgba(255,255,255,0.20);
  z-index: 6;
  cursor: pointer;
  transition: height 200ms cubic-bezier(0.22, 0.61, 0.36, 1),
              filter 220ms ease,
              background 220ms ease;
}
.va__vp__progress:hover {
  height: 3px;
  background: rgba(255,255,255,0.28);
  filter: drop-shadow(0 2px 6px rgba(0,0,0,0.55));
}
.va__vp__progress-fill {
  display: block;
  height: 100%;
  width: 0%;
  background: rgba(255,255,255,0.94);
  /* No width transition — RAF updates the playhead every frame, a CSS
     transition lags 80ms behind playback and visibly chases the cursor. */
}

/* Auto-hide chrome after a few seconds of idle play; restores on hover. */
.va__vp.is-idle .va__vp__chrome,
.va__vp.is-idle .va__vp__shade,
.va__vp.is-idle .va__vp__shade-top,
.va__vp.is-idle .va__vp__progress {
  opacity: 0;
}
.va__vp.is-idle:hover .va__vp__chrome,
.va__vp.is-idle:hover .va__vp__shade,
.va__vp.is-idle:hover .va__vp__shade-top,
.va__vp.is-idle:hover .va__vp__progress {
  opacity: 1;
}
.va__vp__chrome,
.va__vp__shade,
.va__vp__shade-top,
.va__vp__progress {
  transition: opacity 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
/* Fullscreen mode — the player container fills the viewport and the
   video letterboxes inside (object-fit: contain) so we never crop the
   work. Chrome stays anchored to the bottom edge of the now full-page
   container, so its position scales with the user's screen. =========== */
.va__vp:fullscreen,
.va__vp:-webkit-full-screen,
.va__vp.is-fullscreen {
  width: 100vw;
  height: 100vh;
  background: #000;
  aspect-ratio: auto;
  display: grid;
  place-items: center;
}
.va__vp:fullscreen .va__vp__video,
.va__vp:-webkit-full-screen .va__vp__video,
.va__vp.is-fullscreen .va__vp__video {
  width: 100%;
  height: 100%;
  object-fit: contain !important;
  max-width: 100vw;
  max-height: 100vh;
}

/* ============================================================
   COOKIE CONSENT BANNER (shared, injected by js/main.js).
   Editorial bar pinned bottom-right, monochrome glass treatment.
   Buttons: Accept all (primary) / Reject non-essential (secondary)
   plus a quiet privacy-policy link. Hides on first interaction
   and writes a localStorage flag so it never re-appears for the
   same visitor. Honours `prefers-reduced-motion`.
============================================================ */
.hoa-cookie {
  position: fixed;
  z-index: 10000;
  right: clamp(16px, 2.4vw, 28px);
  bottom: clamp(16px, 2.4vw, 28px);
  max-width: min(420px, calc(100vw - 32px));
  padding: clamp(18px, 2vw, 24px) clamp(20px, 2.4vw, 28px);
  background: rgba(10,10,10,0.78);
  color: rgba(255,255,255,0.92);
  border: 1px solid rgba(255,255,255,0.18);
  backdrop-filter: blur(20px) saturate(1.05);
  -webkit-backdrop-filter: blur(20px) saturate(1.05);
  box-shadow: 0 24px 64px -16px rgba(0,0,0,0.55);
  font-family: var(--font-body);
  font-weight: var(--fw-light, 300);
  font-size: 0.875rem;
  line-height: 1.5;
  transform: translateY(16px);
  opacity: 0;
  transition: transform 480ms cubic-bezier(0.22, 0.61, 0.36, 1),
              opacity 480ms cubic-bezier(0.22, 0.61, 0.36, 1);
  pointer-events: none;
}
.hoa-cookie.is-visible {
  transform: translateY(0);
  opacity: 1;
  pointer-events: auto;
}

/* Mobile rules moved to AFTER the desktop base rules below — they were
   here originally but the cascade order let the desktop block override
   them. See the @media (max-width: 600px) block at the end of this
   section. */
.hoa-cookie__title {
  display: block;
  font-family: var(--font-display);
  font-weight: var(--fw-thin, 200);
  font-size: 1.0625rem;
  margin: 0 0 6px;
  letter-spacing: -0.01em;
  color: #fff;
}
.hoa-cookie__body {
  margin: 0 0 14px;
  color: rgba(255,255,255,0.74);
}
/* Privacy-policy link: editorial double-underline swap on hover. The
   resting underline retracts as a fresh underline draws in from the
   left, in time with the cubic-bezier easing the rest of the site uses
   for hairlines. ============================================== */
.hoa-cookie__body a {
  position: relative;
  display: inline-block;
  color: #fff;
  text-decoration: none;
  padding-bottom: 1px;
}
.hoa-cookie__body a::before,
.hoa-cookie__body a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: currentColor;
  transform-origin: left center;
  transition: transform 460ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.hoa-cookie__body a::before { transform: scaleX(1); }
.hoa-cookie__body a::after  { transform: scaleX(0); transform-origin: right center; }
.hoa-cookie__body a:hover::before { transform: scaleX(0); transform-origin: right center; }
.hoa-cookie__body a:hover::after  { transform: scaleX(1); transform-origin: left center; transition-delay: 120ms; }
.hoa-cookie__row {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
}

/* ---------- Case-study cross-link rail ("Read next") ----------
   Sits between the case-study body and the cta-close on the 4 RE marketing
   engagements (villa-apollon, ck-realtors, estate-prive, punctum-interiors)
   so a visitor finishing one story has a frictionless path into another. */
.cs-next {
  background: var(--color-paper, #fafafa);
  padding: clamp(80px, 9vw, 144px) clamp(var(--space-5), 5vw, var(--space-9));
  border-top: 1px solid rgba(10,10,10,0.08);
}
.cs-next__inner { max-width: 1280px; margin: 0 auto; }
.cs-next__eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--font-body);
  font-size: 0.6875rem; letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(10,10,10,0.62); font-weight: 500;
  margin-bottom: clamp(28px, 3vw, 40px);
}
.cs-next__eyebrow::before {
  content: ""; width: 6px; height: 6px;
  background: var(--color-ink, #0a0a0a); border-radius: 999px;
}
.cs-next__grid {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: clamp(20px, 2.4vw, 32px);
}
@media (max-width: 760px) { .cs-next__grid { grid-template-columns: 1fr; } }
.cs-next__card {
  display: block; text-decoration: none; color: var(--color-ink);
  background: #fff;
  border: 1px solid rgba(10,10,10,0.08);
  transition: border-color 240ms var(--motion-ease), transform 360ms var(--motion-ease);
  overflow: hidden;
}
.cs-next__card:hover {
  border-color: rgba(10,10,10,0.32);
  transform: translateY(-3px);
}
.cs-next__media {
  position: relative; aspect-ratio: 16 / 9;
  overflow: hidden; background: #000;
}
.cs-next__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 900ms var(--motion-ease);
}
.cs-next__card:hover .cs-next__media img { transform: scale(1.04); }
.cs-next__body {
  padding: clamp(20px, 2vw, 28px) clamp(20px, 2vw, 28px) clamp(24px, 2.4vw, 32px);
  display: flex; flex-direction: column; gap: 6px;
}
.cs-next__name {
  font-family: var(--font-display); font-weight: 200;
  font-size: clamp(1.25rem, 1.6vw, 1.625rem);
  line-height: 1.15; letter-spacing: -0.01em;
}
.cs-next__hook {
  font-family: var(--font-body); font-size: 0.8125rem;
  font-weight: 300; color: rgba(10,10,10,0.62);
  letter-spacing: 0.02em;
}

/* ---------- WhatsApp sticky CTA ----------
   Fixed bottom-right pill, sitewide except legal pages. Ink fill / paper
   text per the "no red on the website" lock rule, so the WhatsApp pill
   reads as part of the brand vocabulary, not a foreign green dot. The
   element is injected by js/main.js after DOM ready. Hidden while the
   preloader is up, while a Salt-Cinema player is fullscreen, and when the
   user prefers reduced motion (the bounce-in is the only motion). */
.wa-sticky {
  position: fixed;
  right: clamp(16px, 2.4vw, 28px);
  bottom: clamp(16px, 2.4vw, 28px);
  z-index: 95;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 48px;
  padding: 12px 18px 12px 14px;
  background: var(--color-ink, #0a0a0a);
  color: #fff;
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 500;
  text-decoration: none;
  border: 1px solid rgba(255,255,255,0.18);
  box-shadow: 0 6px 24px -8px rgba(0,0,0,0.45);
  transition: background 220ms ease, transform 220ms cubic-bezier(0.22, 0.8, 0.24, 1), box-shadow 220ms ease;
  opacity: 0;
  transform: translateY(12px);
  pointer-events: none;
  animation: wa-sticky-in 520ms cubic-bezier(0.22, 0.8, 0.24, 1) 1.2s forwards;
}
@keyframes wa-sticky-in {
  to { opacity: 1; transform: translateY(0); pointer-events: auto; }
}
.wa-sticky:hover {
  background: #141414;
  transform: translateY(-2px);
  box-shadow: 0 10px 28px -8px rgba(0,0,0,0.55);
}
.wa-sticky:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 2px;
}
.wa-sticky__icon {
  display: inline-grid;
  place-items: center;
  width: 22px; height: 22px;
}
.wa-sticky__icon svg { width: 22px; height: 22px; }
.wa-sticky__label { display: inline-block; }
/* Mobile: collapse to icon-only so it doesn't crowd thumb-zone or compete
   with bottom-anchored UI. */
@media (max-width: 600px) {
  .wa-sticky {
    min-height: 52px;
    width: 52px;
    padding: 0;
    justify-content: center;
    border-radius: 0;
  }
  .wa-sticky__label { display: none; }
}
/* Hide while a Salt-Cinema video is fullscreen, while the preloader is up,
   and during the intro animation. Reduced-motion users get it instantly
   instead of the bounce. */
body.is-preloading .wa-sticky,
body.is-intro-running .wa-sticky,
body:has(.va__vp.is-fullscreen) .wa-sticky { opacity: 0; pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
  .wa-sticky {
    animation: none;
    opacity: 1;
    transform: none;
    pointer-events: auto;
  }
}

.hoa-cookie__btn {
  font-family: var(--font-body);
  font-size: 0.6875rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: var(--fw-medium, 500);
  padding: 13px 18px;
  min-height: 44px;
  cursor: pointer;
  background: transparent;
  color: rgba(255,255,255,0.92);
  border: 1px solid rgba(255,255,255,0.32);
  transition: background 220ms ease, border-color 220ms ease, color 220ms ease;
}
.hoa-cookie__btn:hover {
  background: rgba(255,255,255,0.06);
  border-color: rgba(255,255,255,0.62);
}
.hoa-cookie__btn--primary {
  background: rgba(255,255,255,0.92);
  color: var(--color-ink, #0a0a0a);
  border-color: rgba(255,255,255,0.92);
}
.hoa-cookie__btn--primary:hover {
  background: #fff;
  color: var(--color-ink, #0a0a0a);
  border-color: #fff;
}
@media (prefers-reduced-motion: reduce) {
  .hoa-cookie { transition: opacity 240ms ease; transform: none; }
}

/* Mobile: ultra-compact horizontal strip at the bottom. Title sits inline
   with the two action buttons in a single row, banner stays ~60px tall,
   never covers the hero CTAs at 375 / 414 / 540 widths. */
@media (max-width: 600px) {
  .hoa-cookie {
    right: 0; left: 0; bottom: 0;
    max-width: 100vw;
    padding: 10px 12px;
    border-left: 0; border-right: 0; border-bottom: 0;
    font-size: 0.75rem; line-height: 1.3;
    display: flex; flex-direction: row;
    align-items: center;
    gap: 10px;
  }
  .hoa-cookie__title {
    font-size: 0.75rem;
    font-family: var(--font-body);
    font-weight: 500;
    letter-spacing: 0.02em;
    margin: 0;
    flex: 1 1 auto;
    min-width: 0;
  }
  .hoa-cookie__body { display: none !important; }
  .hoa-cookie__row {
    gap: 6px;
    margin: 0;
    flex: 0 0 auto;
  }
  .hoa-cookie__btn {
    padding: 9px 12px;
    min-height: 40px;
    font-size: 0.625rem;
    letter-spacing: 0.12em;
    white-space: nowrap;
  }
}

/* The earlier `right: 12px; left: 12px; bottom: 12px` floating-card override
   for ≤540px was REMOVED — it was undoing the bottom-strip fix above and
   pushing the banner back over the hero CTAs at 375 / 414 / 540 widths. */

/* ============================================================
   MORE WORK video lightbox — opens when a `.projects-dump__cell`
   with `data-video-src` is clicked. Native <video controls> in
   a glass full-page overlay; close via × / outside / Esc.
============================================================ */
.pj-lightbox {
  position: fixed;
  inset: 0;
  z-index: 10001;
  display: grid;
  place-items: center;
  background: rgba(8, 8, 8, 0.78);
  backdrop-filter: blur(22px) saturate(1.05);
  -webkit-backdrop-filter: blur(22px) saturate(1.05);
  opacity: 0;
  transition: opacity 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.pj-lightbox.is-open { opacity: 1; }
.pj-lightbox__stage {
  position: relative;
  width: min(1280px, 92vw);
  max-height: 86vh;
  transform: scale(0.96);
  transition: transform 460ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.pj-lightbox.is-open .pj-lightbox__stage { transform: scale(1); }
.pj-lightbox__video {
  width: 100%;
  height: auto;
  max-height: 86vh;
  background: #000;
  display: block;
}
.pj-lightbox__close {
  position: absolute;
  top: clamp(20px, 3vw, 32px);
  right: clamp(20px, 3vw, 32px);
  width: 44px; height: 44px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.32);
  cursor: pointer;
  z-index: 2;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  transition: background 220ms ease, transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.pj-lightbox__close:hover {
  background: rgba(255,255,255,0.18);
  transform: rotate(90deg);
}
.pj-lightbox__close::before,
.pj-lightbox__close::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 18px; height: 1px;
  background: #fff;
  transform-origin: center;
}
.pj-lightbox__close::before { transform: translate(-50%, -50%) rotate(45deg); }
.pj-lightbox__close::after  { transform: translate(-50%, -50%) rotate(-45deg); }
body.pj-lightbox-open { overflow: hidden; }

/* ──────────────────────────────────────────────────────────────────────
   RESPONSIVE QA — 2026-05-01
   Cross-page mobile overflow fixes for the .ps__related card row that
   appears at the bottom of every case study. The per-page inline rules
   give .ps__related-card a flex row with white-space:nowrap on the
   location chip; on narrow viewports the card refuses to shrink below
   its content (min-width:auto on the grid item), causing horizontal
   overflow on dusit / ak-chorothetisis / ej-consulting-services /
   punctum-interiors.

   This block sits at the end of main.css so it wins the cascade over
   the per-page <style> rules, without needing to edit 9 HTML files.
   ────────────────────────────────────────────────────────────────── */
.ps__related-grid > * { min-width: 0; }
.ps__related-card,
.ps__related-info,
.ps__related-name { min-width: 0; }
.ps__related-name { overflow-wrap: anywhere; }
@media (max-width: 480px) {
  .ps__related-info {
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 6px var(--ps-s4, 16px);
  }
  .ps__related-loc { white-space: normal; }
}

/* ──────────────────────────────────────────────────────────────────────
   JOURNAL · footer newsletter with vertical image (journal page only)
   2026-05-01
   The journal page uses the sitewide .altfooter but adds an editorial
   vertical image to the left of the newsletter block. Layout becomes
   [image | newsletter | nav columns] on desktop, image collapses out of
   the flow on narrow viewports so the form stays readable.
   ────────────────────────────────────────────────────────────────── */
.altfooter--journal .altfooter__top {
  grid-template-columns: minmax(220px, 280px) minmax(0, 1fr) minmax(0, 1.4fr);
  align-items: stretch;
}
.altfooter__news-aside {
  margin: 0;
  align-self: stretch;
  display: block;
  overflow: hidden;
  background: rgba(255,255,255,0.04);
}
.altfooter__news-aside img {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 320px;
  object-fit: cover;
  object-position: center;
  filter: saturate(0.92) contrast(1.02);
}
@media (max-width: 1024px) {
  .altfooter--journal .altfooter__top {
    grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.4fr);
  }
  .altfooter--journal .altfooter__news-aside {
    grid-row: 1 / span 2;
    grid-column: 1;
  }
  .altfooter--journal .altfooter__news,
  .altfooter--journal .altfooter__nav {
    grid-column: 2;
  }
}
@media (max-width: 760px) {
  .altfooter--journal .altfooter__news-aside { display: none; }
  .altfooter--journal .altfooter__top {
    grid-template-columns: 1fr;
  }
  .altfooter--journal .altfooter__news,
  .altfooter--journal .altfooter__nav {
    grid-column: auto;
  }
}

/* ──────────────────────────────────────────────────────────────────────
   FULLSCREEN VIDEO FIX — 2026-05-01
   When the Salt-Cinema player (.va__vp) or the More Work lightbox
   (.pj-lightbox) is fullscreened, drop the in-tile aspect-ratio + cover
   crop and let the native video element letterbox properly so vertical
   9:16 reels (Dusit, Selene reel, etc.) don't appear zoomed-in /
   horizontally cropped on a 16:9 display.
   ────────────────────────────────────────────────────────────────── */
.va__vp:fullscreen,
.va__vp:-webkit-full-screen {
  aspect-ratio: auto;
  width: 100vw;
  height: 100vh;
  background: #000;
}
.va__vp:fullscreen .va__vp__video,
.va__vp:-webkit-full-screen .va__vp__video {
  object-fit: contain;
  width: 100%;
  height: 100%;
}
.pj-lightbox__video:fullscreen,
.pj-lightbox__video:-webkit-full-screen {
  object-fit: contain;
  width: 100vw;
  height: 100vh;
  max-height: 100vh;
  background: #000;
}

/* Belt-and-braces for the in-lightbox state (not browser fullscreen):
   the 1280px stage is fine for landscape clips but crushes verticals.
   Cap the video element's WIDTH by viewport height so a 9:16 reel sits
   centred without being scaled past the screen. */
.pj-lightbox__video {
  max-width: min(1280px, calc(86vh * 9 / 16) * 2);  /* allow up to ~2× a 9:16 reel column */
}
@supports (aspect-ratio: 9/16) {
  .pj-lightbox__video[data-portrait="1"] {
    max-width: calc(86vh * 9 / 16);
    width: auto;
    height: 86vh;
  }
}

/* ============================================================
   RESPONSIVE PASS — 2026-05-02 (Wave 1A)
   Universal overrides applied during the mobile responsive
   redesign. Kept in one block so the whole pass is easy to
   inspect or roll back. Subsequent waves will append below.
============================================================ */

/* ---- Wave 1A.1 — Top nav: hamburger-only on tablet/mobile ----
   Desktop (≥1025px) keeps the original top nav as-is: 4 page
   links + the "Enquire now" glass CTA on the right. On tablet
   and mobile (≤1024px) those collapse into the hamburger menu.
   The hamburger itself becomes always-visible at those sizes
   instead of being gated on hero scroll-out. */
@media (max-width: 1024px) {
  .nav__links { display: none !important; }
  .btn-ct--nav { display: none !important; }
  .hamburger {
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
    filter: none !important;
  }
}

/* ---- Wave 1A.2 — Footer: 2 columns on MOBILE/TABLET only.
   Desktop keeps the base 3-column layout (Index / Useful /
   Connect). Earlier this rule was unscoped and bleeding to
   desktop, making the footer too tall and stacking badly. */
@media (max-width: 1024px) {
  .altfooter__nav {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto;
    row-gap: clamp(28px, 3vw, 48px);
  }
  .altfooter__col:nth-child(1) {
    grid-column: 1;
    grid-row: 1 / span 2;
  }
  .altfooter__col:nth-child(2) {
    grid-column: 2;
    grid-row: 1;
  }
  .altfooter__col:nth-child(3) {
    grid-column: 2;
    grid-row: 2;
  }
}

/* ---- Wave 1A.3 — Sharp corners on the footer container ---- */
/* Brand rule: zero radius on layout containers. Pills, dots
   and circular avatars keep their existing radii (those are
   intentional shape primitives, not "rounded boxes"). */
.altfooter { border-radius: 0 !important; }

/* Wave 35.B — Footer tighten on DESKTOP only.
   User: "smaller in volume, like a footer". Reduce padding,
   shrink newsletter title, tighten gaps. Mobile/tablet keep
   their compact rules already in place. */
@media (min-width: 1025px) {
  .altfooter {
    padding: clamp(32px, 3.4vw, 52px) clamp(28px, 4vw, 56px) clamp(20px, 2vw, 28px) !important;
  }
  .altfooter__top {
    gap: clamp(32px, 4vw, 56px) !important;
  }
  .altfooter__news-title {
    font-size: clamp(1.25rem, 1.8vw, 1.625rem) !important;
    margin-bottom: 8px !important;
  }
  .altfooter__news-lede {
    font-size: 0.8125rem !important;
    margin-bottom: 14px !important;
  }
  .altfooter__col-title {
    margin-bottom: 14px !important;
  }
  .altfooter__nav ul {
    gap: 8px !important;
  }
  .altfooter__nav a {
    font-size: 0.875rem !important;
  }
}

/* ============================================================
   Wave 1B — Mobile/tablet typography scale-down
   The token scale in tokens.css already lowered the floor of
   --fs-hero/--fs-h2/--fs-h3 etc. Here we override hand-rolled
   font-size clamps that bypass the tokens (the homepage hero
   title is the main offender, with its own clamp(3rem, 5.5vw,
   4.8rem) sized for desktop). Goal: "Leading Luxury Real
   Estate Marketing Agency" fits in 2 lines at 375px instead
   of 4, and the kicker stops dwarfing the page.
============================================================ */
@media (max-width: 1024px) {
  .hero__title {
    font-size: clamp(2.25rem, 5.6vw + 0.5rem, 4.8rem) !important;
    /* 375px → 36px ; 768px → 51px ; 1024px → 65.4px */
    line-height: 1.08;
  }
  .hero__kicker {
    font-size: 0.9375rem;
    line-height: 1.55;
  }
  .hero__rule {
    margin: 20px 0 18px;
  }
}
@media (max-width: 600px) {
  .hero__title {
    font-size: clamp(2rem, 8vw, 2.75rem) !important;
    /* 375px → 30px ; 480px → 38.4px ; 600px → 44px */
    letter-spacing: -0.02em;
  }
  .hero__kicker {
    font-size: 0.9375rem;
    margin-top: 16px;
  }
}

/* ============================================================
   Wave 1B.2 — Tighter section padding on small viewports
   The fluid token --section-pad-y has a floor of --space-8
   (64px). At 375px that means 64px top + 64px bottom on every
   section. With 13 sections on the home page that's 1664px of
   pure whitespace before any content even renders. Bring the
   floor down to 40-48px on mobile so the user scrolls less.
============================================================ */
@media (max-width: 1024px) {
  :root {
    --section-pad-y: clamp(48px, 8vw, 96px);
    --container-pad-x: clamp(20px, 4vw, 40px);
  }
}
@media (max-width: 600px) {
  :root {
    --section-pad-y: clamp(40px, 7vw, 72px);
    --container-pad-x: clamp(20px, 4vw, 28px);
  }
}

/* ============================================================
   Wave 1C — Universal hero stacking guard
   The "elements falling on each other" issue in heroes was a
   missing display flex / column on the hero containers used by
   non-home pages (.about-hero, .cs-hero, .pj-hero, .ej-hero,
   .ct-hero, .approach__hero, etc). Force a vertical stack with
   guaranteed gaps between title, kicker, rule and CTAs on small
   viewports so nothing can collide regardless of float / abs
   positioning chosen elsewhere.
============================================================ */
@media (max-width: 1024px) {
  /* No padding-top/bottom on the hero containers themselves —
     adding ink-coloured padding there created the visible
     black band above the brand wordmark on small screens.
     Internal stacking is handled by the children's own gaps. */
  .about-hero > * + *,
  .cs-hero > * + *,
  .pj-hero > * + *,
  .ct-hero > * + *,
  .ej-hero > * + * {
    margin-top: clamp(12px, 2vw, 20px);
  }
  /* Hero CTA blocks always wrap and gap on small screens so a
     misaligned button never sits on top of another. */
  .hero__ctas,
  .about-hero__ctas,
  .cs-hero__ctas,
  .pj-hero__ctas,
  .ct-hero__ctas {
    flex-wrap: wrap;
    gap: 14px;
    margin-top: 18px;
  }
}

/* ============================================================
   Wave 2 — Home page-specific
============================================================ */

/* ---- 2.1 Logo slightly larger (40px -> 48px) ---- */
.nav__brand img {
  height: 48px !important;
}
@media (max-width: 600px) {
  .nav__brand img { height: 40px !important; }
}

/* ---- 2.2 Founder portraits — side-by-side, small ---- */
/* Replaces the rotated overlapping card stack with a clean
   2-column grid identical in spirit to the about-page's
   .about-founders__grid. Same on desktop, tablet, mobile.
   Sharp corners, no rotation, no scale-on-hover acrobatics. */
.about__media {
  display: grid !important;
  grid-template-columns: 1fr 1fr;
  gap: clamp(12px, 2vw, 24px);
  position: relative;
  perspective: none !important;
  min-height: 0 !important;
  align-self: auto !important;
  max-width: 560px;
  margin-left: auto;
}
.about__card,
.about__card--a,
.about__card--b {
  position: relative !important;
  top: auto !important;
  bottom: auto !important;
  left: auto !important;
  right: auto !important;
  height: auto !important;
  width: 100% !important;
  aspect-ratio: 3 / 4;
  transform: none !important;
  z-index: auto !important;
  box-shadow: 0 8px 24px -12px rgba(0,0,0,0.25) !important;
}
.about__media:hover .about__card--a,
.about__media:hover .about__card--b,
.about__card:hover img {
  transform: none !important;
}
@media (max-width: 600px) {
  .about__media {
    max-width: 100%;
    margin-left: 0;
  }
}

/* ---- 2.3 What-sets-us-apart — single outer perimeter, no
            confusing inner cell-by-cell borders. The HoA column
            gets a subtle background tint instead so it stands
            out without piling on more lines. ---- */
.sets-apart__matrix-wrap {
  border: 1px solid rgba(255,255,255,0.55);
}
.sets-apart__matrix {
  border-top: 0 !important;
}
.sets-apart__label,
.sets-apart__h,
.sets-apart__h--cat,
.sets-apart__cell {
  border-right: 0 !important;
  border-bottom: 1px solid rgba(255,255,255,0.10) !important;
}
.sets-apart__row--last .sets-apart__label,
.sets-apart__row--last .sets-apart__cell {
  border-bottom: 0 !important;
}
.sets-apart__h--hoa,
.sets-apart__cell--hoa {
  background: rgba(255,255,255,0.04) !important;
}

/* ============================================================
   Wave 2.4 — Button compaction
   Reduce button padding on tablet/mobile so the CTAs occupy
   less vertical real-estate without losing tap-target area.
============================================================ */
@media (max-width: 1024px) {
  .btn-ct--quiet,
  .btn-ct--glass {
    padding: 11px 18px;
  }
  .btn-ct {
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
  }
}
@media (max-width: 600px) {
  .btn-ct--quiet,
  .btn-ct--glass {
    padding: 10px 16px;
  }
}

/* ============================================================
   Wave 2.5 reverted — Brand wordmark stays inside the hero
   The earlier attempt to make .nav position:fixed read as a
   "hamburger-style floating bar" — user wants the brand
   wordmark to scroll away with the rest of the hero, the
   same way the hero text does. Original .nav behaviour
   restored (no overrides here). The hamburger keeps its
   fixed pinning since that one is meant to persist.
============================================================ */

/* ============================================================
   Wave 2.6 — Home hero kicker: shorter on mobile
   The kicker is split into two <span data-hk="full"> spans
   in the HTML. The second sentence is hidden below 600px so
   the hero on phones reads as one tight paragraph instead of
   four lines of marketing copy.
============================================================ */
@media (max-width: 600px) {
  .hero__kicker [data-hk="2"] { display: none; }
  .hero__kicker [data-hk="1"]::after { content: ""; }
}

/* ============================================================
   Wave 2.7 — Hero title break: 2-2-2 on mobile
   Desktop wants two lines (Leading Luxury Real Estate /
   Marketing Agency). Mobile wants three lines of two words
   each (Leading Luxury / Real Estate / Marketing Agency)
   instead of an awkward 4-2 wrap. The HTML now contains a
   .hero__title-mbreak span around an extra <br/> that is
   hidden by default and revealed on small viewports.
============================================================ */
.hero__title-mbreak { display: none; }
@media (max-width: 600px) {
  .hero__title-mbreak { display: inline; }
}

/* ============================================================
   Wave 4.A — Reveal bypass on small viewports
   The .reveal IntersectionObserver fires at threshold 0.18
   with a -8% rootMargin. On big elements that exceed the
   mobile viewport (e.g. .approach-services__grid is 9 cards
   tall), 18% of the element is bigger than the visible
   window, so is-visible NEVER fires and the whole block
   stays at opacity 0 — exactly the "Nine disciplines is
   bugged, nothing shows" report. Forcing reveal-targeted
   blocks visible by default below 1024px lets content load
   regardless of scroll rhythm. Reveal animation still runs
   on desktop where it works correctly.
============================================================ */
@media (max-width: 1024px) {
  .reveal,
  .reveal-soft {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
  }
}

/* ============================================================
   Wave 4.B — Approach numbered-process: vertical list on mobile
   The desktop av2-rail is a scroll-driven sticky storytelling
   layout where 7 steps overlap inside a single sticky stage
   and JS swaps the active one based on scroll progress. On
   mobile that pattern fails: the right-side circular ring
   indicator collides with the copy column, all 7 steps stack
   on top of each other (only one opaque, the rest at 0), and
   a duplicate "DISCOVERY & AUDIT" fragment appears under the
   active step — exactly the "01 number floats over the text,
   step name appears twice" report.

   Below 1024px we drop the storytelling chrome and render
   the section as a clean numbered list: each .av2-step
   becomes its own block with step number top-left, title
   below, body and deliverables under that. No sticky, no
   overlap, no JS dependency.
============================================================ */
@media (max-width: 1024px) {
  .av2-rail {
    height: auto !important;
    padding-block: clamp(56px, 8vw, 96px);
  }
  .av2-stage {
    position: relative !important;
    top: auto !important;
    height: auto !important;
    overflow: visible !important;
  }
  .av2-stage::before,
  .av2-stage::after {
    display: none;
  }
  .av2-step-indicator {
    display: none !important;
  }
  .av2-copy {
    position: relative !important;
    display: block !important;
    inset: auto !important;
    width: 100% !important;
    padding: 0 clamp(20px, 5vw, 40px) !important;
    pointer-events: auto !important;
  }
  /* Every step renders as its own block — no grid overlap, no
     opacity fade, no transform offset. */
  .av2-step,
  .av2-step.is-active {
    position: relative !important;
    display: block !important;
    grid-column: auto !important;
    grid-row: auto !important;
    width: 100% !important;
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    pointer-events: auto !important;
    padding-block: clamp(28px, 5vw, 44px);
    border-bottom: 1px solid rgba(255,255,255,0.10);
  }
  .av2-step:last-of-type { border-bottom: 0; }
  /* Step header layout — kicker stays inline, big number sits
     to its right so the user sees "Step 01 · Discovery & Audit
     [01]" as one clean header row. */
  .av2-step__kicker {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    font-size: 0.6875rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: rgba(255,255,255,0.78);
    margin: 0 0 14px;
  }
  .av2-step__num {
    color: #fff;
  }
  .av2-step__title {
    margin: 0 0 14px;
    font-size: clamp(1.5rem, 5.4vw, 2rem);
    line-height: 1.15;
  }
  .av2-step__body {
    font-size: 0.9375rem;
    line-height: 1.6;
    color: rgba(255,255,255,0.78);
    margin: 0 0 14px;
  }
  .av2-step__body + .av2-step__body { margin-top: 0; }
  .av2-step__deliv {
    margin-top: 16px;
    font-size: 0.6875rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: rgba(255,255,255,0.55);
    line-height: 1.5;
  }
}

/* ============================================================
   Wave 3 — About page: vertical timeline connector
   On desktop the 4-year timeline reads horizontally with a
   horizontal hairline connecting the dots. On mobile the
   timeline collapses to a single column but until now had
   no connector at all. User wants a vertical line connecting
   the years now that they sit stacked.
============================================================ */
@media (max-width: 900px) {
  .about-timeline__track {
    position: relative;
    padding-left: 24px;
  }
  .about-timeline__track::before {
    display: block !important;
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 6px;             /* sits just left of each .tl-item__dot */
    width: 1px;
    height: auto;
    background: rgba(255,255,255,0.18);
  }
  .tl-item {
    position: relative;
    padding-left: 0;
  }
  .tl-item__dot {
    position: absolute;
    left: -24px;
    top: 0.65rem;
  }
}

/* ============================================================
   Wave 5 — Case studies: shared component compaction
   All 4 case study pages (Apollon, Estate Prive, CK, Punctum)
   share the .va__ class namespace inside their inline styles,
   so universal overrides here reach every case study with one
   change. This pass focuses on the items the user flagged:

   - Problems & Solutions table (.va__ps): too tall on mobile,
     each row ate a screen height. Compact padding, smaller
     marks, tighter titles.
   - Key takeaways panel padding tightened.
   - Hero stack already tackled by Wave 1C; here we just bring
     the .va__hero typography in line with the new global
     scale so it does not overflow on 375px.
============================================================ */
@media (max-width: 1024px) {
  /* Problems & Solutions — compact rows */
  table.va__ps tbody td {
    padding: 14px 16px !important;
  }
  .va__ps-cell-inner {
    gap: 12px !important;
  }
  .va__ps-mark {
    width: 18px !important;
    font-size: 1.125rem !important;
    padding-top: 0 !important;
  }
  .va__ps-mark svg {
    width: 14px !important;
    height: 14px !important;
  }
  .va__ps-title {
    font-size: 1rem !important;
    line-height: 1.25 !important;
  }
  .va__ps-body {
    font-size: 0.8125rem !important;
    line-height: 1.5 !important;
  }
}
@media (max-width: 720px) {
  /* Below 720px the table already collapses into stacked
     cells via the case study's inline media query. Add a
     subtle separator + tighter spacing between rows. */
  table.va__ps tbody tr {
    padding-block: 4px !important;
  }
  table.va__ps tbody td {
    padding: 10px 14px !important;
  }
}

/* Case-study hero kicker / title scale — match the Wave 1B
   updates and prevent very long mobile titles from breaking
   into 5-6 lines. */
@media (max-width: 600px) {
  .va__hero h1,
  .va__hero__title,
  .cs-hero__title,
  .ep-hero__title,
  .ck-hero__title,
  .pi-hero__title {
    font-size: clamp(1.875rem, 8vw, 2.5rem) !important;
    line-height: 1.1 !important;
  }
}

/* ============================================================
   Wave 6 — Project pages: gallery compaction
   Five of six project pages share .ps__gallery with .ps__gallery-item
   (Rafaella, Selene, Bond, Dusit, AK Chorothetisis). Each gallery
   carries 25-40+ images, and at <=600px the original CSS dropped
   the grid to 1 column, sometimes pushing single-column scroll
   to 8000+px. Worse, items with --tall / --big modifiers used
   grid-auto-flow:dense which on a 1-col layout could push items
   past their declared cell, producing the "first 5 broken / last
   3 overlapping" report on Villa Bond.

   Fix below: on <=600px, force a 2-column grid with predictable
   aspect-ratio cells. Span modifiers reset to single-cell so no
   item can leak. Disables auto-flow:dense which is a no-op on
   uniform grids anyway.
============================================================ */
@media (max-width: 600px) {
  .ps__gallery {
    grid-template-columns: 1fr 1fr !important;
    --gallery-gap: 6px !important;
    grid-auto-flow: row !important;
    grid-auto-rows: auto !important;
  }
  .ps__gallery-item,
  .ps__gallery-item--big,
  .ps__gallery-item--tall,
  .ps__gallery-item--zoom {
    grid-column: auto !important;
    grid-row: auto !important;
    aspect-ratio: 4 / 3 !important;
    height: auto !important;
  }
  .ps__gallery-item--tall {
    aspect-ratio: 3 / 4 !important;
  }
  .ps__gallery-row3 {
    grid-template-columns: 1fr 1fr !important;
  }
}

/* ============================================================
   Wave 6.B revised — EJ Consulting per the explicit user spec
   - Strategy steps (Reposition/Audience/Anchor) MUST stay
     single-column 3-row on mobile/tablet. Reverting from the
     earlier 2x2 override.
   - Logo system (4 brand marks) MUST render as a 2x2 stack
     on mobile so all four read in the same eye-line. The
     page's own CSS dropped these to 1-col at <=520px; we
     pin them at 2x2 from 880px down to phones.
   - Palette / web grid stays 2x2 on tablet & mobile.
============================================================ */
.ej-brand__strategy-grid {
  /* No override — desktop and mobile both honour the page's
     own grid (3-col -> 1-col) which matches the user spec. */
}
@media (max-width: 880px) {
  .ej-brand__logos {
    grid-template-columns: 1fr 1fr !important;
    gap: 10px !important;
  }
}
@media (max-width: 1024px) {
  .ej-web__grid {
    grid-template-columns: 1fr 1fr !important;
    gap: 12px !important;
  }
}

/* ============================================================
   Wave 8 — Reviews: shorter on mobile + work-with-us slots
============================================================ */

/* Testimonials: clamp body text to ~6 lines on phones so each
   review reads at a glance instead of dominating the screen. */
@media (max-width: 768px) {
  .review__quote {
    font-size: 0.875rem !important;
    line-height: 1.5 !important;
    display: -webkit-box;
    -webkit-line-clamp: 6;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
}

/* "3 out of 5 slots booked" — keep on a single line at every
   viewport, drop the "don't miss out" suffix below 480px so
   the dot + counter still fits. */
.work-with-us__available {
  white-space: nowrap;
  font-size: 0.625rem !important;
  letter-spacing: 0.16em;
}
@media (max-width: 480px) {
  .work-with-us__available {
    font-size: 0.5625rem !important;
  }
}

/* About-stats numbers: smaller on phones to keep the strip
   readable in landscape thumb-zone. */
@media (max-width: 768px) {
  .about-stats__num,
  .about-stats__value,
  .about-stats__metric {
    font-size: clamp(2rem, 9vw, 3rem) !important;
  }
}

/* ============================================================
   Wave 2.8 — Sets-apart inverted: HoA dark + framed,
                                    Others gray and faded
   User direction: HoA must be the column that "stands out"
   inside the dark frame, with the visible borders. Other
   Marketing Agencies should sit in a slightly lighter gray
   panel so it reads as the de-emphasised side. The wrap
   border from Wave 2.3 is dropped in favour of column-level
   framing on HoA only.
============================================================ */
.sets-apart__matrix-wrap { border: 0 !important; }

/* Other Marketing Agencies column — gray panel */
.sets-apart__h:not(.sets-apart__h--cat):not(.sets-apart__h--hoa),
.sets-apart__cell:not(.sets-apart__cell--hoa) {
  background: rgba(255,255,255,0.05) !important;
}

/* HoA column — keep solid ink with a clear white frame */
.sets-apart__h--hoa,
.sets-apart__cell--hoa {
  background: var(--color-ink) !important;
  border-left: 1px solid rgba(255,255,255,0.55) !important;
  border-right: 1px solid rgba(255,255,255,0.55) !important;
}
/* Top + bottom of the HoA column — only on first/last rows */
.sets-apart__h--hoa {
  border-top: 1px solid rgba(255,255,255,0.55) !important;
}
.sets-apart__row--last .sets-apart__cell--hoa {
  border-bottom: 1px solid rgba(255,255,255,0.55) !important;
}

/* ============================================================
   Wave 9A — Universal hero height cap (4:5 not 9:16 on mobile)
   The hero on every page sat at 100vh, dominating the screen.
   User wants the hero visible but not taking the whole
   viewport — closer to a 4:5 aspect than 9:16. Cap height
   on mobile/tablet so the next section already begins to
   reveal as the visitor lands.
============================================================ */
@media (max-width: 1024px) {
  .hero,
  .about-hero,
  .ct-hero,
  .approach__hero,
  .approach-hero,
  .case-studies__hero,
  .projects__hero {
    min-height: 0 !important;
    height: auto !important;
    max-height: 78vh !important;
  }
  .hero__panel,
  .hero__grid {
    min-height: 0 !important;
  }
}
@media (max-width: 600px) {
  .hero,
  .about-hero,
  .ct-hero,
  .approach__hero,
  .approach-hero,
  .case-studies__hero,
  .projects__hero {
    max-height: 70vh !important;
  }
}

/* ============================================================
   Wave 9A — Page-edge / horizontal-overflow guard
   Force html, body and direct children to fill the full
   viewport width with no horizontal scroll, killing the
   "white frames left & right of every page" report. Use
   `clip` instead of `hidden` so that body keeps its default
   overflow-y handling — `overflow-x: hidden` was creating a
   second scrolling container that broke `position: sticky`
   on the projects hero (day/night rail). `clip` doesn't
   create a scroll container, so sticky stays anchored to the
   actual viewport.
============================================================ */
html, body {
  width: 100%;
  overflow-x: clip !important;
}
body > .page-frame { width: 100%; }
.ps__container,
.va__container { max-width: 100%; }

/* ============================================================
   Wave 9B — Project gallery edge padding
   The gallery sits inside .ps__container which already pads
   the section. Make sure the 2-col mobile grid does not push
   right up to the page edge by holding the container's
   horizontal padding even at 600px and below.
============================================================ */
@media (max-width: 600px) {
  .ps__container,
  .ps__container--wide {
    padding-left: 16px !important;
    padding-right: 16px !important;
  }
  .ps__gallery {
    --gallery-gap: 6px !important;
  }
  /* Drop the very last gallery image on mobile if the row
     count is odd so we never end with a single floating cell.
     2-col grid makes any odd count obvious. */
  .ps__gallery > .ps__gallery-item:nth-last-child(1):nth-child(odd) {
    display: none;
  }
}

/* ============================================================
   Wave 9C — Approach process on mobile: remove "scroll to
   explore", convert each step to a <details>/<summary> toggle.
   Body of each step collapses by default; tap the kicker row
   to expand. Saves user from a long scroll through 7 steps.
============================================================ */
@media (max-width: 1024px) {
  .av2-step__deliv-cue,
  .av2-rail__hint,
  [data-av2-scroll-hint] {
    display: none !important;
  }
  /* Make every step a tappable header that toggles the body
     visibility. Pure CSS via :checked on a hidden checkbox is
     not feasible here; we instead default the body collapsed
     and reveal on .av2-step:focus-within. JS would be cleaner
     but this stays declarative. */
  .av2-step {
    padding-block: 22px;
  }
  .av2-step__kicker {
    cursor: pointer;
    user-select: none;
    position: relative;
    padding-right: 32px;
    margin-bottom: 0;
  }
  .av2-step__kicker::after {
    content: "+";
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    font-size: 1.25rem;
    color: rgba(255,255,255,0.55);
    transition: transform 220ms var(--motion-ease);
  }
  .av2-step.is-open .av2-step__kicker::after,
  .av2-step:hover .av2-step__kicker::after {
    transform: translateY(-50%) rotate(45deg);
  }
  .av2-step__title,
  .av2-step__body,
  .av2-step__deliv {
    max-height: 0;
    overflow: hidden;
    margin-top: 0;
    margin-bottom: 0;
    transition: max-height 360ms var(--motion-ease),
                margin 360ms var(--motion-ease);
  }
  .av2-step.is-open .av2-step__title,
  .av2-step.is-open .av2-step__body,
  .av2-step.is-open .av2-step__deliv {
    max-height: 600px;
    margin-top: 14px;
  }
  /* First step opens by default so the user sees a working
     example without tapping. */
  .av2-step[data-av2-step="1"] {
    /* JS in main.js will add .is-open to step 1 + handle taps */
  }
  .av2-rail .container,
  .av2-rail .av2-stage {
    padding-inline: clamp(20px, 5vw, 40px);
  }
}

/* ============================================================
   Wave 9D — Home: "View case studies" button gets a frame
   The link below the case studies grid was unstyled, no
   surround. Apply the standard quiet button frame so it
   reads as a real CTA.
============================================================ */
.section.case-studies a[href*="case-studies"]:not(.btn-ct):not(.cs-card):not(.work-card) {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: clamp(20px, 3vw, 32px);
  padding: 12px 22px;
  border: 1px solid currentColor;
  font-family: var(--font-body);
  font-size: 0.6875rem;
  font-weight: var(--fw-light);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background 240ms var(--motion-ease),
              color 240ms var(--motion-ease);
}
.section.case-studies a[href*="case-studies"]:not(.btn-ct):not(.cs-card):not(.work-card):hover {
  background: var(--color-ink);
  color: #fff;
}

/* ============================================================
   Wave 9D — Home: founders ABOVE the quote (mobile/tablet only)
   On desktop the layout stays as the original pre-Wave-2
   rotated stack on the right column. Below 1024px, we move
   the .about__media block to render BEFORE the quote and
   render side-by-side small.
============================================================ */
@media (min-width: 1025px) {
  /* Restore the original rotated overlapping cards on desktop.
     The Wave 2.2 grid override still applies; bring it back.
     Also reset max-width and margin-left from Wave 2.2 so the
     .about__media block fills its grid column instead of being
     pushed to the right edge by margin-left:auto. */
  .about__media {
    display: block !important;
    grid-template-columns: none !important;
    perspective: 1400px !important;
    min-height: clamp(440px, 52vw, 600px) !important;
    align-self: stretch !important;
    max-width: none !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    width: auto !important;
    position: relative !important;
  }
  .about__card,
  .about__card--a,
  .about__card--b {
    position: absolute !important;
    width: auto !important;
    height: 56% !important;
    aspect-ratio: 3 / 4 !important;
    box-shadow:
      0 30px 60px -20px rgba(0,0,0,0.55),
      0 8px 24px -12px rgba(0,0,0,0.4) !important;
  }
  .about__card--a {
    top: 0 !important;
    left: 2% !important;
    right: auto !important;
    bottom: auto !important;
    transform: rotate(-3deg) translateY(0) !important;
    z-index: 1 !important;
  }
  .about__card--b {
    bottom: 0 !important;
    right: 2% !important;
    top: auto !important;
    left: auto !important;
    transform: rotate(2deg) translateY(0) !important;
    z-index: 2 !important;
  }
}
@media (max-width: 1024px) {
  /* Mobile/tablet render order:
     eyebrow -> h2 -> lead -> values -> Read-the-approach btn
     -> FOUNDER PHOTOS (side-by-side small) -> founders quote
     .about__content is flattened with display:contents so all
     its children become direct flex children of .about__grid
     and we can reorder them together with .about__media. */
  .about__grid {
    display: flex !important;
    flex-direction: column;
    gap: 18px;
  }
  .about__content { display: contents !important; }

  .about__content > .eyebrow,
  .about__content .eyebrow.eyebrow--dot { order: 1; }
  .about__heading                       { order: 2; }
  .about__lead                          { order: 3; }
  .about__content .values               { order: 4; }
  .about__actions                       { order: 5; }
  .about__media                         { order: 6; }
  .founders-box                         { order: 7; margin-top: 8px; }
}

/* ============================================================
   Wave 9D — Home: case studies arrows to the corners
   The carousel uses .cs-arrow.cs-arrow--side classes inside
   .case-studies__carousel. Move the side arrows from the
   middle to the bottom corners so they stop hugging the
   image and read as next/prev affordances.
============================================================ */
@media (max-width: 1024px) {
  .case-studies__carousel {
    position: relative !important;
    padding-bottom: 56px;
  }
  .cs-arrow.cs-arrow--side {
    position: absolute !important;
    top: auto !important;
    bottom: 0 !important;
    transform: none !important;
    width: 44px !important;
    height: 44px !important;
    z-index: 4 !important;
  }
  .cs-arrow.cs-arrow--left,
  .cs-arrow.cs-arrow--side.cs-arrow--left {
    left: 16px !important;
    right: auto !important;
  }
  .cs-arrow.cs-arrow--right,
  .cs-arrow.cs-arrow--side.cs-arrow--right {
    right: 16px !important;
    left: auto !important;
  }
}

/* ============================================================
   Wave 9D — sets-apart body copy compact below the matrix
============================================================ */
@media (max-width: 768px) {
  .sets-apart__kicker { font-size: 0.875rem !important; }
  .sets-apart__heading { font-size: clamp(1.5rem, 6vw, 2rem) !important; }
}

/* ============================================================
   Wave 9D — Footer: tighter spacing, brand mark closer to
   the line above it.
============================================================ */
.altfooter__brand {
  margin-top: clamp(32px, 4vw, 56px) !important;
  font-size: clamp(2.5rem, 14vw, 9rem) !important;
}
.altfooter__bottom { padding-top: clamp(20px, 3vw, 32px) !important; }

/* ============================================================
   Wave 9G — Estate Prive case study: logo smaller, 4 colors
   2x2 stack. Estate Prive ships its own .ep__/.va__ inline
   CSS so we override here.
============================================================ */
@media (max-width: 1024px) {
  .ep__logo,
  .ep-brand__logo,
  .va__brand-logo {
    max-width: 240px !important;
  }
  .ep__palette,
  .ep-brand__palette,
  .va__palette,
  .va__color-palette {
    grid-template-columns: 1fr 1fr !important;
    gap: 12px !important;
  }
  .ep__cta-row,
  .ep__inventory-cta,
  .va__inventory-cta {
    text-align: center !important;
    justify-content: center !important;
  }
}

/* ============================================================
   Wave 9H — Project pages: "Project · Region · Name" kicker
   forced to a single line on mobile. If it overflows, hide
   the middle region tag instead of wrapping to two lines.
============================================================ */
@media (max-width: 600px) {
  .pj-hero__kicker,
  .ps__hero-kicker,
  .ps__hero__kicker {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 0.625rem !important;
    letter-spacing: 0.16em !important;
  }
}

/* ============================================================
   Wave 10 — Universal hero IMAGE rendering integrity
   User reports hero images "compressed, stretched, blurry"
   and "next section text falling on the hero text". Force
   safe defaults on every hero variant so the underlying
   image cover-fills its slot without distortion and there is
   guaranteed clearance between the hero block and what
   follows.
============================================================ */
.hero__bg img,
.hero__bg video,
.about-hero__bg,
.about-hero__bg img,
.about-hero__bg video,
.cs-hero__bg img,
.cs-hero__bg video,
.va__hero-bg img,
.va__hero-bg video,
.ck__hero-bg img,
.ep__hero-bg img,
.pi__hero-bg img,
.ps__hero-bg img,
.pj-hero__bg img,
.ct-hero__bg img,
.ej-hero__bg img,
.ak-hero__bg img,
.approach-hero__bg img,
.case-studies__hero-bg img,
.projects__hero-bg img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  object-position: center !important;
  image-rendering: auto !important;
  filter: none !important;
}
@media (max-width: 1024px) {
  /* Guaranteed bottom clearance so the next section never
     overlaps the hero CTAs. */
  .hero,
  .about-hero,
  .cs-hero,
  .va__hero,
  .ck__hero,
  .ep__hero,
  .pi__hero,
  .ps__hero,
  .pj-hero,
  .ct-hero,
  .ej-hero,
  .ak-hero,
  .approach__hero,
  .approach-hero,
  .case-studies__hero,
  .projects__hero {
    padding-bottom: clamp(24px, 6vw, 48px) !important;
  }
  .hero + section,
  .hero + main,
  .about-hero + section,
  .cs-hero + section,
  .pj-hero + section,
  .ct-hero + section,
  .approach-hero + section {
    margin-top: 0 !important;
  }
}

/* ============================================================
   Wave 10 — Footer brand wordmark sits lower, more breathing
   room above the bottom rule.
============================================================ */
.altfooter__top {
  padding-bottom: clamp(24px, 4vw, 48px) !important;
}
.altfooter__brand {
  margin-top: clamp(48px, 7vw, 96px) !important;
  margin-bottom: clamp(20px, 3vw, 32px) !important;
}

/* ============================================================
   Wave 10 — About page: extra breathing room between the
   reviews block and the footer.
============================================================ */
.about-page-reviews + .altfooter,
.about-reviews + .altfooter,
.section.reviews + .altfooter,
.section.about-reviews + .altfooter {
  margin-top: clamp(40px, 6vw, 96px);
}

/* ============================================================
   Wave 10 — Approach: defensive overrides
   Make absolutely sure the desktop sticky storytelling chrome
   (right-side big "01" indicator, scroll-to-explore hint) is
   gone on mobile/tablet, and the av2-step content collapses
   correctly into the accordion. !important everywhere because
   the case study has very specific inline rules from earlier
   waves.
============================================================ */
@media (max-width: 1024px) {
  /* Kill every shape of the right-side ring + count indicator */
  .av2-step-indicator,
  .av2-step-indicator__num,
  .av2-step-indicator__count,
  .av2-step-indicator__track,
  .av2-step-indicator__fill {
    display: none !important;
    visibility: hidden !important;
  }
  /* Kill scroll-to-explore hint in every variant */
  [data-av2-scroll-hint],
  .av2-rail__hint,
  .av2-rail__scroll,
  .av2-stage__hint,
  .av2-stage__scroll-hint,
  .av2-rail [class*="scroll"] {
    display: none !important;
  }
  /* Pin the av2-stage's own header text ("Seven steps. One
     standard.") to the top of the section instead of having
     it overlap the first step's title. */
  .av2-stage > h2,
  .av2-stage > .av2-stage__title,
  .av2-rail > .av2-rail__head {
    position: relative !important;
    margin-bottom: 18px !important;
  }
}

/* ============================================================
   Wave 11 — Home approach section: horizontal padding fix
   ------------------------------------------------------------
   Bug: at ≤900px the hscroll collapses into a vertical list
   (.approach-pin__track flex-direction:column) and each
   .hstep gets `padding: clamp(24px,4vw,32px) 0 0` — vertical
   only, ZERO horizontal padding. So phase titles ("Discovery
   & Audit", "Strategy", etc.) hug the screen edge.
   .approach-pin__head already has 20px horizontal padding via
   `.container`, so this fix only adds horizontal breathing
   room to the rail/track/cards stack. Also adds card-internal
   padding and a comfortable gap between cards.
============================================================ */
@media (max-width: 900px) {
  .approach .approach-pin__rail,
  .approach .approach-pin__track {
    padding-inline: clamp(20px, 5vw, 40px) !important;
    box-sizing: border-box !important;
  }
  .approach .approach-pin__track {
    gap: clamp(20px, 4vw, 32px) !important;
  }
  .approach .hstep {
    padding: clamp(20px, 4vw, 28px) clamp(16px, 4vw, 24px) 0 !important;
    box-sizing: border-box !important;
  }
  .approach .hstep:first-child {
    padding-top: clamp(8px, 2vw, 16px) !important;
  }
  .approach .hstep__content {
    max-width: 100% !important;
  }
  /* Title block (head) — make sure the eyebrow, headline and
     scroll cue line up with the cards above the same gutter.
     .container already gives 20px on phones; bump on tablet. */
  .approach .approach-pin__head.container {
    padding-inline: clamp(20px, 5vw, 40px) !important;
  }
}
@media (min-width: 601px) and (max-width: 900px) {
  .approach .approach-pin__rail,
  .approach .approach-pin__track,
  .approach .approach-pin__head.container {
    padding-inline: clamp(28px, 5vw, 40px) !important;
  }
}

/* ============================================================
   Wave 11 — Universal hero pass (mobile + tablet)
   ------------------------------------------------------------
   Bugs found across the 7 hero variants in use:
     .hero          (home)           — ok-ish, ~568px
     .about-hero    (about/approach/contact) — outer 568px BUT
                       .about-hero__panel is 812px min-height
                       AND .about-hero__bg uses bg-size 100% 100%
                       which STRETCHES the photo non-uniformly.
     .cs-hero       (case studies)   — locked to 812px (100vh)
     .va__hero      (apollon/estate-prive/ck-realtors/punctum)
                                     — locked to 812px
     .cmp__hero     (rafaella/dusit/ej) — 816px (min-h:812+pad)
     .proj-transform--hero (projects) — 1624px on a 375px vp,
                       4.3× the viewport. Ridiculous.
   Universal fixes:
     - Cap height to ~70vh on phones, ~72vh on tablets.
       (The home .hero already obeys this so we don't shrink
       it further.)
     - Force any background <img>/<picture> inside a hero to
       object-fit:cover, object-position:center, so cropping
       always preserves aspect ratio.
     - Force .about-hero__bg from `background-size: 100% 100%`
       (stretch) to `cover` (crop, preserve ratio).
     - Strip any `filter: blur(...)` and `transform: scale(>1)`
       on bg layers at mobile breakpoints (intro animations
       on small screens kept the page blurry).
     - Add 32px bottom padding inside the hero so the next
     section doesn't crash into CTAs/title.
     - Stack the title/kicker/rule/CTAs with a 14-18px gap.
============================================================ */
@media (max-width: 900px) {
  /* Height cap — applies to every hero variant we ship.
     NOTE: .proj-transform--hero is a scroll-pinned section
     (sticky frame inside a 200vh rail), not a one-screen
     hero — its outer height is INTENTIONAL. We only cap the
     inner sticky frame and the visible image instead. */
  .hero,
  .about-hero,
  .about-hero__panel,
  .cs-hero,
  .cs-hero__background,
  .va__hero,
  .va__hero-bg,
  .va__hero-scrim,
  .cmp__hero,
  .cmp__hero-wrap,
  .cmp__hero-bg {
    min-height: 0 !important;
    max-height: none !important;
  }
  .hero,
  .about-hero,
  .cs-hero,
  .va__hero,
  .cmp__hero {
    height: 72vh !important;
    min-height: 540px !important;
    max-height: 680px !important;
    padding-bottom: clamp(48px, 8vw, 72px) !important;
  }
  /* Projects: keep the scroll-pin rail intact, just cap the
     visible sticky frame so it doesn't try to be 100vh +
     a 90px nav. */
  .proj-transform--hero .proj-transform__sticky {
    height: 72vh !important;
    min-height: 540px !important;
    max-height: 680px !important;
  }
  /* about-hero needs extra room because its absolute footer
     strip ("Athens, Greece" + "Time 20:47") sits at the bottom
     and would otherwise overlap the lede text. */
  .about-hero {
    height: 80vh !important;
    min-height: 620px !important;
    max-height: 760px !important;
  }
  /* va__hero (apollon / estate-prive / ck-realtors / punctum)
     and cmp__hero (rafaella / dusit / ej) carry kicker + long
     lede + 4-6 stat tiles. They need a tall card on phones so
     the last row of stats / lede doesn't get cropped. Let
     height grow with content (auto) but keep a sane min. */
  .va__hero,
  .cmp__hero {
    height: auto !important;
    min-height: 88vh !important;
    max-height: none !important;
  }
  .va__hero-bg,
  .va__hero-scrim,
  .cmp__hero-bg,
  .cmp__hero-wrap {
    height: 100% !important;
    min-height: 100% !important;
  }
  /* Pin the meta strip flush to the bottom (the original
     32-48px clamp made it crash into the lede on phones).
     14px gives enough breathing room without stealing
     panel height from the title block. */
  .about-hero__meta--left,
  .about-hero__meta--right {
    bottom: 14px !important;
  }
  .about-hero__meta--top-left,
  .about-hero__meta--top-right {
    top: 14px !important;
  }
  /* Pages whose hero has CTAs (contact) — hide the decorative
     meta chips entirely on mobile so they don't crash into
     the buttons. They are aria-hidden anyway. */
  .contact-page-hero .about-hero__meta--left,
  .contact-page-hero .about-hero__meta--right,
  .about-hero:has(.about-hero__ctas) .about-hero__meta--left,
  .about-hero:has(.about-hero__ctas) .about-hero__meta--right {
    display: none !important;
  }
  /* Inner panels — stretch to the new outer height instead of
     hard-coding 100vh. */
  .about-hero__panel,
  .cs-hero__background,
  .va__hero-bg,
  .va__hero-scrim,
  .cmp__hero-wrap,
  .cmp__hero-bg {
    height: 100% !important;
  }
  /* about-hero__bg: stretch fix (100% 100% -> cover) */
  .about-hero__bg {
    background-size: cover !important;
    background-position: center !important;
    background-repeat: no-repeat !important;
  }
  /* Any <img>/<video>/<picture> that fills a hero BACKGROUND
     must cover. Excluded: .nav__brand img (the wordmark logo),
     which has its own intrinsic ratio and must not be stretched. */
  .hero > video,
  .hero > picture > img,
  .hero > img,
  .about-hero__bg img,
  .about-hero__panel > img,
  .about-hero__video-wrap img,
  .about-hero__video-wrap video,
  .cs-hero__bg-layer,
  .cs-hero__bg-layer img,
  .cs-hero__background img,
  .va__hero-bg img,
  .va__hero-bg video,
  .va__hero > img,
  .cmp__hero-bg img,
  .cmp__hero-bg video,
  .proj-transform__sticky img,
  .proj-transform__sticky video,
  .proj-transform__frame img,
  .proj-transform__frame video {
    object-fit: cover !important;
    object-position: center !important;
    width: 100% !important;
    height: 100% !important;
  }
  /* Wordmark inside hero navs must keep its intrinsic ratio. */
  .hero .nav__brand img,
  .about-hero .nav__brand img,
  .cs-hero .nav__brand img,
  .va__hero .nav__brand img,
  .cmp__hero .nav__brand img,
  .proj-transform--hero .nav__brand img {
    object-fit: contain !important;
    width: auto !important;
    height: 40px !important;
  }
  /* Strip mobile-hostile blur / scale filters on hero bg
     layers so the photo isn't soft / oversized on phones. */
  .hero__video,
  .about-hero__bg,
  .cs-hero__background,
  .cs-hero__bg-layer,
  .va__hero-bg,
  .va__hero-bg img,
  .cmp__hero-bg,
  .cmp__hero-bg img,
  .proj-transform--hero img {
    filter: none !important;
    transform: none !important;
  }
  /* Stack heroes' content with a guaranteed gap so kicker /
     title / rule / CTAs never overlap. */
  .hero__inner > * + *,
  .hero__content > * + *,
  .about-hero__content > * + *,
  .cs-hero__content > * + *,
  .va__hero-content > * + *,
  .va__hero-meta > * + *,
  .cmp__hero-content > * + *,
  .cmp__hero-meta > * + *,
  .proj-transform--hero__content > * + * {
    margin-top: clamp(12px, 2.4vw, 18px) !important;
  }
  /* No padding-top on the hero containers — that produced the
     ink-coloured "black band" above every page reported by
     the user. The .nav inside the hero already reserves its
     own space, and .hero__grid justifies content to flex-end
     so titles sit at the bottom of the visible area. */
  .hero,
  .about-hero,
  .cs-hero,
  .va__hero,
  .cmp__hero {
    padding-top: 0 !important;
  }
  .proj-transform--hero .proj-transform__sticky {
    padding-top: 0 !important;
    padding-bottom: clamp(48px, 8vw, 72px) !important;
    box-sizing: border-box !important;
  }
}

/* Tablet refinements — let heroes breathe a touch more. */
@media (min-width: 601px) and (max-width: 1024px) {
  .hero,
  .about-hero,
  .cs-hero {
    height: 72vh !important;
    min-height: 520px !important;
    max-height: 720px !important;
    padding-top: 0 !important;
    padding-bottom: clamp(36px, 5vw, 48px) !important;
  }
  .va__hero,
  .cmp__hero {
    height: auto !important;
    min-height: 80vh !important;
    max-height: none !important;
    padding-top: 0 !important;
    padding-bottom: clamp(40px, 5vw, 56px) !important;
  }
  .proj-transform--hero .proj-transform__sticky {
    height: 72vh !important;
    min-height: 520px !important;
    max-height: 720px !important;
  }
}


/* ============================================================
   Wave 12 — Case studies arrows on the SIDES (vertically
   centered) of the visible card, not at the bottom corners.
============================================================ */
@media (max-width: 1024px) {
  .case-studies__carousel {
    padding-bottom: 0 !important;
    padding-inline: 56px;
    position: relative;
  }
  .cs-arrow.cs-arrow--side {
    position: absolute !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 40px !important;
    height: 40px !important;
    background: rgba(0,0,0,0.55);
    border-radius: 999px;
    color: #fff;
    z-index: 5 !important;
  }
  .cs-arrow.cs-arrow--left,
  .cs-arrow.cs-arrow--side.cs-arrow--left {
    left: 8px !important;
    right: auto !important;
  }
  .cs-arrow.cs-arrow--right,
  .cs-arrow.cs-arrow--side.cs-arrow--right {
    right: 8px !important;
    left: auto !important;
  }
}

/* ============================================================
   Wave 12 — About: components / numbers as a vertical stack
   on mobile so each card breathes and the viewer scans
   top-down with extra space.
============================================================ */
@media (max-width: 1024px) {
  .about-components__grid {
    display: flex !important;
    flex-direction: column;
    gap: clamp(16px, 3vw, 28px);
  }
  .about-components__grid > .component-box {
    width: 100%;
  }
  .about-stats__grid {
    display: flex !important;
    flex-direction: column;
    gap: clamp(20px, 4vw, 32px);
    padding-block: clamp(20px, 4vw, 32px);
  }
  .about-stats__grid > * {
    width: 100%;
    text-align: left;
  }
}

/* ============================================================
   Wave 13.A — Kill the dark "black frame" the user can scroll
   on top of every page. Wave 11 introduced padding-top on
   hero variants; the agent reverted those above. This is a
   final defensive override at every breakpoint to keep heroes
   flush with the top edge of the page (only the .nav strip
   itself sits above the hero content).
============================================================ */
.hero,
.about-hero,
.cs-hero,
.va__hero,
.cmp__hero,
.ct-hero,
.ej-hero,
.ak-hero,
.pj-hero,
.ps__hero,
.va__hero-shell,
.approach-hero,
.case-studies__hero,
.projects__hero {
  padding-top: 0 !important;
  margin-top: 0 !important;
}

/* ============================================================
   Wave 13.B — "Trusted by" strip: clear visual separation
   from the hero above and the about section below so it
   stops blending into the surrounding ink.
============================================================ */
.trusted {
  box-shadow: none !important;
  border-top: 1px solid rgba(255,255,255,0.10) !important;
  border-bottom: 1px solid rgba(255,255,255,0.10) !important;
  position: relative;
  z-index: 1;
}
.trusted__head {
  color: #fff !important;
}
.trusted__sub,
.trusted__kicker {
  color: rgba(255,255,255,0.85) !important;
}

/* ============================================================
   Wave 13.C — Case studies cards: one card visible, full
   viewport width on mobile/tablet (no peek of next card).
   Arrows already flank the card from Wave 12. Bump card
   width and remove the 86% peek.
============================================================ */
@media (max-width: 1024px) {
  .case-studies__carousel .carousel__track > * {
    flex-basis: 100% !important;
    min-width: 0;
  }
  .cs-card {
    max-width: 100%;
  }
  .case-studies__carousel {
    padding-inline: 48px;
  }
}

/* ============================================================
   Wave 14 — Desktop safety net: protect scroll-driven
   horizontal animations on the approach page (.av2-rail) and
   the home process strip (.approach.approach--hscroll). The
   desktop sticky-stage scroll animation must continue to
   work; the mobile/tablet overrides should not leak.
============================================================ */
@media (min-width: 1025px) {
  /* APPROACH PAGE — av2-rail */
  .av2-rail {
    height: calc(100vh * 7 + 60vh) !important;
    padding-block: 0 !important;
  }
  .av2-stage {
    position: sticky !important;
    top: 0 !important;
    height: 100vh !important;
    overflow: hidden !important;
  }
  .av2-step-indicator { display: flex !important; visibility: visible !important; }
  .av2-copy {
    position: absolute !important;
    inset: 0 auto 0 clamp(20px, 4vw, 64px) !important;
    width: min(640px, 42vw) !important;
    display: grid !important;
    grid-template-columns: 1fr !important;
    grid-template-rows: 1fr !important;
    align-items: center !important;
    pointer-events: none !important;
  }
  .av2-step {
    /* Stay in the grid cell with align-self: center so the
       step's content block is genuinely vertically centred
       inside the 100vh sticky stage. Earlier we used
       position:absolute + inset:0 (broke centering) and then
       grid stacking alone (kicker drifted to top). align-self:
       center on grid item is the reliable form. */
    position: relative !important;
    grid-column: 1 !important;
    grid-row: 1 !important;
    align-self: center !important;
    display: block !important;
    width: 100% !important;
    height: auto !important;
    opacity: 0 !important;
    transform: translateY(12px) !important;
    pointer-events: none !important;
  }
  .av2-step.is-active {
    opacity: 1 !important;
    transform: none !important;
    pointer-events: auto !important;
  }
  /* Restore desktop kicker behaviour (no toggle UI). The
     `padding-right: 0 !important` line that used to live here
     was crowding the last letter ("…REPORTING", "…DIRECTION",
     "…AUDIT") against the right edge of the box. Removed so
     the base 22px right-padding from .av2-step__kicker (line
     ~14321) flows through on desktop. */
  .av2-step__kicker {
    cursor: default !important;
  }
  .av2-step__kicker::after { content: none !important; }
  .av2-step__title,
  .av2-step__body,
  .av2-step__deliv {
    max-height: none !important;
    overflow: visible !important;
    margin: revert !important;
  }

  /* HOME PROCESS — approach hscroll */
  .approach.approach--hscroll .approach-pin__stage {
    position: sticky !important;
    top: 0 !important;
    height: 100vh !important;
    overflow: hidden !important;
  }
  .approach-pin__rail { overflow: hidden !important; }
  .approach-pin__track {
    display: flex !important;
    flex-direction: row !important;
    /* Restore the original 350vw min-width (7 × 50vw) so the
       last step lands flush against the right edge — earlier
       Wave 14 set hstep flex to auto which produced an extra
       black panel after step 7 on desktop. */
    min-width: 350vw !important;
  }
  .hstep {
    /* Pinned to 50vw each per the base CSS — auto width was
       producing a phantom panel on the right. */
    flex: 0 0 50vw !important;
  }
}

/* ============================================================
   Wave 15 — User feedback round
============================================================ */

/* 15.1 Case studies arrows: subtle, no circle background.
   Wave 12 wrapped them in a dark circle; user wants the
   minimal stroke arrow back. */
@media (max-width: 1024px) {
  .cs-arrow.cs-arrow--side {
    background: transparent !important;
    border-radius: 0 !important;
    color: rgba(255,255,255,0.85) !important;
    width: 36px !important;
    height: 36px !important;
  }
  .cs-arrow.cs-arrow--side svg {
    width: 22px;
    height: 22px;
    stroke: currentColor;
    stroke-width: 1.4;
  }
}

/* 15.2 Case study card: more compact (less stretched height).
   Tighten internal padding and fold the meta strip closer to
   the body copy so the card reads as one block, not a tower. */
@media (max-width: 1024px) {
  .cs-card {
    padding: 18px !important;
  }
  .cs-card__body {
    padding-top: 14px !important;
    gap: 10px !important;
  }
  .cs-card__title { font-size: clamp(1.25rem, 4.6vw, 1.6rem) !important; line-height: 1.2 !important; }
  .cs-card__lede  { font-size: 0.875rem !important; line-height: 1.45 !important; }
  .cs-card__metrics {
    margin-top: 12px !important;
    padding-top: 12px !important;
    gap: 8px !important;
  }
  .cs-card__metric-num   { font-size: clamp(1.125rem, 4vw, 1.375rem) !important; }
  .cs-card__metric-label { font-size: 0.625rem !important; letter-spacing: 0.18em !important; }
  .cs-card__bottom { padding-top: 12px !important; }
}

/* 15.3 Home process: hide scroll-to-explore + convert hsteps
   into a click-to-toggle accordion at <=1024px (mirrors the
   approach page pattern). Desktop horizontal scroll is left
   untouched (Wave 14 protects it). */
@media (max-width: 1024px) {
  .approach-pin__scroll-cue,
  .approach-pin__scroll-cue-line,
  .approach-pin__scroll-cue-label {
    display: none !important;
  }
  .approach.approach--hscroll {
    height: auto !important;
  }
  .approach-pin__stage {
    position: relative !important;
    top: auto !important;
    height: auto !important;
    overflow: visible !important;
  }
  .approach-pin__rail { overflow: visible !important; }
  .approach-pin__track {
    display: flex !important;
    flex-direction: column !important;
    transform: none !important;
    gap: 0 !important;
  }
  .hstep {
    flex: 0 0 auto !important;
    width: 100% !important;
    border-bottom: 1px solid rgba(255,255,255,0.10);
    padding: 22px 16px !important;
  }
  .hstep:last-child { border-bottom: 0; }
  .hstep__num { display: none !important; }
  .hstep__phase {
    cursor: pointer;
    user-select: none;
    position: relative;
    padding-right: 32px;
    margin: 0 !important;
  }
  .hstep__phase::after {
    content: "+";
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    font-size: 1.25rem;
    color: rgba(255,255,255,0.55);
    transition: transform 220ms ease;
  }
  .hstep.is-open .hstep__phase::after {
    transform: translateY(-50%) rotate(45deg);
  }
  .hstep__title,
  .hstep__desc,
  .hstep__deliverables,
  .hstep__rule {
    max-height: 0;
    overflow: hidden;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    transition: max-height 360ms ease, margin 360ms ease;
  }
  .hstep.is-open .hstep__title,
  .hstep.is-open .hstep__desc,
  .hstep.is-open .hstep__deliverables,
  .hstep.is-open .hstep__rule {
    max-height: 800px;
    margin-top: 12px !important;
  }
}

/* 15.4 Case studies index hero: full-bleed vertical image
   on mobile, no top blank space, bigger title that sits
   over the bottom third. */
@media (max-width: 1024px) {
  .case-studies__hero,
  .cs-hero {
    height: 88vh !important;
    min-height: 600px !important;
    max-height: none !important;
  }
  .case-studies__hero .cs-hero__bg img,
  .cs-hero .cs-hero__bg img,
  .cs-hero__bg img {
    object-position: center !important;
  }
}

/* 15.5 Villa Apollon hero: bigger title, smaller numbers. */
@media (max-width: 1024px) {
  .va__hero-title { font-size: clamp(1.75rem, 7vw, 2.5rem) !important; line-height: 1.1 !important; }
  .va__hero-meta-value { font-size: clamp(1rem, 4vw, 1.25rem) !important; }
  .va__hero-meta-label { font-size: 0.625rem !important; letter-spacing: 0.16em !important; }
  .va__hero-meta { gap: 12px 16px !important; }
}

/* 15.6 Villa Apollon two reels: vertical 1-col stack on mobile. */
@media (max-width: 768px) {
  .va__videos--reels,
  [class*="va__videos--reels"] {
    grid-template-columns: 1fr !important;
    max-width: 360px !important;
    margin-inline: auto !important;
  }
}

/* 15.7 Contact + every page: kill the blank space at the very
   top by ensuring no margin-top leaks into the main wrapper
   above the hero. */
.page-frame > main > section:first-child,
.page-frame > section:first-child,
.page-frame > main:first-child > *:first-child {
  margin-top: 0 !important;
  padding-top: 0 !important;
}

/* ============================================================
   ============================================================
   WAVE 16 — Exhaustive mobile/tablet audit + fixes
   ============================================================
   Date: 2026-05-03
   Scope: ≤1024px viewports (mobile + tablet + tablet-pro
          borderline). Desktop ≥1025px untouched.

   Categories addressed:
     16.A  Cookie banner — full tablet (601-1024px) compaction
     16.B  Hero kicker / brand-overlap on case-study & project
           pages with long titles (CK Realtors, Punctum, etc.)
     16.C  Hamburger contrast — keep visible icon over any bg
     16.D  Hero CTA pair — never hide a CTA at tablet widths
     16.E  Touch targets — promote sub-44px tappables
     16.F  Privacy & Terms — fixed top nav (brand + hamburger)
           injected purely via floating helper (also Wave 16J)
     16.G  Universal hero min-height tightening on mobile so
           short-content heroes (about, faq, contact, journal)
           don't reserve 600+px of black for a 1-line title
     16.H  Trusted-by strip — keep marquee from poking under
           the cookie banner; clear z-stack
     16.I  Tablet pro 1024px — squeeze nav padding so brand
           wordmark + hamburger don't visually clash
     16.J  Villa Apollon viewport buttons (.va__vp__btn) —
           bump from 22×22 to 44×44 touch target
     16.K  Footer columns — sanity guard for 2-col layout
           (already correct; this just hardens specificity)
     16.L  Case-card 'READ MORE' / case-card__readmore — bump
           hit area to 44px while keeping label compact
============================================================ */

/* ----- 16.A  Cookie banner: tablet compaction (601-1024px) ----- */
/* Mirror the ≤600px horizontal-strip pattern: keep banner short,
   action buttons inline, never cover the hero CTAs. We DON'T
   simply hide it (legal requirement) but we squeeze it to ~80px
   tall so it sits as a thin status strip at the bottom. */
@media (min-width: 601px) and (max-width: 1024px) {
  .hoa-cookie {
    right: 0 !important; left: 0 !important; bottom: 0 !important;
    max-width: 100vw !important;
    width: 100% !important;
    padding: 14px 20px !important;
    border-left: 0 !important; border-right: 0 !important;
    border-bottom: 0 !important;
    border-radius: 0 !important;
    display: flex !important;
    flex-direction: row !important;
    align-items: center !important;
    gap: 16px !important;
  }
  .hoa-cookie__title {
    font-size: 0.8125rem !important;
    margin: 0 !important;
    flex: 0 0 auto !important;
  }
  .hoa-cookie__body {
    font-size: 0.75rem !important;
    line-height: 1.4 !important;
    margin: 0 !important;
    flex: 1 1 auto !important;
    color: rgba(255,255,255,0.78);
  }
  .hoa-cookie__row {
    flex: 0 0 auto !important;
    margin: 0 !important;
    gap: 10px !important;
  }
  .hoa-cookie__btn {
    min-height: 40px !important;
    padding: 10px 16px !important;
    font-size: 0.6875rem !important;
    letter-spacing: 0.14em !important;
    white-space: nowrap !important;
  }
}

/* ----- 16.B  Case-study & project hero — keep kicker BELOW the
   brand wordmark. The .va__hero / .cs-hero use absolute centred
   layout that places the kicker very near the top, where it
   collides with .nav__brand on long-title pages. Push the hero
   CONTENT down by ~70px on mobile/tablet so the kicker eyebrow
   never overlaps the wordmark. ----- */
@media (max-width: 1024px) {
  .va__hero,
  .cs-hero,
  .pj-hero,
  .ej-hero {
    padding-top: clamp(76px, 12vh, 100px) !important;
  }
  .va__hero-kicker,
  .cs-hero__kicker,
  .pj-hero__kicker,
  .ej-hero__kicker {
    margin-top: 0 !important;
    padding-top: 0 !important;
  }
  /* The brand wordmark rises a few pixels on case-study pages
     because of the dark hero overlay — give it the same top
     padding as the regular nav so it doesn't kiss the kicker. */
  .va__hero .nav__brand,
  .cs-hero .nav__brand,
  .pj-hero .nav__brand {
    padding-top: 4px !important;
  }
}

/* ----- 16.C  Hamburger — guarantee visible icon contrast over
   any backdrop. Lines were 1px white on near-black bg which
   is borderline. Bump line thickness + add a subtle 1px hairline
   stroke around the box so it reads cleanly on any image hero. */
@media (max-width: 1024px) {
  .hamburger {
    background: rgba(10,10,10,0.86) !important;
    border: 1px solid rgba(255,255,255,0.14) !important;
    backdrop-filter: blur(8px) saturate(1.1);
    -webkit-backdrop-filter: blur(8px) saturate(1.1);
  }
  .hamburger__line {
    height: 1.5px !important;
    background: #fff !important;
  }
}

/* ----- 16.D  Hero CTA pair — never let one of two CTAs disappear
   off the row. `flex-wrap: wrap` already handles overflow but on
   borderline widths the SECOND CTA can wrap below and sit BEHIND
   a meta strip. Force min-width and explicit z-index for the
   action row. ----- */
@media (min-width: 768px) and (max-width: 1024px) {
  .about-hero__ctas,
  .hero__ctas,
  .cs-hero__ctas,
  .va__hero-ctas,
  .ct-hero__ctas {
    position: relative !important;
    z-index: 5 !important;
    flex-wrap: wrap !important;
    row-gap: 12px !important;
  }
  .about-hero__ctas > *,
  .hero__ctas > *,
  .cs-hero__ctas > *,
  .va__hero-ctas > *,
  .ct-hero__ctas > * {
    flex: 0 1 auto !important;
  }
}

/* ----- 16.E  Touch targets — bump common <44px tappables ----- */
@media (max-width: 1024px) {
  /* Villa-page video player chrome buttons */
  .va__vp__btn {
    width: 44px !important;
    height: 44px !important;
    min-width: 44px !important;
    min-height: 44px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  .va__vp__btn svg,
  .va__vp__btn img {
    width: 22px;
    height: 22px;
  }
  /* Footer social inline links */
  .altfooter__socials a,
  .altfooter__nav a {
    min-height: 36px;
    display: inline-flex;
    align-items: center;
  }
  /* Case-card "READ MORE" affordance */
  .case-card__readmore {
    min-height: 44px !important;
    display: inline-flex !important;
    align-items: center !important;
    padding-block: 10px !important;
  }
  /* Slot / arrow controls on case studies index */
  .cs-arrow,
  .cs-arrow.cs-arrow--side {
    min-width: 44px !important;
    min-height: 44px !important;
  }
  /* Hamburger already 44×44 — guard it */
  .hamburger {
    min-width: 44px !important;
    min-height: 44px !important;
  }
}

/* ----- 16.F  Legal pages (Privacy, Terms): floating brand link +
   hamburger that returns to home. The legal pages bypass the
   site nav by design. We give them a small fixed brand wordmark
   at top-left and a hamburger at top-right that goes to "/". The
   real menu markup is added via main.js (16J). ----- */
@media (max-width: 1024px) {
  body.legal-page-body .legal-floating-nav,
  .legal-page-body .legal-floating-nav {
    position: fixed;
    top: 0; left: 0; right: 0;
    height: 64px;
    z-index: 9999;
    pointer-events: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 16px;
  }
  .legal-floating-nav__brand,
  .legal-floating-nav__menu {
    pointer-events: auto;
  }
  .legal-floating-nav__brand {
    font-family: var(--font-display, serif);
    font-weight: 300;
    font-size: 1rem;
    letter-spacing: 0.01em;
    color: var(--color-ink, #0a0a0a);
    text-decoration: none;
    line-height: 1;
    padding: 8px 4px;
  }
  .legal-floating-nav__brand em {
    font-style: italic;
    font-weight: 400;
  }
  .legal-floating-nav__menu {
    width: 44px;
    height: 44px;
    background: rgba(10,10,10,0.92);
    border: 1px solid rgba(255,255,255,0.14);
    color: #fff;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 0;
  }
  .legal-floating-nav__menu svg {
    width: 22px;
    height: 22px;
    stroke: #fff;
    stroke-width: 1.5;
    fill: none;
  }
}
@media (min-width: 1025px) {
  .legal-floating-nav { display: none !important; }
}
/* Legal page top: reserve space for the floating nav */
@media (max-width: 1024px) {
  body.legal-page-body .legal-page,
  .legal-page-body .legal-page {
    padding-top: clamp(96px, 14vw, 128px) !important;
  }
}

/* ----- 16.G  Hero min-height tightening on small viewports.
   The .about-hero centred heroes use a 100vh inner panel that
   anchors the nav at the top and the title in the middle. We
   leave the panel alone (it's already perfect for tall content)
   and only ensure the OUTER hero element is no taller than the
   panel. Trim trailing padding on heroes that are not panel-
   based (.ct-hero, .ej-hero, .pj-hero rare cases). ----- */
@media (max-width: 1024px) {
  .ct-hero:not(:has(.about-hero__panel)),
  .ej-hero:not(:has(.about-hero__panel)),
  .pj-hero:not(:has(.about-hero__panel)) {
    min-height: 0 !important;
  }
}

/* ----- 16.H  Trusted-by row: keep above the cookie banner so the
   marquee doesn't bleed under the strip's bottom edge. Apply a
   safe padding-bottom equal to the cookie banner height when the
   banner is open. ----- */
@media (max-width: 1024px) {
  body:has(.hoa-cookie.is-visible) .trusted-by,
  body:has(.hoa-cookie.is-visible) .trusted,
  body:has(.hoa-cookie.is-visible) .trusted-strip {
    padding-bottom: 80px;
  }
  .trusted__track,
  .trusted-by__track {
    will-change: transform;
  }
}

/* ----- 16.I  Tablet-pro 1024px nav padding — keep brand and
   hamburger from feeling cramped at 1024 (the borderline). The
   brand wordmark is 226px wide × 48px tall on this width which
   is large; reserve more vertical space at top of the hero. ----- */
@media (min-width: 769px) and (max-width: 1024px) {
  .nav {
    padding-top: 16px !important;
    padding-left: 20px !important;
    padding-right: 20px !important;
  }
  .nav__brand img {
    height: 36px !important;
  }
  .hamburger {
    top: 14px !important;
    right: 14px !important;
  }
}

/* ----- 16.K  Footer 2-col guard — Wave 1A.2 already does this
   universally; we just bump specificity so any inline
   page-specific override can't undo it. Also gives mobile a
   sensible row-gap so Useful + Connect don't visually merge. ----- */
@media (max-width: 1024px) {
  footer.altfooter .altfooter__nav {
    grid-template-columns: 1fr 1fr !important;
    grid-template-rows: auto auto !important;
    row-gap: clamp(28px, 4vw, 44px) !important;
  }
  footer.altfooter .altfooter__col:nth-child(1) {
    grid-column: 1 !important;
    grid-row: 1 / span 2 !important;
  }
  footer.altfooter .altfooter__col:nth-child(2) {
    grid-column: 2 !important;
    grid-row: 1 !important;
  }
  footer.altfooter .altfooter__col:nth-child(3) {
    grid-column: 2 !important;
    grid-row: 2 !important;
  }
}

/* ----- 16.L  Home hero on mobile — let the "House of Advanced is
   a full-service…" overlay paragraph sit cleanly inside the hero
   without forcing a tall stacked block. Cap the hero at a
   reasonable height and ensure the about-text overlay doesn't
   eat the picture. ----- */
@media (max-width: 1024px) {
  .hero {
    min-height: clamp(560px, 78vh, 720px) !important;
  }
  .hero__title {
    font-size: clamp(1.75rem, 7vw, 2.5rem) !important;
    line-height: 1.08 !important;
  }
  .hero__overlay {
    padding-top: clamp(8px, 2vw, 12px) !important;
  }
}

/* ----- 16.M  Universal page-edge horizontal padding floor on
   tablet — some sections (about-stats, set-apart matrix) had
   0 padding causing edge-to-edge text on 768px. ----- */
@media (min-width: 481px) and (max-width: 1024px) {
  .page-frame > main > section,
  .page-frame > section,
  .page-frame > main > div > section {
    padding-left: max(20px, env(safe-area-inset-left)) !important;
    padding-right: max(20px, env(safe-area-inset-right)) !important;
  }
  /* Re-allow full-bleed for hero sections that use a background
     image (they should still touch the edges). */
  .page-frame .hero,
  .page-frame .va__hero,
  .page-frame .cs-hero,
  .page-frame .about-hero,
  .page-frame .ej-hero,
  .page-frame .pj-hero,
  .page-frame .ct-hero,
  .page-frame .approach.approach--hscroll,
  .page-frame .trusted,
  .page-frame .trusted-by {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }
}

/* ----- 16.N  Side menu tap targets — its links should be 48px
   tall for thumb-comfort. ----- */
@media (max-width: 1024px) {
  .side-menu__nav a,
  .side-menu__nav li a {
    min-height: 48px;
    display: flex;
    align-items: center;
  }
}

/* ----- 16.O  About page founders side-by-side small block —
   already exists from Wave 9D; this rule just hardens it so
   the 2-col founders cards don't tower on tablet. ----- */
@media (min-width: 481px) and (max-width: 1024px) {
  .home-about__founders,
  .about__founders,
  [class*="founders"][class*="--inline"] {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: 16px !important;
    max-width: 480px !important;
    margin-inline: auto !important;
  }
  .home-about__founder img,
  .about__founder img {
    width: 100% !important;
    height: auto !important;
    aspect-ratio: 4 / 5 !important;
    object-fit: cover !important;
  }
}

/* ----- 16.P  Final image-integrity guard for hero <img> — make
   sure no inline width="" attribute or broken aspect-ratio
   stretches the hero photo. Only target hero BACKGROUND image
   wrappers, never the brand wordmark <img> sitting inside the
   nav (which lives inside the hero element). ----- */
@media (max-width: 1024px) {
  .hero__bg img,
  .hero__video-wrap img,
  .va__hero-bg img,
  .cs-hero__bg img,
  .cs-hero__bg-layer img,
  .about-hero__bg img,
  .about-hero__bg-img,
  .ej-hero__bg img,
  .ct-hero__bg img,
  .pj-hero__bg img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    object-position: center !important;
    max-width: none !important;
  }
  /* Brand wordmark inside any hero must keep its intrinsic
     ratio and a sensible cap (Wave 11 already does this; we
     re-state at higher specificity to defeat the broad image
     guards above). */
  .hero .nav__brand img,
  .about-hero .nav__brand img,
  .cs-hero .nav__brand img,
  .va__hero .nav__brand img,
  .ej-hero .nav__brand img,
  .ct-hero .nav__brand img,
  .pj-hero .nav__brand img {
    width: auto !important;
    height: 40px !important;
    max-width: none !important;
    object-fit: contain !important;
  }
}
@media (min-width: 769px) and (max-width: 1024px) {
  .hero .nav__brand img,
  .about-hero .nav__brand img,
  .cs-hero .nav__brand img,
  .va__hero .nav__brand img,
  .ej-hero .nav__brand img,
  .ct-hero .nav__brand img,
  .pj-hero .nav__brand img {
    height: 36px !important;
  }
}

/* End Wave 16 ============================================== */

/* ----- 16.Q  Brand wordmark legibility on bright hero photos —
   add a subtle drop-shadow filter so the white SVG mark stays
   readable when the hero image is very bright (Index tablet,
   Projects, Villa Apollon at certain frames). Filter is gentle
   enough to be invisible on dark heroes. ----- */
@media (max-width: 1024px) {
  .nav__brand img {
    filter: drop-shadow(0 0 6px rgba(0,0,0,0.35)) drop-shadow(0 1px 2px rgba(0,0,0,0.45));
  }
}

/* ============================================================
   ============================================================
   WAVE 17 — Hero images + cs cards + footer + spacing universal
   ============================================================
   Date: 2026-05-03
   Scope:
     17.A  Universal mobile/tablet horizontal gutter
     17.B  Hero image swaps + 9:16 vertical mobile heroes
     17.C  Projects day/night showcase block (mobile/tablet)
     17.D  Case-card chip (badge) one-line + compact card
     17.E  Case studies arrows on left/right (no circle)
     17.F  Home process accordion — corrected selectors
     17.G  Footer redesign (inline-wrapped items per column)
     17.H  Universal cleanup: hero ≤80vh, brand size, no h-scroll
============================================================ */

/* ----- 17.A  Universal page gutter on mobile/tablet -------------
   One variable controls the horizontal gutter for every page-level
   container so no content hugs the viewport edge. The desktop
   token (`--container-pad-x`) is preserved on ≥1025px. ---------- */
:root {
  --page-gutter: clamp(20px, 5vw, 40px);
}
@media (max-width: 1024px) {
  .container,
  .va__container,
  .ps__container,
  .cmp__container,
  .ej__container,
  .ak__container,
  .pj__container,
  .ct__container,
  .ab__container,
  .approach__container,
  .section > .container,
  .altfooter__inner,
  .featured__inner,
  .reviews__container,
  .trust__container,
  .ctafooter__inner {
    padding-inline: var(--page-gutter) !important;
    box-sizing: border-box;
  }
}

/* ----- 17.B  Hero image swaps + 9:16 vertical on mobile/tablet --
   Background-image div pattern (.about-hero__bg) gets a portrait
   override at ≤1024px. Heroes that use <img> get object-fit cover
   + 9:16 aspect on the parent. Index hero (video) is excluded. --- */

/* About — new hero image (Villa Bond gallery 54) on mobile/tablet */
@media (max-width: 1024px) {
  .about-page-hero .about-hero__bg {
    background-image: url("../assets/portfolio/villa-bond/gallery/HOA-VBP54.png") !important;
    background-position: center center !important;
    background-size: cover !important;
  }
  /* Approach: keep current image, just zoom-in vertical */
  .approach-hero .about-hero__bg {
    background-position: center center !important;
    background-size: cover !important;
    transform: scale(1.05);
  }
  /* Contact: keep current image, just zoom-in vertical */
  .contact-page-hero .about-hero__bg {
    background-position: center center !important;
    background-size: cover !important;
    transform: scale(1.05);
  }
}

/* Universal 9:16 / cap on mobile inner-page heroes (NOT index hero) */
@media (max-width: 1024px) {
  .about-page-hero .about-hero__panel,
  .approach-hero .about-hero__panel,
  .contact-page-hero .about-hero__panel,
  .journal-page-hero .about-hero__panel {
    /* keep height tight — never full-screen */
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    aspect-ratio: 9 / 16;
    max-block-size: 80vh;
    overflow: hidden;
  }
}

/* Projects page hero — Wave 17 mobile/tablet only.
   Hide the day/night layers in the hero (they re-appear below in
   the showcase block). Set a vertical bg image (Villa Rafaella
   Hero1) so the hero reads as a clean editorial portrait shot. */
@media (max-width: 1024px) {
  /* Wave 17.B disabled — was killing the day/night effect on
     mobile by display:none-ing the rail/sticky/layers and
     replacing with a static villa-rafaella image. Restored
     so the original scroll-driven crossfade runs on mobile. */
  .proj-transform.proj-transform--hero .nav.nav--floating {
    position: relative;
    z-index: 2;
  }
}

/* Case studies page hero — make sure it uses cover-center */
@media (max-width: 1024px) {
  .cs-hero,
  .case-studies__hero {
    aspect-ratio: auto !important;
    max-block-size: 80vh !important;
    height: 80vh !important;
    min-height: 540px !important;
  }
}

/* ----- 17.C  Projects day/night showcase block --------------------
   Visible on mobile/tablet only (≤1024px). Hidden on desktop where
   the original scroll-driven hero handles it. ----------------- */
.proj-transform-showcase { display: none; }

/* Wave 29: hide the duplicate showcase on mobile too — the
   original .proj-transform--hero crossfade is restored, so the
   showcase block is no longer needed. Keep the rest of the
   block as-is in case we want to re-enable later. */
@media (max-width: 1024px) {
  .proj-transform-showcase { display: none !important; }
  /* The styles below are dormant unless the showcase is
     re-enabled at some point. */
  .proj-transform-showcase[data-disabled-rule-block] {
    display: block;
    background: #0a0a0a;
    padding: clamp(28px, 5vw, 48px) 0 clamp(36px, 6vw, 56px);
  }
  .proj-transform-showcase__inner {
    padding-inline: var(--page-gutter);
    margin-inline: auto;
    max-width: 1100px;
  }
  .proj-transform-showcase__head {
    margin-bottom: clamp(16px, 3vw, 24px);
    color: #fff;
  }
  .proj-transform-showcase__head .eyebrow {
    color: rgba(255,255,255,0.7);
  }
  .proj-transform-showcase__title {
    font-family: var(--font-display);
    font-weight: var(--fw-thin);
    font-size: clamp(1.5rem, 5.5vw, 2rem);
    line-height: 1.12;
    letter-spacing: -0.01em;
    margin: 8px 0 0;
    color: #fff;
  }
  .proj-transform-showcase__title em {
    font-style: italic;
    color: rgba(255,255,255,0.85);
  }
  .proj-transform-showcase__frame {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: #000;
  }
  .proj-transform-showcase__layer {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
    display: block;
  }
  .proj-transform-showcase__layer--day {
    animation: w17-dayfade 7s ease-in-out infinite;
    z-index: 1;
  }
  .proj-transform-showcase__layer--night { z-index: 0; }
  @keyframes w17-dayfade {
    0%   { opacity: 1; }
    40%  { opacity: 1; }
    55%  { opacity: 0; }
    90%  { opacity: 0; }
    100% { opacity: 1; }
  }
  .proj-transform-showcase__labels {
    position: absolute;
    left: 0; right: 0; bottom: 14px;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 14px;
    color: #fff;
    font-family: var(--font-body);
    font-size: 0.75rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
  }
  .proj-transform-showcase__divider {
    width: 28px;
    height: 1px;
    background: rgba(255,255,255,0.6);
  }
}

/* ----- 17.D  Case-card chip + compact card (home + carousel) -----
   Wave 15 targeted .cs-card which doesn't exist — actual class is
   .case-card. Re-do here against the real selectors. ---------- */
@media (max-width: 1024px) {
  /* Chip: smaller height, wider room → label stays one line */
  .case-card__badge {
    padding: 5px 10px !important;
    gap: 6px !important;
    top: 10px !important;
    right: 10px !important;
    max-width: calc(100% - 20px);
  }
  .case-card__badge-label {
    font-size: 0.5625rem !important;        /* 9px */
    letter-spacing: 0.18em !important;
    line-height: 1 !important;
    white-space: nowrap !important;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .case-card__badge-icon {
    width: 9px !important;
    height: 9px !important;
  }

  /* Card body: tighter, more compact */
  .case-card__body {
    padding: 16px 18px !important;
    gap: 10px !important;
  }
  .case-card__name {
    font-size: clamp(1.125rem, 4.4vw, 1.4rem) !important;
    line-height: 1.15 !important;
  }
  .case-card__sub {
    font-size: 0.75rem !important;
    line-height: 1.4 !important;
    margin: 0 !important;
  }

  /* Numbers: +20% from current clamp(1.25,2vw,1.625rem) */
  .case-card__num {
    font-size: clamp(1.5rem, 5vw, 1.95rem) !important;
  }
  .case-card__label {
    font-size: 0.625rem !important;
    letter-spacing: 0.18em !important;
  }
  .case-card__stats {
    padding-block: 12px !important;
    gap: 8px !important;
  }

  /* Description (kicker) — single line, ellipsis */
  .case-card__kicker {
    display: -webkit-box !important;
    -webkit-line-clamp: 1 !important;
    -webkit-box-orient: vertical !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: normal !important;
    padding-top: 10px !important;
    margin-top: 4px !important;
    font-size: 0.8125rem !important;
    line-height: 1.35 !important;
  }

  /* Read more — keep tap target but tighten visual */
  .case-card__readmore {
    font-size: 0.625rem !important;
    letter-spacing: 0.2em !important;
  }
}

/* ----- 17.E  Case-studies arrows: vertical sides, no circle ------
   Wave 15 already removed the circle but the carousel arrows on
   the home carousel can drift below the card. Lock them to the
   vertical centre of the card on mobile/tablet. --------------- */
@media (max-width: 1024px) {
  .case-studies__carousel {
    position: relative !important;
  }
  .case-studies__carousel .cs-arrow.cs-arrow--side,
  .cs-arrow.cs-arrow--side {
    position: absolute !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
    z-index: 5;
    width: 40px !important;
    height: 40px !important;
    background: transparent !important;
    border: 0 !important;
    border-radius: 0 !important;
    color: rgba(255,255,255,0.92) !important;
    filter: drop-shadow(0 1px 2px rgba(0,0,0,0.55));
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .cs-arrow.cs-arrow--left  { left: 6px !important;  right: auto !important; }
  .cs-arrow.cs-arrow--right { right: 6px !important; left:  auto !important; }
  .cs-arrow.cs-arrow--side svg {
    width: 26px;
    height: 26px;
    stroke: currentColor;
    stroke-width: 1.4;
    fill: none;
  }
  .cs-arrow.cs-arrow--left:hover  { transform: translate(-3px, -50%) !important; }
  .cs-arrow.cs-arrow--right:hover { transform: translate(3px, -50%)  !important; }
}

/* ----- 17.F  Home process accordion — selector fix ----------------
   The Wave 15 CSS targeted .hstep__phase which doesn't exist in
   the markup. Real structure: .hstep > .hstep__content > (
   .hstep__crown[.hstep__num] + .hstep__title + .hstep__desc +
   .hstep__deliverables ). Treat .hstep__crown + .hstep__title as
   the tap header, .hstep__desc + .hstep__deliverables as the body
   that collapses. JS in main.js (Wave 17) wraps the header so the
   click handler fires reliably. ------------------------------- */
@media (max-width: 1024px) {
  /* Reset Wave 15 .hstep__phase rules that did nothing useful */
  .approach.approach--hscroll .hstep {
    display: block !important;
    padding: 0 !important;
    border-bottom: 1px solid rgba(255,255,255,0.10) !important;
  }
  .approach.approach--hscroll .hstep:last-child { border-bottom: 0 !important; }

  .approach.approach--hscroll .hstep__content {
    display: block !important;
    padding: 0 !important;
  }

  /* Header (tap target) */
  .approach.approach--hscroll .hstep__header {
    display: flex !important;
    align-items: center !important;
    gap: 12px !important;
    width: 100% !important;
    min-height: 56px !important;
    padding: 14px var(--page-gutter, 20px) !important;
    background: transparent !important;
    border: 0 !important;
    color: inherit !important;
    text-align: left !important;
    cursor: pointer !important;
    position: relative !important;
    -webkit-tap-highlight-color: transparent;
  }
  .approach.approach--hscroll .hstep__header .hstep__crown {
    display: inline-flex !important;
    margin: 0 !important;
  }
  .approach.approach--hscroll .hstep__header .hstep__num {
    display: inline-block !important;
    font-family: var(--font-display);
    font-size: 0.875rem !important;
    font-weight: var(--fw-thin) !important;
    color: rgba(255,255,255,0.55) !important;
    letter-spacing: 0.04em;
    margin: 0 !important;
  }
  .approach.approach--hscroll .hstep__header .hstep__title {
    margin: 0 !important;
    flex: 1 1 auto !important;
    font-size: clamp(1rem, 4vw, 1.125rem) !important;
    font-weight: var(--fw-thin) !important;
    line-height: 1.2 !important;
    max-height: none !important;
    overflow: visible !important;
  }
  .approach.approach--hscroll .hstep__header::after {
    content: "+";
    flex: 0 0 auto;
    width: 28px;
    text-align: center;
    font-size: 1.4rem;
    color: rgba(255,255,255,0.6);
    line-height: 1;
    transition: transform 220ms ease;
  }
  .approach.approach--hscroll .hstep.is-open .hstep__header::after {
    transform: rotate(45deg);
  }

  /* Body — collapses by default */
  .approach.approach--hscroll .hstep__desc,
  .approach.approach--hscroll .hstep__deliverables {
    max-height: 0 !important;
    overflow: hidden !important;
    margin: 0 !important;
    padding-inline: var(--page-gutter, 20px) !important;
    transition: max-height 360ms ease, padding 360ms ease, margin 360ms ease;
  }
  .approach.approach--hscroll .hstep.is-open .hstep__desc {
    max-height: 600px !important;
    margin: 4px 0 10px !important;
  }
  .approach.approach--hscroll .hstep.is-open .hstep__deliverables {
    max-height: 600px !important;
    margin: 0 0 16px !important;
  }
}

/* ----- 17.G  Footer compaction — applied only at MOBILE/TABLET.
   Desktop keeps the original vertical column layout (each column
   has its title on top, then items stacked vertically). Earlier
   this Wave was unscoped and forcing inline-wrapped items on
   desktop too, blowing up the footer height. */
@media (max-width: 1024px) {
  .altfooter__nav ul {
    display: flex !important;
    flex-wrap: wrap !important;
    gap: 8px 14px !important;
    margin: 0 !important;
    padding: 0 !important;
    list-style: none !important;
  }
  .altfooter__nav li {
    display: inline-flex !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  .altfooter__nav .altfooter__col {
    margin-bottom: clamp(16px, 2.4vw, 24px);
  }
  .altfooter__nav {
    gap: 18px !important;
  }
  .altfooter__nav ul {
    gap: 6px 12px !important;
  }
  .altfooter__col-title {
    margin-bottom: 8px !important;
  }
}

/* ----- 17.H  Universal cleanup --------------------------------- */
@media (max-width: 1024px) {
  /* Cap every hero panel to 80vh */
  .about-hero,
  .va__hero,
  .ej-hero,
  .ct-hero,
  .pj-hero,
  .cs-hero {
    max-height: 85vh;
  }
  /* Brand wordmark constrained 36-44px tall, never stretched */
  .nav__brand img {
    height: clamp(36px, 4.2vw, 44px) !important;
    width: auto !important;
    max-width: none !important;
    object-fit: contain !important;
  }
  /* Defensive — eliminate horizontal overflow at 375px.
     Use `clip` (not hidden) so we don't create a second
     scrolling container that breaks position:sticky. */
  html, body { overflow-x: clip !important; }
}

/* End Wave 17 ============================================== */


/* ============================================================
   Wave 18 — User feedback round
============================================================ */

/* 18.1 Hide secondary portrait/aside images on contact (and
   any similar floating image on about) at <=1024px so the
   page reads single-column without a redundant photo. */
@media (max-width: 1024px) {
  .contact-form-side,
  .contact-form-image,
  .about-hero__floater,
  .about-hero__media-secondary {
    display: none !important;
  }
  .contact-form-grid {
    grid-template-columns: 1fr !important;
  }
}

/* 18.2 Projects hero on mobile/tablet — vertical Dusit Suites
   shot, no day/night layers in the hero (those move to the
   showcase block below the hero). */
@media (max-width: 1024px) {
  .proj-transform--hero .proj-transform__layer--day img {
    content: url("/assets/portfolio/dusit-suites-athens/gallery/HOA-DSP5.jpg") !important;
    object-fit: cover !important;
    object-position: center !important;
  }
  .proj-transform--hero .proj-transform__layer--night,
  .proj-transform--hero .proj-transform__overlay,
  .proj-transform--hero .proj-transform__labels {
    display: none !important;
  }
}

/* 18.3 Day-to-Night SHOWCASE block: scroll-locked smooth
   crossfade. The .proj-transform-showcase__layer--night gets
   its opacity driven by a CSS variable --xfade (0..1) that JS
   sets based on the section's scroll position relative to
   viewport. Pure CSS fallback (just shows night) if JS misses. */
.proj-transform-showcase__frame {
  position: relative;
  aspect-ratio: 16 / 9;
  width: 100%;
  overflow: hidden;
  --xfade: 0;
}
.proj-transform-showcase__layer {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.proj-transform-showcase__layer--day {
  opacity: calc(1 - var(--xfade));
}
.proj-transform-showcase__layer--night {
  opacity: var(--xfade);
}

/* 18.4 Home process — numbers UP FRONT, +20% bigger, thinner
   toggle padding on mobile/tablet. Numbers move from the
   right-side absolute decoration into the inline header. */
@media (max-width: 1024px) {
  .hstep__phase {
    display: flex !important;
    align-items: baseline;
    gap: 12px;
    padding: 14px 32px 14px 0 !important;
  }
  .hstep__phase::before {
    content: attr(data-step-num);
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 200;
    font-size: clamp(1rem, 4.6vw, 1.25rem);
    line-height: 1;
    color: rgba(255,255,255,0.55);
    flex: 0 0 auto;
  }
  .hstep__phase {
    font-size: clamp(1rem, 4.4vw, 1.25rem) !important;
    line-height: 1.2 !important;
  }
  .hstep__phase::after {
    /* tighter visual weight on the +/x toggle */
    font-size: 1rem !important;
    color: rgba(255,255,255,0.45) !important;
  }
  .hstep__title {
    font-size: clamp(1.4rem, 6vw, 1.75rem) !important;
  }
  /* Make sure inline number doesn't appear in the desktop
     scroll-driven layout. */
}
@media (min-width: 1025px) {
  .hstep__phase::before { content: none !important; }
}

/* 18.5 Home hero — explicit fit for the video so it covers
   correctly on mobile + buttons read clearly with a soft
   ink scrim under them. */
.hero__bg-video,
.hero__bg iframe,
.hero__bg video {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  object-position: center !important;
}
.hero__overlay {
  background:
    linear-gradient(to top,
      rgba(0,0,0,0.78) 0%,
      rgba(0,0,0,0.45) 28%,
      rgba(0,0,0,0.22) 60%,
      rgba(0,0,0,0.42) 100%) !important;
}
@media (max-width: 1024px) {
  .hero {
    height: auto !important;
    min-height: clamp(540px, 78vh, 720px) !important;
    max-height: 88vh !important;
  }
  .hero__panel {
    min-height: clamp(540px, 78vh, 720px) !important;
  }
}

/* ============================================================
   Wave 19 — Home process number fix + projects revert + case
              study hero bg cleanup
============================================================ */

/* 19.1 — Home process: the Wave 18 ::before targeted
   .hstep__phase, but the actual HTML has .hstep__crown
   containing .hstep__num. Hide the right-side crown entirely
   and inject the step number INLINE before .hstep__title via
   CSS using a data-step-num attribute set on .hstep itself by
   JS. Title becomes the toggle button. */
@media (max-width: 1024px) {
  .approach--hscroll .hstep .hstep__crown { display: none !important; }
  .approach--hscroll .hstep .hstep__num   { display: none !important; }
  .approach--hscroll .hstep .hstep__title {
    position: relative;
    cursor: pointer;
    user-select: none;
    padding-right: 36px;
    padding-left: 0;
    margin: 0 !important;
    font-size: clamp(1.4rem, 6vw, 1.75rem) !important;
    line-height: 1.2 !important;
    display: flex;
    align-items: baseline;
    gap: 14px;
  }
  .approach--hscroll .hstep .hstep__title::before {
    content: attr(data-step-num);
    flex: 0 0 auto;
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 200;
    font-size: clamp(1.125rem, 5vw, 1.5rem);
    line-height: 1;
    color: rgba(255,255,255,0.55);
  }
  .approach--hscroll .hstep .hstep__title::after {
    content: "+";
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    font-size: 1.125rem;
    color: rgba(255,255,255,0.45);
    transition: transform 220ms ease;
  }
  .approach--hscroll .hstep.is-open .hstep__title::after {
    transform: translateY(-50%) rotate(45deg);
  }
  /* Body collapses by default, expands when .is-open. */
  .approach--hscroll .hstep .hstep__desc,
  .approach--hscroll .hstep .hstep__deliverables {
    max-height: 0;
    overflow: hidden;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    transition: max-height 360ms ease, margin 360ms ease;
  }
  .approach--hscroll .hstep.is-open .hstep__desc,
  .approach--hscroll .hstep.is-open .hstep__deliverables {
    max-height: 800px;
    margin-top: 12px !important;
  }
}

/* 19.2 — Projects mobile/tablet: revert Wave 18 hero swap.
   Keep the original day/night layers in the hero exactly as
   the desktop version (the user will provide vertical 9:16
   versions of those images later). */
@media (max-width: 1024px) {
  .proj-transform--hero .proj-transform__layer--day img {
    content: normal !important;
  }
  .proj-transform--hero .proj-transform__layer--night,
  .proj-transform--hero .proj-transform__overlay,
  .proj-transform--hero .proj-transform__labels {
    display: revert !important;
  }
  /* Hide the duplicate showcase block on mobile/tablet too;
     desktop already hides it. The hero's own day/night layers
     do the work. */
  .proj-transform-showcase { display: none !important; }
}

/* ============================================================
   Wave 20 — Home hero fit + black-band kill mobile/tablet +
              CS hero +15% headline
============================================================ */

/* 20.1 Home hero on mobile/tablet — make sure both buttons
   sit comfortably above the trusted strip and the title has
   a softer dark gradient behind it. Also bump title +15%. */
@media (max-width: 1024px) {
  .hero {
    height: auto !important;
    min-height: clamp(620px, 86vh, 760px) !important;
    max-height: 92vh !important;
  }
  .hero__panel {
    min-height: clamp(620px, 86vh, 760px) !important;
    padding-bottom: clamp(36px, 7vw, 64px) !important;
  }
  .hero__title {
    font-size: clamp(2.25rem, 6.4vw + 0.5rem, 3.25rem) !important;
    line-height: 1.05 !important;
    margin-bottom: 12px !important;
  }
  .hero__rule { margin: 18px 0 !important; }
  .hero__ctas {
    flex-direction: column;
    align-items: stretch;
    gap: 10px !important;
    margin-top: 12px !important;
  }
  .hero__ctas .btn-ct {
    width: 100%;
    justify-content: center;
  }
  .hero__overlay {
    background:
      linear-gradient(to top,
        rgba(0,0,0,0.85) 0%,
        rgba(0,0,0,0.55) 35%,
        rgba(0,0,0,0.28) 70%,
        rgba(0,0,0,0.45) 100%) !important;
  }
}

/* 20.2 No "shadow" overlay on case study heroes on tablet/
   mobile — only desktop keeps the existing scrim. */
@media (max-width: 1024px) {
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .cs-hero__overlay {
    background: linear-gradient(to top,
      rgba(0,0,0,0.45) 0%,
      rgba(0,0,0,0.15) 60%,
      rgba(0,0,0,0.05) 100%) !important;
  }
}

/* 20.3 Case studies index hero headline +15% on mobile/tablet */
@media (max-width: 1024px) {
  .cs-hero__title {
    font-size: clamp(2.15rem, 8.5vw, 3rem) !important;
    line-height: 1.08 !important;
  }
}

/* 20.4 Black-band kill — final defensive layer at mobile/
   tablet: kill any padding-top, margin-top, or background
   bar above the hero on every variant. Restate also that
   .hero must start at the very top edge. */
@media (max-width: 1024px) {
  body, .page-frame, .page-frame > * {
    padding-top: 0 !important;
    margin-top: 0 !important;
  }
  .hero,
  .about-hero,
  .cs-hero,
  .va__hero,
  .cmp__hero,
  .ct-hero,
  .ej-hero,
  .ak-hero,
  .pj-hero,
  .ps__hero,
  .approach__hero,
  .approach-hero,
  .case-studies__hero,
  .projects__hero {
    padding-top: 0 !important;
    margin-top: 0 !important;
  }
  /* The .nav inside the hero already has padding to clear
     itself. No extra strip above it. */
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav {
    padding-top: clamp(14px, 3vw, 22px) !important;
  }
}

/* ============================================================
   Wave 21 — Final hero fixes: both home CTAs visible +
   black band kill on case-studies hero
============================================================ */

/* 21.1 Home hero: ensure BOTH CTAs render fully on mobile/
   tablet, no clipping. Pull the panel taller and reduce the
   bottom padding so the buttons sit clearly above the hero
   bottom edge. Also pull the title block higher up. */
@media (max-width: 1024px) {
  .hero {
    min-height: clamp(720px, 100vh, 880px) !important;
    height: auto !important;
    max-height: none !important;
  }
  .hero__panel {
    min-height: clamp(720px, 100vh, 880px) !important;
    padding-top: clamp(60px, 10vw, 80px) !important;
    padding-bottom: clamp(40px, 8vw, 64px) !important;
    display: flex !important;
    flex-direction: column !important;
  }
  .hero__grid {
    display: flex !important;
    flex-direction: column !important;
    justify-content: flex-end !important;
    flex: 1 !important;
    gap: 0 !important;
  }
  .hero__ctas {
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
    margin-top: 16px !important;
    padding-bottom: 8px !important;
  }
  .hero__ctas .btn-ct,
  .hero__ctas a.btn-ct {
    display: inline-flex !important;
    width: 100% !important;
    justify-content: center !important;
    visibility: visible !important;
    opacity: 1 !important;
  }
}

/* 21.2 Case studies hero: kill the black band above the
   header. Final aggressive override targeting every possible
   parent that could hold padding/margin. */
@media (max-width: 1024px) {
  .case-studies__hero,
  .cs-hero,
  .cs-hero__background {
    padding-top: 0 !important;
    margin-top: 0 !important;
    top: 0 !important;
  }
  .cs-hero__background {
    inset: 0 !important;
    height: 100% !important;
  }
  /* The .nav inside the cs-hero gets its own minimal top
     padding so the brand wordmark doesn't crash into the
     screen edge, but no full strip above the image. */
  .cs-hero > .nav,
  .cs-hero .nav {
    position: relative !important;
    z-index: 5 !important;
    padding-top: clamp(14px, 3vw, 22px) !important;
    background: transparent !important;
  }
  /* Any preceding spacer / placeholder element on
     case-studies.html before the hero — kill it. Excludes
     .nav (the floating site nav on case-study single pages
     like estate-prive / villa-apollon — that's the brand
     wordmark + hamburger, NOT a spacer). */
  body > .page-frame > main > *:first-child:not(.cs-hero):not(.case-studies__hero):not(.nav):not(.preloader),
  .page-frame > main > *:first-child:not(.cs-hero):not(.case-studies__hero):not(.nav):not(.preloader) {
    display: none !important;
  }
}

/* ============================================================
   Wave 22 — Logo polish + hstep dup-num kill + footer rows +
              projects more-work 2-col + newsletter spacing
============================================================ */

/* 22.1 Logo (.nav__brand img): no drop-shadow, +10% bigger
   on mobile/tablet only. Desktop unchanged. */
@media (max-width: 1024px) {
  .nav__brand img {
    filter: none !important;
    height: 44px !important;
    width: auto !important;
  }
  /* Nav sits at the very top edge of the hero with minimal
     padding — no rubber-band band above. */
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .pj-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .case-studies__hero .nav,
  .projects__hero .nav {
    padding: 12px clamp(20px, 4vw, 32px) 0 !important;
  }
}
@media (max-width: 600px) {
  .nav__brand img { height: 40px !important; }
}

/* 22.2 Home process accordion: KILL the duplicate right-side
   "01"/"02" number with a sledgehammer selector. Only the
   inline left number (Wave 19 ::before) stays. */
@media (max-width: 1024px) {
  .approach--hscroll .hstep .hstep__crown,
  .approach--hscroll .hstep .hstep__num,
  .hstep__crown,
  .hstep__num,
  li.hstep .hstep__crown,
  li.hstep .hstep__num,
  .hstep > .hstep__content > .hstep__crown {
    display: none !important;
    visibility: hidden !important;
    opacity: 0 !important;
    width: 0 !important;
    height: 0 !important;
    position: absolute !important;
    pointer-events: none !important;
  }
}

/* 22.3 Toggle "+" thinner / icon-style on mobile/tablet */
@media (max-width: 1024px) {
  .approach--hscroll .hstep .hstep__title::after {
    content: "" !important;
    display: block !important;
    position: absolute !important;
    right: 4px !important;
    top: 50% !important;
    width: 14px !important;
    height: 14px !important;
    background:
      linear-gradient(currentColor, currentColor) center/14px 1px no-repeat,
      linear-gradient(currentColor, currentColor) center/1px 14px no-repeat;
    color: rgba(255,255,255,0.55);
    transform: translateY(-50%) !important;
    transition: transform 220ms ease, opacity 220ms ease;
  }
  .approach--hscroll .hstep.is-open .hstep__title::after {
    background:
      linear-gradient(currentColor, currentColor) center/14px 1px no-repeat !important;
    transform: translateY(-50%) !important;
  }
}

/* 22.4 Footer mobile: 3 ROWS, each row = title above + items
   horizontal flex-wrap below. Newsletter sits at top with
   more breathing room. */
@media (max-width: 1024px) {
  .altfooter__inner {
    padding: clamp(40px, 7vw, 64px) clamp(20px, 5vw, 32px) !important;
  }
  .altfooter__top {
    display: flex !important;
    flex-direction: column !important;
    gap: clamp(28px, 5vw, 40px) !important;
  }
  /* Newsletter block — extra space above + below */
  .altfooter__news {
    padding-block: clamp(20px, 4vw, 32px) !important;
    margin-bottom: clamp(20px, 4vw, 32px) !important;
    border-bottom: 1px solid rgba(255,255,255,0.10);
  }
  /* Footer nav becomes a column of rows (Index / Useful /
     Connect each as one row). */
  .altfooter__nav {
    display: flex !important;
    flex-direction: column !important;
    grid-template-columns: none !important;
    gap: clamp(20px, 4vw, 32px) !important;
  }
  .altfooter__col {
    grid-column: auto !important;
    grid-row: auto !important;
    width: 100%;
  }
  .altfooter__col-title {
    margin: 0 0 10px !important;
  }
  /* Items horizontal under each title, wrap to next row if
     they don't fit. */
  .altfooter__nav ul {
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    gap: 8px 16px !important;
    padding: 0 !important;
    margin: 0 !important;
    list-style: none !important;
  }
  .altfooter__nav ul li {
    display: inline-flex;
  }
  .altfooter__nav ul li a {
    white-space: nowrap;
  }
}

/* 22.5 Projects "more work" / projects-grid: 2 cards per row
   on mobile (≤600px) and tablet (601-1024px) so the section
   reads compact instead of an endless single-column scroll. */
@media (max-width: 1024px) {
  .projects-grid__body {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: clamp(10px, 2vw, 16px) !important;
  }
  .projects-grid__cell {
    width: 100% !important;
  }
  .projects-grid__media {
    aspect-ratio: 4 / 5 !important;
    height: auto !important;
  }
  .projects-grid__meta-overlay,
  .projects-grid__footer {
    padding: 8px 10px !important;
  }
  .projects-grid__cell h3,
  .projects-grid__cell .projects-grid__cell-title {
    font-size: clamp(0.875rem, 3.6vw, 1.05rem) !important;
    line-height: 1.2 !important;
  }
}

/* 22.6 Projects hero — cropped (not full screen) on mobile */
@media (max-width: 1024px) {
  .proj-transform--hero {
    height: auto !important;
    min-height: clamp(520px, 70vh, 640px) !important;
    max-height: 78vh !important;
  }
  .proj-transform--hero .proj-transform__sticky {
    height: 100% !important;
    min-height: clamp(520px, 70vh, 640px) !important;
    max-height: 78vh !important;
  }
}

/* ============================================================
   Wave 23 — Logo+hamburger alignment + revert projects-grid +
              ps__related 2-col + hero white-gap kill
============================================================ */

/* 23.1 REVERT Wave 22.5 — projects-grid stays 1-column,
   horizontal one-after-another like before. The 2-col grid
   the user wanted applies only to .ps__related-grid (the
   "More work / Other projects" section inside individual
   project pages). */
@media (max-width: 1024px) {
  .projects-grid__body {
    display: block !important;
    grid-template-columns: none !important;
  }
  .projects-grid__cell {
    width: 100% !important;
    margin-bottom: clamp(20px, 4vw, 40px);
  }
  .projects-grid__media {
    aspect-ratio: 16 / 9 !important;
    height: auto !important;
  }
}

/* 23.2 ps__related-grid (More-work in project pages):
   2-column compact grid on mobile/tablet so horizontal
   thumbs sit in pairs instead of one-per-row. */
@media (max-width: 1024px) {
  .ps__related-grid {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: 12px !important;
  }
  .ps__related-card { width: 100% !important; }
  .ps__related-media { aspect-ratio: 4 / 5 !important; }
}

/* 23.3 Logo aligned with hamburger on the same vertical line.
   Hamburger is position:fixed top:clamp(16px,2vw,24px). Pull
   .nav__brand to the same top via .nav padding so the
   wordmark and the hamburger sit at exactly the same y.
   +10% size again. */
@media (max-width: 1024px) {
  .nav__brand img {
    height: 48px !important;
    width: auto !important;
    filter: none !important;
  }
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .pj-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .case-studies__hero .nav,
  .projects__hero .nav,
  .ct-hero .nav,
  .ej-hero .nav,
  .ak-hero .nav {
    padding: clamp(16px, 2vw, 24px) clamp(20px, 4vw, 32px) 0 !important;
    align-items: center !important;
    min-height: clamp(48px, 6vw, 56px);
  }
  .hamburger {
    top: clamp(16px, 2vw, 24px) !important;
  }
}
@media (max-width: 600px) {
  .nav__brand img { height: 44px !important; }
}

/* 23.4 Kill white gap on right of hero. Some heroes had
   .va__container or similar with max-width pulled in,
   leaving a gutter on one side. Force every hero shell to
   span the full viewport width. */
.hero,
.about-hero,
.cs-hero,
.va__hero,
.cmp__hero,
.ct-hero,
.ej-hero,
.ak-hero,
.pj-hero,
.ps__hero,
.approach__hero,
.approach-hero,
.case-studies__hero,
.projects__hero,
.proj-transform--hero {
  width: 100% !important;
  max-width: 100% !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
}
.hero__bg,
.hero__overlay,
.va__hero-bg,
.va__hero-scrim,
.cs-hero__background,
.cs-hero__overlay,
.about-hero__bg,
.about-hero__overlay {
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
}

/* 23.5 Hide the .proj-transform-showcase block on every
   viewport — it duplicates the hero day/night element and
   was never meant to ship. */
.proj-transform-showcase { display: none !important; }

/* ============================================================
   Wave 24 — Logo precise alignment, hero darken+arrow tags,
              projects-dump 2-col, hero parity
============================================================ */

/* 24.1 Hero overlay darkened on ALL hero variants on
   mobile/tablet so titles + tag chips read clearly. */
@media (max-width: 1024px) {
  .hero__overlay {
    background:
      linear-gradient(to top,
        rgba(0,0,0,0.85) 0%,
        rgba(0,0,0,0.55) 35%,
        rgba(0,0,0,0.30) 65%,
        rgba(0,0,0,0.50) 100%) !important;
  }
  .cs-hero__overlay,
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay {
    background: linear-gradient(to top,
      rgba(0,0,0,0.72) 0%,
      rgba(0,0,0,0.38) 50%,
      rgba(0,0,0,0.22) 100%) !important;
  }
}

/* 24.2 Logo + hamburger ABSOLUTE alignment. Both pinned at
   the same y. .nav inside hero is given an exact 18px top
   to match .hamburger top:18px. align-items:center keeps
   the logo (48px tall) and hamburger box (44-52px) on the
   same baseline. */
@media (max-width: 1024px) {
  .hamburger { top: 18px !important; }
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .pj-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .case-studies__hero .nav,
  .projects__hero .nav,
  .ct-hero .nav,
  .ej-hero .nav,
  .ak-hero .nav,
  .proj-transform--hero .nav {
    padding: 18px clamp(20px, 4vw, 32px) 0 !important;
    align-items: center !important;
    display: flex !important;
    justify-content: space-between !important;
  }
  .nav__brand img {
    height: 48px !important;
    width: auto !important;
    filter: none !important;
    display: block !important;
  }
}
@media (max-width: 600px) {
  .nav__brand img { height: 44px !important; }
}

/* 24.3 Project pages photography "more work" tabs.
   On mobile/tablet — only the PHOTOS tab gets a 2-col grid
   layout; the Videos and AI VFX tabs stay in their original
   layout (per user spec). The photos use their original
   horizontal aspect, just rendered smaller. */
@media (max-width: 1024px) {
  /* Photos tab active: 2-col grid of horizontal stills. */
  .projects-dump__grid:has(.projects-dump__cell[data-type="photo"]:not(.is-hidden)) {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: clamp(8px, 1.5vw, 14px) !important;
  }
  .projects-dump__cell[data-type="photo"] {
    width: 100% !important;
    height: auto !important;
    flex: 0 0 auto !important;
    aspect-ratio: 3 / 2 !important;
  }
  .projects-dump__cell[data-type="photo"] img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
  }
  .projects-dump__cell .projects-dump__tag {
    font-size: 0.625rem !important;
    padding: 4px 8px !important;
  }
}

/* 24.4 Tag chips on cards (e.g. "GLYFADA") get an arrow
   icon ↗ appended via ::after so they read as link cues. */
.projects-dump__tag::after,
.projects-grid__tag::after,
.case-card__badge-label::after {
  content: " ↗";
  font-size: 0.85em;
  margin-left: 4px;
  opacity: 0.85;
}

/* 24.5 Projects hero (.proj-transform--hero) MUST match the
   height of .about-hero / .cs-hero on mobile/tablet for
   visual parity. Force the same height clamp. */
@media (max-width: 1024px) {
  .proj-transform--hero,
  .proj-transform--hero .proj-transform__sticky,
  .proj-transform--hero .proj-transform__frame {
    height: auto !important;
    min-height: clamp(560px, 78vh, 720px) !important;
    max-height: 88vh !important;
  }
  /* Vertical day/night images cover the frame fully. */
  .proj-transform--hero .proj-transform__layer img,
  .proj-transform--hero .proj-transform__layer picture img {
    object-fit: cover !important;
    object-position: center !important;
    width: 100% !important;
    height: 100% !important;
  }
}

/* ============================================================
   Wave 25 — Full-height hero scrim + projects hero verify +
              contact overlay + logo FIXED at top, hides on
              scroll, hamburger always visible
============================================================ */

/* 25.1 Hero scrim full-height: smooth even darken across the
   entire hero so title + chips + nav read against any photo
   without a visible "band" mid-frame. Solid 45% across the
   full surface — no gradient stops that create a lighter
   pocket. */
@media (max-width: 1024px) {
  .cs-hero__overlay,
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay {
    inset: 0 !important;
    background: rgba(0,0,0,0.45) !important;
    opacity: 1 !important;
  }
  /* Contact page hero darken overlay between bg image and
     text — solid uniform 45% black sits between the bg and
     all body content via ::after on the about-hero variant
     used by contact.html. Same darken treatment as every
     other hero (solid, no banded gradient). */
  .ct-hero::after,
  .contact-page-hero::after,
  .contact .about-hero::after {
    content: "";
    position: absolute;
    inset: 0;
    background: rgba(0,0,0,0.45);
    pointer-events: none;
    z-index: 1;
  }
  /* Lift the body content above the ::after scrim so the
     darken sits between bg and text, not over text. */
  .contact-page-hero > *:not(.about-hero__bg):not(.about-hero__overlay) {
    position: relative;
    z-index: 2;
  }
}

/* 25.2 Logo FIXED at the top, hidden once user scrolls past
   40px. +12% bigger. Centered vertically with the hamburger
   on the same y axis. NO fade transition. Hamburger stays
   visible always. */
@media (max-width: 1024px) {
  /* Make the brand wordmark a standalone fixed element at
     top-left of viewport. */
  .nav__brand {
    position: fixed !important;
    top: 18px !important;
    left: clamp(20px, 4vw, 32px) !important;
    z-index: 60 !important;
    line-height: 0;
    transition: none !important;
  }
  .nav__brand img {
    height: 54px !important;   /* +12% from previous 48px */
    width: auto !important;
    filter: none !important;
    display: block !important;
  }
  /* Logo stays visible permanently, just like the hamburger.
     Override the Wave 1A.1 fade behavior tied to body.nav-hidden. */
  body.nav-hidden .nav__brand {
    display: block !important;
    visibility: visible !important;
    opacity: 1 !important;
    transform: none !important;
    pointer-events: auto !important;
  }
  /* Hamburger ALWAYS visible (override the Wave 1A.1 fade
     behavior which was tied to body.nav-hidden). */
  .hamburger {
    top: 18px !important;
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
    filter: none !important;
    pointer-events: auto !important;
  }
  body.nav-hidden .hamburger {
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
  }
  /* The .nav inside the hero now has no brand inside it
     visually (brand is fixed). Pad-top still in place to
     reserve space. */
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .pj-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .case-studies__hero .nav,
  .projects__hero .nav,
  .ct-hero .nav,
  .ej-hero .nav,
  .ak-hero .nav,
  .proj-transform--hero .nav {
    padding: 18px clamp(20px, 4vw, 32px) 0 !important;
    min-height: 70px !important;
  }
}
@media (max-width: 600px) {
  .nav__brand img { height: 48px !important; }
}

/* 25.3 Projects hero: ensure the vertical day image actually
   shows on mobile/tablet. The .proj-transform__layer--day
   img must NOT be content-replaced by an earlier override.
   Reset content property and re-pin the picture source. */
@media (max-width: 1024px) {
  .proj-transform--hero .proj-transform__layer--day img {
    content: normal !important;
  }
}

/* 25.4 Approach phase blocks (each accordion step on
   .approach--hscroll) get a dark overlay between any
   background image and the text. Mobile/tablet only. */
@media (max-width: 1024px) {
  .approach--hscroll .hstep {
    position: relative;
    background:
      linear-gradient(to bottom,
        rgba(0,0,0,0.55) 0%,
        rgba(0,0,0,0.35) 100%),
      var(--hstep-bg, transparent);
    background-blend-mode: normal;
  }
  .approach--hscroll .hstep > * {
    position: relative;
    z-index: 2;
  }
  /* Approach page av2-rail accordion same treatment. */
  .av2-rail .av2-step {
    position: relative;
    background:
      linear-gradient(to bottom,
        rgba(0,0,0,0.55) 0%,
        rgba(0,0,0,0.35) 100%);
  }
  .av2-rail .av2-step > * {
    position: relative;
    z-index: 2;
  }
}

/* ============================================================
   Wave 26 — Case studies hero: title baseline aligned with
   arrow box bottom. The .cs-hero__title sits bottom-left of
   the slide; .cs-hero__nav arrows sit bottom-right; both
   anchor to the same bottom edge so their last lines end on
   the same baseline.
============================================================ */
@media (max-width: 1024px) {
  .cs-hero__container {
    position: relative;
    height: 100%;
  }
  .cs-hero__slide {
    position: absolute !important;
    inset: 0 !important;
    display: flex !important;
    align-items: flex-end !important;
    justify-content: flex-start !important;
    padding: 24px clamp(76px, 18vw, 110px) clamp(72px, 12vw, 96px) clamp(20px, 4vw, 32px) !important;
    /* Right padding leaves room for the arrows column. */
  }
  .cs-hero__slide:not(.is-active) {
    pointer-events: none;
  }
  .cs-hero__title-link {
    display: block;
    width: 100%;
  }
  .cs-hero__title {
    margin: 0 !important;
    align-self: flex-end;
  }
  /* Arrows: pinned bottom-right of the slide, so their
     bottom edge sits on the same baseline as the title's
     last line. */
  .cs-hero__nav {
    position: absolute !important;
    right: clamp(16px, 4vw, 32px) !important;
    bottom: clamp(72px, 12vw, 96px) !important;
    top: auto !important;
    left: auto !important;
    display: flex !important;
    flex-direction: row !important;
    gap: 8px !important;
    z-index: 5 !important;
  }
  .cs-hero__btn {
    width: 40px !important;
    height: 40px !important;
    background: transparent !important;
    border: 1px solid rgba(255,255,255,0.55) !important;
    border-radius: 0 !important;
    color: rgba(255,255,255,0.95) !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    cursor: pointer;
  }
}

/* ============================================================
   Wave 27 — Estate Privé case study: logo -50% + palette 2x2
============================================================ */
@media (max-width: 1024px) {
  /* Logo on the brand-mark block scaled down by 50%. */
  .ep__brand-mark-lg {
    max-width: 80px !important;
  }
  .ep__brand-mark-block {
    padding: clamp(20px, 4vw, 32px) !important;
    gap: 12px !important;
  }
  /* 4-color palette in 2 rows × 2 columns (was 4 in one row,
     last swatch was getting cropped). */
  .ep__brand-palette {
    grid-template-columns: 1fr 1fr !important;
    gap: 10px !important;
  }
  .ep__swatch {
    aspect-ratio: 1 / 1 !important;
  }
}

/* ============================================================
   Wave 28 — clears 4 open items from HANDOFF_2026-05-03:
   28.1  Estate Privé brand mark logo +35% (80 → 108px)
   28.2  Case-studies hero title forced to 3 lines, baseline-
         aligned with arrow buttons
   28.3  Logo really pinned at top: kill .nav transform that
         was creating a containing block for the fixed brand
   28.4  Projects hero on mobile/tablet: hide the dark scrim
         overlay so the user-provided vertical day/night
         images read clean
============================================================ */

/* 28.1 Estate Privé brand mark logo +35% on mobile/tablet
   (Wave 27 over-shrank to 80px; user wants it back up by 35%) */
@media (max-width: 1024px) {
  .ep__brand-mark-lg {
    max-width: 108px !important;
  }
}

/* 28.2 Case-studies hero title — exactly 3 lines, bottom-
   aligned with the prev/next arrows on the same baseline.
   Three things fixed here together:
   - .cs-hero__container was overflowing the .cs-hero box by
     ~34px on mobile; pin it to inset:0 so the slide bottom
     equals .cs-hero bottom (where the arrows are anchored
     via bottom: 72px).
   - .cs-hero__slide width was min(760px, 56vw) which
     collapsed to ~210px at 375. Force it to fill.
   - flex-direction: column + justify-content: flex-end so
     the title-link sits at the bottom of the slide content
     area, level with the arrow row.
   Mobile-only <br class="cs-mob-br"> tags in the HTML force
   3-line wrap for each title at the chosen font size. */
@media (max-width: 1024px) {
  .cs-hero__container {
    position: absolute !important;
    inset: 0 !important;
  }
  .cs-hero__slide {
    width: 100% !important;
    max-width: 100% !important;
    left: 0 !important;
    right: 0 !important;
    flex-direction: column !important;
    align-items: flex-start !important;
    justify-content: flex-end !important;
    /* The container overflows .cs-hero by ~12px on mobile;
       compensate via padding-bottom so the title-link bottom
       sits on the same baseline as the arrows (which are
       anchored at bottom: 72px of .cs-hero). */
    padding-bottom: clamp(84px, 14vw, 108px) !important;
  }
  .cs-hero__title-link {
    display: block !important;
    width: 100% !important;
    align-self: flex-start !important;
  }
  .cs-hero__title {
    display: block !important;
    width: 100% !important;
    max-width: 100% !important;
    font-size: clamp(1.875rem, 8vw, 2.625rem) !important;
    line-height: 1.12 !important;
    text-wrap: pretty;
    word-break: normal;
    overflow-wrap: break-word;
  }
  /* Mobile-only line break used inside cs-hero titles. */
  .cs-hero__title .cs-mob-br {
    display: inline !important;
  }
}
/* Hide the mobile-only break on desktop. */
.cs-hero__title .cs-mob-br {
  display: none;
}

/* 28.3 Logo behaviour on mobile/tablet (per user spec):
   - Logo sits at the top of the page in normal flow (NOT
     viewport-fixed). When the user scrolls past it, it goes
     out of view naturally — no slide-off animation.
   - Hamburger stays fixed top-right and always visible.
   On hero pages with `.nav` inside `.hero`, the nav already
   scrolls with the hero. On case-study / projects pages with
   `.nav--floating`, override its viewport-fixed positioning
   so the nav (and brand inside) scrolls out with the page.
   Also kill the .nav transform that was creating a containing
   block for any fixed descendants. */
@media (max-width: 1024px) {
  .nav,
  body:not(.is-preloading) .nav:not(.nav--floating),
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .pj-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .case-studies__hero .nav,
  .projects__hero .nav,
  .ct-hero .nav,
  .ej-hero .nav,
  .ak-hero .nav,
  .proj-transform--hero .nav {
    transform: none !important;
  }
  /* Brand sits in normal flow — drop the fixed positioning
     that Wave 25 introduced. The nav element is what carries
     the brand to the top of the page now. */
  .nav__brand {
    position: static !important;
    top: auto !important;
    left: auto !important;
    z-index: auto !important;
  }
  /* The .hero__panel default padding-top reserves room for
     the nav at desktop scale (60px). On mobile we want the
     brand to sit on the same y as the hamburger (18px) — drop
     the panel padding-top, the nav's own padding-top of 18px
     handles spacing. The hero__grid below uses its own
     positioning (absolute or auto-top), so this doesn't push
     the hero title up by 60px in a way that breaks layout. */
  .hero .hero__panel {
    padding-top: 0 !important;
  }
  /* Floating nav (case-study, projects pages) becomes
     absolute-positioned at top of the page on mobile/tablet.
     Result: nav (including brand) is at top on first paint,
     and scrolls away with the page — exactly the same
     behaviour as nav-inside-hero on home. No slide-off
     animation; the .is-hidden state no longer applies because
     transform is nulled out. */
  .nav.nav--floating {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
  }
  .nav.nav--floating.is-hidden {
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
  }
}

/* 28.4 Projects page hero — hide the dark scrim overlay on
   mobile/tablet. */
@media (max-width: 1024px) {
  .proj-transform--hero .proj-transform__overlay {
    display: none !important;
  }
}

/* ============================================================
   Wave 34 — final cohesive pass
   - Projects mobile/tablet hero: REPLACE the day/night rail
     with a single static image + text overlay + button.
     Desktop keeps the rail (untouched).
   - Standardize logo placement across every page so the brand
     wordmark sits at exactly top:18px / left:clamp on mobile,
     identical to home, ABOVE any scrim/overlay (z-index 50+).
   - Home hero size match: cap to 80vh / 720px so it stops
     dwarfing the others (about/approach are 80vh).
============================================================ */

/* 34.1 — projects mobile static hero (display only on mobile) */
.proj-transform__mobile-hero { display: none; }

@media (max-width: 1024px) {
  /* Hide the rail (and everything inside) on mobile/tablet. */
  .proj-transform--hero .proj-transform__rail {
    display: none !important;
  }
  /* Ditto for the duplicate showcase section below. */
  .proj-transform-showcase { display: none !important; }

  /* Activate the static mobile hero. */
  .proj-transform__mobile-hero {
    display: block !important;
    position: relative;
    width: 100%;
    height: clamp(560px, 78vh, 720px);
    background-image: url('/assets/portfolio/dusit-suites-athens/gallery/HOA-DSP5.jpg');
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    overflow: hidden;
  }
  .proj-transform__mobile-overlay {
    position: absolute;
    inset: 0;
    background: rgba(0,0,0,0.45);
    z-index: 1;
    pointer-events: none;
  }
  .proj-transform__mobile-body {
    position: absolute;
    left: 0; right: 0; bottom: clamp(48px, 8vw, 72px);
    padding: 0 clamp(20px, 4vw, 32px);
    z-index: 2;
    color: #fff;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: clamp(12px, 2.5vw, 18px);
  }
  .proj-transform__mobile-eyebrow {
    font-family: var(--font-body);
    font-size: 0.75rem;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: rgba(255,255,255,0.78);
  }
  .proj-transform__mobile-title {
    font-family: var(--font-display);
    font-weight: var(--fw-thin, 200);
    font-size: clamp(1.7rem, 7vw, 2.4rem);
    line-height: 1.12;
    letter-spacing: -0.01em;
    color: #fff;
    margin: 0;
    max-width: 90%;
  }
  .proj-transform__mobile-cta {
    margin-top: clamp(4px, 1vw, 8px);
  }
}

/* 34.2 — standardize logo across every page on mobile/tablet.
   Brand sits at top:18px, left:clamp(20,4vw,32). 44px image.
   Always above the hero scrim (z-index 50). Stays in normal
   document flow inside .nav so it scrolls away naturally. */
@media (max-width: 1024px) {
  /* Pin .nav to top of page in floating context. */
  .nav.nav--floating {
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    padding: 18px clamp(20px, 4vw, 32px) 0 !important;
    min-height: 70px !important;
    z-index: 50 !important;
  }
  /* Brand inside any nav variant: same height, same placement. */
  .nav__brand {
    z-index: 51 !important;
  }
  .nav__brand img {
    height: 44px !important;
    width: auto !important;
    filter: none !important;
    display: block !important;
  }
  /* Ensure the in-hero .nav (home/about/approach/contact) is
     also above any scrim. */
  .hero .nav,
  .va__hero .nav,
  .cs-hero .nav,
  .about-hero .nav,
  .approach__hero .nav,
  .approach-hero .nav,
  .ct-hero .nav,
  .ej-hero .nav,
  .ak-hero .nav,
  .proj-transform--hero .nav {
    z-index: 50 !important;
  }
  /* Hero scrim stays at z-index 1 (below nav). */
  .cs-hero__overlay,
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay,
  .proj-transform__mobile-overlay {
    z-index: 1 !important;
  }
}

/* 34.3 — home hero size match. The home video hero was
   100vh + min-height 540px which produced a TALLER hero than
   about/approach (~80vh). Cap home to 80vh / 720px for
   cohesive scale. Mobile/tablet only. */
@media (max-width: 1024px) {
  .hero,
  .hero__panel {
    height: clamp(560px, 80vh, 720px) !important;
    min-height: 0 !important;
    max-height: 720px !important;
  }
}

/* ============================================================
   Wave 33 — final mobile/tablet polish
   - Case-studies hero rotator: original imagery on desktop,
     restore the previous-generation imagery on mobile/tablet.
   - Hide the founders photo stack on home mobile only.
   - Day/Night labels stay textual via HTML edit (Day/Night).
   - Scrim full coverage already enforced by Wave 25.1 inset:0
     plus Wave 28.4 for the projects hero overlay.
============================================================ */
@media (max-width: 1024px) {
  /* Case-studies rotator — slot 1 (Villa Apollon) and slot 2
     (Estate Prive / Villa Rafaella) get the previous imagery
     on mobile/tablet only. Slot 3 (CK Realtors) is unchanged.
     Desktop keeps the inline-style HOA-VAP2 / HOA-VRP1 set. */
  .cs-hero__bg-layer:nth-child(1) {
    background-image: url('/assets/portfolio/villa-apollon/hero-side/HOA-VAP1.jpg') !important;
  }
  .cs-hero__bg-layer:nth-child(2) {
    background-image: url('/assets/portfolio/villa-rafaella/gallery/HOA-VRP51.jpg') !important;
  }
  /* Home founder portraits — hide on mobile/tablet. Desktop
     is unaffected so the original card stack still renders. */
  .about__media {
    display: none !important;
  }
  /* Belt-and-braces — make sure every hero scrim/overlay
     starts at the very top edge of the viewport (no gap above
     the brand wordmark) and covers the full hero box. */
  .cs-hero__overlay,
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
    z-index: 1 !important;
  }
}

/* ============================================================
   Wave 32 — case-study + project page hero top padding so the
   eyebrow + title don't crash into the brand wordmark sitting
   at top:18px. The .va__hero (apollon / estate-prive / ck-
   realtors / punctum) and .cmp__hero (rafaella / selene /
   bond / dusit / ej / ak) variants don't reserve nav space
   the way the home .hero and .cs-hero do.
============================================================ */
@media (max-width: 1024px) {
  .va__hero .va__container,
  .va__hero .va__hero-body,
  .cmp__hero .cmp__hero-inner,
  .cmp__hero .cmp__hero-body,
  .pj-hero .pj-hero__inner,
  .ct-hero .ct-hero__inner,
  .ej-hero .ej-hero__inner,
  .ak-hero .ak-hero__inner {
    padding-top: clamp(80px, 14vw, 110px) !important;
  }
}

/* ============================================================
   Wave 38 — case-study single hero numbers BIGGER + same
   visual weight across all 4 case studies (Apollon, CK,
   Estate Privé, Punctum). The inline <style> in each case-
   study HTML sets .va__hero-meta-value at 1.75rem; this
   override bumps it to clamp(2rem, 2.6vw, 2.5rem) (~+30%) so
   the stats read as the headline of the hero. Mobile keeps the
   smaller mobile rule from line ~17392 untouched.
============================================================ */
@media (min-width: 1025px) {
  .va__hero-meta-value {
    font-size: clamp(2rem, 2.6vw, 2.5rem) !important;
    line-height: 1.05 !important;
    letter-spacing: -0.02em !important;
  }
  .va__hero-meta-label {
    font-size: 0.75rem !important;
    letter-spacing: 0.18em !important;
  }
}
@media (max-width: 1024px) {
  /* Mobile bump too — was 1rem→1.25rem, now 1.5rem→2rem so the
     hero stats remain the dominant element on phones. */
  .va__hero-meta-value {
    font-size: clamp(1.5rem, 5.4vw, 2rem) !important;
    line-height: 1.05 !important;
  }
}

/* ============================================================
   Wave 43 — three follow-up fixes:
   43.1  Homepage case-card stretched-link. Wave 37.1 used
         .case-card__media::after for the stretched click area,
         but a pre-existing rule at line ~2602 already declares
         that pseudo as the bottom scrim gradient — same
         specificity, so the body of the card was unreachable.
         Re-implement using .case-card__readmore::before, which
         has no prior declaration. Click anywhere on the card,
         body included, fires the readmore anchor's href.
   43.2  About page hero → next section spacing. Wave 42 used
         the adjacent-sibling combinator, but inline whitespace
         text nodes between the two <section> elements broke it
         on some browsers. We add stronger padding-top directly
         on the named about-page sections.
   43.3  Tablet vertical hero imagery — projects.html picture
         sources now scope to (max-width: 767px) so iPad +
         landscape phones land on the horizontal hero. The
         vertical asset only loads on portrait phones.
============================================================ */
.case-card { position: relative; }
.case-card__readmore {
  position: relative;
  z-index: 2;
}
.case-card__readmore::before {
  content: "";
  position: absolute;
  inset: -9999px -9999px -9999px -9999px;
  /* The pseudo is anchored to the readmore anchor, but with
     huge negative insets it stretches OUT to fully cover the
     parent .case-card. Width/height are NOT set explicitly —
     the inset values clip naturally to the .case-card box
     because that is the nearest positioned ancestor. */
  inset: 0;
  z-index: 0;
  pointer-events: auto;
}
/* Stretch via the .case-card relative ancestor: the readmore is
   inside .case-card__body, but its ::before with position:
   absolute resolves against the closest positioned ancestor.
   We pin .case-card as that ancestor, so ::before fills the
   entire card. */
.case-card__readmore { position: static; }
.case-card__readmore::before {
  position: absolute;
  inset: 0;
}
/* Workaround: anchor the stretched pseudo on .case-card itself
   via an additional fallback, in case ::before-on-anchor has
   any quirks. */
.case-card a.case-card__readmore::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0; bottom: 0;
  z-index: 1;
}
/* Restore z-index for visible elements above the stretched link
   but below typical content so cursor still reads clickable. */
.case-card__media,
.case-card__body > * {
  position: relative;
  z-index: 2;
}
.case-card__readmore > * {
  position: relative;
  z-index: 3;
}
/* Make the cursor read as a link anywhere on the card. */
.case-card,
.case-card * {
  cursor: pointer;
}
.case-card a:focus-visible {
  outline: 2px solid var(--color-accent, #de322d);
  outline-offset: 4px;
}

/* 43.2 About page (and similar inner pages) — much heavier
   spacing between hero and first body section. Earlier
   72-120px was still reading as crowded. Bumped to a hard
   minimum of 120px on mobile and up to 200px on tablet. */
@media (max-width: 1024px) {
  .about-story-v2,
  .about-stats,
  .about-press,
  .about-timeline,
  .about-values,
  .about-blend,
  .about-approach,
  .about-founders,
  .about-press-features,
  .work-with-us,
  .contact-form-section,
  .va__intro-section,
  .ps__intro,
  .approach__intro,
  .case-studies__intro {
    padding-top: clamp(120px, 22vw, 200px) !important;
    margin-top: 0 !important;
    border-top: 0 !important;
  }
}

/* ============================================================
   Wave 46 — case-study SINGLES top-fade darken.
   Same .va__hero ::before treatment as the case-studies index
   rotator (Wave 40.2). Applies to villa-apollon, ck-realtors,
   estate-prive, punctum-interiors single pages. Covers the
   bright sky / bright photo area behind the wordmark.
============================================================ */
@media (max-width: 1024px) {
  .va__hero {
    position: relative !important;
  }
  .va__hero::before {
    content: "" !important;
    display: block !important;
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    height: 220px !important;
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.78) 0%,
      rgba(0,0,0,0.55) 35%,
      rgba(0,0,0,0.25) 70%,
      rgba(0,0,0,0) 100%
    ) !important;
    z-index: 2 !important;
    pointer-events: none !important;
  }
}

/* ============================================================
   Wave 45 — FAQ + footer colour fix.
   - FAQ section: WHITE.
   - FAQ items: WHITE (not gray) — only a gray stroke border
     around each card so they read as cards on the white
     background.
   - Footer (.altfooter): BLACK as originally designed (was
     incorrectly set to white on the previous pass).
============================================================ */
.faq,
.section.faq {
  background: #ffffff !important;
}
.faq-item {
  background: #ffffff !important;
  border: 1px solid rgba(10,10,10,0.18) !important;
}
.faq-item:hover {
  background: #fbfbfb !important;
  border-color: rgba(10,10,10,0.28) !important;
}
.faq-item[data-open] {
  background: #fafafa !important;
  border-color: rgba(10,10,10,0.32) !important;
}
/* Footer kept on its original dark ink palette. */
.altfooter,
.altfooter-banner {
  background: var(--color-ink, #0a0a0a) !important;
  color: var(--color-text-invert, rgba(255,255,255,0.92)) !important;
}

/* ============================================================
   Wave 42 — universal "white space after hero" rule for
   mobile + tablet. Body copy was crashing into the bottom of
   every hero across pages (about, contact, case studies,
   project singles…). We add a generous top margin to the
   FIRST section that follows any hero variant on <=1024px.
   Desktop unchanged (its rhythm already works).
============================================================ */
@media (max-width: 1024px) {
  /* Hero → next section. The padding-top creates the white
     space INSIDE the next section. The margin-top was creating
     a visible white BAND between the hero (dark) and the next
     section (white) because the body bg leaks through margin
     space — REMOVED. Hero now touches the next section flush. */
  .hero + section,
  .hero + main > section:first-child,
  .va__hero + section,
  .cs-hero + section,
  .about-hero + section,
  .pj-hero + section,
  .ct-hero + section,
  .ej-hero + section,
  .ak-hero + section,
  .cmp__hero + section,
  .approach-hero + section,
  .approach__hero + section,
  .case-studies__hero + section,
  .projects__hero + section,
  .proj-transform--hero + section,
  .contact-page-hero + section,
  .about-page-hero + section {
    padding-top: clamp(120px, 22vw, 200px) !important;
    margin-top: 0 !important;
  }
  /* The header inside the contact form (and any cform pagehead)
     also gets its own top breathing room so the title does not
     hug the section's top edge. */
  .cform-pagehead {
    padding-top: clamp(20px, 4vw, 32px) !important;
    margin-top: clamp(8px, 2vw, 16px) !important;
  }
  /* Trusted strip — kill any inherited margin so it sits flush
     under the hero. Padding-block stays as set above so there's
     still room around the logos. */
  .trusted {
    margin: 0 !important;
  }
}

/* ============================================================
   Wave 41 — lock the floating nav (House of Advanced wordmark
   + hamburger row) at the exact same position across every
   page on mobile and tablet. The home page sits the wordmark
   at top:0 with padding 18px from Wave 31/34.2; inner pages
   were drifting lower because hero-specific containers added
   their own padding above the nav. We force every hero
   variant's .nav.nav--floating to sit flush at the top edge.
============================================================ */
@media (max-width: 1024px) {
  /* Ensure every hero is a positioning context so position:absolute
     on its .nav anchors to the hero box (and scrolls away with it). */
  .hero,
  .va__hero,
  .cs-hero,
  .about-hero,
  .pj-hero,
  .ct-hero,
  .ej-hero,
  .ak-hero,
  .cmp__hero,
  .proj-transform--hero,
  .approach__hero,
  .approach-hero,
  .case-studies__hero,
  .projects__hero,
  .about-page-hero,
  .contact-page-hero,
  .journal-page-hero {
    position: relative !important;
  }

  /* Logo / nav — pinned to the TOP-LEFT of the hero (absolute,
     not fixed) so it scrolls away with the hero photo instead of
     sticking to the viewport. Same coordinates on every page on
     mobile/tablet: top:18px from the hero edge, left:clamp(20,4vw,32). */
  .hero .nav,
  .hero .nav.nav--floating,
  .va__hero .nav,
  .va__hero .nav.nav--floating,
  .cs-hero .nav,
  .cs-hero .nav.nav--floating,
  .about-hero .nav,
  .about-hero .nav.nav--floating,
  .about-page-hero .nav,
  .contact-page-hero .nav,
  .pj-hero .nav,
  .pj-hero .nav.nav--floating,
  .ct-hero .nav,
  .ct-hero .nav.nav--floating,
  .ej-hero .nav,
  .ej-hero .nav.nav--floating,
  .ak-hero .nav,
  .ak-hero .nav.nav--floating,
  .cmp__hero .nav,
  .cmp__hero .nav.nav--floating,
  .proj-transform--hero .nav,
  .proj-transform--hero .nav.nav--floating,
  .approach__hero .nav,
  .approach__hero .nav.nav--floating,
  .approach-hero .nav,
  .approach-hero .nav.nav--floating,
  .case-studies__hero .nav,
  .case-studies__hero .nav.nav--floating,
  .projects__hero .nav,
  .projects__hero .nav.nav--floating,
  .journal-page-hero .nav {
    /* CHANGED: was position: fixed (stuck to viewport on scroll
       and stayed visible). Now position: absolute — anchored to
       the hero box, scrolls away naturally when the user scrolls
       past the hero. Hamburger remains its own fixed element. */
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    bottom: auto !important;
    padding: 18px clamp(20px, 4vw, 32px) 0 !important;
    margin: 0 !important;
    min-height: 70px !important;
    z-index: 50 !important;
    display: flex !important;
    align-items: center !important;
    background: transparent !important;
  }
  .nav .nav__brand,
  .nav.nav--floating .nav__brand {
    margin: 0 !important;
    padding: 0 !important;
    transform: none !important;
    align-self: center !important;
  }
  .nav .nav__brand img,
  .nav.nav--floating .nav__brand img {
    height: 44px !important;
    width: auto !important;
    display: block !important;
  }
}

/* ============================================================
   Wave 40 — defensive process-section title visibility +
   case-studies page hero scrim deeper-at-top.
   ----------------------------------------------------------------
   40.1 Wave 15 (line ~17348) collapses .hstep__title with
        max-height:0 by default on mobile, and only expands it
        when .hstep gets .is-open. That depends on the accordion
        JS having already injected .hstep__header and added
        .is-open to step 01. If the JS misfires or runs late,
        every title clips to 0 and the process section reads as
        seven empty bordered rows. We force the title to stay
        visible regardless of JS state — only .hstep__desc and
        .hstep__deliverables collapse, which is the actual
        accordion behaviour we want anyway.
   40.2 The case-studies page hero scrim was reading too light
        at the very top of the photo (sky visible behind the
        wordmark on bright slides). Bumped the top stop from
        0.62 → 0.85 so the wordmark sits on a deeper darken.
============================================================ */
@media (max-width: 1024px) {
  /* 40.1 Title always visible — accordion collapses the body
     only, not the heading. */
  .approach--hscroll .hstep__title,
  .approach--hscroll .hstep .hstep__title,
  .approach.approach--hscroll .hstep__title {
    max-height: none !important;
    overflow: visible !important;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }
  /* 40.2 Case-studies hero — RESTORED top-edge darken via
     .cs-hero::before, but moderate this time (75% at top
     fading to 0 by 200px). Covers ONLY the wordmark area at
     the very top — the rest of the photo reads natural. */
  .cs-hero__bg-layer,
  .cs-hero__bg-layer.is-active {
    filter: none !important;
    -webkit-filter: none !important;
  }
  .cs-hero::before {
    content: "" !important;
    display: block !important;
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    height: 220px !important;
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.78) 0%,
      rgba(0,0,0,0.55) 35%,
      rgba(0,0,0,0.25) 70%,
      rgba(0,0,0,0) 100%
    ) !important;
    z-index: 2 !important;
    pointer-events: none !important;
  }
  .cs-hero__overlay {
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.18) 0%,
      rgba(0,0,0,0.10) 35%,
      rgba(0,0,0,0.20) 65%,
      rgba(0,0,0,0.55) 100%
    ) !important;
    inset: -2px !important;
  }
}

/* ============================================================
   Wave 39 — marquee speeds, MOBILE/TABLET ONLY.
   Desktop reverted to the originals (.trusted = 90s, .marquee
   --reviews = 75s) so the desktop preview reads exactly as it
   did before. The 15%-faster trusted strip and the 30%-slower
   reviews strip apply only at <=1024px where the user reported
   the sticking + speed issues.
============================================================ */
@media (max-width: 1024px) {
  /* Trim vertical padding on the trusted strip so the empty
     bands above/below the logo row collapse. Was ~80-120px
     vertical, now 32-56px — strip stays a one-row band, no
     wide empty space. */
  .trusted {
    padding-block: clamp(28px, 5vw, 56px) !important;
  }
  .trusted__inner {
    gap: clamp(16px, 4vw, 28px) !important;
  }

  /* Trusted-by logos — proper flow speed on mobile/tablet.
     Removed GPU compositing tricks (translateZ / will-change /
     backface) because they were forcing iOS Safari to render
     the strip on a separate compositing layer where the
     `filter: brightness(0) invert(1)` chain on the imgs went
     opaque-black instead of inverted-white. Plain animation
     with no transform-promotion keeps the white logos visible. */
  .trusted__track {
    animation-duration: 50s !important;
    animation-play-state: running !important;
  }
  /* Make sure the white-invert filter resolves on each <img>
     even while the parent is animating. */
  .trusted__track img {
    filter: brightness(0) invert(1) opacity(0.85) !important;
    -webkit-filter: brightness(0) invert(1) opacity(0.85) !important;
    opacity: 1 !important;
  }
  /* Reviews — much slower than desktop (75s → 130s) on
     mobile/tablet so each card has time to read on the
     smaller viewport. Earlier 85s was still too quick per
     user direction. */
  .marquee--reviews .marquee__track {
    --marquee-duration: 130s !important;
    animation-duration: 130s !important;
    animation-play-state: running !important;
  }
  /* Hide the redundant secondary close button inside the side
     menu — the hamburger itself transforms into an X via
     .hamburger.is-open and is the canonical close target. The
     double-X was confusing visitors. */
  .side-menu__close {
    display: none !important;
  }
  /* === Case-studies + every other inner-page hero — kill the
     light strip above the photo at the very top of the page.
     The body's paper background and the page-frame's margin
     were leaking through above the .cs-hero / .va__hero. Pin
     the hero flush to viewport top and paint a black backdrop
     behind it so any 1-2px slip stays invisible. */
  .cs-hero,
  .va__hero,
  .about-hero,
  .about-page-hero,
  .contact-page-hero,
  .approach-hero,
  .pj-hero,
  .ct-hero,
  .ej-hero,
  .ak-hero,
  .cmp__hero,
  .proj-transform--hero,
  .case-studies__hero,
  .projects__hero {
    margin-top: 0 !important;
    padding-top: 0 !important;
    background: #0a0a0a !important;
  }
  /* The aggressive `background-color: #0a0a0a !important` on
     body / html / page-frame and the matching paper-bg
     override on the next section was BLEEDING into the footer
     (turned it all-black) and adding a black line strip in the
     about section between the quote and the founders block.
     REMOVED. The bright top strip is handled by:
       1. <meta name="theme-color" content="#0a0a0a">  (iOS chrome)
       2. The html::before absolute cap (140px black at top)
       3. The .cs-hero::before top-edge darken (28% of hero)
     None of those touch global page colors, so the footer + the
     about section / quote layout return to their original look. */
  /* Dark cap at the top of the document — covers the bright
     strip above the hero on inner pages. CHANGED from
     position:fixed to position:absolute so it scrolls AWAY
     with the page (no more "black bar following the image"
     on scroll-down). The cap is anchored to the html element,
     paints the top 140px of the document, and goes off-screen
     naturally after the user scrolls past the hero. */
  html { position: relative; }
  html::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 140px;
    background: #0a0a0a;
    z-index: 0;
    pointer-events: none;
  }
  /* Wordmark + nav above the cap. */
  .nav, .nav.nav--floating { z-index: 50 !important; }
  /* The "first section after hero gets paper bg" override was
     paired with the global black bg removed above — also
     removed since it's no longer needed. Sections keep their
     original backgrounds. */
  /* Belt-and-braces: extend the existing scrim envelopes all
     the way to coordinate 0,0 (no transparent gap above the
     declared inset:0). */
  .cs-hero__overlay,
  .va__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim {
    top: -1px !important;
    left: -1px !important;
    right: -1px !important;
    bottom: -1px !important;
  }
}

/* ============================================================
   Wave 36 — full-coverage hero scrim envelope.
   Wave 24.1 set a one-way `to top` gradient that left the very
   top of every mobile hero (the strip behind the brand wordmark
   and hamburger) at only ~22% black, so on bright skies the
   logo had no proper backdrop. Replace with a 3-phase
   envelope: dark at the top (nav), light through the photo,
   dark at the bottom (title). Also apply the same envelope to
   the projects-page mobile hero overlay (was a flat 0.45) so
   the title there reads cleanly and the photo is darkened
   uniformly.
   Mobile + tablet only — desktop scroll-driven hero stays as
   designed.
============================================================ */
@media (max-width: 1024px) {
  .cs-hero__overlay,
  .va__hero-scrim,
  .ck__hero-scrim,
  .ep__hero-scrim,
  .pi__hero-scrim,
  .about-hero__overlay,
  .ct-hero__overlay,
  .ej-hero__overlay,
  .ak-hero__overlay,
  .pj-hero__overlay {
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.62) 0%,
      rgba(0,0,0,0.42) 12%,
      rgba(0,0,0,0.22) 32%,
      rgba(0,0,0,0.28) 55%,
      rgba(0,0,0,0.58) 78%,
      rgba(0,0,0,0.82) 100%
    ) !important;
  }

  /* Projects mobile hero — RESTORED full-photo darken envelope.
     Combined with 36.x kill below of the fixed-position
     .proj-transform--hero::before (the one that animated
     translateY+opacity on body.nav-hidden, producing the
     "pop-out" the user reported), this is the ONLY scrim on
     the projects page mobile hero. It is anchored to the photo
     (position:absolute inset:0) so it scrolls with the image —
     no fixed positioning, no transition, no disappear pop. */
  .proj-transform__mobile-overlay {
    display: block !important;
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.42) 0%,
      rgba(0,0,0,0.28) 18%,
      rgba(0,0,0,0.18) 40%,
      rgba(0,0,0,0.32) 60%,
      rgba(0,0,0,0.62) 82%,
      rgba(0,0,0,0.82) 100%
    ) !important;
  }

  /* KILL the legacy .proj-transform--hero::before (line ~10666)
     which sat position:fixed at the top and faded out with
     translateY+opacity when body.nav-hidden was set. That is
     exactly the "pop-out" disappearance the user did not want.
     On mobile/tablet we drop it entirely. Desktop keeps it via
     the original rule (no override applies there). */
  .proj-transform--hero::before {
    content: none !important;
    display: none !important;
    transition: none !important;
    transform: none !important;
    opacity: 0 !important;
    height: 0 !important;
  }
}

/* ============================================================
   Wave 37 — homepage case-study cards click anywhere + process
   accordion single-toggle + contact hero scrim safety net.
   ----------------------------------------------------------------
   37.1  Whole .case-card is clickable (desktop + mobile). The
         existing .case-card__media anchor extends a stretched
         pseudo over the whole article so taps on the body /
         stats / kicker / "Read more" all route to the case
         study page. Read-more anchor stays for accessibility.
   37.2  Approach (home process) accordion on mobile/tablet:
         hide the duplicate "+" sign on .hstep__header (Wave
         18.4 / 16.X had a chunky text-mark on the header AND
         a thin-line mark on the title). Keep the thin cross on
         .hstep__title::after as the only visible toggle.
   37.3  Contact-page hero ::after safety scrim — the
         .about-hero__overlay sits at z-index:-1 inside an
         `isolation: isolate` panel, which should work, but on
         iOS Safari with the panel's stacking context the
         overlay can render below the bg image. Added a second
         scrim via .contact-page-hero .about-hero__panel::after
         that sits at z-index:1 (above bg, below content) so
         the darken always shows.
============================================================ */

/* 37.1 case cards — stretched link */
.case-card { position: relative; }
.case-card__media::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: auto;
}
.case-card__body,
.case-card__readmore,
.case-card__title,
.case-card__stats,
.case-card__kicker {
  position: relative;
  z-index: 2;
}
/* Cursor cue: every part of the card reads as clickable. */
.case-card { cursor: pointer; }
.case-card__body * { cursor: pointer; }
/* Read-more anchor stays a real <a> for keyboard + screen
   readers; visual hover still independent. */
.case-card__readmore { pointer-events: auto; }

/* 37.2 process accordion — kill the duplicate header "+" so
   only the thin cross on .hstep__title remains. */
@media (max-width: 1024px) {
  .approach.approach--hscroll .hstep__header::after {
    content: none !important;
    display: none !important;
  }
}

/* 37.3 contact hero — extra scrim layer above bg, below text */
@media (max-width: 1024px) {
  .contact-page-hero .about-hero__panel {
    position: relative;
  }
  .contact-page-hero .about-hero__panel::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(
      to bottom,
      rgba(0,0,0,0.55) 0%,
      rgba(0,0,0,0.32) 18%,
      rgba(0,0,0,0.22) 50%,
      rgba(0,0,0,0.45) 80%,
      rgba(0,0,0,0.72) 100%
    );
    z-index: 1;
    pointer-events: none;
  }
  /* Lift content above the safety scrim. */
  .contact-page-hero .about-hero__panel > nav,
  .contact-page-hero .about-hero__panel > .about-hero__center,
  .contact-page-hero .about-hero__panel > .about-hero__meta {
    position: relative;
    z-index: 2;
  }
}

/* 37.4 projects page — fixed top scrim DOM element kept in
   markup but never paints. The legacy .proj-transform--hero
   ::before (line ~10666) was the actual culprit behind the
   "pop-out disappear" — it is killed in the 36.x block above
   on mobile. */
.pj-fixed-topscrim { display: none !important; }
@media (max-width: 1024px) {
  .pj-fixed-topscrim { display: none !important; }
}

/* 37.5 projects-grid card title — MOBILE/TABLET ONLY bump.
   Desktop unchanged. Wave 22.5 set
     .projects-grid__cell h3 { font-size: clamp(.875rem, 3.6vw, 1.05rem) !important }
   which has higher specificity than the plain .projects-grid__name
   class — that is why earlier bumps did not show. We now write the
   override at matching/higher specificity (.projects-grid__cell h3
   .projects-grid__name) so it wins. */
@media (max-width: 1024px) {
  .projects-grid__cell h3.projects-grid__name,
  .projects-grid__cell .projects-grid__name {
    /* -20% from the previous bump (was clamp(2.125, 8.6vw, 2.875)). */
    font-size: clamp(1.7rem, 6.9vw, 2.3rem) !important;
    line-height: 1.1 !important;
    letter-spacing: -0.015em !important;
    margin: 0 !important;
  }
  /* Restore the original row layout: title left, valuation right
     (no wrap). */
  .projects-grid__row--head {
    flex-wrap: nowrap !important;
    align-items: flex-start !important;
    justify-content: space-between !important;
    gap: var(--space-4) !important;
  }
  .projects-grid__valuation {
    text-align: right !important;
    align-items: flex-end !important;
    margin-top: 4px !important;
  }
}

/* ============================================================
   Wave 48 — case-card scrim restoration + analytics readiness.
   ----------------------------------------------------------------
   48.1  Restore the bottom-scrim positioning on .case-card__media
         ::after. Wave 37.1 set inset: 0 on the same pseudo to make
         it a stretched click-area; that worked, but combined with
         the original height: 42% it forced the dark gradient to
         render on the TOP of the image instead of the bottom on
         photos with bright skies (visible on Villa Apollon + CK
         Realtors home tiles). Wave 43.1 already moved the click-
         area to .case-card__readmore::before, so the inset: 0 on
         media::after is now obsolete AND harmful. Pin the pseudo
         back to the bottom and soften the opacity a notch
         (0.58 → 0.42) so the meta-overlay (date + tag) still
         reads but the dark band is no longer obtrusive on bright
         photos.
============================================================ */

.case-card__media::after {
  top: auto;
  inset: auto;
  left: 0;
  right: 0;
  bottom: 0;
  height: 42%;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0) 100%);
  pointer-events: none;
}


/* ============================================================
   Wave 54 — marquee speed + logo strip clone fix.
   ----------------------------------------------------------------
   54.1  Reviews marquee was running at 75s per loop, which on a
         480-1200px viewport caused each card to scroll past in
         ~3-4 sec. Visitors could not finish reading a quote.
         Slow to 180s per loop on both home + about page. About
         2.4x more dwell time per card, still continuous motion,
         still pauses on hover. No layout change.

   54.2  Trusted client logos strip (.trusted__track on the home
         page) animates with translateX(-50%) keyframe, which
         expects the children to be duplicated for a seamless
         loop. They were not — only 14 logos in the DOM, half-
         way through the loop the second half rendered as
         empty space (logos vanish). Fix: opt the strip into the
         same JS marquee init as the reviews carousel by adding
         data-marquee + data-marquee-track attributes on the
         markup (HTML side). The JS already clones children for
         any [data-marquee] block. The trusted-specific CSS
         keyframe + duration stay unchanged.
============================================================ */

.marquee--reviews .marquee__track {
  --marquee-duration: 90s;     /* desktop: faster, stays continuous */
}

/* ============================================================
   Wave 55 — responsive marquee speeds (logos + reviews).
   ----------------------------------------------------------------
   Desktop: punchier, brand-energetic flow.
   Mobile + tablet (<=1024px): slower so visitors have time to
   read each card on small viewports without scroll motion sickness.
============================================================ */

/* Trusted-clients logo strip — desktop pace bumped slightly faster
   than the original 90s base so the line feels alive on big screens. */
.trusted__track {
  animation-duration: 70s;
}

@media (max-width: 1024px) {
  .marquee--reviews .marquee__track {
    --marquee-duration: 180s;     /* tablet/mobile: slower for readability */
  }
  .trusted__track {
    animation-duration: 140s;     /* tablet/mobile: slower */
  }
}

/* ============================================================
   Wave 56 — case-studies hero mobile fit + FAQ open-state breathe
   ----------------------------------------------------------------
   56.1  case-studies.html hero (.cs-hero) on mobile/tablet
         <=1024px. Wave 16 cap'd height to 80vh / min-height 540px.
         The dark overlay + bg-layer were inset:0 over the hero,
         but on iOS Safari with dynamic toolbars the section's
         100vh fallback occasionally left a sliver of body bg
         visible above the wordmark when the URL bar collapsed.
         Lock the hero to 100dvh on mobile so it tracks the live
         viewport, kill any inherited padding/margin on the
         section, and pull the overlay + bg-layer to extend
         above the safe-area-inset-top (negative margin) so the
         dark gradient is full-bleed even under the iOS notch.

   56.2  FAQ accordion (.faq-item__body-inner) — when an answer
         is open, the pad-bottom of clamp(18px..26px) reads as
         too tight on mobile when the answer wraps to 6+ lines
         (visible as the answer text touching the next item's
         hairline). Bump the open-state pad-bottom on
         <=1024px and add a small 6px gap between adjacent
         .faq-item siblings so the closed-state stack also
         breathes a touch more.
============================================================ */

@media (max-width: 1024px) {
  /* 56.1 — case-studies hero full-bleed mobile */
  .cs-hero {
    height: 100dvh !important;          /* dynamic viewport, accounts for iOS bar */
    min-height: 100dvh !important;
    max-block-size: none !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  .cs-hero__background,
  .cs-hero__overlay {
    inset: 0 !important;
    margin-top: calc(-1 * env(safe-area-inset-top, 0px)) !important;
    height: calc(100% + env(safe-area-inset-top, 0px)) !important;
  }

  /* 56.2 — FAQ accordion open-state breathing room */
  .faq-item__body-inner {
    padding-bottom: clamp(28px, 4vw, 40px) !important;
  }
  .faq-list .faq-item + .faq-item {
    margin-top: 6px;
  }
}

/* ============================================================ */
/* Wave 58 — remove gradient wash on hero "Luxury Real Estate".   */
/* The white→grey linear-gradient + background-clip: text was     */
/* letting the video bleed through, reading as a blue/pale band   */
/* instead of solid white like "Leading" and "Marketing Agency".  */
/* Restore solid white to match the surrounding title.            */
/* ============================================================ */
.hero__title-lux,
.hero__title-lux .word {
  background-image: none !important;
  -webkit-text-fill-color: currentColor !important;
  color: #ffffff !important;
}
