/* ==========================================================================
   Arkadii Grebennikov — portfolio
   White paper, large type, nothing else.
   Switzer throughout (600 display / 400 text) · JetBrains Mono (labels)
   ========================================================================== */

/* ---------- fonts ---------- */
@font-face{font-family:Switzer;src:url(../fonts/switzer-400.woff2) format('woff2');font-weight:400;font-display:swap}
@font-face{font-family:Switzer;src:url(../fonts/switzer-500.woff2) format('woff2');font-weight:500;font-display:swap}
@font-face{font-family:Switzer;src:url(../fonts/switzer-600.woff2) format('woff2');font-weight:600;font-display:swap}
@font-face{font-family:JBMono;src:url(../fonts/mono-400.woff2) format('woff2');font-weight:400;font-display:swap}

/* ---------- tokens ---------- */
:root{
  --display:Switzer,-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  --text:Switzer,-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  --mono:JBMono,ui-monospace,"SF Mono",Menlo,monospace;

  --paper:#FFFFFF;
  --paper-2:#F5F4F2;
  --paper-3:#EDECE8;
  --ink:#0B0B0C;
  --ink-2:#5C5C63;          /* 6.6:1 on white */
  --ink-3:#8A8A91;          /* 3.2:1 — decorative / large only */
  --line:rgba(11,11,12,.14);
  --line-2:rgba(11,11,12,.30);

  --pad:clamp(20px,5vw,80px);
  --maxw:1560px;
  --gap:clamp(16px,2.4vw,36px);
  --sect:clamp(80px,11vw,168px);

  --ease:cubic-bezier(.16,1,.3,1);
  color-scheme:light;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--text);
  font-size:clamp(16px,1.02vw,18px);
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
img,video{display:block;max-width:100%}
a{color:inherit}
h1,h2,h3,h4{margin:0;font-weight:400}
p{margin:0}
ul{margin:0;padding:0;list-style:none}

::selection{background:var(--ink);color:var(--paper)}

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

.skip{
  position:fixed;top:8px;left:8px;z-index:100;
  padding:10px 16px;background:var(--ink);color:var(--paper);
  border-radius:2px;font:500 14px/1 var(--text);
  transform:translateY(-200%);transition:transform .2s var(--ease);
}
.skip:focus-visible{transform:none}
:focus-visible{outline:2px solid var(--ink);outline-offset:3px;border-radius:2px}

/* ---------- type scale ---------- */
.display{
  font-family:var(--display);font-weight:600;
  letter-spacing:-.035em;line-height:.96;
  text-wrap:balance;
}
/* 8.8vw keeps the longest hero line on one line at every width the shell allows.
   Above 375px the vw term governs and the shell-to-type ratio is constant, so the
   fit is width-independent. The 28px floor only matters below ~318px, where the
   longest line ("and everything it takes") needs 29.2px or less to stay unbroken.
   Measured against Switzer 600 at -.035em — re-measure if either changes. */
.d-xxl{font-size:clamp(28px,8.8vw,138px)}
.d-xl{font-size:clamp(38px,7vw,112px)}
.d-l{font-size:clamp(32px,5.4vw,92px)}
.d-m{font-size:clamp(24px,2.6vw,42px);letter-spacing:-.025em}

.lede{
  font-size:clamp(18px,1.55vw,27px);
  line-height:1.42;color:var(--ink-2);
  letter-spacing:-.012em;text-wrap:pretty;
}
.label{
  font-family:var(--mono);font-size:12px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-3);
}

.prose p+p{margin-top:1em}
.prose strong{font-weight:600;color:var(--ink)}
.prose{color:var(--ink-2);max-width:62ch}

/* ==========================================================================
   Header
   ========================================================================== */
