/* ==========================================================================
   valvomo.dev v3 — a dinosaur, a name, and a way to reach us
   ========================================================================== */

@font-face{font-family:"Instrument Serif";src:url("../fonts/instrument-serif-latin-400-normal.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;}
@font-face{font-family:"Instrument Serif";src:url("../fonts/instrument-serif-latin-400-italic.woff2") format("woff2");font-weight:400;font-style:italic;font-display:swap;}
@font-face{font-family:"JetBrains Mono";src:url("../fonts/jetbrains-mono-latin-wght-normal.woff2") format("woff2");font-weight:100 800;font-style:normal;font-display:swap;}

:root{
  color-scheme:light;
  --paper:#f3f2ee;
  --ink:#0b0b0b;
  --ink-rgb:11,11,11;                       /* --ink as r,g,b, for the translucent inks below */
  --hair:rgba(var(--ink-rgb),.14);          /* hairlines */
  --hair-2:rgba(var(--ink-rgb),.15);        /* the scroll cue's track */
  --tint:rgba(var(--ink-rgb),.06);          /* offset shadows, the address bar */
  --shot-bg:#ddd;
  --shot-mono:grayscale(1) contrast(1.08) brightness(1.02);
  --phone-mono:grayscale(1) contrast(1.08);
  --phone-body:var(--ink);
  --phone-ring:var(--paper);
  --phone-shadow:rgba(0,0,0,.45);
  --eye:var(--paper);
  --eye-glow:none;
  --serif:"Instrument Serif","Times New Roman",Georgia,serif;
  --mono:"JetBrains Mono","SF Mono","IBM Plex Mono",ui-monospace,monospace;
  --ease-out:cubic-bezier(.16,1,.3,1);
  --gutter:clamp(16px,4vw,56px);
}
/* dark: opt-in only (js/theme.js + the inline <head> script set data-theme; no prefers-color-scheme on purpose) */
html[data-theme="dark"]{
  color-scheme:dark;
  --paper:#121211;
  --ink:#e6e4dd;
  --ink-rgb:230,228,221;
  --hair:rgba(var(--ink-rgb),.17);
  --hair-2:rgba(var(--ink-rgb),.17);
  --tint:rgba(var(--ink-rgb),.07);
  --shot-bg:#262624;
  --shot-mono:grayscale(1) contrast(1.04) brightness(.8);
  --phone-mono:grayscale(1) contrast(1.04) brightness(.8);
  --phone-body:#222220;
  --phone-ring:rgba(var(--ink-rgb),.55);
  --phone-shadow:rgba(0,0,0,.7);
  --eye:#ff6a3d;
  --eye-glow:drop-shadow(0 0 .6px #ff4a1c) drop-shadow(0 0 1.4px rgba(255,74,28,.75));
}

*{box-sizing:border-box;margin:0;padding:0;}
html{-webkit-text-size-adjust:100%;}
body{
  background:var(--paper);color:var(--ink);font-family:var(--serif);
  overflow-x:clip;-webkit-font-smoothing:antialiased;
}
::selection{background:var(--ink);color:var(--paper);}
:focus-visible{outline:2px solid currentColor;outline-offset:5px;}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}

.scene{
  position:relative;overflow:hidden;
  min-height:100vh;min-height:100svh;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:48px var(--gutter) 64px;
}

/* ---------- dinosaur + ground ---------- */
.dino{
  width:clamp(104px,min(15vw,24vh),230px);aspect-ratio:30/23;
  position:relative;z-index:1;cursor:pointer;will-change:transform;
  -webkit-tap-highlight-color:transparent;
}
.dino svg{width:100%;height:100%;overflow:visible;color:var(--ink);}
.dino.right svg{transform:scaleX(-1);}
.dino-eye{fill:var(--eye);filter:var(--eye-glow);}

.ground{
  width:100vw;height:2px;flex:none;
  background:repeating-linear-gradient(90deg,var(--ink) 0 22px,transparent 22px 30px,var(--ink) 30px 70px,transparent 70px 76px);
  transform-origin:left;animation:draw 1.6s var(--ease-out) .1s both;
}
@keyframes draw{from{transform:scaleX(0);}}

/* ---------- name ---------- */
.title{
  margin-top:clamp(22px,4vh,44px);
  font-weight:400;white-space:nowrap;text-align:center;
  font-size:clamp(64px,min(17vw,21vh),280px);line-height:.9;letter-spacing:-.035em;
}
.title em{font-style:italic;letter-spacing:-.02em;}
.title .mask{display:inline-block;padding-bottom:.08em;clip-path:inset(-1em -1em 0 -1em);}
.title .c{display:inline-block;animation:rise 1.3s var(--ease-out) both;animation-delay:calc(.2s + var(--i) * .035s);}
@keyframes rise{from{transform:translateY(112%);}}

/* ---------- talk to us ---------- */
.talk{
  position:relative;overflow:hidden;isolation:isolate;
  margin-top:clamp(26px,5vh,56px);
  display:inline-flex;align-items:center;justify-content:center;
  height:58px;padding:0 32px;border:1px solid var(--ink);border-radius:999px;
  color:var(--ink);text-decoration:none;
  font-family:var(--mono);font-size:12.5px;letter-spacing:.2em;text-transform:uppercase;
  transition:color .5s var(--ease-out);
  animation:fade .8s var(--ease-out) .6s both;
}
.talk::before{
  content:"";position:absolute;inset:-1px;z-index:-1;border-radius:inherit;background:var(--ink);
  transform:translateY(102%);transition:transform .6s var(--ease-out);
}
.talk:hover,.talk:focus-visible{color:var(--paper);}
.talk:hover::before,.talk:focus-visible::before{transform:none;}
.talk-roll{display:grid;overflow:hidden;line-height:1.3;}
.talk-a,.talk-b{grid-area:1/1;display:flex;align-items:center;justify-content:center;gap:12px;transition:transform .55s var(--ease-out);}
.talk-a svg{width:15px;height:15px;transition:transform .55s var(--ease-out);}
.talk-b{transform:translateY(110%);text-transform:none;letter-spacing:.06em;}
.talk:hover .talk-a,.talk:focus-visible .talk-a{transform:translateY(-110%);}
.talk:hover .talk-b,.talk:focus-visible .talk-b{transform:none;}
@keyframes fade{from{opacity:0;transform:translateY(14px);}}

@media (prefers-reduced-motion:reduce){
  .ground,.title .c,.talk{animation:none;}
  .talk,.talk::before,.talk-a,.talk-b{transition:none;}
}

/* ==========================================================================
   scroll cue
   ========================================================================== */
html{scroll-behavior:smooth;}
.cue{
  position:absolute;left:50%;bottom:clamp(16px,3vh,28px);transform:translateX(-50%);
  display:flex;flex-direction:column;align-items:center;gap:10px;
  color:var(--ink);text-decoration:none;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;
  animation:fade .8s var(--ease-out) .9s both;
}
.cue i{position:relative;width:1px;height:34px;overflow:hidden;background:var(--hair-2);}
.cue i::after{content:"";position:absolute;inset:0;background:var(--ink);animation:drip 2.2s var(--ease-out) infinite;}
@keyframes drip{0%{transform:translateY(-100%);}60%,100%{transform:translateY(100%);}}
@media (max-height:620px){.cue{display:none;}}

/* ==========================================================================
   portfolio
   ========================================================================== */
.work{
  --line:var(--hair);
  position:relative;overflow-x:clip;
  max-width:1480px;margin:0 auto;
  padding:clamp(72px,12vh,140px) var(--gutter) clamp(56px,10vh,120px);
}
.eyebrow{
  display:flex;justify-content:space-between;gap:16px;
  padding-bottom:14px;border-bottom:1px solid var(--ink);
  font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;
}
.work-head{display:grid;grid-template-columns:1fr auto;align-items:end;column-gap:32px;}
.work-head .eyebrow{grid-column:1/-1;}
.work-title{
  margin-top:clamp(18px,3vw,36px);
  font-weight:400;font-size:clamp(68px,15vw,240px);line-height:.86;letter-spacing:-.04em;
}
.work-title .mask{display:block;overflow:hidden;padding-bottom:.06em;}
.work-title .mask:last-child{padding-left:clamp(28px,12vw,220px);}
.work-title .line{display:inline-block;}
.work-title em{font-style:italic;letter-spacing:-.02em;}
.work-title sup{
  font-family:var(--mono);font-size:max(11px,.075em);letter-spacing:.1em;
  vertical-align:top;margin-left:.6em;position:relative;top:.9em;
}
.work-note{
  max-width:24ch;margin:0 0 .5em;
  font-size:clamp(20px,2.1vw,28px);line-height:1.2;
}

/* ---------- a case ---------- */
.case{margin-top:clamp(72px,12vw,160px);}
.case-meta{
  position:relative;display:flex;align-items:center;gap:18px;
  padding-bottom:14px;
  font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;
}
.case-meta::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--ink);
  transform-origin:left;
}
.case-idx{font-weight:600;}
.case-kicker{opacity:.6;}
.case-live{margin-left:auto;display:inline-flex;align-items:center;gap:8px;}
.case-live i{width:7px;height:7px;border-radius:50%;background:var(--ink);animation:pulse 2s ease-in-out infinite;}
@keyframes pulse{50%{opacity:.25;}}

