/* ==========================================================================
   TENZY — portfolio
   Reference: design/VISUAL_REFERENCE_MANIFEST.md · design/MOTION_REFERENCE.md
   ========================================================================== */

/* --- tokens ------------------------------------------------------------- */
:root{
  --bone:#e9e6de;
  --bone-2:#e2dfd6;
  --ink:#12120f;
  --ink-2:#1a1a16;
  --warm-white:#e9e5da;
  --mute-l:#63625a;
  --mute-d:#8b8a82;
  --accent-ink:#a0430f;   /* accent, small text on light  ~5.0:1 */
  --accent-d:#e0763a;     /* accent, on dark              ~6.1:1 */

  --e:cubic-bezier(.22,1,.36,1);
  --exit:cubic-bezier(.4,0,1,1);   /* leaving: accelerate out, no lingering tail */
  --pad:clamp(20px,4vw,56px);
  --max:1560px;
  --navh:72px;

  --mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --sans:"Archivo","Helvetica Neue",Arial,system-ui,sans-serif;
}

/* --- reset -------------------------------------------------------------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body,h1,h2,h3,p,ol,figure{margin:0}
ol{padding:0;list-style:none}
img,svg{display:block;max-width:100%}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer;text-align:inherit}
a{color:inherit}

html{scroll-behavior:smooth;scroll-padding-top:calc(var(--navh) + 24px)}
body{
  font-family:var(--sans);
  font-size:clamp(.95rem,.9rem + .2vw,1.06rem);
  line-height:1.55;
  background:var(--bone);
  color:var(--ink);
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}

:focus-visible{outline:2px solid var(--acc,var(--accent-ink));outline-offset:3px;border-radius:2px}

.skip{
  position:absolute;left:var(--pad);top:-100px;z-index:99;
  background:var(--ink);color:var(--bone);padding:12px 18px;border-radius:999px;
  font:500 .8rem/1 var(--mono);text-transform:uppercase;letter-spacing:.08em;
  text-decoration:none;transition:top .2s var(--e);
}
.skip:focus{top:16px}

/* --- shared type -------------------------------------------------------- */
.display{
  font-family:var(--sans);
  font-weight:850;font-stretch:76%;
  text-transform:uppercase;
  line-height:.86;
  letter-spacing:-.015em;
  text-wrap:balance;
}
.eyebrow,.chip,.st,.foot__k,.slot__tag,.slot__id,.acc__i,.proj__n,.hero__rail,.track span{
  font-family:var(--mono);
  font-size:clamp(.66rem,.62rem + .12vw,.76rem);
  text-transform:uppercase;
  letter-spacing:.1em;
  font-weight:500;
}
.lede{font-size:clamp(1rem,.95rem + .35vw,1.22rem);line-height:1.5;max-width:44ch}
.arw{display:inline-block;font-style:normal}
.ul{color:inherit;text-decoration:none;box-shadow:inset 0 -1px 0 currentColor;padding-bottom:1px;transition:color .3s var(--e),box-shadow .3s var(--e)}
.ul:hover{color:var(--acc);box-shadow:inset 0 -1px 0 var(--acc)}

/* --- act theming -------------------------------------------------------- */
.act{position:relative;z-index:1;background:var(--bg);color:var(--fg)}
.act--light{
  --bg:var(--bone);--fg:var(--ink);--mute:var(--mute-l);--acc:var(--accent-ink);
  --rule:rgba(18,18,15,.15);--rule-soft:rgba(18,18,15,.08);
  --slot-bg:rgba(18,18,15,.04);--slot-line:rgba(18,18,15,.1);
}
.act--dark{
  --bg:var(--ink);--fg:var(--warm-white);--mute:var(--mute-d);--acc:var(--accent-d);
  --rule:rgba(233,229,218,.17);--rule-soft:rgba(233,229,218,.09);
  --slot-bg:rgba(233,229,218,.05);--slot-line:rgba(233,229,218,.11);
}
.wrap{max-width:var(--max);margin-inline:auto;padding-inline:var(--pad)}

