/* SONG YUANPENG — Director-led. AI-native.
   Commercial director / film studio. Near-black neutral base, ONE accent
   (the client's own brand gold, re-resolved into OKLch). Colour on this page
   comes from the films themselves — there is no categorical UI palette. */

/* ============================================================
   TOKENS — derivation + contrast proof in brand-spec.md
   ============================================================ */
:root{
  --bg:         oklch(15.0% 0.005 70);
  --bg-2:       oklch(18.2% 0.009 68);   /* section rhythm */
  --bg-3:       oklch(21.0% 0.008 70);   /* interstitial band */
  --surface:    oklch(19.6% 0.006 70);
  --surface-2:  oklch(23.5% 0.006 70);
  --fg:         oklch(95.5% 0.006 82);
  --muted:      oklch(68.0% 0.009 76);
  --line:       oklch(29.0% 0.006 70);
  --line-soft:  oklch(24.0% 0.006 70);
  --line-strong:oklch(52.0% 0.007 72);  /* control boundaries — ≥3.2:1 on bg/bg-2/bg-3 */
  --accent:     oklch(78.0% 0.115 78);
  --accent-ink: oklch(17.0% 0.020 75);

  --font-display:'Archivo','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;
  --font-body:'Instrument Sans','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;
  --font-mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;

  --shell: 1560px;
  --gut: clamp(20px, 4.2vw, 64px);
  --sec-y: clamp(80px, 11vw, 168px);
  --gap: clamp(14px, 1.8vw, 26px);
  --film-w: clamp(260px, 74vw, 1180px);
  --ease: cubic-bezier(.22,.61,.36,1);
  --t: .5s var(--ease);
}

*,*::before,*::after{box-sizing:border-box}
/* Author display rules would otherwise beat the UA [hidden] rule. */
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--bg);color:var(--fg);
  font-family:var(--font-body);font-size:16px;line-height:1.6;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
img,video,svg{display:block;max-width:100%}
img{height:auto}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
h1,h2,h3,h4{margin:0;font-family:var(--font-display);font-weight:700;line-height:.98;letter-spacing:-.03em}
p{margin:0;text-wrap:pretty}
ul,ol{margin:0;padding:0;list-style:none}
dl,dd{margin:0}
::selection{background:var(--accent);color:var(--accent-ink)}

.shell{width:100%;max-width:var(--shell);margin-inline:auto;padding-inline:var(--gut)}

:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:1px}
.skip{position:absolute;left:var(--gut);top:-100px;z-index:120;background:var(--accent);
      color:var(--accent-ink);padding:12px 18px;font:500 13px/1 var(--font-mono);transition:top .2s}
.skip:focus{top:12px}

/* ============================================================
   SLATE — the one flourish: a mono metadata rail
   ============================================================ */
.slate{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  font-family:var(--font-mono);font-size:11px;font-weight:500;
  letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.slate .tick{width:16px;height:1px;background:var(--accent);flex:none}
.slate .dot{opacity:.8}
.kicker{
  display:flex;align-items:center;gap:12px;
  font-family:var(--font-mono);font-size:11px;font-weight:500;
  letter-spacing:.18em;text-transform:uppercase;color:var(--accent);
}
.kicker .idx{color:var(--muted)}

/* ============================================================
   BUTTONS
   ============================================================ */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:10px;
  min-height:50px;padding:0 26px;border:1px solid var(--line-strong);
  font-family:var(--font-mono);font-size:12px;font-weight:500;
  letter-spacing:.12em;text-transform:uppercase;
  transition:background var(--t),color var(--t),border-color var(--t);
}
.btn-primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent)}
.btn-primary:hover{background:var(--fg);border-color:var(--fg);color:var(--bg)}
.btn-ghost:hover{background:var(--surface-2);border-color:var(--fg);color:var(--fg)}
.link-u{
  display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);
  font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--fg);
  border-bottom:1px solid var(--line);padding-bottom:5px;
  transition:border-color var(--t),color var(--t);
}
.link-u:hover{border-color:var(--accent)}
.link-u svg{transition:transform var(--t)}
.link-u:hover svg{transform:translateX(4px)}

/* ============================================================
   NAV
   ============================================================ */
.nav{
  position:fixed;inset:0 0 auto;z-index:60;
  border-bottom:1px solid transparent;
  transition:background var(--t),border-color var(--t);
}
.nav.is-stuck{background:oklch(15.0% 0.005 70 / .92);border-bottom-color:var(--line-soft)}
.nav-prog{position:absolute;left:0;bottom:-1px;height:1px;width:100%}
.nav-prog i{display:block;height:100%;width:0;background:var(--accent)}
.nav-in{display:flex;align-items:center;justify-content:space-between;gap:28px;
        min-height:74px;padding-block:14px}
.brand{display:flex;flex-direction:column;gap:3px;flex:none}
.brand b{font-family:var(--font-display);font-weight:800;font-size:15px;letter-spacing:.16em;line-height:1}
.brand span{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.2em;
            text-transform:uppercase;color:var(--muted);line-height:1}
