@font-face{font-family:Geist;src:url(/fonts/geist/Geist.woff2)format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:Geist Mono;src:url(/fonts/geist/GeistMono.woff2)format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:Geist Pixel;src:url(/fonts/geist/GeistPixel-Square.woff2)format("woff2");font-style:normal;font-weight:400;font-display:swap}:root{--paper:#f7f6f2;--ink:#20201e;--muted:#73716b;--faint:#aaa79f;--rule:#d8d5cd;--accent:#214ecf;--code:#ebe9e2;--ease-out:cubic-bezier(.23, 1, .32, 1);--ease-in-out:cubic-bezier(.77, 0, .175, 1);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--paper:#171715;--ink:#f0eee7;--muted:#aaa79f;--faint:#696761;--rule:#3d3b36;--accent:#89a4ff;--code:#272621;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--paper);color:var(--ink);transition:background-color .18s var(--ease-out), color .18s var(--ease-out);margin:0;font-family:Geist,sans-serif;font-size:clamp(1rem,.95rem + .2vw,1.1rem);line-height:1.72}img{max-width:100%;display:block}::selection{background:var(--ink);color:var(--paper)}a{color:var(--accent);-webkit-text-decoration-color:color-mix(in srgb, var(--accent), transparent 55%);text-decoration-color:color-mix(in srgb, var(--accent), transparent 55%);text-underline-offset:.22em;text-decoration-thickness:1px}a:focus-visible,button:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.skip-link{z-index:20;background:var(--ink);color:var(--paper);padding:.35rem .55rem;font-family:Geist Mono,monospace;font-size:.75rem;position:fixed;top:1rem;left:1rem;transform:translateY(-200%)}.skip-link:focus{transform:translateY(0)}.document{width:min(100% - 2.5rem,43rem);margin-inline:auto;padding-block:2rem 5rem}.document-header{border-bottom:1px solid var(--rule);animation:header-in .36s var(--ease-out) both;justify-content:space-between;align-items:baseline;gap:1.5rem;padding-bottom:1rem;font-family:Geist Mono,monospace;font-size:.72rem;display:flex}.file-path{color:var(--muted);margin:0}.document-header nav{flex-wrap:wrap;gap:1rem;display:flex}.document-header nav a{text-decoration:none;transition:color .16s;position:relative}.document-header nav a:after{content:"";transform-origin:100%;height:1px;transition:transform .18s var(--ease-out);background:currentColor;position:absolute;bottom:-.22rem;left:0;right:0;transform:scaleX(0)}.document-header nav a:focus-visible:after{transform-origin:0;transform:scaleX(1)}.header-actions{align-items:baseline;gap:1rem;display:flex}.theme-toggle{width:1.5rem;height:1.5rem;color:var(--muted);cursor:pointer;transition:color .16s ease, transform .14s var(--ease-out);background:0 0;border:0;place-items:center;padding:.2rem;display:grid}.theme-toggle:active{transform:scale(.97)}.theme-icon{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7px;width:1rem;height:1rem;transition:opacity .16s ease, transform .22s var(--ease-out)}@starting-style{.theme-icon{opacity:0;transform:rotate(-24deg)scale(.88)}}.theme-icon--moon{fill:currentColor;stroke:none}.document-header a,footer a{color:var(--muted)}.page-content{padding-top:clamp(5rem,15vw,9rem)}.page-content section{scroll-margin-top:2rem}.page-content section+section{margin-top:clamp(5rem,12vw,7.5rem)}.intro{margin-top:0}.intro>*{animation:content-in .44s var(--ease-out) both}.intro>:nth-child(2){animation-delay:45ms}.intro>:nth-child(3){animation-delay:90ms}.intro>:nth-child(4){animation-delay:.135s}h1,h2{font-family:Geist Pixel,Geist Mono,monospace;font-weight:400;line-height:1.1}.work-heading{animation:content-in .44s var(--ease-out) .18s both}.fonts-loading .document-header,.fonts-loading .intro>*,.fonts-loading .work-heading{animation-play-state:paused}.section-heading-motion{display:flow-root}h1{letter-spacing:-.035em;margin:0;font-size:clamp(2.8rem,10vw,5rem)}h1 span,h2 span,h3 span{color:var(--faint)}h2{letter-spacing:-.02em;margin:0 0 2.5rem;font-size:clamp(1.65rem,5vw,2.15rem)}h3{letter-spacing:-.025em;margin:0;font-size:1.3rem;font-weight:590;line-height:1.3}.lead{letter-spacing:-.035em;max-width:28ch;margin:2.5rem 0 1.5rem;font-size:clamp(1.55rem,4.5vw,2.15rem);font-weight:510;line-height:1.28}.intro>p:not(.lead,.status),.page-content section>p,.entry>p,.job p{text-wrap:pretty}.status{color:var(--muted);align-items:baseline;gap:.6rem;margin-top:2rem;font-family:Geist Mono,monospace;font-size:.76rem;display:flex}.status-dot{background:#4d8c55;border-radius:50%;flex:none;width:.45rem;height:.45rem;position:relative}.status-dot:after{border-radius:inherit;content:"";animation:status-ring 1.4s var(--ease-out) .38s 2 both;border:1px solid #4d8c55;position:absolute;inset:0}hr{border:0;border-top:1px solid var(--rule);margin:clamp(4rem,12vw,7rem) 0 0}.entry{border-top:1px solid var(--rule);padding-block:2rem}.entry:last-child{border-bottom:1px solid var(--rule)}.entry-label,.job-date,.job-title,.note,.back-link,.blog-post-date,footer{font-family:Geist Mono,monospace;font-size:.73rem}.entry-label{color:var(--accent);margin:0 0 .65rem}.entry p:not(.entry-label){margin:1rem 0 0}.entry strong{font-weight:590}.project{border-top:1px solid var(--rule);padding-block:2.5rem;position:relative}.project:has(.highlight-preview[data-state=open]){z-index:10}.project:last-child{border-bottom:1px solid var(--rule)}.project-heading{justify-content:space-between;align-items:flex-start;gap:2rem;display:flex}.project-heading .entry-label{margin-bottom:.65rem}.project-heading>a{flex:none;font-family:Geist Mono,monospace;font-size:.72rem}.project>p{text-wrap:pretty;max-width:38rem;margin:1.25rem 0 0}.project-gallery-motion .highlight-menu{margin-top:2rem}.project-heading>a,.links a{transition:color .16s ease, transform .16s var(--ease-out);display:inline-block}.project-heading>a:active,.links a:active{transform:scale(.97)}.highlight-menu{margin-top:2rem;position:relative}.highlight-hint{color:var(--muted);margin:0 0 .55rem;font-family:Geist Mono,monospace;font-size:.68rem}.highlight-strip{scrollbar-color:var(--rule) transparent;scrollbar-width:thin;grid-auto-columns:3.35rem;grid-auto-flow:column;justify-content:start;gap:.4rem;padding:.2rem .15rem .55rem;display:grid;overflow-x:auto}.highlight-trigger{border:1px solid var(--rule);background:var(--code);cursor:pointer;width:3.35rem;height:2.7rem;transition:border-color .16s ease, opacity .16s ease, transform .16s var(--ease-out);border-radius:.3rem;padding:0;position:relative;overflow:hidden}.highlight-trigger:focus-visible,.highlight-trigger[data-active=true]{border-color:var(--ink);opacity:1;transform:translateY(-2px)}.highlight-trigger:not(:focus-visible,[data-active=true]){opacity:.68}.highlight-trigger:active{transform:translateY(0)scale(.97)}.highlight-trigger img{object-fit:cover;object-position:top;width:100%;height:100%}.highlight-preview{z-index:5;width:min(20rem,100vw - 2rem);max-height:var(--preview-max-height,calc(100vh - 1rem));border:1px solid var(--rule);background:var(--paper);box-shadow:0 1rem 3rem color-mix(in srgb, var(--ink), transparent 82%);opacity:0;pointer-events:none;transform:translate3d(var(--preview-x,0), .45rem, 0) scale(.975);transform-origin:50% 100%;visibility:hidden;will-change:transform;border-radius:.55rem;padding:.45rem;transition:opacity .16s,transform .28s cubic-bezier(.22,1,.36,1),visibility 0s linear .28s;position:absolute;bottom:calc(100% + .55rem);left:0}.highlight-preview[data-state=open]{opacity:1;pointer-events:auto;transform:translate3d(var(--preview-x,0), 0, 0) scale(1);visibility:visible;transition:opacity .16s,transform .28s cubic-bezier(.22,1,.36,1),visibility}.highlight-preview[data-side=bottom]{transform:translate3d(var(--preview-x,0), -.45rem, 0) scale(.975);transform-origin:50% 0;top:calc(100% + .55rem);bottom:auto}.highlight-preview[data-side=bottom][data-state=open]{transform:translate3d(var(--preview-x,0), 0, 0) scale(1)}.highlight-preview-media{width:100%;max-height:calc(var(--preview-max-height,100vh) - 2.8rem);aspect-ratio:var(--preview-ratio,1 / 1);background:var(--code);border-radius:.3rem;display:grid;position:relative;overflow:hidden}.highlight-preview-media img{object-fit:contain;grid-area:1/1;width:100%;height:100%}.highlight-preview-image[data-direction=right]{animation:.26s cubic-bezier(.22,1,.36,1) preview-from-right}.highlight-preview-image[data-direction=left]{animation:.26s cubic-bezier(.22,1,.36,1) preview-from-left}.highlight-preview p{color:var(--muted);margin:.45rem .15rem .05rem;font-family:Geist Mono,monospace;font-size:.66rem;line-height:1.4}@keyframes preview-from-right{0%{opacity:0;transform:translate(18px)}}@keyframes preview-from-left{0%{opacity:0;transform:translate(-18px)}}.job{border-top:1px solid var(--rule);grid-template-columns:minmax(6.5rem,.45fr) minmax(0,1.55fr);gap:1.5rem;padding-block:2rem;display:grid}.job:last-child{border-bottom:1px solid var(--rule)}.job-date{color:var(--muted);margin:0}.job-title{color:var(--accent);margin:.35rem 0 1rem}.job div>p:not(.job-title,.note){margin:0}.job div>p:not(.job-title,.note)+p:not(.note){margin-top:1rem}.note{background:var(--code);color:var(--muted);margin:1rem 0 0;padding:.2rem .35rem;display:inline-block}.links{flex-wrap:wrap;gap:.5rem 1.5rem;margin:1.5rem 0 0;padding:0;font-family:Geist Mono,monospace;font-size:.82rem;list-style:none;display:flex}.links a:before{content:"[";color:var(--faint)}.links a:after{content:"]";color:var(--faint)}footer{border-top:1px solid var(--rule);color:var(--muted);justify-content:space-between;gap:1rem;margin-top:clamp(6rem,15vw,10rem);padding-top:1rem;display:flex}footer p{margin:0}.visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.post-list{margin:0;padding:0;list-style:none}.post-list-item{border-top:1px solid var(--rule);padding-block:2rem}.post-list-item:last-child{border-bottom:1px solid var(--rule)}.post-list-item article{padding:0}.post-list-item h2{letter-spacing:-.025em;margin:.8rem 0 0;font-family:Geist,sans-serif;font-size:clamp(1.35rem,4vw,1.7rem);font-weight:580;line-height:1.25}.post-list-item h2 a{color:var(--ink);text-decoration:none}.post-list-item h2 a:hover{color:var(--accent)}.post-list-item>article>p{color:var(--muted);text-wrap:pretty;margin:.8rem 0 0}.post-meta{color:var(--muted);justify-content:space-between;gap:1rem;font-family:Geist Mono,monospace;font-size:.69rem;display:flex}.post-meta span{color:var(--accent)}.blog-post-page{padding-top:clamp(2.75rem,7vw,4.5rem)}.blog-post-header h1{text-wrap:pretty;max-width:100%;margin-top:.9rem;font-size:clamp(2.1rem,6vw,3.1rem);line-height:1.08}.back-link{color:var(--muted);transition:color .16s ease, transform .16s var(--ease-out);margin-bottom:2rem;display:inline-block}.back-link:active{transform:translate(-2px)scale(.98)}.blog-post-meta{justify-content:space-between;align-items:baseline;gap:1rem;display:flex}.blog-post-meta .entry-label{margin:0}.blog-post-date{color:var(--muted);margin:0}.blog-article{border-top:1px solid var(--rule);margin-top:clamp(2.75rem,6vw,4rem);padding-top:clamp(2rem,4vw,2.75rem)}.blog-article h2,.blog-article h3,.blog-article h4{color:var(--ink);letter-spacing:-.025em;margin:2.5rem 0 .8rem;font-family:Geist,sans-serif;font-weight:620;line-height:1.25}.blog-article h2{font-size:clamp(1.45rem,4vw,1.65rem)}.blog-article h3{font-size:1.35rem}.blog-article p,.blog-article ul,.blog-article ol{text-wrap:pretty;margin-block:1rem}.blog-article>:first-child{margin-top:0}.blog-article ul,.blog-article ol{padding-left:1.35rem}.blog-article li+li{margin-top:.55rem}.blog-article :not(pre)>code{border:1px solid color-mix(in srgb, var(--ink), transparent 86%);background:color-mix(in srgb, var(--code), var(--paper) 24%);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:color-mix(in srgb, var(--ink), var(--accent) 16%);font-family:Geist Mono,monospace;font-size:.88em;line-height:inherit;white-space:normal;border-radius:.3rem;padding:.08em .3em}.blog-article blockquote{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);border-left:2px solid var(--accent);margin:1.75rem 0;padding:1.15rem 0 1.15rem 1rem}.blog-article blockquote p{margin:0}.blog-article blockquote p+p{color:var(--muted);margin-top:.55rem}.blog-article blockquote strong{color:var(--accent);font-family:Geist Mono,monospace;font-size:.82em}.code-block-wrapper{box-shadow:inset 0 1px 0 #ffffff0d, 0 .75rem 2rem color-mix(in srgb, var(--ink), transparent 94%);background:#22272e;border:1px solid #444c56;border-radius:.75rem;margin:1.75rem 0;position:relative;overflow:hidden}.code-block-wrapper:before{content:"";background:#2d333b;border-bottom:1px solid #444c56;height:2.35rem;display:block}.code-block-wrapper pre{scrollbar-color:#545d68 #22272e;scrollbar-width:thin;border-radius:0;max-width:100%;margin:0;padding:1.1rem 1.25rem 1.3rem;line-height:1.55;overflow:auto;color:#adbac7!important;background:#22272e!important}.code-block-wrapper code{font-family:Geist Mono,monospace;font-size:.78rem}.code-block-wrapper [data-line]{min-width:100%}.copy-button{color:#cdd9e5;cursor:pointer;min-width:3.8rem;transition:background-color .16s ease, transform .14s var(--ease-out);background:#373e47;border:1px solid #545d68;border-radius:.35rem;padding:.22rem .48rem;font-family:Geist Mono,monospace;font-size:.68rem;position:absolute;top:.46rem;right:.55rem}.copy-button[data-state=copied]{color:#b4f1b4;border-color:#46954a}.copy-button[data-state=error]{color:#ffd8d3;border-color:#e5534b}.copy-button:active{transform:scale(.97)}.blog-article iframe{border:1px solid var(--rule);background:#fff;border-radius:.4rem;width:100%;max-width:100%}.compact-page{min-height:55vh}@keyframes header-in{0%{opacity:0;transform:translateY(-8px)}}@keyframes content-in{0%{opacity:0;transform:translateY(10px)}}@keyframes status-ring{0%{opacity:0;transform:scale(.85)}28%{opacity:.45}to{opacity:0;transform:scale(2.8)}}@keyframes section-reveal{0%{opacity:0;transform:translateY(18px)}}@supports (animation-timeline:view()){.page-content:not(.home-page)>section:not(.intro){animation-name:section-reveal;animation-fill-mode:both;animation-timing-function:var(--ease-out);animation-timeline:view();animation-range:entry entry 32%}}@media (hover:hover) and (pointer:fine){a:hover{text-decoration-color:currentColor}.document-header nav a:hover{color:var(--ink)}.document-header nav a:hover:after{transform-origin:0;transform:scaleX(1)}.theme-toggle:hover{color:var(--ink)}.highlight-trigger:hover{border-color:var(--ink);opacity:1;transform:translateY(-2px)}.copy-button:hover{background:#444c56}.back-link:hover{color:var(--ink);transform:translate(-2px)}.project-heading>a:hover{transform:translate(2px,-2px)}.links a:hover{transform:translateY(-2px)}}@media (width<=660px){.document{width:min(100% - 2rem,43rem)}.document-header{flex-direction:column;align-items:flex-start;gap:.65rem}.header-actions{justify-content:space-between;align-items:flex-start;width:100%}.document-header nav{gap:.4rem .8rem}.page-content{padding-top:4.5rem}.job{grid-template-columns:1fr;gap:.35rem}.project-heading{flex-direction:column;align-items:flex-start;gap:.65rem}.highlight-preview{width:min(18rem,100vw - 2rem)}.post-meta{flex-direction:column;align-items:flex-start;gap:.15rem}.blog-post-meta{flex-direction:column;align-items:flex-start;gap:.2rem}footer{flex-direction:column;align-items:flex-start}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.page-content:not(.home-page)>section:not(.intro){opacity:1;transform:none;animation:none!important}.status-dot:after{animation:none!important}*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