/* --- nav ---------------------------------------------------------------- */
.nav{
  position:fixed;inset:0 0 auto;z-index:40;
  transition:transform .38s var(--e),background-color .3s var(--e),color .3s var(--e);
}
.nav__in{
  max-width:var(--max);margin-inline:auto;padding:16px var(--pad);
  display:flex;align-items:center;gap:16px;min-height:var(--navh);
}
.nav__links{display:flex;gap:8px;margin-inline:auto}
.nav.stuck{background:var(--ink);color:var(--warm-white)}
.nav.stuck .pill{border-color:rgba(233,229,218,.28)}
.nav.stuck .pill--solid{background:var(--warm-white);color:var(--ink);border-color:transparent}
.nav.down{transform:translateY(-110%)}

.mark{
  font-family:var(--sans);font-weight:850;font-stretch:76%;
  font-size:1.15rem;letter-spacing:.02em;text-transform:uppercase;text-decoration:none;line-height:1;
}

.pill{
  display:inline-flex;align-items:center;gap:.5em;
  padding:.62em 1.05em;border:1px solid var(--rule,rgba(18,18,15,.3));border-radius:999px;
  font-family:var(--mono);font-size:.7rem;font-weight:500;letter-spacing:.1em;text-transform:uppercase;
  text-decoration:none;white-space:nowrap;
  transition:background-color .3s var(--e),color .3s var(--e),border-color .3s var(--e);
}
.pill:hover{background:var(--fg,var(--ink));color:var(--bg,var(--bone));border-color:transparent}
.pill--solid{background:var(--ink);color:var(--bone);border-color:transparent}
.pill--solid:hover{background:var(--accent-ink);color:#fff}
.pill--light{background:var(--warm-white);color:var(--ink);border-color:transparent}
.pill--light:hover{background:var(--accent-d);color:var(--ink)}
.pill--lg{padding:.85em 1.35em;font-size:.74rem}

/* --- hero --------------------------------------------------------------- */
/* The hero pins while the first dark act slides over it, then releases at the
   end of .pin-group. Sticking to the BOTTOM edge means that if the hero is ever
   taller than the viewport the whole of it is still reachable before it pins,
   so nothing is trapped below the fold on short screens. */
.pin-group{position:relative}
.hero{position:sticky;bottom:0;z-index:0}
.hero__in{
  min-height:100vh;min-height:100svh;
  padding-top:calc(var(--navh) + clamp(22px,5vh,58px));
  padding-bottom:clamp(16px,2.6vh,28px);
  display:flex;flex-direction:column;gap:clamp(22px,4vh,48px);
}
.hero__top{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;gap:clamp(12px,2.2vh,24px)}
.eyebrow{color:var(--mute)}
.eyebrow i{font-style:normal;opacity:.5;padding:0 .35em}
.hero__h1{font-size:clamp(2.7rem,9.4vw,11rem)}

.hero__bottom{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:clamp(24px,4vw,64px)}
.hero__say{display:flex;flex-direction:column;gap:clamp(16px,2.4vh,26px)}
.hero__cta{display:flex;flex-wrap:wrap;gap:10px}
/* the portrait rises into the empty right side of the headline's last line —
   the overlap the reference gets from its hero media card */
.hero__portrait{width:clamp(150px,18vw,272px);margin-top:clamp(-160px,-11vh,0px)}

.hero__rail{
  display:flex;flex-wrap:wrap;gap:clamp(14px,2.4vw,34px);align-items:center;
  border-top:1px solid var(--rule);padding-top:14px;
  font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;
}
.hero__rail a{color:var(--mute);text-decoration:none;transition:color .3s var(--e)}
.hero__rail a:hover{color:var(--acc)}
.hero__rail-end{margin-left:auto;color:var(--mute);opacity:.7}

/* hero recedes as the next act slides over it (JS writes --fade) */
.hero__in{opacity:calc(1 - (var(--fade,0) * .62))}
.hero.gone{visibility:hidden}

/* --- section header ----------------------------------------------------- */
.sec-head{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,36%);
  gap:clamp(22px,4vw,60px);align-items:end;
  padding:clamp(72px,11vh,150px) 0 clamp(34px,5vh,64px);
}
.sec-head--tight{padding-top:clamp(60px,9vh,120px)}
.sec-head__h{font-size:clamp(2.3rem,7vw,7.4rem)}
.sec-head__aside{display:flex;flex-direction:column;gap:14px;align-items:start;padding-bottom:.6em}
.sec-head__aside p{color:var(--mute);max-width:42ch}
.chip{
  display:inline-block;padding:.5em .85em;border:1px solid var(--rule);border-radius:4px;color:var(--mute);
}

