/* ===========================================================================
   Vedant Heda — portfolio
   Palette, background lift and type sizing all follow neon-sting/spec.
   The "black" here is the same violet-lifted near-black the render uses.
   =========================================================================== */

:root{
  /* ramp: amber -> red -> magenta -> violet -> blue (sRGB code units) */
  --amber:#ee9826;
  --red:#ee3a1e;
  --magenta:#ee2c96;
  --violet:#803aee;
  --blue:#2c6cee;

  --ink:#f4f1f8;
  --ink-2:rgba(244,241,248,.72);
  --ink-3:rgba(244,241,248,.58);   /* ~6.0:1 on --bg */
  --ink-4:rgba(244,241,248,.52);   /* ~4.9:1 on --bg, floor for small labels */
  --hair:rgba(244,241,248,.11);
  --hair-2:rgba(244,241,248,.055);

  /* the piece's black: ~4/255 lift, violet not grey */
  --bg:#04020a;
  --bg-2:#070313;

  --ramp:linear-gradient(90deg,var(--amber),var(--red),var(--magenta),var(--violet),var(--blue));

  --pad:clamp(20px,4.4vw,72px);
  --maxw:1320px;

  --ease:cubic-bezier(.16,1,.3,1);

  --f-display:"Inter Tight","Segoe UI Variable Display","Segoe UI",Helvetica,Arial,sans-serif;
  --f-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}

*,*::before,*::after{box-sizing:border-box;}
html,body{margin:0;padding:0;}
html{ -webkit-text-size-adjust:100%; }

body{
  background:var(--bg);
  color:var(--ink);
  font-family:var(--f-display);
  font-weight:400;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
body.is-loading{overflow:hidden;height:100vh;}

img,video,canvas{display:block;max-width:100%;}
a{color:inherit;text-decoration:none;}
h1,h2,h3,h4,p,ul,ol,figure,pre{margin:0;}
ul,ol{padding:0;list-style:none;}

::selection{background:var(--violet);color:#fff;}

.skip-link{
  position:fixed;top:10px;left:10px;z-index:300;
  padding:11px 18px;border-radius:999px;
  background:var(--ink);color:#04020a;font-size:.9rem;font-weight:600;
  transform:translateY(-160%);transition:transform .3s var(--ease);
}
.skip-link:focus{transform:translateY(0);}

/* Visible focus everywhere. The UA default ring is nearly invisible on this
   background, so it is replaced rather than removed. */
:focus-visible{
  outline:2px solid var(--amber);
  outline-offset:3px;
  border-radius:4px;
}

.wrap{
  width:100%;max-width:var(--maxw);margin:0 auto;
  padding-inline:var(--pad);
}

/* --------------------------------------------------------------- loader -- */
#loader{
  position:fixed;inset:0;z-index:200;background:var(--bg);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:26px;
}
.ld-rule{width:min(46vw,420px);height:1px;background:var(--hair);overflow:hidden;}
.ld-rule i{display:block;height:100%;width:100%;background:var(--ramp);transform:scaleX(0);transform-origin:0 50%;}
.ld-meta{
  display:flex;justify-content:space-between;width:min(46vw,420px);
  font-family:var(--f-mono);font-size:11px;letter-spacing:.22em;color:var(--ink-3);
}

/* --------------------------------------------------------------- cursor -- */
#cursor{position:fixed;top:0;left:0;z-index:190;pointer-events:none;mix-blend-mode:screen;opacity:0;}
.cur-ring{
  position:absolute;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;
  border:1px solid rgba(244,241,248,.5);
}
.cur-dot{
  position:absolute;width:4px;height:4px;margin:-2px 0 0 -2px;border-radius:50%;
  background:var(--ink);
}
#cursor.is-link .cur-ring{border-color:var(--magenta);}
#cursor.is-play .cur-ring{width:74px;height:74px;margin:-37px 0 0 -37px;border-color:var(--amber);}
#cursor.is-rail .cur-ring{
  width:78px;height:34px;margin:-17px 0 0 -39px;border-radius:999px;border-color:var(--violet);
}
#cursor.is-rail .cur-dot{opacity:0;}
#cursor.is-rail::before,#cursor.is-rail::after{
  content:"";position:absolute;top:-3px;width:7px;height:7px;
  border-top:1.5px solid var(--violet);border-right:1.5px solid var(--violet);
}
#cursor.is-rail::before{left:-27px;transform:rotate(-135deg);}
#cursor.is-rail::after{left:20px;transform:rotate(45deg);}
@media (hover:none){#cursor{display:none;}}
/* With a custom cursor drawn, leaving the native arrow on renders two cursors. */
@media (hover:hover) and (pointer:fine){
  body.has-custom-cursor,
  body.has-custom-cursor a,
  body.has-custom-cursor .vcard{cursor:none;}
}

/* ---------------------------------------------------------- fx overlays -- */
.fx-scanlines,.fx-vignette{position:fixed;inset:0;pointer-events:none;z-index:120;}
/* Kept coarse and faint on purpose: a 1px period beats against display type
   and produces moire on the headline. */
.fx-scanlines{
  background:repeating-linear-gradient(0deg,rgba(0,0,0,.3) 0 1px,transparent 1px 4px);
  opacity:.16;mix-blend-mode:multiply;
}
.fx-vignette{
  background:radial-gradient(120% 90% at 50% 45%,transparent 42%,rgba(0,0,0,.62) 100%);
}
/* One grain layer for the whole page. The tile is generated by neon.js from the
   spec's per-channel sigmas and injected as a data URI on load. */
.fx-grain{
  position:fixed;inset:0;pointer-events:none;z-index:121;
  mix-blend-mode:overlay;opacity:.5;
  background-repeat:repeat;background-size:180px 180px;
}

/* ------------------------------------------------------------------ nav -- */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:140;
  display:flex;align-items:center;justify-content:space-between;
  padding:18px var(--pad);
  mix-blend-mode:normal;
}
.nav::after{
  content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,rgba(4,2,10,.96) 30%,rgba(4,2,10,0));
  opacity:0;transition:opacity .4s var(--ease);
  /* the blur has to fade out on the same curve as the fill, or the lower edge
     blurs whatever passes under it without darkening it, which reads as a
     smudge rather than a header */
  -webkit-mask-image:linear-gradient(180deg,#000 45%,transparent);
  mask-image:linear-gradient(180deg,#000 45%,transparent);
}
.nav.is-stuck::after{opacity:1;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);}
.nav-mark{display:flex;align-items:center;gap:10px;}
.mark-glyph{
  width:13px;height:13px;border-radius:2px;background:var(--ramp);
  box-shadow:0 0 14px rgba(128,58,238,.9);
}
.mark-name{font-family:var(--f-mono);font-size:11px;letter-spacing:.24em;color:var(--ink-2);}
.nav-links{display:flex;align-items:center;gap:clamp(14px,2.2vw,30px);}
.nav-links a{
  font-family:var(--f-mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);transition:color .3s var(--ease);
}
.nav-links a:not(.nav-cta){position:relative;}
.nav-links a:not(.nav-cta)::after{
  content:"";position:absolute;left:0;right:0;bottom:-5px;height:1px;
  background:var(--ramp);transform:scaleX(0);transform-origin:100% 50%;
  transition:transform .45s var(--ease);
}
.nav-links a:not(.nav-cta):hover::after{transform:scaleX(1);transform-origin:0 50%;}
.nav-links a:hover{color:var(--ink);}
.nav-cta{
  padding:8px 15px;border:1px solid var(--hair);border-radius:999px;color:var(--ink-2)!important;
  transition:border-color .3s var(--ease),color .3s var(--ease);
}
.nav-cta:hover{border-color:var(--magenta);color:var(--ink)!important;}
@media (max-width:640px){ .nav-links a:not(.nav-cta){display:none;} }

