pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#c678dd}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#98c379}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#d19a66}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}:root{--color-paper:oklch(100% 0 0);--color-rule:oklch(88% .006 240);--color-ink:oklch(18% .012 245);--color-ink-soft:oklch(48% .014 245);--color-ink-muted:oklch(70% .014 245);--color-accent:oklch(36% .18 248);--font-display:"Inter Tight","Inter",-apple-system,BlinkMacSystemFont,sans-serif;--font-body:"Inter Tight","Inter",-apple-system,BlinkMacSystemFont,sans-serif;--font-mono:"JetBrains Mono","IBM Plex Mono",ui-monospace,monospace;--space-3xs:.25rem;--space-2xs:.5rem;--space-xs:.75rem;--space-sm:1rem;--space-md:1.5rem;--space-lg:2rem;--space-xl:3rem;--space-2xl:4.5rem;--space-3xl:6.5rem;--measure-prose:60ch;--ease-out:cubic-bezier(.2,.8,.2,1);--dur-micro:.12s}*{box-sizing:border-box}html,body{overflow-x:clip;margin:0}body{background:var(--color-paper);color:var(--color-ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;font-size:1rem;line-height:1.55}.page{display:grid;grid-template-columns:14rem 1fr;gap:var(--space-3xl);padding:var(--space-2xl)var(--space-lg)var(--space-3xl);max-width:76rem;margin:0 auto}.toc{position:sticky;top:var(--space-2xl);align-self: start;height:-moz-fit-content;height:fit-content}.toc__brand{font-family:var(--font-display);letter-spacing:.06em;text-transform:uppercase;color:var(--color-ink);margin:0 0 var(--space-3xs);font-size:.875rem}.toc__role{font-family:var(--font-mono);letter-spacing:.04em;color:var(--color-ink-soft);margin:0 0 var(--space-xl);display:block;font-size:.75rem}.toc__list{list-style:none;margin:0 0 var(--space-xl);display:grid;gap:var(--space-2xs);border-block-start:1px solid var(--color-rule);padding:0;padding-block-start:var(--space-md)}.toc__list a{display:grid;grid-template-columns:3.25ch 1fr;gap:var(--space-sm);font-family:var(--font-mono);letter-spacing:.02em;color:var(--color-ink-soft);text-decoration:none;padding:var(--space-3xs)0;transition:color var(--dur-micro)var(--ease-out);font-size:.8125rem}.toc__list a:hover{color:var(--color-accent)}.toc__list a:focus-visible{color:var(--color-accent)}.toc__list a:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.toc__list .num{color:var(--color-accent)}.toc__meta{font-family:var(--font-mono);letter-spacing:.04em;color:var(--color-ink-muted);border-block-start:1px solid var(--color-rule);display:grid;gap:var(--space-3xs);padding-block-start:var(--space-sm);font-size:.6875rem}.main{min-width:0;max-width:56rem}.section{scroll-margin-top:var(--space-2xl);margin-block-end:var(--space-3xl)}.section:first-of-type{margin-block-start:0}.section__num{font-family:var(--font-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--color-accent);margin:0 0 var(--space-md);font-size:.75rem}.section__head{font-family:var(--font-display);letter-spacing:-.025em;margin:0 0 var(--space-lg);color:var(--color-ink);font-size:clamp(2rem,4vw,3rem);font-weight:600;line-height:1.05}.section__head--lede{font-size:clamp(2.5rem,5vw,4rem)}.section__body{color:var(--color-ink);max-width:var(--measure-prose);font-size:1.0625rem;line-height:1.6}.section__body p{margin:0 0 var(--space-md)}.section__body p:last-child{margin-block-end:0}.section__body strong{color:var(--color-accent);font-weight:500}.years{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:.9375rem}.years thead th{text-align:start;padding:var(--space-2xs)var(--space-md)var(--space-2xs)0;font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--color-ink-soft);border-block-end:1px solid var(--color-rule);font-size:.75rem;font-weight:400}.years tbody td{padding:var(--space-md)var(--space-md)var(--space-md)0;border-block-end:1px solid var(--color-rule);vertical-align:baseline;color:var(--color-ink)}.years td:first-child{font-family:var(--font-mono);color:var(--color-ink-soft);white-space:nowrap;width:12ch;font-size:.8125rem}.years td:nth-child(2){width:16ch;font-weight:500}.years td:last-child{color:var(--color-ink-soft)}.projects{list-style:none;display:grid;gap:var(--space-md);margin:0;padding:0}.projects li{display:grid;gap:var(--space-3xs);border-block-end:1px solid var(--color-rule);padding-block-end:var(--space-md)}.projects li:last-child{border-block-end:none;padding-block-end:0}.proj__head{display:flex;align-items:baseline;gap:var(--space-md)}.proj__head a{font-family:var(--font-display);color:var(--color-ink);text-decoration:none;border-block-end:1px solid var(--color-rule);transition:color var(--dur-micro)var(--ease-out),border-color var(--dur-micro)var(--ease-out);padding-block-end:1px;font-size:1rem;font-weight:500}.proj__head a:hover{color:var(--color-accent);border-color:var(--color-accent)}.proj__head a:focus-visible{color:var(--color-accent);border-color:var(--color-accent)}.proj__stat{font-family:var(--font-mono);color:var(--color-ink-muted);font-size:.75rem}.proj__sub{color:var(--color-ink-soft);font-size:.9375rem;line-height:1.55}.proj__meta{font-family:var(--font-mono);color:var(--color-ink-muted);letter-spacing:.02em;font-size:.75rem}.proj__links{display:flex;gap:var(--space-md);margin-block-start:var(--space-3xs)}.proj__links a{font-family:var(--font-mono);color:var(--color-accent);text-decoration:none;transition:opacity var(--dur-micro)var(--ease-out);font-size:.8125rem}.proj__links a:hover{opacity:.7}.contact{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--space-md);font-family:var(--font-mono);font-size:.875rem}.contact__row{border:1px solid var(--color-rule);padding:var(--space-md);display:grid;gap:var(--space-2xs)}.contact__label{color:var(--color-ink-soft);letter-spacing:.06em;text-transform:uppercase;font-size:.75rem}.contact__value a{color:var(--color-ink);text-decoration:none;transition:color var(--dur-micro)var(--ease-out)}.contact__value a:hover{color:var(--color-accent)}.contact__value a:focus-visible{color:var(--color-accent)}.contact__value a:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.blog-cards{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:var(--space-md);margin:0;padding:0}.blog-card{display:grid;gap:var(--space-2xs);border:1px solid var(--color-rule);padding:var(--space-md);text-decoration:none;color:inherit;transition:border-color var(--dur-micro)var(--ease-out),transform var(--dur-micro)var(--ease-out)}.blog-card:hover{border-color:var(--color-accent);transform:translateY(-1px)}.blog-card:focus-visible{border-color:var(--color-accent);transform:translateY(-1px)}.blog-card:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.blog-card__date{font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--color-ink-muted);font-size:.6875rem}.blog-card__title{font-family:var(--font-display);color:var(--color-ink);overflow-wrap:break-word;min-height:2.6rem;font-size:1rem;font-weight:500;line-height:1.3}.blog-card__tags{display:flex;gap:var(--space-2xs);overflow:hidden;flex-wrap:nowrap;margin-block-start:var(--space-2xs)}.blog-card__tag{font-family:var(--font-mono);letter-spacing:.04em;color:var(--color-ink-muted);border:1px solid var(--color-rule);padding:1px var(--space-2xs);white-space:nowrap;font-size:.6875rem}.blog-card__tag--more{color:var(--color-accent);border-color:currentColor}.blog-back{font-family:var(--font-mono);color:var(--color-accent);text-decoration:none;display:inline-block;transition:opacity var(--dur-micro)var(--ease-out);margin-block-end:var(--space-lg);font-size:.8125rem}.blog-back:hover{opacity:.7}.blog-post__meta{display:flex;align-items: center;gap:var(--space-md);flex-wrap:wrap;margin-block-end:var(--space-xl)}.blog-post__date{font-family:var(--font-mono);color:var(--color-ink-soft);font-size:.8125rem}.blog-post__body{color:var(--color-ink);max-width:var(--measure-prose);font-size:1.0625rem;line-height:1.7}.blog-post__body p{margin:0 0 var(--space-md)}.blog-post__body p:last-child{margin-block-end:0}.blog-post__body h2,.blog-post__body h3,.blog-post__body h4,.blog-post__body h5{font-family:var(--font-display);letter-spacing:-.015em;margin:var(--space-xl)0 var(--space-sm);color:var(--color-ink);font-weight:600;line-height:1.25}.blog-post__body h2{font-size:1.625rem}.blog-post__body h3{font-size:1.375rem}.blog-post__body h4{font-size:1.125rem}.blog-post__body h5{font-size:.8125rem;font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--color-ink-soft);margin-block-start:var(--space-lg);font-weight:500}.blog-post__body a{color:var(--color-accent);text-decoration:none;transition:opacity var(--dur-micro)var(--ease-out);border-block-end:1px solid}.blog-post__body a:hover{opacity:.7}.blog-post__body code{font-family:var(--font-mono);color:var(--color-accent);background:#eaf3fc;background:lab(95.3535% -1.78239 -5.27384);border:1px solid #dfe5ec;border:1px solid color(display-p3 .877568 .898885 .924077);border:1px solid lab(90.7152% -1.43468 -4.22381);border-radius:3px;padding:.12em .4em;font-size:.875em}.blog-post__body pre{padding:var(--space-md);overflow-x:auto;margin:var(--space-md)0;position:relative;background:#0e171f;background:lab(7.20873% -2.01964 -6.63221);border:1px solid #212a32;border:1px solid color(display-p3 .135549 .163879 .193921);border:1px solid lab(16.4697% -2.38653 -6.737);border-radius:6px;font-size:.8125rem;line-height:1.65}.blog-post__body pre code,.blog-post__body pre code.hljs{color:#dbdee1;color:color(display-p3 .862016 .871425 .881425);color:lab(88.4021% -.690281 -1.72702);font-size:inherit;display:block;background:0 0;border:none;padding:0}.blog-post__body ul,.blog-post__body ol{margin:0 0 var(--space-md);padding-inline-start:var(--space-md)}.blog-post__body li{margin-block-end:var(--space-2xs)}.blog-post__body li::marker{color:var(--color-ink-muted)}.blog-post__body strong{color:var(--color-accent);font-weight:600}.blog-post__body blockquote{margin:var(--space-md)0;padding:var(--space-2xs)var(--space-md);border-inline-start:3px solid var(--color-accent);color:var(--color-ink-soft);font-style:italic}.blog-post__body hr{border:none;border-block-start:1px solid var(--color-rule);margin:var(--space-xl)0}@media (max-width:64rem){.page{grid-template-columns:1fr;gap:var(--space-2xl)}.toc{position:static;border-block-end:1px solid var(--color-rule);padding-block-end:var(--space-lg)}}@media (max-width:40rem){.page{padding:var(--space-xl)var(--space-md)var(--space-2xl)}.years td:first-child{width:auto}.years thead{display:none}.years tbody td{display:block;padding:var(--space-2xs)0;border:none}.years tr{border-block-end:1px solid var(--color-rule);padding-block:var(--space-sm);display:block}}