.nav-links{display:flex;gap:clamp(16px,2.2vw,34px)}
.nav-links a{
  font-family:var(--font-mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);padding:6px 0;border-bottom:1px solid transparent;
  transition:color var(--t),border-color var(--t);
}
.nav-links a:hover{color:var(--fg);border-bottom-color:var(--accent)}
.nav-right{display:flex;align-items:center;gap:14px;flex:none}
.lang{display:flex;border:1px solid var(--line-strong)}
.lang a{
  display:flex;align-items:center;padding:8px 13px;font-family:var(--font-mono);font-size:11px;
  letter-spacing:.1em;color:var(--muted);transition:background var(--t),color var(--t);
  min-height:44px;min-width:44px;justify-content:center;
}
.lang a[aria-current="true"]{background:var(--surface-2);color:var(--fg)}
.lang a:hover{color:var(--fg);background:var(--surface)}
.nav .btn{min-height:44px;padding:0 18px;font-size:11px}
.burger{display:none;width:44px;height:44px;place-items:center;border:1px solid var(--line-strong)}
.burger i{display:block;width:17px;height:1px;background:var(--fg);position:relative}
.burger i::before,.burger i::after{content:"";position:absolute;left:0;width:17px;height:1px;background:var(--fg)}
.burger i::before{top:-5px}.burger i::after{top:5px}

.drawer{
  position:fixed;inset:0;z-index:55;background:var(--bg);
  display:flex;flex-direction:column;justify-content:center;gap:6px;
  padding:100px var(--gut) 48px;visibility:hidden;opacity:0;
  transition:opacity .3s var(--ease),visibility .3s;
}
.drawer.is-open{visibility:visible;opacity:1}
.drawer a{
  font-family:var(--font-display);font-weight:700;font-size:clamp(30px,9vw,46px);
  letter-spacing:-.03em;padding:10px 0;border-bottom:1px solid var(--line-soft);
  transition:border-color var(--t),padding-left var(--t);
}
.drawer a:hover{border-bottom-color:var(--accent);padding-left:12px}
.drawer .drawer-cta{
  align-self:flex-start;margin-top:26px;font-family:var(--font-mono);
  font-size:12px;font-weight:500;letter-spacing:.12em;padding:0 26px;
  border-bottom:1px solid var(--line-strong);min-height:50px;
}
.drawer .slate{margin-top:28px}

/* ============================================================
   MEDIA SURFACE
   ============================================================ */
.surface{position:relative;margin:0;overflow:hidden;background:var(--surface)}
/* Real <img>, not a CSS background: the background-image/var(--poster) approach
   silently failed to paint in the preview and export environments, leaving every
   media box empty. An <img src> loads over exactly the same path as the
   stylesheet that already resolves. */
.surface-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.surface video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity .6s var(--ease)}
.surface video.is-live{opacity:1}

/* ============================================================
   HERO — the reel is the first screen
   ============================================================ */
.hero{
  position:relative;min-height:100svh;display:flex;flex-direction:column;
  justify-content:flex-end;overflow:hidden;background:var(--bg);
}
.hero-media{position:absolute;inset:0;transition:opacity .8s var(--ease)}
.hero-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity .8s var(--ease)}
body.has-reel .hero-video{opacity:1}
body.has-reel .hero-media{opacity:0}
/* Stand-in reel: real frames cross-fading under a slow drift. */
.rf{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity 1.2s var(--ease);
  animation:rfDrift 28s ease-in-out infinite alternate;
}
.rf.is-on{opacity:1}
@keyframes rfDrift{from{transform:scale(1.02)}to{transform:scale(1.1)}}
.hero-scrim{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(to top,
      oklch(15.0% 0.005 70 / .96) 0%,
      oklch(15.0% 0.005 70 / .86) 22%,
      oklch(15.0% 0.005 70 / .46) 48%,
      oklch(15.0% 0.005 70 / .12) 72%,
      oklch(15.0% 0.005 70 / .58) 100%);
}
.hero-in{position:relative;z-index:2;width:100%;padding-bottom:clamp(28px,4vw,56px)}
.hero h1{
  font-size:clamp(40px,8.4vw,132px);font-weight:800;letter-spacing:-.045em;
  line-height:.94;margin:20px 0 22px;
}
.hero .eyebrow{color:var(--fg)}
.hero .eyebrow .tick{width:26px}
.hero-lede{max-width:46ch;font-size:clamp(15px,1.15vw,19px);color:oklch(90% 0.008 80)}
.hero-act{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:clamp(24px,3vw,34px)}
.hero-slate{
  display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;
  border-top:1px solid oklch(95.5% 0.006 82 / .16);
  padding-top:14px;margin-top:clamp(26px,3.6vw,50px);
}

/* ============================================================
   SECTION SCAFFOLD
   ============================================================ */
.section{padding-block:var(--sec-y);border-bottom:1px solid var(--line)}
.section:last-of-type{border-bottom:0}
.section--alt{background:var(--bg-2)}
.sec-head{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,24rem);
  gap:clamp(24px,4vw,64px);align-items:end;
  padding-bottom:clamp(34px,4.5vw,64px);
}
.sec-head .h2{font-size:clamp(32px,4.4vw,68px);margin-top:20px}
.sec-head .lede{font-size:clamp(14.5px,1.05vw,16.5px);color:var(--muted);max-width:44ch}
.sec-work{padding-bottom:clamp(60px,8vw,110px)}

