@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/jetbrains-mono-latin-400-normal.V6pRDFza.woff2)format("woff2"),url(/_astro/jetbrains-mono-latin-400-normal.6-qcROiO.woff)format("woff")}@font-face{font-family:Inter;src:url(/fonts/inter-latin-variable.woff2)format("woff2");font-weight:100 900;font-style:normal;font-display:swap}:root{--bg:#f4f4ee;--surface:#eaeae3;--surface-raised:#fff;--fg:#151614;--fg-soft:#42443f;--muted:#676a62;--line:#d1d3ca;--hover:#e2e4db;--accent:#151614;--accent-strong:#30322e;--accent-ink:#f4f4ee;--selection:#d5d6cf;--grid-dot:#c5c8be;--sans:Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--serif:Georgia, "Times New Roman", serif;--mono:"JetBrains Mono", ui-monospace, monospace;--column:680px;--frame:1200px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-7:48px;--space-8:72px;--space-9:96px;--radius-sm:6px;--radius-md:12px;--radius-lg:16px;--ease:cubic-bezier(.2, .7, .2, 1);--duration-fast:.12s;--duration-normal:.22s;--duration-slow:.4s;--syntax-base:#3b4261;--syntax-comment:#626b82;--syntax-string:#397b22;--syntax-keyword:#7a3e9d;--syntax-literal:#b03c59;--syntax-number:#9b5000;--syntax-function:#2e65a8;--syntax-type:#077;--syntax-operator:#6b57b5;color-scheme:light;font-synthesis:none}:root[data-theme=dark]{--bg:#0a0a0a;--surface:#0f0f0f;--surface-raised:#171717;--fg:#f2f4ed;--fg-soft:#b6b9b0;--muted:#90938c;--line:#262626;--hover:#171717;--accent:#f2f4ed;--accent-strong:#fff;--accent-ink:#0a0a0a;--selection:#444;--grid-dot:#292929;--syntax-base:#c8d3f5;--syntax-comment:#9ba5cb;--syntax-string:#c3e88d;--syntax-keyword:#c099ff;--syntax-literal:#ff757f;--syntax-number:#ffc777;--syntax-function:#82aaff;--syntax-type:#4fd6be;--syntax-operator:#89ddff;color-scheme:dark}*{box-sizing:border-box}html{background:var(--bg);scrollbar-width:thin;scrollbar-color:var(--line) var(--bg);scroll-padding-top:32px}body{background:var(--bg);min-height:100vh;color:var(--fg-soft);font:15px/1.8 var(--sans);letter-spacing:-.015em;-webkit-font-smoothing:antialiased;margin:0}::selection{background:var(--selection);color:var(--fg)}a{color:var(--fg);text-decoration-color:color-mix(in srgb, var(--muted) 45%, transparent);text-underline-offset:4px;transition:color var(--duration-fast) var(--ease), text-decoration-color var(--duration-fast) var(--ease);text-decoration-thickness:1px}a:hover{color:var(--accent);text-decoration-color:currentColor}button{font:inherit;color:inherit;cursor:pointer}button,a{-webkit-tap-highlight-color:transparent}@media (hover:hover) and (pointer:fine){html{cursor:url(/sword-cursor-game.png) 3 3,auto}a,button,summary,[role=button]{cursor:url(/sword-cursor-game.png) 3 3,pointer}}:focus-visible{outline:2px solid var(--accent);outline-offset:5px;border-radius:3px}img{max-width:100%;height:auto}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}h1,h2,h3{color:var(--fg);text-wrap:balance}h1{letter-spacing:-.05em;font-size:clamp(30px,5vw,40px);font-weight:550;line-height:1.2}h2{letter-spacing:-.035em;font-size:22px;font-weight:500;line-height:1.35}h3{letter-spacing:-.025em;font-size:17px;font-weight:500;line-height:1.5}p{overflow-wrap:break-word;text-wrap:pretty}ul,ol{padding-left:22px}li{margin-block:8px;padding-left:3px}li::marker{color:var(--muted)}.accent{color:var(--accent)}.muted{color:var(--muted)}.eyebrow{color:var(--muted);font:10px/1.6 var(--mono);letter-spacing:.08em;text-transform:uppercase;display:block}.text-link{color:var(--fg-soft);font-size:12px;text-decoration:none}.text-link span{transition:transform var(--duration-normal) var(--ease);margin-left:4px;display:inline-block}.text-link:hover span{transform:translate(3px)}.button-link{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface);min-height:42px;color:var(--fg);transition:background var(--duration-fast) var(--ease), transform var(--duration-normal) var(--ease);align-items:center;gap:30px;padding:8px 15px;font-size:12px;text-decoration:none;display:inline-flex}.button-link:hover{background:var(--hover);transform:translateY(-1px)}.button-link:active{transform:translateY(0)}.skip-link{z-index:20;background:var(--fg);color:var(--bg);padding:8px 16px;position:fixed;top:8px;left:8px;transform:translateY(-160%)}.skip-link:focus{transform:translateY(0)}.page-shell{width:min(100%,1080px);margin:0 auto;padding:0 48px}.site-header{justify-content:space-between;align-items:center;gap:24px;min-height:104px;display:flex}.identity{min-height:44px;color:var(--fg);letter-spacing:-.065em;align-items:center;font-size:19px;font-weight:500;text-decoration:none;display:inline-flex}.identity>span{color:var(--muted)}.site-nav{align-items:center;gap:30px;font-size:12px;display:flex}.site-nav a{min-height:44px;color:var(--muted);align-items:center;text-decoration:none;display:inline-flex}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--fg)}.site-nav a[aria-current=page]{text-underline-offset:6px;text-decoration:underline}.content-column{width:100%;min-width:0;padding-bottom:var(--space-6);flex-direction:column;gap:56px;margin:64px auto 0;display:flex}.prose{flex-direction:column;gap:22px;min-width:0;scroll-margin-top:32px;display:flex}.prose>*{margin-top:0;margin-bottom:0}.prose>.muted,.page-intro>.muted{letter-spacing:.025em;font-size:11px}.page-intro{padding-bottom:var(--space-6);border-bottom:1px solid var(--line)}.page-intro>p:first-child,.writing-article>p:first-child,.case-study>p:first-child{font-size:12px}.page-intro>p:first-child a,.writing-article>p:first-child a,.case-study>p:first-child a{color:var(--muted);text-decoration:none}.fact-list{border-top:1px solid var(--line);flex-direction:column;margin:0;font-size:13px;display:flex}.fact-list>div{border-bottom:1px solid var(--line);grid-template-columns:minmax(96px,.7fr) minmax(0,1.5fr);gap:20px;padding:14px 0;display:grid}.fact-list dt{color:var(--muted)}.fact-list dd{overflow-wrap:anywhere;margin:0}.entry-list,.timeline{border-top:1px solid var(--line);flex-direction:column;display:flex}.entry-card,.timeline article{border-bottom:1px solid var(--line);flex-direction:column;gap:10px;padding:26px 0;display:flex}.entry-card>*,.timeline article>*{margin:0}.entry-card h2,.entry-card h3,.timeline h3{font-size:18px;font-weight:500}.entry-card h2 a,.entry-card h3 a{text-decoration:none}.entry-card>p,.timeline p{font-size:13px}.entry-card .entry-meta,.entry-meta{color:var(--muted);letter-spacing:0;font-size:11px;font-weight:400;line-height:1.6}.project-mark{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--surface);width:60px;height:64px;color:var(--fg-soft);transition:background var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);flex-shrink:0;place-items:center;display:grid}.link-arrow{color:var(--muted);transition:transform var(--duration-normal) var(--ease), color var(--duration-fast) var(--ease);flex-shrink:0;font-size:17px;font-weight:400;display:inline-block}.work-card{padding:0}.work-card-link{color:inherit;align-items:flex-start;gap:20px;padding:26px 0;text-decoration:none;display:flex}.work-card-copy{flex:1;min-width:0}.work-card-copy p{color:var(--fg-soft);margin:10px 0;font-size:13px}.work-card-title{flex-wrap:wrap;align-items:center;gap:8px 12px;display:flex}.work-card-title h2{margin:0}.work-card-link:hover .project-mark{color:var(--accent);background:var(--hover)}.work-card-link:hover .link-arrow{transform:translate(2px,-2px)}.status-badge{border:1px solid var(--line);color:var(--muted);letter-spacing:0;border-radius:4px;padding:2px 7px;font-size:10px;font-weight:400;line-height:1.5}.project-archive{gap:26px;display:grid}.archive-heading{justify-content:space-between;align-items:baseline;gap:20px;display:flex}.archive-heading h2{margin:0}.archive-heading p{color:var(--muted);margin:9px 0 0;font-size:13px}.archive-count{color:var(--muted);font:10px/1.6 var(--mono);flex-shrink:0}.archive-list{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.archive-list>li{border-bottom:1px solid var(--line);margin:0;padding:0}.archive-row{grid-template-columns:24px 130px minmax(0,1fr) 18px;align-items:baseline;gap:20px;padding:24px 0;text-decoration:none;display:grid}.archive-number{color:var(--muted);font:10px/1.8 var(--mono)}.archive-row h3{margin:0;font-size:14px;font-weight:500}.archive-row p{color:var(--muted);margin:0;font-size:13px;line-height:1.75}.archive-arrow{color:var(--muted);transition:transform var(--duration-normal) var(--ease)}a.archive-row:hover h3,a.archive-row:hover .archive-arrow{color:var(--accent)}a.archive-row:hover .archive-arrow{transform:translate(3px)}.writing-card{gap:11px;padding-block:30px}.writing-card h2 a,.writing-card h3 a{justify-content:space-between;align-items:baseline;gap:20px;display:flex}.writing-card h2 a:hover .link-arrow,.writing-card h3 a:hover .link-arrow{transform:translate(2px,-2px)}.entry-thumbnail{margin-top:8px;display:block}.entry-thumbnail img{border-radius:var(--radius-md);width:100%;display:block}.timeline article{border-left:1px solid var(--line);margin-left:4px;padding-left:24px;position:relative}.timeline article:before{background:var(--muted);width:7px;height:7px;box-shadow:0 0 0 5px var(--bg);content:"";border-radius:50%;position:absolute;top:34px;left:-4px}.timeline article:first-child:before{background:var(--accent)}.timeline p:last-child{font-size:11px}.site-footer{border-top:1px solid var(--line);gap:28px;padding:38px 0 8px;display:grid}.footer-top{justify-content:space-between;align-items:center;gap:24px;display:flex}.contact-email{letter-spacing:-.04em;align-items:center;gap:20px;min-height:44px;font-size:20px;text-decoration:none;display:inline-flex}.contact-email:hover{text-decoration:underline}.contact-email span{color:var(--muted);font-size:16px}.footer-socials{flex-wrap:wrap;gap:24px;font-size:11px;display:flex}.footer-socials a{align-items:center;min-height:44px;display:inline-flex}.footer-socials a,.footer-bottom a{color:var(--muted);text-decoration:none}.footer-socials a:hover,.footer-bottom a:hover{color:var(--fg)}.footer-bottom{color:var(--muted);justify-content:space-between;gap:20px;font-size:10px;display:flex}.footer-links{font-size:13px;line-height:2}.article-lede{font-size:17px;line-height:1.8}.tag-list{color:var(--muted);flex-wrap:wrap;gap:8px;font-size:11px;display:flex}.tag-list span{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);padding:3px 8px}.article-body{min-width:0;padding-top:var(--space-6);border-top:1px solid var(--line);flex-direction:column;gap:22px;display:flex}.article-body>*{margin:0}.article-body h2,.article-body h3{margin-top:24px;scroll-margin-top:32px}.article-body .heading-anchor{text-decoration:none}.article-body .heading-anchor:hover{text-decoration:underline}.article-body pre{border:1px solid var(--line);border-radius:var(--radius-md);background:var(--surface);max-width:100%;color:var(--fg);font:12px/1.8 var(--mono);white-space:pre;padding:20px;overflow-x:auto}.article-body code{font-family:var(--mono);font-size:.85em}.article-body pre code{font-size:inherit}.article-body :not(pre)>code{background:var(--surface);color:var(--fg);overflow-wrap:anywhere;border-radius:3px;padding:2px 4px}.article-body blockquote{border-left:2px solid var(--accent);color:var(--fg-soft);padding:2px 0 2px 20px}.article-body strong{color:var(--fg);font-weight:600}.article-body table{border-collapse:collapse;max-width:100%;font-size:13px;display:block;overflow-x:auto}.article-body th,.article-body td{border:1px solid var(--line);text-align:left;padding:10px}.article-body img,.case-images img,.workstation-photo img{border:1px solid var(--line);border-radius:var(--radius-md);width:100%;height:auto;display:block}.article-body a:has(img){display:block}.case-images{gap:20px;display:grid}.case-images a{display:block}.portrait-link{width:min(100%,260px);display:block}.portrait{aspect-ratio:1;object-fit:cover;border-radius:var(--radius-lg);filter:grayscale();width:100%;display:block}.about-profile{grid-template-columns:160px minmax(0,1fr);align-items:start;gap:28px;display:grid}.about-profile .fact-list>div{grid-template-columns:70px minmax(0,1fr);gap:12px}.case-section{border-top:1px solid var(--line);flex-direction:column;gap:20px;min-width:0;padding-top:28px;scroll-margin-top:32px;display:flex}.case-section>*{margin-block:0}.case-details .fact-list{border-top:0}.toolbox,.toolbox>section{flex-direction:column;gap:20px;display:flex}.toolbox h3,.workstation-photo{margin:0}.error-page{justify-content:center;min-height:60vh}@media (width<=600px){body{font-size:14px}.page-shell{padding-inline:24px}.site-header{min-height:84px}.site-nav{gap:22px}.content-column{gap:44px;margin-top:40px}.about-profile{grid-template-columns:1fr}.archive-heading{gap:12px}.archive-heading p{max-width:220px;font-size:12px}.archive-row{grid-template-columns:20px minmax(0,1fr) 18px;gap:6px 12px;padding:20px 0}.archive-row p{grid-column:2/3}.archive-arrow{grid-area:1/3}.about-profile .portrait-link{width:140px}.work-card-link{gap:14px}.work-card .project-mark{width:44px;height:48px}.footer-socials{gap:18px}.footer-bottom{align-items:flex-start;gap:10px}}@media (width<=360px){.page-shell{padding-inline:20px}.site-nav{gap:16px}.footer-top{flex-direction:column;align-items:flex-start;gap:8px}.footer-bottom{flex-direction:column}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media print{:root,:root[data-theme=dark]{--bg:white;--surface:#f5f5f5;--fg:black;--fg-soft:#222;--muted:#555;--line:#ddd;--accent:#333;color-scheme:light}.site-header,.site-footer,.skip-link{display:none}.page-shell{width:100%;padding:0}.content-column{margin-top:0}.article-body pre{white-space:pre-wrap;overflow-wrap:anywhere}}.article-body .hljs{color:var(--syntax-base)}.article-body .hljs-comment,.article-body .hljs-quote{color:var(--syntax-comment)}.article-body .hljs-keyword,.article-body .hljs-selector-tag,.article-body .hljs-doctag,.article-body .hljs-meta .hljs-keyword{color:var(--syntax-keyword)}.article-body .hljs-string,.article-body .hljs-regexp,.article-body .hljs-symbol,.article-body .hljs-bullet,.article-body .hljs-addition,.article-body .hljs-meta .hljs-string{color:var(--syntax-string)}.article-body .hljs-literal,.article-body .hljs-variable,.article-body .hljs-template-variable,.article-body .hljs-selector-attr,.article-body .hljs-selector-pseudo,.article-body .hljs-deletion{color:var(--syntax-literal)}.article-body .hljs-number{color:var(--syntax-number)}.article-body .hljs-title,.article-body .hljs-title.function_,.article-body .hljs-section,.article-body .hljs-selector-id,.article-body .hljs-selector-class{color:var(--syntax-function)}.article-body .hljs-type,.article-body .hljs-built_in,.article-body .hljs-title.class_,.article-body .hljs-title.class_.inherited__,.article-body .hljs-name{color:var(--syntax-type)}.article-body .hljs-operator,.article-body .hljs-punctuation,.article-body .hljs-tag{color:var(--syntax-operator)}.article-body .hljs-attr,.article-body .hljs-attribute,.article-body .hljs-property,.article-body .hljs-params,.article-body .hljs-subst{color:var(--syntax-base)}.article-body .hljs-variable.language_{color:var(--syntax-type)}.article-body .hljs-emphasis{font-style:italic}.article-body .hljs-strong{font-weight:600}.building-card[data-astro-cid-tv7qthbc]{--card-cool:#adb9d0;--card-warm:#d5a887;z-index:10;transform-origin:0 100%;background:#141416;border:1px solid #333238;border-radius:16px;width:320px;padding:14px;position:fixed;bottom:24px;left:24px;transform:scale(.85);box-shadow:0 12px 48px #0004}.card-hero[data-astro-cid-tv7qthbc]{background:radial-gradient(at 95% 0,#adb9d075 0,#0000 70%),radial-gradient(at 90% 110%,#d5a88765 0,#0000 70%),linear-gradient(135deg,#20202b,#18171c);border-radius:10px;height:176px;position:relative;overflow:hidden}.card-status[data-astro-cid-tv7qthbc]{z-index:1;color:#d6d1da;background:#111117b8;border:1px solid #ffffff12;border-radius:20px;align-items:center;gap:6px;padding:5px 9px;font-size:10px;line-height:1.4;display:inline-flex;position:absolute;top:16px;left:16px}.card-status[data-astro-cid-tv7qthbc]>span[data-astro-cid-tv7qthbc]{background:var(--card-warm);border-radius:50%;width:5px;height:5px}.card-logo[data-astro-cid-tv7qthbc]{mix-blend-mode:lighten;width:176px;height:152px;position:absolute;top:20px;right:-30px}.card-logo[data-astro-cid-tv7qthbc] img[data-astro-cid-tv7qthbc]{width:270px;max-width:none;height:270px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)rotate(-10deg)}.card-heading[data-astro-cid-tv7qthbc]{z-index:1;position:absolute;bottom:17px;left:16px}.card-heading[data-astro-cid-tv7qthbc] h2[data-astro-cid-tv7qthbc]{color:#f3f0f2;letter-spacing:-.05em;margin:0 0 6px;font-size:31px;font-weight:550;line-height:1.1}.card-heading[data-astro-cid-tv7qthbc] p[data-astro-cid-tv7qthbc]{color:#c6c1c9;margin:0;font-size:12px;line-height:1.5}.card-details[data-astro-cid-tv7qthbc]{padding:18px 5px}.card-label[data-astro-cid-tv7qthbc]{color:#a09ca7;margin:0;font-size:11px;line-height:1.5}.card-features[data-astro-cid-tv7qthbc]{gap:13px;margin:14px 0 0;padding:0;list-style:none;display:grid}.card-features[data-astro-cid-tv7qthbc] li[data-astro-cid-tv7qthbc]{color:#cac8cf;align-items:center;gap:10px;margin:0;padding:0;font-size:11px;line-height:1.5;display:flex}.card-features[data-astro-cid-tv7qthbc] svg[data-astro-cid-tv7qthbc]{width:17px;height:17px;color:var(--card-cool);flex-shrink:0}.card-features[data-astro-cid-tv7qthbc] li[data-astro-cid-tv7qthbc]:nth-child(2) svg[data-astro-cid-tv7qthbc]{color:#c5bacf}.card-features[data-astro-cid-tv7qthbc] li[data-astro-cid-tv7qthbc]:nth-child(3) svg[data-astro-cid-tv7qthbc]{color:var(--card-warm)}.card-features[data-astro-cid-tv7qthbc] strong[data-astro-cid-tv7qthbc]{color:#e8e4eb;font-weight:500}.card-footer[data-astro-cid-tv7qthbc]{padding:0 4px 4px}.card-link[data-astro-cid-tv7qthbc]{color:#cecad3;background:#1c1b1f;border:1px solid #ffffff07;border-radius:8px;justify-content:space-between;align-items:center;gap:12px;margin-top:10px;padding:7px 7px 7px 12px;text-decoration:none;display:flex}.card-url[data-astro-cid-tv7qthbc]{align-items:center;gap:8px;font-size:11px;display:inline-flex}.card-url[data-astro-cid-tv7qthbc] svg[data-astro-cid-tv7qthbc]{color:#a29aaa;width:16px;height:16px}.card-cta[data-astro-cid-tv7qthbc]{background:linear-gradient(110deg, var(--card-cool), #c5bacf 48%, var(--card-warm));color:#211d27;border-radius:5px;justify-content:center;align-items:center;gap:12px;min-height:31px;padding:5px 12px;font-size:11px;font-weight:500;display:inline-flex}.card-link[data-astro-cid-tv7qthbc]:hover .card-cta[data-astro-cid-tv7qthbc]{filter:brightness(1.1)}.card-link[data-astro-cid-tv7qthbc]:focus-visible{outline-offset:4px}@media (width<=1799px){.building-card[data-astro-cid-tv7qthbc]{bottom:16px;left:16px}body:has(.building-card){padding-bottom:374px}}@media (width<=560px),(height<=650px){.building-card[data-astro-cid-tv7qthbc]{bottom:max(12px, env(safe-area-inset-bottom));border-radius:12px;width:min(300px,100vw - 24px);padding:10px;left:12px}.card-hero[data-astro-cid-tv7qthbc]{height:112px}.card-status[data-astro-cid-tv7qthbc]{padding:3px 7px;font-size:9px;top:10px;left:12px}.card-heading[data-astro-cid-tv7qthbc]{bottom:12px;left:12px}.card-heading[data-astro-cid-tv7qthbc] h2[data-astro-cid-tv7qthbc]{margin-bottom:4px;font-size:24px}.card-heading[data-astro-cid-tv7qthbc] p[data-astro-cid-tv7qthbc]{font-size:10px}.card-heading[data-astro-cid-tv7qthbc] br[data-astro-cid-tv7qthbc]{display:none}.card-logo[data-astro-cid-tv7qthbc]{width:116px;height:110px;top:4px;right:-14px}.card-logo[data-astro-cid-tv7qthbc] img[data-astro-cid-tv7qthbc]{width:190px;height:190px}.card-details[data-astro-cid-tv7qthbc]{padding:12px 3px}.card-details[data-astro-cid-tv7qthbc]>.card-label[data-astro-cid-tv7qthbc]{display:none}.card-features[data-astro-cid-tv7qthbc]{gap:6px;margin:0}.card-features[data-astro-cid-tv7qthbc] li[data-astro-cid-tv7qthbc]{gap:7px;font-size:10px}.card-features[data-astro-cid-tv7qthbc] svg[data-astro-cid-tv7qthbc]{width:13px;height:13px}.card-footer[data-astro-cid-tv7qthbc]{padding:0}.card-footer[data-astro-cid-tv7qthbc]>.card-label[data-astro-cid-tv7qthbc]{display:none}.card-link[data-astro-cid-tv7qthbc]{margin-top:0}body:has(.building-card){padding-bottom:247px}}@media print{.building-card[data-astro-cid-tv7qthbc]{display:none}body:has(.building-card){padding-bottom:0}}
