@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/fef07dbb0973bf53-s.00az9qtie3ho1.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/8a480f0b521d4e75-s.3j-a226dh71aj.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/53b9e256198e5412-s.2gwoz23eiro2t.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7178b3e590c64307-s.0i3h3th1vs4m7.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/caa3a2e1cccd8315-s.p.0zr6hhvz-h9nw.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Fallback;src:local(Arial);ascent-override:95.94%;descent-override:28.16%;line-gap-override:0.0%;size-adjust:104.76%}.geist_79212fd5-module__RPVjva__className{font-family:Geist,Geist Fallback;font-style:normal}.geist_79212fd5-module__RPVjva__variable{--font-body:"Geist", "Geist Fallback"}
@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/5ce348bf30bf5439-s.27spqqad3wyeo.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/4fa387ec64143e14-s.3f4zuumv8svu0.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/6306c77e7c8268e4-s.34r5yzckw0h2s.woff2)format("woff2");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7d817b4c03b0c5f1-s.2jyz_zw3a8jit.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/bbc41e54d2fcbd21-s.30bdpjkrtcces.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/797e433ab948586e-s.p.1v5bejj26fx9h.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Fallback;src:local(Arial);ascent-override:74.67%;descent-override:21.92%;line-gap-override:0.0%;size-adjust:134.59%}.geist_mono_2031e398-module__5g4JGq__className{font-family:Geist Mono,Geist Mono Fallback;font-style:normal}.geist_mono_2031e398-module__5g4JGq__variable{--font-mono:"Geist Mono", "Geist Mono Fallback"}
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#fff;--fg:#171717;--muted:#666;--line:#e6e6e6;--code-bg:#f7f7f7;--body-text:#525252;--hover:#f7f7f7;--selection:#e8e8e8;--underline:#bbb;--ease-out:cubic-bezier(.22, 1, .36, 1)}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111;--fg:#ededed;--muted:#a3a3a3;--line:#2b2b2b;--code-bg:#191919;--body-text:#c2c2c2;--hover:#1b1b1b;--selection:#3b3b3b;--underline:#666}*,:before,:after{box-sizing:border-box}*{margin:0;padding:0}html{-webkit-font-smoothing:antialiased;scroll-behavior:smooth;scroll-padding-top:32px}body{background:var(--bg);color:var(--fg);font:15px/1.75 var(--font-body), sans-serif;min-height:100dvh;transition:background-color .18s,color .18s}a{color:inherit;text-decoration:none}.external-link:is(:hover,:focus-visible){color:var(--fg)}.text-link{color:inherit;text-underline-offset:4px;-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:2px;text-decoration:none}.text-link:hover,.text-link:focus-visible,.prose a:hover,.prose a:focus-visible{color:var(--fg);background-color:var(--selection);text-decoration:underline;-webkit-text-decoration-color:var(--fg);text-decoration-color:var(--fg)}.external-link__icon{opacity:0;width:.8em;transition:opacity .16s ease, transform .18s var(--ease-out);margin-left:.2em;font-size:.85em;line-height:1;text-decoration:none;display:inline-block;transform:translate(-2px,2px)}.external-link__icon:before{content:"";background:currentColor;width:1em;height:1em;display:block;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 15'%3E%3Cpath d='M4 3.5h7.5V11M3.5 11.5l8-8' fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 15'%3E%3Cpath d='M4 3.5h7.5V11M3.5 11.5l8-8' fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 50%/contain no-repeat}.external-link:hover .external-link__icon,.external-link:focus-visible .external-link__icon{opacity:1;transform:translate(0)}.text-link.external-link,.prose .external-link{position:relative}.text-link.external-link>.external-link__icon,.prose .external-link>.external-link__icon{width:auto;margin-left:1px;font-size:10px;position:absolute;top:-.5em;left:100%}img{max-width:100%;height:auto;display:block}svg{flex-shrink:0;width:14px;height:14px}h1,h2,h3{font-size:inherit;font-weight:500;line-height:1.5}::selection{background:var(--selection);color:var(--fg)}:focus-visible{outline:2px solid var(--fg);outline-offset:5px;border-radius:2px}.wrap{width:100%;max-width:688px;margin:0 auto;padding:0 32px}#nprogress .site-route-progress{z-index:1600;width:calc(100% - 64px);max-width:624px;height:2px;position:fixed;top:0;left:50%;overflow:hidden;transform:translate(-50%)}#nprogress .site-route-progress .bar{position:absolute}@media (max-width:600px){#nprogress .site-route-progress{width:calc(100% - 48px)}}@media (max-width:360px){#nprogress .site-route-progress{width:calc(100% - 40px)}}.skip{z-index:50;background:var(--fg);color:var(--bg);padding:10px 16px;position:fixed;top:-80px;left:20px}.skip:focus{top:12px}.top{border-bottom:1px solid var(--line);color:var(--muted);grid-template-columns:1fr auto auto;align-items:center;gap:20px;padding:32px 0 16px;font-size:13px;display:grid}.top__name,.top__nav a{align-items:center;gap:4px;min-height:44px;display:inline-flex}.top__name{font-family:var(--font-mono), monospace;font-size:12px}.top .top__name{gap:8px}.brand-mark{background:var(--fg);flex:0 0 32px;width:32px;height:32px;display:block;-webkit-mask:url(/brand/mark-v7.png) 50%/contain no-repeat;mask:url(/brand/mark-v7.png) 50%/contain no-repeat}.top__nav{align-items:center;gap:20px;display:flex}.top__nav a{position:relative}.top__nav a[aria-current]{color:var(--fg);font-weight:600}.top__nav a:after{content:"";opacity:0;background:currentColor;height:1px;transition:opacity .14s;position:absolute;bottom:3px;left:0;right:0}.top__nav a[aria-current]:after,.top__nav a:hover:after,.top__nav a:focus-visible:after{opacity:1}.theme-toggle{width:28px;height:36px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;transition:color .14s;display:inline-flex}.theme-toggle:hover{color:var(--fg)}.theme-toggle svg{width:12px;height:12px;transition:transform .24s var(--ease-out)}.theme-toggle:hover svg{transform:rotate(-12deg)}.top a:hover,.footer a:hover{color:var(--fg)}.home{padding-top:40px}.identity{align-items:center;gap:24px;margin-bottom:30px;display:flex}.identity img{object-fit:cover;object-position:center 28%;outline:1px solid var(--line);outline-offset:5px;border-radius:50%;flex-shrink:0;width:96px;height:96px}.identity h1{letter-spacing:-.04em;font-size:30px;line-height:1.2}.identity p{color:var(--muted);margin-top:8px;font-size:14px}.intro>p{color:var(--body-text);margin-top:15px}.intro>.availability{color:var(--muted);align-items:center;gap:8px;margin:0 0 16px;font-size:12px;display:flex}.availability>span{background:var(--muted);border-radius:50%;flex-shrink:0;width:6px;height:6px}.intro>.intro-lede{color:var(--fg);letter-spacing:-.025em;text-wrap:pretty;font-size:22px;font-weight:500;line-height:1.45}.intro>.intro-credentials{color:var(--muted);margin-top:18px;font-size:12px}.intro-actions{flex-wrap:wrap;align-items:center;gap:8px 22px;margin-top:24px;font-size:13px;display:flex}.intro-actions a{align-items:center;gap:7px;min-height:44px;display:inline-flex}.contact-button{background:var(--fg);color:var(--bg);border:1px solid var(--fg);transition:transform .2s var(--ease-out), box-shadow .2s ease;border-radius:5px;padding:0 16px}.contact-button:hover{box-shadow:0 3px 0 var(--line);transform:translateY(-1px)}.contact-button:active{box-shadow:none;transform:translateY(0)}.intro-github{color:var(--muted)}.section-nav{border-block:1px solid var(--line);color:var(--muted);flex-wrap:wrap;column-gap:22px;margin-top:28px;padding-block:8px;font-size:12px;display:flex}.section-nav a{align-items:center;min-height:44px;transition:color .18s;display:inline-flex;position:relative}.section-nav a:after{content:"";background:var(--fg);transform-origin:0;height:1px;transition:transform .22s var(--ease-out);position:absolute;bottom:4px;left:0;right:0;transform:scaleX(0)}.section-nav a:hover,.section-nav a:focus-visible{color:var(--fg)}.section-nav a:hover:after,.section-nav a:focus-visible:after{transform:scaleX(1)}.section-nav+.home-section{border-top:0;margin-top:0;padding-top:30px}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.inline-link{align-items:center;gap:5px;min-height:44px;margin-top:10px;display:inline-flex}.home-section{border-top:1px solid var(--line);margin-top:36px;padding-top:28px}.home-section>h2{color:var(--fg);letter-spacing:-.01em;margin-bottom:24px;font-size:14px;font-weight:500}.project-row{border-radius:5px;justify-content:space-between;align-items:flex-start;gap:16px;margin:0 -12px;padding:10px 12px;transition:background .14s;display:flex}.project-row:hover{background:var(--hover)}.project-summary{min-width:0}.project-title{font-size:15px;font-weight:500;display:block}.project-description{color:var(--muted);margin-top:3px;font-size:14px;display:block}.project-featured{padding-block:24px}.project-featured .project-title a{transition:color .16s}.project-featured:focus-within .project-title a{color:var(--fg)}.project-heading{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:4px 16px;display:flex}.project-heading>span{color:var(--muted);font-size:12px}.project-featured .project-title{letter-spacing:-.02em;font-size:18px}.project-featured .project-title a:hover{text-underline-offset:4px;text-decoration:underline}.project-featured .project-description{color:var(--body-text);margin-top:8px}.project-evidence{border-left:2px solid var(--fg);flex-wrap:wrap;gap:2px 8px;margin-top:14px;padding-left:12px;font-size:12px;display:flex}.project-evidence strong{font-weight:500}.project-evidence>span{color:var(--muted)}.project-stack{color:var(--muted);margin-top:14px;font-size:12px}.project-actions{flex-wrap:wrap;gap:0 22px;margin-top:8px;font-size:12px;display:flex}.project-actions a{align-items:center;gap:6px;min-height:44px;display:inline-flex}.project-actions a:not(:first-child){color:var(--muted)}.project-actions a:is(:hover,:focus-visible){color:var(--fg)}.project-actions a,.inline-link,.social-links a,.resume-link,.intro-github{text-decoration:none;position:relative}.project-actions a:after,.inline-link:after,.social-links a:after,.resume-link:after,.intro-github:after{content:"";opacity:0;pointer-events:none;background:currentColor;height:.5px;position:absolute;bottom:9px;left:0;right:0}.project-actions a:is(:hover,:focus-visible):after,.inline-link:is(:hover,:focus-visible):after,.social-links a:is(:hover,:focus-visible):after,.resume-link:is(:hover,:focus-visible):after,.intro-github:is(:hover,:focus-visible):after{opacity:1}.project-actions svg{width:13px;height:13px}.project-actions a>[aria-hidden=true],.project-link-icon{transition:transform .2s var(--ease-out)}.project-actions a:hover>[aria-hidden=true]:last-child{transform:translate(2px)}.project-row:hover .project-link-icon{transform:translate(2px,-2px)}.expandable-list>ul{list-style:none}.expandable-list__item{opacity:1;transition:grid-template-rows .36s var(--ease-out), opacity .24s ease;grid-template-rows:1fr;display:grid}.expandable-list__item[data-hidden=true]{opacity:0;grid-template-rows:0fr}.expandable-list__clip{min-height:0;overflow:hidden}.expandable-list__item[data-hidden=true] .expandable-list__clip{visibility:hidden;transition:visibility 0s .36s}.expandable-list__toggle{min-height:36px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;justify-content:space-between;align-items:center;gap:10px;margin:6px 0 0 -6px;padding:0 6px;font-size:12px;transition:color .18s,background-color .18s;display:inline-flex}.expandable-list__toggle:hover{color:var(--fg);background:var(--hover)}.expandable-list__toggle svg{width:12px;height:12px;transition:transform .36s var(--ease-out)}.theme-toggle:focus-visible,.expandable-list__toggle:focus-visible{outline-offset:2px}.expandable-list__toggle[aria-expanded=true] svg{transform:rotate(180deg)}.experience-list{margin-top:12px}.experience-list .expandable-list__content{color:var(--body-text);grid-template-columns:4px minmax(0,1fr);gap:12px;padding-top:9px;font-size:13px;display:grid}.experience-list .expandable-list__item:first-child .expandable-list__content{padding-top:0}.experience-list .expandable-list__content:before{content:"";background:var(--fg);border-radius:50%;width:3px;height:3px;margin-top:10px}.projects-list .expandable-list__item+.expandable-list__item .expandable-list__content{border-top:1px solid var(--line)}.projects-list .expandable-list__item:first-child .project-featured{padding-top:0}.projects-list .project-row{margin:0;padding:18px 0}.projects-list .project-row:hover{background:0 0}.projects-list .project-row:hover .project-title{color:var(--fg)}.projects-list .expandable-list__clip{margin-inline:-6px;padding-inline:6px}.project-link-icon{width:13px;height:13px;color:var(--muted);margin-top:6px}.project-detail-link{justify-content:center;align-items:flex-start;min-width:32px;min-height:44px;display:inline-flex}.writing-link{border-radius:5px;justify-content:space-between;align-items:baseline;gap:12px 24px;margin:0 -12px;padding:10px 12px;display:flex}.writing-link:hover{background:var(--hover)}.writing-link h3{font-size:15px}.writing-link p{color:var(--muted);margin-top:3px;font-size:14px}.writing-link time{color:var(--muted);white-space:nowrap;font-size:11px}.education h3{font-size:15px}.education-heading{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:4px 16px;display:flex}.education-heading>span{color:var(--muted);font-size:12px}.education p{color:var(--muted);margin-top:3px;font-size:14px}.education .education-honors{margin-top:12px}.technology-heading{margin-top:28px;font-size:14px}.technology-list>div{grid-template-columns:145px minmax(0,1fr);gap:18px;margin-top:14px;display:grid}.technology-list dt{color:var(--fg);font-size:13px;font-weight:400}.technology-list dd{color:var(--muted);font-size:13px}.jobs{gap:24px;display:grid}.job+.job{border-top:1px solid var(--line);padding-top:24px}.job-heading{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:4px 18px;display:flex}.job-heading h3{letter-spacing:-.015em;font-size:16px}.job-heading>span{color:var(--muted);font-variant-numeric:tabular-nums;font-size:12px}.job-role{color:var(--muted);margin-top:2px;font-size:12px}.job-description{color:var(--muted);margin-top:8px;font-size:14px}.contact{margin-bottom:55px}.contact>h2{margin-bottom:6px}.contact-copy{color:var(--body-text);margin-top:12px;font-size:14px}.contact-email{min-height:44px;text-decoration:underline;-webkit-text-decoration-color:var(--underline);text-decoration-color:var(--underline);text-underline-offset:4px;align-items:center;gap:8px;margin:12px 0;display:inline-flex}.contact-address{flex-wrap:wrap;align-items:center;gap:0 18px;display:flex}.contact-alternate{color:var(--muted);margin-bottom:12px;font-size:12px}.contact-alternate a{color:var(--fg);text-decoration:underline;-webkit-text-decoration-color:var(--underline);text-decoration-color:var(--underline);text-underline-offset:3px}.copy-email button{min-height:44px;font:inherit;color:var(--muted);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;font-size:12px;display:inline-flex}.copy-email button:hover{color:var(--fg)}.copy-email svg{width:13px;height:13px}.copy-email__error{color:var(--muted);max-width:260px;font-size:12px;display:block}.contact .social-links{margin-top:8px}.social-links{flex-wrap:wrap;gap:8px 24px;display:flex}.social-links a{align-items:center;gap:8px;min-height:44px;font-size:14px;display:inline-flex}.social-links svg{color:currentColor;width:16px;height:16px}.footer{border-top:1px solid var(--line);color:var(--muted);justify-content:space-between;align-items:center;gap:16px;padding:17px 0 32px;font-size:11px;display:flex}.footer a{align-items:center;min-height:44px;display:inline-flex}.page{min-height:55vh;margin:48px auto 70px}.page>h1,.page>section>h1{letter-spacing:-.035em;margin-bottom:24px;font-size:24px}.backlink{min-height:44px;color:var(--muted);align-items:center;margin-bottom:24px;font-size:12px;display:inline-flex}.backlink:hover{color:var(--fg)}.pagehead{margin-bottom:32px}.pagehead__label{color:var(--muted);margin-bottom:8px;font-size:12px;display:block}.pagehead__title{letter-spacing:-.04em;overflow-wrap:anywhere;margin-bottom:12px;font-size:32px;line-height:1.25}.pagehead__lede{color:var(--muted);font-size:16px}.pagehead__meta{color:var(--muted);flex-wrap:wrap;gap:8px 16px;margin-top:16px;font-size:11px;display:flex}.pagehead__meta a{color:var(--fg);text-underline-offset:4px;text-decoration:underline;-webkit-text-decoration-color:var(--underline);text-decoration-color:var(--underline)}.project-contact{border-top:1px solid var(--line);margin-top:40px;padding-top:24px}.project-contact>p{font-size:16px;font-weight:500}.project-contact>span{color:var(--muted);font-size:13px}.project-contact>div{flex-wrap:wrap;gap:8px 24px;font-size:13px;display:flex}.prose{color:var(--body-text);font-size:15px;line-height:1.85}.prose h2{color:var(--fg);letter-spacing:-.025em;margin:32px 0 12px;font-size:18px}.prose h3{color:var(--fg);margin:24px 0 10px;font-size:15px}.prose p+p{margin-top:16px}.prose strong{color:var(--fg);font-weight:500}.prose a,.u{text-decoration:underline;-webkit-text-decoration-color:var(--underline);text-decoration-color:var(--underline);text-underline-offset:4px}.prose a:hover,.u:hover{color:var(--fg);text-decoration-color:currentColor}.prose ul,.prose ol{margin:16px 0 20px 20px}.prose li+li{margin-top:6px}.prose blockquote{border-left:2px solid var(--line);margin:24px 0;padding-left:20px}.prose code{font-family:var(--font-mono), monospace;color:var(--fg);background:var(--code-bg);overflow-wrap:anywhere;padding:2px 4px;font-size:.85em}.prose pre{border:1px solid var(--line);border-radius:4px;margin:24px 0;padding:18px;line-height:1.75;overflow-x:auto;background:var(--code-bg)!important}.prose pre code{overflow-wrap:normal;background:0 0;padding:0}.prose img{width:100%;height:auto}.prose hr{border:0;border-top:1px solid var(--line);margin:32px 0}.prose table{border-collapse:collapse;margin:24px 0;font-size:12px;display:block;overflow-x:auto}.prose th,.prose td{text-align:left;border:1px solid var(--line);padding:10px 14px}.shiki,.shiki span{color:var(--shiki-light)}[data-theme=dark] .shiki,[data-theme=dark] .shiki span{color:var(--shiki-dark)}.year__items{list-style:none}.year{grid-template-columns:50px 1fr;gap:24px;margin-top:24px;display:grid}.year__label{color:var(--muted);padding-top:18px;font-size:12px}.row{border-top:1px solid var(--line);grid-template-columns:1fr auto;gap:5px 16px;padding:16px 0;display:grid}.row__title{font-weight:500}.row:hover .row__title{text-underline-offset:4px;text-decoration:underline}.row__desc{color:var(--muted);grid-column:1;font-size:13px}.row__meta{color:var(--muted);grid-area:1/2;font-size:11px}.sub{color:var(--muted)}.not-found{min-height:65vh;padding:80px 0}.eyebrow{color:var(--muted);font-size:12px}.not-found__title{letter-spacing:-.03em;margin:16px 0;font-size:24px}.not-found__desc{color:var(--muted);margin-bottom:24px}.button{text-underline-offset:4px;align-items:center;gap:8px;min-height:44px;text-decoration:underline;display:inline-flex}@media (max-width:600px){html{scroll-padding-top:24px}.wrap{padding-inline:24px}.top{padding-top:18px}.top__nav{gap:12px}.home{padding-top:34px}.identity{gap:18px}.identity img{width:80px;height:80px}.identity h1{font-size:26px}.identity p{margin-top:6px;font-size:13px;line-height:1.6}.intro>.intro-lede{font-size:20px}.intro-actions{column-gap:16px}.section-nav{column-gap:18px;padding-block:4px}.technology-list>div{grid-template-columns:1fr;gap:3px}.home-section{margin-top:30px;padding-top:24px}.contact{margin-bottom:35px}.job-heading>span{font-size:11px}.writing-link{flex-direction:column;gap:5px}.page{margin-top:30px}.pagehead__title{font-size:28px}.year{grid-template-columns:1fr;gap:8px}.year__label{padding-top:8px}}@media (max-width:360px){.wrap{padding-inline:20px}.social-links{column-gap:20px}.identity{gap:14px}.identity h1{font-size:24px}}@media (pointer:coarse){.theme-toggle{width:44px;height:44px}.expandable-list__toggle{min-height:44px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important}.contact-button:hover,.theme-toggle:hover svg,.project-actions a:hover>[aria-hidden=true]:last-child,.project-row:hover .project-link-icon{transform:none}}.writing-pagehead{margin-bottom:36px}.writing-pagehead .inline-link{font-size:13px}.writing-index{margin:0;padding:0;list-style:none}.writing-index>li{border-top:1px solid var(--line)}.writing-index__link{padding:28px 0;text-decoration:none;display:block}.writing-index__link time,.writing-index__read{color:var(--muted);font-size:12px}.writing-index__link h2{color:var(--fg);letter-spacing:-.025em;margin:8px 0;font-size:20px;line-height:1.4}.writing-index__link p{color:var(--muted);margin:0 0 14px;font-size:14px;line-height:1.7}.writing-index__link:hover h2{text-underline-offset:4px;text-decoration:underline;text-decoration-thickness:1px}.writing-index__read{align-items:center;gap:8px;display:flex}.article-tags{color:var(--muted);margin-top:14px;font-size:12px}.writing-article-head{border-bottom:1px solid var(--line);margin-bottom:32px;padding-bottom:28px}.writing-article-head .article-tags{margin-bottom:0}.article-media{margin:28px 0}.article-media img,.article-media video{border-radius:4px;width:100%;height:auto;display:block}.article-media video{background:#111;max-height:75vh}.article-media figcaption,.article-code figcaption{color:var(--muted);margin-top:10px;font-size:12px;line-height:1.6}.article-code{margin:24px 0}.video-transcript{margin-top:16px;font-size:13px}.video-transcript summary{cursor:pointer;color:var(--muted)}.video-transcript p{white-space:pre-wrap}.article-end{border-top:1px solid var(--line);color:var(--muted);margin-top:48px;padding-top:24px;font-size:13px;line-height:1.8}.article-end div{color:var(--fg);flex-wrap:wrap;gap:24px;margin-top:12px;display:flex}.article-sharing{margin-top:24px}.share-links{color:var(--muted);flex-wrap:wrap;align-items:center;gap:0;font-size:12px;display:flex}.share-links__label{color:var(--fg);margin:0 0 8px;font-size:13px;font-weight:600}.share-links button,.share-links a{min-height:40px;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:6px;padding:0;text-decoration:none;display:inline-flex}.share-links button:hover,.share-links a:hover{color:var(--fg)}.share-links svg{flex-shrink:0;width:13px;height:13px}.share-manual{color:var(--muted);gap:8px;margin-top:10px;font-size:12px;display:grid}.share-manual input{border:1px solid var(--line);background:var(--bg);width:100%;min-width:0;color:var(--fg);font:inherit;border-radius:4px;padding:10px 12px}.article-share-end{margin-top:40px}.article-share-end .article-sharing{margin-top:0}.article-share-end+.article-end{margin-top:20px}.article-cover{margin:0 0 36px}.article-cover img{object-fit:contain;background:var(--code-bg);border:1px solid var(--line);border-radius:6px;width:100%;height:auto;max-height:520px}.article-media{min-width:0;max-width:100%}.article-media img{max-width:100%}.article-media figcaption{overflow-wrap:anywhere}.media-unavailable{border:1px solid var(--line);color:var(--muted);border-radius:4px;padding:20px;font-size:13px}.prose{overflow-wrap:anywhere}.prose .heading-link{color:var(--muted);opacity:0;margin-left:.4em;font-size:.8em;text-decoration:none}.prose :is(h1,h2,h3,h4,h5,h6):hover .heading-link,.prose .heading-link:focus-visible{opacity:1}.prose .heading-link:hover,.prose .heading-link:focus-visible{text-underline-offset:5px;background:0 0;text-decoration:underline;text-decoration-thickness:1px}.prose pre{max-width:100%}.prose pre code{white-space:pre}.writing-load{margin-top:12px}.writing-load__button{border:1px solid var(--line);width:100%;min-height:44px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border-radius:4px;justify-content:center;align-items:center;gap:12px;padding:12px 16px;font-size:13px;display:flex}.writing-load__button:hover{background:var(--hover);color:var(--fg)}.writing-load__button:disabled{opacity:.6;cursor:wait}.writing-load__message{color:var(--muted);margin-top:12px;font-size:12px}.writing-pagination{border-top:1px solid var(--line);color:var(--muted);grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;margin-top:24px;padding-top:16px;font-size:12px;display:grid}.writing-pagination>:last-child{justify-self:end}.pagination-numbers{flex-wrap:wrap;justify-content:center;align-items:center;gap:2px;display:flex}.pagination-numbers a,.pagination-gap{justify-content:center;align-items:center;min-width:32px;height:40px;display:inline-flex}.pagination-numbers a[aria-current=page]{color:var(--fg);text-underline-offset:6px;text-decoration:underline;text-decoration-thickness:1px}.pagination-direction{white-space:nowrap;align-items:center;min-height:44px;display:flex}.writing-pagination a:hover{color:var(--fg)}@media (max-width:480px){.article-cover img{max-height:380px}.writing-pagination{grid-template-columns:1fr 1fr}.pagination-numbers{grid-area:1/1/auto/-1}}.share-links>:not(:first-child):before{content:"";background:var(--line);width:1px;height:14px;margin-right:14px;display:block}.share-links>:not(:first-child){margin-left:14px}.share-links button:disabled{cursor:wait}.article-sharing{border-top:1px solid var(--line);padding-top:18px}@media (max-width:380px){.share-links>:not(:first-child){margin-left:10px}.share-links>:not(:first-child):before{margin-right:10px}}.article-share-end .article-sharing{border-top:0;padding-top:0}.article-next{border-top:1px solid var(--line);color:var(--muted);flex-wrap:wrap;justify-content:space-between;gap:12px 24px;margin-top:20px;padding-top:20px;font-size:13px;display:flex}.article-next a{align-items:center;min-height:44px;display:inline-flex}.article-next a:hover{color:var(--fg)}