/* ============================================================
   RAIL — native horizontal scroll + scroll-snap.
   The vertical wheel is never intercepted, so the page scrolls
   straight past this section.
   ============================================================ */
.rail-host{position:relative}
.rail{
  display:flex;align-items:stretch;gap:var(--gap);
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  padding-block:2px 4px;
}
.rail::-webkit-scrollbar{display:none}
.rail.is-drag{scroll-snap-type:none;cursor:grabbing;user-select:none}
.rail:focus-visible{outline:2px solid var(--accent);outline-offset:6px}
.rail-film{
  --pad: max(var(--gut), calc((100% - var(--shell)) / 2 + var(--gut)));
  padding-inline:var(--pad);
  scroll-padding-inline-start:var(--pad);
}
.rail-nav{display:flex;align-items:center;gap:18px;margin-top:clamp(20px,2.4vw,34px)}
.rail-btns{display:flex;gap:8px;flex:none}
.rail-btn{
  width:46px;height:46px;flex:none;display:grid;place-items:center;
  border:1px solid var(--line-strong);color:var(--fg);
  transition:background var(--t),border-color var(--t);
}
.rail-btn svg{width:14px;height:14px}
.rail-btn:hover:not([disabled]){background:var(--surface-2);border-color:var(--fg)}
.rail-btn[disabled]{opacity:.3;cursor:default}
.rail-count{margin-inline-start:4px}
.rail-hint{margin-inline-start:auto}

/* ============================================================
   FILM STRIP
   ============================================================ */
.film{flex:0 0 var(--film-w);scroll-snap-align:start;
      display:flex;flex-direction:column;gap:16px;margin:0}
.film-surface{aspect-ratio:16/9;border:1px solid var(--line)}
.film-open{position:absolute;inset:0;z-index:3;display:grid;place-items:center;
  background:oklch(15% 0.005 70 / 0);transition:background var(--t)}
.film-open .ring{
  width:66px;height:66px;border:1px solid oklch(95.5% 0.006 82 / .7);
  display:grid;place-items:center;background:oklch(15% 0.005 70 / .6);
  opacity:0;transform:scale(.92);transition:opacity var(--t),transform var(--t);
}
.film-open .ring svg{width:13px;height:15px;fill:var(--fg);transition:fill var(--t)}
.film:hover .film-open{background:oklch(15% 0.005 70 / .3)}
.film:hover .film-open .ring,
.film-open:focus-visible .ring{opacity:1;transform:none}
.film-open:hover .ring{background:var(--accent);border-color:var(--accent)}
.film-open:hover .ring svg{fill:var(--accent-ink)}
.film-badge{
  position:absolute;top:14px;left:16px;z-index:4;
  font-family:var(--font-mono);font-size:10px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;
  color:var(--accent-ink);background:var(--accent);padding:7px 11px;
}
.film-meta{display:flex;flex-direction:column;gap:10px}
.film-top{display:flex;align-items:baseline;justify-content:space-between;gap:20px}
.film-top h3{font-size:clamp(19px,1.9vw,30px)}
.film-dur{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;
          text-transform:uppercase;color:var(--muted);flex:none}
.film-one{color:var(--muted);font-size:clamp(14px,1vw,15.5px);max-width:60ch}

/* ============================================================
   VISUAL DIRECTION — editorial collage; only the two small
   modules slide, the page itself stays static.
   ============================================================ */
.vd{display:flex;flex-direction:column;gap:var(--gap)}
.vd-hero{margin:0;display:flex;flex-direction:column;gap:12px}
.vd-hero .surface{aspect-ratio:var(--vd-ar,2.39/1);border:1px solid var(--line)}
.vd-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--gap)}
.vd-mod{margin:0;display:flex;flex-direction:column;gap:14px;min-width:0}
/* Both rails run the full width: the character selection is now mixed portrait /
   landscape, and four 16:9 plates in a 5-column rail would show barely one at a time. */
.vd-char,.vd-world{grid-column:span 12}
.vd-frames{grid-column:span 12}
.vd-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex:none}
.vd-tools{display:flex;align-items:center;gap:clamp(10px,1.2vw,18px);flex:none}
.vd-tools .rail-count{margin-inline-start:0}
.vd-label{font-family:var(--font-display);font-weight:700;
          font-size:clamp(15px,1.2vw,19px);letter-spacing:-.015em}

.rail-mini{flex:none;padding-block:0 2px}
/* Card size is fully explicit — width derived from height x ratio — so the rail
   never depends on intrinsic aspect-ratio sizing to lay out. 3:4 portraits and
   16:9 scene frames share one height, so the two columns stay aligned. */
.rail-item{
  --ih:clamp(230px,22vw,320px);
  --ar:1;
  position:relative;flex:0 0 auto;margin:0;scroll-snap-align:start;
  height:var(--ih);width:calc(var(--ih) * var(--ar));
}
.rail-item .surface{position:absolute;inset:0;border:1px solid var(--line)}
.rail-item::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:38%;z-index:2;
  pointer-events:none;
  background:linear-gradient(to top,oklch(15% 0.005 70 / .82),transparent);
}
.rail-item figcaption{
  position:absolute;left:12px;right:12px;bottom:10px;z-index:3;
  text-shadow:0 1px 10px oklch(15% 0.005 70 / .95);
}

