/* ==========================================================================
   Lusion recreation — site.css
   A faithful re-build of lusion.co (Aeonik + IBM Plex Mono, real tokens).
   ========================================================================== */

/* ------------------------------------------------------------------ fonts */
@font-face{font-family:"Aeonik";src:url("../assets/fonts/Aeonik-Regular.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"Aeonik";src:url("../assets/fonts/Aeonik-Medium.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:"Aeonik";src:url("../assets/fonts/Aeonik-RegularItalic.woff2") format("woff2");font-weight:400;font-style:italic;font-display:swap}
@font-face{font-family:"IBMPlexMono";src:url("../assets/fonts/IBMPlexMono-Regular.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"IBMPlexMono";src:url("../assets/fonts/IBMPlexMono-Medium.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap}

/* ------------------------------------------------------------------ tokens */
:root{
  --blue:#1a2ffb; --dark-blue:#071bdf; --header-color:#0016ec;
  --white:#ffffff; --off-white:#f0f1fa; --dark-white:#e4e6ef;
  --ink:#111318; --black:#0b0b0e; --bg:#111111; --grey-blue:#2b2e3a;
  --green:#c1ff00; --red:#ff4c41; --purple:#8832f7;
  --font:"Aeonik","Helvetica Neue",Arial,sans-serif;
  --mono:"IBMPlexMono","IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
  --ease:cubic-bezier(.22,1,.36,1);
  --pad:clamp(20px,4.4vw,64px);
  --maxw:1600px;
}

*{margin:0;padding:0;box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
html,body{background:var(--bg);color:var(--white);font-family:var(--font);
  font-weight:400;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
body{overflow-x:hidden}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
img{display:block;max-width:100%}
::selection{background:var(--blue);color:#fff}
h1,h2,h3,h4{font-weight:500;letter-spacing:-.02em;line-height:1.02;text-wrap:balance}

/* hide the native cursor on fine pointers (custom cursor takes over) */
@media (hover:hover) and (pointer:fine){ html.cursor-on, html.cursor-on *{cursor:none} }

/* --------------------------------------------------- smooth-scroll plumbing */
#canvas{position:fixed;inset:0;width:100vw;height:100vh;display:block;z-index:0;background:var(--bg)}
#app{position:relative;z-index:1}
html.smooth #app{position:fixed;top:0;left:0;width:100%;will-change:transform}
#scroll-spacer{display:none}
html.smooth #scroll-spacer{display:block}

/* small plus/cross motif */
.cross{position:relative;width:12px;height:12px;flex:0 0 auto;opacity:.6}
.cross::before,.cross::after{content:"";position:absolute;background:currentColor}
.cross::before{left:50%;top:0;width:1px;height:100%;transform:translateX(-.5px)}
.cross::after{top:50%;left:0;height:1px;width:100%;transform:translateY(-.5px)}

/* -------------------------------------------------------------- custom cursor */
#cursor{position:fixed;top:0;left:0;z-index:9998;pointer-events:none;
  width:14px;height:14px;border-radius:50%;background:#fff;mix-blend-mode:difference;
  transform:translate(-50%,-50%) scale(1);transition:width .3s var(--ease),height .3s var(--ease),background .3s}
#cursor.hide{opacity:0}
#cursor.link{width:64px;height:64px;background:#fff}
#cursor-label{position:absolute;inset:0;display:grid;place-items:center;
  font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:#111;opacity:0;transition:opacity .25s}
#cursor.link #cursor-label{opacity:1}

/* dev-only live scroll readout by the scrollbar (press h to hide) */
#scroll-hud{position:fixed;right:14px;top:50%;transform:translateY(-50%);z-index:9500;
  font-family:var(--mono);font-size:10px;line-height:1.4;pointer-events:none;letter-spacing:.04em;
  background:rgba(240,242,248,.9);padding:8px 10px;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.14);
  display:flex;flex-direction:column;gap:3px;min-width:96px}
#scroll-hud.hidden{display:none}
#scroll-hud div{display:flex;justify-content:space-between;gap:12px}
#scroll-hud b{font-weight:400;color:#8b97a8;text-transform:uppercase}
#scroll-hud span{font-variant-numeric:tabular-nums;color:#0016ec}

/* ================================================================== header */
#header{position:fixed;top:0;left:0;width:100%;z-index:9000;
  display:flex;align-items:center;justify-content:space-between;
  padding:clamp(14px,2vw,26px) var(--pad);color:#fff}
#header-logo{mix-blend-mode:difference}
#header-logo svg{display:block;height:22px;width:auto;fill:currentColor}
#header-right{display:flex;align-items:center;gap:12px}
.hbtn{position:relative;display:inline-flex;align-items:center;gap:9px;
  height:42px;padding:0 20px;border-radius:100px;border:1px solid rgba(255,255,255,.35);
  font-size:14px;line-height:1;overflow:hidden;transition:border-color .3s}
#header-right-talk-btn,#menu-btn{mix-blend-mode:difference}
.hbtn:hover{border-color:#fff}
/* sound toggle: bare canvas circle, drawn in JS (grey idle -> blue on hover) */
#header-right-sound-btn{width:44px;height:44px;padding:0;border:0;background:none;
  position:relative;overflow:hidden;border-radius:50%;cursor:pointer}
#header-right-sound-btn canvas{display:block}
#header-right-talk-btn .dot{width:7px;height:7px;border-radius:50%;background:var(--green)}
#menu-btn .bars{display:inline-flex;flex-direction:column;gap:4px}
#menu-btn .bars span{display:block;width:16px;height:1.5px;background:currentColor;transition:transform .3s var(--ease)}
html.menu-open #menu-btn .bars span:nth-child(1){transform:translateY(2.75px) rotate(45deg)}
html.menu-open #menu-btn .bars span:nth-child(2){transform:translateY(-2.75px) rotate(-45deg)}
#menu-btn .label-close{display:none}
html.menu-open #menu-btn .label-open{display:none}
html.menu-open #menu-btn .label-close{display:inline}

/* ------------------------------------------------- menu dropdown (Lusion-style) */
/* a top-right stack of cards: white links panel + newsletter + dark LABS.
   open = fade in + slide up 109px + un-rotate 3.5deg, 0.5s cubic-bezier(.4,0,.1,1) */
/* pointer-events:none on the fixed container: a transparent closed menu must never
   eat clicks in its top-right region (it was swallowing the back-to-top button).
   Open cards re-enable their own pointer-events, which works through a none parent. */
#menu{position:fixed;top:calc(clamp(14px,2vw,26px) + 54px);right:var(--pad);z-index:8500;
  width:min(340px,86vw);max-height:calc(100vh - 96px);display:flex;flex-direction:column;gap:12px;
  pointer-events:none}
.menu-card{opacity:0;visibility:hidden;transform:translateY(109px) rotate(3.5deg);transform-origin:top center;
  transition:opacity .5s var(--ease),transform .5s var(--ease),visibility 0s linear .5s;
  pointer-events:none;will-change:transform,opacity}
html.menu-open .menu-card{opacity:1;visibility:visible;transform:none;pointer-events:auto;
  transition:opacity .5s var(--ease),transform .5s var(--ease),visibility 0s}
html.menu-open #menu-newsletter{transition-delay:.05s}
html.menu-open #menu-labs{transition-delay:.1s}
/* links panel */
#menu-links{background:#fff;border-radius:14px;padding:10px;box-shadow:0 24px 70px rgba(10,12,20,.22)}
.menu-link{position:relative;display:flex;align-items:center;justify-content:space-between;gap:14px;
  width:100%;padding:13px 20px;border-radius:100px;color:var(--ink);background:none;cursor:pointer;
  font-size:20px;font-weight:500;letter-spacing:.01em;text-transform:uppercase;overflow:hidden;text-align:left}
.menu-link-bg{position:absolute;inset:0;background:var(--header-color);border-radius:100px;
  opacity:0;transform:scale(.85);transition:opacity .3s,transform .4s cubic-bezier(.4,0,.1,1);z-index:0}
.menu-link:hover .menu-link-bg{opacity:.1;transform:scale(1)}
.menu-link .roll{position:relative;z-index:1}
.menu-link .arw{position:relative;z-index:1;opacity:0;transform:translateX(-8px);font-size:15px;
  transition:opacity .35s var(--ease),transform .35s var(--ease)}
.menu-link:hover .arw{opacity:1;transform:none}
/* newsletter card */
#menu-newsletter{background:#fff;border-radius:14px;padding:22px 22px 24px;box-shadow:0 24px 70px rgba(10,12,20,.22)}
#menu-newsletter h3{font-size:22px;font-weight:500;color:var(--ink);margin-bottom:16px;line-height:1.08;letter-spacing:-.01em}
.nl-input{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.12);
  border-radius:100px;padding:6px 6px 6px 18px}