/* --- accordion ---------------------------------------------------------- */
.acc{border-bottom:1px solid var(--rule)}
.acc__row{border-top:1px solid var(--rule)}
.acc__h{font:inherit;margin:0}
.acc__btn{
  width:100%;display:grid;align-items:center;gap:clamp(12px,2vw,28px);
  grid-template-columns:minmax(84px,32%) minmax(0,1fr) auto;
  padding:clamp(18px,2.4vw,30px) 0;
  transition:color .35s var(--e);
}
.acc__btn:hover{color:var(--acc)}
/* the index carries real weight in the row, as it does in the reference */
.acc__i{color:var(--mute);transition:color .35s var(--e);font-size:clamp(.8rem,.55rem + 1.1vw,1.5rem)}
.acc__btn:hover .acc__i,.acc__row.open .acc__i{color:var(--acc)}
.acc__t{font-size:clamp(1.5rem,3.6vw,3.5rem);display:block}

.acc__x{width:26px;height:26px;position:relative;flex:none;color:var(--mute);transition:color .35s var(--e)}
.acc__btn:hover .acc__x,.acc__row.open .acc__x{color:var(--acc)}
.acc__x::before{
  content:"↗";display:grid;place-items:center;width:100%;height:100%;
  font-size:1.15rem;line-height:1;transition:transform .44s var(--e);
}
.acc__row.open .acc__x::before{transform:rotate(135deg)}
/* plus / cross variant */
.acc__x--plus::before{content:"";width:15px;height:1.5px;background:currentColor;
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transition:transform .44s var(--e)}
.acc__x--plus::after{content:"";width:15px;height:1.5px;background:currentColor;
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) rotate(90deg);transition:transform .44s var(--e)}
.acc__row.open .acc__x--plus::before{transform:translate(-50%,-50%) rotate(45deg)}
.acc__row.open .acc__x--plus::after{transform:translate(-50%,-50%) rotate(135deg)}

/* Collapsed only when JS is there to open it again — with no JS every panel
   stays open rather than becoming unreachable. */
/* collapsing is the quicker half: the answer you just finished reading should
   get out of the way faster than the next one arrives */
.acc__p{display:grid;grid-template-rows:1fr;transition:grid-template-rows .32s var(--e)}
.js .acc__p{grid-template-rows:0fr}
.js .acc__row.open .acc__p{grid-template-rows:1fr;transition:grid-template-rows .44s var(--e)}
.acc__pin{overflow:hidden;min-height:0}
.js .acc__pin>*{opacity:0;transform:translateY(8px);transition:opacity .2s var(--e),transform .2s var(--e)}
.js .acc__row.open .acc__pin>*{opacity:1;transform:none;
  transition:opacity .3s var(--e) .09s,transform .4s var(--e) .09s}
.acc__pin{
  display:grid;gap:clamp(18px,2.4vw,30px);
  padding-left:clamp(0px,32%,520px);
}
.acc__pin p{color:var(--mute);max-width:46ch;padding-bottom:clamp(4px,1vw,10px)}
.sub{border-top:1px solid var(--rule-soft);margin-bottom:clamp(18px,2.4vw,32px)}
.sub li{
  display:flex;gap:clamp(14px,2vw,28px);align-items:baseline;
  padding:.8em 0;border-bottom:1px solid var(--rule-soft);
  font-weight:700;font-stretch:82%;font-size:1.02rem;letter-spacing:.01em;
}
.sub li span{font-family:var(--mono);font-size:.7rem;font-weight:400;letter-spacing:.1em;color:var(--mute)}