.top{
  position:sticky;top:0;z-index:50;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  width:100%;max-width:var(--maxw);margin-inline:auto;
  padding:16px var(--pad);
  background:color-mix(in srgb,var(--paper) 82%,transparent);
  backdrop-filter:saturate(180%) blur(14px);
  -webkit-backdrop-filter:saturate(180%) blur(14px);
}
.top::after{
  content:"";position:absolute;left:var(--pad);right:var(--pad);bottom:0;height:1px;
  background:var(--line);opacity:0;transition:opacity .25s var(--ease);
}
.top.is-stuck::after{opacity:1}

.wordmark{
  text-decoration:none;font-family:var(--display);font-weight:600;
  font-size:clamp(15px,1.15vw,18px);letter-spacing:-.02em;line-height:1.1;
  display:flex;flex-direction:column;
}
.wordmark span{
  font-family:var(--mono);font-weight:400;font-size:11px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);
}

.contacts{display:flex;align-items:center;gap:clamp(4px,1vw,10px);flex-wrap:wrap;justify-content:flex-end}
.clink{
  display:inline-flex;align-items:center;gap:7px;
  padding:8px 12px;border-radius:999px;
  text-decoration:none;font-size:14px;font-weight:500;letter-spacing:-.01em;
  color:var(--ink);border:1px solid transparent;
  transition:background .2s var(--ease),border-color .2s var(--ease);
  white-space:nowrap;
}
.clink svg{width:15px;height:15px;flex:none}
.clink:hover{background:var(--paper-2)}
.clink.is-primary{border-color:var(--line-2)}
.clink.is-primary:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}
@media (max-width:860px){
  .clink span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .clink{padding:9px}
  .clink svg{width:17px;height:17px}
}

/* ==========================================================================
   Hero
   ========================================================================== */
.hero{
  padding-block:clamp(44px,7vw,110px) clamp(48px,7vw,104px);
  display:flex;flex-direction:column;justify-content:space-between;
}
@media (min-width:901px){.hero{min-height:min(84svh,760px)}}
.hero h1{max-width:none}
.hero .ln{display:block;overflow:hidden;padding-bottom:.16em;margin-bottom:-.16em}
.hero .ln i{display:block;font-style:normal;animation:rise 1.05s var(--ease) both;animation-delay:var(--d,0ms)}
@keyframes rise{from{transform:translateY(125%)}to{transform:none}}
@media (prefers-reduced-motion:reduce){.hero .ln i{animation:none}}

.hero-foot{
  margin-top:clamp(32px,4.5vw,72px);
  padding-top:clamp(24px,3vw,40px);border-top:1px solid var(--line);
}
.hero-foot .lede{max-width:74ch}

/* ==========================================================================
   Sections
   ========================================================================== */
.sect{padding-block:var(--sect)}
.sect+.sect{padding-top:0}

.sect-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:24px;
  padding-bottom:clamp(16px,2vw,28px);
  border-bottom:1px solid var(--ink);
  margin-bottom:clamp(24px,3vw,44px);
}
@media (max-width:600px){
  .sect-head{flex-direction:column;align-items:flex-start;gap:10px}
}
.sect-lede{max-width:58ch;margin-bottom:clamp(32px,4vw,64px)}

/* ---------- work grid ---------- */
.grid{display:grid;gap:clamp(32px,4vw,64px) var(--gap)}
.g-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g-2{grid-template-columns:repeat(2,minmax(0,1fr))}
@media (max-width:1020px){.g-3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:680px){.g-3,.g-2{grid-template-columns:1fr}}

.card{display:block;text-decoration:none}
/* one cover ratio for all eleven cards: covers are made for the slot,
   so the slot does not bend to the asset. Square also gives a screenshot
   a third more height than 4:3 at the same column width. */
.card .frame{
  position:relative;overflow:hidden;background:var(--paper-2);
  aspect-ratio:1/1;
}
.card .frame img,.card .frame video{
  width:100%;height:100%;object-fit:cover;
  transition:transform .7s var(--ease),filter .7s var(--ease);
}
.card:hover .frame img,.card:hover .frame video{transform:scale(1.035)}
/* a card that isn't a link yet: no zoom, no arrow, and a label that
   says so — always visible where there is no hover to reveal it */