.nl-input input{flex:1;min-width:0;background:none;border:0;color:#fff;font:inherit;font-size:15px;outline:none}
.nl-input input::placeholder{color:rgba(255,255,255,.6)}
.nl-input button{width:38px;height:38px;flex:0 0 auto;border-radius:50%;background:#fff;color:var(--blue);display:grid;place-items:center}
#menu-newsletter .nl-input{background:var(--off-white)}
#menu-newsletter .nl-input input{color:var(--ink)}
#menu-newsletter .nl-input input::placeholder{color:rgba(17,19,24,.5)}
#menu-newsletter .nl-input button{background:var(--blue);color:#fff}
/* dark LABS button */
#menu-labs{background:var(--black);color:#fff;border-radius:14px;padding:20px 24px;
  display:flex;align-items:center;justify-content:space-between;font-size:20px;font-weight:500;
  text-transform:uppercase;letter-spacing:.02em;transition:background .3s}
#menu-labs:hover{background:var(--blue)}
#menu-labs .arw2{transition:transform .3s var(--ease)}
#menu-labs:hover .arw2{transform:translate(3px,-3px)}

/* ==================================================================== hero */
.section{position:relative}
#hero{min-height:100svh;display:flex;flex-direction:column;justify-content:center;
  padding:0 var(--pad);color:#fff}
#hero-title{font-size:clamp(34px,5.4vw,86px);font-weight:500;line-height:1.02;
  letter-spacing:-.025em;max-width:20ch;opacity:0;transition:opacity .8s var(--ease) .2s}
body.ready #hero-title{opacity:1}
#hero-title.split-chars{opacity:1;transition:none}
#hero-crosses{position:absolute;inset:0;pointer-events:none;color:#fff}
#hero-crosses .cross{position:absolute;width:16px;height:16px;opacity:.5}
#hero-crosses .cross:nth-child(1){left:8%;top:24%}
#hero-crosses .cross:nth-child(2){right:12%;top:32%}
#hero-crosses .cross:nth-child(3){left:16%;bottom:26%}
#hero-crosses .cross:nth-child(4){right:20%;bottom:34%}
#hero-scroll{position:absolute;left:var(--pad);bottom:30px;display:flex;align-items:center;gap:10px;
  font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:rgba(255,255,255,.7)}
#hero-scroll .line{width:44px;height:1px;background:currentColor;transform-origin:left;
  animation:scrollline 2.4s var(--ease) infinite}
@keyframes scrollline{0%{transform:scaleX(0)}50%{transform:scaleX(1)}100%{transform:scaleX(0);transform-origin:right}}

/* light editorial band that covers the canvas after the hero */
.light{background:var(--off-white);color:var(--ink)}
.dark{background:var(--bg);color:#fff}

/* ---------------------------------------------------------------- reel band */
#reel{padding:clamp(80px,12vh,180px) var(--pad) 0;position:relative}
#reel-inner{max-width:var(--maxw);margin:0 auto;position:relative;z-index:2}
.eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  display:inline-flex;align-items:center;gap:10px;color:var(--blue)}
.eyebrow .dot{width:8px;height:8px;border-radius:50%;background:var(--blue)}
#reel-lead{max-width:34ch;margin-top:26px}
#reel-desc{font-size:clamp(19px,1.9vw,30px);font-weight:400;line-height:1.32;letter-spacing:-.01em;max-width:26ch}
#reel-cta{margin-top:30px;display:inline-flex;align-items:center;gap:12px;
  border:1px solid rgba(17,19,24,.25);border-radius:100px;padding:14px 26px;font-size:15px;transition:.3s var(--ease)}
#reel-cta .dot{width:8px;height:8px;border-radius:50%;background:var(--blue)}
#reel-cta:hover{background:var(--ink);color:#fff;border-color:var(--ink)}

/* pinned scale-to-fullscreen stage (JS drives frame width/height/radius by scroll) */
#reel-stage{position:relative;height:220vh;margin:9vh calc(-1 * var(--pad)) 0;z-index:1;overflow:hidden}
#reel-panel{position:absolute;top:0;left:0;width:100%;height:100vh;
  display:grid;place-items:center;will-change:transform}
#reel-canvas{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:1}
#reel-src{position:absolute;left:0;top:0;width:2px;height:2px;opacity:0;pointer-events:none}
/* contained video frame: NO border line — corner crosses do the framing; sized to the video (JS) */
#reel-box{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:2;
  pointer-events:none;opacity:0;transition:opacity .3s var(--ease)}
/* clip layer: words + edge marquee are clipped to the video rectangle */
#reel-frame-clip{position:absolute;inset:0;overflow:hidden;border-radius:8px}
/* big PLAY / REEL words, now INSIDE the video (clipped), on top of the footage */
#reel-words{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  gap:2vw;pointer-events:none;color:#fff;opacity:0;font-weight:600;line-height:1;letter-spacing:-.02em;
  font-size:clamp(40px,9vw,140px);will-change:opacity,transform}