/* ----------------------------------------------------------------- hero -- */
.hero{
  position:relative;min-height:100svh;
  display:flex;flex-direction:column;justify-content:center;
  padding:120px var(--pad) 0;
  overflow:hidden;
}
.hero-canvas{position:absolute;inset:0;width:100%;height:100%;z-index:0;}
/* scrim under the type column so the neon field never eats the copy */
.hero::before{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    linear-gradient(100deg,rgba(4,2,10,.92) 0%,rgba(4,2,10,.72) 34%,rgba(4,2,10,0) 62%),
    linear-gradient(0deg,rgba(4,2,10,.8) 0%,rgba(4,2,10,0) 26%);
}
.hero-inner{position:relative;z-index:2;width:100%;max-width:var(--maxw);margin:0 auto;}

.eyebrow{
  display:inline-flex;align-items:center;gap:9px;
  font-family:var(--f-mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);margin-bottom:clamp(18px,3vw,34px);
}
.eyebrow .dot{
  width:6px;height:6px;border-radius:50%;background:var(--amber);
  box-shadow:0 0 10px var(--amber);animation:pulse 2.4s infinite;
}
@keyframes pulse{0%,100%{opacity:1;}50%{opacity:.25;}}

.hero-title{
  font-size:clamp(2.9rem,9.2vw,8.6rem);
  line-height:.94;
  letter-spacing:-.035em;
  font-weight:600;
  margin-bottom:clamp(22px,3.4vw,40px);
}
.hero-title .line{display:block;}
.hero-title .line:last-child{
  background:var(--ramp);-webkit-background-clip:text;background-clip:text;color:transparent;
}

.hero-sub{
  max-width:56ch;font-size:clamp(1rem,1.35vw,1.16rem);color:var(--ink-2);
  line-height:1.62;margin-bottom:clamp(28px,3.6vw,44px);
}