.card.is-soon{cursor:default}
.card.is-soon:hover .frame img{transform:none}
.card.is-soon:hover .card-head{border-color:var(--line)}
.soon{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  background:color-mix(in srgb,var(--ink) 58%,transparent);
  color:var(--paper);font-family:var(--mono);font-size:12px;
  letter-spacing:.16em;text-transform:uppercase;
  opacity:0;transition:opacity .28s var(--ease);
}
.card.is-soon:hover .soon,.card.is-soon:focus-within .soon{opacity:1}
@media (hover:none){.soon{opacity:1}}
@media (prefers-reduced-motion:reduce){.soon{transition:none}}
/* a cover whose artwork must not be cropped: shown whole on a paper field */
.card .frame.is-plate{background:var(--paper-3);padding:clamp(16px,2.4vw,40px)}
.card .frame.is-plate img{object-fit:contain}

.card-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  margin-top:18px;padding-bottom:14px;
  border-bottom:1px solid var(--line);
  transition:border-color .3s var(--ease);
}
.card:hover .card-head{border-color:var(--ink)}
.card-title{
  font-family:var(--display);font-weight:600;letter-spacing:-.025em;
  font-size:clamp(22px,1.9vw,32px);line-height:1.05;
  text-wrap:balance;
}
.card-title .arw{display:inline-block;width:.5em;height:.5em;margin-left:.28em;vertical-align:baseline;transition:transform .35s var(--ease)}
.card:hover .arw{transform:translate(3px,-3px)}
.card-meta{font-family:var(--mono);font-size:12px;color:var(--ink-3);white-space:nowrap;text-align:right}
.card-note{margin-top:12px;color:var(--ink-2);font-size:15px;line-height:1.5;max-width:44ch}

/* an all-type card for the projects with no screenshot */
.mock{
  position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;
  align-items:flex-start;gap:10px;padding:clamp(18px,2vw,30px);background:var(--paper-3);
}
.bubble{
  max-width:76%;padding:10px 14px;border-radius:16px;background:var(--paper);
  font-size:clamp(12px,.95vw,15px);line-height:1.4;box-shadow:0 1px 2px rgba(11,11,12,.06);
}
.bubble.me{align-self:flex-end;background:var(--ink);color:var(--paper)}
.bubble .m{font-family:var(--mono);font-size:.82em;color:var(--ink-3);display:block;margin-top:4px}

/* ==========================================================================
   Case page
   ========================================================================== */
.case-hero{padding-block:clamp(36px,5vw,84px) clamp(28px,3.5vw,52px)}
.kicker{font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-bottom:clamp(16px,2vw,28px)}
.case-hero h1{max-width:18ch}
.case-sub{margin-top:clamp(20px,2.4vw,34px);max-width:52ch}

.strip{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;
  margin-top:clamp(32px,4vw,64px);
  background:var(--line);border-block:1px solid var(--line);
}
.strip.is-3{grid-template-columns:repeat(3,minmax(0,1fr))}
@media (max-width:760px){.strip,.strip.is-3{grid-template-columns:repeat(2,minmax(0,1fr))}}
.cell{background:var(--paper);padding:18px 20px 20px}
.cell p:first-child{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);margin-bottom:6px}
.cell p:last-child{font-size:clamp(15px,1.15vw,19px);font-weight:500;letter-spacing:-.015em;line-height:1.3}

/* body blocks */
.block{padding-block:clamp(40px,5.5vw,96px)}
.block>h2{
  font-family:var(--display);font-weight:600;letter-spacing:-.03em;
  font-size:clamp(26px,3.2vw,54px);line-height:1;max-width:20ch;
}
.block>h2+.prose{margin-top:clamp(18px,2vw,30px)}
.block>.prose+.media,.block>h2+.media,.block>.media+.media{margin-top:clamp(24px,3vw,48px)}