#reel-words .rw{display:block;will-change:transform}
/* the + crosses, sitting just OUTSIDE the video edges on the page ground */
#reel-deco{position:absolute;inset:-34px 0;pointer-events:none}
.reel-deco-row{position:absolute;left:0;right:0;display:flex;justify-content:space-between}
.rdr-top{top:0}.rdr-bot{bottom:0}
.reel-cross{position:relative;width:17.77px;height:17.77px;color:#12121a;opacity:.85;
  transition:opacity .5s var(--ease),transform .5s var(--ease)}
.reel-cross::before,.reel-cross::after{content:"";position:absolute;top:50%;left:50%;background:currentColor}
.reel-cross::before{width:17.77px;height:2.22px;transform:translate(-50%,-50%)}
.reel-cross::after{width:2.22px;height:17.77px;transform:translate(-50%,-50%)}
#reel-panel.is-hover .reel-cross{opacity:0;transform:rotate(45deg) scale(.7)}
/* "PLAY REEL" marquee that runs along the video's top + bottom edges on play-button hover */
.reel-mq{position:absolute;left:0;width:100%;height:22px;overflow:hidden;pointer-events:none;
  z-index:4;display:flex;align-items:center;opacity:0;transition:opacity .45s var(--ease)}
.reel-mq-top{top:0}
.reel-mq-bot{bottom:0}
.reel-mq-track{display:flex;flex:none;white-space:nowrap;will-change:transform;
  animation:reelmq 16s linear infinite}
.reel-mq-bot .reel-mq-track{animation-direction:reverse}
.reel-mq-track span{display:block;flex:none;padding:0 .5em;color:#fff;
  font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:.34em;text-transform:uppercase}
@keyframes reelmq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
#reel-panel.is-hover .reel-mq{opacity:.92}
/* while the video is PLAYING the chrome gets out of the way (words hidden by JS too) */
#reel-panel.is-playing .reel-mq{opacity:0}
/* playback controls along the framed video's bottom edge (sound session only):
   PAUSE / scrubber / MUTE, labels always naming the ACTION AVAILABLE */
#reel-controls{position:absolute;left:0;right:0;bottom:0;z-index:5;display:flex;align-items:center;
  gap:20px;padding:18px 24px;opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .4s var(--ease),visibility 0s linear .4s;
  background:linear-gradient(0deg,rgba(7,8,12,.55),transparent)}
#reel-controls.show{opacity:1;visibility:visible;pointer-events:auto;transition:opacity .4s var(--ease)}
/* keyboard backstop: a focused control keeps its bar visible even if the peek expires */
#reel-controls:focus-within{opacity:1;visibility:visible;pointer-events:auto}
#reel-controls button{background:none;border:0;cursor:pointer;padding:6px 2px;color:#fff;
  font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:.3em;text-transform:uppercase;
  opacity:.85;transition:opacity .25s}
#reel-controls button:hover{opacity:1}
#reel-ctl-track{position:relative;flex:1;height:16px;display:flex;align-items:center;cursor:pointer}
#reel-ctl-rail{position:relative;width:100%;height:2px;background:rgba(255,255,255,.28)}
#reel-ctl-fill{position:absolute;left:0;top:0;bottom:0;width:0;background:#fff}
#reel-overlay{position:absolute;inset:0;display:grid;place-items:center;z-index:3;
  pointer-events:none;opacity:0;visibility:hidden;
  transition:opacity .45s var(--ease),visibility 0s linear .45s}
#reel-overlay.show{opacity:1;visibility:visible;transition:opacity .45s var(--ease)}
/* keyboard backstop: a focused watch button keeps its overlay visible while the
   motion-driven stop-button fade would otherwise hide it */
#reel-overlay:focus-within{opacity:1;visibility:visible}
/* cursor-chasing wrapper: the overlay grid centres it, JS eases it after the pointer
   with frame-rate-independent damping (the reference reel's damp() smoothing) */
#reel-follow{will-change:transform}
#reel-watch{pointer-events:none;width:clamp(78px,9vw,120px);height:clamp(78px,9vw,120px);
  border-radius:50%;background:#fff;color:#111;display:grid;place-items:center;
  transition:transform .4s var(--ease),background .3s var(--ease),color .3s var(--ease)}
#reel-overlay.show #reel-watch{pointer-events:auto}
#reel-watch svg{width:26px;height:26px;grid-area:1/1;transition:opacity .3s var(--ease),transform .4s var(--ease)}
#reel-watch .ic-play{margin-left:4px}
/* play triangle morphs to a rotating x while a sound session runs (the + -> x trick) */
#reel-watch .ic-stop{opacity:0;transform:rotate(-45deg) scale(.6)}
#reel-watch.is-playing .ic-play{opacity:0;transform:scale(.6)}
#reel-watch.is-playing .ic-stop{opacity:1;transform:rotate(0deg) scale(1)}
/* the chase means :hover = "the button caught the cursor" -> blue + grow */
#reel-watch:hover{transform:scale(1.08);background:var(--blue);color:#fff}

/* the scroll-drawn "ribbon" lines (SVG stand-in for Lusion's WebGL line) */
.ribbon{position:absolute;left:0;top:0;width:100%;pointer-events:none;z-index:0;overflow:visible}
.ribbon-path{fill:none;stroke-width:14;stroke-linecap:round;stroke-linejoin:round}
#reel .ribbon-path{stroke:var(--blue)}
#goal .ribbon-path{stroke:var(--blue)}

@keyframes marq{to{transform:translateX(-50%)}}

/* -------------------------------------------------------------- featured work */
#featured{padding:clamp(70px,10vh,150px) var(--pad) clamp(90px,12vh,180px)}
#featured-inner{max-width:var(--maxw);margin:0 auto}
#featured-top{display:flex;justify-content:space-between;align-items:flex-end;gap:30px;flex-wrap:wrap;
  margin-bottom:40px}
#featured-title{font-size:clamp(30px,4vw,64px)}
#featured-disclaimer{max-width:36ch;font-size:16px;line-height:1.4;opacity:.7}
.project-list{border-top:1px solid rgba(17,19,24,.16)}
.project-item{display:flex;align-items:center;justify-content:space-between;gap:24px;
  padding:clamp(20px,2.4vw,34px) 4px;border-bottom:1px solid rgba(17,19,24,.16);
  position:relative;transition:padding .4s var(--ease)}
.project-item .p-name{font-size:clamp(26px,3.6vw,58px);font-weight:500;letter-spacing:-.02em;
  display:flex;align-items:center;gap:18px;transition:transform .4s var(--ease),color .4s}