/* ============================================================
   DIRECTOR-LED BAND
   ============================================================ */
.band{
  background:var(--bg-3);
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding-block:var(--sec-y);
}
.band-in{
  display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);
  gap:clamp(28px,5vw,80px);align-items:start;
}
.band-h{font-size:clamp(34px,5vw,76px);line-height:.98;letter-spacing:-.035em}
.band-lede{font-size:clamp(15.5px,1.2vw,19px);color:oklch(88% 0.007 80);max-width:48ch}
.band-list{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  border-top:1px solid var(--line);margin-top:clamp(24px,3vw,40px);
}
.band-list li{padding:20px 22px 20px 0;border-bottom:1px solid var(--line-soft);
              display:flex;flex-direction:column;gap:7px}
.band-list li:nth-child(even){padding-left:22px;border-left:1px solid var(--line-soft)}
.band-list b{font-family:var(--font-display);font-weight:700;
             font-size:clamp(16px,1.35vw,21px);letter-spacing:-.02em}
.band-list span{color:var(--muted);font-size:clamp(13.5px,1vw,15px)}

/* ============================================================
   PRODUCTION SYSTEM
   ============================================================ */
.ps{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);
    gap:clamp(22px,3.4vw,58px);align-items:start}
.ps-media{position:relative}
.ps-media .surface{aspect-ratio:16/9;border:1px solid var(--line)}
.ps-slate-card{
  position:absolute;inset:0;z-index:3;display:flex;flex-direction:column;
  justify-content:center;padding:clamp(18px,2.2vw,30px);pointer-events:none;
  background:radial-gradient(120% 120% at 78% 18%,
    oklch(23.5% 0.006 70 / .85) 0%, oklch(15% 0.005 70 / .96) 62%);
}
.ps-media.has-video .ps-slate-card{opacity:0;visibility:hidden;
  transition:opacity .5s var(--ease),visibility .5s}
.ps-slate-mid{text-align:center;padding-inline:8%}
.ps-slate-mid h3{font-size:clamp(20px,2vw,30px);margin-bottom:12px}
.ps-slate-mid p{font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;
  color:var(--muted);text-transform:uppercase}
.ps-play{position:absolute;inset:0;z-index:4;display:none;place-items:center}
.ps-media.has-video .ps-play{display:grid}
.ps-play .ring{width:76px;height:76px;border:1px solid oklch(95.5% 0.006 82 / .5);
  display:grid;place-items:center;background:oklch(15% 0.005 70 / .55);
  transition:background var(--t),border-color var(--t),transform var(--t)}
.ps-play .ring svg{width:14px;height:16px;fill:var(--fg);transition:fill var(--t)}
.ps-play:hover .ring{background:var(--accent);border-color:var(--accent);transform:scale(1.05)}
.ps-play:hover .ring svg{fill:var(--accent-ink)}

.pipe{border-top:1px solid var(--line)}
.pipe li{border-bottom:1px solid var(--line-soft)}
.pipe button{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;
  gap:clamp(12px,1.6vw,22px);width:100%;text-align:left;
  min-height:64px;padding:16px 0;transition:padding-left var(--t),background var(--t);
}
.pipe button:hover{padding-left:10px;background:oklch(19.6% 0.006 70 / .55)}
.pipe .pn{font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;
  color:var(--muted);transition:color var(--t);flex:none}
.pipe .pl{font-family:var(--font-display);font-weight:600;font-size:clamp(15px,1.25vw,19px);
  letter-spacing:-.015em;color:var(--muted);transition:color var(--t)}
.pipe .pp{font-family:var(--font-mono);font-size:10px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted);flex:none;
  opacity:0;transform:translateX(-6px);transition:opacity var(--t),transform var(--t)}
.pipe li.is-on .pn{color:var(--accent)}
.pipe li.is-on .pl{color:var(--fg)}
.pipe li.is-on .pp{opacity:1;transform:none}
.pipe button:hover .pn{color:var(--accent)}
.pipe button:hover .pl{color:var(--fg)}
.pipe button:hover .pp{opacity:1;transform:none}
.pipe-desc{
  margin-top:22px;border:1px solid var(--line);padding:22px 24px;
  display:flex;flex-direction:column;gap:9px;min-height:118px;justify-content:center;
}
.pipe-desc .pn{font-family:var(--font-mono);font-size:11px;letter-spacing:.16em;color:var(--accent)}
.pipe-desc p{color:var(--muted);font-size:clamp(14px,1vw,15.5px)}

/* ============================================================
   SERVICES — typographic list, no large colour cards
   ============================================================ */
.svc-list{border-top:1px solid var(--line)}
.svc-row{
  display:grid;grid-template-columns:auto minmax(0,1fr) minmax(0,19rem);
  gap:clamp(18px,3vw,48px);align-items:start;
  padding:clamp(24px,3vw,42px) 0;border-bottom:1px solid var(--line-soft);
}
.svc-i{font-family:var(--font-mono);font-size:11px;letter-spacing:.16em;
       color:var(--accent);padding-top:6px}