.two{
  display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.4fr);
  gap:var(--gap) clamp(24px,5vw,88px);align-items:start;
}
@media (max-width:900px){.two{grid-template-columns:1fr;gap:14px}}
.two>h2{
  font-family:var(--display);font-weight:600;letter-spacing:-.03em;
  font-size:clamp(22px,2.1vw,34px);line-height:1.02;
  position:sticky;top:96px;
}
@media (max-width:900px){.two>h2{position:static}}
.two .prose{font-size:clamp(17px,1.25vw,21px);line-height:1.55;max-width:60ch}
.two ul{display:grid;gap:14px;max-width:60ch}
.two li{position:relative;padding-left:26px;color:var(--ink-2);font-size:clamp(16px,1.15vw,19px);line-height:1.5}
.two li::before{content:"";position:absolute;left:0;top:.62em;width:12px;height:1px;background:var(--line-2)}
.two li strong{font-weight:600;color:var(--ink)}

/* media */
.media{position:relative;overflow:hidden;background:var(--paper-2)}
/* films carry a hairline; stills do not — a moving frame needs an edge
   against the paper, a screenshot brings its own */
.media:has(video),.media:has(.vimeo){border:1px solid rgba(11,11,12,.1)}
/* the first block after a section's copy keeps its distance */
.prose + .block{margin-top:clamp(24px,3vw,48px)}
.media img,.media video{width:100%;height:100%;object-fit:cover}
.r-21-9{aspect-ratio:21/9}
.r-16-9{aspect-ratio:16/9}
.r-16-10{aspect-ratio:16/10}
.r-4-3{aspect-ratio:4/3}
.r-3-4{aspect-ratio:3/4}
.r-1-1{aspect-ratio:1/1}
/* no fixed ratio: the image keeps its own proportions, centred on paper */
.media.is-free{display:flex;justify-content:center}
.media.is-free img{width:auto;max-width:100%;height:auto;object-fit:contain}

/* a device capture: height-bounded so a tall phone screen doesn't dominate,
   and never upscaled past its native width */
.media.is-shot{display:flex;justify-content:center;align-items:flex-start;padding:clamp(14px,2vw,28px)}
/* app screens: one uniform device-shaped box so a row of them lines up */
.media.is-phone{aspect-ratio:828/1792;background:var(--paper-2)}
.media.is-phone img{width:100%;height:100%;object-fit:cover;object-position:top center}
.media.is-shot img{width:auto;max-width:100%;height:auto;max-height:min(64vh,660px);object-fit:contain}

/* an in-layout slot for an image that does not exist yet.
   Sized like the real thing so it can be swapped 1:1. */
.needed{
  display:flex;flex-direction:column;justify-content:center;gap:.7em;
  padding:clamp(20px,3vw,44px);
  background:var(--paper-2);
  border:1px dashed var(--line-2);
  font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--ink-2);
  min-height:180px;
}
.needed b{
  font-weight:400;letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink);font-size:11px;
}
.needed i{font-style:normal;color:var(--ink-3)}
.media .needed{position:absolute;inset:0;border:none;min-height:0}
.media.has-needed{border:1px dashed var(--line-2);background:var(--paper-2)}

.pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap)}
.trio{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap)}
@media (max-width:760px){.pair,.trio{grid-template-columns:1fr}}

.caption{
  margin-top:12px;font-family:var(--mono);font-size:12px;line-height:1.5;
  color:var(--ink-3);max-width:56ch;
}

/* a long landing-page screenshot: a framed window you scroll inside */
/* click any grid image to see it whole */
.zoom{display:block;width:100%;padding:0;border:0;margin:0;background:none;cursor:zoom-in;font:inherit;color:inherit}
.zoom:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
.lbox{
  position:fixed;inset:0;z-index:90;display:flex;align-items:center;justify-content:center;
  padding:clamp(14px,4vw,56px);cursor:zoom-out;
  background:color-mix(in srgb,var(--ink) 90%,transparent);
}
.lbox img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;background:var(--paper)}
@media (prefers-reduced-motion:no-preference){.lbox{animation:fade .18s var(--ease)}}
@keyframes fade{from{opacity:0}to{opacity:1}}
/* two shots of one page, scrolled together — the taller one moves
   faster so both reach their end at the same moment */
