:root{--bg: #f2f3f5;--ink: #17181c;--muted: #5a5d66;--panel: #fff;--acc: #d9632b;--bd: #e3b72f;--edge: rgba(23, 24, 28, .18);color-scheme:light;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg: #17181c;--ink: #ececea;--muted: #9a9ca6;--panel: #1f2026;--acc: #f6b26b;--bd: #ffe599;--edge: rgba(236, 236, 234, .2);color-scheme:dark}}:root[data-theme=dark]{--bg: #17181c;--ink: #ececea;--muted: #9a9ca6;--panel: #1f2026;--acc: #f6b26b;--bd: #ffe599;--edge: rgba(236, 236, 234, .2);color-scheme:dark}*{box-sizing:border-box}html{scroll-padding-top:calc(env(safe-area-inset-top,0px) + 70px);scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:400 1.05rem/1.65 Instrument Sans,system-ui,sans-serif;overflow-x:hidden}#gl{position:fixed;inset:0;width:100%;height:100%;z-index:0}h1,h2,h3{font-family:Bricolage Grotesque,system-ui,sans-serif;margin:0;line-height:1;letter-spacing:-.02em}a{color:inherit}:focus-visible{outline:2px solid var(--acc);outline-offset:3px}#ruler{position:fixed;left:0;top:0;bottom:0;width:14px;z-index:5;border-right:1px solid var(--edge);opacity:.6;background:repeating-linear-gradient(to bottom,var(--muted) 0 1px,transparent 1px 8px) right top / 6px 100% no-repeat,repeating-linear-gradient(to bottom,var(--muted) 0 1px,transparent 1px 40px) right top / 14px 100% no-repeat}header{position:fixed;top:0;left:14px;right:0;z-index:20;display:flex;justify-content:space-between;align-items:center;padding:calc(env(safe-area-inset-top,0px) + 12px) clamp(16px,4vw,48px) 12px;background:var(--bg);border-bottom:1px solid var(--edge)}header>a{text-decoration:none;color:inherit}header b{font:800 1.15rem Bricolage Grotesque,sans-serif}nav{display:flex;gap:clamp(12px,2.4vw,26px);align-items:center;font-size:.95rem}nav a{text-decoration:none;color:var(--muted)}nav a:hover{color:var(--ink)}.tg{border:1px solid var(--ink);background:none;color:var(--ink);padding:3px 11px;font:inherit;font-size:.85rem;cursor:pointer}main{position:relative;z-index:1;pointer-events:none}main a,main button,.panel,.card{pointer-events:auto}section{min-height:100svh;padding:clamp(86px,12vh,130px) clamp(28px,5vw,64px) clamp(70px,10vh,110px);display:flex;align-items:center}.wrap{max-width:1100px;width:100%;margin:0 auto}.half{width:min(540px,100%)}.r{margin-left:auto}#hero h1{font-size:clamp(3.8rem,11.5vw,9rem);font-weight:800;font-variation-settings:"opsz" 96}#hero p.lead{max-width:30rem;font-size:1.25rem;margin:1.4rem 0 2rem}.btns{display:flex;gap:14px;flex-wrap:wrap}.btn{display:inline-block;padding:12px 22px;border:2px solid var(--ink);text-decoration:none;font-weight:500;background:var(--bg);transition:background .2s,color .2s,transform .15s ease-out}.btn.pri{background:var(--acc);border-color:var(--acc);color:#17181c}.btn:hover{background:var(--ink);color:var(--bg);border-color:var(--ink)}.hint{margin-top:2.2rem;color:var(--muted);font-size:.95rem;border-left:3px solid var(--acc);padding-left:12px;max-width:24rem}.panel,.card{background:var(--panel);border:2px solid var(--bd);box-shadow:inset 0 0 0 14px #93c47d33,0 0 0 14px #f6b26b33;transition:box-shadow .25s;padding:clamp(30px,4vw,46px)}.panel:hover,.card:hover{box-shadow:inset 0 0 0 14px #93c47d61,0 0 0 14px #f6b26b61}h2{font-size:clamp(2.1rem,5vw,3.4rem);font-weight:800;margin-bottom:1.3rem}.panel p{margin:0 0 1rem}.stats div{border-top:1px solid var(--edge);padding:11px 0;display:flex;justify-content:space-between;gap:12px}.stats div:last-child{border-bottom:1px solid var(--edge)}.stats b{font:800 1.5rem Bricolage Grotesque,sans-serif}.stats span{color:var(--muted);align-self:center}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:34px}#projects .wrap{max-width:1280px}#projects .grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:40px}.card{padding:34px 30px}.card h3{font-size:1.4rem;font-weight:700;margin-bottom:.6rem}.card p{margin:0 0 1rem;color:var(--muted);font-size:.97rem}.metric{font:800 2.1rem Bricolage Grotesque,sans-serif;color:var(--acc);line-height:1;margin-bottom:.8rem}.tags,.sk{display:flex;flex-wrap:wrap;gap:6px;padding:0;margin:0;list-style:none}.tags li,.sk li{border:1px solid var(--edge);padding:2px 10px;font-size:.88rem}.sk{gap:8px}.sk li{padding:4px 12px;font-size:1rem}.tl{list-style:none;margin:0;padding:0 0 0 22px;border-left:2px solid var(--ink)}.tl li{position:relative;padding:0 0 24px 12px}.tl li:before{content:"";position:absolute;left:-30px;top:8px;width:12px;height:12px;background:var(--acc)}.tl time{font:500 .85rem IBM Plex Mono,monospace;color:var(--acc)}.tl h3{font-size:1.2rem;margin:2px 0 4px;font-weight:700}.tl p{margin:0;color:var(--muted)}a.big{display:inline-block;max-width:100%;font:800 clamp(.95rem,2.6vw,1.4rem) "Bricolage Grotesque",sans-serif;text-decoration:none;border-bottom:3px solid var(--acc);overflow-wrap:anywhere}.links{display:flex;gap:20px;flex-wrap:wrap;margin-top:1.6rem}#hud{position:fixed;left:14px;right:0;bottom:0;z-index:20;display:flex;justify-content:space-between;gap:12px;padding:8px clamp(16px,4vw,48px) calc(env(safe-area-inset-bottom,0px) + 8px);background:var(--bg);border-top:1px solid var(--edge);font:400 .78rem IBM Plex Mono,monospace;color:var(--muted)}#crumb b{color:var(--acc);font-weight:500}#tip{position:fixed;left:0;top:0;z-index:40;display:none;pointer-events:none;background:#17181c;color:#ececea;font:400 .78rem IBM Plex Mono,monospace;padding:5px 9px;border-left:3px solid #6fa8dc}#tip b{color:#f6b26b;font-weight:500}#load{position:fixed;inset:0;z-index:100;background:#17181c;color:#ececea;display:flex;align-items:center;justify-content:center;font:400 .95rem IBM Plex Mono,monospace;transition:opacity .7s,visibility .7s}#load.done{opacity:0;visibility:hidden}#llog div{padding:2px 0}#llog div:before{content:"> ";color:#f6b26b}footer{position:relative;z-index:1;text-align:center;padding:20px 16px 70px;color:var(--muted);font-size:.9rem}.ov{position:fixed;display:none;pointer-events:none;z-index:45;box-sizing:border-box;border:0 solid}.ov.m{border-color:#f6b26b8c}.ov.b{border-color:#ffe599b3}.ov.p{border-color:#93c47d8c}.ov.c{background:#6fa8dc8c}body.inspecting main *{pointer-events:auto}body.inspecting{cursor:crosshair}#insp[aria-pressed=true]{background:var(--ink);color:var(--bg)}#tip2{position:fixed;left:0;top:0;z-index:46;display:none;pointer-events:none;background:#17181c;color:#ececea;font:400 .78rem/1.5 IBM Plex Mono,monospace;padding:6px 10px;border-left:3px solid #6fa8dc}#tip2 b{color:#f6b26b;font-weight:500}#term{position:fixed;left:50%;bottom:54px;transform:translate(-50%);width:min(680px,calc(100% - 28px));z-index:60;background:#17181c;color:#ececea;border:2px solid #ffe599;box-shadow:0 0 0 12px #f6b26b40;font:400 .85rem/1.5 IBM Plex Mono,monospace;padding:12px 14px}#term[hidden]{display:none}#tlog{max-height:34vh;overflow:auto;white-space:pre-wrap;margin-bottom:6px}#tlog .cmd{color:#93c47d}#tlog .dim{color:#9a9ca6}.tin{display:flex;gap:8px}.tin span{color:#f6b26b}.tin input{flex:1;min-width:0;background:none;border:0;color:inherit;font:inherit;outline:0}@media(max-width:760px){nav a:not(.tg){display:none}#hero{align-items:flex-end}.r{margin-left:0}#ruler{display:none}header,#hud{left:0}#projects .grid{grid-template-columns:1fr}}@media(min-width:761px)and (max-width:1024px){#projects .grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.skip-link{position:absolute;left:-9999px;top:0;z-index:1000;padding:.75rem 1.25rem;background:var(--ink);color:var(--bg);font-weight:500;text-decoration:none}.skip-link:focus{left:1rem;top:1rem}