.hero-actions{display:flex;flex-wrap:wrap;gap:12px;}
.btn,.mailto{will-change:transform;}
.btn{
  position:relative;display:inline-flex;align-items:center;gap:11px;
  padding:14px 26px;border-radius:999px;overflow:hidden;
  font-size:.94rem;font-weight:500;letter-spacing:-.01em;
  transition:transform .45s var(--ease);
}
.btn span{position:relative;z-index:2;}
.btn-primary{color:#0a0410;}
.btn-primary::before{content:"";position:absolute;inset:0;background:var(--ramp);z-index:1;}
.btn-primary i{
  position:relative;z-index:2;width:15px;height:1.5px;background:currentColor;
  transition:transform .45s var(--ease);
}
.btn-primary i::after{
  content:"";position:absolute;right:0;top:-3px;width:7px;height:7px;
  border-top:1.5px solid currentColor;border-right:1.5px solid currentColor;transform:rotate(45deg);
}
.btn-primary:hover i{transform:translateX(6px);}
.btn-ghost{border:1px solid var(--hair);color:var(--ink-2);}
.btn-ghost:hover{border-color:var(--ink-4);color:var(--ink);}

.hero-foot{
  position:relative;z-index:2;width:100%;max-width:var(--maxw);margin:0 auto;
  display:flex;justify-content:space-between;align-items:flex-end;
  padding:clamp(40px,7vw,86px) 0 30px;
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.2em;color:var(--ink-3);
}
.scroll-cue{display:flex;align-items:center;gap:11px;}
.cue-line{display:block;width:52px;height:1px;background:var(--hair);overflow:hidden;}
.cue-line i{display:block;width:40%;height:100%;background:var(--amber);animation:cue 2.6s var(--ease) infinite;}
@keyframes cue{0%{transform:translateX(-100%);}60%,100%{transform:translateX(250%);}}
.hero-meta .sep{opacity:.35;margin:0 8px;}
@media (max-width:640px){ .hero-meta{display:none;} }

/* -------------------------------------------------------------- marquee -- */
.marquee-band{
  border-block:1px solid var(--hair);
  background:linear-gradient(180deg,rgba(128,58,238,.045),transparent);
  overflow:hidden;
}
.marquee{overflow:hidden;padding:clamp(14px,1.6vw,22px) 0;}
.mq-track{display:flex;align-items:center;gap:34px;width:max-content;will-change:transform;}
.mq-track span{
  font-size:clamp(1.1rem,2.5vw,2rem);font-weight:500;letter-spacing:-.02em;
  color:var(--ink-3);white-space:nowrap;
}
.mq-track b{width:7px;height:7px;border-radius:50%;background:var(--violet);flex:none;box-shadow:0 0 12px var(--violet);}

/* -------------------------------------------------------- shared blocks -- */
.section-tag{
  display:inline-flex;align-items:center;gap:11px;
  font-family:var(--f-mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-3);margin-bottom:clamp(20px,3vw,34px);
}
.section-tag i{
  font-style:normal;padding:3px 8px;border-radius:4px;
  background:rgba(128,58,238,.16);color:#c9a7ff;border:1px solid rgba(128,58,238,.3);
}
.h-lg{
  font-size:clamp(1.9rem,5vw,4rem);line-height:1.02;letter-spacing:-.032em;font-weight:600;
  max-width:18ch;
}

/* ------------------------------------------------------------- manifest -- */
.manifest{padding:clamp(90px,14vw,190px) 0;}
.manifest-copy{
  font-size:clamp(1.35rem,3.1vw,2.5rem);line-height:1.28;letter-spacing:-.026em;
  font-weight:400;max-width:26ch;max-width:min(100%,30ch);
  margin-bottom:clamp(48px,7vw,96px);
}
.manifest-copy{max-width:min(100%,34ch);}
@media(min-width:900px){ .manifest-copy{max-width:22ch;} }
.manifest-grid{
  display:grid;gap:clamp(24px,3.4vw,48px);
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  border-top:1px solid var(--hair);padding-top:clamp(28px,3.6vw,48px);
}
.mg-item h3{
  font-size:1.02rem;font-weight:600;letter-spacing:-.01em;margin-bottom:10px;
  display:inline-block;background:var(--ramp);-webkit-background-clip:text;background-clip:text;color:transparent;
}
.mg-item p{color:var(--ink-2);font-size:.96rem;line-height:1.65;}

/* ----------------------------------------------------------------- work -- */
.work-intro{padding:clamp(60px,9vw,120px) var(--pad) clamp(34px,5vw,64px);}
.work-hint{
  margin-top:18px;font-family:var(--f-mono);font-size:11px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink-4);
}
.work{position:relative;}

/* The rail is pinned, so it MUST be exactly one viewport tall and its panels
   must fit inside it. A panel taller than the viewport is unreachable content:
   the vertical scroll is already spoken for by the horizontal scrub. */
.rail{position:relative;height:100svh;overflow:hidden;}
.rail-track{
  display:flex;align-items:center;height:100%;will-change:transform;
  perspective:1800px;perspective-origin:50% 50%;
}