/* full-bleed interstitial: escapes the shell, touches both edges */
/* TEMPORARY working slot — a rectangle standing in for artwork that is
   still being assembled. Must not ship: nothing here says anything. */
/* one screen, several states — tabs instead of a stack of near-identical shots */
.states{background:var(--ink);padding:8.5%}
/* a single shot on the same black field, without the tabs */
.media.on-ink{background:var(--ink);padding:8.5%}
.states-view{position:relative}
.states-view img,.states-view .slot{width:100%;height:auto;display:block}
.states-view [hidden]{display:none}
.states-tabs{
  display:flex;flex-wrap:wrap;gap:8px;
  margin-top:clamp(12px,1.6vw,20px);
}
.states-tabs button{
  appearance:none;cursor:pointer;white-space:nowrap;
  padding:9px 16px;border-radius:999px;
  border:1px solid rgba(255,255,255,.2);background:none;color:var(--paper);
  font:500 13px/1 var(--text);letter-spacing:-.01em;
  transition:background .18s var(--ease),color .18s var(--ease),border-color .18s var(--ease);
}
.states-tabs button:hover{border-color:var(--paper)}
.states-tabs button[aria-selected="true"]{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.states-tabs button:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
@media (prefers-reduced-motion:reduce){.states-tabs button{transition:none}}

.slot{
  aspect-ratio:2000/1200;background:var(--paper-2);border:1px dashed var(--line-2);
  display:flex;align-items:center;justify-content:center;padding:24px;
  font-family:var(--mono);font-size:12px;color:var(--ink-3);text-align:center;
}
.bleed{margin-block:clamp(48px,7vw,120px);margin-inline:0}
.bleed img{width:100%;height:auto;display:block}
.bleed figcaption{margin-top:0}
.dual{
  position:relative;aspect-ratio:2000/1200;overflow-y:auto;overscroll-behavior:auto;
  background:var(--ink);scrollbar-width:thin;
}
.dual::-webkit-scrollbar{width:6px}
.dual::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:99px}
.dual-view{
  position:sticky;top:0;overflow:hidden;
  display:flex;align-items:stretch;justify-content:center;
  gap:clamp(10px,1.6vw,30px);padding:8.5%;
}
.dual-col{flex:0 0 auto;overflow:hidden}
.dual-col img{display:block;width:100%;height:auto}
.dual-col.is-d{width:72%}
.dual-col.is-m{width:20%}
/* three or more columns of equal width */
.dual.is-many{aspect-ratio:2000/1250}
.dual.is-many .dual-view{gap:clamp(8px,1.4vw,26px)}
.dual.is-many .dual-col{flex:1 1 0;min-width:0;width:auto}
@media (max-width:760px){.dual-col.is-m{display:none}.dual-col.is-d{width:100%}}
.pageshot{
  position:relative;background:var(--paper-2);
  /* overscroll stays 'auto': once the shot bottoms out, scrolling chains
     back to the page instead of trapping the wheel inside it */
  height:min(78vh,720px);overflow:auto;overscroll-behavior:auto;
  scrollbar-width:thin;
}
.pageshot img{width:100%;height:auto}
.pageshot::-webkit-scrollbar{width:6px}
.pageshot::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:99px}
.pageshot-note{
  position:sticky;bottom:0;left:0;display:block;
  padding:7px 12px;background:var(--ink);color:var(--paper);
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  width:max-content;margin:0 0 0 auto;pointer-events:none;
}

/* ---- a click-to-play facade for an embedded film -----------------------
   Nothing third-party loads until the visitor asks for it: until the click
   this is a poster and a button, and the page stays dependency-free. */
