
:root{--bg:#0a0c11;--panel:#121621;--line:#222a3b;--text:#dbe1ee;--dim:#8590a8;--cyan:#22d3ee;--violet:#a78bfa;--amber:#fbbf24;
--mono:'JetBrains Mono',ui-monospace,Consolas,monospace;--head:'Space Grotesk',system-ui,sans-serif}
*{box-sizing:border-box}html{color-scheme:dark}
body{margin:0;background:var(--bg);color:var(--text);font:16px/1.7 var(--mono);
background-image:radial-gradient(800px 420px at 90% -8%,rgba(167,139,250,.13),transparent),radial-gradient(700px 420px at -8% 6%,rgba(34,211,238,.09),transparent);background-attachment:fixed}
a{color:var(--cyan);text-decoration:none;border-bottom:1px dashed rgba(34,211,238,.4)}a:hover{border-bottom-style:solid}
.wrap{max-width:760px;margin:0 auto;padding:0 20px}
header.site{padding:34px 0 22px;border-bottom:1px solid var(--line)}
header.site a.brand{border:0;font:700 26px var(--head);background:linear-gradient(90deg,var(--cyan),var(--violet));-webkit-background-clip:text;background-clip:text;color:transparent}
header.site p{margin:6px 0 0;color:var(--dim);font-size:14px}
header.site nav{margin-top:12px;font-size:13px;display:flex;gap:18px;flex-wrap:wrap}header.site nav a{border:0;color:var(--dim)}header.site nav a:hover{color:var(--cyan)}
main{padding:34px 0 50px}
.entry{padding:22px 0;border-bottom:1px solid var(--line)}
.entry h2{font:700 24px/1.25 var(--head);margin:0 0 6px}.entry h2 a{border:0;color:var(--text)}.entry h2 a:hover{color:var(--cyan)}
.meta{color:var(--dim);font-size:13px}.meta .tag{color:var(--violet);margin-left:10px}
.entry p.sum{margin:10px 0 0;color:#b8c1d4;font-size:15px}
article h1{font:700 clamp(28px,6vw,40px)/1.15 var(--head);margin:0 0 10px;letter-spacing:-.01em}
article .meta{margin-bottom:28px}
article h2{font:700 22px var(--head);margin:34px 0 8px}
article h3{font:700 18px var(--head);margin:26px 0 6px}
article p,article li{color:#cbd3e3}
article blockquote{margin:20px 0;padding:2px 0 2px 18px;border-left:3px solid var(--violet);color:#d3daea}
article code{background:#171c29;border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-size:.9em;color:#c9d6f5}
article pre{background:#080a0f;border:1px solid var(--line);border-radius:10px;padding:14px 16px;overflow:auto;line-height:1.55;font-size:13.5px}
article pre code{background:none;border:0;padding:0;color:#c9d2e6}
article table{border-collapse:collapse;margin:18px 0;font-size:14px;display:block;overflow:auto}
article th,article td{border:1px solid var(--line);padding:6px 12px;text-align:left}article th{background:var(--panel)}
.pn{display:flex;justify-content:space-between;gap:16px;margin-top:44px;padding-top:18px;border-top:1px solid var(--line);font-size:14px}
.pn a{border:0}.pn span{display:block;color:var(--dim);font-size:12px}
.correction{margin-top:30px;padding:12px 16px;border:1px dashed var(--amber);border-radius:10px;color:var(--amber);font-size:14px}
footer.site{padding:26px 0 50px;border-top:1px solid var(--line);color:var(--dim);font-size:13px}
@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* "Night zine": the shared look for every Velos site. Injected after each page's own CSS by sites/apply_zine.py
   (and appended to the blog's stylesheet by blog/build.py). Dark on purpose; flat colours, hard shadows, sticker tilt,
   a dot grid instead of glow blobs. Re-themes the existing pages through the CSS variables they already use. */
:root{
  --bg:#0f0d0b; --panel:#171410; --line:#3a332a; --text:#ebe4d6; --dim:#a39a88;
  --cyan:#7ee8d1; --violet:#c9a3ff; --amber:#ffb454; --pink:#ff9fb2; --green:#b5e48c; --red:#ff7a6b;
  --ink:#ebe4d6; --hard:#000;
  --head:'Syne','Space Grotesk',system-ui,sans-serif; --mono:'JetBrains Mono',ui-monospace,Consolas,monospace;
}
html{color-scheme:dark}
body{
  background-color:var(--bg)!important;
  background-image:radial-gradient(rgba(235,228,214,.075) 1px,transparent 1.2px)!important;
  background-size:22px 22px!important; background-attachment:fixed!important;
  color:var(--text)!important;
}
body::after{ /* film grain, very faint */
  content:"";position:fixed;inset:0;pointer-events:none;z-index:50;opacity:.055;mix-blend-mode:screen;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
}
::selection{background:var(--amber);color:#160e02}

/* headings: chunky, lowercase, no gradient text, a marker bar instead of a glow */
h1,h1 span,header.site a.brand,.brand,nav b{
  font-family:var(--head)!important;font-weight:800!important;letter-spacing:-.035em!important;text-transform:lowercase;
  background:none!important;-webkit-text-fill-color:currentColor!important;color:var(--text)!important;
}
h1::after{content:"";display:block;width:1.6em;height:.14em;margin-top:.12em;background:var(--amber);transform:skewX(-24deg)}
h2{font-family:var(--head)!important;font-weight:800!important;letter-spacing:-.02em!important;text-transform:lowercase}
h2::before{content:""!important}
h3,.card h3,.card b,.stat b{font-family:var(--head)!important;font-weight:700!important}
.stat b{color:var(--amber)!important}
.sub,.lede{color:var(--dim)}

/* boxes: hard border, offset shadow, tiny tilt that straightens on hover */
.card,.stat,.bubble,.msg,.fact,.panel,article pre,.callout,.stat,pre{
  background:var(--panel)!important;border:2px solid var(--ink)!important;border-radius:3px!important;
  box-shadow:6px 6px 0 var(--hard)!important;
}
.card,.stat{transition:transform .15s ease,box-shadow .15s ease}
.grid>.card:nth-child(3n+1),.grid>.stat:nth-child(3n+1){transform:rotate(-.5deg)}
.grid>.card:nth-child(3n+2),.grid>.stat:nth-child(3n+2){transform:rotate(.35deg)}
.card:hover,.stat:hover,a.card:hover{transform:translate(-2px,-3px) rotate(0)!important;box-shadow:9px 9px 0 var(--amber)!important;border-color:var(--ink)!important}
.bubble{border-radius:3px!important}
.me{color:var(--cyan)!important}.bot{border-left:6px solid var(--violet)!important}
.timeline li::before{background:var(--cyan)!important;border-radius:0!important;transform:rotate(45deg)}
.timeline li.bad::before,.tl li.fix::before{background:var(--amber)!important}
.tl li::before{border-radius:0!important;transform:rotate(45deg)}

/* stickers: tags, chips, pills */
.tag,.chip,.plain-chip{
  border:2px solid var(--ink)!important;border-radius:2px!important;background:var(--amber)!important;color:#160e02!important;
  transform:rotate(-1.5deg);font-weight:500;box-shadow:2px 2px 0 var(--hard);
}
.chip:nth-child(even),.tag:nth-child(even){transform:rotate(1.2deg);background:var(--violet)!important}
.chip.on{background:var(--cyan)!important;color:#04140f!important}
.chip b{color:#160e02!important}
.meta .tag{background:none!important;border:0!important;box-shadow:none;color:var(--violet)!important;transform:none;padding:0}

/* buttons */
button,.btn{
  background:var(--panel)!important;color:var(--text)!important;border:2px solid var(--ink)!important;border-radius:2px!important;
  box-shadow:3px 3px 0 var(--hard)!important;font-family:var(--mono);transition:transform .1s,box-shadow .1s;
}
button:hover:not(:disabled){transform:translate(-1px,-1px);box-shadow:5px 5px 0 var(--amber)!important;color:var(--text)!important;border-color:var(--ink)!important}
button:active:not(:disabled){transform:translate(2px,2px);box-shadow:1px 1px 0 var(--hard)!important}
#go{background:var(--cyan)!important;color:#04140f!important}

/* links: highlighter effect */
a{color:var(--cyan);border-bottom:2px solid rgba(126,232,209,.45)!important;text-decoration:none}
a:hover{background:var(--cyan);color:#0b0906!important;border-bottom-color:var(--cyan)!important}
a.card,a.card:hover,nav a,.pn a,.entry h2 a,header.site a.brand,.wrap a.card{border-bottom:0!important}
nav a:hover,.entry h2 a:hover,.pn a:hover{background:var(--amber);color:#160e02!important}
a.card:hover{background:var(--panel)!important;color:var(--text)!important}

/* inputs */
input[type=search],input[type=text],textarea{
  background:var(--panel)!important;color:var(--text)!important;border:2px solid var(--ink)!important;border-radius:2px!important;
  box-shadow:4px 4px 0 var(--hard);
}
input:focus,textarea:focus{outline:3px solid var(--amber)!important;outline-offset:2px}
input[type=range]{accent-color:var(--amber)}
input[type=checkbox]{accent-color:var(--amber)}

/* bars, code, quotes, tables, footers */
.bar{background:#241f18!important;border-radius:0!important;border:2px solid var(--ink);height:12px!important}
.bar i{background:repeating-linear-gradient(135deg,var(--amber) 0 8px,#e39a3a 8px 16px)!important}
code{background:#221d16!important;border:1px solid var(--line)!important;border-radius:2px!important;color:#ffdca8!important}
article pre code,pre code{background:none!important;border:0!important;color:var(--text)!important}
blockquote,article blockquote,.quote{border-left:6px solid var(--violet)!important;background:rgba(201,163,255,.06);padding-left:16px!important}
mark{background:var(--amber)!important;color:#160e02!important;border-radius:0!important;padding:0 2px}
th{background:#221d16!important}
.correction{border:2px dashed var(--amber)!important;border-radius:2px!important;color:var(--amber)!important}
footer,footer.site{border-top:2px dashed var(--line)!important;color:var(--dim)!important}
nav,header.site{background:rgba(15,13,11,.86)!important;border-bottom:2px solid var(--ink)!important;backdrop-filter:blur(6px)}
header.site nav{background:none!important;border-bottom:0!important;backdrop-filter:none}   /* the blog's nav sits inside its header: one line, not two */
.desc,.ex p,.sub,.lede,p{overflow-wrap:anywhere}
.dot.ok{background:var(--green)!important}.dot.no{background:var(--red)!important}
.legend i{border-radius:0!important;transform:rotate(45deg)}
.entry{border-bottom:2px dashed var(--line)!important}
.heart{color:var(--pink)!important}
canvas{border:2px solid var(--ink);background:#120f0c}

@media (prefers-reduced-motion:reduce){
  .card,.stat,button,.grid>.card,.grid>.stat{transition:none;transform:none!important}
}
@media (max-width:560px){
  .card,.stat,.bubble,.msg,.fact,pre{box-shadow:4px 4px 0 var(--hard)!important}
  .grid>.card,.grid>.stat{transform:none}
}