.project-item .p-num{font-family:var(--mono);font-size:13px;opacity:.5;width:2ch}
.project-item .p-tags{font-family:var(--mono);font-size:12px;letter-spacing:.06em;text-transform:uppercase;
  opacity:.65;text-align:right;max-width:40ch}
.project-item .p-arrow{opacity:0;transform:translateX(-8px);transition:.4s var(--ease)}
@media (hover:hover){
  .project-item:hover{padding-left:22px;padding-right:22px}
  .project-item:hover .p-name{transform:translateX(6px)}
  .project-item:hover .p-arrow{opacity:1;transform:none}
}
@media (max-width:760px){.project-item{flex-direction:column;align-items:flex-start;gap:8px}
  .project-item .p-tags{text-align:left}}
/* floating cursor preview */
#featured-preview{position:fixed;top:0;left:0;z-index:60;width:clamp(240px,26vw,380px);
  aspect-ratio:4/3;border-radius:14px;overflow:hidden;pointer-events:none;
  opacity:0;transform:translate(-50%,-50%) scale(.86);transition:opacity .35s var(--ease),transform .5s var(--ease);
  box-shadow:0 30px 80px rgba(0,0,0,.35)}
#featured-preview.show{opacity:1;transform:translate(-50%,-50%) scale(1)}
#featured-preview img{width:100%;height:100%;object-fit:cover;object-position:top left}
/* a real capture underneath: the name drops to a scrimmed bottom-left caption */
#featured-preview.has-shot .fp-label{align-items:flex-end;justify-content:flex-start;padding:14px 16px;
  font-size:15px;letter-spacing:.01em;text-align:left;
  background:linear-gradient(to top,rgba(5,6,10,.78),transparent 44%);border-radius:inherit}
/* the tool's own loading animation as the hover preview (AtlasLoadAnims compact mount) */
#featured-preview .fp-anim{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  padding:6% 8%}
#featured-preview.has-anim .fp-label{align-items:flex-end;justify-content:flex-start;padding:12px 16px;
  font-size:14px;letter-spacing:.01em;text-align:left;
  background:linear-gradient(to top,rgba(5,6,10,.72),transparent 40%);border-radius:inherit}
/* branded gradient preview card (replaces recycled case-study photos) */
.fp-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:0 9%;
  text-align:center;color:#fff;font-weight:500;font-size:clamp(18px,2vw,27px);letter-spacing:-.01em;
  line-height:1.1;text-shadow:0 2px 22px rgba(0,0,0,.45)}
/* toolkit rows light their own colour + name goes blue on hover */
.project-item.reveal{transition:opacity 1s var(--ease),transform 1.15s var(--ease),filter 1s var(--ease),
  padding .4s var(--ease),background-color .35s var(--ease)}
@media (hover:hover){
  .project-item:hover{background-color:rgba(26,47,251,.05)}
  .project-item:hover{background-color:color-mix(in srgb,var(--row-bg,#1a2ffb) 12%,transparent)}
  .project-item:hover .p-name,.project-item:hover .p-num{color:var(--blue)}
}
/* keyboard focus ring everywhere (a11y) */
:focus-visible{outline:2px solid var(--blue);outline-offset:3px;border-radius:3px}
#featured-cta{margin-top:52px;display:inline-flex;align-items:center;gap:12px;
  border:1px solid rgba(17,19,24,.25);border-radius:100px;padding:15px 28px;font-size:15px;transition:.3s var(--ease)}
#featured-cta .dot{width:8px;height:8px;border-radius:50%;background:var(--blue)}
#featured-cta:hover{background:var(--ink);color:#fff;border-color:var(--ink)}

/* -------------------------------------------------------------------- goal */
#goal{padding:clamp(90px,16vh,240px) var(--pad);overflow:hidden;position:relative}
#goal-inner{max-width:var(--maxw);margin:0 auto;position:relative;z-index:1}
#goal-title{font-size:clamp(30px,4.4vw,72px);max-width:16ch;margin-bottom:40px}
#goal-texts{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,4vw,70px);max-width:1100px}
@media (max-width:820px){#goal-texts{grid-template-columns:1fr}}
#goal-texts p{font-size:clamp(16px,1.5vw,22px);line-height:1.45;opacity:.82}
#goal-tunnel{margin-top:clamp(80px,16vh,220px);text-align:center}
#goal-tunnel .line{display:block;font-size:clamp(38px,9vw,150px);font-weight:500;line-height:.98;
  letter-spacing:-.03em}
#goal-tunnel .line:nth-child(2){color:var(--blue)}

/* ------------------------------------------------------------------ end cta */
#end{min-height:100svh;display:flex;flex-direction:column;justify-content:center;align-items:center;
  padding:clamp(80px,14vh,200px) var(--pad) 0;text-align:center;position:relative;overflow:hidden}
#end:not(.end--video) #end-sub{font-family:var(--mono);font-size:clamp(12px,1.4vw,16px);letter-spacing:.12em;text-transform:uppercase;
  opacity:.7;margin-bottom:26px}
#end-title{font-size:clamp(48px,12vw,190px);font-weight:500;line-height:.94;letter-spacing:-.03em}
#end-title b{font-weight:500;color:var(--blue)}
#end-bottom{margin-top:auto;width:100%;display:flex;align-items:center;gap:20px;
  padding:26px var(--pad);overflow:hidden}
.end-arrows{display:flex;gap:2px;flex:0 0 auto}
.end-arrows svg{width:16px;height:16px;opacity:.6}
#end-marquee{flex:1;overflow:hidden;white-space:nowrap;font-family:var(--mono);
  font-size:clamp(13px,1.4vw,16px);letter-spacing:.16em;text-transform:uppercase}
#end-marquee .run{display:inline-block;animation:marq 20s linear infinite}
#end-marquee .run span{padding:0 34px}

/* ---- index-only: video-through-"Atlas" scroll-reveal finale (initEndReveal) ---- */
#end.end--video{display:block;min-height:0;padding:0;overflow:visible;text-align:left}
#end-stage{position:relative;height:300vh}
#end-pin{position:absolute;top:0;left:0;width:100%;height:100svh;overflow:hidden;
  background:#0d0d10;will-change:transform;transform:translateZ(0)}
#end-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;background:#0d0d10}
#end-mask{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none;will-change:opacity}
#end-atlas-text{font-family:var(--font);font-weight:500;font-size:300px;letter-spacing:-.03em}
#end-glow{position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;
  background:radial-gradient(125% 95% at 50% 58%,transparent 42%,rgba(6,6,10,.6) 100%)}
#end-topline{position:absolute;top:9vh;left:0;right:0;z-index:3;text-align:center;pointer-events:none;
  font-family:var(--mono);font-size:clamp(12px,1.4vw,16px);letter-spacing:.14em;text-transform:uppercase;
  color:#fff;opacity:.85;will-change:opacity}