.vimeo{
  position:absolute;inset:0;display:block;width:100%;height:100%;
  padding:0;border:0;margin:0;cursor:pointer;background:var(--ink);
  overflow:hidden;font:inherit;color:var(--paper);
}
.vimeo img{
  width:100%;height:100%;object-fit:cover;
  transition:transform .7s var(--ease),opacity .35s var(--ease);
}
.vimeo:hover img,.vimeo:focus-visible img{transform:scale(1.035);opacity:.72}
.vimeo-play{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:clamp(52px,5.2vw,76px);aspect-ratio:1;border-radius:50%;
  background:color-mix(in srgb,var(--paper) 92%,transparent);
  display:flex;align-items:center;justify-content:center;
  transition:transform .35s var(--ease),background .25s var(--ease);
}
.vimeo:hover .vimeo-play{transform:translate(-50%,-50%) scale(1.08);background:var(--paper)}
.vimeo-play svg{width:34%;height:34%;fill:var(--ink);margin-left:8%}
.vimeo-dur{
  position:absolute;right:12px;bottom:12px;
  padding:4px 9px;border-radius:4px;
  background:color-mix(in srgb,var(--ink) 72%,transparent);
  font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--paper);
}
.media iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

/* a numbered process: steps in a row, hairlines between */
.flow{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:1px;background:var(--line);
  border-block:1px solid var(--line);counter-reset:step;
  list-style:none;padding:0;margin:0;
}
.flow.is-4{grid-template-columns:repeat(4,minmax(0,1fr))}
@media (max-width:900px){.flow,.flow.is-4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:520px){.flow,.flow.is-4{grid-template-columns:1fr}}
.flow li{
  background:var(--paper);padding:22px 22px 26px;
  display:flex;flex-direction:column;gap:10px;
}
.flow b{
  font-family:var(--display);font-weight:600;letter-spacing:-.025em;
  font-size:clamp(19px,1.7vw,27px);line-height:1;
}
.flow span{color:var(--ink-2);font-size:15px;line-height:1.45}

/* ---- a phone, drawn rather than photographed ----------------------------
   Everything below scales off .phone's own font-size, so the whole device
   is sized by setting its height and nothing else needs touching.        */
/* the device is height-driven, so the frame gets a height rather than a ratio */
.media.is-stage{height:min(78vh,720px)}
.stage{
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
}
/* .phone is a size container, so everything inside is measured in cqw —
   1cqw = 1% of the device's own width. Set the height, and the whole
   device redraws in proportion, at any size, in any layout. */
.phone{
  position:relative;
  height:min(90%,620px);aspect-ratio:9/19.5;
  container-type:size;
  background:var(--ink);
  /* two-value radius: 14% of width horizontally, the same distance vertically */
  border-radius:14% / 6.46%;
  padding:1.5%;
  box-shadow:0 8cqw 16cqw -6cqw rgba(11,11,12,.32);
}
/* side buttons: power on the right, volume pair on the left */
.phone::before,.phone::after{
  content:"";position:absolute;width:1cqw;background:var(--ink);
  filter:brightness(1.9);border-radius:1cqw;
}
.phone::before{right:-.7cqw;top:27%;height:12%}
.phone::after{left:-.7cqw;top:22%;height:7%;box-shadow:0 9cqw 0 0 currentColor}

.phone-screen{
  position:relative;height:100%;overflow:hidden;
  background:var(--paper);
  border-radius:12.8% / 5.9%;
  display:flex;flex-direction:column;
  font-size:4.3cqw;
}
/* dynamic island */
.phone-screen::before{
  content:"";position:absolute;top:2.9cqw;left:50%;transform:translateX(-50%);
  width:31.5cqw;height:9.4cqw;background:var(--ink);border-radius:9.4cqw;z-index:3;
}
/* home indicator */
.phone-screen::after{
  content:"";position:absolute;bottom:2.2cqw;left:50%;transform:translateX(-50%);
  width:35.5cqw;height:1.2cqw;background:var(--ink);opacity:.3;border-radius:1cqw;
}

/* status bar — the thing that actually makes it read as a phone */
.tg-status{
  flex:none;display:flex;align-items:center;justify-content:space-between;
  height:12.2cqw;padding:2.6cqw 7cqw 0;
  font-size:.7em;font-weight:600;letter-spacing:-.01em;
}
.tg-status svg{height:.85em;width:auto;display:block}
.tg-status .icons{display:flex;align-items:center;gap:1.4cqw}