.panel{
  position:relative;flex:none;
  width:min(92vw,1240px);
  height:min(78svh,780px);
  margin-right:clamp(20px,3vw,48px);
  border:1px solid var(--hair);border-radius:20px;overflow:hidden;
  background:linear-gradient(180deg,rgba(128,58,238,.05),rgba(4,2,10,.4));
  transform-style:flat;backface-visibility:hidden;
}
.panel:first-child{margin-left:var(--pad);}
.panel:last-child{margin-right:var(--pad);}
.panel-canvas{position:absolute;inset:0;width:100%;height:100%;opacity:.55;z-index:0;}
.panel::after{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    radial-gradient(90% 70% at 50% 50%,rgba(4,2,10,.30),rgba(4,2,10,.88) 78%),
    linear-gradient(180deg,rgba(4,2,10,.25),rgba(4,2,10,.6));
}
.panel-body{
  position:relative;z-index:2;height:100%;
  padding:clamp(24px,3vw,46px);
  display:grid;gap:clamp(22px,2.6vw,40px);
  grid-template-columns:1fr;
  align-content:start;
  overflow:hidden;
}
@media(min-width:1000px){
  .panel-body{grid-template-columns:minmax(0,1.02fr) minmax(0,1fr);align-content:stretch;}
}
.p-text,.p-media{min-width:0;min-height:0;}
/* Safety valve. The panel is capped to the viewport, so on a short laptop the
   longest text column can run past the bottom. Scrolling the column is the only
   honest option: clipping would hide copy with no way to reach it. */
.p-text{
  display:flex;flex-direction:column;
  overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--hair) transparent;
}
.p-text::-webkit-scrollbar{width:4px;}
.p-text::-webkit-scrollbar-thumb{background:var(--hair);border-radius:9px;}

/* Short viewports: tighten the panel type rather than letting it scroll. */
@media (min-width:901px) and (max-height:820px){
  .panel{height:min(84svh,780px);}
  .panel-body{padding:clamp(20px,2.4vw,34px);}
  .panel-title{font-size:clamp(1.4rem,2.4vw,2rem);}
  .panel-lede{font-size:.9rem;line-height:1.55;margin-bottom:14px;}
  .panel-facts{padding:12px 0;margin-bottom:14px;gap:6px 20px;}
  .panel-facts li{font-size:.82rem;}
  .panel-note{font-size:.8rem;line-height:1.55;}
  .panel-tech{margin-bottom:12px;}
  .panel-tech span{font-size:9.5px;padding:4px 8px;}
  .panel-head{margin-bottom:12px;}
}
.p-media{display:flex;flex-direction:column;justify-content:center;min-height:0;}

.panel-head{display:flex;gap:clamp(12px,1.6vw,22px);align-items:flex-start;margin-bottom:clamp(14px,1.8vw,22px);}
.panel-idx{
  font-family:var(--f-mono);font-size:12px;letter-spacing:.16em;color:var(--ink-4);
  padding-top:.5em;
}
.panel-title{font-size:clamp(1.55rem,2.9vw,2.5rem);line-height:1;letter-spacing:-.034em;font-weight:600;}
.panel-kicker{
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--amber);margin-top:9px;
}
.panel-lede{
  font-size:clamp(.93rem,1.1vw,1.04rem);line-height:1.6;color:var(--ink-2);
  max-width:62ch;margin-bottom:clamp(16px,2vw,24px);
}

.panel-facts{
  display:grid;gap:8px 22px;grid-template-columns:1fr;
  border-top:1px solid var(--hair);border-bottom:1px solid var(--hair);
  padding:clamp(13px,1.6vw,18px) 0;margin-bottom:clamp(16px,2vw,24px);
}
.panel-facts li{font-size:.86rem;color:var(--ink-2);line-height:1.45;}
.panel-facts b{
  font-weight:600;margin-right:8px;
  background:var(--ramp);-webkit-background-clip:text;background-clip:text;color:transparent;
}
.panel-facts em{font-style:italic;color:var(--ink);}

.shot{border:1px solid var(--hair);border-radius:12px;overflow:hidden;background:rgba(0,0,0,.35);min-height:0;}
.shot img{width:100%;height:auto;filter:saturate(.92);}
.shot figcaption{
  padding:10px 12px;font-size:.78rem;line-height:1.45;color:var(--ink-3);
  border-top:1px solid var(--hair-2);
}
.shot-lead{margin-bottom:12px;}
.shot-row{display:grid;gap:12px;grid-template-columns:1fr 1fr;}
.shot-row .shot figcaption{font-size:.72rem;}

