:root{color-scheme:light dark;--color-bg:#f2f3ef;--color-surface:#fafaf7;--color-ink:#171b1c;--color-muted:#4d5559;--color-accent:#b33711;--color-on-accent:#fff;--color-code-bg:#e8eae4;--color-rule:#c9cdc6;--color-border-strong:#767d78;--color-focus:#171b1c;--color-mark:#f3d9b0;--color-success:#1f6b3a;--color-danger:#a3261b;--shadow-1:0 1px 0 #171b1c0f;--shadow-2:4px 4px 0 #171b1ce6;--font-serif:"Source Serif 4", "Iowan Old Style", Georgia, serif;--font-sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono", ui-monospace, "Cascadia Code", Consolas, monospace;--text-xs:.8125rem;--text-sm:.9375rem;--text-base:clamp(1.0625rem, 1rem + .3vw, 1.1875rem);--text-lg:1.375rem;--text-xl:clamp(1.625rem, 1.3rem + 1.4vw, 2.25rem);--text-2xl:clamp(2rem, 1.4rem + 2.6vw, 3.25rem);--text-3xl:clamp(2.5rem, 1.4rem + 4.8vw, 4.75rem);--leading-body:1.7;--leading-tight:1.15;--measure:68ch;--measure-wide:92ch;--tracking-label:.06em;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--space-8:4.5rem;--space-9:7rem;--page-max:78rem;--page-pad:clamp(1rem, 4vw, 2.5rem);--aside-col:14rem;--section-gap:clamp(3rem, 2rem + 4vw, 6rem);--radius-0:0;--radius-1:2px;--border-w:1px;--tap-min:44px;--ease:cubic-bezier(.2, .7, .2, 1);--dur-fast:.12s;--dur-base:.2s;--dur-slow:.4s}:root[data-theme=dark]{--color-bg:#0e1315;--color-surface:#151c1f;--color-ink:#e7eae5;--color-muted:#a3acab;--color-accent:#ff8a5b;--color-on-accent:#0e1315;--color-code-bg:#0a0f10;--color-rule:#2b3538;--color-border-strong:#6b7678;--color-focus:#e7eae5;--color-mark:#4a3620;--color-success:#6fd08f;--color-danger:#ff8f84;--shadow-1:0 1px 0 #0006;--shadow-2:4px 4px 0 #e7eae5d9}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg:#0e1315;--color-surface:#151c1f;--color-ink:#e7eae5;--color-muted:#a3acab;--color-accent:#ff8a5b;--color-on-accent:#0e1315;--color-code-bg:#0a0f10;--color-rule:#2b3538;--color-border-strong:#6b7678;--color-focus:#e7eae5;--color-mark:#4a3620;--color-success:#6fd08f;--color-danger:#ff8f84;--shadow-1:0 1px 0 #0006;--shadow-2:4px 4px 0 #e7eae5d9}}:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{outline:3px solid var(--color-focus);outline-offset:3px;box-shadow:0 0 0 6px var(--color-bg)}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important}}@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/source-serif-4-latin-ext-400-normal.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:"Source Serif 4";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/source-serif-4-latin-400-normal.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:"Source Serif 4";font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/source-serif-4-latin-ext-600-normal.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:"Source Serif 4";font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/source-serif-4-latin-600-normal.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:"Source Serif 4";font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/source-serif-4-latin-ext-400-italic.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:"Source Serif 4";font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/source-serif-4-latin-400-italic.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:IBM Plex Sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-ext-400-normal.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:IBM Plex Sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-400-normal.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:IBM Plex Sans;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-ext-500-normal.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:IBM Plex Sans;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-500-normal.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:IBM Plex Sans;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-ext-600-normal.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:IBM Plex Sans;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-sans-latin-600-normal.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:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/jetbrains-mono-latin-ext-400-normal.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:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/jetbrains-mono-latin-400-normal.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:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/jetbrains-mono-latin-ext-500-normal.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:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/jetbrains-mono-latin-500-normal.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}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:var(--space-7)}body{background:var(--color-bg);color:var(--color-ink);font-family:var(--font-serif);font-size:var(--text-base);line-height:var(--leading-body);transition:background-color var(--dur-base) var(--ease), color var(--dur-base) var(--ease);overflow-wrap:break-word;hyphens:auto;margin:0}body.has-cookie-strip{padding-bottom:calc(var(--cookie-h,4.5rem) + env(safe-area-inset-bottom))}img,svg{max-width:100%;display:block}h1,h2,h3{font-family:var(--font-serif);font-weight:600;line-height:var(--leading-tight);margin:0 0 var(--space-4);text-wrap:balance}h1{font-size:var(--text-2xl)}h2{font-size:var(--text-xl);margin-top:var(--space-7)}h3{font-size:var(--text-lg);margin-top:var(--space-6)}p{margin:0 0 var(--space-4)}a{color:var(--color-accent);text-underline-offset:.2em;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}ul,ol{margin:0 0 var(--space-4);padding-left:1.25em}mark{background:var(--color-mark);color:var(--color-ink);padding:0 .15em}code{font-family:var(--font-mono);background:var(--color-code-bg);border-radius:var(--radius-1);padding:.1em .35em;font-size:.88em}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.skip-link{left:var(--space-4);z-index:50;background:var(--color-ink);color:var(--color-bg);padding:var(--space-3) var(--space-4);min-height:var(--tap-min);font-family:var(--font-sans);text-decoration:none;position:absolute;top:-4rem}.skip-link:focus{top:var(--space-3)}.page{max-width:var(--page-max);padding-inline:max(var(--page-pad), env(safe-area-inset-left)) max(var(--page-pad), env(safe-area-inset-right));margin-inline:auto}.icon{vertical-align:middle;flex:none;width:1.25rem;height:1.25rem;display:inline-block}.label{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted);font-weight:500}.meta{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-muted)}.site-header{border-bottom:1px solid var(--color-rule)}.site-header .page{justify-content:space-between;align-items:center;gap:var(--space-2) var(--space-5);padding-top:env(safe-area-inset-top);flex-wrap:wrap;display:flex}.brand{align-items:center;gap:var(--space-3);min-height:var(--tap-min);color:var(--color-ink);font-family:var(--font-serif);font-weight:600;font-size:var(--text-lg);text-decoration:none;display:flex}.brand svg{flex:none;width:32px;height:32px}.nav{align-items:center;gap:var(--space-1);font-family:var(--font-sans);font-size:var(--text-sm);flex-wrap:wrap;display:flex}.nav a,.theme-toggle{min-height:var(--tap-min);padding:0 var(--space-3);color:var(--color-ink);font:inherit;cursor:pointer;transition:color var(--dur-fast) var(--ease);background:0 0;border:0;align-items:center;text-decoration:none;display:inline-flex}.nav a:hover,.theme-toggle:hover{color:var(--color-accent)}.nav a[aria-current=page]{box-shadow:inset 0 -3px 0 var(--color-accent);font-weight:600}.theme-toggle{gap:var(--space-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-1);margin-left:var(--space-2)}.nav-toggle{align-items:center;gap:var(--space-2);min-height:var(--tap-min);min-width:var(--tap-min);padding:0 var(--space-3);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-ink);border:1px solid var(--color-border-strong);border-radius:var(--radius-1);cursor:pointer;background:0 0;display:none}.nav-toggle:hover{border-color:var(--color-ink)}.nav-toggle:active,.btn:active,.chip:active,.theme-toggle:active{transform:translateY(1px)}@media (width<=719px){.brand{min-width:0;font-size:var(--text-base);flex:auto}.nav-toggle{display:inline-flex}.nav{padding-bottom:var(--space-3);border-top:1px solid var(--color-rule);flex-direction:column;flex:1 0 100%;align-items:stretch;gap:0;display:none}.nav.is-open{display:flex}.nav a,.theme-toggle{min-height:48px;padding:0 var(--space-2);border-bottom:1px solid var(--color-rule)}.nav a[aria-current=page]{box-shadow:inset 3px 0 0 var(--color-accent);padding-left:var(--space-4)}.theme-toggle{margin:var(--space-3) 0 0;border:1px solid var(--color-border-strong);justify-content:center}}.split,.section{gap:var(--space-4) var(--space-7);display:grid}.section{padding-block:calc(var(--section-gap) / 2);border-top:1px solid var(--color-rule)}.section-head h2,.split-head h2{margin:0 0 var(--space-2);font-size:var(--text-lg)}.section-head p{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);margin:0}.section-body{min-width:0}.section-body>:last-child{margin-bottom:0}@media (width>=960px){.split,.section{grid-template-columns:var(--aside-col) minmax(0, 1fr)}.sticky{top:var(--space-5);position:sticky}}.prose{max-width:65ch}.text-link{min-height:var(--tap-min);font-family:var(--font-sans);font-size:var(--text-sm);align-items:center;font-weight:600;display:inline-flex}.text-link .icon{margin-left:var(--space-2);transition:transform var(--dur-fast) var(--ease)}.text-link:hover .icon{transform:translate(3px)}.hero{gap:var(--space-6);padding-block:var(--space-8) var(--space-7);display:grid}.hero h1{font-size:var(--text-3xl);margin:0 0 var(--space-2);overflow-wrap:anywhere}.hero .role{font-family:var(--font-sans);font-size:var(--text-lg);margin:0;font-weight:500}.hero .place{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);margin:var(--space-1) 0 var(--space-5)}.hero .lead{font-size:var(--text-lg);max-width:40ch;margin-bottom:var(--space-5)}.hero-actions{gap:var(--space-3);flex-wrap:wrap;margin:0;display:flex}.hero-actions .btn .icon{margin-left:var(--space-2)}.hero-facts{padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-rule);font-family:var(--font-sans);margin:0}.hero-facts>div{padding:var(--space-3) 0;border-top:1px solid var(--color-rule)}.hero-facts>div:first-child{border-top:0;padding-top:0}.hero-facts>div:last-child{padding-bottom:0}.hero-facts dt{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.hero-facts dd{font-size:var(--text-base);margin:0}.hero-facts .links{gap:0 var(--space-5);flex-wrap:wrap;display:flex}.hero-facts a{min-height:var(--tap-min);align-items:center;display:inline-flex}@media (width>=960px){.hero{gap:var(--space-8);grid-template-columns:minmax(0,1fr) 20rem;align-items:end}}@media (width<=480px){.hero{padding-block:var(--space-6) var(--space-5)}}.timeline{margin:0;padding:0;list-style:none}.timeline>li{gap:var(--space-1) var(--space-5);padding:var(--space-4) 0;border-top:1px solid var(--color-rule);display:grid}.timeline>li:first-child{border-top:0;padding-top:0}.timeline .when{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-muted);padding-top:var(--space-2)}.timeline h3{margin:0 0 var(--space-1);font-size:var(--text-lg)}.timeline .role{margin:0 0 var(--space-2);font-family:var(--font-sans);font-size:var(--text-sm);font-weight:600}.timeline p,.timeline ul{margin:0 0 var(--space-2);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);max-width:62ch}@media (width>=720px){.timeline>li{grid-template-columns:10rem minmax(0,1fr)}}.skill-groups{gap:var(--space-5) var(--space-6);margin:0;display:grid}.skill-groups h3{margin:0 0 var(--space-1);font-family:var(--font-sans);font-size:var(--text-sm);font-weight:600}.skill-groups ul{font-family:var(--font-sans);font-size:var(--text-base);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.skill-groups li:not(:last-child):after{content:", "}@media (width>=720px){.skill-groups{grid-template-columns:repeat(2,minmax(0,1fr))}}.repo-list{margin:0 0 var(--space-4);padding:0;list-style:none}.repo{gap:var(--space-1) var(--space-5);padding:var(--space-4) 0;border-top:1px solid var(--color-rule);display:grid}.repo:first-child{border-top:0;padding-top:0}.repo h3{font-size:var(--text-base);font-family:var(--font-mono);overflow-wrap:anywhere;margin:0;font-weight:500}.repo h3 a{min-height:var(--tap-min);align-items:center;display:inline-flex}.repo p{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);max-width:60ch;margin:0}.repo .meta{padding-top:var(--space-2)}.repo.is-featured{border-left:3px solid var(--color-accent);padding-left:var(--space-4)}.repo.is-featured h3{font-size:var(--text-lg)}@media (width>=720px){.repo{grid-template-columns:15rem minmax(0,1fr) 11rem;align-items:baseline}.repo .meta{text-align:right}.repo.is-featured{padding-block:var(--space-5)}}.project-pair{gap:var(--space-4);display:grid}@media (width>=720px){.project-pair{grid-template-columns:repeat(2,minmax(0,1fr))}}.project{border:1px solid var(--color-border-strong);background:var(--color-surface);padding:var(--space-5);gap:var(--space-2);flex-direction:column;display:flex}.project h3{margin:0}.project p{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);margin:0}.project-meta{padding-top:var(--space-3);border-top:1px solid var(--color-rule);margin:auto 0 0}.project-meta dt{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.project-meta dd{font-family:var(--font-sans);font-size:var(--text-sm);margin:0;font-weight:600}.post-list{margin:0 0 var(--space-4);padding:0;list-style:none}.post-row{gap:var(--space-1);padding:var(--space-4) 0;border-top:1px solid var(--color-rule);transition:background-color var(--dur-fast) var(--ease), padding var(--dur-base) var(--ease);display:grid;position:relative}.post-row:first-child{border-top:0}.post-row .meta{padding-top:var(--space-1)}.post-row h3{font-size:var(--text-lg);margin:0}.post-row h3 a{color:var(--color-ink);min-height:var(--tap-min);align-items:center;text-decoration:none;display:inline-flex}.post-row h3 a:hover{color:var(--color-accent);text-decoration:underline}.post-row p{color:var(--color-muted);font-size:var(--text-sm);font-family:var(--font-sans);max-width:60ch;margin:0}.post-row[hidden]{display:none}.post-row:before{content:"";background:var(--color-accent);transform-origin:top;width:3px;transition:transform var(--dur-base) var(--ease);position:absolute;top:-1px;bottom:-1px;left:0;transform:scaleY(0)}.post-row:hover:before,.post-row:focus-within:before{transform:scaleY(1)}.post-row:hover,.post-row:focus-within{background:var(--color-surface);padding-inline:var(--space-4)}@media (hover:none){.post-row:hover{background:0 0;padding-inline:0}}.btn{min-height:var(--tap-min);padding:0 var(--space-5);font-family:var(--font-sans);font-size:var(--text-sm);cursor:pointer;background:var(--color-accent);color:var(--color-on-accent);border:1px solid var(--color-accent);border-radius:var(--radius-1);transition:background-color var(--dur-fast) var(--ease);justify-content:center;align-items:center;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{background:var(--color-ink);border-color:var(--color-ink);color:var(--color-bg)}.btn.is-secondary{color:var(--color-ink);border-color:var(--color-border-strong);background:0 0}.btn.is-secondary:hover{background:var(--color-ink);color:var(--color-bg)}.btn:disabled,.btn[aria-disabled=true]{opacity:1;background:var(--color-code-bg);color:var(--color-muted);border-color:var(--color-border-strong);cursor:not-allowed}.field{gap:var(--space-1);flex-direction:column;display:flex}.field label{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.field input,.field textarea{min-height:var(--tap-min);padding:0 var(--space-3);font-family:var(--font-sans);background:var(--color-bg);color:var(--color-ink);border:1px solid var(--color-border-strong);border-radius:var(--radius-1);font-size:1rem}.field textarea{padding:var(--space-3);resize:vertical;min-height:6rem}.field input:hover,.field textarea:hover{border-color:var(--color-ink)}.field input[aria-invalid=true],.field textarea[aria-invalid=true]{border-color:var(--color-danger);border-width:2px}.field-error{color:var(--color-danger);font-family:var(--font-sans);font-size:var(--text-sm)}.newsletter,.contact-cta{border:1px solid var(--color-border-strong);background:var(--color-surface);padding:var(--space-5);margin:0}.contact-band{gap:var(--space-5);padding-block:calc(var(--section-gap) / 2);border-top:1px solid var(--color-rule);display:grid}@media (width>=960px){.contact-band{gap:var(--space-6);grid-template-columns:repeat(2,minmax(0,1fr))}}.newsletter h2,.contact-cta h2{margin:var(--space-1) 0 var(--space-2);font-size:var(--text-lg)}.newsletter .note,.contact-cta p{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted)}.newsletter .note{margin:var(--space-3) 0 0}.contact-cta .actions{gap:var(--space-2) var(--space-5);flex-wrap:wrap;align-items:center;display:flex}.contact-cta .actions a:not(.btn){min-height:var(--tap-min);font-family:var(--font-sans);font-size:var(--text-sm);align-items:center;display:inline-flex}.newsletter form{gap:var(--space-3);flex-wrap:wrap;align-items:flex-end;display:flex}.newsletter .field{flex:14rem}.newsletter .status,.form-status{font-family:var(--font-sans);font-size:var(--text-sm);padding:var(--space-3) var(--space-4);border:1px solid;margin:0}.newsletter .status{gap:var(--space-3);align-items:baseline;display:flex}.newsletter .status.is-success,.form-status.is-success{color:var(--color-success);border-color:var(--color-success)}.newsletter .status.is-error,.form-status.is-error{color:var(--color-danger);border-color:var(--color-danger)}.newsletter .status strong,.form-status strong{font-weight:600;display:block}.newsletter [data-when]{display:none}.newsletter[data-state=idle] [data-when~=idle],.newsletter[data-state=sending] [data-when~=sending],.newsletter[data-state=sent] [data-when~=sent],.newsletter[data-state=error] [data-when~=error]{display:block}.newsletter[data-state=sent] form{display:none}.spinner-bar{background:var(--color-ink);width:1.5rem;height:2px;animation:pulse .9s var(--ease) infinite alternate;vertical-align:middle;margin-right:var(--space-2);display:inline-block}@keyframes pulse{0%{opacity:.2}to{opacity:1}}.newsletter .btn{transition:background-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease)}@media (width<=480px){.newsletter,.contact-cta,.push-prompt{padding:var(--space-4)}.newsletter .btn{width:100%}}.cookie-strip{z-index:40;background:var(--color-surface);border-top:1px solid var(--color-ink);font-family:var(--font-sans);font-size:var(--text-sm);padding-bottom:env(safe-area-inset-bottom);position:fixed;inset:auto 0 0}.cookie-strip .page{align-items:center;gap:var(--space-2) var(--space-5);padding-block:var(--space-2);flex-wrap:wrap;display:flex}.cookie-strip p{flex:18rem;margin:0}.cookie-strip a{min-height:var(--tap-min);min-width:var(--tap-min);justify-content:center;align-items:center;display:inline-flex}.cookie-strip button{min-height:var(--tap-min);padding:0 var(--space-4);font:inherit;color:var(--color-ink);border:1px solid var(--color-border-strong);border-radius:var(--radius-1);cursor:pointer;background:0 0;font-weight:600}.cookie-strip button:hover{background:var(--color-ink);color:var(--color-bg)}.cookie-strip[hidden]{display:none}.cookie-strip .cookie-actions{gap:var(--space-2);align-items:center;display:flex}@media (width<=480px){.cookie-strip p{font-size:var(--text-xs);flex-basis:100%;line-height:1.5}.cookie-strip .cookie-actions{width:100%}.cookie-strip .cookie-actions a,.cookie-strip button{flex:1}}.push-prompt{border:1px solid var(--color-border-strong);background:var(--color-surface);padding:var(--space-5);margin-block:var(--space-6);max-width:var(--measure-wide);font-family:var(--font-sans)}.push-prompt h2{margin:var(--space-1) 0 var(--space-2);font-size:var(--text-lg);font-family:var(--font-serif)}.push-prompt [data-step]{display:none}.push-prompt[data-step=ask] [data-step~=ask],.push-prompt[data-step=browser] [data-step~=browser],.push-prompt[data-step=granted] [data-step~=granted],.push-prompt[data-step=denied] [data-step~=denied],.push-prompt[data-step=later] [data-step~=later]{display:block}.browser-dialog{margin-top:var(--space-4);border:1px solid var(--color-ink);background:var(--color-bg);box-shadow:var(--shadow-2);padding:var(--space-4);max-width:24rem}.browser-dialog .label{margin-bottom:var(--space-2);display:block}.push-result{margin:var(--space-3) 0 0}.page-head{padding-top:var(--space-7);padding-bottom:var(--space-5)}.page-head h1,.article-head h1{overflow-wrap:anywhere;max-width:22ch}.page-head .intro{font-size:var(--text-lg);max-width:46ch;color:var(--color-muted);margin:0}.post-meta{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-muted);margin:0 0 var(--space-3)}.post-meta .updated{margin-top:var(--space-1);display:block}.tag-list{margin:var(--space-4) 0 0;gap:0 var(--space-3);font-family:var(--font-sans);font-size:var(--text-sm);flex-wrap:wrap;padding:0;list-style:none;display:flex}.tag-list a{min-height:var(--tap-min);align-items:center;display:inline-flex}.toc{font-family:var(--font-sans);font-size:var(--text-sm);border-top:1px solid var(--color-rule)}.toc summary{min-height:var(--tap-min);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted);align-items:center;list-style:none;display:flex}.toc summary::-webkit-details-marker{display:none}.toc summary:after{content:"+";margin-left:auto;font-size:1.25rem}.toc[open] summary:after{content:"−"}.toc ol{margin:0 0 var(--space-4);padding:0;list-style:none}.toc a{min-height:var(--tap-min);color:var(--color-ink);border-left:3px solid var(--color-rule);padding-left:var(--space-3);align-items:center;text-decoration:none;display:flex}.toc a:hover{color:var(--color-accent)}.toc a[aria-current=true]{border-left-color:var(--color-accent);font-weight:600}@media (width>=960px){.toc summary{pointer-events:none}.toc summary:after{content:none}}.article-body{min-width:0;max-width:65ch}.article-body h2{margin-top:var(--space-7)}.article-body blockquote{margin:var(--space-5) 0;padding-left:var(--space-4);border-left:3px solid var(--color-accent);font-style:italic}.related h2{margin-top:0}.code-block{margin:var(--space-5) 0;border:1px solid var(--color-rule);background:var(--color-code-bg);min-width:0;max-width:100%}.code-block .label{padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--color-rule);display:block}.code-block pre{padding:var(--space-4);-webkit-overflow-scrolling:touch;max-width:100%;font-family:var(--font-mono);font-size:var(--text-sm);white-space:pre;tab-size:2;margin:0;line-height:1.6;overflow-x:auto}.code-block pre code{font-size:inherit;background:0 0;padding:0}.code-block pre:focus-visible,.table-wrap:focus-visible{outline-offset:-3px;box-shadow:none}.table-wrap{margin:var(--space-5) 0;border:1px solid var(--color-rule);background:var(--color-surface);max-width:100%;overflow-x:auto}.table-wrap table{border-collapse:collapse;width:100%;min-width:30rem;font-family:var(--font-sans);font-size:var(--text-sm)}.table-wrap caption{text-align:left;padding:var(--space-3) var(--space-4);font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted);border-bottom:1px solid var(--color-rule)}.table-wrap th,.table-wrap td{text-align:left;padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--color-rule);white-space:nowrap}.table-wrap thead th{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.table-wrap tbody tr:last-child>*{border-bottom:0}.filters{gap:var(--space-2);margin:0 0 var(--space-4);font-family:var(--font-sans);flex-wrap:wrap;padding:0;list-style:none;display:flex}.chip{min-height:var(--tap-min);padding:0 var(--space-4);font:inherit;font-size:var(--text-sm);color:var(--color-ink);border:1px solid var(--color-border-strong);border-radius:var(--radius-1);cursor:pointer;background:0 0}.chip:hover{border-color:var(--color-ink)}.chip[aria-pressed=true]{background:var(--color-ink);color:var(--color-bg);border-color:var(--color-ink)}.filter-group{margin-bottom:var(--space-4)}.filter-group .label{margin-bottom:var(--space-2);display:block}.result-count{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);margin:0 0 var(--space-3)}.state-box{border:1px dashed var(--color-border-strong);padding:var(--space-6) var(--space-5);font-family:var(--font-sans);max-width:var(--measure)}.state-box h3{font-family:var(--font-serif);margin-top:0}.state-box.is-error{border-style:solid;border-color:var(--color-danger)}.state-box.is-error h3{color:var(--color-danger)}.skeleton-row{padding:var(--space-5) 0;border-top:1px solid var(--color-rule);min-height:7.5rem}.skeleton-line{background:var(--color-rule);height:.9rem;margin-bottom:var(--space-3);animation:pulse .9s var(--ease) infinite alternate}.skeleton-line.is-title{width:60%;height:1.4rem}.skeleton-line.is-short{width:35%}.contact-form{gap:var(--space-3);border:1px solid var(--color-border-strong);background:var(--color-surface);padding:var(--space-5);max-width:var(--measure);display:grid}.contact-form .btn{justify-self:start}.link-list{margin:var(--space-4) 0 0;gap:0 var(--space-5);font-family:var(--font-sans);font-size:var(--text-sm);flex-wrap:wrap;padding:0;list-style:none;display:flex}.site-footer{margin-top:var(--space-7);border-top:1px solid var(--color-rule);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted)}.site-footer .page{padding-block:var(--space-5);padding-bottom:max(var(--space-5), env(safe-area-inset-bottom));gap:var(--space-2) var(--space-5);flex-wrap:wrap;justify-content:space-between;display:flex}.site-footer nav{gap:0 var(--space-3);flex-wrap:wrap;display:flex}.site-footer a{min-height:var(--tap-min);min-width:var(--tap-min);color:var(--color-ink);justify-content:center;align-items:center;display:inline-flex}.site-footer a .icon{margin-right:var(--space-1)}.site-footer p{align-self:center;margin:0}.page>[data-component=newsletter],.page>[data-component=push]{margin-block:var(--space-7)}.page>[data-component=newsletter] .newsletter{max-width:var(--measure-wide)}.prose,.article-body{max-width:var(--measure)}.article-body{font-size:var(--text-base);line-height:var(--leading-body)}.article-body>*+*{margin-top:0}.article-body h2{margin-top:var(--space-7);scroll-margin-top:var(--space-6)}.article-body h3{margin-top:var(--space-6);scroll-margin-top:var(--space-6)}.article-body h2+p,.article-body h3+p{margin-top:0}.article-body ul,.article-body ol{margin-bottom:var(--space-4)}.article-body li+li{margin-top:var(--space-2)}.article-body li>p{margin-bottom:var(--space-2)}.article-body blockquote>:last-child{margin-bottom:0}.article-body hr{border:0;border-top:1px solid var(--color-rule);margin:var(--space-7) 0}.article-body img{max-width:100%;height:auto}.article-body figure{margin:var(--space-6) 0;max-width:var(--measure-wide)}.article-body figure img{border:1px solid var(--color-ink);background:var(--color-surface);width:100%}.article-body figcaption{margin-top:var(--space-2);font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.article-body .expressive-code{margin:var(--space-5) 0;max-width:100%}.article-body .expressive-code .copy button{width:2.75rem;height:2.75rem}.article-body :not(pre)>code{overflow-wrap:anywhere}.article-body .table-wrap{margin:var(--space-5) 0}.article-body sup{line-height:0}.article-body sup a{min-width:var(--tap-min);min-height:var(--tap-min);margin:calc(var(--tap-min) / -2 + .4em) calc(var(--tap-min) / -2 + .2em);font-family:var(--font-mono);font-size:var(--text-xs);justify-content:center;align-items:center;text-decoration:underline;display:inline-flex}.article-body section[data-footnotes],.article-body .footnotes{margin-top:var(--space-7);padding-top:var(--space-4);border-top:1px solid var(--color-ink);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted)}.article-body section[data-footnotes] h2,.article-body .footnotes h2{margin:0 0 var(--space-3);font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);font-weight:500}.article-body section[data-footnotes] ol{margin:0}.article-body section[data-footnotes] li p{margin-bottom:var(--space-1)}.article-body [data-footnote-backref]{min-height:var(--tap-min);min-width:var(--tap-min);justify-content:center;align-items:center;text-decoration:underline;display:inline-flex}.article-foot{margin-top:var(--space-7)}@media (width>=960px){.toc.sticky{max-height:calc(100vh - var(--space-6));overflow-y:auto}}.toc{margin-top:var(--space-5)}.toc ol ol{padding-left:var(--space-4)}.toc li.is-sub a{padding-left:var(--space-5)}.toc-empty{display:none}.reading-progress{z-index:60;pointer-events:none;background:0 0;height:3px;position:fixed;top:0;left:0;right:0}.reading-progress>span{background:var(--color-accent);transform-origin:0;width:100%;height:100%;display:block;transform:scaleX(0)}@media (prefers-reduced-motion:no-preference){.reading-progress>span{transition:transform var(--dur-fast) linear}}.post-nav{gap:var(--space-3);margin:var(--space-6) 0 0;font-family:var(--font-sans);display:grid}@media (width>=720px){.post-nav{grid-template-columns:repeat(2,minmax(0,1fr))}}.post-nav a{justify-content:center;gap:var(--space-1);min-height:var(--tap-min);padding:var(--space-3) var(--space-4);border:1px solid var(--color-ink);background:var(--color-surface);color:var(--color-ink);flex-direction:column;text-decoration:none;display:flex}.post-nav a:hover{border-color:var(--color-accent)}.post-nav a:hover .post-nav-title{color:var(--color-accent);text-decoration:underline}.post-nav .post-nav-title{font-family:var(--font-serif);font-weight:600;font-size:var(--text-base)}.post-nav .is-next{text-align:right}.series-nav{border:1px solid var(--color-ink);background:var(--color-surface);padding:var(--space-4) var(--space-5);margin:var(--space-6) 0;font-family:var(--font-sans);font-size:var(--text-sm)}.series-nav h2{margin:var(--space-1) 0 var(--space-3);font-size:var(--text-lg)}.series-nav ol{margin:0;padding:0;list-style:none}.series-nav li a,.series-nav li [aria-current]{min-height:var(--tap-min);align-items:center;gap:var(--space-3);padding-left:var(--space-3);border-left:3px solid var(--color-rule);color:var(--color-ink);text-decoration:none;display:flex}.series-nav li a:hover{color:var(--color-accent)}.series-nav li [aria-current=page]{border-left-color:var(--color-accent);font-weight:600}.series-nav .order{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--color-muted)}.crumbs{font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--tracking-label);color:var(--color-muted)}.crumbs ol{margin:0 0 var(--space-3);flex-wrap:wrap;padding:0;list-style:none;display:flex}.crumbs li+li:before{content:"/";margin:0 var(--space-2)}.crumbs a{min-height:var(--tap-min);color:var(--color-muted);align-items:center;display:inline-flex}.page-head .lead{font-size:var(--text-lg);color:var(--color-muted);max-width:46ch}.tag-links{gap:var(--space-1) var(--space-2);flex-wrap:wrap;display:flex}.tag-links a{margin-right:0}.filters a.chip{align-items:center;text-decoration:none;display:inline-flex}.filters a.chip[aria-current=page]{background:var(--color-ink);color:var(--color-bg);border-color:var(--color-ink)}.state-box[hidden],[hidden].post-list{display:none}.state-box .btn{margin-top:var(--space-2)}.skeleton-line{animation:pulse .9s var(--ease) infinite alternate}.project{text-decoration:none}.project h2{margin-top:0}.project a.project-link{color:var(--color-ink);min-height:var(--tap-min);align-items:center;text-decoration:none;display:inline-flex}.project a.project-link:hover{color:var(--color-accent);text-decoration:underline}.project .tag-links{margin-top:var(--space-1)}.project-pair.is-single{grid-template-columns:minmax(0,1fr)}.cv-section+.cv-section{margin-top:var(--space-7)}.link-list{margin:0 0 var(--space-4);padding:0;list-style:none}.link-list a{min-height:var(--tap-min);align-items:center;display:inline-flex}.external-link .icon{margin-left:var(--space-1)}.notice{border:1px solid var(--color-ink);background:var(--color-surface);padding:var(--space-4) var(--space-5);font-family:var(--font-sans);font-size:var(--text-sm);max-width:var(--measure)}.notice p{margin:0}.notice p+p{margin-top:var(--space-2)}.newsletter .form-status{margin-top:var(--space-3)}.newsletter .field-error{margin:0}.newsletter .field-error[hidden],.altcha-field .field-error[hidden]{display:none}.push-prompt p{font-family:var(--font-sans);font-size:var(--text-sm);margin:var(--space-2) 0 0;max-width:var(--measure)}.push-prompt .push-message{padding:var(--space-3) var(--space-4);border:1px solid var(--color-border-strong);color:var(--color-ink)}.push-prompt .push-message.is-error{color:var(--color-danger);border-color:var(--color-danger)}.push-prompt [hidden]{display:none}.push-prompt .actions{gap:var(--space-3);margin-top:var(--space-3);flex-wrap:wrap;display:flex}.push-prompt .actions .btn{min-width:0}.altcha-field{flex:100%}altcha-widget{--altcha-max-width:100%;--altcha-border-width:var(--border-w);--altcha-border-radius:var(--radius-1);--altcha-color-base:var(--color-surface);--altcha-color-text:var(--color-ink);--altcha-color-border:var(--color-border-strong);--altcha-color-border-focus:var(--color-focus);--altcha-color-active:var(--color-accent);--altcha-color-error-text:var(--color-danger);--altcha-color-footer-bg:var(--color-code-bg);font-family:var(--font-sans);display:block}altcha-widget .altcha-main{position:relative}altcha-widget .altcha-label:after{content:"";position:absolute;inset:0}altcha-widget .altcha-checkbox{z-index:1;position:relative}.contact-form .field-hint{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted)}.contact-form .field-error{margin:0}.contact-form .field-error[hidden]{display:none}.honeypot{width:1px;height:1px;position:absolute;left:-10000px;overflow:hidden}.form-status{font-family:var(--font-sans);font-size:var(--text-sm);padding:var(--space-3) var(--space-4);border:1px solid;margin:0}.form-status[hidden]{display:none}.form-status strong{font-weight:600;display:block}.form-status.is-success{color:var(--color-success);border-color:var(--color-success)}.form-status.is-error{color:var(--color-danger);border-color:var(--color-danger)}.form-status.is-pending{color:var(--color-ink);border-color:var(--color-border-strong)}.contact-form{max-width:40rem}.search-form{gap:var(--space-3);margin-bottom:var(--space-5);max-width:var(--measure);flex-wrap:wrap;align-items:flex-end;display:flex}.search-form .field{flex:14rem}.search-results{margin:0;padding:0;list-style:none}.search-result{padding:var(--space-4) 0;border-top:1px solid var(--color-rule)}.search-result:last-child{border-bottom:1px solid var(--color-rule)}.search-result h2{margin:0 0 var(--space-2);font-size:var(--text-lg)}.search-result h2 a{padding-block:var(--space-2);color:var(--color-ink);text-decoration:none;display:inline-block}.search-result h2 a:hover{color:var(--color-accent);text-decoration:underline}.search-result p{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);max-width:60ch;margin:0}.search-status{font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted);min-height:1.5em}.site-header .brand svg{color:var(--color-ink)}.post-row h3 a{overflow-wrap:anywhere}.page-head .label a,.article-head .label a,.series-nav h2 a{min-height:var(--tap-min);align-items:center;display:inline-flex}.hero-actions{gap:var(--space-3);flex-wrap:wrap;display:flex}.post-row>*{min-width:0}.updated-note{margin:0 0 var(--space-5);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-muted)}.stack-groups{margin:0}.stack-groups dt{margin-top:var(--space-5);font-family:var(--font-sans);font-size:var(--text-sm);color:var(--color-ink);font-weight:600}.stack-groups dt:first-child{margin-top:0}.stack-groups dd{margin:var(--space-1) 0 0;max-width:65ch}.storage-table{border-collapse:collapse;width:100%;max-width:65ch;font-family:var(--font-sans);font-size:var(--text-sm)}.storage-table th,.storage-table td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-rule);text-align:left;vertical-align:top}.storage-table th{font-weight:600}.storage-table code{font-family:var(--font-mono);overflow-wrap:anywhere}@media (width<=599px){.storage-table thead{clip-path:inset(50%);block-size:1px;inline-size:1px;position:absolute;overflow:hidden}.storage-table,.storage-table tbody,.storage-table tr,.storage-table td{display:block}.storage-table tr{padding:var(--space-3) 0;border-bottom:1px solid var(--color-rule)}.storage-table td{padding:var(--space-1) 0;border:0}.storage-table td:before{content:attr(data-label) ": ";font-weight:600}}