/* small accordion (questions) */
.acc--sm .acc__btn{grid-template-columns:minmax(64px,44%) minmax(0,1fr) auto;padding:clamp(14px,1.7vw,20px) 0}
.acc--sm .acc__i{font-size:clamp(.66rem,.62rem + .12vw,.76rem)}
.acc--sm .acc__t{font-size:clamp(1rem,.95rem + .3vw,1.16rem);font-weight:500;line-height:1.35;text-transform:none}
.acc--sm .acc__pin{padding-left:clamp(0px,44%,700px)}
.acc--sm .acc__pin p{padding-bottom:clamp(14px,2vw,24px);max-width:56ch}

/* --- projects ----------------------------------------------------------- */
.projects{
  --proj-pad:calc(var(--pad) / 2);
  --proj-meta:17cqi;--proj-preview:clamp(96px,11vw,150px);
  --proj-gap:clamp(14px,2vw,32px);
  /* the title yields a little ground to the arriving preview, as it does in
     frames/06-project-row-hover.jpg */
  --proj-shift:clamp(12px,1.8vw,28px);
  container-type:inline-size;border-bottom:1px solid var(--rule);
}
.proj{position:relative;z-index:0;border-top:1px solid var(--rule);padding-block:clamp(6px,1vw,12px)}
.proj__row{
  position:relative;display:grid;align-items:center;
  grid-template-columns:minmax(0,var(--proj-meta)) var(--proj-preview) minmax(0,1fr) auto;
  gap:var(--proj-gap);
  padding:clamp(14px,1.8vw,24px) var(--proj-pad);
  transition:color .16s var(--exit);
}
.proj__row::before{
  content:"";position:absolute;z-index:-1;border-radius:10px;
  inset:0;
  background:var(--ink);opacity:0;transition:opacity .16s var(--exit);
}
.proj:hover .proj__row::before,.proj:focus-within .proj__row::before{
  opacity:1;transition:opacity .2s var(--e);
}
.proj:hover .proj__row,.proj:focus-within .proj__row{
  --fg:var(--warm-white);--mute:var(--mute-d);--acc:var(--accent-d);
  --rule:rgba(233,229,218,.3);
  color:var(--warm-white);transition:color .2s var(--e);
}

.proj__meta{display:flex;flex-direction:column;gap:.6em;align-items:start}
.proj__n{color:var(--mute);transition:color .16s var(--exit)}
.st{display:inline-flex;align-items:center;gap:.55em;color:var(--mute);transition:color .16s var(--exit)}
.proj:hover .proj__n,.proj:focus-within .proj__n,
.proj:hover .st,.proj:focus-within .st{transition:color .2s var(--e)}
.st i{width:8px;height:8px;border-radius:50%;flex:none}
.st--live{color:var(--acc)}
.st--live i{background:currentColor}
.st--wip i{border:1.5px solid currentColor}

.proj__media{
  opacity:0;scale:.965;translate:var(--mx,0px) var(--my,0px);
  transition:opacity .16s var(--exit),scale .16s var(--exit);
}
.proj:hover .proj__media,.proj:focus-within .proj__media{
  opacity:1;scale:1;
  transition:opacity .26s var(--e) .05s,scale .36s var(--e) .05s;
}

.proj__t{font-size:clamp(1.7rem,4.2vw,4.1rem);transition:translate .16s var(--exit)}
.proj:hover .proj__t,.proj:focus-within .proj__t{
  translate:var(--proj-shift) 0;transition:translate .42s var(--e) .05s;
}
.proj__t a{text-decoration:none}
.proj__go{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}