.vwall{display:grid;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr));}
.vcard{
  position:relative;border:1px solid var(--hair);border-radius:14px;overflow:hidden;
  background:#000;cursor:pointer;
  transition:border-color .4s var(--ease),transform .5s var(--ease);
}
.vcard:hover{border-color:rgba(238,44,150,.5);transform:translateY(-4px);}
.vcard video{
  width:100%;aspect-ratio:9/16;object-fit:cover;background:#000;
  transition:transform .7s var(--ease);
}
.vcard:hover video{transform:scale(1.045);}
.vcard figcaption{
  position:absolute;left:0;right:0;bottom:0;padding:34px 13px 13px;
  background:linear-gradient(180deg,transparent,rgba(4,2,10,.94));
}
.vcard figcaption b{display:block;font-size:.92rem;font-weight:600;margin-bottom:4px;}
.vcard figcaption span{display:block;font-size:.76rem;line-height:1.45;color:var(--ink-3);}
.vcard.is-playing{border-color:var(--amber);}
.vcard-sound{
  position:absolute;top:9px;right:9px;z-index:2;
  display:inline-flex;align-items:center;gap:6px;
  padding:4px 9px;border-radius:999px;
  background:rgba(4,2,10,.72);border:1px solid var(--hair);
  font-family:var(--f-mono);font-size:8.5px;letter-spacing:.12em;color:var(--ink-3);
  backdrop-filter:blur(6px);
  transition:color .3s var(--ease),border-color .3s var(--ease);
}
.vcard-sound i{
  width:5px;height:5px;border-radius:50%;background:var(--ink-4);
  transition:background .3s var(--ease);
}
.vcard:hover .vcard-sound,.vcard:focus-visible .vcard-sound{color:var(--ink);border-color:var(--ink-4);}
.vcard.is-playing .vcard-sound{color:var(--amber);border-color:rgba(238,152,38,.5);}
.vcard.is-playing .vcard-sound i{background:var(--amber);box-shadow:0 0 8px var(--amber);}

.panel-tech{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:clamp(14px,1.8vw,22px);}
.panel-tech span{
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.06em;
  padding:5px 10px;border:1px solid var(--hair);border-radius:999px;color:var(--ink-3);
}
.panel-note{
  font-size:.85rem;line-height:1.6;color:var(--ink-3);
  border-left:1px solid var(--violet);padding-left:15px;max-width:66ch;margin-top:auto;
}
.panel-note b{color:var(--ink);font-weight:600;}
.panel-note code{font-family:var(--f-mono);font-size:.86em;color:var(--amber);}

.rail-progress{
  position:absolute;left:var(--pad);right:var(--pad);bottom:clamp(18px,3vh,34px);
  height:1px;background:var(--hair);z-index:5;
}
.rail-progress i{display:block;height:100%;width:0;background:var(--ramp);}

/* -------------------------------------------------------------- visit -- */
.panel-visit{
  display:inline-flex;align-items:center;gap:7px;margin-top:8px;
  font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;color:var(--ink-3);
  padding-bottom:3px;border-bottom:1px solid var(--hair);
  transition:color .35s var(--ease),border-color .35s var(--ease);
}
.panel-visit i{
  width:11px;height:1px;background:currentColor;position:relative;
  transition:transform .35s var(--ease);
}
.panel-visit i::after{
  content:"";position:absolute;right:0;top:-2.5px;width:5px;height:5px;
  border-top:1px solid currentColor;border-right:1px solid currentColor;transform:rotate(45deg);
}
.panel-visit:hover{color:var(--amber);border-color:rgba(238,152,38,.5);}
.panel-visit:hover i{transform:translateX(4px);}

/* --------------------------------------------------------- lightbox ----- */
.lightbox{
  position:fixed;inset:0;z-index:210;display:flex;align-items:center;justify-content:center;
  background:rgba(3,1,8,.93);backdrop-filter:blur(14px);
  padding:clamp(44px,6vw,80px) clamp(16px,7vw,110px);
  opacity:0;
}
.lightbox[hidden]{display:none;}
.lb-stage{
  position:relative;max-width:min(1200px,100%);max-height:100%;
  display:flex;flex-direction:column;gap:14px;align-items:center;
}
.lb-slot{
  display:flex;align-items:center;justify-content:center;
  max-height:78vh;border:1px solid var(--hair);border-radius:14px;overflow:hidden;
  background:#000;
}
.lb-slot img,.lb-slot video{
  display:block;max-width:100%;max-height:78vh;width:auto;height:auto;object-fit:contain;
}
.lb-cap{
  font-size:.88rem;line-height:1.55;color:var(--ink-2);text-align:center;max-width:70ch;
}
.lb-hint{
  position:absolute;left:0;right:0;bottom:clamp(14px,3vh,26px);text-align:center;
  font-family:var(--f-mono);font-size:10px;letter-spacing:.16em;color:var(--ink-4);
}
.lb-close,.lb-prev,.lb-next{
  position:absolute;z-index:2;background:rgba(244,241,248,.06);color:var(--ink);
  border:1px solid var(--hair);border-radius:50%;cursor:pointer;
  width:44px;height:44px;font-size:22px;line-height:1;
  display:flex;align-items:center;justify-content:center;
  transition:background .3s var(--ease),border-color .3s var(--ease);
}
.lb-close:hover,.lb-prev:hover,.lb-next:hover{background:rgba(244,241,248,.14);border-color:var(--ink-4);}
.lb-close{top:clamp(14px,3vh,26px);right:clamp(14px,3vw,30px);}
.lb-prev{left:clamp(10px,2vw,28px);top:50%;margin-top:-22px;}
.lb-next{right:clamp(10px,2vw,28px);top:50%;margin-top:-22px;}
@media(max-width:620px){ .lb-prev,.lb-next{top:auto;bottom:56px;margin-top:0;} }

