/* ============================================================
   Influencer Advisory - motion homepage
   Plain static site. Fonts self-hosted (Google Fonts, free).
   ============================================================ */

/* professional type system (Source superfamily), global across EVERY page so the
   styling stays consistent site-wide. @import must stay first (before @font-face). */
/* Source fonts load via the <head> <link>, not @import — a cross-origin @import
   here breaks Microsoft Clarity style capture (recordings play back unstyled). */

/* ---- fonts ---- */
@font-face{font-family:'Vina Sans';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/vinasans-normal-400.woff2') format('woff2');}
@font-face{font-family:'Instrument Serif';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/instrumentserif-normal-400.woff2') format('woff2');}
@font-face{font-family:'Instrument Serif';font-style:italic;font-weight:400;font-display:swap;src:url('assets/fonts/instrumentserif-italic-400.woff2') format('woff2');}
@font-face{font-family:'Archivo';font-style:normal;font-weight:100 900;font-display:swap;src:url('assets/fonts/archivo-normal-100_900.woff2') format('woff2');}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/ibmplexmono-normal-500.woff2') format('woff2');}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:700;font-display:swap;src:url('assets/fonts/ibmplexmono-normal-700.woff2') format('woff2');}

/* ---- tokens ---- */
:root{
  --ink:#0a0a0a;
  --black:#000;
  --paper:#f2f2f2;
  --paper-ink:#111;
  --gray-body:#565656;
  --gray-unfilled:#c9c9c6;
  /* theme tokens - every accent color on the page routes through these;
     palettes below override them via html[data-palette] */
  --grad-lo:#ffbaba;
  --grad-hi:#ffffff;
  --glow-rgb:122 16 20;        /* main colored glow, used as rgb(var(--glow-rgb) / a) */
  --glow-deep-rgb:74 10 14;    /* darker companion glow */
  --accent:#e0201c;            /* About italic accent + selection */
  --font-display:'Source Serif 4', Georgia, serif;
  --font-serif:'Source Serif 4', Georgia, serif;
  --font-body:'Source Sans 3', Arial, sans-serif;
  --font-mono:'Source Code Pro', 'Courier New', monospace;
  --radius:24px;
  --inset:0;            /* full-bleed dark cards: no paper border/fold (Dennis 2026-07-05) */
  --gutter:24px;
  --grad-display:linear-gradient(0deg, var(--grad-lo) 0%, var(--grad-hi) 75%);
}

/* ---- palettes (preview with /?palette, deep-link /?palette=<key>, bake in by changing DEFAULT_PALETTE in main.js) ---- */
/* blue family: each retints --black so the dark cards go deep blue too */
html[data-palette="navy"]{
  --black:#060d1f;--ink:#060d1f;
  --grad-lo:#a9c6f2;--grad-hi:#f4f8ff;
  --glow-rgb:36 74 156;--glow-deep-rgb:14 32 78;
  --accent:#2f5fd0;
}
html[data-palette="deeppro"]{
  --black:#030a16;--ink:#030a16;
  --grad-lo:#4f79cf;--grad-hi:#c4d8ff;
  --glow-rgb:10 30 86;--glow-deep-rgb:5 13 42;
  --accent:#153a80;
}
html[data-palette="midnight"]{
  --black:#03081a;--ink:#03081a;
  --grad-lo:#7d9fd4;--grad-hi:#e8f0ff;
  --glow-rgb:22 42 104;--glow-deep-rgb:8 18 52;
  --accent:#20408f;
}
html[data-palette="royal"]{
  --black:#071233;--ink:#071233;
  --grad-lo:#9db8ff;--grad-hi:#f0f4ff;
  --glow-rgb:44 78 200;--glow-deep-rgb:18 34 104;
  --accent:#2f55d4;
}
html[data-palette="cobalt"]{
  --black:#050c26;--ink:#050c26;
  --grad-lo:#6f8fe8;--grad-hi:#dbe6ff;
  --glow-rgb:30 58 170;--glow-deep-rgb:12 26 88;
  --accent:#2244cc;
}
html[data-palette="electric"]{
  --black:#041420;--ink:#041420;
  --grad-lo:#7fd4ff;--grad-hi:#f0fbff;
  --glow-rgb:0 116 200;--glow-deep-rgb:0 54 100;
  --accent:#00a6ff;
}
html[data-palette="ice"]{
  --black:#0a1526;--ink:#0a1526;
  --grad-lo:#cfe4ff;--grad-hi:#ffffff;
  --glow-rgb:88 128 190;--glow-deep-rgb:40 62 100;
  --accent:#6ea8e8;
}
html[data-palette="steel"]{
  --black:#0b141e;--ink:#0b141e;
  --grad-lo:#a9bccf;--grad-hi:#f2f6fa;
  --glow-rgb:62 84 112;--glow-deep-rgb:28 40 56;
  --accent:#5b7a99;
}
html[data-palette="champagne"]{--grad-lo:#f1dfae;--grad-hi:#fffdf6;--glow-rgb:120 94 22;--glow-deep-rgb:66 52 12;--accent:#b08a2e;}
html[data-palette="classic24k"]{--grad-lo:#f0d06b;--grad-hi:#fffaf0;--glow-rgb:133 102 15;--glow-deep-rgb:74 57 8;--accent:#d4af37;}
html[data-palette="satin"]{--grad-lo:#e8ce8c;--grad-hi:#ffffff;--glow-rgb:115 90 30;--glow-deep-rgb:64 50 17;--accent:#a9852b;}
html[data-palette="amber"]{--grad-lo:#efc15a;--grad-hi:#fff6e3;--glow-rgb:140 96 10;--glow-deep-rgb:78 53 6;--accent:#c68e17;}
html[data-palette="deepgold"]{--grad-lo:#a87e22;--grad-hi:#ecdcb0;--glow-rgb:86 60 10;--glow-deep-rgb:44 30 5;--accent:#8f6914;}
html[data-palette="antique"]{--grad-lo:#d9b968;--grad-hi:#f7eedc;--glow-rgb:105 82 20;--glow-deep-rgb:58 45 11;--accent:#8c6d1f;}
html[data-palette="bronze"]{--grad-lo:#d9a94f;--grad-hi:#fff3de;--glow-rgb:120 85 15;--glow-deep-rgb:66 47 8;--accent:#9c7a17;}
html[data-palette="bright"]{--grad-lo:#ffd700;--grad-hi:#fffff0;--glow-rgb:160 120 0;--glow-deep-rgb:88 66 0;--accent:#e6c200;}

/* ---- base ---- */
*{margin:0;padding:0;box-sizing:border-box;}
html{scroll-behavior:auto;overflow-x:clip;}  /* clip subpixel/fixed-header overflow so mobile never scrolls sideways; clip (not hidden) keeps position:sticky working */
body{
  font-family:var(--font-body);
  background:var(--paper);
  color:var(--paper-ink);
  overflow-x:clip;  /* clip, NOT hidden: hidden makes body a scroll container (overflow-y->auto) and breaks position:sticky (the process media stage) */
  -webkit-font-smoothing:antialiased;
}
::selection{background:var(--grad-lo);color:var(--ink);}
img,video,canvas{display:block;max-width:100%;}
a{color:inherit;text-decoration:none;}
button{background:none;border:0;color:inherit;font:inherit;cursor:pointer;}
main{position:relative;}

/* ---- film grain, two layers ----
   .grain      = fixed full-viewport noise at 5% (matches live site's grain_overlay)
   .film-grain = per-media overlay at 14% + soft-light, for footage cards.
   NOTE for future footage: keep .film-grain on the wrapper of every real <video>,
   it recreates the grainy film treatment the reference footage has. */
.grain,
.film-grain::after{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
  background-size:300px 300px;
}
.grain{
  position:fixed;inset:-100px;z-index:2147483000;pointer-events:none;
  opacity:.05;
  animation:grain-shift 900ms steps(4) infinite;
}
@keyframes grain-shift{
  0%{transform:translate(0,0);}
  25%{transform:translate(-34px,22px);}
  50%{transform:translate(18px,-40px);}
  75%{transform:translate(-26px,-14px);}
  100%{transform:translate(0,0);}
}
.film-grain{position:relative;}
.film-grain::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  opacity:.14;mix-blend-mode:soft-light;border-radius:inherit;
}

/* ---- crosshair cursor ---- */
.cursor{position:fixed;inset:0;z-index:2147482000;pointer-events:none;}
.cursor-x,.cursor-y,.cursor-dot{position:fixed;background:#fff;mix-blend-mode:exclusion;}
.cursor-x{left:0;top:0;width:100vw;height:1px;opacity:.12;}
.cursor-y{left:0;top:0;width:1px;height:100vh;opacity:.12;}
/* the reference cursor centerpiece is a 12px square, not a dot */
.cursor-dot{left:0;top:0;width:12px;height:12px;margin:-6px 0 0 -6px;opacity:.95;}
@media (pointer:coarse){.cursor{display:none;}}

/* ---- mono bracket labels ---- */
.mono-label{
  font-family:var(--font-mono);font-weight:700;font-size:15px;
  letter-spacing:.16em;text-transform:uppercase;line-height:1.5;
  display:inline-block;
}
a.mono-label,button.mono-label{transition:opacity .25s ease;}
a.mono-label:hover,button.mono-label:hover{opacity:.55;}

/* ---- header ---- */
.site-header{
  position:fixed;top:0;left:0;right:0;z-index:900;
  display:flex;justify-content:space-between;align-items:center;
  padding:22px 32px;
  color:#fff;
  mix-blend-mode:difference;   /* stays readable over dark and light cards */
}
.brand{
  font-family:var(--font-display);font-size:40px;line-height:.9;letter-spacing:.01em;
}
.header-right{display:flex;gap:28px;}

/* ---- menu overlay ---- */
.menu-root{position:fixed;inset:0;z-index:1000;}
.menu-backdrop{
  position:absolute;inset:0;background:rgba(0,0,0,.35);
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  opacity:0;
}
.menu-panel{
  position:absolute;top:12px;right:12px;bottom:12px;
  width:min(620px, 92vw);
  background:var(--paper);border-radius:var(--radius);
  padding:120px 64px 48px;
  display:flex;flex-direction:column;justify-content:space-between;
  transform:translateX(108%);
}
.menu-nav{display:flex;flex-direction:column;gap:8px;}
.menu-nav a{
  font-family:var(--font-display);font-size:clamp(44px,6vw,76px);
  line-height:1.02;color:var(--paper-ink);
  transition:opacity .25s ease;
}
.menu-nav a:hover{opacity:.45;}
.menu-foot{color:#8a8a8a;font-size:12px;}

/* ---- section notch tabs ----
   Dark sections are rounded cards; each dark/light boundary carries a black
   chamfered "viewfinder tab" that pokes into the light section. The tabs live
   INSIDE the light sections (which never clip), one at the top edge pointing
   down and one at the bottom edge pointing up. */
.notch{
  position:absolute;left:22%;width:56%;height:32px;z-index:6;
  background:var(--black);
}
.notch-down{top:0;clip-path:polygon(0 0, 100% 0, calc(100% - 30px) 100%, 30px 100%);}
.notch-up{bottom:0;clip-path:polygon(30px 0, calc(100% - 30px) 0, 100% 100%, 0 100%);}
/* full-bleed dark cards (Dennis 2026-07-05): no rounded corners = no paper
   border showing through, and drop the chamfered fold tabs entirely */
.hero,.work,.system,.prefooter,.other,.project-hero{border-radius:0;}
.notch{display:none;}

/* ---- HERO ---- */
.hero{
  position:relative;
  /* short enough that the CAMPAIGN ANALYSIS title AND a sliver of the first
     analysis card peek above the fold, even on a zoomed-in / short viewport.
     Kept in vh (with a low px floor) so it scales down as the viewport shrinks. */
  min-height:min(64vh, 640px);
  background:var(--black);
  border-radius:0;            /* no rounded bottom = no fold where hero meets the grid (Dennis 2026-07-05) */
  margin:0 var(--inset);
  overflow:hidden;
  color:#fff;
  display:flex;flex-direction:column;justify-content:flex-end;
}
.hero-bg{position:absolute;inset:0;overflow:hidden;}
.bg-drift{
  position:absolute;inset:-30%;
  background:
    radial-gradient(42% 34% at 68% 28%, rgb(var(--glow-rgb) / .55) 0%, rgb(var(--glow-rgb) / 0) 100%),
    radial-gradient(50% 42% at 22% 78%, rgb(var(--glow-deep-rgb) / .5) 0%, rgb(var(--glow-deep-rgb) / 0) 100%);
  filter:blur(40px);
  animation:drift-a 38s ease-in-out infinite alternate;
}
.bg-drift-2{
  background:
    radial-gradient(36% 30% at 30% 22%, rgb(var(--glow-deep-rgb) / .6) 0%, rgb(var(--glow-deep-rgb) / 0) 100%),
    radial-gradient(44% 40% at 80% 70%, rgb(var(--glow-rgb) / .35) 0%, rgb(var(--glow-rgb) / 0) 100%);
  animation:drift-b 47s ease-in-out infinite alternate;
}
@keyframes drift-a{from{transform:translate(-3%,-2%) rotate(0deg);}to{transform:translate(3%,3%) rotate(6deg);}}
@keyframes drift-b{from{transform:translate(3%,2%) rotate(0deg);}to{transform:translate(-3%,-3%) rotate(-5deg);}}

.hero-helix{
  position:absolute;top:12%;right:-2%;width:38%;height:96%;
  pointer-events:none;
}
/* canvas takes pointer events so you can grab + spin the shape;
   touch-action:pan-y keeps vertical page scroll working on touch */
.hero-helix canvas{width:100%;height:100%;pointer-events:auto;touch-action:pan-y;cursor:grab;}
.hero-helix canvas:active{cursor:grabbing;}
.helix-fallback{display:none;}
.hero.no-webgl .helix-fallback{
  display:block;position:absolute;top:20%;right:8%;width:380px;height:520px;
  background:radial-gradient(60% 45% at 50% 40%, rgb(var(--glow-rgb) / .8), rgb(var(--glow-deep-rgb) / .4) 60%, transparent 75%);
  filter:blur(6px);
  border-radius:46% 54% 60% 40% / 40% 50% 50% 60%;
  animation:blob-morph 14s ease-in-out infinite alternate;
}
@keyframes blob-morph{
  from{border-radius:46% 54% 60% 40% / 40% 50% 50% 60%;transform:rotate(-4deg) scale(1);}
  to{border-radius:58% 42% 44% 56% / 56% 42% 58% 44%;transform:rotate(5deg) scale(1.06);}
}

.hero-inner{
  position:relative;z-index:2;
  /* top padding keeps the headline clear of the fixed header on short viewports */
  padding:112px 40px 24px;
}
.hero-title{
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(56px, 10.2vw, 168px);
  line-height:.98;letter-spacing:0;
  white-space:nowrap;
}
/* gradient lives on the animated span itself so background-clip survives transforms */
.hero-title .line{
  background:var(--grad-display);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.hero-sub{
  margin-top:28px;
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(26px, 3vw, 44px);
  line-height:1.12;color:#efefef;
}
.hero-sub em{font-style:italic;}
.hero-links{display:flex;gap:36px;margin:40px 0 56px;}
.hero-links .mono-label{color:#fff;}

/* line reveal masks */
.line-mask{display:block;overflow:hidden;}
/* Hero lines reveal in CSS on load, so the title/sub never wait on the GSAP CDN
   to become visible (was: hidden via translateY(110%) until GSAP downloaded and
   ran initHeroReveal, i.e. a blank hero during a slow mobile first-load). JS no
   longer animates these. */
.line{display:block;transform:translateY(110%);
  animation:hero-line-rise 1.15s cubic-bezier(.19,1,.22,1) both;}
.hero-title .line{animation-delay:.06s;}
.hero-sub .line{animation-delay:.26s;}
@keyframes hero-line-rise{from{transform:translateY(110%);}to{transform:translateY(0);}}
/* links + logo strip fade in the same way, no GSAP dependency */
.hero-links{animation:hero-fade .8s ease .62s both;}
.marquee{animation:hero-fade .9s ease .82s both;}
@keyframes hero-fade{from{opacity:0;}to{opacity:1;}}

.marquee{
  position:relative;z-index:2;
  overflow:hidden;padding:26px 0 34px;
  /* faded client-logo strip: soft edge fade only (no dark scrim - that read as
     a black band and hid the names) */
  -webkit-mask-image:linear-gradient(90deg, transparent 0%, #000 12%, #000 88%, transparent 100%);
          mask-image:linear-gradient(90deg, transparent 0%, #000 12%, #000 88%, transparent 100%);
}
.marquee-track{display:flex;gap:96px;width:max-content;will-change:transform;}
/* client logos: force every mark to a solid white silhouette so mixed
   brand colors read as one muted strip on the dark hero */
.marquee-item{
  height:34px;width:auto;max-width:190px;object-fit:contain;
  flex:0 0 auto;display:block;
  filter:brightness(0) invert(1);opacity:.55;
}

/* ---- INTRO (fill text) ---- */
.intro{
  position:relative;
  background:var(--paper);
  padding:88px 40px 84px;
}
.fill-text{
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(38px, 8vw, 118px);line-height:.9;letter-spacing:-.02em;
  text-transform:uppercase;
  color:var(--gray-unfilled);
  max-width:100%;
  overflow-wrap:normal;word-break:normal;hyphens:none;
}
/* SplitText word wrappers: keep a word's letters on one line */
.fill-text .fill-word{display:inline-block;white-space:nowrap;}
.fill-text .char{color:inherit;}
.intro-copy{
  margin-top:60px;max-width:660px;
  display:flex;flex-direction:column;gap:36px;
}
.intro-copy p{
  font-size:clamp(19px, 1.85vw, 27px);line-height:1.42;color:var(--gray-body);font-weight:500;
}
/* value prop payoff line */
.intro-copy .vp-punch{
  font-size:clamp(21px, 2vw, 30px);line-height:1.34;color:var(--paper-ink);font-weight:500;
}
.intro-copy .vp-punch b{font-weight:600;color:var(--accent);}

/* --- vp lines: "most agencies" over "we", both shown, no flip/fade --- */
.vp-flip{position:relative;}
.vp-flip-slot{display:block;}
.vp-flip-line{
  display:block;width:100%;
  /* same typeface AND same display optical cut as the big fill-text headline
     (Source Serif 4 is a variable font; pinning opsz to its max makes this
     smaller line read as the same high-contrast display serif above it) */
  font-family:var(--font-display);font-weight:400;
  font-optical-sizing:none;font-variation-settings:'opsz' 60,'wght' 400;
  font-size:clamp(28px, 3.4vw, 50px);line-height:1.12;letter-spacing:-.015em;
  color:var(--paper-ink);
}
.vp-flip-line.is-b{color:var(--accent);margin-top:8px;}

/* --- vp triple: right creative / right offer / right video pulse --- */
.vp-triple{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.14em;
  font-size:clamp(12px, 1.2vw, 15px);font-weight:600;color:var(--gray-body);
}
.vp-triple span{transition:color .3s ease, transform .3s ease;}
.vp-triple span.on{color:var(--accent);transform:translateY(-3px);}
.vp-triple i{color:var(--gray-unfilled);font-style:normal;}

/* --- vp stats: counters that tick up on scroll --- */
.vp-stats{display:flex;gap:clamp(22px, 4vw, 52px);flex-wrap:wrap;margin:6px 0;}
.vp-stat{display:flex;flex-direction:column;gap:6px;}
.vp-num{
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(40px, 4.6vw, 66px);line-height:.86;letter-spacing:0;
  color:var(--paper-ink);white-space:nowrap;
}
.vp-stat-label{
  font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;
  font-size:12px;color:var(--gray-body);
}

/* --- certifications / trust strip (muted to match the theme) --- */
.trust{margin-top:20px;padding-top:34px;border-top:1px solid rgba(17,17,17,.12);}
.trust-label{
  display:block;margin-bottom:20px;
  font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.16em;
  font-size:11px;color:var(--gray-body);
}
.trust-list{list-style:none;display:flex;flex-wrap:wrap;gap:14px 16px;align-items:center;padding:0;margin:0;}
.trust-list li{
  display:inline-flex;align-items:center;gap:9px;
  font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.07em;
  font-size:12px;font-weight:600;color:var(--paper-ink);
  border:1px solid rgba(17,17,17,.18);border-radius:999px;padding:9px 15px;
}
.trust-list img{width:15px;height:15px;filter:brightness(0);opacity:.8;}
.trust-check::before{content:"\2713";margin-right:8px;color:var(--accent);font-weight:800;}

/* ---- WORK ---- */
.work{
  position:relative;
  background:var(--black);
  border-radius:0;            /* full-bleed square = no light corner triangles at the hero seam (Dennis 2026-07-05) */
  margin:0 var(--inset);
  /* enough top room to breathe while the first card still peeks from the hero */
  padding:48px 24px 96px;
  color:#fff;
}
.work-title,
.process-title{
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(40px, 4.2vw, 62px);line-height:1;
  text-align:center;letter-spacing:.01em;
  margin-bottom:24px;
}
.work-grid{
  display:grid;grid-template-columns:repeat(3, 1fr);gap:22px;
}

/* real film cards: creator clip loops behind a white wordmark under a dark haze */
.work-media{
  position:relative;border-radius:var(--radius);overflow:hidden;
  aspect-ratio:16/9;background:#000;
}
.work-video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform .9s cubic-bezier(.2,.7,.2,1);
}
.work-card:hover .work-video{transform:scale(1.06);}
.work-haze{
  position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(70% 60% at 50% 46%, rgba(0,0,0,.34) 0%, rgba(0,0,0,0) 70%),
    linear-gradient(180deg, rgba(0,0,0,.30) 0%, rgba(0,0,0,.14) 42%, rgba(0,0,0,.62) 100%);
}
.work-tag{
  position:absolute;left:22px;top:20px;z-index:2;
  font-family:var(--font-mono, monospace);font-size:11px;font-weight:700;
  letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,.82);
}
.work-name{
  position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;
  padding:0 24px;text-align:center;
  font-family:var(--font-display);font-weight:400;line-height:.95;
  font-size:clamp(30px, 3.6vw, 58px);letter-spacing:-.01em;color:#fff;
  text-shadow:0 2px 18px rgba(0,0,0,.45);
}
.work-cta{
  position:absolute;left:22px;bottom:20px;z-index:2;
  font-family:var(--font-mono, monospace);font-size:11px;font-weight:700;
  letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,.72);
  transition:color .3s ease;
}
.work-card:hover .work-cta{color:#fff;}
/* per-card proof snippet: fades in on hover, top-right */
.work-metric{
  position:absolute;right:20px;top:18px;z-index:3;
  font-family:var(--font-mono, monospace);font-size:10.5px;font-weight:700;
  letter-spacing:.12em;text-transform:uppercase;color:#fff;
  padding:5px 11px;border:1px solid rgba(255,255,255,.4);border-radius:999px;
  background:rgba(0,0,0,.3);
  opacity:0;transform:translateY(-6px);transition:opacity .35s ease, transform .35s ease;
}
.work-card:hover .work-metric{opacity:1;transform:translateY(0);}
.media-ph{
  position:relative;border-radius:var(--radius);overflow:hidden;
  aspect-ratio:16/9;
  background:
    radial-gradient(80% 90% at 20% 15%, #262626 0%, #121212 55%, #0b0b0b 100%);
  display:flex;align-items:center;justify-content:center;
}
.media-ph::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(115deg, transparent 32%, rgba(255,255,255,.05) 46%, transparent 60%);
  background-size:240% 100%;
  animation:ph-shimmer 4.5s ease-in-out infinite;
}
@keyframes ph-shimmer{0%{background-position:130% 0;}60%{background-position:-60% 0;}100%{background-position:-60% 0;}}
.media-ph .mono-label{color:rgba(255,255,255,.34);font-size:12px;}
/* real footage inside a placeholder frame: fill + kill the shimmer */
.media-ph.has-media::before{animation:none;background:none;}
.media-ph video,
.media-ph img.clip-photo{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;
}
/* team quadrant: four members in one frame */
.team-grid{
  display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:10px;
  border-radius:var(--radius);overflow:hidden;
}
.team-grid img{width:100%;height:100%;object-fit:cover;object-position:center 22%;display:block;min-height:0;}
.work-card{display:block;transition:transform .5s cubic-bezier(.2,.7,.2,1);}
.work-card:hover{transform:scale(.975);}
.see-all{
  display:block;margin-top:80px;
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(56px, 8vw, 118px);line-height:1;color:#fff;
  transition:opacity .3s ease;padding-left:16px;
}
.see-all:hover{opacity:.5;}
/* non-clickable proof cards sit in the SAME grid + share every work-card style;
   figures carry a default margin, so zero it and drop the link affordance */
.work-card-read{margin:0;cursor:default;}

/* clickable analysis cards get an ANIMATED light border so they clearly read as
   openable; the sponsor-read figures above stay borderless. A bright arc rotates
   around a static frame (conic-gradient masked to a ring). pointer-events:none
   keeps the whole card clickable; border-box keeps every card the same size. */
@property --ia-angle{ syntax:'<angle>'; initial-value:0deg; inherits:false; }
a.work-card .work-media{
  border:1px solid rgba(255,255,255,.42);
  transition:border-color .35s ease, box-shadow .35s ease;
}
/* thick, always-visible ring with a bright arc weaving around it */
a.work-card .work-media::before{
  content:"";
  position:absolute; inset:0; z-index:4; pointer-events:none;
  border-radius:inherit; padding:3px;
  background:conic-gradient(from var(--ia-angle),
    rgba(255,255,255,.24) 0deg, rgba(255,255,255,.24) 62deg, rgba(255,255,255,.95) 90deg,
    #fff 100deg, rgba(255,255,255,.95) 110deg, rgba(255,255,255,.24) 150deg,
    rgba(255,255,255,.24) 360deg);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
          mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask-composite:exclude;
  animation:ia-border-spin 3.6s linear infinite;
}
@keyframes ia-border-spin{ to{ --ia-angle:360deg; } }
a.work-card:hover .work-media{
  border-color:#fff;
  box-shadow:0 16px 44px rgba(0,0,0,.5);
}
a.work-card:hover .work-media::before{ animation-duration:1.5s; }
a.work-card .work-cta{color:#fff;}

/* spinning "CLICK TO OPEN" seal — the unmistakable clickability cue; injected by
   main.js into every a.work-card only, so sponsor-read figures never get one */
.open-seal{
  position:absolute; right:14px; bottom:14px; z-index:5; pointer-events:none;
  width:76px; height:76px; display:grid; place-items:center; border-radius:50%;
  background:radial-gradient(circle, rgba(8,9,14,.74) 46%, rgba(8,9,14,0) 72%);
}
.open-seal-ring{
  position:absolute; inset:0; width:100%; height:100%;
  animation:open-seal-spin 7s linear infinite;
}
.open-seal-ring text{
  font-family:var(--font-mono, monospace); font-size:8.5px; font-weight:700;
  letter-spacing:.34em; fill:#fff;
}
.open-seal-arrow{
  position:relative; z-index:2; font-size:20px; line-height:1; color:#fff;
  font-family:var(--font-mono, monospace); font-weight:700;
}
@keyframes open-seal-spin{ to{ transform:rotate(360deg); } }
a.work-card:hover .open-seal-ring{ animation-duration:2.8s; }
a.work-card:hover .open-seal{ background:radial-gradient(circle, rgba(8,9,14,.82) 48%, rgba(8,9,14,0) 74%); }
@media (max-width:600px){ .open-seal{ width:62px; height:62px; right:10px; bottom:10px; } }
@media (prefers-reduced-motion:reduce){
  a.work-card .work-media::before{ animation:none; }
  .open-seal-ring{ animation:none; }
}

/* ---- PROCESS ---- */
.process{
  position:relative;
  background:var(--paper);
  padding:76px 40px 68px;
}
.process-title{color:var(--paper-ink);}
.process-wrap{
  display:grid;grid-template-columns:56% 1fr;gap:56px;align-items:start;
}
/* full-height stage so the whole clip shows on a big screen */
.process-media{
  position:sticky;top:8vh;
  height:84vh;
}
.process-media .media-ph{
  position:absolute;inset:0;aspect-ratio:auto;height:100%;
  /* no fade: the active clip is just there, hard swap between steps */
  opacity:0;
  background:radial-gradient(80% 90% at 25% 15%, #3a3a3a 0%, #1c1c1c 60%, #101010 100%);
}
.process-media .media-ph.is-active{opacity:1;}
/* particle fields are abstract, so fill the whole stage (cover, not contain) */
.process-media .media-ph video,
.process-media .media-ph img.clip-photo{object-fit:cover;background:#0b0b0b;}
/* live animated particle canvas (tsParticles) fills the stage; the media-ph's
   dark radial gradient shows through the transparent canvas for depth */
.process-particles{position:absolute;inset:0;width:100%;height:100%;}
.process-particles canvas{display:block;width:100%!important;height:100%!important;}
/* soft blur over the top strip of each process clip so the screen-record chrome
   (the Zoom "..." menu, the top letterbox band) reads clean, fading out downward */
.process-media .media-ph:has(video)::before{
  content:"";position:absolute;left:0;right:0;top:0;bottom:auto;height:30%;
  z-index:4;pointer-events:none;background:none;animation:none;
  -webkit-backdrop-filter:blur(9px);backdrop-filter:blur(9px);
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 50%,transparent 100%);
          mask-image:linear-gradient(180deg,#000 0%,#000 50%,transparent 100%);
}
/* the 40vh trailing pad keeps the sticky particle stage pinned while the LAST
   step reaches centre, so all four fields get their turn before the stage releases */
.process-steps{display:flex;flex-direction:column;gap:20vh;padding:5vh 0 40vh;}
.step-label{
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(28px, 2.9vw, 42px);letter-spacing:-.02em;
  color:var(--paper-ink);margin-bottom:26px;
  transition:color .4s ease, transform .4s ease;transform-origin:left center;
}
/* the step whose clip is playing scales up + goes accent */
.step.is-current .step-label{color:var(--accent);transform:scale(1.07);}
.step-text{
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(34px, 3.7vw, 54px);line-height:1.04;letter-spacing:-.025em;
  color:var(--gray-unfilled);
}
.step-text em{font-style:italic;}

/* ---- SYSTEM (pinned swap) ---- */
.system{
  position:relative;
  background:var(--black);
  border-radius:var(--radius);
  margin:0 var(--inset);
  color:#fff;
  overflow:hidden;
}
.system::before{
  content:"";position:absolute;inset:0;
  background:
    radial-gradient(52% 46% at 78% 22%, rgb(var(--glow-rgb) / .5) 0%, transparent 70%),
    radial-gradient(40% 42% at 16% 80%, rgb(var(--glow-deep-rgb) / .45) 0%, transparent 70%);
}
.system-pin{
  position:relative;
  min-height:100vh;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:120px 24px;
}
.system-phrase{position:absolute;left:0;right:0;top:50%;transform:translateY(-58%);}
.system-kicker{
  font-family:var(--font-serif);font-style:italic;
  font-size:clamp(34px, 4vw, 58px);color:#c9c9c6;
  margin-bottom:10px;
}
.system-line{
  font-family:var(--font-display);font-weight:400;
  background:var(--grad-display);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  line-height:1;letter-spacing:0;
}
.system-a .system-line{font-size:clamp(40px, 6.4vw, 106px);}
.system-b .system-line{font-size:clamp(80px, 12vw, 200px);}
.system-b{opacity:0;}
.system-b sup{font-size:.28em;vertical-align:.9em;-webkit-text-fill-color:#fff;}
.system-cta{position:absolute;bottom:16vh;left:50%;transform:translateX(-50%);color:#fff;}

/* ---- ABOUT ---- */
.about{
  position:relative;
  background:var(--paper);
  padding:160px 24px 120px;
  text-align:center;overflow:hidden;
}
.about-watermark{
  position:absolute;top:40px;left:50%;transform:translateX(-50%);
  font-family:var(--font-display);font-size:44vw;line-height:1;
  color:rgba(10,10,10,.05);pointer-events:none;user-select:none;
}
.about-label{
  font-family:var(--font-serif);font-size:clamp(24px, 2.4vw, 36px);
  color:var(--paper-ink);margin-bottom:70px;
}
.about-title{
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(40px, 4.8vw, 72px);letter-spacing:-.02em;line-height:1.05;
  margin-bottom:44px;color:var(--paper-ink);
}
.about-title em{color:var(--accent);font-style:italic;}
.about-copy{
  max-width:820px;margin:0 auto 40px;
  font-size:clamp(19px, 1.9vw, 27px);line-height:1.5;color:var(--gray-body);font-weight:500;
}
.about-link{
  font-size:clamp(17px, 1.6vw, 24px);color:var(--gray-body);margin-bottom:56px;font-weight:500;
}
.about-link b{color:var(--paper-ink);}
.about-link a{border-bottom:2px solid rgba(10,10,10,.7);transition:opacity .25s ease;}
.about-link a:hover{opacity:.55;}
.about-media{
  max-width:1080px;margin:0 auto 90px;aspect-ratio:16/9.4;
  background:radial-gradient(80% 90% at 30% 20%, #d9d9d6 0%, #bdbdb9 60%, #a8a8a4 100%);
}
.about-media .mono-label{color:rgba(0,0,0,.35);}

/* proof slideshow: real creator sponsor reads cycling with a brand caption
   (replaces the old team quadrant). Portrait-leaning frame so 9:16 reads fill it. */
.about-proof{
  position:relative;max-width:600px;margin:0 auto 90px;
  aspect-ratio:3/4;border-radius:var(--radius);overflow:hidden;background:#0b0b0b;
}
.proof-slide{position:absolute;inset:0;opacity:0;transition:opacity .8s ease;}
.proof-slide.is-active{opacity:1;}
.proof-slide video{width:100%;height:100%;object-fit:cover;display:block;}
.proof-cap{
  position:absolute;left:16px;bottom:16px;z-index:3;
  font-family:var(--font-mono);font-size:11px;font-weight:700;
  letter-spacing:.13em;text-transform:uppercase;color:#fff;
  padding:6px 12px;border:1px solid rgba(255,255,255,.35);border-radius:999px;
  background:rgba(0,0,0,.4);
}
.proof-haze{
  position:absolute;inset:0;z-index:2;pointer-events:none;
  background:linear-gradient(180deg, rgba(0,0,0,0) 52%, rgba(0,0,0,.5) 100%);
}
.proof-dots{position:absolute;right:16px;bottom:20px;z-index:3;display:flex;gap:6px;}
.proof-dots i{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,.34);transition:background .35s ease;}
.proof-dots i.on{background:#fff;}

/* ---- PROJECT PAGE ---- */
.project-hero{
  position:relative;
  background:var(--black);
  border-radius:0 0 var(--radius) var(--radius);
  margin:0 var(--inset);
  color:#fff;overflow:hidden;
  padding:190px 40px 56px;
}
.project-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(52% 46% at 80% 30%, rgb(var(--glow-rgb) / .5) 0%, transparent 70%),
    radial-gradient(40% 42% at 12% 85%, rgb(var(--glow-deep-rgb) / .45) 0%, transparent 70%);
}
.project-label{
  position:relative;
  font-family:var(--font-serif);font-size:clamp(26px, 2.6vw, 40px);
  margin-bottom:6px;color:#efefef;
}
.project-title-wrap{
  position:relative;
  font-family:var(--font-display);font-weight:400;
  font-size:clamp(64px, 10.5vw, 172px);line-height:.98;
}
.project-title{
  background:var(--grad-display);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.project-hero-media{
  position:relative;margin-top:52px;aspect-ratio:16/8;
}
.case{
  position:relative;
  background:var(--paper);
  padding:150px 24px 130px;
}
.case-inner{max-width:880px;margin:0 auto;}
.case h2{
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(40px, 4.6vw, 64px);letter-spacing:-.02em;line-height:1.05;
  color:var(--paper-ink);margin:96px 0 30px;
}
.case h2:first-child{margin-top:0;}
.case h3{
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(30px, 3.2vw, 46px);letter-spacing:-.015em;
  color:var(--paper-ink);margin:80px 0 24px;
}
.case p{
  font-size:clamp(18px, 1.8vw, 26px);line-height:1.5;
  color:var(--gray-body);font-weight:500;margin-bottom:26px;
}
.case p em{font-family:var(--font-serif);font-style:italic;color:#2e2e2e;}
.case ul{margin:6px 0 34px 24px;display:flex;flex-direction:column;gap:13px;}
.case li{font-size:clamp(17px, 1.7vw, 24px);line-height:1.4;color:var(--gray-body);font-weight:500;}
.case .media-ph{margin:44px 0 14px;}
.other{
  position:relative;
  background:var(--black);
  border-radius:var(--radius);
  margin:0 var(--inset);
  padding:110px 24px 90px;
  color:#fff;
}
.other-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:24px;}
@media (max-width: 900px){
  .other-grid{grid-template-columns:1fr;}
  .project-hero{padding:150px 24px 44px;}
}

/* ---- PREFOOTER + FOOTER ---- */
.prefooter{
  position:relative;
  background:var(--black);
  border-radius:var(--radius) var(--radius) 0 0;
  margin:0 var(--inset);
  color:#fff;text-align:center;
  padding:210px 24px 170px;
  overflow:hidden;
}
.prefooter::before,
.site-footer::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(46% 40% at 82% 18%, rgb(var(--glow-rgb) / .5) 0%, transparent 72%),
    radial-gradient(42% 44% at 12% 86%, rgb(var(--glow-deep-rgb) / .4) 0%, transparent 70%);
}
.prefooter-title{
  position:relative;
  font-family:var(--font-serif);font-weight:400;
  font-size:clamp(38px, 4.6vw, 68px);line-height:1.08;letter-spacing:-.015em;
  margin-bottom:60px;
}
.prefooter-title em{font-style:italic;color:#d8d8d4;}
.prefooter-cta{position:relative;color:#fff;}

.site-footer{
  position:relative;
  background:var(--black);
  margin:0 var(--inset);
  color:#fff;
  padding:110px 48px 36px;
  overflow:hidden;
}
.footer-grid{
  position:relative;
  display:grid;grid-template-columns:auto 1fr auto;gap:64px;align-items:start;
}
.brand-footer{font-size:64px;}
.footer-nav{display:flex;flex-direction:column;gap:18px;margin-left:8%;}
.footer-nav .mono-label{color:#fff;}
.footer-offices{display:flex;gap:40px;flex-wrap:wrap;justify-content:flex-end;}
.footer-address{
  font-style:normal;font-size:14.5px;line-height:1.55;color:#bdbdbd;text-align:left;
  max-width:200px;
}
.office-tag{
  display:block;margin-bottom:7px;
  font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.12em;
  font-size:11px;color:#8a8a8a;
}
.footer-small{
  position:relative;margin-top:90px;
  font-size:13px;color:#7d7d7d;font-family:var(--font-mono);letter-spacing:.08em;
}

/* ---- palette preview bar (only rendered when the URL has ?palette) ---- */
.palette-bar{
  position:fixed;left:50%;bottom:18px;transform:translateX(-50%);
  z-index:1500;display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:center;
  background:rgba(10,10,10,.94);border:1px solid rgba(255,255,255,.14);
  border-radius:14px;padding:10px 14px;max-width:min(96vw, 1100px);
}
.palette-bar .palette-readout{
  font-family:var(--font-mono);font-weight:700;font-size:12px;letter-spacing:.12em;
  text-transform:uppercase;color:#fff;margin-right:10px;white-space:nowrap;
}
.palette-bar button{
  display:flex;align-items:center;gap:7px;
  font-family:var(--font-mono);font-weight:500;font-size:11.5px;letter-spacing:.05em;
  color:#cfcfcf;padding:7px 10px;border-radius:9px;border:1px solid transparent;
  transition:all .2s ease;white-space:nowrap;
}
.palette-bar button:hover{color:#fff;background:rgba(255,255,255,.08);}
.palette-bar button.is-active{color:#111;background:#f2f2f2;border-color:#fff;}
.palette-bar button i{
  width:16px;height:16px;border-radius:50%;flex:none;border:1px solid rgba(0,0,0,.25);
}

/* ---- generic reveal ---- */
[data-reveal]{opacity:0;transform:translateY(34px);}
body.no-motion [data-reveal]{opacity:1;transform:none;}

/* ---- responsive ---- */
@media (max-width: 1180px){
  .work-grid{grid-template-columns:repeat(2, 1fr);}
}
@media (max-width: 900px){
  .hero-title{white-space:normal;font-size:clamp(52px, 15.4vw, 120px);line-height:.92;}
  .work-grid{grid-template-columns:1fr;}
  .process-wrap{grid-template-columns:1fr;}
  .process-media{position:relative;top:0;height:52vw;}
  /* stacked layout: no sticky hold, so drop the desktop trailing pad */
  .process-steps{gap:18vh;padding:6vh 0 8vh;}
  .footer-grid{grid-template-columns:1fr;gap:44px;}
  .footer-offices{justify-content:flex-start;gap:32px;}
  .footer-nav{margin-left:0;}
  .menu-panel{padding:110px 36px 40px;}
  .hero-helix{width:70%;opacity:.8;}
}

/* short / zoomed-in viewports: compress the hero stack so the first campaign
   analysis card always peeks above the fold, even at high browser zoom */
@media (max-height: 780px){
  .hero-inner{padding-top:84px;}
  .hero-title{font-size:clamp(46px, 7.4vw, 86px);}
  .hero-sub{margin-top:16px;font-size:clamp(21px, 2.5vw, 33px);}
  .hero-links{margin:24px 0 30px;}
  .marquee{padding:16px 0 22px;}
  .work{padding-top:30px;}
  .work-title{margin-bottom:20px;font-size:clamp(34px, 3.6vw, 52px);}
}
@media (max-height: 620px){
  .hero-inner{padding-top:72px;}
  .hero-title{font-size:clamp(40px, 6.4vw, 68px);}
  .hero-sub{font-size:clamp(19px, 2.2vw, 28px);}
  .hero-links{margin:18px 0 22px;}
  .work{padding-top:22px;}
}

/* ---- reduced motion ---- */
@media (prefers-reduced-motion: reduce){
  .grain,.bg-drift,.media-ph::before,.helix-fallback{animation:none !important;}
  .line{transform:none !important;animation:none !important;}
  .hero-links,.marquee{animation:none !important;opacity:1 !important;}
  [data-reveal]{opacity:1 !important;transform:none !important;}
  .cursor{display:none;}
}