.tg-top{
  display:flex;align-items:center;gap:.9em;
  padding:.4em 1em .7em;border-bottom:1px solid var(--line);
  flex:none;
}
.tg-av{
  width:3.2em;height:3.2em;border-radius:50%;flex:none;
  background:var(--ink);color:var(--paper);
  display:flex;align-items:center;justify-content:center;
  font-weight:600;font-size:.9em;letter-spacing:-.02em;
}
.tg-name{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.tg-name b{font-weight:600;font-size:1em;letter-spacing:-.02em}
.tg-name i{font-style:normal;font-family:var(--mono);font-size:.72em;color:var(--ink-3)}

/* a short conversation sits at the bottom of the thread, as it really would */
.tg-body{
  flex:1;display:flex;flex-direction:column;align-items:flex-start;
  justify-content:flex-end;gap:.45em;padding:1em .6em;overflow:hidden;
}
.msg{
  max-width:86%;padding:.5em .75em;border-radius:1.1em;
  font-size:1em;line-height:1.35;
}
.msg.in{background:var(--paper-3);border-bottom-left-radius:.3em}
.msg.out{align-self:flex-end;background:var(--ink);color:var(--paper);border-bottom-right-radius:.3em}
.msg .tot{
  display:block;margin-top:.5em;padding-top:.5em;
  border-top:1px solid var(--line);
  font-family:var(--mono);font-size:.76em;color:var(--ink-2);
}
/* a Telegram inline-keyboard button: full width under the bot's message */
.tg-btn{
  width:86%;text-align:center;padding:.55em 1em;border-radius:.7em;
  background:var(--paper-3);border:1px solid var(--line);
  font-size:.95em;font-weight:500;
}
/* a date divider, and a two-up inline keyboard */
.tg-day{
  align-self:center;margin:.6em 0;
  font-family:var(--mono);font-size:1em;color:var(--ink-3);
}
.tg-btns{display:flex;gap:.6em;width:82%}
.tg-btns span{
  flex:1;text-align:center;padding:.95em .6em;border-radius:1em;
  background:var(--paper-3);border:1px solid var(--line);
  font-size:1.3em;font-weight:500;
}
.tg-input{
  flex:none;margin:0 .6em 6cqw;padding:.5em .9em;
  border:1px solid var(--line);border-radius:1.2em;
  font-size:1em;color:var(--ink-3);
}

/* results */
.results{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap) clamp(24px,4vw,64px);
  padding-block:clamp(40px,5vw,88px);
  border-top:1px solid var(--ink);
}
.results.is-2{grid-template-columns:repeat(2,minmax(0,1fr))}
@media (max-width:760px){.results,.results.is-2{grid-template-columns:1fr;gap:32px}}
.num{
  font-family:var(--display);font-weight:600;letter-spacing:-.04em;
  font-size:clamp(44px,6vw,104px);line-height:.86;
}
.results p:last-child{margin-top:14px;color:var(--ink-2);font-size:16px;line-height:1.45;max-width:30ch}

/* crosslink + next */
.crosslink{
  display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;
  padding:clamp(22px,2.6vw,38px);background:var(--paper-2);text-decoration:none;
  transition:background .3s var(--ease);
}
.crosslink:hover{background:var(--paper-3)}
.crosslink h4{font-family:var(--display);font-weight:600;font-size:clamp(19px,1.7vw,28px);letter-spacing:-.02em;line-height:1.1}
.crosslink p{margin-top:8px;color:var(--ink-2);font-size:15px;max-width:52ch}
.pill{
  display:inline-flex;align-items:center;gap:8px;white-space:nowrap;text-decoration:none;
  padding:11px 18px;border:1px solid var(--line-2);border-radius:999px;
  font-size:14px;font-weight:500;
  transition:background .2s var(--ease),color .2s var(--ease),border-color .2s var(--ease);
}
.pill svg{width:14px;height:14px}
.crosslink:hover .pill{background:var(--ink);color:var(--paper);border-color:var(--ink)}