/* anything openable says so */
.shot,.vcard{cursor:pointer;}
.shot{position:relative;}
.shot::after{
  content:"View";position:absolute;top:10px;right:10px;
  font-family:var(--f-mono);font-size:9px;letter-spacing:.14em;
  padding:4px 9px;border-radius:999px;
  background:rgba(4,2,10,.78);border:1px solid var(--hair);color:var(--ink-3);
  opacity:0;transition:opacity .35s var(--ease);pointer-events:none;
}
.shot:hover::after,.shot:focus-visible::after{opacity:1;}

/* ------------------------------------------------------ DM demo (PS) ---- */
.dm{
  border:1px solid var(--hair);border-radius:14px;overflow:hidden;
  background:rgba(0,0,0,.42);max-width:560px;width:100%;
  display:flex;flex-direction:column;max-height:100%;
}
.dm-head{
  display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--hair-2);
}
.dm-av{width:24px;height:24px;border-radius:50%;background:linear-gradient(140deg,var(--violet),var(--blue));}
.dm-name{font-size:.85rem;color:var(--ink-2);flex:1;}
.dm-live{
  font-family:var(--f-mono);font-size:9.5px;letter-spacing:.18em;color:var(--amber);
  border:1px solid rgba(238,152,38,.4);border-radius:999px;padding:3px 8px;
}
.dm-thread{
  padding:14px;display:flex;flex-direction:column;gap:8px;
  flex:1;min-height:0;overflow:hidden;justify-content:flex-end;
  /* The thread is anchored to the bottom, so on a short viewport the earliest
     message gets clipped. A hard cut through a line of text reads as a bug;
     fading the top edge reads as a conversation you have scrolled back in. */
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 13%);
  mask-image:linear-gradient(180deg,transparent 0,#000 13%);
}
.dm-msg{
  max-width:82%;padding:9px 13px;border-radius:15px;font-size:.88rem;line-height:1.45;
  opacity:0;
}
.dm-msg.them{align-self:flex-start;background:rgba(244,241,248,.07);color:var(--ink-2);border-bottom-left-radius:5px;}
.dm-msg.us{
  align-self:flex-end;border-bottom-right-radius:5px;color:#12060f;
  background:linear-gradient(120deg,var(--amber),var(--magenta));
}
.dm-foot{
  display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--hair-2);
  font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;color:var(--ink-4);
}
.dm-typing{display:flex;gap:3px;}
.dm-typing i{width:4px;height:4px;border-radius:50%;background:var(--ink-4);animation:typ 1.3s infinite;}
.dm-typing i:nth-child(2){animation-delay:.18s;}
.dm-typing i:nth-child(3){animation-delay:.36s;}
@keyframes typ{0%,60%,100%{opacity:.25;}30%{opacity:1;}}