.proj__body{
  padding:var(--proj-gap) var(--proj-pad) clamp(24px,3vw,40px);
  padding-left:calc(var(--proj-pad) + var(--proj-meta) + var(--proj-preview) + 2 * var(--proj-gap));
  display:grid;gap:14px;
}
.proj__body p{color:var(--mute);max-width:62ch}
.proj__tools{display:flex;flex-wrap:wrap;gap:10px clamp(14px,2vw,28px);align-items:center}
/* each chip stays glued to its own label when the row wraps */
.proj__tools>span{
  display:inline-flex;align-items:center;gap:.7em;
  font-family:var(--mono);font-size:.66rem;letter-spacing:.09em;text-transform:uppercase;color:var(--mute);
}
.proj__tools code{
  font-family:var(--mono);font-size:.72rem;letter-spacing:.02em;text-transform:none;color:var(--fg);
  border:1px solid var(--rule);border-radius:4px;padding:.35em .6em;
}

/* --- about -------------------------------------------------------------- */
.about{padding:clamp(80px,13vh,180px) 0 clamp(40px,6vh,80px)}
.about__lock{display:flex;align-items:center;gap:clamp(18px,2.6vw,38px);flex-wrap:wrap}
.about__portrait{width:clamp(96px,11vw,168px);flex:none}
.about__h{font-size:clamp(2.1rem,6vw,6.2rem)}
.about__say{
  display:grid;grid-template-columns:auto minmax(0,1fr);gap:clamp(16px,2.6vw,34px);
  align-items:start;max-width:78ch;
  margin:clamp(34px,5vh,62px) 0 0 clamp(0px,12vw,206px);
}
.about__say p{color:var(--mute)}
.about__say p + p{margin-top:1em}

.track{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  border-top:1px solid var(--rule);margin-top:clamp(46px,7vh,90px);
}
.track li{
  padding:18px clamp(8px,1.4vw,20px) 0 0;
  font-weight:700;font-stretch:82%;font-size:clamp(.9rem,.85rem + .25vw,1.05rem);
  line-height:1.25;color:var(--mute);
  display:flex;flex-direction:column;gap:.7em;
}
.track li span{color:var(--mute);opacity:.65}
.track__now{color:var(--acc)}
.track__now span{color:var(--acc);opacity:1}

/* --- detail rows -------------------------------------------------------- */
.dets{border-bottom:1px solid var(--rule);margin-bottom:clamp(60px,9vh,120px)}
.det{
  display:grid;grid-template-columns:minmax(0,40%) 56px minmax(0,1fr);
  gap:clamp(10px,2vw,28px);align-items:start;
  padding:clamp(18px,2.3vw,32px) 0;border-top:1px solid var(--rule);
}
.det__l{
  text-align:right;color:var(--mute);
  font-weight:700;font-stretch:88%;font-size:clamp(1rem,.95rem + .3vw,1.2rem);
  transition:color .4s var(--e);
}
.det__ic{display:grid;place-items:center;color:var(--mute);transition:color .4s var(--e)}
.det__ic svg{width:20px;height:20px;stroke-linecap:round;stroke-linejoin:round}
.det__d{color:var(--mute);max-width:42ch;transition:color .4s var(--e)}
.det.on .det__l,.det.on .det__d{color:var(--fg)}
.det.on .det__ic{color:var(--acc)}

/* --- building in public ------------------------------------------------- */
.public__head{border-bottom:1px solid var(--rule);padding-bottom:clamp(40px,6vh,80px)}
.public__head .sec-head__aside{flex-direction:column}
.public__link{font-family:var(--mono);font-size:.8rem;letter-spacing:.06em;margin-top:8px}

/* --- questions ---------------------------------------------------------- */
.qa{padding:clamp(80px,12vh,160px) 0 0}
.qa__h{font-size:clamp(2.3rem,7vw,7.4rem);margin-bottom:clamp(30px,4.5vh,58px)}