.nextnav{
  display:flex;align-items:baseline;justify-content:space-between;gap:20px;flex-wrap:wrap;
  padding-block:clamp(40px,5vw,80px);border-top:1px solid var(--ink);
}
.nextnav a{
  text-decoration:none;display:inline-flex;align-items:center;gap:.3em;
  font-family:var(--display);font-weight:600;letter-spacing:-.03em;
  font-size:clamp(30px,4.4vw,72px);line-height:1;
}
.nextnav a svg{width:.42em;height:.42em;transition:transform .35s var(--ease)}
.nextnav a:hover svg{transform:translateX(6px)}

/* ==========================================================================
   Contact + footer
   ========================================================================== */
.contact{padding-block:clamp(64px,8vw,140px)}
.contact .label{display:block;margin-bottom:clamp(20px,2.4vw,36px)}
.mailto{
  display:inline-block;text-decoration:none;
  font-family:var(--display);font-weight:600;letter-spacing:-.04em;line-height:.95;
  font-size:clamp(30px,6.4vw,104px);
  background-image:linear-gradient(var(--ink),var(--ink));
  background-size:0% 2px;background-position:0 100%;background-repeat:no-repeat;
  transition:background-size .45s var(--ease);
  word-break:break-word;
}
.mailto:hover{background-size:100% 2px}

/* try-it banner. One link, one place — swap the href when it leaves beta. */
.tryout{
  display:flex;align-items:center;justify-content:space-between;
  gap:clamp(18px,3vw,44px);flex-wrap:wrap;
  margin-block:clamp(44px,6.5vw,104px);
  padding:clamp(26px,3.6vw,48px) clamp(24px,3.4vw,48px);
  background:var(--ink);color:var(--paper);
}
.tryout p{
  color:rgba(255,255,255,.78);max-width:40ch;
  font-size:clamp(18px,1.5vw,26px);line-height:1.35;letter-spacing:-.012em;
}
.tryout ::selection{background:var(--paper);color:var(--ink)}
.tryout :focus-visible{outline-color:var(--paper)}
.tryout .pill{
  background:var(--paper);color:var(--ink);border-color:var(--paper);
  padding:15px 26px;font-size:15px;
}
.tryout .pill:hover{background:transparent;color:var(--paper)}

.contact-rows{
  display:flex;flex-wrap:wrap;gap:10px;
  margin-top:clamp(28px,3.5vw,52px);
}
.contact-rows .pill:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.contact-meta{margin-top:clamp(28px,3.5vw,48px);color:var(--ink-2);max-width:48ch}

/* ==========================================================================
   The end of every page: contact and colophon on one inverted field.
   No rules, no dividers — the colour change is the separation.
   ========================================================================== */
.end{background:var(--ink);color:var(--paper)}
.end .label{color:rgba(255,255,255,.5)}
.end .mailto{background-image:linear-gradient(var(--paper),var(--paper))}
.end .contact-meta{color:rgba(255,255,255,.62)}
.end .pill{border-color:rgba(255,255,255,.38)}
.end .pill:hover{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.end ::selection{background:var(--paper);color:var(--ink)}
.end :focus-visible{outline-color:var(--paper)}

.endbar{
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding-bottom:clamp(28px,3.4vw,52px);
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  color:rgba(255,255,255,.45);
}
.endbar a{text-decoration:none}
.endbar a:hover{color:var(--paper)}

/* ==========================================================================
   Reveal
   ========================================================================== */
[data-reveal]{opacity:0;transform:translateY(20px);transition:opacity .8s var(--ease) var(--d,0ms),transform .8s var(--ease) var(--d,0ms)}
[data-reveal].in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  [data-reveal]{opacity:1;transform:none;transition:none}
  .card .frame img,.card .frame video{transition:none}
}

@media print{
  .top,.skip{display:none}
  body{font-size:11pt}
}