/* --------------------------------------------------- terminal (agents) -- */
.term{
  border:1px solid var(--hair);border-radius:12px;overflow:hidden;
  background:rgba(0,0,0,.55);max-width:660px;width:100%;
  display:flex;flex-direction:column;max-height:100%;
}
.term-bar{
  display:flex;align-items:center;gap:6px;padding:9px 13px;border-bottom:1px solid var(--hair-2);
}
.term-bar i{width:8px;height:8px;border-radius:50%;background:var(--hair);}
.term-bar i:first-child{background:rgba(238,58,30,.7);}
.term-bar i:nth-child(2){background:rgba(238,152,38,.7);}
.term-bar i:nth-child(3){background:rgba(44,108,238,.7);}
.term-bar span{
  margin-left:8px;font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;color:var(--ink-4);
}
.term-body{
  font-family:var(--f-mono);font-size:11px;line-height:1.8;color:var(--ink-3);
  padding:13px 15px;flex:1;min-height:0;overflow:hidden;
  white-space:pre-wrap;word-break:break-word;
}
.term-body .ok{color:#6ee7a8;}
.term-body .warn{color:var(--amber);}
.term-body .tag{color:#c9a7ff;}

/* Very short viewports (small laptops, or a window with a lot of browser
   chrome). At 620px tall every text column overflowed and fell back to its
   scroll valve, and scrolling a column inside a pinned horizontal rail is a
   miserable way to read. Give the panel more of the viewport and tighten
   further so the copy simply fits. */
@media (min-width:901px) and (max-height:730px){
  .panel{height:min(90svh,780px);}
  .panel-body{padding:clamp(16px,1.9vw,26px);gap:clamp(16px,2vw,28px);}
  .panel-title{font-size:clamp(1.25rem,2vw,1.6rem);}
  .panel-kicker{font-size:9.5px;margin-top:6px;}
  .panel-lede{font-size:.82rem;line-height:1.5;margin-bottom:11px;}
  .panel-facts{padding:9px 0;margin-bottom:11px;gap:5px 16px;}
  .panel-facts li{font-size:.76rem;line-height:1.38;}
  .panel-note{font-size:.74rem;line-height:1.5;padding-left:12px;}
  .panel-tech{margin-bottom:10px;gap:5px;}
  .panel-tech span{font-size:9px;padding:3px 7px;}
  .panel-head{margin-bottom:10px;}
  .shot figcaption{padding:7px 9px;font-size:.7rem;}
  .shot-lead{margin-bottom:8px;}
  .vcard figcaption{padding:24px 9px 9px;}
  .vcard figcaption b{font-size:.8rem;margin-bottom:2px;}
  .vcard figcaption span{font-size:.68rem;}
}

/* ----------------------------------------------------------- also built -- */
.also{padding:clamp(80px,12vw,150px) 0 0;}
.also-lede{
  margin-top:18px;max-width:52ch;font-size:1rem;line-height:1.65;color:var(--ink-3);
}
/* Six items, so the column count is pinned to divisors of six (1/2/3) rather
   than left to auto-fit. auto-fit gave four columns at 1440 and left two empty
   cells sitting there looking like the grid had failed to load. */
.also-grid{
  display:grid;gap:1px;background:var(--hair);border:1px solid var(--hair);
  grid-template-columns:1fr;
  margin-top:clamp(34px,5vw,60px);border-radius:14px;overflow:hidden;
}
@media(min-width:640px){ .also-grid{grid-template-columns:repeat(2,1fr);} }
@media(min-width:1040px){ .also-grid{grid-template-columns:repeat(3,1fr);} }
.ab{
  background:var(--bg);padding:clamp(20px,2.4vw,30px);
  display:flex;flex-direction:column;
  transition:background .45s var(--ease);
}
.ab:hover{background:#0a0517;}
.ab h3{
  font-size:1.02rem;font-weight:600;letter-spacing:-.012em;margin-bottom:10px;
  display:inline-block;background:var(--ramp);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.ab p{font-size:.9rem;line-height:1.6;color:var(--ink-2);flex:1;}
.ab-tech{
  display:block;margin-top:16px;padding-top:13px;border-top:1px solid var(--hair-2);
  font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;color:var(--ink-4);
}

/* --------------------------------------------------------- track record -- */
.track{padding:clamp(80px,12vw,150px) 0 0;}
.track-head{
  display:grid;gap:clamp(24px,3.4vw,48px);align-items:start;
  grid-template-columns:1fr;margin-bottom:clamp(44px,6vw,80px);
}
@media(min-width:820px){ .track-head{grid-template-columns:200px 1fr;} }
.me{
  width:clamp(132px,18vw,200px);aspect-ratio:1;border-radius:16px;overflow:hidden;
  border:1px solid var(--hair);position:relative;
}
.me img{width:100%;height:100%;object-fit:cover;filter:saturate(.9) contrast(1.03);}
.me::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(150deg,rgba(238,44,150,.14),transparent 55%,rgba(44,108,238,.16));
  mix-blend-mode:screen;
}
.track-intro p{
  margin-top:clamp(16px,2vw,24px);max-width:62ch;
  font-size:1.02rem;line-height:1.72;color:var(--ink-2);
}
.track-intro p + p{margin-top:clamp(14px,1.6vw,20px);}

/* -------------------------------------------------------------- clients -- */
.clients{
  margin-top:clamp(44px,6vw,76px);padding-top:clamp(28px,4vw,44px);
  border-top:1px solid var(--hair);
}
.clients-h{
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-4);margin-bottom:clamp(20px,2.6vw,30px);
}
.clients-list{
  display:grid;gap:clamp(18px,2.4vw,32px);
  grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
}
.clients-list li{display:flex;flex-direction:column;gap:8px;}
.clients-list b{
  font-size:1rem;font-weight:600;letter-spacing:-.012em;
  background:var(--ramp);-webkit-background-clip:text;background-clip:text;color:transparent;
}
.clients-list span{font-size:.9rem;line-height:1.6;color:var(--ink-2);}
.clients-note{
  margin-top:clamp(22px,3vw,34px);font-size:.9rem;color:var(--ink-3);
}

/* -------------------------------------------------------------- numbers -- */
.numbers{padding:clamp(90px,13vw,170px) 0;}
.num-grid{
  display:grid;gap:clamp(26px,3.6vw,54px);
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  margin-top:clamp(38px,5vw,72px);
}
.num .n{
  display:block;font-size:clamp(2.5rem,5.4vw,4.4rem);line-height:1;letter-spacing:-.045em;font-weight:600;
  background:var(--ramp);-webkit-background-clip:text;background-clip:text;color:transparent;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;   /* so an oversized value reports overflow instead of wrapping */
}
.num p{margin-top:12px;font-size:.9rem;line-height:1.55;color:var(--ink-3);max-width:26ch;}

/* ---------------------------------------------------------------- stack -- */
.stack{padding:clamp(80px,12vw,150px) 0;border-top:1px solid var(--hair);}
.stack-cols{
  display:grid;gap:clamp(24px,3vw,44px);
  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  margin-top:clamp(38px,5vw,68px);
}
.sc h4{
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-4);margin-bottom:12px;
}
.sc p{font-size:1rem;line-height:1.8;color:var(--ink-2);}

/* -------------------------------------------------------------- contact -- */
.contact{position:relative;padding:clamp(100px,15vw,200px) 0 0;border-top:1px solid var(--hair);overflow:hidden;}
.contact-canvas{
  position:absolute;inset:0;width:100%;height:100%;opacity:.5;z-index:0;
  /* Faded out before the footer band. Without this a single stray shard can
     land in the footer's empty middle and read as a rendering glitch rather
     than as atmosphere. */
  -webkit-mask-image:linear-gradient(180deg,#000 58%,transparent 88%);
  mask-image:linear-gradient(180deg,#000 58%,transparent 88%);
}
.contact .wrap{position:relative;z-index:2;}
.contact-title{
  font-size:clamp(3rem,12vw,10rem);line-height:.9;letter-spacing:-.045em;font-weight:600;
  margin-bottom:clamp(22px,3vw,36px);
}
.contact-sub{max-width:48ch;font-size:clamp(1rem,1.3vw,1.14rem);line-height:1.62;color:var(--ink-2);margin-bottom:clamp(28px,3.6vw,44px);}
.mailto{
  display:inline-flex;align-items:center;gap:14px;
  font-size:clamp(1.05rem,2.4vw,1.85rem);font-weight:500;letter-spacing:-.02em;
  padding-bottom:9px;border-bottom:1px solid var(--hair);
  transition:border-color .45s var(--ease);
}
.mailto i{
  width:20px;height:1.5px;background:currentColor;position:relative;
  transition:transform .45s var(--ease);
}
.mailto i::after{
  content:"";position:absolute;right:0;top:-4px;width:9px;height:9px;
  border-top:1.5px solid currentColor;border-right:1.5px solid currentColor;transform:rotate(45deg);
}
.mailto:hover{border-color:var(--magenta);}
.mailto:hover i{transform:translateX(8px);}

.foot{
  position:relative;z-index:2;
  display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:center;
  margin-top:clamp(80px,12vw,150px);
  padding:22px var(--pad);border-top:1px solid var(--hair);
  font-family:var(--f-mono);font-size:10.5px;letter-spacing:.14em;color:var(--ink-4);
}
@media(max-width:760px){ .foot-mid{display:none;} }

/* ----------------------------------------------------------- reveal fx -- */
[data-reveal]{opacity:0;}

/* SplitText's line masks are overflow:hidden, which crops descenders — the
   tail of a g or y in a heading was being sliced off. Pad the mask and pull
   the next line back up by the same amount, so glyphs clear but the leading
   is unchanged. */
.split-line{
  overflow:hidden;
  padding-bottom:.22em;
  margin-bottom:-.22em;
  padding-top:.06em;
  margin-top:-.06em;
}
.split-line > div{will-change:transform;}

/* -------------------------------------------------- reduced motion / sm -- */
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;}
  [data-reveal]{opacity:1!important;}
  .fx-scanlines{display:none;}
}

/* On narrow screens the rail stacks; JS disables the horizontal pin to match. */
@media (max-width:900px){
  .rail{height:auto;overflow:visible;}
  .rail-track{display:block;height:auto;}
  .panel{width:auto;height:auto;margin:0 var(--pad) 20px!important;}
  .panel-body{height:auto;overflow:visible;}
  .p-media{margin-top:4px;}
  .panel-note{margin-top:0;}
  .rail-progress{display:none;}
  /* these were sized to fill a fixed-height panel; on a stacked panel they
     should size to their own content instead */
  .dm,.term{max-height:none;}
  .dm-thread{overflow:visible;justify-content:flex-start;}
  .term-body{overflow:visible;}
}

/* Three 9:16 cards side by side stop being legible below ~560px. Turn the
   wall into a snapping swipe strip rather than shrinking it further. */
@media (max-width:559px){
  .vwall{
    display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;
    margin-inline:calc(var(--pad) * -0.5);padding-inline:calc(var(--pad) * 0.5);
    scrollbar-width:none;
  }
  .vwall::-webkit-scrollbar{display:none;}
  .vcard{flex:0 0 64%;scroll-snap-align:center;}
  .shot-row{grid-template-columns:1fr;}
}
