@font-face{font-family:Tilt Neon;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/tilt-neon-latin-400-normal.DUo0bAXn.woff2)format("woff2"),url(/_astro/tilt-neon-latin-400-normal.13Rx6b2L.woff)format("woff")}@font-face{font-family:Sacramento;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/sacramento-latin-400-normal.mRAQrhvZ.woff2)format("woff2"),url(/_astro/sacramento-latin-400-normal.D-mHOmJi.woff)format("woff")}:root{--bg:#0f0b0d;--bg-2:#160f13;--card:#1a1417;--line:#2c2226;--text:#efe6da;--dim:#a8998c;--amber:#e8ab3f;--paper:#f2ede3;--paper-ink:#2a2340;--paper-dim:#5a5070;--indigo:#2e3192;--pink:#ff48b0;--violet:#765ba7;--teal:#00838a;--orange:#ff6c2f;--blue:#0078bf;--yellow:#ffe800;--neon:#ff6ec7;--neon-soft:#ff6ec759;--neon-cyan:#8be9ff;--serif:"New York", "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--neon-font:"Tilt Neon", var(--sans);--script-font:"Sacramento", cursive;color-scheme:dark}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--text);font:16px/1.6 var(--sans);margin:0}img,svg,canvas{max-width:100%;display:block}a{color:inherit}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}:focus{outline:none}:focus-visible{outline:2px solid var(--neon);outline-offset:3px;box-shadow:0 0 0 5px var(--neon-soft), 0 0 22px var(--neon);border-radius:6px}.skip{z-index:100;background:var(--card);color:var(--text);border:1px solid var(--neon);border-radius:8px;padding:8px 14px;text-decoration:none;position:absolute;top:-60px;left:12px}.skip:focus-visible{top:12px}.neon{font-family:var(--neon-font);color:#ffe9f6;text-shadow:0 0 2px #fff, 0 0 8px var(--neon), 0 0 20px var(--neon), 0 0 42px #ff48b08c}.neon.cyan{color:#e8fbff;text-shadow:0 0 2px #fff, 0 0 8px var(--neon-cyan), 0 0 20px var(--neon-cyan), 0 0 42px #00aaff80}.script{font-family:var(--script-font);font-weight:400}:root{--s:min(calc(100vw / 1600), calc(100vh / 1100));--room-w:min(100vw, calc(var(--s) * 2440))}.room{z-index:0;width:var(--room-w);height:calc(var(--s) * 1100);view-transition-name:room;margin:0 auto;position:fixed;top:0;left:0;right:0}body.home .room{position:absolute}.room canvas,.room svg{width:100%;height:100%;position:absolute;inset:0}#hotspots{visibility:hidden;overflow:visible}.room.live #hotspots{visibility:visible}#hotspots a{cursor:pointer}#hotspots a[hidden]{display:none}#hotspots a:focus,#hotspots a:focus-visible{box-shadow:none;outline:none}#hotspots polygon{fill:#0000;pointer-events:all;stroke:#0000;stroke-width:4px;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:stroke .15s}html.kbd-nav #hotspots a:focus-visible polygon{stroke:var(--neon);stroke-width:3px;filter:drop-shadow(0 0 4px var(--neon)) drop-shadow(0 0 10px var(--neon))}html.no-room .room{display:none}::view-transition-group(room){animation-duration:.45s}::view-transition-old(room){display:none}::view-transition-new(room){mix-blend-mode:normal;animation:none}body.inner{background:#0b0809}.room-dim{z-index:0;pointer-events:none;view-transition-name:room-dim;background:#07050a9e;position:fixed;inset:0}::view-transition-group(room-dim){animation-duration:.35s}.wall-scroll{inset:calc(var(--s) * 250) 0 0 0;z-index:1;overscroll-behavior:contain;-webkit-mask-image:linear-gradient(180deg, transparent 0, #000 calc(var(--s) * 40));mask-image:linear-gradient(180deg, transparent 0, #000 calc(var(--s) * 40));scrollbar-width:thin;scrollbar-color:#ffd6ef59 transparent;position:fixed;overflow-y:auto}.wall-scroll:focus{outline:none}.wall-column{--col-w:max(calc(var(--s) * 850), min(620px, 100vw - 32px));width:var(--col-w);margin-left:max(16px, calc(50% - var(--s) * 75 - var(--col-w) / 2));padding-top:calc(var(--s) * 50);container-type:inline-size}.wall-column:has(.page>.cards){--col-w:max(calc(var(--s) * 1100), min(900px, 100vw - 32px));margin-left:max(16px, calc(50% - var(--col-w) / 2))}.text-nav{flex-wrap:wrap;justify-content:center;gap:4px 16px;padding:0 0 10px;display:none}.text-nav a{font-family:var(--neon-font);color:#f3e6f6;text-shadow:0 0 6px #ff6ec780;padding:4px 2px;font-size:18px;text-decoration:none}.text-nav a[aria-current=page]{color:#fff;text-shadow:0 0 8px var(--neon), 0 0 18px var(--neon)}.text-nav .home{text-align:center;flex-basis:100%;font-size:30px}html:not(.js) .text-nav,html.no-room .text-nav{display:flex}html:not(.js) .wall-scroll{position:static;-webkit-mask-image:none;mask-image:none}@media (width<=760px){.text-nav{display:flex}.room[data-scene=page] #hotspots{display:none}.wall-scroll{top:calc(var(--s) * 200)}.wall-column{width:auto;margin:0 16px}}.page{max-width:1180px;margin:0 auto;padding:18px 20px 80px}.inner .page{max-width:none;margin:0;padding:0 0 30px}.inner .page-title{color:#f6ecf8;text-shadow:0 2px 18px #1e0c2873}.inner .page-title i{color:#ffd38a}.inner .lede{color:#e6d8ec}.inner .eyebrow{color:#ffd38a}.eyebrow{font:12px var(--mono);letter-spacing:.28em;text-transform:uppercase;color:#b08a3c;margin:0 0 10px}.page-title{font-family:var(--serif);margin:0 0 12px;font-size:clamp(32px,6vw,48px);font-weight:600;line-height:1.08}.page-title i{color:var(--amber)}.lede{color:var(--dim);max-width:720px;margin:0 0 30px}.inner .site-footer{color:#e6d8ec;text-shadow:0 1px 3px #1e0c28cc;border-top:0;flex-direction:column;gap:4px;max-width:none;margin:0;padding:18px 0 34px}.inner .site-footer a{color:#fff3e6}.site-footer{border-top:1px solid var(--line);max-width:1180px;font:13px var(--mono);color:var(--dim);flex-wrap:wrap;justify-content:space-between;gap:10px 24px;margin:0 auto;padding:24px 20px 40px;display:flex}.site-footer a{color:var(--dim)}.site-footer a:hover{color:var(--text)}.plate-wrap{aspect-ratio:16/9;background:var(--paper) linear-gradient(160deg, color-mix(in srgb, var(--ink,#2e3192) 12%, transparent), transparent 70%);position:relative;overflow:hidden}.plate-wrap canvas{opacity:0;width:100%;height:100%;transition:opacity .5s}.plate-wrap canvas.baked{opacity:1}.plate-wrap img{object-fit:cover;width:100%;height:100%}.plate-wrap.no-plate{place-items:center;display:grid}.plate-wrap .stamp{font-family:var(--serif);color:var(--ink-text,var(--indigo));opacity:.9;mix-blend-mode:multiply;font-size:clamp(34px,6vw,64px);font-style:italic;font-weight:600;transform:rotate(-4deg)}.cards{grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr));gap:22px;margin:0;padding:0;list-style:none;display:grid}.card{background:var(--paper);height:100%;color:var(--paper-ink);border-radius:12px;flex-direction:column;text-decoration:none;transition:transform .2s,box-shadow .2s;display:flex;position:relative;overflow:hidden;box-shadow:0 14px 40px #00000073}.card:hover{box-shadow:0 18px 50px #0000008c, 0 0 0 2px var(--ink,var(--indigo));transform:translateY(-3px)}.card:focus-visible{outline-offset:4px;border-radius:12px}.card .body{flex-direction:column;flex:1;gap:6px;padding:16px 18px 18px;display:flex}.card .kicker{font:11px var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--ink-text,var(--violet));margin:0}.card h2,.card h3{font-family:var(--serif);color:var(--indigo);margin:0;font-size:24px;font-weight:600;line-height:1.12}.card h2 i,.card h3 i{color:var(--ink-text,var(--pink))}.card .summary{color:#4a4060;margin:0;font-size:15px;line-height:1.5}.card .meta{font:12px var(--mono);color:#6a6080;margin:auto 0 0;padding-top:8px}.card .badge{z-index:2;font:10px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:#6a1f4f;background:#f2ede3eb;border-radius:4px;padding:3px 7px;position:absolute;top:10px;left:10px}.inner .sheet{background:linear-gradient(170deg,#f6f1e7,#efe8db 60%,#e9e1d2);border-radius:3px;max-width:880px;position:relative;overflow:visible;transform:rotate(-.3deg);box-shadow:inset 0 1px #ffffff80,0 3px 6px #14081e40,0 24px 50px #14081e80}.inner .sheet>.plate-wrap{border-radius:3px 3px 0 0}.inner .sheet:before,.inner .sheet:after{content:"";z-index:3;opacity:.85;background:repeating-linear-gradient(115deg, #ffffff47 0 5px, transparent 5px 11px), var(--tape,#f096becc);clip-path:polygon(0 8%,4% 0,9% 7%,15% 0,21% 6%,100% 2%,97% 50%,100% 98%,92% 92%,85% 100%,78% 93%,0 100%,3% 50%);width:112px;height:30px;position:absolute;top:-13px}.inner .sheet:before{left:34px;transform:rotate(-4deg)}.inner .sheet:after{--tape:#7ec4b0cc;right:34px;transform:rotate(3.5deg)}.inner .cards{grid-template-columns:repeat(3,1fr);gap:34px 30px;padding-top:10px}@container (width<=820px){.inner .cards{grid-template-columns:1fr 1fr}}@container (width<=540px){.inner .cards{grid-template-columns:1fr}}.inner .cards>li{position:relative}.inner .cards>li:nth-child(3n+1){transform:rotate(-1.1deg)}.inner .cards>li:nth-child(3n+2){transform:rotate(.8deg)translateY(10px)}.inner .cards>li:nth-child(3n){transform:rotate(-.4deg)translateY(-4px)}.inner .cards .card{background:linear-gradient(170deg,#f6f1e7,#ece4d6);border-radius:3px;box-shadow:0 3px 6px #14081e40,0 18px 34px #14081e73}.inner .cards .card:hover{box-shadow:0 3px 6px #14081e40, 0 18px 34px #14081e73, 0 0 0 2px var(--ink,var(--indigo)), 0 0 22px color-mix(in srgb, var(--ink,var(--indigo)) 45%, transparent);transform:none}.inner .cards>li:before{content:"";z-index:4;background:radial-gradient(circle at 35% 35%, #fff 0 12%, var(--pin,#d8443a) 30% 70%, #8a1f18 100%);border-radius:50%;width:14px;height:14px;margin-left:-7px;position:absolute;top:-7px;left:50%;box-shadow:2px 3px 3px #14081e73}.inner .cards>li:nth-child(3n+2):before{--pin:#f2c94c}.inner .cards>li:nth-child(3n):before{--pin:#5aa9e6}.inner .after,.inner .after a{color:#e6d8ec}.sheet{background:var(--paper);color:var(--paper-ink);border-radius:14px;max-width:980px;margin:0 auto;overflow:hidden;box-shadow:0 20px 60px #00000073}.sheet .head{padding:26px clamp(18px,5vw,48px) 8px}.sheet .kicker{font:12px var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--ink-text,var(--violet));margin:0}.sheet h1{font-family:var(--serif);color:var(--indigo);margin:4px 0 8px;font-size:clamp(32px,6vw,48px);font-weight:600;line-height:1.05}.sheet h1 i{color:var(--ink-text,var(--pink))}.sheet .dek{color:#4a4060;max-width:720px;margin:0;font-size:18px}.sheet .by{font:12px var(--mono);color:#6a6080;margin:12px 0 0;line-height:1.7}.prose{max-width:68ch;font-family:var(--serif);color:#2b2438;margin:0 auto;padding:18px clamp(18px,5vw,48px) 48px;font-size:19px;line-height:1.68}.prose h2{color:var(--indigo);margin:1.6em 0 .4em;font-size:26px;line-height:1.2}.prose h3{color:var(--indigo);margin:1.4em 0 .3em;font-size:21px}.prose a{color:var(--ink-text,var(--indigo));text-underline-offset:3px}.prose code{font:.86em var(--mono);background:#2e319214;border-radius:4px;padding:.1em .35em}.prose pre{font:14px/1.5 var(--mono);color:#f2e9dc;background:#1d1720;border-radius:10px;padding:16px 18px;overflow-x:auto}.prose pre code{background:0 0;padding:0}.prose blockquote{border-left:3px solid var(--ink,var(--pink));color:#4a4060;margin:1.2em 0;padding:.2em 1em}.prose ul,.prose ol{padding-left:1.3em}.prose img{border-radius:8px}.sample-note,.draft-note{font:13px/1.5 var(--mono);letter-spacing:.02em;color:#7a1048;background:#ffe0f0;border:1.5px dashed #ff48b0;border-radius:8px;margin:0 0 1.4em;padding:10px 14px}.draft-note{color:#6b4a00;background:#fff4c2;border-color:#c99a00}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}body.home{background:#07050a}.room-space{height:calc(var(--s) * 1100)}.neon-nav{text-align:center;max-width:520px;margin:0 auto;padding:22px 16px 48px}.neon-nav ul{gap:16px;margin:0;padding:0;list-style:none;display:grid}.neon-nav .pair{grid-template-columns:1fr 1fr;gap:14px;display:grid}.neon-name{margin:0 0 18px;font-size:54px;line-height:1.1}.neon-btn{font-family:var(--neon-font);color:#ffe9f6;text-shadow:0 0 2px #fff, 0 0 8px var(--neon), 0 0 20px var(--neon);box-shadow:0 0 6px var(--neon), 0 0 18px #ff48b08c, inset 0 0 12px #ff48b059;background:#ff48b00f;border:2px solid #ffb3df;border-radius:16px;padding:14px 18px 12px;font-size:30px;line-height:1.1;text-decoration:none;transition:background .2s,transform .1s;display:block}.neon-btn:hover{background:#ff48b024}.neon-btn:active{transform:scale(.98)}.neon-btn.small{font-size:21px}.neon-btn.cyan{color:#e8fbff;text-shadow:0 0 2px #fff, 0 0 8px var(--neon-cyan), 0 0 20px var(--neon-cyan);box-shadow:0 0 6px var(--neon-cyan), 0 0 18px #00aaff80, inset 0 0 12px #00aaff4d;background:#00aaff0f;border-color:#b8f2ff}.neon-btn.cyan:hover{background:#00aaff24}.hf-line{font:13px var(--mono);color:var(--dim);margin:22px 0 0}@media (width>=760px){html.js body.home{overflow:hidden}html.js .neon-nav{display:none}}.overlay{z-index:50;position:fixed;inset:0}.overlay[hidden]{display:none}.overlay:focus{outline:none}.ov-backdrop{opacity:0;background:#07050adb;transition:opacity .45s;position:absolute;inset:0}.overlay.is-open .ov-backdrop{opacity:1}.overlay .close{appearance:none;color:#ffe9f6;width:40px;height:40px;font:26px/1 var(--sans);cursor:pointer;background:#140c12b3;border:1.5px solid #ffb3df99;border-radius:50%;flex:none;place-items:center;padding:0 0 3px;display:grid}.overlay .close:hover{border-color:var(--neon);box-shadow:0 0 12px var(--neon)}.blog-ov .ov-backdrop{background:#07050aed}.ov-scroll{overscroll-behavior:contain;position:absolute;inset:0;overflow-y:auto}.ov-inner{max-width:1120px;margin:0 auto;padding:28px 20px 60px}.ov-head{opacity:0;justify-content:space-between;align-items:center;margin:0 0 22px;transition:opacity .4s .2s;display:flex}.overlay.is-open .ov-head,.overlay.is-open .ov-more{opacity:1}.ov-head h2{margin:0;font-size:44px;font-weight:400;line-height:1}.zine-grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr))}.zine-grid .card{transform-origin:0 0}.blog-ov.flying .card{will-change:transform;transition:none}.blog-ov.flying .card-cover{will-change:opacity}.zine-grid li{opacity:0}.blog-ov.is-open .zine-grid li,.blog-ov.flying .zine-grid li{opacity:1}.blog-ov.fading .zine-grid li{transition:opacity .35s}.card-cover{z-index:3;background:var(--zine-ink,transparent);opacity:0;pointer-events:none;border-radius:inherit;position:absolute;inset:0}.ov-more{font:14px var(--mono);opacity:0;margin:26px 0 0;transition:opacity .4s .3s}.ov-more a{color:var(--dim)}.ov-more a:hover{color:var(--text)}.projects-ov .ov-backdrop{background:#07050a9e}.term{transform-origin:0 0;width:min(640px,100vw - 32px);height:fit-content;max-height:calc(100dvh - 32px);font:15px/1.5 var(--mono);color:#d8d0e6;background:#0d0b12;border:1px solid #3a2f48;border-radius:12px;margin:auto;position:absolute;inset:0;overflow:auto;box-shadow:0 30px 80px #0009,0 0 0 1px #8be9ff14,0 0 40px #8be9ff1f}.term-bar{background:#15111c;border-bottom:1px solid #2a2236;align-items:center;gap:12px;padding:10px 12px 10px 16px;display:flex;position:sticky;top:0}.term-bar h2{font:600 14px var(--mono);color:#a99cc0;flex:1;margin:0}.term-bar .dots{gap:6px;display:flex}.term-bar .dots i{background:#ff5f57;border-radius:50%;width:11px;height:11px}.term-bar .dots i:nth-child(2){background:#febc2e}.term-bar .dots i:nth-child(3){background:#28c840}.term-bar .close{width:32px;height:32px;font-size:22px}.term-body{padding:16px 18px 18px}.term .cmd{color:#a99cc0;margin:0 0 10px}.term .cmd a{color:#8be9ff;text-decoration:none}.term .cmd a:hover{text-decoration:underline}.term .ps1{color:#28c840}.term .dim{color:#6f6585}.term .caret{vertical-align:-.2em;background:#8be9ff;width:.6em;height:1.1em;margin-left:4px;animation:1.1s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.proj-list{gap:4px;margin:0 0 14px;padding:0;list-style:none;display:grid}.proj-list a{color:inherit;border:1px solid #0000;border-radius:8px;grid-template-columns:1fr auto;gap:2px 14px;padding:10px 12px;text-decoration:none;display:grid}.proj-list a:hover,.proj-list a:focus-visible{background:#8be9ff0f;border-color:#8be9ff59}.proj-list .pname{color:#ffe9f6;font-size:17px;font-weight:600}.proj-list .pname:before{content:"▸ ";color:var(--neon)}.proj-list .pline{color:#b3a9c6;grid-column:1;font-size:14px}.proj-list .open{color:#8be9ff;grid-area:1/2/span 2;align-self:center;font-size:13px}.about-ov .ov-backdrop{background:0 0}.bubble{color:#241d33;width:min(390px,100vw - 32px);font:17px/1.5 var(--serif);opacity:0;transform-origin:var(--tail-x,24px) 100%;background:#fffaf2;border-radius:22px;padding:14px 18px 12px;transition:opacity .16s,transform .2s ease-in;position:absolute;transform:scale(.9);box-shadow:0 18px 50px #00000080,0 0 0 3px #241d33}.bubble.below{transform-origin:var(--tail-x,24px) 0}.about-ov.is-open .bubble{opacity:1;animation:.36s cubic-bezier(.2,1.45,.45,1) both bubble-pop;transform:none}.about-ov.is-open .bubble.below{animation-name:bubble-pop-below}@keyframes bubble-pop{0%{opacity:0;transform:translateY(14px)scale(.45)}35%{opacity:1}to{opacity:1;transform:none}}@keyframes bubble-pop-below{0%{opacity:0;transform:translateY(-14px)scale(.45)}35%{opacity:1}to{opacity:1;transform:none}}.bubble-head{align-items:center;gap:10px;margin:0 0 4px;display:flex}.bubble-head h2{font:600 12px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:#765ba7;flex:1;margin:0}.bubble .close{color:#fffaf2;background:#241d33;border-color:#241d33;width:32px;height:32px;font-size:22px}.bubble .say{overscroll-behavior:contain;min-height:4.5em;margin:0 0 10px;overflow-y:auto}.bubble .say a{color:#2e3192;text-underline-offset:3px;overflow-wrap:anywhere}.bubble .say a:hover{color:#ff48b0}.bubble .choices{border-top:1.5px dashed #c9bfd8;gap:2px;margin:0;padding:8px 0 0;list-style:none;display:grid}.bubble .choices button{appearance:none;text-align:left;width:100%;font:14px/1.4 var(--mono);color:#2e3192;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:5px 8px 5px 22px;position:relative}.bubble .choices button:before{content:"▸";opacity:.35;position:absolute;left:6px}.bubble .choices button:hover,.bubble .choices button:focus-visible{background:#efe6ff}.bubble .choices button:hover:before,.bubble .choices button:focus-visible:before{opacity:1;color:#ff48b0}.bubble .choices button.back{color:#6a6080}.bubble-foot{font:12px var(--mono);color:#6a6080;justify-content:flex-end;gap:10px;margin:8px 0 0;display:flex}.bubble-foot a{color:#6a6080}.bubble .tail{width:26px;height:26px;left:calc(var(--tail-x,40px) - 13px);background:#fffaf2;border-radius:0 0 6px;position:absolute;bottom:-13px;transform:rotate(45deg)skew(12deg,12deg);box-shadow:3px 3px #241d33}.bubble.below .tail{border-radius:6px 0 0;top:-13px;bottom:auto;box-shadow:-3px -3px #241d33}html.ov-open,html.ov-open body{overflow:hidden}html.no-room .room-space{display:none}html.no-room body.home{overflow:auto}html.no-room .neon-nav{padding-top:12vh;display:block}.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0;mix-blend-mode:plus-lighter}to{opacity:1;mix-blend-mode:plus-lighter}}@keyframes astroFadeOut{0%{opacity:1;mix-blend-mode:plus-lighter}to{opacity:0;mix-blend-mode:plus-lighter}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*),[data-astro-transition-scope]{animation:none!important}}
