@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/IBMPlexSans-Regular.woff2)format("woff2")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/IBMPlexSans-Italic.woff2)format("woff2")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/IBMPlexSans-Medium.woff2)format("woff2")}@font-face{font-family:IBM Plex Serif;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/IBMPlexSerif-Regular.woff2)format("woff2")}@font-face{font-family:IBM Plex Serif;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/IBMPlexSerif-Italic.woff2)format("woff2")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/IBMPlexMono-Regular.woff2)format("woff2")}:root{--color-bg:#faf8f2;--color-surface:#f2efe6;--color-fg-1:#2c2a26;--color-fg-2:#6b6862;--color-fg-3:#757168;--color-border:#00000014;--color-accent:#58776b;--color-accent-rust:#b0532e;--color-status-progress-bg:#f4dcd0;--color-status-progress-fg:#7a2f18;--color-status-shipped-bg:#dde8e2;--color-status-shipped-fg:#3d5a50;--color-status-quiet-fg:var(--color-fg-3);--code-keyword:#7a4a6f;--code-string:#7a5e2f;--code-comment:var(--color-fg-3);--code-default:var(--color-fg-1);--font-sans:"IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-serif:"IBM Plex Serif", "Iowan Old Style", Georgia, serif;--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--fs-hero:36px;--fs-post-title:28px;--fs-h2:20px;--fs-h3:17px;--fs-body:16px;--fs-post-body:17px;--fs-list-title:15px;--fs-meta:13px;--fs-code:14px;--fw-regular:400;--fw-medium:500;--lh-tight:1.3;--lh-body:1.65;--lh-code:1.7;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-6:1.5rem;--space-8:2rem;--space-12:3rem;--space-16:4rem;--space-24:6rem;--width-prose:720px;--width-page:1024px;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--border-hairline:.5px solid var(--color-border);--ease-soft:cubic-bezier(.2, .6, .2, 1);--duration-1:.12s;--duration-2:.2s}[data-theme=dark]{--color-bg:#1c1a17;--color-surface:#262320;--color-fg-1:#e8e4d9;--color-fg-2:#a8a498;--color-fg-3:#8b867c;--color-border:#ffffff14;--color-accent:#8faea0;--color-accent-rust:#e08560;--color-status-progress-bg:#3d2620;--color-status-progress-fg:#e08560;--color-status-shipped-bg:#283530;--color-status-shipped-fg:#8faea0;--code-keyword:#b89ab0;--code-string:#c9a46b}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg:#1c1a17;--color-surface:#262320;--color-fg-1:#e8e4d9;--color-fg-2:#a8a498;--color-fg-3:#8b867c;--color-border:#ffffff14;--color-accent:#8faea0;--color-accent-rust:#e08560;--color-status-progress-bg:#3d2620;--color-status-progress-fg:#e08560;--color-status-shipped-bg:#283530;--color-status-shipped-fg:#8faea0;--code-keyword:#b89ab0;--code-string:#c9a46b}}html{background:var(--color-bg);color:var(--color-fg-1);font-family:var(--font-sans);font-size:var(--fs-body);line-height:var(--lh-body);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility}body{margin:0}h1,h2,h3,h4{font-weight:var(--fw-regular);line-height:var(--lh-tight);color:var(--color-fg-1);margin:0}h1{font-family:var(--font-serif);font-size:var(--fs-post-title)}h1.hero{font-size:var(--fs-hero)}h2{font-family:var(--font-sans);font-weight:var(--fw-medium);font-size:var(--fs-h2)}h3{font-family:var(--font-sans);font-weight:var(--fw-medium);font-size:var(--fs-h3)}p{margin:0 0 var(--space-4) 0;text-wrap:pretty}.prose p,.prose li{font-size:var(--fs-post-body)}.section-label{font-size:var(--fs-meta);color:var(--color-fg-3);margin:0 0 var(--space-4) 0}.meta{font-size:var(--fs-meta);color:var(--color-fg-3)}a{color:var(--color-accent);text-underline-offset:3px;text-decoration:underline .5px;text-decoration-color:color-mix(in srgb, var(--color-accent) 50%, transparent);transition:color var(--duration-1) var(--ease-soft), text-decoration-color var(--duration-1) var(--ease-soft)}a:hover{text-decoration-color:var(--color-accent)}.text-nav a{color:var(--color-fg-1)}code{font-family:var(--font-mono);background:var(--color-surface);border-radius:var(--radius-sm);padding:0 .25rem;font-size:.92em}pre{background:var(--color-surface);padding:var(--space-4) var(--space-6);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:var(--fs-code);line-height:var(--lh-code);margin:var(--space-6) 0;overflow-x:auto}pre code{font-size:inherit;background:0 0;padding:0}.tok-fn{color:var(--code-default)}hr,.hairline{border:0;border-top:var(--border-hairline);margin:var(--space-8) 0}.pill{font-size:var(--fs-meta);font-weight:var(--fw-regular);border-radius:var(--radius-md);white-space:nowrap;align-items:center;padding:4px 10px;line-height:1.2;display:inline-flex}.pill--progress{background:var(--color-status-progress-bg);color:var(--color-status-progress-fg)}.pill--shipped{background:var(--color-status-shipped-bg);color:var(--color-status-shipped-fg)}.pill--paused,.pill--archived{color:var(--color-status-quiet-fg);background:0 0;padding-left:0;padding-right:0}.page{max-width:var(--width-page);padding:0 var(--space-6);margin:0 auto}.prose{max-width:var(--width-prose);padding:0 var(--space-6);margin:0 auto}::selection{background:color-mix(in srgb, var(--color-accent) 30%, transparent);color:var(--color-fg-1)}*{box-sizing:border-box}body{background:var(--color-bg);color:var(--color-fg-1);font-family:var(--font-sans);transition:background var(--duration-2) var(--ease-soft), color var(--duration-2) var(--ease-soft);margin:0}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.shell{max-width:var(--width-page);margin:0 auto;padding:96px 32px 64px}.shell--prose{max-width:var(--width-prose)}@media (width<=720px){.shell{padding:56px 24px 48px}}.theme-toggle{font:inherit;font-size:var(--fs-meta);color:var(--color-fg-3);cursor:pointer;border-radius:var(--radius-md);transition:color var(--duration-1) var(--ease-soft);background:0 0;border:0;justify-content:center;align-items:center;padding:8px;display:inline-flex}.theme-toggle:hover{color:var(--color-accent)}.theme-toggle:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.theme-toggle__sun,[data-theme=dark] .theme-toggle__moon{display:none}[data-theme=dark] .theme-toggle__sun{display:block}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .theme-toggle__moon{display:none}:root:not([data-theme=light]) .theme-toggle__sun{display:block}}a:focus-visible,button:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:2px}.hero{margin-bottom:64px}.hero h1{font-family:var(--font-serif);font-size:var(--fs-hero);line-height:var(--lh-tight);font-weight:var(--fw-regular);letter-spacing:-.005em;color:var(--color-fg-1);margin:0 0 16px}.hero .lede{color:var(--color-fg-2);text-wrap:pretty;max-width:560px;margin:0 0 32px;font-size:17px;line-height:1.5}.text-nav{font-size:var(--fs-body);flex-wrap:wrap;align-items:center;gap:14px;display:flex}.text-nav a{color:var(--color-fg-1);transition:color var(--duration-1) var(--ease-soft);text-decoration:none}.text-nav a:hover{color:var(--color-accent)}.text-nav .sep{color:var(--color-fg-3);user-select:none}.page-header{margin:0 0 48px}.page-title{font-family:var(--font-serif);font-size:var(--fs-post-title);font-weight:var(--fw-regular);line-height:var(--lh-tight);margin:0 0 8px}.page-sub{font-size:var(--fs-body);color:var(--color-fg-2);max-width:560px;margin:0}.section{margin-bottom:80px}.section:last-of-type{margin-bottom:64px}.section--bordered{border-top:var(--border-hairline);padding-top:32px}.section-label{font-size:var(--fs-meta);font-weight:var(--fw-regular);color:var(--color-fg-3);margin:0 0 24px}.post-preview{border-bottom:var(--border-hairline);margin-bottom:32px;padding-bottom:32px}.post-preview:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}.post-preview .post-meta{color:var(--color-fg-2);margin-bottom:8px;display:block}.post-preview h2{font-family:var(--font-serif);font-size:var(--fs-post-title);font-weight:var(--fw-regular);line-height:var(--lh-tight);text-wrap:pretty;margin:0 0 16px}.post-preview h2 a{color:var(--color-fg-1);text-decoration:none}.post-preview h2 a:hover{color:var(--color-accent)}.post-preview p{font-size:var(--fs-post-body);line-height:var(--lh-body);color:var(--color-fg-2);margin:0 0 16px}.read-more,.archive-link{font-size:14px;text-decoration:none}.read-more:hover,.archive-link:hover{text-underline-offset:3px;text-decoration:underline}.empty-state{color:var(--color-fg-2);font-size:var(--fs-post-body)}.projects{grid-template-columns:repeat(3,1fr);gap:32px;display:grid}.project-card{color:inherit;flex-direction:column;text-decoration:none;display:flex}.project-card .img{aspect-ratio:16/10;border-radius:var(--radius-lg);background:var(--color-surface);overflow:hidden}.project-card .img>svg{width:100%;height:100%;display:block}.project-card .name{font-size:var(--fs-body);font-weight:var(--fw-medium);color:var(--color-fg-1);margin:12px 0 0}.project-card .blurb{color:var(--color-fg-2);text-wrap:pretty;margin:4px 0 0;font-size:14px;line-height:1.5}.project-card .meta{font-size:var(--fs-meta);color:var(--color-fg-3);margin:8px 0 0}@media (width<=720px){.projects{grid-template-columns:1fr;gap:40px}}.writing-list{flex-direction:column;display:flex}.writing-row{border-bottom:var(--border-hairline);color:inherit;justify-content:space-between;align-items:baseline;gap:16px;padding:14px 0;text-decoration:none;display:flex}.writing-row .t{font-size:var(--fs-list-title);color:var(--color-fg-1);transition:color var(--duration-1) var(--ease-soft);text-wrap:balance}.writing-row:hover .t{color:var(--color-accent)}.writing-row .d{font-size:var(--fs-meta);color:var(--color-fg-3);white-space:nowrap;font-variant-numeric:tabular-nums}.writing-list .more{color:var(--color-accent);margin-top:24px;font-size:14px;text-decoration:none;display:inline-block}.writing-list .more:hover{text-underline-offset:3px;text-decoration:underline}.writing-list--standalone .writing-row .t{font-size:17px}@media (width<=520px){.writing-row{flex-direction:column;align-items:flex-start;gap:4px}}.site-footer{border-top:var(--border-hairline);font-size:var(--fs-meta);color:var(--color-fg-3);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:96px;padding-top:20px;display:flex}.site-footer a{color:inherit;transition:color var(--duration-1) var(--ease-soft);align-items:center;gap:6px;text-decoration:none;display:inline-flex}.site-footer a:hover{color:var(--color-accent)}.site-footer .links{flex-wrap:wrap;align-items:center;gap:18px;display:flex}.back{color:var(--color-fg-2);transition:color var(--duration-1) var(--ease-soft);margin-bottom:32px;font-size:14px;text-decoration:none;display:inline-block}.back:hover{color:var(--color-accent)}.project-header{justify-content:space-between;align-items:center;gap:16px;margin-bottom:8px;display:flex}.project-header h1{font-family:var(--font-serif);font-size:var(--fs-post-title);font-weight:var(--fw-regular);line-height:var(--lh-tight);margin:0}.project-tagline{font-size:var(--fs-body);color:var(--color-fg-2);margin:0 0 32px}.project-hero{aspect-ratio:16/9;border-radius:var(--radius-lg);background:var(--color-surface);width:100%;margin-bottom:48px;overflow:hidden}.project-hero>svg,.project-hero>img{object-fit:cover;width:100%;height:100%;display:block}.body-facts{grid-template-columns:2fr 1fr;gap:56px;margin-bottom:64px;display:grid}.body-copy p{font-size:17px;line-height:var(--lh-body);margin:0 0 20px}.body-copy p:last-child{margin-bottom:0}.facts dl{grid-template-columns:max-content 1fr;align-items:baseline;gap:8px 16px;margin:0;font-size:14px;display:grid}.facts dt{color:var(--color-fg-3);font-weight:var(--fw-regular)}.facts dd{color:var(--color-fg-1);margin:0}.facts dd a{color:var(--color-accent);text-decoration:none}.facts dd a:hover{text-underline-offset:3px;text-decoration:underline}@media (width<=720px){.body-facts{grid-template-columns:1fr;gap:32px}.project-header{flex-direction:column;align-items:flex-start}}.post-header{margin-bottom:32px}.post-header h1{font-family:var(--font-serif);font-weight:var(--fw-regular);font-size:var(--fs-post-title);line-height:var(--lh-tight);text-wrap:balance;margin:0 0 12px}.post-meta{font-size:var(--fs-meta);color:var(--color-fg-3);font-variant-numeric:tabular-nums}.prose-body p,.prose-body li{font-size:var(--fs-post-body);line-height:var(--lh-body)}.prose-body p{margin:0 0 24px}.prose-body h2{font-family:var(--font-sans);font-weight:var(--fw-medium);font-size:var(--fs-h2);line-height:var(--lh-tight);margin:48px 0 16px}.prose-body h3{font-family:var(--font-sans);font-weight:var(--fw-medium);font-size:var(--fs-h3);line-height:var(--lh-tight);margin:32px 0 12px}.prose-body a{color:var(--color-accent);text-underline-offset:3px;text-decoration:underline .5px;text-decoration-color:color-mix(in srgb, var(--color-accent) 50%, transparent);transition:text-decoration-color var(--duration-1) var(--ease-soft)}.prose-body a:hover{text-decoration-color:var(--color-accent)}.prose-body code{font-family:var(--font-mono);background:var(--color-surface);border-radius:var(--radius-sm);padding:1px 5px;font-size:.92em}.prose-body pre{background:var(--color-surface);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:var(--fs-code);line-height:var(--lh-code);margin:28px 0;padding:16px 20px;overflow-x:auto}.prose-body pre code{font-size:inherit;background:0 0;padding:0}[data-theme=dark] .prose-body pre,[data-theme=dark] .prose-body pre span{background-color:var(--shiki-dark-bg)!important;color:var(--shiki-dark)!important}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .prose-body pre,:root:not([data-theme=light]) .prose-body pre span{background-color:var(--shiki-dark-bg)!important;color:var(--shiki-dark)!important}}.tok-kw{color:var(--code-keyword)}.tok-str{color:var(--code-string)}.tok-com{color:var(--code-comment);font-style:italic}.post-foot{border-top:var(--border-hairline);color:var(--color-fg-2);flex-wrap:wrap;justify-content:space-between;gap:16px;margin-top:64px;padding-top:24px;font-size:14px;display:flex}.post-foot a{color:var(--color-accent);text-decoration:none}.post-foot a:hover{text-underline-offset:3px;text-decoration:underline}.about-section{margin-bottom:40px}.about-section h2{font-family:var(--font-sans);font-weight:var(--fw-medium);letter-spacing:.02em;color:var(--color-fg-3);text-transform:uppercase;margin:0 0 12px;font-size:13px}.about-section p{font-size:17px;line-height:var(--lh-body);max-width:640px;margin:0 0 14px}.about-section a{color:var(--color-accent);text-underline-offset:3px;text-decoration:underline .5px}.resume-header{margin-bottom:40px}.resume-header h1{font-family:var(--font-serif);font-weight:var(--fw-regular);font-size:var(--fs-post-title);line-height:var(--lh-tight);margin:0 0 8px}.resume-pdf{margin-top:16px;font-size:14px}.resume-pdf a{color:var(--color-accent);text-decoration:none}.resume-pdf a:hover{text-underline-offset:3px;text-decoration:underline}.resume-section{margin-bottom:40px}.resume-section>h2{font-family:var(--font-sans);font-weight:var(--fw-medium);letter-spacing:.02em;text-transform:uppercase;color:var(--color-fg-3);border-bottom:var(--border-hairline);margin:0 0 16px;padding-bottom:12px;font-size:13px}.resume-section>p{font-size:16px;line-height:var(--lh-body);max-width:640px;margin:0}.resume-job{margin-bottom:24px}.resume-job:last-child{margin-bottom:0}.resume-job-head{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:2px;display:flex}.resume-role{font-size:16px;font-weight:var(--fw-medium);color:var(--color-fg-1)}.resume-when{color:var(--color-fg-3);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:13px}.resume-where{color:var(--color-fg-2);margin:0 0 8px;font-size:14px}.resume-job ul{margin:8px 0 0;padding-left:18px}.resume-job li{color:var(--color-fg-1);margin-bottom:4px;font-size:15px;line-height:1.55}.resume-job p{color:var(--color-fg-1);margin:4px 0 0;font-size:15px;line-height:1.55}.resume-job a{color:var(--color-accent);text-decoration:none}.resume-job a:hover{text-underline-offset:3px;text-decoration:underline}@media (width<=520px){.resume-job-head{flex-direction:column;gap:0}}