/* a domain we're selling: the one spot of colour on the page */
.case.sale{--sale:#ff4a1c;}
.case.sale .case-name,.case.app .case-name{font-size:clamp(40px,5.4vw,84px);}
.case-sale{
  margin-left:auto;padding:5px 11px 4px;border-radius:999px;
  background:var(--sale);color:var(--paper);font-weight:600;
}
.stamp{
  position:absolute;top:-22px;right:-10px;z-index:2;pointer-events:none;
  display:flex;flex-direction:column;align-items:center;gap:4px;
  padding:14px 22px 12px;border:2px solid var(--sale);outline:1px solid var(--sale);outline-offset:4px;
  background:var(--paper);color:var(--sale);transform:rotate(8deg);
}
.stamp b{font-family:var(--mono);font-size:clamp(17px,1.9vw,28px);font-weight:700;letter-spacing:.16em;text-transform:uppercase;line-height:1;}
.stamp small{font-family:var(--serif);font-style:italic;font-size:clamp(14px,1.2vw,18px);line-height:1;}

.case-grid{
  display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);
  gap:clamp(28px,5vw,88px);align-items:start;
  padding-top:clamp(28px,4vw,56px);
}
.case.rev .case-grid{grid-template-columns:minmax(0,7fr) minmax(0,5fr);}
.case.rev .case-copy{order:2;}