/* left-half dim so the panel reads over the video (JS ramps opacity with the zoom) */
#end-scrim{position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;
  background:linear-gradient(90deg,rgba(7,8,12,.82) 0%,rgba(7,8,12,.52) 34%,transparent 62%)}
/* left info panel: kicker / headline / sub / buttons / note rise line-by-line */
#end-reveal{position:absolute;left:calc(var(--pad) + 1vw);top:50%;transform:translateY(-50%);z-index:3;
  display:flex;flex-direction:column;align-items:flex-start;gap:18px;text-align:left;
  max-width:min(560px,46vw);pointer-events:none}
#end.end--video.is-revealed #end-reveal{pointer-events:auto}
/* --- finale entrance system (DEVELOPED IN LIGHT) --- */
.er-line{opacity:0;transform:translateY(30px);
  transition:opacity .7s var(--ease),transform .95s var(--ease)}
#end.end--video.is-revealed .er-line{opacity:1;transform:none}
#end.end--video.is-revealed .er-line:nth-child(4){transition-delay:.62s}   /* buttons row */
/* exit: reverse order, fast and dry (fixes the FIFO un-reveal) */
#end.end--video:not(.is-revealed) .er-line{transition:opacity .3s var(--ease),transform .4s var(--ease)}
#end.end--video:not(.is-revealed) .er-line:nth-child(5){transition-delay:0s}
#end.end--video:not(.is-revealed) .er-line:nth-child(4){transition-delay:.05s}
#end.end--video:not(.is-revealed) .er-line:nth-child(2){transition-delay:.15s}
#end.end--video:not(.is-revealed) .er-line:nth-child(1){transition-delay:.2s}

/* kicker: per-char tracking-in from spread, rack focus */
#end-kicker .ac{transform:translateX(var(--kx,0)) translateY(.4em);opacity:0;filter:blur(4px);
  transition:transform .6s var(--ease),opacity .45s var(--ease),filter .6s var(--ease)}
#end.end--video.is-revealed #end-kicker .ac{transform:none;opacity:1;filter:blur(0)}
#end.end--video:not(.is-revealed) #end-kicker .ac{transition-delay:0s!important;transition-duration:.25s}

/* head: word masks land hot, cool to crisp */
#end-head.er-split .split-word-inner{transform:translateY(112%) rotate(3deg);
  filter:blur(8px) brightness(1.75);
  transition:transform .7s var(--ease),filter .9s var(--ease)}
#end.end--video.is-revealed #end-head .split-word-inner{transform:none;filter:blur(0) brightness(1)}
#end.end--video:not(.is-revealed) #end-head .split-word-inner{transition-delay:0s!important;transition-duration:.3s}

/* sub: light wipe (delays live here; two-id specificity beats the nth-child rules) */
#end.end--video #end-sub{clip-path:inset(0 100% 0 0);
  transition:opacity .7s var(--ease) .42s,transform .95s var(--ease) .42s,
    clip-path .75s cubic-bezier(.3,.6,.2,1) .48s}
#end.end--video.is-revealed #end-sub{clip-path:inset(0 -2% 0 0)}
#end.end--video:not(.is-revealed) #end-sub{transition-delay:.1s;clip-path:inset(0 100% 0 0)}

/* pills: rounded unwipe + spring settle; :not(.er-settled) releases hover after entrance */
#end.end--video:not(.er-settled) #end-reveal-buttons .dl-btn{clip-path:inset(0 100% 0 0 round 999px);
  transform:translateY(16px) scale(.97);opacity:0;
  transition:clip-path .55s cubic-bezier(.3,.6,.2,1),transform .55s cubic-bezier(.34,1.56,.64,1),opacity .3s var(--ease)}
#end.end--video.is-revealed:not(.er-settled) #end-reveal-buttons .dl-btn{
  clip-path:inset(0 0 0 0 round 999px);transform:none;opacity:1;transition-delay:.62s}
#end.end--video.is-revealed:not(.er-settled) #end-reveal-buttons .dl-btn--alt{transition-delay:.74s}
#end.end--video:not(.is-revealed) #end-reveal-buttons .dl-btn{transition-delay:.05s}

/* note: fade only, delayed last in, first out */
#end.end--video #end-reveal-note{transform:none;transition:opacity .6s var(--ease)}
#end.end--video.is-revealed #end-reveal-note{transition-delay:.85s}
#end-kicker{font-family:var(--mono);font-size:12px;letter-spacing:.3em;text-transform:uppercase;
  color:rgba(255,255,255,.72)}
#end-head{font-size:clamp(32px,4.2vw,62px);font-weight:500;line-height:1.02;letter-spacing:-.02em;color:#fff}
#end-sub{font-size:clamp(15px,1.4vw,18px);line-height:1.5;color:rgba(255,255,255,.82);max-width:46ch}
#end-reveal-buttons{display:flex;gap:14px;flex-wrap:wrap;justify-content:flex-start}
@media (max-width:760px){#end-reveal{left:var(--pad);max-width:calc(100% - 2 * var(--pad))}}
.dl-btn{display:inline-flex;align-items:center;gap:11px;padding:15px 26px;border-radius:999px;
  background:var(--blue);color:#fff;font-weight:500;font-size:clamp(15px,1.5vw,18px);white-space:nowrap;
  transition:transform .35s var(--ease),background .35s var(--ease)}
.dl-btn svg{width:20px;height:20px;flex:0 0 auto}
.dl-btn:hover{transform:translateY(-2px) scale(1.02);background:var(--dark-blue)}
.dl-btn--alt{background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.28);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.dl-btn--alt:hover{background:rgba(255,255,255,.17)}
#end-reveal-note{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:rgba(255,255,255,.55)}
#end-sound{position:absolute;right:var(--pad);bottom:var(--pad);z-index:4;width:46px;height:46px;
  border-radius:50%;background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.25);
  display:grid;place-items:center;opacity:0;pointer-events:none;
  transition:opacity .4s var(--ease),background .3s var(--ease),transform .3s var(--ease)}
#end-sound:hover{background:rgba(255,255,255,.2);transform:scale(1.06)}
#end-sound svg{width:20px;height:20px}
#end-sound .snd-wave{opacity:0}
#end-sound[aria-pressed="true"] .snd-wave{opacity:1}
#end-sound[aria-pressed="true"] .snd-x{opacity:0}
#end.end--video.is-revealed #end-sound{opacity:1;pointer-events:auto}
@media (prefers-reduced-motion:reduce){#end-stage{height:100svh}}

/* ---------------------------------------------------------------- footer */
#footer{background:var(--black);color:#fff;padding:clamp(60px,9vh,120px) var(--pad) 40px}
#footer-inner{max-width:var(--maxw);margin:0 auto}
#footer-middle{display:grid;grid-template-columns:1.2fr 1fr 1fr;gap:40px;
  padding-bottom:60px;border-bottom:1px solid rgba(255,255,255,.14)}