.svc-main h3{font-size:clamp(20px,2.2vw,34px)}
.svc-main p{color:var(--muted);font-size:clamp(14px,1.05vw,16px);max-width:56ch;margin-top:10px}
.svc-out{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.1em;
         text-transform:uppercase;color:var(--muted);text-align:right;
         padding-top:8px;line-height:1.9}

/* ============================================================
   DIRECTOR
   ============================================================ */
.studio{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
        gap:clamp(28px,4vw,72px);align-items:start}
.studio-h{font-size:clamp(27px,3.4vw,52px);margin-top:18px}
.studio-copy p{font-size:clamp(15px,1.15vw,18px);color:oklch(88% 0.007 80);
               max-width:58ch;margin-top:20px}
.studio-side{display:flex;flex-direction:column;gap:clamp(22px,3vw,36px)}
.numbers{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
         border-top:1px solid var(--line)}
.num{padding:22px 18px 22px 0;border-bottom:1px solid var(--line-soft);
     display:flex;flex-direction:column;gap:9px}
.num + .num{padding-left:18px;border-left:1px solid var(--line-soft)}
.num dd{order:-1;font-family:var(--font-display);font-weight:800;
        font-size:clamp(34px,3.6vw,58px);letter-spacing:-.04em;line-height:1}
.num .unit{font-size:.42em;font-weight:700;letter-spacing:0;margin-left:5px}
.num dt{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.13em;
        text-transform:uppercase;color:var(--muted);line-height:1.6}

/* ============================================================
   CONTACT
   ============================================================ */
.contact-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.82fr);
              gap:clamp(28px,4vw,72px);align-items:start}
.contact-grid .h2{font-size:clamp(32px,4.4vw,68px);margin-top:20px}
.contact-grid .lede{color:var(--muted);font-size:clamp(15px,1.1vw,17px);
                    max-width:44ch;margin-top:20px}
.contact-act{margin-top:30px;display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.c-rows{border-top:1px solid var(--line)}
.c-row{
  position:relative;display:grid;grid-template-columns:auto minmax(0,1fr);
  gap:20px;align-items:center;padding:18px 0;border-bottom:1px solid var(--line-soft);
}
.c-row dt{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.16em;
          text-transform:uppercase;color:var(--muted);transition:color var(--t)}
.c-row dd{font-family:var(--font-display);font-weight:600;
          font-size:clamp(16px,1.35vw,21px);letter-spacing:-.015em;word-break:break-word}
.c-row dd a{color:inherit}
/* Stretched link: valid inside <dl> while the whole row stays the hit area. */
.c-row dd a::after{content:"";position:absolute;inset:0}
.c-row-link{transition:background var(--t)}
.c-row-link:hover{background:oklch(19.6% 0.006 70 / .5)}
.c-row-link:hover dt{color:var(--fg)}
.c-row-link:hover dd{text-decoration:underline;text-decoration-color:var(--accent);
                     text-decoration-thickness:1px;text-underline-offset:6px}
.c-copy{
  display:flex;align-items:center;gap:12px;min-height:44px;margin:-8px 0;
  font-family:var(--font-display);font-weight:600;
  font-size:clamp(16px,1.35vw,21px);letter-spacing:-.015em;color:var(--fg);
}
.c-copy .c-copy-hint{
  font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--line);
  padding-bottom:2px;transition:color var(--t),border-color var(--t);
}
.c-copy:hover .c-copy-hint,
.c-copy.is-copied .c-copy-hint{color:var(--accent);border-bottom-color:var(--accent)}

/* ============================================================
   FOOTER
   ============================================================ */
.foot{padding-block:clamp(40px,5vw,64px)}
.foot-top{display:flex;justify-content:space-between;gap:32px;flex-wrap:wrap;
          padding-bottom:30px;border-bottom:1px solid var(--line)}
.foot-nav{display:flex;gap:clamp(14px,2vw,30px);flex-wrap:wrap}
.foot-nav a,.foot-docs a{
  font-family:var(--font-mono);font-size:11px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--muted);transition:color var(--t);
}
.foot-nav a:hover,.foot-docs a:hover{color:var(--accent)}
.foot-bot{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;
          padding-top:22px;align-items:center}
.foot-docs{display:flex;gap:18px;flex-wrap:wrap}

/* ============================================================
   LIGHTBOX
   ============================================================ */
.lb{
  width:min(1180px,94vw);max-width:94vw;max-height:94svh;
  margin:auto;padding:0;border:0;background:transparent;color:var(--fg);
  overflow:visible;
}
.lb::backdrop{background:oklch(10% 0.005 70 / .94)}
.lb-in{
  position:relative;background:var(--bg);border:1px solid var(--line);
  padding:clamp(14px,1.6vw,22px);display:flex;flex-direction:column;
  gap:clamp(14px,1.6vw,20px);
}
.lb-media{position:relative;width:100%;aspect-ratio:16/9;background:oklch(0% 0 0);
          border:1px solid var(--line)}
.lb-media video{position:absolute;inset:0;width:100%;height:100%;
                object-fit:contain;background:oklch(0% 0 0);opacity:1}
