:root{--bg:#fbfaf8;--surface:#ffffff;--ink:#14171c;--ink-2:#3d434d;--muted:#6b7280;--rule:#e6e2dc;--accent:#c2410c;--accent-ink:#9a3412;--accent-soft:#fdf1ea;--code-bg:#f6f8fa;--sans:"Inter", system-ui, -apple-system, "Segoe UI", sans-serif;--serif:"Source Serif 4", Georgia, serif;--mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--wrap:760px}:root{color-scheme:light}:root[data-theme=dark]{color-scheme:dark;--bg:#0e1116;--surface:#151a21;--ink:#eef0f3;--ink-2:#c4c9d1;--muted:#8b939e;--rule:#262c35;--accent:#fb8a4c;--accent-ink:#fdba8c;--accent-soft:#2a1a12;--code-bg:#161b22}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 var(--sans);-webkit-font-smoothing:antialiased}a{color:var(--accent-ink);text-decoration:none}a:hover{text-decoration:underline;text-underline-offset:3px}.wrap{max-width:var(--wrap);margin:0 auto;padding:0 20px}img{max-width:100%;height:auto}.site-header{border-bottom:1px solid var(--rule);background:color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter:blur(8px);position:sticky;top:0;z-index:10}.header-row{display:flex;align-items:center;justify-content:space-between;gap:16px;height:64px}.brand{display:flex;align-items:center;gap:10px;color:var(--ink)}.brand:hover{text-decoration:none}.brand-mark{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;background:var(--ink);color:var(--bg);font:600 20px/1 var(--serif)}.brand-text{display:flex;flex-direction:column;line-height:1.15}.brand-name{font-weight:600;font-size:15px}.brand-role{font-size:12px;color:var(--muted);font-weight:500}.nav{display:flex;gap:22px;font-size:14px;font-weight:500}.nav a{color:var(--ink-2)}.nav a:hover{color:var(--ink);text-decoration:none}.nav a[aria-current=page]{color:var(--ink)}.nav a,.brand-name{white-space:nowrap}.site-header .wrap{max-width:1120px}.nav-toggle{display:none;place-items:center;width:34px;height:34px;border-radius:8px;border:1px solid var(--rule);background:0 0;color:var(--ink);cursor:pointer}.nav-toggle svg{width:18px;height:18px}.nav-toggle path{transition:transform .2s ease,opacity .2s ease;transform-origin:center}.nav-open .nav-toggle .l1{transform:translateY(5px)rotate(45deg)}.nav-open .nav-toggle .l2{opacity:0}.nav-open .nav-toggle .l3{transform:translateY(-5px)rotate(-45deg)}@media(max-width:900px){.nav-toggle{display:grid;order:2}.nav{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;gap:0;padding:8px 20px 16px;background:var(--bg);border-bottom:1px solid var(--rule);box-shadow:0 12px 24px -16px rgba(0,0,0,.35);font-size:17px}.nav-open .nav{display:flex}.nav a{padding:13px 4px;border-bottom:1px solid var(--rule)}.nav a:last-child{border-bottom:0}.nav a[aria-current=page]{color:var(--accent-ink);font-weight:600}}.eyebrow,.label{font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:0 0 12px}.eyebrow a{color:inherit}.label{color:var(--muted);margin:56px 0 16px}h1,h2,h3{letter-spacing:-.02em;line-height:1.2}.btn{display:inline-block;padding:10px 18px;border-radius:8px;background:var(--ink);color:var(--bg);font-weight:600;font-size:14px}.btn:hover{text-decoration:none;opacity:.9}.btn-ghost{background:0 0;color:var(--ink);box-shadow:inset 0 0 0 1px var(--rule)}.hero{padding:72px 0 8px}.hero h1{font-size:clamp(36px,7vw,60px);font-weight:700;margin:0 0 18px;max-width:14ch;letter-spacing:-.03em}.lede{font:20px/1.55 var(--serif);color:var(--ink-2);max-width:58ch;margin:0 0 28px}.hero-actions{display:flex;gap:12px;flex-wrap:wrap}.featured-card{display:block;padding:28px;border-radius:14px;background:var(--surface);border:1px solid var(--rule);color:var(--ink);transition:border-color .15s,transform .15s}.featured-card:hover{text-decoration:none;border-color:var(--accent);transform:translateY(-1px)}.featured-card h2{font-size:26px;margin:8px 0 10px}.featured-card p{font:17px/1.6 var(--serif);color:var(--ink-2);margin:0 0 16px}.featured-card .more{color:var(--accent-ink);font-weight:600;font-size:14px}.meta{font-size:13px;color:var(--muted)}.post-list{list-style:none;padding:0;margin:0}.post-row{display:grid;grid-template-columns:96px 1fr;gap:20px;padding:22px 0;border-top:1px solid var(--rule)}.post-row time{font:500 13px/1.9 var(--mono);color:var(--muted)}.post-row h3{margin:0 0 6px;font-size:19px}.post-row h3 a{color:var(--ink)}.excerpt{margin:0 0 10px;color:var(--ink-2);font-size:15px}.tags{list-style:none;display:flex;flex-wrap:wrap;gap:6px;padding:0;margin:0}.tags a{display:inline-block;padding:2px 9px;border-radius:999px;background:var(--accent-soft);color:var(--accent-ink);font:500 12px/1.7 var(--mono)}.tags a:hover{text-decoration:none;filter:brightness(.97)}.topics{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}.topics a{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;border-radius:10px;border:1px solid var(--rule);background:var(--surface);color:var(--ink);font-weight:500}.topics a:hover{border-color:var(--accent);text-decoration:none}.topics b{font:500 12px var(--mono);color:var(--muted)}.page-head{padding:56px 0 28px}.page-head h1{font-size:clamp(30px,5vw,40px);margin:0}.year-label{font:600 14px var(--mono);color:var(--muted);margin:40px 0 4px}.project-intro{font:19px/1.6 var(--serif);color:var(--ink-2);max-width:58ch;margin-top:16px}.project-intro p{margin:0}.project-intro a{text-decoration:underline;text-underline-offset:3px}.project-grid{list-style:none;padding:0;margin:12px 0 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.project-card{position:relative;display:flex;flex-direction:column;padding:22px;border-radius:14px;background:var(--surface);border:1px solid var(--rule);transition:border-color .15s,transform .15s}.project-card:hover{border-color:var(--accent);transform:translateY(-1px)}.project-card:focus-within{border-color:var(--accent)}.project-card h3{margin:0 0 8px;font-size:19px}.project-card h3 a{color:var(--ink)}.project-card h3 a:hover{text-decoration:none}.project-card h3 a::after{content:"";position:absolute;inset:0;border-radius:inherit}.project-summary{margin:0 0 18px;color:var(--ink-2);font-size:15px}.project-foot{margin-top:auto}.project-meta{margin:0;font:500 12px/1.7 var(--mono);color:var(--muted)}.project-post{position:relative;display:inline-block;margin-top:6px;font-size:13px;font-weight:500;color:var(--accent-ink)}.post-head{padding:64px 0 28px;border-bottom:1px solid var(--rule);margin-bottom:36px}.post-head h1{font-size:clamp(32px,6vw,46px);margin:0 0 14px}.prose{font:19px/1.72 var(--serif);color:var(--ink)}:root{--measure:600px}.post-head,.post-foot,.prose>*{max-width:var(--measure);margin-left:auto;margin-right:auto}.prose>pre,.prose>table,.prose>p:has(>img:only-child),.prose>p:has(>picture:only-child){max-width:none}.prose>*{margin-top:0;margin-bottom:1.15em}.prose h2,.prose h3,.prose h4,.prose h5{font-family:var(--sans);margin-top:2em;margin-bottom:.6em}.prose h2{font-size:26px}.prose h3{font-size:21px}.prose h4,.prose h5{font-size:17px}.prose a{text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--accent) 45%,transparent);text-underline-offset:3px}.prose blockquote{padding:4px 0 4px 20px;border-left:3px solid var(--accent);color:var(--ink-2);font-style:italic}.prose ul,.prose ol{padding-left:1.3em}.prose li{margin:.3em 0}.prose img{display:block;margin:0 auto;border-radius:8px}.prose table{width:100%;border-collapse:collapse;font:15px var(--sans)}.prose table{display:block;overflow-x:auto;font-size:14px}.prose th{white-space:nowrap}.prose td{min-width:9rem}.prose p:has(>img:only-child)+p:has(>em:only-child),.prose p:has(>picture:only-child)+p:has(>em:only-child){margin-top:-.6em;text-align:center;font:14px/1.5 var(--sans);color:var(--muted)}.prose th,.prose td{padding:10px 12px;border-bottom:1px solid var(--rule);text-align:left;vertical-align:middle}.prose td img{display:inline;margin:0;border-radius:0}.prose p:has(>img:only-child) img,.prose p:has(>picture:only-child) img{background:#fff;border:1px solid var(--rule);border-radius:12px;box-shadow:0 1px 2px rgb(20 23 28/4%),0 4px 16px rgb(20 23 28/5%)}[data-theme=dark] .prose img:not(.has-dark){background:#fff}[data-theme=dark] .prose p:has(>img:only-child) img:not(.has-dark){filter:brightness(.86)contrast(1.06)}[data-theme=dark] .prose p:has(>img:only-child) img,[data-theme=dark] .prose p:has(>picture:only-child) img{border-color:#2c333d;box-shadow:none}.prose :not(pre)>code{font:.84em var(--mono);background:var(--accent-soft);color:var(--accent-ink);padding:.1em .35em;border-radius:4px}.prose pre{font:14px/1.6 var(--mono);padding:18px 20px;border-radius:10px;overflow-x:auto;background:var(--code-bg)!important;border:1px solid var(--rule);margin-left:-20px;margin-right:-20px}@media(min-width:800px){.prose pre{margin-left:-24px;margin-right:-24px}}.prose hr{border:0;border-top:1px solid var(--rule);margin-top:2.5em;margin-bottom:2.5em}.post-foot{margin-top:48px;padding-top:28px;border-top:1px solid var(--rule)}.pager{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:28px}.pager a{padding:16px;border-radius:10px;border:1px solid var(--rule);color:var(--ink);font-weight:600;font-size:15px}.pager a:hover{border-color:var(--accent);text-decoration:none}.pager a span{display:block;font-size:12px;font-weight:500;color:var(--muted);text-transform:uppercase;letter-spacing:.1em;margin-bottom:4px}.pager .older{text-align:right;grid-column:2}.about{display:grid;grid-template-columns:96px 1fr;gap:28px;padding:64px 0}.about h1{font-size:40px;margin:0 0 20px}.avatar{display:grid;place-items:center;width:96px;height:96px;border-radius:20px;background:var(--ink);color:var(--bg);font:600 56px/1 var(--serif)}.about-links{display:flex;gap:10px}.site-footer{margin-top:96px;border-top:1px solid var(--rule)}.footer-row{display:flex;justify-content:space-between;gap:24px;padding:28px 20px 40px;font-size:13px;color:var(--muted)}.footer-links{display:flex;gap:18px}.footer-links a{color:var(--muted)}@media(max-width:600px){.header-row{height:58px}.brand-text{display:none}.post-row{grid-template-columns:1fr;gap:4px}.post-row time{line-height:1.4}.project-grid{grid-template-columns:1fr}.about{grid-template-columns:1fr}.prose{font-size:18px}.hero{padding-top:48px}}.bg{background-color:#fff}.chroma{background-color:#fff}.chroma .err{color:#a61717;background-color:#e3d2d2}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#e5e5e5}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#000;font-weight:700}.chroma .kc{color:#000;font-weight:700}.chroma .kd{color:#000;font-weight:700}.chroma .kn{color:#000;font-weight:700}.chroma .kp{color:#000;font-weight:700}.chroma .kr{color:#000;font-weight:700}.chroma .kt{color:#458;font-weight:700}.chroma .na{color:teal}.chroma .nb{color:#0086b3}.chroma .bp{color:#999}.chroma .nc{color:#458;font-weight:700}.chroma .no{color:teal}.chroma .nd{color:#3c5d5d;font-weight:700}.chroma .ni{color:purple}.chroma .ne{color:#900;font-weight:700}.chroma .nf{color:#900;font-weight:700}.chroma .nl{color:#900;font-weight:700}.chroma .nn{color:#555}.chroma .nt{color:navy}.chroma .nv{color:teal}.chroma .vc{color:teal}.chroma .vg{color:teal}.chroma .vi{color:teal}.chroma .s{color:#d14}.chroma .sa{color:#d14}.chroma .sb{color:#d14}.chroma .sc{color:#d14}.chroma .dl{color:#d14}.chroma .sd{color:#d14}.chroma .s2{color:#d14}.chroma .se{color:#d14}.chroma .sh{color:#d14}.chroma .si{color:#d14}.chroma .sx{color:#d14}.chroma .sr{color:#009926}.chroma .s1{color:#d14}.chroma .ss{color:#990073}.chroma .m{color:#099}.chroma .mb{color:#099}.chroma .mf{color:#099}.chroma .mh{color:#099}.chroma .mi{color:#099}.chroma .il{color:#099}.chroma .mo{color:#099}.chroma .o{color:#000;font-weight:700}.chroma .ow{color:#000;font-weight:700}.chroma .c{color:#998;font-style:italic}.chroma .ch{color:#998;font-style:italic}.chroma .cm{color:#998;font-style:italic}.chroma .c1{color:#998;font-style:italic}.chroma .cs{color:#999;font-weight:700;font-style:italic}.chroma .cp{color:#999;font-weight:700;font-style:italic}.chroma .cpf{color:#999;font-weight:700;font-style:italic}.chroma .gd{color:#000;background-color:#fdd}.chroma .ge{color:#000;font-style:italic}.chroma .gr{color:#a00}.chroma .gh{color:#999}.chroma .gi{color:#000;background-color:#dfd}.chroma .go{color:#888}.chroma .gp{color:#555}.chroma .gs{font-weight:700}.chroma .gu{color:#aaa}.chroma .gt{color:#a00}.chroma .gl{text-decoration:underline}.chroma .w{color:#bbb}[data-theme=dark] .bg{color:#e6edf3;background-color:#0d1117}[data-theme=dark] .chroma{color:#e6edf3;background-color:#0d1117}[data-theme=dark] .chroma .err{color:#f85149}[data-theme=dark] .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}[data-theme=dark] .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}[data-theme=dark] .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}[data-theme=dark] .chroma .hl{background-color:#6e7681}[data-theme=dark] .chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#737679}[data-theme=dark] .chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6e7681}[data-theme=dark] .chroma .line{display:flex}[data-theme=dark] .chroma .k{color:#ff7b72}[data-theme=dark] .chroma .kc{color:#79c0ff}[data-theme=dark] .chroma .kd{color:#ff7b72}[data-theme=dark] .chroma .kn{color:#ff7b72}[data-theme=dark] .chroma .kp{color:#79c0ff}[data-theme=dark] .chroma .kr{color:#ff7b72}[data-theme=dark] .chroma .kt{color:#ff7b72}[data-theme=dark] .chroma .nc{color:#f0883e;font-weight:700}[data-theme=dark] .chroma .no{color:#79c0ff;font-weight:700}[data-theme=dark] .chroma .nd{color:#d2a8ff;font-weight:700}[data-theme=dark] .chroma .ni{color:#ffa657}[data-theme=dark] .chroma .ne{color:#f0883e;font-weight:700}[data-theme=dark] .chroma .nf{color:#d2a8ff;font-weight:700}[data-theme=dark] .chroma .nl{color:#79c0ff;font-weight:700}[data-theme=dark] .chroma .nn{color:#ff7b72}[data-theme=dark] .chroma .py{color:#79c0ff}[data-theme=dark] .chroma .nt{color:#7ee787}[data-theme=dark] .chroma .nv{color:#79c0ff}[data-theme=dark] .chroma .l{color:#a5d6ff}[data-theme=dark] .chroma .ld{color:#79c0ff}[data-theme=dark] .chroma .s{color:#a5d6ff}[data-theme=dark] .chroma .sa{color:#79c0ff}[data-theme=dark] .chroma .sb{color:#a5d6ff}[data-theme=dark] .chroma .sc{color:#a5d6ff}[data-theme=dark] .chroma .dl{color:#79c0ff}[data-theme=dark] .chroma .sd{color:#a5d6ff}[data-theme=dark] .chroma .s2{color:#a5d6ff}[data-theme=dark] .chroma .se{color:#79c0ff}[data-theme=dark] .chroma .sh{color:#79c0ff}[data-theme=dark] .chroma .si{color:#a5d6ff}[data-theme=dark] .chroma .sx{color:#a5d6ff}[data-theme=dark] .chroma .sr{color:#79c0ff}[data-theme=dark] .chroma .s1{color:#a5d6ff}[data-theme=dark] .chroma .ss{color:#a5d6ff}[data-theme=dark] .chroma .m{color:#a5d6ff}[data-theme=dark] .chroma .mb{color:#a5d6ff}[data-theme=dark] .chroma .mf{color:#a5d6ff}[data-theme=dark] .chroma .mh{color:#a5d6ff}[data-theme=dark] .chroma .mi{color:#a5d6ff}[data-theme=dark] .chroma .il{color:#a5d6ff}[data-theme=dark] .chroma .mo{color:#a5d6ff}[data-theme=dark] .chroma .o{color:#ff7b72;font-weight:700}[data-theme=dark] .chroma .ow{color:#ff7b72;font-weight:700}[data-theme=dark] .chroma .c{color:#8b949e;font-style:italic}[data-theme=dark] .chroma .ch{color:#8b949e;font-style:italic}[data-theme=dark] .chroma .cm{color:#8b949e;font-style:italic}[data-theme=dark] .chroma .c1{color:#8b949e;font-style:italic}[data-theme=dark] .chroma .cs{color:#8b949e;font-weight:700;font-style:italic}[data-theme=dark] .chroma .cp{color:#8b949e;font-weight:700;font-style:italic}[data-theme=dark] .chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}[data-theme=dark] .chroma .gd{color:#ffa198;background-color:#490202}[data-theme=dark] .chroma .ge{font-style:italic}[data-theme=dark] .chroma .gr{color:#ffa198}[data-theme=dark] .chroma .gh{color:#79c0ff;font-weight:700}[data-theme=dark] .chroma .gi{color:#56d364;background-color:#0f5323}[data-theme=dark] .chroma .go{color:#8b949e}[data-theme=dark] .chroma .gp{color:#8b949e}[data-theme=dark] .chroma .gs{font-weight:700}[data-theme=dark] .chroma .gu{color:#79c0ff}[data-theme=dark] .chroma .gt{color:#ff7b72}[data-theme=dark] .chroma .gl{text-decoration:underline}[data-theme=dark] .chroma .w{color:#6e7681}.themed{display:contents}.themed .img-dark{display:none}[data-theme=dark] .themed .img-light{display:none}[data-theme=dark] .themed .img-dark{display:block;background:#151a21}.post-hero{margin:32px 0 0}.post-hero img{display:block;width:100%;height:auto;border-radius:14px;border:1px solid var(--rule)}.post-hero+.post-head{padding-top:36px}.featured-card{padding:0;overflow:hidden}.featured-card .featured-hero{display:block;width:100%;height:auto;aspect-ratio:8/3;object-fit:cover}.featured-card .featured-body{padding:24px 28px 28px}.theme-toggle{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;border:1px solid var(--rule);background:0 0;color:var(--ink-2);cursor:pointer}.theme-toggle:hover{color:var(--ink);border-color:var(--muted)}.theme-toggle svg{width:17px;height:17px}.theme-toggle .moon{display:block}.theme-toggle .sun{display:none}[data-theme=dark] .theme-toggle .moon{display:none}[data-theme=dark] .theme-toggle .sun{display:block}.header-tools{display:flex;align-items:center;gap:18px}.prose img.zoomable{cursor:zoom-in}.prose img.zoomable:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.zoom-open,.zoom-open body{overflow:hidden}.zoom-overlay{position:fixed;inset:0;z-index:100;background:rgb(10 12 16/.97);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:56px 24px 24px;overflow:auto;touch-action:pinch-zoom;animation:zoom-in .15s ease-out}.zoom-overlay img{max-width:100%;max-height:calc(100vh - 120px);width:auto;height:auto;border-radius:10px;cursor:zoom-in;box-shadow:0 10px 40px rgb(0 0 0/.4)}.zoom-overlay.is-full{display:block;padding:56px 24px 24px;text-align:center}.zoom-overlay.is-full img{max-width:none;max-height:none;cursor:zoom-out}.zoom-caption{margin-top:14px;max-width:70ch;color:#c4c9d1;font:14px/1.5 var(--sans);text-align:center}.zoom-caption::first-letter{text-transform:uppercase}.zoom-overlay.is-full .zoom-caption{margin:14px auto 0}.zoom-close{position:fixed;top:14px;right:16px;width:40px;height:40px;border-radius:50%;border:1px solid rgb(255 255 255/.25);background:rgb(255 255 255/8%);color:#fff;font:26px/1 var(--sans);cursor:pointer}.zoom-close:hover{background:rgb(255 255 255/.18)}@keyframes zoom-in{from{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.zoom-overlay{animation:none}}.prose img.is-tall{max-width:min(440px,100%)}