@media (max-width:900px){#footer-middle{grid-template-columns:1fr 1fr}}
@media (max-width:560px){#footer-middle{grid-template-columns:1fr}}
.footer-address{font-size:clamp(20px,2.2vw,32px);line-height:1.18;font-weight:500;letter-spacing:-.01em}
.footer-address:hover{color:var(--blue)}
.footer-col h5{font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;
  opacity:.5;margin-bottom:12px;font-weight:400}
.footer-socials a,.footer-links a{display:block;font-size:17px;padding:3px 0;opacity:.85;transition:opacity .25s,color .25s}
.footer-socials a:hover,.footer-links a:hover{opacity:1;color:var(--blue)}
.footer-links a{font-size:19px}
/* honest footer bits: no fake socials, and the bottom line tells the truth */
.footer-socials .ftr-none{display:block;font-size:15px;line-height:1.5;opacity:.55;max-width:230px;padding:3px 0 6px}
#footer-bottom .ftr-pun{opacity:.5;font-size:13px;letter-spacing:.02em}
#footer-newsletter h5{margin-bottom:16px}
#footer-newsletter .nl-input{background:rgba(255,255,255,.1)}
#footer-newsletter .nl-input button{background:var(--blue);color:#fff}
#footer-bottom{display:flex;flex-wrap:wrap;justify-content:space-between;gap:16px;
  padding-top:26px;font-family:var(--mono);font-size:12px;letter-spacing:.04em;opacity:.6}
#footer-bottom a:hover{opacity:1;color:var(--blue)}

/* --------------------------------------------------------------- scroll-nav */
#scroll-nav{background:var(--bg);color:#fff;padding:clamp(60px,10vh,140px) var(--pad);text-align:center}
#scroll-nav-sub{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  opacity:.55;margin-bottom:24px;line-height:1.6}
#scroll-nav-main a{font-size:clamp(44px,10vw,150px);font-weight:500;letter-spacing:-.03em;
  display:inline-flex;align-items:center;gap:24px;transition:color .3s}
#scroll-nav-main a:hover{color:var(--blue)}
#scroll-nav-next{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;
  margin-top:24px;opacity:.6}

/* ------------------------------------------------------- scroll progress bar */
#scroll-indicator{position:fixed;top:0;left:0;width:100%;height:2px;z-index:9500;pointer-events:none}
#scroll-indicator-bar{height:100%;width:0;background:var(--blue);transform-origin:left}

/* --------------------------------------------------------------- video overlay */
#video-overlay{position:fixed;inset:0;z-index:9700;background:rgba(8,8,10,.94);
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:20px;
  opacity:0;visibility:hidden;transition:opacity .5s var(--ease),visibility .5s}
#video-overlay.open{opacity:1;visibility:visible}
#video-overlay video{width:min(92vw,1200px);aspect-ratio:16/9;background:#000;border-radius:8px}
#video-overlay-controls{display:flex;align-items:center;gap:18px;width:min(92vw,1200px)}
#video-overlay-controls button{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase}
#vo-progress{flex:1;height:3px;background:rgba(255,255,255,.2);border-radius:2px;overflow:hidden}
#vo-progress-active{height:100%;width:0;background:#fff}
#video-close{position:absolute;top:24px;right:24px;font-family:var(--mono);font-size:12px;
  letter-spacing:.12em;text-transform:uppercase}

/* -------------------------------------------------------------------- loader */
#preloader{position:fixed;inset:0;z-index:9999;background:var(--bg);color:#fff;
  display:flex;align-items:flex-end;justify-content:space-between;padding:var(--pad);
  transition:transform 1s var(--ease);will-change:transform}
#preloader.done{transform:translateY(-100%);pointer-events:none}
#preloader.gone{display:none}
#preloader-label{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;opacity:.6}
#preloader-percent{display:flex;align-items:flex-end;font-weight:500;line-height:.8;
  font-size:clamp(80px,20vw,300px);letter-spacing:-.04em}
.pdigit{position:relative;height:1em;overflow:hidden;width:.62ch}
.pdigit-col{display:flex;flex-direction:column;transition:transform .5s var(--ease)}
.pdigit-col span{height:1em;display:block}

/* ---------------------------------------------- split-text line/word reveal */
.split-word{display:inline-block;overflow:hidden;vertical-align:top;padding-bottom:.14em;margin-bottom:-.14em}
.split-word-inner{display:inline-block;transform:translateY(116%);transition:transform .95s var(--ease)}
.split.in .split-word-inner{transform:translateY(0)}
.ac{display:inline-block}
.ac-in{display:inline-block}

/* ------------------- hero title: scanline char cascade (SCANLINE HANDOFF) */
#hero-title.split-chars .split-word{padding-top:.12em;margin-top:-.12em;
  filter:blur(calc(var(--p,0) * 2.5px))}
#hero-title .ac{
  transform:translateY(calc(clamp(0,(var(--p,0) - var(--st,0)) * 3.2,1) * -1.3em));
  opacity:calc(1 - clamp(0,(var(--p,0) - var(--st,0)) * 3.2,1) * .85)}
#hero-title .ac-in{transform-origin:50% 100%;will-change:transform,filter;
  transform:perspective(520px) translateY(122%) rotateX(-56deg);
  filter:blur(8px) brightness(1.8);
  transition:transform .85s cubic-bezier(.18,1.22,.3,1),filter .6s cubic-bezier(.33,1,.68,1)}
#hero-title.chars-in .ac-in{transform:perspective(520px) translateY(0) rotateX(0);filter:blur(0) brightness(1)}
#hero-title.settled .ac-in{will-change:auto;transition:none;filter:none}
/* odometer land pulse */
#preloader-percent{transition:transform .26s cubic-bezier(.34,1.56,.64,1);transform-origin:right bottom}
#preloader-percent.land{transform:scale(1.035)}

/* ------------------------------ goal tunnel corridor (JS gates .tunnel-on) */
#goal-tunnel.tunnel-on{perspective:900px;perspective-origin:50% 30%}
#goal-tunnel.tunnel-on .line{opacity:0}
.tunnel-line .split-word{perspective:340px}
.tunnel-line .split-word-inner{transform:translateY(118%) rotateX(-35deg);filter:blur(6px);
  transition:transform .9s var(--ease),filter .7s var(--ease)}
.tunnel-line.in .split-word-inner{transform:translateY(0) rotateX(0);filter:blur(0)}
#goal-tunnel.tunnel-on .l2{display:inline-block;position:relative;
  clip-path:inset(-.1em calc((1 - var(--wipe,0)) * 100%) -.1em 0)}