.lb-media .surface-media{object-fit:contain}
.lb-close{
  position:absolute;z-index:5;width:44px;height:44px;display:grid;place-items:center;
  top:calc(clamp(14px,1.6vw,22px) + 12px);right:calc(clamp(14px,1.6vw,22px) + 12px);
  border:1px solid oklch(95.5% 0.006 82 / .5);
  background:oklch(15% 0.005 70 / .72);color:var(--fg);
  transition:background var(--t),border-color var(--t),color var(--t);
}
.lb-close:hover{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.lb-close svg{width:14px;height:14px}
.lb-meta{display:flex;flex-direction:column;gap:10px;padding-bottom:4px}
.lb-meta h3{font-size:clamp(20px,2vw,30px)}
.lb-meta p{color:var(--muted);font-size:clamp(14px,1vw,15.5px);max-width:64ch}

/* ============================================================
   REVEAL
   ============================================================ */
.js [data-reveal]{opacity:0;transform:translateY(16px);
  transition:opacity .8s var(--ease),transform .8s var(--ease);
  transition-delay:var(--d,0ms)}
.js [data-reveal].is-in{opacity:1;transform:none}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width:1180px){
  .nav-links{display:none}
  .burger{display:grid}
  .ps,.studio,.contact-grid,.band-in{grid-template-columns:minmax(0,1fr)}
  .rail-item{--ih:clamp(200px,40vw,320px)}
  .svc-row{grid-template-columns:auto minmax(0,1fr);gap:14px 20px}
  .svc-out{grid-column:2;text-align:left;padding-top:0}
  .studio-side{max-width:620px}
}
@media (max-width:900px){
  .sec-head{grid-template-columns:minmax(0,1fr);align-items:start}
  .sec-head .lede{max-width:56ch}
  .rail-hint{display:none}
  .band-list{grid-template-columns:minmax(0,1fr)}
  .band-list li:nth-child(even){padding-left:0;border-left:0}
  .numbers{grid-template-columns:repeat(2,minmax(0,1fr))}
  .num:nth-child(odd){padding-left:0;border-left:0}
}
@media (max-width:600px){
  :root{--sec-y:clamp(64px,13vw,96px);--film-w:clamp(250px,80vw,1180px)}
  .hero h1{margin:16px 0 18px}
  .hero-lede{font-size:15px}
  .hero-act{gap:10px}
  .hero-act .btn{width:100%;justify-content:center}
  .hero-slate{gap:12px;font-size:10px}
  .hero-slate .slate:last-child{display:none}
  .nav-in{min-height:66px}
  .brand b{font-size:13px}
  .nav .btn{display:none}
  .numbers{grid-template-columns:minmax(0,1fr)}
  .num + .num{padding-left:0;border-left:0}
  .rail-btn{width:44px;height:44px}
  .svc-row{grid-template-columns:minmax(0,1fr);gap:10px}
  .svc-i{padding-top:0}
  .svc-out{grid-column:1}
  .lb-media{aspect-ratio:16/10}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}
  .js [data-reveal]{opacity:1;transform:none}
  .rf{animation:none;transform:none}
}

/* ============================================================
   DIRECTOR'S EYE — Frames.
   The plates are all portrait, so they run as one horizontal rail
   exactly like Characters and World: one shared height, width taken
   from each plate's own ratio. The two wider plates (0.7467) read
   larger than the four narrow ones (0.5628) — that is the rhythm.
   Sized above the other two rails so Frames still leads the screen.
   ============================================================ */
.vd-frames .rail-item{--ih:clamp(280px,29vw,440px)}

/* Service rows gain one entry point to their detail page. */
.svc-link{
  display:inline-flex;align-items:center;gap:8px;margin-top:16px;min-height:34px;
  font-family:var(--font-mono);font-size:11px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--fg);border-bottom:1px solid var(--line);padding-bottom:4px;align-self:flex-start;
  transition:border-color var(--t),color var(--t);
}
.svc-link:hover{border-color:var(--accent);color:var(--fg)}
.svc-link svg{transition:transform var(--t)}
.svc-link:hover svg{transform:translateX(4px)}

/* ============================================================
   INNER PAGES — service detail / case study.
   Editorial label-left, content-right blocks. No cards.
   ============================================================ */
.phero{padding-block:clamp(112px,13vw,178px) clamp(34px,4.4vw,60px)}
.phero .kicker{margin-bottom:20px}
.phero .h1{font-size:clamp(32px,5vw,72px);font-weight:800;letter-spacing:-.04em;line-height:.98}
.phero .lede{margin-top:22px;max-width:52ch;color:var(--muted);
  font-size:clamp(15px,1.15vw,18px)}
.phero-act{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-top:30px}

.blk{padding-block:clamp(38px,5vw,74px);border-top:1px solid var(--line)}
.blk-h{display:grid;grid-template-columns:minmax(0,.34fr) minmax(0,1fr);
  gap:clamp(18px,3.4vw,64px);align-items:start}
.blk-label{font-family:var(--font-mono);font-size:11px;font-weight:500;letter-spacing:.16em;
  text-transform:uppercase;color:var(--accent)}
.blk-body h2{font-size:clamp(22px,2.5vw,40px);margin-bottom:18px}
.blk-body p{color:var(--muted);font-size:clamp(14.5px,1.05vw,16.5px);max-width:62ch}
.blk-body p + p{margin-top:14px}
.blk-body strong{color:var(--fg);font-weight:600}