/* --- cta ---------------------------------------------------------------- */
.cta{
  margin:clamp(80px,12vh,160px) 0 clamp(40px,6vh,80px);
  background:var(--ink);color:var(--warm-white);border-radius:14px;
  padding:clamp(56px,11vw,150px) clamp(20px,4vw,60px);
  display:grid;justify-items:center;gap:clamp(20px,3vh,38px);text-align:center;
  --acc:var(--accent-d);--rule:rgba(233,229,218,.22);
}
.cta__k{font-family:var(--mono);font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--mute-d)}
.cta__h{font-size:clamp(2rem,6.4vw,6.6rem)}
.cta__go{margin-top:.4em;max-width:100%}
.cta__email{text-transform:none;letter-spacing:.03em;max-width:100%;white-space:normal;overflow-wrap:anywhere}

/* --- footer ------------------------------------------------------------- */
.foot{--bg:var(--bone);--fg:var(--ink);--mute:var(--mute-l);--acc:var(--accent-ink);
  --rule:rgba(18,18,15,.15);background:var(--bg);color:var(--fg);position:relative;z-index:1}
.foot__in{
  display:grid;grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr));
  gap:clamp(24px,3vw,48px);
  padding-top:clamp(34px,5vh,56px);padding-bottom:clamp(28px,4vh,44px);
  border-top:1px solid var(--rule);
}
.foot__mark p{color:var(--mute);font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;
  text-transform:uppercase;margin-top:10px}
.foot__col{display:flex;flex-direction:column;gap:9px;align-items:start}
.foot__k{color:var(--mute);margin-bottom:4px}
.foot__col a{color:var(--fg);text-decoration:none;font-size:.95rem;transition:color .3s var(--e)}
.foot__col a:hover{color:var(--acc)}
.foot__end{
  grid-column:1/-1;display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;
  border-top:1px solid var(--rule);padding-top:20px;margin-top:clamp(20px,3vh,36px);
  font-family:var(--mono);font-size:.68rem;letter-spacing:.09em;text-transform:uppercase;color:var(--mute);
}

/* --- asset slots -------------------------------------------------------- */
.slot{
  position:relative;overflow:hidden;border-radius:10px;
  aspect-ratio:var(--ratio,1);
  background:var(--slot-bg);border:1px solid var(--rule);
  display:grid;align-content:center;justify-items:center;gap:6px;padding:10px;text-align:center;
}
.slot::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(-45deg,transparent 0 11px,var(--slot-line) 11px 12px);
}
.slot__tag,.slot__id{position:relative;color:var(--mute);line-height:1.4}
.slot__tag{color:var(--fg);opacity:.75}
.slot__id{font-size:.6rem;letter-spacing:.06em;opacity:.7;word-break:break-word}
.slot--sm{padding:6px}
.slot--sm .slot__tag{font-size:.56rem}
.slot--sm .slot__id{font-size:.5rem;letter-spacing:.04em}
.slot.is-img{background:none;border-color:transparent;padding:0}
.slot.is-img::before{display:none}
.slot img{width:100%;height:100%;object-fit:cover}

/* --- reveal ------------------------------------------------------------- */
/* Nothing is hidden unless JS is present to reveal it, so a script failure
   cannot leave the page blank.
   Opacity resolves well before the travel does, so content is readable while
   it is still settling rather than sitting at 80% for half a second. */
.js .rv{opacity:0;transform:translateY(18px);
  transition:opacity .42s var(--e),transform .6s var(--e);
  transition-delay:calc(var(--d,0) * 60ms)}
/* a heading arrives shorter and sooner than the copy it introduces */
.js .display.rv{transform:translateY(11px);transition-duration:.34s,.48s}
/* a block whose own lines rise behind a mask does not travel as well */
.js .rv:has(.ln){transform:none}
.js .rv.in{opacity:1;transform:none}
[data-rv-delay="1"]{--d:1}
[data-rv-delay="2"]{--d:2}
[data-rv-delay="3"]{--d:3}

