/* ==========================================================================
   No Fat Creative — Editorial White design system
   White (#fff/#fafaf8) ground, near-black ink (#0a0a0a), grey (#5a5a5a),
   hairlines (#e8e8e4). Cormorant Garamond (serif display) + Inter (sans).
   Mobile-first, accessible, reduced-motion aware, JS-gated reveals.
   Fonts are loaded via <link> in the page <head> (see build.py) — not @import,
   which would block rendering behind this stylesheet.
   ========================================================================== */

:root {
  --white: #ffffff;
  --off:   #fafaf8;
  --warm:  #f4f3ee;
  --ink:   #0a0a0a;
  --ink-2: #1b1b1b;
  --mid:   #5a5a5a;
  --soft:  #6e6e6a;
  --line:  #e8e8e4;
  --line-2:#dcdcd6;

  --serif: 'Cormorant Garamond', Georgia, 'Times New Roman', serif;
  --sans:  'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
  --ease:  cubic-bezier(0.22, 1, 0.36, 1);

  --pad: clamp(20px, 5vw, 48px);
  --maxw: 1320px;
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  background: var(--white);
  color: var(--ink);
  font-family: var(--sans);
  font-weight: 300;
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }

::selection { background: var(--ink); color: var(--white); }

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

.wrap { max-width: var(--maxw); margin: 0 auto; padding-left: var(--pad); padding-right: var(--pad); }

/* skip link --------------------------------------------------------------- */
.skip-link {
  position: absolute; left: -999px; top: 0; z-index: 200;
  background: var(--ink); color: var(--white);
  padding: 12px 18px; font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
}
.skip-link:focus { left: 12px; top: 12px; }

/* shared type ------------------------------------------------------------- */
.eyebrow {
  font-size: 10px; letter-spacing: 0.32em; text-transform: uppercase;
  color: var(--mid); font-weight: 400;
}
.eyebrow.line { display: inline-flex; align-items: center; gap: 14px; }
.eyebrow.line::before { content: ""; width: 7px; height: 7px; background: var(--ink); border-radius: 50%; flex: none; }

em { font-style: italic; }

/* =========================================================== NAV */
nav.site {
  position: fixed; top: 0; left: 0; right: 0; z-index: 100;
  display: flex; align-items: center; justify-content: space-between;
  height: 72px; padding: 0 var(--pad);
  background: rgba(255,255,255,0.92);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid transparent;
  transition: border-color 0.3s var(--ease), background 0.3s var(--ease);
}
nav.site.scrolled { border-bottom-color: var(--line); background: rgba(255,255,255,0.97); }

.nav-logo {
  font-family: var(--serif);
  font-size: 20px; font-weight: 400; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink);
}
.nav-logo b { font-weight: 600; font-style: italic; }
.nav-logo svg.brand { height: 42px; width: auto; display: block; text-transform: none; letter-spacing: normal; }
.nav-logo svg.brand .brand-word { font-family: var(--serif); }
.footer-brand .nav-logo svg.brand { height: 52px; }

.nav-links {
  display: flex; align-items: center; gap: 38px; list-style: none;
}
.nav-links a {
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--mid);
  transition: color 0.2s; position: relative; padding: 6px 0;
}
.nav-links a:hover, .nav-links a[aria-current="page"] { color: var(--ink); }
.nav-links a[aria-current="page"]::after {
  content: ""; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px; background: var(--ink);
}
.nav-cta {
  background: var(--ink); color: var(--white) !important;
  padding: 12px 26px; letter-spacing: 0.2em;
  transition: background 0.25s var(--ease);
}
.nav-cta:hover { background: var(--ink-2); }
.nav-cta::after { display: none !important; }

.nav-toggle {
  display: none; flex-direction: column; gap: 5px; width: 28px; height: 22px;
  background: none; border: none; cursor: pointer; padding: 0;
}
.nav-toggle span { display: block; height: 1px; width: 100%; background: var(--ink); transition: transform 0.3s var(--ease), opacity 0.3s; }
body.nav-open .nav-toggle span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
body.nav-open .nav-toggle span:nth-child(2) { opacity: 0; }
body.nav-open .nav-toggle span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* =========================================================== BUTTONS */
.btn-primary, .btn-outline, .btn-ghost {
  display: inline-block; font-family: var(--sans); font-size: 10px; font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase; cursor: pointer;
  padding: 14px 32px; transition: all 0.25s var(--ease); border: 1px solid transparent;
}
.btn-primary { background: var(--ink); color: var(--white); }
.btn-primary:hover { background: var(--ink-2); transform: translateY(-1px); }
.btn-outline { background: transparent; color: var(--ink); border-color: var(--ink); }
.btn-outline:hover { background: var(--ink); color: var(--white); }
.btn-ghost {
  background: transparent; color: var(--ink); border: none; padding: 0;
  border-bottom: 1px solid var(--ink); padding-bottom: 3px; letter-spacing: 0.16em;
}
.btn-ghost:hover { color: var(--mid); border-color: var(--mid); }

.link-arrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink);
  border-bottom: 1px solid var(--ink); padding-bottom: 3px; transition: gap 0.25s var(--ease);
}
.link-arrow:hover { gap: 18px; }