.ticks{margin-top:22px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 30px}
.ticks li{position:relative;padding:12px 0 12px 24px;border-bottom:1px solid var(--line-soft);
  font-size:clamp(14px,1vw,15.5px);color:var(--fg)}
.ticks li::before{content:"";position:absolute;left:0;top:20px;width:11px;height:1px;
  background:var(--accent)}

.flow{margin-top:26px;border-top:1px solid var(--line)}
.flow li{display:grid;grid-template-columns:auto minmax(0,1fr);gap:clamp(14px,2vw,30px);
  padding:20px 0;border-bottom:1px solid var(--line-soft);align-items:start}
.flow .fn{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;color:var(--accent);
  padding-top:4px}
.flow b{display:block;font-family:var(--font-display);font-weight:700;
  font-size:clamp(16px,1.35vw,21px);letter-spacing:-.02em}
.flow span{display:block;margin-top:7px;color:var(--muted);
  font-size:clamp(13.5px,1vw,15px);max-width:60ch}

.rel-case{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:22px;align-items:center;
  border:1px solid var(--line);background:var(--surface);padding:clamp(20px,2.6vw,34px)}
.rel-case h3{font-size:clamp(17px,1.65vw,25px)}
.rel-case p{margin-top:9px;color:var(--muted);font-size:clamp(13.5px,1vw,15px);max-width:56ch}

/* Labelled placeholder — a real, deliberate slot, never a broken box. */
.ph-slot{
  display:grid;place-items:center;text-align:center;gap:8px;
  min-height:clamp(150px,20vw,240px);padding:26px;
  border:1px dashed var(--line-strong);background:var(--surface);
  font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted);line-height:1.8;
}
.ph-slot b{display:block;color:var(--fg);font-weight:500;letter-spacing:.14em}

.cta-end{border-top:1px solid var(--line);padding-block:clamp(54px,7vw,108px);text-align:center}
.cta-end h2{font-size:clamp(26px,3.4vw,52px)}
.cta-end p{margin:18px auto 30px;max-width:48ch;color:var(--muted);
  font-size:clamp(14.5px,1.05vw,16.5px)}
.cta-end .phero-act{justify-content:center;margin-top:0}

/* ============================================================
   ROOT CHOOSER + 404
   ============================================================ */
.gate{min-height:100svh;display:grid;place-items:center;padding:var(--gut)}
.gate-in{width:min(780px,100%)}
.gate .h1{font-size:clamp(30px,4.6vw,64px);font-weight:800;letter-spacing:-.04em;line-height:1}
.gate-lede{margin-top:20px;color:var(--muted);font-size:clamp(14.5px,1.1vw,17px);max-width:46ch}
.gate-opts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap);
  margin-top:clamp(28px,4vw,46px)}
.gate--404 .gate-opts{grid-template-columns:repeat(3,minmax(0,1fr))}
.gate-opt{display:flex;flex-direction:column;gap:10px;min-height:132px;justify-content:center;
  padding:clamp(22px,2.8vw,34px);border:1px solid var(--line-strong);background:var(--surface);
  transition:background var(--t),border-color var(--t)}
.gate-opt:hover{background:var(--surface-2);border-color:var(--fg)}
.gate-opt b{font-family:var(--font-display);font-weight:800;
  font-size:clamp(20px,2.4vw,32px);letter-spacing:-.025em}
.gate-opt span{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.15em;
  text-transform:uppercase;color:var(--muted)}

@media (max-width:900px){
  .blk-h{grid-template-columns:minmax(0,1fr)}
  .rel-case{grid-template-columns:minmax(0,1fr);align-items:start}
}
@media (max-width:600px){
  .ticks{grid-template-columns:minmax(0,1fr)}
  .gate-opts,.gate--404 .gate-opts{grid-template-columns:minmax(0,1fr)}
  .gate-opt{min-height:104px}
}

/* ============================================================
   FLOATING CTA — the persistent commercial entry.
   Deliberately secondary: an outline control, not a second solid
   primary, so the page never shows two primary buttons at once.
   It retracts at the first screen and whenever the closing CTA or
   the footer is in view, so it never doubles up or covers them.
   z-index 50 sits under the drawer (55) and nav (60).
   ============================================================ */
.float-cta{
  position:fixed;z-index:50;
  right:calc(var(--gut) * .6);
  bottom:calc(var(--gut) * .6 + env(safe-area-inset-bottom, 0px));
  display:inline-flex;align-items:center;gap:10px;
  min-height:46px;padding:0 20px;
  background:oklch(19.6% 0.006 70 / .94);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border:1px solid var(--line-strong);color:var(--fg);
  font-family:var(--font-mono);font-size:11px;font-weight:500;
  letter-spacing:.14em;text-transform:uppercase;
  opacity:0;visibility:hidden;transform:translateY(10px);
  transition:opacity var(--t),transform var(--t),visibility var(--t),
             background var(--t),border-color var(--t);
}
.float-cta.is-on{opacity:1;visibility:visible;transform:none}
.float-cta:hover{background:var(--surface-2);border-color:var(--fg)}
.float-cta svg{width:13px;height:13px;flex:none;transition:transform var(--t)}
.float-cta:hover svg{transform:translateX(4px)}

