@layer reset{*,:before,:after{box-sizing:border-box}html{scroll-behavior:smooth}body,h1,h2,h3,p,ol,ul,figure,blockquote{margin:0}img,svg,video{max-width:100%;display:block}button{font:inherit}}@layer tokens{:root{color-scheme:light;--paper:#f5f2e9;--paper-deep:#ebe6da;--ink:#20201d;--muted:#69675f;--line:#d4cec0;--blue:#2458a6;--gold:#a77419;--code:#ece8de;--header:color-mix(in srgb, var(--paper) 92%, transparent);--serif:Iowan Old Style, Charter, "Bitstream Charter", "Sitka Text", Cambria, serif;--sans:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--mono:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;--shell:min(780px, calc(100% - 40px))}:root[data-theme=dark]{color-scheme:dark;--paper:#111310;--paper-deep:#191b17;--ink:#e8e5dc;--muted:#aaa79d;--line:#363730;--blue:#78a9ef;--gold:#d2a64f;--code:#1b1e1a;--header:color-mix(in srgb, var(--paper) 91%, transparent)}}@layer base{body{min-width:320px;min-height:100vh;color:var(--ink);background:var(--paper);font-family:var(--sans);text-rendering:optimizelegibility;line-height:1.65}a{color:var(--blue);text-underline-offset:.2em;text-decoration-thickness:1px}a:hover{color:var(--gold)}::selection{background:color-mix(in srgb, var(--gold) 28%, transparent)}:focus-visible{outline:2px solid var(--blue);outline-offset:4px}code{font-family:var(--mono)}.shell{width:var(--shell);margin-inline:auto}.skip-link{z-index:100;color:var(--paper);background:var(--ink);padding:8px 12px;position:fixed;top:10px;left:10px;transform:translateY(-180%)}.skip-link:focus{transform:none}}@layer layout{.site-header{border-bottom:1px solid var(--line);background:var(--header);backdrop-filter:blur(12px)}.header-inner{grid-template-columns:1fr auto auto;align-items:center;gap:24px;min-height:64px;display:grid}.identity{white-space:nowrap;align-items:baseline;gap:8px;display:flex}.site-name{color:var(--ink);font-weight:700;text-decoration:none}.site-handle{color:var(--muted);font:.78rem var(--mono);text-decoration:none}.site-name:hover,.site-handle:hover{color:var(--blue)}.nav-list{gap:20px;padding:0;list-style:none;display:flex}.nav-list a{color:var(--muted);font-size:.88rem;text-decoration:none}.nav-list a:hover,.nav-list a[aria-current=page]{color:var(--ink)}.theme-toggle{width:32px;height:32px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:50%;padding:0;position:relative}.theme-toggle:hover{color:var(--ink);background:var(--paper-deep)}.theme-toggle svg{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px;position:absolute;inset:7px}:root[data-theme=light] .theme-toggle .sun,:root[data-theme=dark] .theme-toggle .moon{opacity:1}:root[data-theme=light] .theme-toggle .moon,:root[data-theme=dark] .theme-toggle .sun{opacity:0}.simple-page{padding-top:clamp(44px,7vw,72px)}.home-content{max-width:700px}.plain-content{max-width:700px;font:1.09rem/1.72 var(--serif)}.plain-content p+p{margin-top:1.35em}.focus-quote{border-left:3px solid var(--gold);background:color-mix(in srgb, var(--paper-deep) 45%, transparent);margin-top:1.6em;padding:16px 20px;font-style:italic}.focus-quote footer{color:var(--muted);font:600 .78rem/1.4 var(--sans);letter-spacing:.02em;text-align:right;margin-top:10px}.focus-quote+p{margin-top:1.35em}.github-profile-link,.inline-brand-link{vertical-align:-.12em;align-items:center;gap:4px;display:inline-flex}.github-profile-link svg,.inline-brand-icon{flex:none;width:16px;height:16px}.github-profile-link svg{fill:currentColor}.inline-brand-icon-mai{width:34px}.inline-brand-icon.washu-logo{width:66px;mask-image:url(/images/logos/washu.svg)}img.inline-brand-icon{object-fit:contain}span.inline-brand-icon{background:currentColor;display:inline-block;mask:none 50%/contain no-repeat}.inline-brand-icon.brand-icon-copilot{mask-image:url(/images/logos/github-copilot.svg)}.inline-brand-icon.brand-icon-openai{mask-image:url(/images/logos/openai.svg)}.inline-brand-icon.brand-icon-anthropic{mask-image:url(/images/logos/anthropic.svg)}.public-work-section{border-top:1px solid var(--line);margin-top:clamp(52px,8vw,80px);padding-top:30px}.public-work-section h2,.projects-section h2{font:600 clamp(1.65rem, 4vw, 2rem)/1.2 var(--serif);letter-spacing:-.02em}.public-work-section>p{color:var(--muted);font:.92rem/1.6 var(--sans);margin-top:10px}.public-work-list{margin-top:20px;padding:0;list-style:none}.public-work-list li{border-bottom:1px solid color-mix(in srgb, var(--line) 55%, transparent)}.public-work-list li:last-child{border-bottom:0}.public-work-list a{color:var(--ink);grid-template-columns:38px 1fr 18px;align-items:center;gap:13px;padding-block:16px;text-decoration:none;display:grid}.public-work-list a:hover{color:var(--blue)}.public-work-list strong,.public-work-list small{display:block}.public-work-list strong{font:650 1rem/1.4 var(--sans)}.public-work-list small{color:var(--muted);font:.84rem/1.5 var(--sans);margin-top:3px}.public-work-icon{width:38px;height:38px;color:var(--blue);place-items:center;display:grid}.public-work-icon img{object-fit:contain;width:24px;height:24px}.public-work-arrow{fill:none;width:17px;height:17px;stroke:var(--muted);stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round}.public-work-list a:hover .public-work-arrow{stroke:var(--blue)}.oss-contributions{margin-top:30px}.oss-contributions h3{font:600 1.18rem/1.35 var(--serif)}.oss-contribution-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px;padding:0;list-style:none;display:grid}.oss-contribution-list a{height:100%;color:var(--ink);border:1px solid var(--line);background:color-mix(in srgb, var(--paper-deep) 40%, transparent);border-radius:6px;grid-template-columns:32px 1fr;align-items:start;gap:10px;padding:13px;text-decoration:none;display:grid}.oss-contribution-list a:hover{color:var(--blue);border-color:color-mix(in srgb, var(--blue) 45%, var(--line))}.oss-contribution-list strong,.oss-contribution-list small{display:block}.oss-contribution-list strong{font:650 .9rem/1.4 var(--sans)}.oss-contribution-list small{color:var(--muted);font:.78rem/1.45 var(--sans);margin-top:3px}.oss-contribution-icon{width:32px;height:32px;color:var(--blue);place-items:center;display:grid}.oss-contribution-icon img{object-fit:contain;border-radius:6px;width:30px;height:30px;padding:1px}.projects-section{border-top:1px solid var(--line);margin-top:clamp(52px,8vw,80px);padding-top:30px}.project-category{margin-top:34px}.project-category>h3{color:var(--muted);border-bottom:1px solid var(--line);font:650 1.3rem/1.35 var(--sans);letter-spacing:.02em;align-items:center;gap:10px;padding-bottom:12px;display:flex}.project-category>h3 svg{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:22px;height:22px}.project-list{margin:0;padding:0;list-style:none}.project-item{border-bottom:1px solid color-mix(in srgb, var(--line) 55%, transparent);padding-block:20px}.project-item[id]{scroll-margin-top:24px}.project-item:last-child{border-bottom:0}.project-title-row{flex-wrap:wrap;align-items:center;gap:7px 10px;display:flex}.project-title-row h4{font:600 1.08rem/1.35 var(--sans);margin:0}.project-website-label{color:var(--muted);font:.76rem var(--mono)}.project-status{font:650 .66rem/1.4 var(--sans);letter-spacing:.02em;border-radius:999px;align-items:center;gap:4px;padding:2px 7px;display:inline-flex}.project-status svg{fill:none;stroke:currentColor;stroke-width:1.9px;stroke-linecap:round;stroke-linejoin:round;width:12px;height:12px}.project-status-experimental{color:var(--gold);border:1px solid color-mix(in srgb, var(--gold) 38%, var(--line));background:color-mix(in srgb, var(--gold) 8%, transparent)}.project-status-mentored{color:var(--blue);border:1px solid color-mix(in srgb, var(--blue) 35%, var(--line));background:color-mix(in srgb, var(--blue) 7%, transparent)}.project-item p{max-width:650px;color:var(--muted);font:.94rem/1.65 var(--sans);margin-top:7px}.project-links{align-items:center;gap:8px;display:inline-flex}.project-links a{color:var(--muted);padding:2px;text-decoration:none;display:inline-flex}.project-links a:hover{color:var(--blue)}.project-links svg{width:16px;height:16px}.project-links .github-icon{fill:currentColor}.project-links .website-icon{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round}.writing-list{padding:0;list-style:none}.writing-list li{border-bottom:1px solid color-mix(in srgb, var(--line) 38%, transparent);justify-content:space-between;align-items:baseline;gap:28px;padding-block:15px;display:flex}.writing-list li:last-child{border-bottom:0}.writing-list a{color:var(--ink);font-family:var(--serif);font-size:1.08rem;text-decoration:none}.writing-list a:hover{color:var(--blue)}.writing-list time{color:var(--muted);font:.82rem var(--mono);flex:none}.site-footer{color:var(--muted);border-top:1px solid var(--line);font:.76rem var(--mono);margin-top:72px;padding-block:22px 30px}.footer-inner{justify-content:space-between;align-items:center;gap:24px;display:flex}.footer-socials{align-items:center;gap:13px;display:flex}.footer-icon{color:var(--muted);text-decoration:none;display:inline-flex}.footer-icon:hover{color:var(--blue)}.footer-icon svg{fill:currentColor;width:17px;height:17px}@media (width<=620px){:root{--shell:min(100% - 28px, 780px)}.header-inner{grid-template-columns:1fr auto;gap:10px;padding-block:11px 8px}.header-inner nav{order:3;grid-column:1/-1}.nav-list{gap:19px}.theme-toggle{justify-self:end}.simple-page{padding-top:40px}.plain-content{font-size:1.04rem}.writing-list li{flex-direction:column;align-items:flex-start;gap:4px}.oss-contribution-list{grid-template-columns:1fr}.site-footer{margin-top:56px}}}@layer content{.post-page{padding-top:clamp(44px,7vw,72px)}.post-header{max-width:700px;margin-bottom:36px}.post-header h1{font:600 clamp(2rem, 5vw, 3rem)/1.08 var(--serif);letter-spacing:-.035em}.post-header .post-meta{color:var(--muted);font:.78rem var(--mono);margin-top:14px}.article-toc{border:1px solid var(--line);background:color-mix(in srgb, var(--paper-deep) 45%, transparent);border-radius:6px;max-width:700px;margin-bottom:38px;padding:18px 22px}.article-toc>p{color:var(--muted);font:700 .72rem var(--mono);letter-spacing:.08em;text-transform:uppercase}.prose .article-toc ol{margin:12px 0 0;padding-left:0;list-style:none}.prose .article-toc li{color:var(--muted);font:.9rem/1.55 var(--sans);padding-left:0;list-style:none}.article-toc li+li{margin-top:.3em}.article-toc .toc-subsection{margin-left:1em;font-size:.84rem}.article-toc a{color:var(--muted);text-decoration:none}.article-toc a:hover{color:var(--blue)}.prose{max-width:700px;font:1.04rem/1.8 var(--serif)}.prose>*+*{margin-top:1.35em}.prose [data-footnote-ref]{text-underline-offset:.16em;padding-inline:.08em;font-size:.78em;font-weight:650;text-decoration-thickness:1px}.prose .footnotes{color:var(--muted);border-top:1px solid var(--line);font:.88rem/1.65 var(--serif);margin-top:3em;padding-top:1.4em}.prose .footnotes>h2{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.prose .footnotes ol{margin:0;padding-left:1.5em}.prose .footnotes li+li{margin-top:.7em}.prose [data-footnote-backref]{font-family:var(--sans);margin-left:.2em;text-decoration:none}.prose h2,.prose h3{font-family:var(--serif);scroll-margin-top:30px}.prose h2{border-top:1px solid var(--line);margin-top:2.3em;padding-top:.7em;font-size:1.75rem}.prose h3{margin-top:1.9em;font-size:1.3rem}.prose .heading-link{color:inherit;text-decoration:none}.prose .heading-link:after{color:var(--muted);content:"#";opacity:0;font:.7em var(--sans);margin-left:.35em}.prose .heading-link:hover:after,.prose .heading-link:focus-visible:after{opacity:1}.prose ul,.prose ol{padding-left:1.35em}.prose li+li{margin-top:.35em}.prose blockquote{color:var(--muted);border-left:3px solid var(--gold);padding-left:20px;font-style:italic}.prose img{height:auto;margin-inline:auto}.prose .image-lightbox-trigger{cursor:zoom-in}.prose .image-lightbox-trigger:focus-visible{outline:2px solid var(--blue);outline-offset:4px}.prose figure{margin-block:2.2em}.prose figure>img,.prose figure>a>img{border:1px solid var(--line);border-radius:6px}.prose .diagram-figure>img{border:0;border-radius:0}.prose figure>a{display:block}.prose figcaption{max-width:620px;color:var(--muted);font:.72rem/1.5 var(--mono);text-align:center;margin:10px auto 0}.project-shot-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin-block:2.2em;display:grid}.project-shot-grid figure{min-width:0;margin:0}.project-shot-grid img{width:100%}@media (width<=620px){.project-shot-grid{grid-template-columns:1fr;gap:26px}}.prose blockquote strong{color:var(--ink);font-size:1.08em}.prose table{border-collapse:collapse;width:100%;font-family:var(--sans);font-size:.88rem;display:block;overflow-x:auto}.prose th,.prose td{border:1px solid var(--line);text-align:left;padding:9px 12px}.prose th{background:var(--paper-deep)}.prose :not(pre)>code{overflow-wrap:anywhere;color:var(--blue);background:var(--code);border-radius:3px;padding:.12em .35em;font-size:.86em}.prose pre{border:1px solid var(--line);border-radius:5px;padding:18px;position:relative;overflow:auto}.prose pre code{font-size:.82rem;line-height:1.65}:root[data-theme=dark] .astro-code,:root[data-theme=dark] .astro-code span{color:var(--shiki-dark)!important;background-color:var(--shiki-dark-bg)!important}.image-lightbox{width:min(96vw,1800px);max-width:none;height:min(94vh,1200px);max-height:none;color:var(--ink);border:1px solid var(--line);background:var(--paper);border-radius:8px;padding:46px 18px 18px}.image-lightbox::backdrop{background:#000000d1}.image-lightbox[open]{grid-template-rows:minmax(0,1fr) auto;gap:12px;display:grid}.image-lightbox img{object-fit:contain;width:100%;height:100%}.image-lightbox-close{color:var(--muted);font:30px/1 var(--sans);cursor:pointer;background:0 0;border:0;padding:0 8px 3px;position:absolute;top:7px;right:11px}.image-lightbox-close:hover{color:var(--ink)}.image-lightbox-original{color:var(--blue);font:.78rem var(--mono);justify-self:center}body:has(.image-lightbox[open]){overflow:hidden}.copy-code{color:var(--muted);border:1px solid var(--line);background:var(--paper);font:.62rem var(--mono);cursor:pointer;opacity:0;padding:4px 7px;position:absolute;top:7px;right:7px}.prose pre:hover .copy-code,.copy-code:focus-visible{opacity:1}@media (width<=620px){.copy-code{opacity:1}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}}