/* =========================================================== HERO (full-bleed cinema reel) */
.hero-cinema {
  position: relative; min-height: 100vh;
  display: flex; align-items: flex-end;
  overflow: hidden; background: #0a0a0c;
}
.hero-bg { position: absolute; inset: 0; z-index: 0; }
.hero-poster {
  position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%;
  object-fit: cover; filter: grayscale(0.1) contrast(1.02);
  transform-origin: 60% 45%; animation: heroKen 26s ease-in-out infinite alternate;
}
@keyframes heroKen { from { transform: scale(1.05); } to { transform: scale(1.16) translate(-2%, -1.5%); } }
@media (prefers-reduced-motion: reduce) { .hero-poster { animation: none; } }
.hero-video {
  position: absolute; z-index: 1; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 100vw; height: 56.25vw; min-height: 100vh; min-width: 177.78vh;
  border: 0; pointer-events: none; opacity: 0; transition: opacity 1.4s ease;
}
.hero-video.playing { opacity: 1; }      /* deferred reel fades in once it starts (poster shows first) */
.hero-video.reel-ended { opacity: 0; }   /* …then fades back to the poster when the reel ends */
.hero-scrim {
  position: absolute; inset: 0; z-index: 2;
  background:
    linear-gradient(180deg, rgba(8,8,10,0.55) 0%, rgba(8,8,10,0.05) 24%, rgba(8,8,10,0.12) 50%, rgba(8,8,10,0.9) 100%),
    linear-gradient(90deg, rgba(8,8,10,0.72) 0%, rgba(8,8,10,0) 58%);
}
.hero-grain {
  position: absolute; top: -50%; left: -50%; width: 200%; height: 200%;
  z-index: 3; pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='170' height='170'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 170px 170px;
  opacity: 0.2; mix-blend-mode: overlay;
  animation: heroGrain 0.7s steps(1) infinite; will-change: transform;
}
@keyframes heroGrain {
  0% { transform: translate(0,0); }   10% { transform: translate(-2%,-3%); }
  20% { transform: translate(-4%,2%); } 30% { transform: translate(2%,-4%); }
  40% { transform: translate(-3%,3%); } 50% { transform: translate(3%,-2%); }
  60% { transform: translate(-2%,4%); } 70% { transform: translate(4%,-3%); }
  80% { transform: translate(-4%,-2%); } 90% { transform: translate(2%,3%); }
  100% { transform: translate(0,0); }
}
@media (prefers-reduced-motion: reduce) { .hero-grain { animation: none; } }
.hero-inner {
  position: relative; z-index: 2; width: 100%; max-width: none;
  padding-top: 120px; padding-bottom: clamp(54px, 8vh, 116px);
}
.hero-cinema .eyebrow { color: rgba(255,255,255,0.82); margin-bottom: 26px; }
.hero-cinema .eyebrow.line::before { background: #fff; }
.hero-cinema .eyebrow.line { position: relative; padding-top: 26px; }
.hero-cinema .eyebrow.line::after {
  content: ""; position: absolute; top: 0; left: 0; width: 64px; height: 1px; background: rgba(255,255,255,0.55);
}
.hero-cinema h1 {
  font-family: var(--serif); font-weight: 300;
  font-size: clamp(56px, 8.8vw, 140px); line-height: 0.9; letter-spacing: -0.02em;
  color: #fff; margin-bottom: 30px; max-width: 16ch;
  text-shadow: 0 2px 60px rgba(0,0,0,0.35);
}
.hero-cinema h1 em { font-weight: 300; color: var(--gold, #c9a96e); }
.hero-cinema .hero-sub {
  font-size: 15px; line-height: 1.8; color: rgba(255,255,255,0.85);
  max-width: 460px; margin-bottom: 42px;
}
/* fade-up entrance */
.hero-inner > * { opacity: 0; transform: translateY(20px); animation: heroUp 0.9s cubic-bezier(.16,1,.3,1) forwards; }
.hero-inner .eyebrow { animation-delay: 0.06s; }
.hero-cinema h1 { animation-delay: 0.2s; }
.hero-cinema .hero-sub { animation-delay: 0.36s; }
.hero-actions { animation-delay: 0.5s; }
@keyframes heroUp { to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .hero-inner > * { opacity: 1; transform: none; animation: none; } }
.hero-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 22px; }
.hero-cinema .btn-primary { background: #fff; color: var(--ink); }
.hero-cinema .btn-primary:hover { background: rgba(255,255,255,0.86); }
.reel-cta {
  display: inline-flex; align-items: center; gap: 12px;
  font-family: var(--sans); font-size: 10px; font-weight: 500;
  letter-spacing: 0.2em; text-transform: uppercase; color: #fff;
  background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.5);
  padding: 13px 26px; cursor: pointer; transition: all 0.25s var(--ease);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.reel-cta:hover { background: #fff; color: var(--ink); border-color: #fff; }
.reel-cta svg { width: 13px; height: 13px; }
.reel-cta svg polygon { fill: currentColor; }
.hero-link { color: rgba(255,255,255,0.9); border-color: rgba(255,255,255,0.6); }
.hero-link:hover { color: #fff; border-color: #fff; }
.scroll-cue {
  position: absolute; bottom: 26px; left: 50%; transform: translateX(-50%); z-index: 3;
  font-size: 9px; letter-spacing: 0.3em; text-transform: uppercase; color: rgba(255,255,255,0.75);
}
.hero-sound {
  position: absolute; bottom: 24px; right: clamp(20px, 5vw, 48px); z-index: 4;
  display: inline-flex; align-items: center; gap: 11px;
  background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.32); color: #fff;
  padding: 10px 18px; cursor: pointer; border-radius: 999px;
  font: 500 9px/1 var(--sans); letter-spacing: 0.24em; text-transform: uppercase;
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  transition: background 0.3s var(--ease), color 0.3s var(--ease), border-color 0.3s var(--ease), transform 0.3s var(--ease);
}
.hero-sound:hover { background: #fff; color: var(--ink); border-color: #fff; transform: translateY(-2px); }
.hero-sound.on { border-color: var(--gold, #c9a96e); }
.hero-sound.on:hover { background: var(--gold, #c9a96e); color: #fff; border-color: var(--gold, #c9a96e); }
.hero-sound:focus-visible { outline: 2px solid #fff; outline-offset: 3px; box-shadow: 0 0 0 4px rgba(8,8,10,0.45); }
/* clean speaker icon: muted (slash) / on (gold + waves) / REPLAY (play triangle) — no fake reactivity */
.hs-ico { display: inline-flex; align-items: center; line-height: 0; }
.hs-spk, .hs-replay { width: 17px; height: 17px; display: block; }
.hs-replay { display: none; }
.hs-w1, .hs-w2 { display: none; }
.hero-sound.on .hs-mute { display: none; }
.hero-sound.on .hs-w1, .hero-sound.on .hs-w2 { display: inline; }
.hero-sound.on .hs-ico { color: var(--gold, #c9a96e); }
.hero-sound.on:hover .hs-ico { color: #fff; }
.hero-sound.reel-done .hs-spk { display: none; }
.hero-sound.reel-done .hs-replay { display: block; }
@media (max-width: 620px) { .hero-sound .hs-label { display: none; } .hero-sound { padding: 11px; } }

/* nav transparent + light while sitting over the cinema hero */
nav.site { padding-right: max(var(--pad), 34px); }
body:has(.hero-cinema) nav.site:not(.scrolled) {
  background: linear-gradient(180deg, rgba(8,8,10,0.6) 0%, rgba(8,8,10,0) 100%);
  -webkit-backdrop-filter: none; backdrop-filter: none;
  border-bottom-color: transparent;
}
/* white nav-link treatment is for the DESKTOP nav sitting transparently over the
   cinematic hero photo — on mobile (<921px) .nav-links instead becomes an opaque
   white dropdown panel (see the 920px breakpoint below), so white-on-white would
   make every link invisible. Scoped to min-width so the dropdown always keeps the
   default dark, readable link color regardless of hero/scroll state. */
@media (min-width: 921px) {
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-links a { color: rgba(255,255,255,0.95); font-weight: 500; }
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-links a:hover,
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-links a[aria-current="page"] { color: #fff; }
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-links a[aria-current="page"]::after { background: #fff; }
  /* .nav-cta lives inside the same <ul class="nav-links"> — on mobile that ul becomes
     an opaque white dropdown (see max-width:920px below), so a white pill button would
     vanish into it. Scoped to desktop only, where the CTA sits on the video nav bar. */
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-cta { background: #fff; color: var(--ink) !important; }
  body:has(.hero-cinema) nav.site:not(.scrolled) .nav-cta:hover { background: rgba(255,255,255,0.86); }
}
body:has(.hero-cinema) nav.site:not(.scrolled) .nav-logo .brand-word { fill: #fff; }
body:has(.hero-cinema) nav.site:not(.scrolled) .nav-toggle span { background: #fff; }

/* =========================================================== CLIENTS STRIP */
.clients {
  display: flex; align-items: center; border-bottom: 1px solid var(--line); flex-wrap: wrap;
}
.clients-label {
  padding: 26px var(--pad); border-right: 1px solid var(--line);
  font-size: 9px; letter-spacing: 0.28em; text-transform: uppercase; color: var(--mid);
  white-space: nowrap; flex: none;
}
.clients-list {
  display: flex; flex-wrap: wrap; gap: clamp(24px, 4vw, 56px);
  padding: 24px var(--pad); align-items: center;
}
.client-name {
  font-family: var(--serif); font-size: 19px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase;
  color: rgba(10,10,10,0.82); transition: color 0.25s; white-space: nowrap;
}
.client-name:hover { color: var(--ink); }
/* logo-ready: drop official transparent SVG/PNG into media/clients/ and point a
   client entry at it ({"name": "...", "logo": "media/clients/x.svg"}) — rendered
   as a unified monochrome mark that lifts to solid on hover. */
.client-logo { display: inline-flex; align-items: center; }
.client-logo img {
  height: 26px; width: auto; max-width: 140px; object-fit: contain;
  filter: brightness(0) opacity(0.62); transition: filter 0.25s;
}
.client-logo:hover img { filter: brightness(0) opacity(1); }

/* =========================================================== BLOCKS / SECTIONS */
.block { padding: clamp(64px, 9vw, 120px) 0; }
.section-header {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: 24px; margin-bottom: clamp(36px, 5vw, 64px);
  padding-bottom: 30px; border-bottom: 1px solid var(--line);
}
.section-title {
  font-family: var(--serif); font-weight: 300; font-size: clamp(34px, 5vw, 58px);
  line-height: 1; letter-spacing: -0.01em; color: var(--ink);
}
.section-title em { font-weight: 300; }
.section-link {
  font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--mid);
  border-bottom: 1px solid var(--line-2); padding-bottom: 4px; white-space: nowrap;
  transition: color 0.2s, border-color 0.2s;
}
.section-link:hover { color: var(--ink); border-color: var(--ink); }

/* =========================================================== WORK GRID (hard-bordered editorial cells) */
.work-grid {
  display: grid; grid-template-columns: repeat(3, 1fr);
  border-top: 1px solid var(--line); border-left: 1px solid var(--line);
}
.work-item {
  position: relative; display: block;
  border-right: 1px solid var(--line); border-bottom: 1px solid var(--line);
  background: var(--white); transition: background 0.3s var(--ease);
}
.work-item.is-hidden { display: none; }
.work-item:hover { background: var(--off); }
.work-thumb {
  position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--warm);
  display: flex; align-items: center; justify-content: center;
}
.work-thumb img {
  width: 100%; height: 100%; object-fit: cover;
  filter: grayscale(0.1) contrast(1.01);
  transition: transform 0.7s var(--ease), filter 0.5s var(--ease);
}
.work-item:hover .work-thumb img { transform: scale(1.04); filter: grayscale(0) contrast(1.03); }
.work-thumb.placeholder span {
  font-family: var(--serif); font-style: italic; font-size: 26px; color: rgba(10,10,10,0.16);
  padding: 0 16px; text-align: center;
}
.work-overlay {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  background: rgba(250,250,248,0.7); opacity: 0; transition: opacity 0.3s var(--ease);
  pointer-events: none;
}
.work-item:hover .work-overlay { opacity: 1; }
.work-overlay .view {
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink);
  border-bottom: 1px solid var(--ink); padding-bottom: 4px;
}
.work-meta {
  display: flex; justify-content: space-between; align-items: baseline; gap: 14px;
  padding: 18px 22px 20px;
}
.work-client { font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--soft); order: 2; }
.work-title { font-family: var(--serif); font-size: 19px; font-weight: 400; color: var(--ink); line-height: 1.15; }
.work-count-note {
  margin-top: 36px; font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--soft);
}

/* =========================================================== FILTERS */
.filters {
  display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: clamp(32px, 4vw, 52px);
}
.filter-btn {
  font-family: var(--sans); font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--mid); background: transparent; border: 1px solid var(--line-2);
  padding: 10px 22px; cursor: pointer; transition: all 0.22s var(--ease);
}
.filter-btn:hover { border-color: var(--ink); color: var(--ink); }
.filter-btn.active { background: var(--ink); border-color: var(--ink); color: var(--white); }

/* visually-hidden but exposed to assistive tech (live-region status) */
.sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0);
  white-space: nowrap; border: 0;
}

/* =========================================================== SPLIT / ABOUT */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(40px, 6vw, 88px); align-items: start; }
.about-headline {
  font-family: var(--serif); font-weight: 300; font-size: clamp(30px, 4.2vw, 50px);
  line-height: 1.08; letter-spacing: -0.01em; color: var(--ink);
  margin: 22px 0 26px;
}
.about-headline em { font-weight: 300; }
.about-body { font-size: 14px; line-height: 1.9; color: var(--mid); margin-bottom: 22px; max-width: 520px; }

.stats {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px;
  margin-top: 48px; padding-top: 40px; border-top: 1px solid var(--line);
}
.stat-number { font-family: var(--serif); font-size: clamp(38px, 5vw, 56px); font-weight: 300; line-height: 1; color: var(--ink); }
.stat-label { font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--mid); margin-top: 12px; }

/* =========================================================== LOCATIONS */
.locations { display: grid; gap: 14px; }
.location-card {
  border: 1px solid var(--line); padding: 26px 28px; background: var(--off);
  transition: border-color 0.3s var(--ease), background 0.3s;
}
.location-card:hover { border-color: var(--line-2); background: var(--warm); }
.location-city { font-family: var(--serif); font-size: 23px; font-weight: 400; color: var(--ink); margin-bottom: 10px; }
.location-detail { font-size: 13px; line-height: 1.7; color: var(--mid); }
.location-detail a { color: var(--ink); border-bottom: 1px solid var(--line-2); transition: border-color 0.2s; }
.location-detail a:hover { border-color: var(--ink); }

/* =========================================================== ABOUT — THREAD
   The About page's signature: one continuous vertical line runs through the
   narrative, the stats, and the studio list — enacting "two continents, one
   standard" instead of stating it in a separate boxed stats grid. The gold
   fill draws downward on scroll (JS sets its height); studio dots light up
   as the fill reaches them. prefers-reduced-motion: fully drawn, static. */
.about-thread { position: relative; max-width: 640px; margin: 0 auto; padding-left: 44px; }
.thread-rail { position: absolute; left: 0; top: 6px; bottom: 6px; width: 2px; background: var(--line); }
.thread-fill { position: absolute; left: 0; top: 6px; width: 2px; height: 0; background: var(--gold, #c9a96e); }
.thread-item { position: relative; padding: 44px 0; border-bottom: 1px solid var(--line); }
.thread-item:first-child { padding-top: 6px; }
.thread-item:last-of-type { border-bottom: none; }
.thread-stats { display: flex; flex-wrap: wrap; gap: 32px 48px; }
.thread-block .about-headline { margin-top: 14px; }
.thread-cities { display: flex; flex-direction: column; gap: 4px; }
.thread-cities-label { margin-bottom: 8px; }
.thread-city { position: relative; display: flex; align-items: flex-start; padding: 16px 0; }
.thread-dot {
  position: absolute; left: -48px; top: 25px; width: 10px; height: 10px; border-radius: 50%;
  background: var(--off); border: 2px solid var(--line-2);
  transition: background 0.4s var(--ease), border-color 0.4s var(--ease), transform 0.4s var(--ease);
}
.thread-city.lit .thread-dot { background: var(--gold, #c9a96e); border-color: var(--gold, #c9a96e); transform: scale(1.3); }
.thread-cities-cta { display: inline-flex; margin-top: 12px; }
.thread-end {
  position: relative; left: -47px; width: 8px; height: 8px; border-radius: 50%;
  background: var(--line-2); transition: background 0.4s var(--ease), transform 0.4s var(--ease);
}
.thread-end.lit { background: var(--gold, #c9a96e); transform: scale(1.5); }
@media (max-width: 640px) {
  .about-thread { padding-left: 32px; }
  .thread-dot { left: -36px; }
  .thread-end { left: -35px; }
}
.thread-links { display: flex; flex-wrap: wrap; gap: 14px 28px; }

/* =========================================================== TEAM */
.team-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 44px 32px; }
.team-portrait {
  width: 100%; aspect-ratio: 1; overflow: hidden; background: var(--warm);
  border: 1px solid var(--line); margin-bottom: 20px;
  display: flex; align-items: center; justify-content: center;
}
.team-portrait img { width: 100%; height: 100%; object-fit: cover; }
.team-initials { font-family: var(--serif); font-size: 17px; font-weight: 400; color: var(--soft); letter-spacing: 0.04em; }
.team-name { font-family: var(--serif); font-size: 22px; font-weight: 400; color: var(--ink); }
.team-title { font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--mid); margin-top: 6px; }
.team-bio { font-size: 13px; line-height: 1.7; color: var(--mid); margin-top: 12px; max-width: 320px; }

/* =========================================================== SERVICES LIST */
.services-list { border-top: 1px solid var(--line); }
.service-row {
  display: grid; grid-template-columns: 64px 1fr auto; gap: clamp(20px, 4vw, 48px);
  align-items: center; padding: clamp(26px, 3vw, 38px) 0; border-bottom: 1px solid var(--line);
  transition: padding-left 0.3s var(--ease), background 0.3s;
}
.service-row:hover { padding-left: 16px; background: var(--off); }
.service-num { font-family: var(--serif); font-size: 18px; color: var(--soft); font-style: italic; }
.service-name { font-family: var(--serif); font-size: clamp(24px, 3.2vw, 34px); font-weight: 400; color: var(--ink); margin-bottom: 8px; }
.service-desc { font-size: 13px; line-height: 1.75; color: var(--mid); max-width: 640px; }
.service-tag { font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--soft); text-align: right; white-space: nowrap; }

/* =========================================================== GALLERY */
/* category cover tiles — mosaic (natural height, nothing cropped) */
.gallery-cats { columns: 3 300px; column-gap: 22px; }
@media (max-width: 900px) { .gallery-cats { columns: 2 240px; } }
@media (max-width: 560px) { .gallery-cats { columns: 1; } }
.gcat { position: relative; display: block; break-inside: avoid; margin: 0 0 22px; overflow: hidden; background: #0a0a0c; }
.gcat > img { display: block; width: 100%; height: auto; transition: filter 0.5s var(--ease); }
.gcat:hover > img { filter: brightness(1.05); }
.gcat::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(8,8,10,0) 45%, rgba(8,8,10,0.86) 100%); transition: background 0.4s var(--ease); }
.gcat:hover::after { background: linear-gradient(180deg, rgba(8,8,10,0.05) 34%, rgba(8,8,10,0.9) 100%); }
.gcat-meta { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; padding: 26px; color: #fff; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.gcat-name { font-family: var(--serif); font-weight: 400; font-size: clamp(24px, 2.3vw, 32px); line-height: 1; }
.gcat-count { display: inline-flex; align-items: center; gap: 9px; font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; color: rgba(255,255,255,0.82); }
.gcat-count .ar { display: inline-block; transition: transform 0.3s var(--ease); }
.gcat:hover .gcat-count { color: #fff; }
.gcat:hover .gcat-count .ar { transform: translateX(5px); }

.gallery-nav-row { display: flex; align-items: center; justify-content: space-between; gap: 18px; }
@media (max-width: 560px) { .gallery-nav-row { flex-direction: column; gap: 22px; text-align: center; } }

.gallery-masonry { columns: 3 300px; column-gap: 22px; }
.gallery-fig {
  break-inside: avoid; margin: 0 0 22px; cursor: zoom-in;
  position: relative; overflow: hidden; background: var(--off);
  outline: none;
  /* reset native <button> chrome so masonry tiles render like the old <figure> */
  display: block; width: 100%; padding: 0; border: 0;
  font: inherit; color: inherit; text-align: inherit; -webkit-appearance: none; appearance: none;
}
.gallery-fig > img { width: 100%; height: auto; display: block; transition: transform 0.7s var(--ease), filter 0.5s; }
.gallery-fig:hover > img, .gallery-fig:focus-visible > img { transform: scale(1.045); }
.gallery-fig::after {
  content: ""; position: absolute; inset: 0; background: rgba(8,8,10,0); transition: background 0.4s var(--ease);
}
.gallery-fig:hover::after { background: rgba(8,8,10,0.06); }
.gallery-fig:focus-visible { box-shadow: 0 0 0 2px var(--ink); }
.gallery-cap { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; padding: 13px 2px 4px; }
.gallery-cap .g-name { font-family: var(--serif); font-style: italic; font-size: 17px; color: var(--ink); line-height: 1.1; }
.gallery-cap .g-tag { font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--soft); white-space: nowrap; }
@media (max-width: 900px) { .gallery-masonry { columns: 2 240px; } }
@media (max-width: 560px) { .gallery-masonry { columns: 1; } }

/* image lightbox */
.img-lb {
  position: fixed; inset: 0; z-index: 200; display: none;
  align-items: center; justify-content: center; padding: 6vh 6vw;
  background: rgba(8,8,10,0.93); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}
.img-lb.open { display: flex; }
.img-lb-inner { margin: 0; max-width: 100%; text-align: center; }
.img-lb-inner img { max-width: 100%; max-height: 84vh; object-fit: contain; box-shadow: 0 30px 90px rgba(0,0,0,0.55); }
.img-lb-inner figcaption { margin-top: 18px; font-family: var(--serif); font-style: italic; font-size: 17px; color: rgba(255,255,255,0.9); }
.img-lb-close {
  position: absolute; top: 22px; right: 30px; background: none; border: none;
  color: #fff; font-size: 36px; line-height: 1; cursor: pointer; opacity: 0.8; transition: opacity 0.2s; z-index: 2;
}
.img-lb-close:hover { opacity: 1; }
.img-lb-nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  background: none; border: none; color: #fff; font-size: 56px; line-height: 1;
  cursor: pointer; opacity: 0.55; transition: opacity 0.2s; padding: 10px 14px;
}
.img-lb-nav:hover { opacity: 1; }
.img-lb-nav.prev { left: 14px; }
.img-lb-nav.next { right: 14px; }
.img-lb-close:focus-visible, .img-lb-nav:focus-visible {
  outline: 2px solid #fff; outline-offset: 4px; border-radius: 3px; opacity: 1;
}
@media (max-width: 560px) { .img-lb-nav { font-size: 38px; padding: 6px 8px; } .img-lb { padding: 8vh 3vw; } }

/* =========================================================== PROCESS */
.process { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
.process-step { background: var(--white); padding: clamp(28px, 3vw, 44px); }
.process-step .n { font-size: 9px; letter-spacing: 0.24em; text-transform: uppercase; color: var(--soft); margin-bottom: 18px; }
.process-step h3 { font-family: var(--serif); font-size: 28px; font-weight: 400; color: var(--ink); margin-bottom: 14px; }
.process-step p { font-size: 13px; line-height: 1.75; color: var(--mid); }

/* dark-section override (services "process", about "numbers") — warm ink panel */
.block.invert { background: var(--ink); }
.block.invert .section-title, .block.invert .stat-number, .block.invert .process-step h3 { color: var(--white); }
.block.invert .section-header { border-bottom-color: rgba(255,255,255,0.14); }
.block.invert .stats { border-top-color: rgba(255,255,255,0.14); }
.block.invert .stat-label, .block.invert .process-step .n { color: rgba(255,255,255,0.5); }
.block.invert .process { background: rgba(255,255,255,0.12); border-color: rgba(255,255,255,0.12); }
.block.invert .process-step { background: var(--ink); }
.block.invert .process-step p { color: rgba(255,255,255,0.6); }

/* =========================================================== PAGE HERO */
.page-hero {
  padding: clamp(120px, 16vh, 180px) var(--pad) clamp(48px, 7vw, 80px);
  max-width: var(--maxw); margin: 0 auto; border-bottom: 1px solid var(--line);
}
.breadcrumb { font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--soft); margin-bottom: 28px; }
.breadcrumb a { color: var(--mid); border-bottom: 1px solid var(--line-2); padding-bottom: 2px; }
.breadcrumb a:hover { color: var(--ink); }
.page-hero h1 {
  font-family: var(--serif); font-weight: 300; font-size: clamp(46px, 7vw, 96px);
  line-height: 0.98; letter-spacing: -0.02em; color: var(--ink); margin-bottom: 26px;
}
.page-hero h1 em { font-weight: 300; }
.page-hero > p { font-size: 15px; line-height: 1.85; color: var(--mid); max-width: 640px; }

/* =========================================================== CTA BAND */
.cta-band {
  background: var(--ink); color: var(--white); text-align: center;
  padding: clamp(72px, 11vw, 140px) var(--pad);
}
.cta-headline { font-family: var(--serif); font-weight: 300; font-size: clamp(34px, 5.4vw, 68px); line-height: 1.05; letter-spacing: -0.01em; margin-bottom: 22px; }
.cta-headline em { color: #fff; font-weight: 300; }
.cta-sub { font-size: 14px; color: rgba(255,255,255,0.55); margin-bottom: 40px; }
.cta-actions { display: flex; flex-wrap: wrap; gap: 18px; justify-content: center; }
.cta-band .btn-primary { background: var(--white); color: var(--ink); }
.cta-band .btn-primary:hover { background: var(--off); }
.cta-band .btn-outline { color: var(--white); border-color: rgba(255,255,255,0.4); }
.cta-band .btn-outline:hover { background: var(--white); color: var(--ink); border-color: var(--white); }

/* =========================================================== CONTACT */
.contact-grid {
  display: grid; grid-template-columns: 0.85fr 1.15fr;
  max-width: var(--maxw); margin: 0 auto;
}
.contact-info {
  padding: clamp(48px, 6vw, 88px) clamp(28px, 4vw, 56px);
  border-right: 1px solid var(--line);
}
.contact-info .location-card { margin-bottom: 14px; }
.contact-form-col { padding: clamp(48px, 6vw, 88px) clamp(28px, 4vw, 56px); background: var(--off); }

.inquiry { display: grid; gap: 22px; }
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.field { display: flex; flex-direction: column; gap: 9px; }
.field label { font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--mid); }
.field input, .field select, .field textarea {
  font-family: var(--sans); font-size: 14px; color: var(--ink);
  background: var(--white); border: 1px solid var(--line-2);
  padding: 13px 14px; transition: border-color 0.2s; width: 100%;
}
.field input::placeholder, .field textarea::placeholder { color: var(--soft); }
.field input:focus, .field select:focus, .field textarea:focus { outline: none; border-color: var(--ink); }
.field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.field textarea { min-height: 150px; resize: vertical; }
.field select {
  -webkit-appearance: none; -moz-appearance: none; appearance: none;
  cursor: pointer; border-radius: 0; padding-right: 40px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%2314110d' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 15px center; background-size: 12px;
}
/* custom editorial dropdown (replaces the native menu via JS; native stays as no-JS fallback) */
.select-wrap { position: relative; }
.select-wrap select { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.select-btn {
  width: 100%; text-align: left; font-family: var(--sans); font-size: 14px; color: var(--ink);
  background: var(--white); border: 1px solid var(--line-2); padding: 13px 40px 13px 14px;
  cursor: pointer; position: relative; transition: border-color 0.2s;
}
.select-btn::after {
  content: ""; position: absolute; right: 15px; top: 50%; margin-top: -4px; width: 12px; height: 8px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%2314110d' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / 12px;
  transition: transform 0.25s var(--ease);
}
.select-wrap.open .select-btn { border-color: var(--ink); }
.select-wrap.open .select-btn::after { transform: rotate(180deg); }
.select-menu {
  position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 40;
  background: var(--white); border: 1px solid var(--line-2); box-shadow: 0 20px 50px rgba(10,10,10,0.1);
  opacity: 0; transform: translateY(-6px); pointer-events: none; max-height: 260px; overflow-y: auto;
  transition: opacity 0.2s var(--ease), transform 0.2s var(--ease);
}
.select-wrap.open .select-menu { opacity: 1; transform: none; pointer-events: all; }
.select-opt { padding: 11px 14px; font-size: 14px; color: var(--mid); cursor: pointer; transition: background 0.15s, color 0.15s; }
.select-opt:hover { background: var(--off); color: var(--ink); }
/* .hover = aria-activedescendant target (keyboard); stronger than :hover so the
   active option is unmistakable while DOM focus stays on the trigger button. */
.select-opt.hover { background: var(--warm); color: var(--ink); box-shadow: inset 3px 0 0 var(--ink); }
.select-opt[aria-selected="true"] { color: var(--ink); font-weight: 500; }
.select-opt[aria-selected="true"]::after { content: "\2713"; float: right; font-size: 12px; line-height: 1.4; }
/* empty placeholder option ("Select a …") — greyed, never shown as a chosen answer */
.select-opt.is-placeholder { color: var(--soft); }
.select-opt.is-placeholder[aria-selected="true"] { font-weight: 400; }
.select-opt.is-placeholder[aria-selected="true"]::after { content: none; }
.select-menu:focus { outline: none; }
@media (prefers-reduced-motion: reduce) {
  .select-menu { transition: none; }
  .select-btn::after { transition: none; }
}
.form-note { font-size: 11px; color: var(--soft); line-height: 1.6; }
.form-success {
  display: none; background: var(--ink); color: var(--white);
  padding: 18px 22px; font-size: 13px; letter-spacing: 0.02em; margin-bottom: 24px;
}
.form-success.show { display: block; }

/* =========================================================== CASE STUDY */
.case-hero {
  position: relative; margin-top: 72px; min-height: 64vh;
  display: flex; align-items: flex-end; overflow: hidden; border-bottom: 1px solid var(--line);
}
.case-hero img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: grayscale(0.12); }
.case-hero .hero-overlay { background: linear-gradient(180deg, rgba(8,8,10,0.15) 0%, rgba(8,8,10,0) 32%, rgba(8,8,10,0.5) 66%, rgba(8,8,10,0.9) 100%); }
.case-hero-inner { position: relative; z-index: 2; padding: clamp(40px, 6vw, 80px) var(--pad); max-width: var(--maxw); margin: 0 auto; width: 100%; }
.case-hero-inner .eyebrow { margin-bottom: 20px; color: rgba(255,255,255,0.85); }
.case-hero-inner .eyebrow.line::before { background: #fff; }
.case-hero-inner h1 { font-family: var(--serif); font-weight: 300; font-size: clamp(42px, 6.5vw, 88px); line-height: 1; letter-spacing: -0.02em; color: #fff; text-shadow: 0 2px 40px rgba(0,0,0,0.35); }

.case-facts {
  display: grid; grid-template-columns: repeat(4, 1fr);
  max-width: var(--maxw); margin: 0 auto; border-bottom: 1px solid var(--line);
}
.case-fact { padding: 30px var(--pad); border-right: 1px solid var(--line); }
.case-fact:last-child { border-right: none; }
.case-fact .k { font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--soft); margin-bottom: 10px; }
.case-fact .v { font-family: var(--serif); font-size: 19px; color: var(--ink); }

.prose { max-width: 760px; margin: 0 auto; padding: 0 var(--pad); }
.prose .lead { font-family: var(--serif); font-style: italic; font-size: clamp(22px, 3vw, 30px); line-height: 1.45; color: var(--ink); margin-bottom: 40px; }
.prose h2 { font-family: var(--serif); font-weight: 400; font-size: clamp(24px, 3vw, 32px); color: var(--ink); margin: 38px 0 16px; }
.prose p { font-size: 15px; line-height: 1.9; color: var(--mid); margin-bottom: 20px; }
.case-still { margin: clamp(48px, 6vw, 72px) auto 0; padding: 0 var(--pad); }
.case-still figcaption { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--soft); margin-top: 16px; text-align: center; }

/* =========================================================== FOOTER */
footer.site { border-top: 1px solid var(--line); background: var(--off); }
.footer-top {
  display: grid; grid-template-columns: 1.6fr 1fr 1fr 1.2fr; gap: 40px;
  padding-top: clamp(56px, 7vw, 88px); padding-bottom: clamp(48px, 6vw, 72px);
}
.footer-brand .nav-logo { display: inline-block; margin-bottom: 20px; }
.footer-brand p { font-size: 13px; line-height: 1.8; color: var(--mid); max-width: 320px; }
.footer-social { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 22px; }
.footer-social a { font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--mid); transition: color 0.2s; position: relative; }
.footer-social a:hover { color: var(--ink); }
.footer-social a::after { content: ""; position: absolute; left: 0; right: 0; bottom: -4px; height: 1px; background: var(--ink); transform: scaleX(0); transform-origin: left; transition: transform 0.25s var(--ease); }
.footer-social a:hover::after { transform: scaleX(1); }
.footer-col h4 { font-size: 9px; letter-spacing: 0.24em; text-transform: uppercase; color: var(--soft); margin-bottom: 18px; }
.footer-col ul { list-style: none; display: grid; gap: 11px; }
.footer-col a, .footer-col li { font-size: 13px; color: var(--mid); transition: color 0.2s; }
.footer-col a:hover { color: var(--ink); }
.footer-bottom {
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  padding-top: 26px; padding-bottom: 32px; border-top: 1px solid var(--line);
  font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--soft);
}

/* =========================================================== LIGHTBOX */
.lightbox {
  position: fixed; inset: 0; z-index: 300; display: none;
  align-items: center; justify-content: center; padding: 24px;
  background: rgba(250,250,248,0.96); backdrop-filter: blur(6px);
}
.lightbox.open { display: flex; }
.lightbox-frame { position: relative; width: min(1100px, 94vw); border: 1px solid var(--line-2); background: #000; }
.lightbox-ratio { position: relative; padding-top: 56.25%; }
.lightbox-ratio iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: none; }
/* short viewports (a phone rotated to landscape) — the width-driven 94vw/16:9 sizing
   above makes the video taller than the screen itself (e.g. 844x390 → a 506px-tall
   video, overflowing top AND bottom). Below a height threshold, size the video off
   the AVAILABLE height instead (viewport minus the lightbox's own 24px×2 padding and
   the caption bar) and let width follow from the aspect ratio, so it always fits.
   width is the smaller of the two candidates (94vw, or the width the available
   height implies) so aspect-ratio always derives height from a SINGLE explicit
   dimension — setting both an explicit height and a width clamp independently
   (as before) let either one win and distort the ratio when the other clamped.
   dvh, not vh: this is exactly the "rotate the phone" case Greg reported on his own
   iPhone, and Safari's address bar shows/hides across that rotation — vh uses the
   largest possible viewport (bar hidden), overestimating available height while the
   bar is still showing; dvh tracks the real, current one. */
@media (max-height: 500px) {
  .lightbox-frame { width: auto; max-width: 94vw; }
  .lightbox-ratio { width: min(94vw, calc((100dvh - 48px - 60px) * 16 / 9)); aspect-ratio: 16 / 9; padding-top: 0; margin: 0 auto; }
}
/* loading veil — covers the black iframe gap while Vimeo's player boots, fades out on load */
.lightbox-load { position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 16px; background: #08080a;
  opacity: 0; pointer-events: none; transition: opacity 0.3s var(--ease); }
.lightbox.loading .lightbox-load { opacity: 1; }
.ll-ring { width: 34px; height: 34px; border-radius: 50%;
  border: 2px solid rgba(255,255,255,0.16); border-top-color: var(--gold, #c9a96e);
  animation: llspin 0.8s linear infinite; }
.ll-txt { font-size: 10px; letter-spacing: 0.26em; text-transform: uppercase; color: rgba(255,255,255,0.5); }
@keyframes llspin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .ll-ring { animation: none; border-top-color: rgba(255,255,255,0.16); } }
.lightbox-cap { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px; padding: 15px 18px; }
.lightbox-cap:has(.lightbox-title:empty):has(.lightbox-desc:empty) { display: none; }
.lightbox-cat { font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--gold, #c9a96e); white-space: nowrap; }
.lightbox-title { font-family: var(--serif); font-style: italic; font-size: 18px; color: #fff; }
.lightbox-desc { flex-basis: 100%; font-family: var(--sans); font-size: 13px; line-height: 1.6; color: rgba(255,255,255,0.7); }
.lightbox-desc:empty { display: none; }
.lightbox-close {
  position: absolute; top: 10px; right: 10px; z-index: 2; font-size: 34px; line-height: 1;
  background: none; border: none; color: #fff; cursor: pointer; font-weight: 300;
  transition: color 0.2s;
}
.lightbox-close:hover { color: rgba(255,255,255,0.7); }
/* .lightbox-close is shared with the audio playlist modal below, but there it's a
   direct child of .audio-lightbox's near-white backdrop (not the dark .lightbox-frame
   this white color was set for) — override back to dark so it stays visible there. */
.audio-lightbox .lightbox-close { color: var(--ink); }
.audio-lightbox .lightbox-close:hover { color: var(--mid); }
/* own fullscreen control — Vimeo's built-in one is a small icon inside the
   iframe's own controls (easy to miss, esp. on a phone); this one is ours,
   always visible on the dialog chrome itself. Hidden entirely if the browser
   doesn't support the Fullscreen API at all (progressive enhancement).
   Positioned relative to .lightbox-frame (its actual parent, both buttons
   moved inside it) rather than the outer .lightbox viewport-filling backdrop
   — a fixed offset from the viewport only looked right when there was slack
   space above the frame; on a short/landscape viewport the frame nearly
   fills the screen and a viewport-relative offset lands on top of the video. */
.lightbox-fullscreen {
  position: absolute; top: 10px; right: 54px; z-index: 2; width: 26px; height: 26px;
  background: none; border: none; color: #fff; cursor: pointer;
  display: flex; align-items: center; justify-content: center; transition: color 0.2s;
}
.lightbox-fullscreen svg { width: 20px; height: 20px; }
.lightbox-fullscreen:hover { color: var(--mid); }
.lightbox-fullscreen[hidden] { display: none; }

/* =========================================================== AUDIO PLAYLIST
   Pieces with no Vimeo ID (pure audio) open here instead of the video lightbox —
   same overlay/dialog mechanics, reuses .lightbox-cat/.lightbox-title,
   kept dark for the same reason the video lightbox is: it's a "now playing" screen.
   No description here (unlike the video lightbox): it used to sit between the title
   and the controls, and being empty for some playlists but not others made the gap
   before the first track inconsistent from one playlist to the next. Title -> controls
   is now always the same fixed distance; any per-playlist text lives in Credits below,
   which collapses the same way when empty so it costs nothing when unused. */
.audio-lightbox {
  position: fixed; inset: 0; z-index: 300; display: none;
  align-items: center; justify-content: center; padding: 24px;
  background: rgba(250,250,248,0.96); backdrop-filter: blur(6px);
}
.audio-lightbox.open { display: flex; }
.audio-player {
  display: flex; width: min(720px, 94vw); max-height: 88vh; border: 1px solid var(--line-2);
  background: #08080a; overflow: hidden;
}
.audio-cover { width: 220px; flex: none; object-fit: cover; background: #14110d; }
.audio-info { flex: 1; min-width: 0; padding: 26px 28px; display: flex; flex-direction: column; overflow: hidden; }
.audio-info .lightbox-cap, .audio-info .lightbox-cat, .audio-info .lightbox-title { padding: 0; }
.audio-controls { display: flex; align-items: center; gap: 14px; margin: 20px 0 16px; }
.audio-btn {
  background: none; border: none; color: #fff; cursor: pointer; font-size: 12px;
  padding: 6px; line-height: 1; opacity: 0.75; transition: opacity 0.2s;
}
.audio-btn:hover, .audio-btn:focus-visible { opacity: 1; }
.audio-play { font-size: 14px; }
.audio-progress {
  flex: 1; height: 3px; background: rgba(255,255,255,0.18); position: relative; cursor: pointer;
  border-radius: 2px;
}
.audio-progress-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0; background: var(--gold, #c9a96e); border-radius: 2px; }
.audio-progress:focus-visible { outline: 2px solid var(--gold, #c9a96e); outline-offset: 4px; }
.audio-time { font-size: 11px; color: rgba(255,255,255,0.55); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* single shared scroll region for tracklist + credits, so scrolling past the last
   track flows straight into credits rather than each having its own separate scrollbar.
   min-height:0 overrides flexbox's default min-height:auto, which would otherwise let
   this box grow past its share of .audio-info and defeat overflow-y:auto entirely. */
.audio-scroll { flex: 1; min-height: 0; overflow-y: auto; }
.audio-tracklist { list-style: none; border-top: 1px solid rgba(255,255,255,0.12); margin: 0; padding: 8px 0 0; }
.audio-tracklist li { margin: 0; }
.audio-tracklist button {
  display: flex; align-items: baseline; gap: 12px; width: 100%; text-align: left;
  background: none; border: none; color: rgba(255,255,255,0.6); cursor: pointer;
  font-family: var(--sans); font-size: 13px; padding: 9px 4px; transition: color 0.2s;
}
.audio-tracklist button:hover, .audio-tracklist button:focus-visible { color: #fff; }
.audio-tracklist button[aria-current="true"] { color: var(--gold, #c9a96e); }
.audio-tracklist .tn { font-variant-numeric: tabular-nums; color: rgba(255,255,255,0.35); font-size: 11px; flex: none; }
.audio-tracklist button[aria-current="true"] .tn { color: var(--gold, #c9a96e); }
/* optional per-playlist credits (personnel, mastering notes, etc.) — hidden entirely
   when empty so playlists without any still look identical to before this existed. */
.audio-credits:has(.audio-credits-body:empty) { display: none; }
.audio-credits-title {
  margin: 18px 4px 10px; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.12);
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: rgba(255,255,255,0.4);
}
.audio-credits-body {
  margin: 0 4px 4px; font-family: var(--sans); font-size: 12px; line-height: 1.7;
  color: rgba(255,255,255,0.55); white-space: pre-line;
}
@media (max-width: 560px) {
  .audio-player { flex-direction: column; max-height: 92vh; }
  .audio-cover { width: 100%; aspect-ratio: 16/9; }
}

/* =========================================================== CASE: breadcrumb + next-project */
.case-crumb { max-width: var(--maxw); margin: 0 auto; padding: 24px var(--pad) 22px;
  font-size: 12px; letter-spacing: 0.02em; color: var(--soft); }
.case-crumb a { color: var(--mid); text-decoration: underline; text-underline-offset: 3px; transition: color 0.2s; }
.case-crumb a:hover { color: var(--ink); }
.case-crumb .sep { margin: 0 7px; color: var(--line-2); }
.case-crumb .cur { color: var(--ink); }
.case-next { display: flex; align-items: center; justify-content: space-between; gap: 24px;
  padding: 46px clamp(20px, 5vw, 64px); border-top: 1px solid var(--line);
  text-decoration: none; transition: background 0.3s var(--ease); }
.case-next:hover { background: var(--off); }
.case-next:hover .cn-arrow { transform: translateX(8px); }
.cn-text { display: flex; flex-direction: column; gap: 8px; }
.cn-label { font-size: 10px; letter-spacing: 0.24em; text-transform: uppercase; color: var(--gold, #c9a96e); }
.cn-title { font-family: var(--serif); font-weight: 400; font-size: clamp(24px, 4vw, 42px);
  color: var(--ink); line-height: 1.04; }
.cn-arrow { flex: none; font-size: 30px; color: var(--ink); transition: transform 0.3s var(--ease); }
.case-hero-inner h1 em { font-style: italic; color: var(--gold, #c9a96e); }

/* =========================================================== SECTOR LANDING PAGES */
.sector-intro { padding: 44px var(--pad) 6px; }
.sector-lead { max-width: 760px; margin: 0 auto; font-family: var(--serif); font-weight: 300;
  font-size: clamp(22px, 3vw, 32px); line-height: 1.35; color: var(--ink); text-align: center; }
.sector-more { text-align: center; }
.sector-strip { display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px 24px; }
.sector-more .sector-strip { justify-content: center; margin-top: 14px; }
.sector-strip a { font-family: var(--serif); font-size: clamp(20px, 3vw, 30px); color: var(--ink);
  text-decoration: none; border-bottom: 1px solid transparent; transition: border-color 0.25s var(--ease), color 0.25s; }
.sector-strip a:hover { border-color: var(--ink); }
/* compact variant on the Work page header */
.work-sectors { max-width: var(--maxw); margin: 0 auto; padding: 0 var(--pad) 6px; align-items: center; gap: 8px 18px; }
.work-sectors .ss-label { font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--mid); margin-right: 4px; }
.work-sectors a { font-family: var(--sans); font-size: 13px; letter-spacing: 0.02em; color: var(--mid); }
.work-sectors a:hover { color: var(--ink); border-color: var(--ink); }
/* thank-you page (reuses .error-page centering) */
.thanks-page .eyebrow { color: var(--gold, #c9a96e); }
.thanks-meta { font-size: 14px; color: var(--mid); }

/* =========================================================== 404 */
.error-page {
  min-height: 70vh; padding: clamp(140px, 20vh, 220px) var(--pad) 100px;
  max-width: 720px; margin: 0 auto; text-align: center;
  display: flex; flex-direction: column; align-items: center; gap: 22px;
}
.error-page .code { font-family: var(--serif); font-style: italic; font-size: clamp(90px, 18vw, 200px); line-height: 1; color: rgba(10,10,10,0.12); }
.error-page h1 { font-family: var(--serif); font-weight: 300; font-size: clamp(30px, 5vw, 46px); color: var(--ink); }
.error-page p { color: var(--mid); max-width: 440px; font-size: 15px; line-height: 1.8; }
.error-page .cta-actions { margin-top: 12px; }

/* =========================================================== REVEAL (JS-gated) */
.js .reveal { opacity: 0; transform: translateY(26px); transition: opacity 0.9s var(--ease), transform 0.9s var(--ease); }
.js .reveal.in { opacity: 1; transform: none; }

/* =========================================================== RESPONSIVE */
@media (max-width: 1080px) {
  .footer-top { grid-template-columns: 1fr 1fr; gap: 36px; }
  .process { grid-template-columns: repeat(2, 1fr); }
  .case-facts { grid-template-columns: repeat(2, 1fr); }
  .case-fact:nth-child(2) { border-right: none; }
}
@media (max-width: 920px) {
  .nav-links {
    position: fixed; inset: 72px 0 auto 0; flex-direction: column; gap: 0;
    background: var(--white); border-bottom: 1px solid var(--line);
    padding: 8px 0; transform: translateY(-120%); visibility: hidden; transition: transform 0.4s var(--ease), visibility 0.4s var(--ease);
    align-items: stretch;
  }
  body.nav-open .nav-links { transform: translateY(0); visibility: visible; }
  .nav-links li { border-top: 1px solid var(--line); }
  .nav-links li:first-child { border-top: none; }
  .nav-links a { display: block; padding: 18px var(--pad); font-size: 12px; }
  .nav-links a[aria-current="page"]::after { display: none; }
  .nav-cta { margin: 12px var(--pad); text-align: center; }
  .nav-toggle { display: flex; }

  .nav-logo svg.brand { height: 34px; }
  .hero-inner { padding-top: 104px; }
  .split { grid-template-columns: 1fr; }
  .contact-grid { grid-template-columns: 1fr; }
  .contact-info { border-right: none; border-bottom: 1px solid var(--line); }
  .work-grid { grid-template-columns: repeat(2, 1fr); }
  .stats { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 620px) {
  /* full label text ("Trusted by the world's foremost luxury houses") is too wide
     for one line at phone widths — the nowrap from the desktop bordered-column
     layout above was silently clipping the tail end (read as "...HOUSE"). */
  .clients-label { border-right: none; border-bottom: 1px solid var(--line); width: 100%; white-space: normal; }
  .work-grid { grid-template-columns: 1fr; }
  .process { grid-template-columns: 1fr; }
  .case-facts { grid-template-columns: 1fr; }
  .case-fact { border-right: none; border-bottom: 1px solid var(--line); }
  .case-fact:last-child { border-bottom: none; }
  .field-row { grid-template-columns: 1fr; }
  .footer-top { grid-template-columns: 1fr; }
  .section-header { flex-direction: column; align-items: flex-start; }
  .service-row { grid-template-columns: 1fr; gap: 8px; }
  .service-tag { text-align: left; }
  .stats { grid-template-columns: 1fr 1fr; }
  .footer-bottom { flex-direction: column; gap: 8px; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; }
  .reveal { opacity: 1 !important; transform: none !important; }
}

/* =========================================================== INTRO LOADER (homepage, Dot Assembly) */
.intro {
  position: fixed; inset: 0; z-index: 9999; background: #08080a;
  display: flex; align-items: center; justify-content: center;
  opacity: 1; transition: opacity 0.8s var(--ease);
}
html:not(.js) .intro, html.intro-seen .intro { display: none; }
html.intro-playing, html.intro-playing body { overflow: hidden; }
.intro.done { opacity: 0; pointer-events: none; }
.intro .wm {
  font-family: var(--serif); display: inline-flex; align-items: center; gap: 0.16em;
  color: #fff; font-weight: 400; white-space: nowrap; line-height: 1;
  font-size: clamp(34px, 8vw, 92px);
  transition: transform 0.8s var(--ease);
}
.intro.done .wm { transform: translateY(-10px) scale(0.97); }
.intro .wm .c { font-weight: 600; }
.intro .wm .d { display: grid; grid-template-columns: repeat(2, auto); gap: 0.1em; }
.intro .wm .d i { width: 0.2em; height: 0.2em; border-radius: 50%; display: block; }
.intro .wm .d i:nth-child(1) { background: #e07f2c; }
.intro .wm .d i:nth-child(2) { background: #d83b8c; }
.intro .wm .d i:nth-child(3) { background: #2f7ef0; }
.intro .wm .d i:nth-child(4) { background: #1faa90; }
.intro .wm .n { animation: introL 0.9s 0.15s cubic-bezier(.16,1,.3,1) both; }
.intro .wm .c { animation: introR 0.9s 0.15s cubic-bezier(.16,1,.3,1) both; }
.intro .wm .d i { animation: introD 0.6s cubic-bezier(.34,1.56,.64,1) both; }
.intro .wm .d i:nth-child(1) { animation-delay: 0s; }
.intro .wm .d i:nth-child(2) { animation-delay: 0.09s; }
.intro .wm .d i:nth-child(3) { animation-delay: 0.18s; }
.intro .wm .d i:nth-child(4) { animation-delay: 0.27s; }
@keyframes introL { from { opacity: 0; transform: translateX(-30px); } to { opacity: 0.62; transform: none; } }
@keyframes introR { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: none; } }
@keyframes introD { 0% { transform: scale(0); } 60% { transform: scale(1.4); } 100% { transform: scale(1); } }

/* =========================================================== CUSTOM CURSOR */
.cursor {
  position: fixed; top: 0; left: 0; z-index: 10000; width: 30px; height: 30px;
  border-radius: 50%; pointer-events: none; will-change: transform;
  /* No mix-blend-mode and no cursor:none — the native OS pointer stays visible at all
     times; this ring is a decorative enhancement layered on top of it. Dark stroke +
     light box-shadow halo so it reads on both light AND dark imagery without blend math. */
  border: 1.5px solid rgba(20,22,30,0.85);
  box-shadow: 0 0 0 1px rgba(255,255,255,0.55);
  transition: width 0.25s var(--ease), height 0.25s var(--ease), background 0.25s, opacity 0.25s;
}
.cursor::after { content: ""; position: absolute; top: 50%; left: 50%; width: 4px; height: 4px; background: rgba(20,22,30,0.9); border-radius: 50%; box-shadow: 0 0 0 1px rgba(255,255,255,0.6); transform: translate(-50%, -50%); }
.cursor.big { width: 58px; height: 58px; background: rgba(20,22,30,0.06); }
.btn-primary, .btn-outline, .nav-cta, .reel-cta, .link-arrow, .btn-ghost { transition: transform 0.35s var(--ease), background 0.25s var(--ease), color 0.25s var(--ease); }

/* =========================================================== PAGE TRANSITIONS */
.page-fade { position: fixed; inset: 0; z-index: 9990; background: #08080a; opacity: 0; pointer-events: none; transition: opacity 0.22s var(--ease); }
.page-fade.show { opacity: 1; pointer-events: all; }
main { animation: pageIn 0.55s var(--ease) both; }
@keyframes pageIn { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { main { animation: none; } .page-fade { display: none; } .cursor { display: none; } }

/* =========================================================== GALLERY FADE-IN */
.js .gallery-fig > img:not(.loaded), .js .gcat > img:not(.loaded) { opacity: 0; }
.gallery-fig > img.loaded, .gcat > img.loaded { animation: imgIn 0.6s var(--ease); }
@keyframes imgIn { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .gallery-fig > img.loaded, .gcat > img.loaded { animation: none; } .js .gallery-fig > img, .js .gcat > img { opacity: 1; } }