@media (max-width:600px){
  .float-cta{
    right:14px;
    bottom:calc(14px + env(safe-area-inset-bottom, 0px));
    min-height:44px;padding:0 16px;font-size:10.5px;letter-spacing:.12em;gap:8px;
  }
}

/* ============================================================
   BACKGROUND ATMOSPHERE
   Three restrained devices, all of them flat and static. None of
   them sits above content, and none of them competes with a frame:

     1. GRAIN      a 220px tile of monochrome noise, alpha capped at
                   5%, laid into the background layer of every large
                   opaque surface. It only stops the dark base from
                   reading as flat colour.
     2. GLOW       one very soft warm pool per accent block, anchored
                   to a corner and clipped to its own section, so it
                   reads as light in the room rather than a colour
                   panel. Derived from --accent at 7.5% peak.
     3. TONAL STEP unchanged: the existing --bg / --bg-2 / --bg-3
                   ladder (15.0 / 18.2 / 21.0) already separates the
                   section types; the glow only softens the join.

   No grids, no particles, no motion, no saturated wash.
   Retune the grain by editing slope='.09' inside --grain.
   ============================================================ */
:root{
  --grain: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='g'><feTurbulence type='fractalNoise' baseFrequency='.65' numOctaves='3' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/><feComponentTransfer><feFuncA type='linear' slope='.09'/></feComponentTransfer></filter><rect width='220' height='220' filter='url(%23g)'/></svg>");

  /* warm pool, top-right — the house treatment for accent sections */
  --glow-a: radial-gradient(58% 58% at 100% 0%,
      oklch(78.0% 0.115 78 / .13) 0%,
      oklch(78.0% 0.115 78 / .05) 46%,
      transparent 100%);
  /* mirrored and wider, top-left — used for the bookend blocks */
  --glow-b: radial-gradient(62% 62% at 0% 0%,
      oklch(78.0% 0.115 78 / .105) 0%,
      oklch(78.0% 0.115 78 / .04) 46%,
      transparent 100%);
}

body,
.hero,
.section--alt,
.band,
.drawer{
  background-image:var(--grain);
  background-repeat:repeat;
  background-size:220px 220px;
}

/* the glow needs its own stacking context so z-index:-1 lands above the
   section's own background but still under every child */
.hero,.section,.band,.phero,.cta-end,.gate{position:relative;z-index:0}

.section--alt::before,
.band::before,
.gate::before{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background-image:var(--glow-a);
  background-repeat:no-repeat;
  background-position:100% 0%;
  background-size:min(980px,86%) min(700px,64%);
}
.phero::before,
.cta-end::before{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background-image:var(--glow-b);
  background-repeat:no-repeat;
  background-position:0% 0%;
  background-size:min(1040px,90%) min(620px,70%);
}

/* The Hero carries a full-bleed frame, so its atmosphere comes from the
   image itself — it only gains a low vignette, no colour pool. */
.hero-scrim{
  background:
    radial-gradient(125% 95% at 50% 40%, transparent 46%, oklch(15.0% 0.005 70 / .34) 100%),
    linear-gradient(to top,
      oklch(15.0% 0.005 70 / .96) 0%,
      oklch(15.0% 0.005 70 / .86) 22%,
      oklch(15.0% 0.005 70 / .46) 48%,
      oklch(15.0% 0.005 70 / .12) 72%,
      oklch(15.0% 0.005 70 / .58) 100%);
}

/* ============================================================
   INNER-PAGE SECTION RHYTHM
   Service and case pages stack five or six full-width blocks in a
   row, so the two-tone ladder alone reads as one flat field. These
   pages get a third tone that sits between --bg and --bg-2, plus a
   soft lit top edge on every block. Adjacent blocks then differ by
   ~1.4-1.8 L, which is felt while scrolling but never reads as a
   black panel next to a grey one.
   The homepage ladder is untouched.
   ============================================================ */
:root{
  --bg-1: oklch(17.4% 0.008 69);   /* inner-page block, between --bg and --bg-2 */
  --edge: linear-gradient(to bottom,
      oklch(23.5% 0.006 70 / .20) 0%,
      oklch(23.5% 0.006 70 / 0) 100%);
}

#main .phero,
#main .section,
#main .cta-end{
  background-color:var(--bg);
  background-image:var(--grain), var(--edge);
  background-repeat:repeat, no-repeat;
  background-size:220px 220px, 100% 150px;
}
#main .section{background-color:var(--bg-1)}
#main .section--alt{background-color:var(--bg-2)}

/* Auto-drifting rails cannot hold scroll-snap: the browser re-snaps
   between frames and fights the drift. Manual drag and the arrows
   keep working exactly as before. */
.rail.is-auto{scroll-snap-type:none}

@media (max-width:600px){
  /* a large tile wastes nothing on a small screen; keep the pool tighter */
  body,.hero,.section--alt,.band,.drawer{background-size:160px 160px}
  #main .phero,#main .section,#main .cta-end{background-size:160px 160px, 100% 120px}
  .section--alt::before,.band::before,.gate::before,
  .phero::before,.cta-end::before{background-size:min(520px,100%) min(420px,70%)}
}