.ln{display:block;overflow:hidden;padding-bottom:.04em}
.ln>span{display:block}
.js .ln>span{transform:translateY(112%);transition:transform .9s var(--e)}
.in .ln>span{transform:none}
.ln:nth-child(2)>span{transition-delay:.08s}
.ln:nth-child(3)>span{transition-delay:.16s}

/* ==========================================================================
   responsive
   ========================================================================== */
@media (max-width:1100px){
  .sec-head{grid-template-columns:1fr;align-items:start;gap:26px}
  .sec-head__aside{padding-bottom:0;flex-direction:row;align-items:start;gap:20px;flex-wrap:wrap}
  .acc__btn{grid-template-columns:minmax(64px,20%) minmax(0,1fr) auto}
  .acc__pin{padding-left:calc(20% + clamp(12px,2vw,28px))}
  .projects{--proj-meta:20cqi;--proj-preview:clamp(90px,12vw,130px)}
  .proj__row{grid-template-columns:minmax(0,var(--proj-meta)) var(--proj-preview) minmax(0,1fr);row-gap:14px}
  .proj__go{grid-column:1/-1;justify-content:flex-start}
  .foot__in{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
}

@media (max-width:860px){
  :root{--navh:64px}
  .nav__links{gap:6px}
  .nav__links .pill{padding:.55em .8em;font-size:.64rem}
  .pill{font-size:.66rem}

  .hero__bottom{grid-template-columns:1fr;align-items:start;gap:26px}
  .hero__portrait{width:min(58%,240px);margin-top:0}
  .hero__rail-end{display:none}

  .about__lock{gap:18px}
  .about__portrait{width:clamp(84px,22vw,130px)}
  .about__say{grid-template-columns:1fr;margin-left:0;gap:16px}

  .track{grid-template-columns:1fr;border-top:0}
  .track li{border-top:1px solid var(--rule);padding:14px 0;flex-direction:row;align-items:baseline;gap:14px}

  .det{grid-template-columns:28px minmax(0,1fr);gap:12px 14px}
  .det__l{grid-column:2;text-align:left;color:var(--fg)}
  .det__ic{grid-row:1;grid-column:1;justify-self:start;padding-top:2px}
  .det__d{grid-column:2}

  /* touch: nothing hides behind hover */
  .proj__row{grid-template-columns:minmax(0,1fr);row-gap:12px;padding-bottom:18px}
  .proj__meta{flex-direction:row;gap:14px;align-items:center}
  .projects{--proj-shift:0px}
  .proj__media{opacity:1;scale:1;translate:none;max-width:min(100%,420px)}
  .proj:hover .proj__media,.proj:focus-within .proj__media{scale:1}
  .proj__body{padding-left:var(--proj-pad)}
  .proj__go{justify-content:flex-start}

  .acc__btn{grid-template-columns:minmax(52px,auto) minmax(0,1fr) auto;gap:14px}
  .acc__pin{padding-left:0}
  .acc--sm .acc__btn{grid-template-columns:minmax(48px,auto) minmax(0,1fr) auto}
  .acc--sm .acc__pin{padding-left:0}

  .foot__in{grid-template-columns:1fr;gap:28px}
  .foot__end{flex-direction:column;gap:6px}
}

@media (max-width:420px){
  .nav__links{display:none}
  .nav__in{justify-content:space-between}
  .hero__portrait{width:min(66%,210px)}
  .cta{border-radius:10px}
}

/* no hover (touch): previews and actions are never hidden */
@media (hover:none){
  .projects{--proj-shift:0px}
  .proj__media{opacity:1;scale:1;translate:none}
}

/* ==========================================================================
   reduced motion — all content, no travel
   ========================================================================== */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;transition-delay:0ms !important;
  }
  .hero{position:static}
  .hero__in{opacity:1}
  .js .rv{opacity:1;transform:none}
  .js .ln>span{transform:none}
  .projects{--proj-shift:0px}
  .proj__media{opacity:1;scale:1;translate:none}
  .js .acc__pin>*{opacity:1;transform:none}
  .nav.down{transform:none}
}