#goal-tunnel.tunnel-on .l2::after{content:"";position:absolute;top:-.04em;bottom:-.04em;
  left:-2px;width:2px;background:var(--blue);
  box-shadow:0 0 14px 2px rgba(26,47,251,.5);
  opacity:var(--beamo,0);transform:translateX(calc(var(--wipe,0) * var(--l2w,100vw)))}

/* rolling-text hover (nav links): clone sits one line-height below, both rise */
.roll{position:relative;display:inline-block;overflow:hidden;vertical-align:bottom;
  transition:transform .45s var(--ease);transform-origin:left center;will-change:transform}
.roll-in{display:block;transition:transform .55s var(--ease)}
.roll .clone{position:absolute;left:0;top:0;transform:translateY(100%)}
/* original label rolls up and out; clone rolls up INTO view from below; whole label grows slightly */
.menu-link:hover .roll-in{transform:translateY(-100%)}
.menu-link:hover .roll .clone{transform:translateY(0)}
.menu-link:hover .roll{transform:scale(1.06)}

/* ------------------------------------------------------------- reveal helper */
.reveal{opacity:0;transform:translateY(46px);filter:blur(7px);
  transition:opacity 1s var(--ease),transform 1.15s var(--ease),filter 1s var(--ease)}
.reveal.in{opacity:1;transform:none;filter:blur(0)}
.reveal-2{transition-delay:.1s}
.reveal-3{transition-delay:.2s}
/* big headings rise from behind a mask, one line-block at a time */
#goal-tunnel .line,#end-title,#hero-title,#about-hero h1,#proj-hero h1,#reel-title,#goal-title,#featured-title{will-change:transform,filter}

/* ==================================================== about / projects pages */
/* about hero — big kinetic statement over the canvas */
#about-hero{min-height:100svh;display:flex;flex-direction:column;justify-content:center;padding:0 var(--pad)}
#about-hero .eyebrow{color:#fff;opacity:.7;margin-bottom:28px}
#about-hero .eyebrow .dot{background:#fff}
#about-hero h1{font-size:clamp(40px,9.4vw,168px);font-weight:500;line-height:.96;letter-spacing:-.03em}
#about-hero h1 .b{color:var(--blue)}
#about-intro{padding:clamp(70px,12vh,170px) var(--pad);background:var(--off-white);color:var(--ink)}
#about-intro p{max-width:20ch;font-size:clamp(26px,3.6vw,58px);font-weight:500;line-height:1.08;letter-spacing:-.02em;margin:0 auto;text-align:center}
/* quote */
#about-quote{background:var(--off-white);color:var(--ink);padding:clamp(40px,8vh,120px) var(--pad) clamp(80px,14vh,200px)}
#about-quote-inner{max-width:1100px;margin:0 auto}
#about-quote .idx{font-family:var(--mono);font-size:13px;letter-spacing:.1em;opacity:.5;margin-bottom:30px}
#about-quote blockquote{font-size:clamp(22px,2.6vw,40px);font-weight:500;line-height:1.2;letter-spacing:-.015em;margin-bottom:34px}
#about-quote .by{font-family:var(--mono);font-size:13px;letter-spacing:.06em;text-transform:uppercase;opacity:.65}
#about-quote .by b{color:var(--ink);opacity:1}
/* brands marquee */
#brands{background:var(--off-white);color:var(--ink);padding:clamp(50px,8vh,120px) 0;border-top:1px solid rgba(17,19,24,.12);overflow:hidden}
#brands h4{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;text-align:center;opacity:.55;margin-bottom:8px}
#brands .sub{text-align:center;font-size:15px;opacity:.7;margin-bottom:42px}
.brand-row{display:flex;gap:64px;width:max-content;align-items:center;animation:marq 34s linear infinite}
.brand-row img{height:26px;width:auto;opacity:.7;filter:grayscale(1)}
/* awards + talks + articles */
#awards{background:var(--bg);color:#fff;padding:clamp(70px,12vh,170px) var(--pad)}
#awards-inner{max-width:var(--maxw);margin:0 auto;display:grid;grid-template-columns:2fr 1fr;gap:clamp(30px,5vw,90px)}
@media (max-width:900px){#awards-inner{grid-template-columns:1fr}}
.awards-h{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;opacity:.5;
  padding-bottom:14px;border-bottom:1px solid rgba(255,255,255,.16);margin-bottom:20px}
.aside-block{margin-bottom:40px}
.aside-block a{display:block;padding:8px 0;font-size:15px;opacity:.8;border-bottom:1px solid rgba(255,255,255,.08)}
.aside-block a:hover{opacity:1;color:var(--blue)}
.talk-line{padding:8px 0;border-bottom:1px solid rgba(255,255,255,.08);font-size:15px;display:flex;justify-content:space-between;gap:10px}
.talk-line span:last-child{font-family:var(--mono);font-size:12px;opacity:.55}
/* expertise */
#expertise{background:var(--off-white);color:var(--ink);padding:clamp(70px,12vh,170px) var(--pad)}
#expertise-inner{max-width:var(--maxw);margin:0 auto}
#expertise h2{font-size:clamp(30px,4.4vw,72px);max-width:12ch;margin-bottom:16px}
#expertise .sub{max-width:44ch;font-size:17px;opacity:.7;margin-bottom:50px}
.exp-cols{display:grid;grid-template-columns:repeat(4,1fr);gap:30px}
@media (max-width:900px){.exp-cols{grid-template-columns:1fr 1fr}}
@media (max-width:540px){.exp-cols{grid-template-columns:1fr}}
.exp-col h5{font-size:22px;font-weight:500;margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid rgba(17,19,24,.2)}
.exp-col li{list-style:none;padding:7px 0;font-size:15px;opacity:.78}
/* projects index */
#proj-hero{min-height:60svh;display:flex;flex-direction:column;justify-content:flex-end;padding:0 var(--pad) 40px}
#proj-hero h1{font-size:clamp(56px,15vw,240px);font-weight:500;letter-spacing:-.03em;line-height:.9}
#proj-hero .count{font-family:var(--mono);font-size:14px;opacity:.6;margin-bottom:20px}
#proj-list-section{background:var(--off-white);color:var(--ink);padding:clamp(40px,7vh,90px) var(--pad) clamp(80px,12vh,170px)}
#proj-list-section .project-list{max-width:var(--maxw);margin:0 auto}

@media (prefers-reduced-motion: no-preference){
/* --- scanline cascade: big section headings --- */
.split-cine{position:relative}
.split-cine .split-word{perspective:340px}
.split-cine .split-word-inner{transform:translateY(112%) rotateX(-55deg);transform-origin:50% 100%;
  filter:blur(6px);transition:transform .9s var(--ease),filter .7s var(--ease)}
.split-cine.in .split-word-inner{transform:translateY(0) rotateX(0);filter:blur(0)}
.split-cine::after{content:"";position:absolute;left:0;top:-6%;height:112%;width:2px;
  background:var(--blue);opacity:0;pointer-events:none}
.split-cine.in::after{animation:beamsweep var(--beam-t,.55s) linear forwards}
@keyframes beamsweep{0%{opacity:.9;transform:translateX(0)}85%{opacity:.9}
  100%{opacity:0;transform:translateX(var(--beam-x,60vw))}}
/* --- quiet voice: the pitch paragraph --- */
.split-para .split-word-inner{transform:translateY(58%);opacity:0;filter:blur(4px);
  transition:transform .7s var(--ease),opacity .5s linear,filter .6s var(--ease)}
.split-para.in .split-word-inner{transform:none;opacity:1;filter:blur(0)}
/* --- eyebrow: clip wipe + focus pull + dot pop (ping ring cut) --- */
.eyebrow.reveal{opacity:1;transform:none;filter:blur(5px);
  clip-path:inset(-60% 101% -60% -8%);
  transition:clip-path .85s var(--ease),filter .8s var(--ease) .1s}
.eyebrow.reveal.in{filter:blur(0);clip-path:inset(-60% -8% -60% -8%)}
.eyebrow .dot{transform:scale(.2);transition:transform .55s cubic-bezier(.34,1.56,.64,1) .05s}
.eyebrow.reveal.in .dot{transform:scale(1)}
}

/* ---------------- toolkit SCAN LEDGER rows (.ti built by initToolkitRows) */
.project-item.ti{border-bottom-color:transparent;
  transition:padding .4s var(--ease),background-color .35s var(--ease)}
.ti::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:rgba(17,19,24,.16);transform:scaleX(0);transform-origin:left center;
  transition:transform .8s var(--ease);transition-delay:var(--ti-d,0ms)}