.case-name{font-weight:400;font-size:clamp(46px,6.4vw,104px);line-height:.92;letter-spacing:-.035em;}
.case-name a{color:inherit;text-decoration:none;}
.case-name em{font-style:italic;letter-spacing:-.02em;}
.case-name .mask{display:inline-block;padding-bottom:.08em;clip-path:inset(-1em -1em 0 -1em);white-space:nowrap;}
.case-name .c{display:inline-block;transition:transform .5s var(--ease-out);}
.case-name a:hover .c,.case-name a:focus-visible .c{transform:translateY(-.08em);transition-delay:calc(var(--i) * 18ms);}

.case-lede{margin-top:clamp(18px,2.4vw,30px);font-size:clamp(19px,1.7vw,24px);line-height:1.3;max-width:34ch;}

.case-facts{margin-top:clamp(22px,2.6vw,34px);border-top:1px solid var(--line);}
.case-facts div{display:grid;grid-template-columns:9.5em 1fr;gap:12px;padding:11px 0;border-bottom:1px solid var(--line);}
.case-facts dt{font-family:var(--mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;opacity:.55;padding-top:.35em;}
.case-facts dd{font-size:17px;line-height:1.3;}

.case-tags{list-style:none;display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;}
.case-tags li{
  font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
  padding:7px 12px;border:1px solid var(--line);border-radius:999px;
}

/* visit pill, a little sibling of .talk */
.pill{
  position:relative;overflow:hidden;isolation:isolate;
  margin-top:clamp(26px,3vw,38px);
  display:inline-flex;align-items:center;justify-content:center;
  height:50px;padding:0 26px;border:1px solid var(--ink);border-radius:999px;
  color:var(--ink);text-decoration:none;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.2em;text-transform:uppercase;
  transition:color .5s var(--ease-out);
}
.pill::before{
  content:"";position:absolute;inset:-1px;z-index:-1;border-radius:inherit;background:var(--ink);
  transform:translateY(102%);transition:transform .6s var(--ease-out);
}
.pill:hover,.pill:focus-visible{color:var(--paper);}
.pill:hover::before,.pill:focus-visible::before{transform:none;}
.pill-roll{display:grid;overflow:hidden;line-height:1.3;}
.pill-a,.pill-b{grid-area:1/1;display:flex;align-items:center;justify-content:center;gap:10px;transition:transform .55s var(--ease-out);}
.pill-a svg{width:13px;height:13px;}
.pill-b{transform:translateY(110%);text-transform:none;letter-spacing:.06em;}
.pill:hover .pill-a,.pill:focus-visible .pill-a{transform:translateY(-110%);}
.pill:hover .pill-b,.pill:focus-visible .pill-b{transform:none;}

/* ---------- media: browser + phone ---------- */
.case-media{
  --x:50%;--y:30%;
  position:relative;display:block;color:var(--ink);text-decoration:none;
  padding:0 0 12% 9%;cursor:none;
}
.case.rev .case-media{padding:0 9% 12% 0;}
.browser{
  position:relative;border:1px solid var(--ink);border-radius:12px;overflow:hidden;background:var(--paper);
  box-shadow:0 1px 0 var(--ink),18px 22px 0 -1px var(--tint);
  transition:box-shadow .6s var(--ease-out),transform .6s var(--ease-out);
}
.case.rev .browser{box-shadow:0 1px 0 var(--ink),-18px 22px 0 -1px var(--tint);}
.browser-bar{
  display:flex;align-items:center;gap:6px;height:34px;padding:0 14px;border-bottom:1px solid var(--ink);
}
.browser-bar i{width:9px;height:9px;border-radius:50%;border:1px solid var(--ink);}
.browser-bar span{
  margin:0 auto;transform:translateX(-18px);
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;
  padding:3px 14px;border-radius:999px;background:var(--tint);
}
.shot{position:relative;aspect-ratio:16/10;overflow:hidden;background:var(--shot-bg);}
.shot img{position:absolute;inset:0;width:100%;height:112%;object-fit:cover;object-position:top;will-change:transform;transform:translate3d(0,var(--py,0px),0);}
.shot .mono{filter:var(--shot-mono);}
.shot .color{clip-path:circle(0% at var(--x) var(--y));transition:clip-path .9s var(--ease-out);}
.case-media:hover .shot .color,.case.lit .shot .color{clip-path:circle(150% at var(--x) var(--y));}

.phone{
  position:absolute;left:0;bottom:0;width:27%;
  padding:5px;border-radius:24px;background:var(--phone-body);
  box-shadow:0 0 0 1px var(--phone-ring),0 24px 50px -20px var(--phone-shadow);
  transform:translate3d(0,var(--pp,0px),0) rotate(-3deg);will-change:transform;
}
.case.rev .phone{left:auto;right:0;transform:translate3d(0,var(--pp,0px),0) rotate(3deg);}
.phone img{
  display:block;width:100%;height:auto;aspect-ratio:390/760;object-fit:cover;object-position:top;border-radius:19px;
  filter:var(--phone-mono);transition:filter .8s var(--ease-out);
}
.case-media:hover .phone img,.case.lit .phone img{filter:none;}

.peek{
  position:absolute;left:0;top:0;z-index:3;pointer-events:none;
  width:92px;height:92px;margin:-46px 0 0 -46px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;gap:6px;
  background:var(--ink);color:var(--paper);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;
  transform:translate3d(var(--cx,0px),var(--cy,0px),0) scale(0);
  transition:transform .45s var(--ease-out);
}
.peek svg{width:11px;height:11px;}
.case-media.peeking .peek{transform:translate3d(var(--cx,0px),var(--cy,0px),0) scale(1);}
.case-media:hover .browser{transform:translateY(-4px);}

/* an app, not a site: three phones fanned out instead of browser + phone */
.case-media.trio{display:flex;justify-content:center;align-items:center;padding:2% 0 9%;}
.trio .phone{
  --tx:0%;--ty:0%;--k:.9;
  position:relative;left:auto;bottom:auto;flex:none;width:32%;
  transform:translate3d(var(--tx),calc(var(--pp,0px) * var(--k) + var(--ty)),0);
  rotate:var(--r,0deg);transition:rotate .8s var(--ease-out),scale .8s var(--ease-out);
}
.trio .phone:nth-child(1){--tx:15%;--ty:10%;--k:.45;--r:-7deg;}
.trio .phone:nth-child(2){z-index:1;width:35%;}
.trio .phone:nth-child(3){--tx:-15%;--ty:10%;--k:.45;--r:7deg;}
.trio:hover .phone:nth-child(1){--r:-10deg;}
.trio:hover .phone:nth-child(2){scale:1.03;}
.trio:hover .phone:nth-child(3){--r:10deg;}
.trio .phone img{aspect-ratio:440/950;}
.trio .phone:nth-child(2) img{transition-delay:.08s;}
.trio .phone:nth-child(3) img{transition-delay:.16s;}

/* ---------- testers: a small dinosaur works through a never-ending line of bugs (js/teaser.js) ---------- */
.testers{max-width:1480px;margin:0 auto;padding:clamp(80px,13vh,150px) var(--gutter) 0;}
.testers-row{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:40px;}
.testers-copy{max-width:640px;}
.testers-title{margin-top:clamp(18px,3vh,32px);font-weight:400;font-size:clamp(40px,6vw,96px);line-height:.92;letter-spacing:-.03em;}
.testers-title em{font-style:italic;letter-spacing:-.02em;}
.testers-note{max-width:44ch;margin-top:18px;font-size:clamp(17px,1.5vw,20px);line-height:1.35;}
.testers .pill{height:58px;padding:0 32px;font-size:12.5px;}

.testers-stage{
  --dino:clamp(96px,11vw,150px);--bugw:calc(var(--dino) * .3);
  position:relative;flex:0 1 clamp(260px,34vw,460px);
  display:flex;flex-direction:column;align-items:flex-end;
}
.testers-stage .dino{width:var(--dino);}
.testers-stage .ground{width:100%;animation:none;}
.testers-stage .bug{
  position:absolute;left:0;bottom:2px;width:calc(var(--dino) / 30 * var(--w));height:auto;
  display:block;color:var(--ink);animation:appear .3s ease-out both;
  transition:scale .18s ease-in,opacity .18s ease-in;
}
@keyframes appear{from{opacity:0;}}
.testers-count{
  position:absolute;left:0;top:0;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;opacity:.55;
}
@media (max-width:860px){
  .testers-stage{flex-basis:100%;}
}

/* ---------- the hero's props: cacti to jump, bugs to eat (js/main.js) ---------- */
.prop{position:absolute;left:0;top:0;color:var(--ink);pointer-events:none;transition:scale .18s ease-in,opacity .18s ease-in;}
.gulp{scale:0;opacity:0;}

/* ---------- little dinosaurs living on the lines (js/linedino.js) ---------- */
[data-dino]{position:relative;--ld:clamp(28px,2.3vw,34px);--ld-b:1px;}
.eyebrow[data-dino]{--ld-b:0px;}
.ld{
  position:absolute;left:0;bottom:var(--ld-b);z-index:1;
  display:block;width:var(--ld);aspect-ratio:30/23;cursor:pointer;
  opacity:0;transition:opacity .5s ease .25s;will-change:transform;
  -webkit-tap-highlight-color:transparent;
}
.ld.on{opacity:1;}
.ld.cramped{visibility:hidden;}
.ld svg{display:block;width:100%;height:100%;overflow:visible;color:var(--ink);}
.ld.right svg{transform:scaleX(-1);}
.ld-bug{
  position:absolute;left:0;bottom:var(--ld-b);width:calc(var(--ld) / 30 * var(--w));height:auto;
  color:var(--ink);transition:scale .18s ease-in,opacity .18s ease-in;
}
.ld-z{
  position:absolute;pointer-events:none;
  font-family:var(--mono);font-size:10px;line-height:1;text-transform:none;letter-spacing:0;
  animation:zzz 2.4s ease-out forwards;
}
@keyframes zzz{
  from{opacity:0;transform:none;}
  20%{opacity:.75;}
  to{opacity:0;transform:translate(10px,-24px) scale(1.5);}
}

/* ---------- outro ---------- */
.outro{
  max-width:1480px;margin:0 auto;padding:clamp(40px,8vh,96px) var(--gutter) clamp(64px,12vh,140px);
  display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:28px 40px;
}
.outro-title{font-weight:400;font-size:clamp(52px,9vw,150px);line-height:.88;letter-spacing:-.04em;}
.outro-title em{font-style:italic;letter-spacing:-.02em;}
.outro-title .mask{display:block;overflow:hidden;padding-bottom:.06em;}
.outro-title .mask:last-child{padding-left:clamp(20px,6vw,120px);}
.outro-title .line{display:inline-block;}
/* a patch of ground between the title and the button, for a dinosaur to wait on */
.outro-stage{
  --ld:clamp(64px,6.5vw,104px);--ld-b:2px;
  flex:1 1 240px;align-self:stretch;min-height:calc(var(--ld) * .77 + 20px);margin-bottom:7.5px;
  background:repeating-linear-gradient(90deg,var(--ink) 0 22px,transparent 22px 30px,var(--ink) 30px 70px,transparent 70px 76px) left bottom/100% 2px no-repeat;
}
.outro .pill{margin:0 0 .6em;height:58px;padding:0 32px;font-size:12.5px;}
/* "available for work": a full-width label across the top of the outro, with a live dot */
.outro-avail{flex-basis:100%;flex-wrap:wrap;row-gap:8px;margin-bottom:clamp(8px,2vh,24px);}
.outro-avail span+span{opacity:.6;}
.outro-avail i{display:inline-block;width:7px;height:7px;margin:0 10px 1px 0;border-radius:50%;background:var(--ink);animation:pulse 2s ease-in-out infinite;}
@media (prefers-reduced-motion:reduce){.outro-avail i{animation:none;}}
.js .outro[data-reveal] .pill{opacity:0;transform:translateY(14px);transition:opacity .8s var(--ease-out) .18s,transform .8s var(--ease-out) .18s,color .5s var(--ease-out);}
.js .outro[data-reveal].in .pill{opacity:1;transform:none;}

/* ---------- footer ---------- */
.foot{padding:0 var(--gutter) 28px;max-width:1480px;margin:0 auto;}
.foot-rule{
  height:2px;
  background:repeating-linear-gradient(90deg,var(--ink) 0 22px,transparent 22px 30px,var(--ink) 30px 70px,transparent 70px 76px);
}
.foot-row{
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px 24px;padding-top:18px;
  font-family:var(--mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;
}
.foot-row a{color:inherit;text-decoration:none;background:linear-gradient(currentColor,currentColor) 0 100%/0 1px no-repeat;transition:background-size .5s var(--ease-out);}
.foot-row a:hover,.foot-row a:focus-visible{background-size:100% 1px;}
.foot-row a[href^="mailto"]{text-transform:none;letter-spacing:.06em;}
.foot-top{display:inline-flex;align-items:center;gap:8px;}
.foot-top svg{width:12px;height:12px;}
/* dark mode switch (js/theme.js): a pixel that fills in when it's on */
.theme-toggle{
  display:inline-flex;align-items:center;gap:9px;padding:0;border:0;background:none;color:inherit;cursor:pointer;
  font:inherit;letter-spacing:inherit;text-transform:inherit;
  -webkit-tap-highlight-color:transparent;
}
.theme-toggle i{width:9px;height:9px;flex:none;border:1px solid currentColor;transition:background-color .3s var(--ease-out);}
.theme-toggle[aria-pressed="true"] i{background:currentColor;}
.theme-toggle span{background:linear-gradient(currentColor,currentColor) 0 100%/0 1px no-repeat;transition:background-size .5s var(--ease-out);}
.theme-toggle:hover span,.theme-toggle:focus-visible span{background-size:100% 1px;}

/* ---------- scroll reveals (only when JS is around to undo them) ---------- */
.js [data-reveal] .line{transform:translateY(105%);transition:transform 1s var(--ease-out);}
.js [data-reveal] .mask:last-child .line{transition-delay:.05s;}
.js [data-reveal] .eyebrow,.js [data-reveal] .work-note{opacity:0;transform:translateY(14px);transition:opacity .8s var(--ease-out) .12s,transform .8s var(--ease-out) .12s;}
.js .case[data-reveal] .case-meta::after{transform:scaleX(0);transition:transform 1.1s var(--ease-out);}
.js .case[data-reveal] .case-meta>*{opacity:0;transition:opacity .6s var(--ease-out) .15s;}
.js .case[data-reveal] .case-name .c{transform:translateY(112%);transition:transform 1s var(--ease-out);transition-delay:calc(.08s + var(--i) * 22ms);}
.js .case[data-reveal] .case-lede,
.js .case[data-reveal] .case-facts,
.js .case[data-reveal] .case-tags,
.js .case[data-reveal] .pill{opacity:0;transform:translateY(18px);transition:opacity .8s var(--ease-out),transform .8s var(--ease-out),color .5s var(--ease-out);}
.js .case[data-reveal] .case-lede{transition-delay:.22s;}
.js .case[data-reveal] .case-facts{transition-delay:.28s;}
.js .case[data-reveal] .case-tags{transition-delay:.34s;}
.js .case[data-reveal] .pill{transition-delay:.4s,.4s,0s;}
.js .case[data-reveal] .browser{clip-path:inset(100% 0 0 0 round 12px);transition:clip-path 1.1s var(--ease-out) .05s,transform .6s var(--ease-out);}
.js .case[data-reveal] .phone{opacity:0;translate:0 60px;transition:opacity .8s var(--ease-out) .3s,translate 1.1s var(--ease-out) .3s;}
.js .case[data-reveal] .trio .phone{transition:opacity .8s var(--ease-out) var(--d),translate 1.1s var(--ease-out) var(--d),rotate .8s var(--ease-out),scale .8s var(--ease-out);}
.js .case[data-reveal] .trio .phone:nth-child(1){--d:.22s;}
.js .case[data-reveal] .trio .phone:nth-child(2){--d:.12s;}
.js .case[data-reveal] .trio .phone:nth-child(3){--d:.3s;}
.js .case[data-reveal] .stamp{opacity:0;scale:1.6;transition:opacity .25s ease-out .65s,scale .45s cubic-bezier(.5,0,.6,1.6) .65s;}

.js [data-reveal].in .line,
.js .case[data-reveal].in .case-name .c{transform:none;}
.js [data-reveal].in .eyebrow,.js [data-reveal].in .work-note,
.js .case[data-reveal].in .case-meta>*,
.js .case[data-reveal].in .case-lede,.js .case[data-reveal].in .case-facts,
.js .case[data-reveal].in .case-tags,.js .case[data-reveal].in .pill{opacity:1;transform:none;}
.js .case[data-reveal].in .case-meta::after{transform:none;}
.js .case[data-reveal].in .browser{clip-path:inset(0 0 0 0 round 12px);}
.js .case[data-reveal].in .phone{opacity:1;translate:none;}
.js .case[data-reveal].in .stamp{opacity:1;scale:1;}
/* once revealed, hover needs to stay snappy */
.js .case[data-reveal].in .case-name .c{transition-delay:0s;}
.js .case[data-reveal].in .case-name a:hover .c,.js .case[data-reveal].in .case-name a:focus-visible .c{transform:translateY(-.08em);transition-delay:calc(var(--i) * 18ms);}

/* ---------- small screens ---------- */
@media (max-width:860px){
  .case-grid{grid-template-columns:1fr;}
  .case.rev .case-grid{grid-template-columns:1fr;}
  .case.rev .case-copy{order:0;}
  .case-media,.case.rev .case-media{padding:0 0 14% 12%;cursor:pointer;}
  .case.rev .phone{left:0;right:auto;transform:translate3d(0,var(--pp,0px),0) rotate(-3deg);}
  .case.rev .browser{box-shadow:0 1px 0 var(--ink),18px 22px 0 -1px var(--tint);}
  .phone{width:30%;padding:4px;border-radius:18px;}
  .phone img{border-radius:14px;}
  .browser-bar{height:28px;}
  .browser-bar span{font-size:10px;}
  .stamp{top:-16px;right:-4px;padding:10px 14px 9px;}
  .work-head{grid-template-columns:1fr;}
  .work-note{margin:clamp(20px,4vw,32px) 0 0;max-width:30ch;}
}
@media (max-width:480px){
  .case-facts div{grid-template-columns:1fr;gap:2px;}
  .work-title sup{display:none;}
}
@media (hover:none){
  .case-media{cursor:pointer;}
  .peek{display:none;}
}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
  .cue,.cue i::after,.case-live i{animation:none;}
  .js [data-reveal] *,.js [data-reveal] .case-meta::after{transition:none !important;}
  .shot .color,.phone img,.browser,.peek,.stamp{transition:none;}
  .ld-z{display:none;}
}