.ti.in::after{transform:scaleX(1)}
.ti-num{display:inline-block;overflow:hidden;vertical-align:top}
.ti-num-in{display:inline-block;transform:translateY(110%);filter:blur(4px);
  transition:transform .55s var(--ease),filter .45s var(--ease);
  transition-delay:calc(var(--ti-d,0ms) + .08s)}
.ti.in .ti-num-in{transform:translateY(0);filter:blur(0)}
.ti-lift{display:inline-block;position:relative;transform-origin:50% 100%;
  transform:perspective(520px) translateY(115%) rotateX(-35deg);
  transition:transform .9s var(--ease)}          /* delay set inline by JS */
.ti.in .ti-lift{transform:perspective(520px) translateY(0) rotateX(0deg)}
.ti-a{display:block;transition:transform .38s var(--ease)}
.ti-b{display:block;position:absolute;left:0;top:0;transform:translateY(110%);
  color:var(--blue);transition:transform .38s var(--ease)}
.ti .p-tags{clip-path:inset(0 100% 0 0);opacity:0;transform:translateX(14px);filter:blur(3px);
  transition:clip-path .7s var(--ease),opacity .6s var(--ease),transform .6s var(--ease),filter .6s var(--ease);
  transition-delay:calc(var(--ti-d,0ms) + .34s)}
.ti.in .p-tags{clip-path:inset(0 -1% 0 0);opacity:.65;transform:none;filter:blur(0)}
.ti.settled .p-tags{transition:opacity .35s var(--ease),transform .35s var(--ease);transition-delay:0s}
@media (hover:hover){
  .project-item.ti:hover .p-name{color:inherit}   /* the roll IS the colour now; .p-num keeps its blue flip */
  .ti:hover .ti-a{transform:translateY(-110%)}
  .ti:hover .ti-b{transform:translateY(0)}
  .ti.settled:hover .p-tags{opacity:1;transform:translateX(-4px)}
}

/* ---- telemetry micro-language ---- */
.tl-txt{display:inline-block;white-space:pre}
#hero-scroll .tl-txt{min-width:17ch}          /* locks the box: decode can never shift the flex row */
.tl-caret{display:inline-block;width:.6ch;height:.95em;margin-left:.45ch;background:currentColor;
  vertical-align:text-bottom;animation:tl-blink 1.06s steps(1,end) infinite}
@keyframes tl-blink{0%,49%{opacity:1}50%,100%{opacity:0}}
#preloader-label{display:flex;align-items:center}
/* menu terminal indexes */
.menu-link{justify-content:flex-start}
.menu-link .arw{margin-left:auto}
.tl-idx{position:relative;z-index:1;font-family:var(--mono);font-size:11px;letter-spacing:.08em;
  color:var(--blue);width:3ch;flex:0 0 auto;opacity:.55;transition:opacity .3s var(--ease)}
.menu-link:hover .tl-idx{opacity:1}
/* cursor press feedback (claims the dead #cursor.down hook, R4) */
#cursor-label{transition:opacity .25s,transform .28s var(--ease)}
#cursor.down #cursor-label{transform:scale(.9)}
/* reel marquees: stop burning compositor while invisible (R4 fix) */
.reel-mq-track{animation-play-state:paused}
#reel-panel.is-hover .reel-mq-track{animation-play-state:running}

/* ============================ music dial (radio.js) ======================== */
/* hold-to-open progress ring on the header sound button */
#header-right-sound-btn{position:relative}
.snd-hold-ring{position:absolute;inset:-4px;border-radius:50%;pointer-events:none;opacity:0;
  transition:opacity .2s var(--ease);
  background:conic-gradient(var(--blue) calc(var(--hold,0)*360deg),transparent 0);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 2.5px),#000 calc(100% - 2px));
  mask:radial-gradient(farthest-side,transparent calc(100% - 2.5px),#000 calc(100% - 2px))}
#header-right-sound-btn.holding .snd-hold-ring{opacity:1}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001s!important;transition-duration:.2s!important}
  .reveal{opacity:1;transform:none;filter:none}
  .er-line{transition:none;opacity:1;transform:none}
  #end.end--video #end-sub,#end.end--video .dl-btn{clip-path:none;transition:none;transform:none;opacity:1}
  #hero-scroll .line{animation:none}
  .reel-mq-track,#end-marquee .run,.brand-row{animation:none!important}
  #reel-follow{transform:none!important}
  .tl-caret{animation:none;opacity:.55}
  /* backstops for mid-session preference flips (JS gates normally prevent these states) */
  .split-word-inner,.ac,.ac-in,.ti-lift,.ti-num-in{transform:none!important;opacity:1!important;filter:none!important;transition:none!important}
  .ti .p-tags{clip-path:none!important;opacity:.65!important;transform:none!important;filter:none!important}
  .ti::after{transform:scaleX(1)}
  #goal-tunnel .line{opacity:1!important;transform:none!important;filter:none!important;clip-path:none!important}
  #goal-tunnel .l2::after,.split-cine::after{display:none}
  #end-kicker .ac{transform:none;opacity:1;filter:none}
  #end-head .split-word-inner{transform:none;filter:none}
}
