@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-400-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-400-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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 Mono";font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-mono-500-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-mono-500-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Jost";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/jost-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Jost";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/jost-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Jost";font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/jost-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Jost";font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/jost-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Newsreader";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/newsreader-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Newsreader";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/newsreader-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper: #f4f0e8;--paper-raised: #f8f5ef;--ink: #14233f;--graphite: #3f4a5e;--graphite-hover: #566072;--rule: #cfc9bc;--rule-strong: #7d8594;--marker: #8ea2b9;--marker-light: #dfe4e8;--signal: #b83227;--signal-hover: #9c2a21;--on-signal: #fbf8f3;--on-ink: #f4f0e8;--code-string: #b5bd8f;--code-number: #d4a373;--sans: "Jost", "Futura", "Century Gothic", sans-serif;--serif: "Newsreader", "Source Serif 4", Georgia, serif;--mono: "IBM Plex Mono", ui-monospace, Menlo, monospace;--space-1: 8px;--space-2: 16px;--space-3: 24px;--space-4: 48px;--space-5: 96px;--radius: 3px;--page-max: 1080px;--prose-max: 680px;--gutter: clamp(16px, 4vw, 48px)}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{display:flex;flex-direction:column;min-height:100vh;min-height:100dvh;margin:0;background:var(--paper);color:var(--ink);font:400 18px/28px var(--serif);text-rendering:optimizeLegibility}h1,h2,h3,p,figure,ul,ol{margin:0}img{max-width:100%;display:block}a{color:inherit}a:hover{color:var(--graphite-hover)}a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--ink);outline-offset:3px}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.page-title{font:500 clamp(36px,6vw,56px)/1.1 var(--sans);letter-spacing:-.02em}.lede{color:var(--graphite);font:400 18px/28px var(--serif)}.label{color:var(--graphite);font:400 13px/16px var(--mono);letter-spacing:.14em;text-transform:uppercase}.container{width:100%;max-width:var(--page-max);margin:0 auto;padding-inline:var(--gutter)}main{flex:1 0 auto;width:100%;padding:var(--space-5) 0}.stack>*+*{margin-top:var(--space-3)}.section{margin-top:var(--space-4)}.site-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--rule)}.wordmark{display:inline-flex;align-items:center;min-height:44px;font:500 22px/28px var(--sans);text-decoration:none}.dot{color:var(--signal)}.site-nav ul{display:flex;flex-wrap:wrap;column-gap:var(--space-3);padding:0;list-style:none}.site-nav a{display:inline-flex;align-items:center;min-height:44px;text-decoration:none;text-underline-offset:6px}.site-nav a:hover{color:var(--graphite);text-decoration:underline}.site-nav a[aria-current=page]{color:var(--ink)}.site-footer{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--space-2);padding:var(--space-3) 0 var(--space-4);border-top:1px solid var(--rule)}.section-heading{display:flex;align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-3)}.section-heading .num{font:500 14px/28px var(--mono);letter-spacing:.04em}.section-heading .hairline{flex:0 0 48px;align-self:flex-start;height:14px;border-bottom:1px solid var(--rule)}.section-heading h2{flex:1 1 0;min-width:0;font:500 22px/28px var(--sans)}.rows{padding:0;list-style:none;border-top:1px solid var(--rule)}.row{display:flex;align-items:center;gap:var(--space-2);min-height:56px;padding:var(--space-1) 0;border-bottom:1px solid var(--rule);text-decoration:none}.row[href]:hover{background:var(--paper-raised);color:var(--ink)}.row>.label{flex:0 0 96px}.row .value{flex:1 1 0;min-width:0;overflow:hidden;font:400 18px/28px var(--sans);text-overflow:ellipsis;white-space:nowrap}.arrow{flex:0 0 20px;width:20px;height:12px;stroke:var(--ink);stroke-width:1;fill:none}.post-row{flex-wrap:wrap;align-items:baseline;column-gap:var(--space-3);padding:var(--space-3) 0}.post-row>.date{flex:0 0 120px}.post-row .body{flex:1 1 320px;min-width:0}.post-row .title{font:500 22px/28px var(--sans)}.post-row .title,.post-row .summary{display:block}.post-row .summary{margin-top:var(--space-1);color:var(--graphite);font:400 16px/24px var(--serif)}.post-row .meta{display:flex;align-items:center;gap:var(--space-3);margin-left:auto}@media (max-width: 640px){.post-row>.date{flex-basis:100%}}.button{display:inline-flex;align-items:center;height:48px;padding:0 var(--space-3);border:0;border-radius:var(--radius);background:var(--signal);color:var(--on-signal);font:500 14px/1 var(--mono);letter-spacing:.04em;text-decoration:none;cursor:pointer}.button:hover{background:var(--signal-hover);color:var(--on-signal)}.figure{margin:var(--space-3) 0;padding:var(--space-3);border:1px solid var(--rule);border-radius:var(--radius);background:var(--paper-raised)}.figure figcaption{margin-bottom:var(--space-2)}.field{display:block}.field .label{display:block;margin-bottom:var(--space-1)}.field input,.field textarea{display:block;width:100%;min-height:48px;padding:0 var(--space-2);border:1px solid var(--rule-strong);border-radius:var(--radius);background:var(--paper-raised);color:var(--ink);font:400 18px/28px var(--sans)}.field input::placeholder,.field textarea::placeholder{color:var(--graphite)}.field input:focus,.field textarea:focus{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink);outline:none}.field textarea{padding:var(--space-1) var(--space-2);resize:vertical}.prose{max-width:var(--prose-max)}.prose>*+*{margin-top:var(--space-3)}.prose a{text-underline-offset:3px}.prose code{padding:2px 6px;border-radius:var(--radius);background:var(--marker-light);font:400 15px var(--mono)}.mermaid{overflow-x:auto;background:none;font:400 14px/24px var(--mono);text-align:center}.article{max-width:var(--prose-max);margin:0 auto}.article header>*+*{margin-top:var(--space-2)}.article .article-lede{font-size:22px}.article-body{margin-top:var(--space-4);counter-reset:section}.article-body h2{display:grid;grid-template-columns:auto 48px 1fr;column-gap:var(--space-2);align-items:start;margin-top:var(--space-4);font:500 28px/32px var(--sans);letter-spacing:-.01em;counter-increment:section}.article-body h2::before{content:counter(section, decimal-leading-zero);font:500 14px/32px var(--mono);letter-spacing:.04em}.article-body h2::after{content:"";grid-column:2;grid-row:1;align-self:start;height:16px;border-bottom:1px solid var(--rule)}.article-body h3{margin-top:var(--space-4);font:500 22px/28px var(--sans)}.article-body ul,.article-body ol{padding-left:var(--space-3)}.article-body li+li{margin-top:var(--space-1)}.article-body blockquote{margin:var(--space-3) 0;padding-left:var(--space-2);border-left:1px solid var(--rule-strong);color:var(--graphite)}.article-body hr{border:0;border-top:1px solid var(--rule)}.article-body table{width:100%;border-collapse:collapse;font-size:16px}.article-body th,.article-body td{padding:var(--space-1) var(--space-2) var(--space-1) 0;border-bottom:1px solid var(--rule);text-align:left}.article-body th{color:var(--graphite);font:400 13px/16px var(--mono);letter-spacing:.14em;text-transform:uppercase}.code-block{overflow:hidden;border-radius:var(--radius);background:var(--ink);color:var(--on-ink)}.code-block .code-head{display:flex;justify-content:space-between;gap:var(--space-2);padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--rule-strong);color:var(--marker)}.code-block .code-head:not(:has(span:not(:empty))){display:none}.code-block pre{margin:0;padding:var(--space-3);overflow-x:auto;overflow-y:hidden;background:none}.code-block code{padding:0;background:none;color:inherit;font:400 14px/24px var(--mono)}.z-code{color:var(--on-ink)}.z-2{color:var(--rule-strong)}.z-3{color:var(--marker)}.z-4,.z-5{color:var(--marker-light)}.z-6{color:var(--code-string)}.z-1,.z-7,.z-8,.z-9,.z-10{color:var(--code-number)}.z-b,.z-i{font-style:normal;font-weight:inherit}.section-label{margin-bottom:var(--space-3)}.section-label .label{line-height:28px}.about{display:grid;grid-template-columns:minmax(0, 1fr) 240px;grid-template-areas:"head portrait" "bio projects";column-gap:var(--space-4);row-gap:var(--space-4)}.about .about-head{grid-area:head;align-self:center}.about .portrait{grid-area:portrait;max-width:240px;align-self:center}.about .about-bio{grid-area:bio}.about .about-projects{grid-area:projects}.about .about-projects>.label{margin-bottom:var(--space-2)}.about .about-projects .row{flex-wrap:wrap;row-gap:0}.about .about-projects .row>.label{flex-basis:100%}@media (max-width: 760px){.about{grid-template-columns:minmax(0, 1fr);grid-template-areas:"portrait" "head" "bio" "projects"}.about .portrait{max-width:160px}}.stay-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--rule)}.portrait{width:100%;max-width:312px;height:auto;aspect-ratio:1;mix-blend-mode:multiply}.portrait-small{flex:0 0 86px;width:86px}.card{width:100%;max-width:390px;min-height:844px;margin:0 auto;padding:var(--space-3);background:var(--paper)}.card .card-top{display:flex;align-items:center;justify-content:space-between;min-height:44px}.card .card-monogram{font:500 22px/28px var(--sans)}.card .card-title{margin-top:var(--space-2);font:500 52px/52px var(--sans);letter-spacing:-.03em}.card .card-tagline{margin-top:var(--space-1)}.card .card-codes{display:flex;gap:var(--space-2);align-items:flex-start;margin-top:var(--space-3)}.card .card-qr .label{display:block;margin-top:var(--space-1)}.card .card-rows{margin-top:var(--space-3)}.card .card-rows .row{min-height:48px}.card .card-rows .row>.label{flex-basis:96px}.card .card-save{justify-content:center;width:100%;margin-top:var(--space-3)}.card .card-links{display:flex;gap:var(--space-3);margin-top:var(--space-4);padding-top:var(--space-2);border-top:1px solid var(--rule)}.card .card-links a{display:inline-flex;align-items:center;min-height:44px;text-decoration:none}.qr{position:relative;display:grid;place-items:center;width:240px;max-width:62vw;aspect-ratio:1;border:1px solid var(--rule);background:var(--paper-raised);color:var(--graphite);font:400 13px/16px var(--mono);letter-spacing:.14em;border-radius:var(--radius)}.qr svg{width:100%;height:100%;padding:var(--space-2);color:var(--ink)}.qr::before,.qr::after{content:"";position:absolute;top:-8px;left:-8px;border-color:var(--rule-strong);border-style:solid;border-width:0}.qr::before{width:16px;height:8px;border-bottom-width:1px}.qr::after{width:8px;height:16px;border-right-width:1px}.card-close{display:grid;place-items:center;width:44px;height:44px;margin-right:calc(-1*var(--space-2));border:0;background:none;cursor:pointer}.card-close svg{width:12px;height:12px;stroke:var(--ink);stroke-width:1.5}.card-dialog{max-height:calc(100dvh - var(--space-4));padding:0;border:1px solid var(--ink);border-radius:var(--radius);background:var(--paper);color:var(--ink);overflow-y:auto}.card-dialog::backdrop{background:color-mix(in srgb, var(--ink) 55%, rgba(0,0,0,0))}.card-dialog .card{min-height:0}.card-page main{padding:0}.card-page main{padding:0}.cv{max-width:480px}.cv-form{display:grid;gap:var(--space-3);justify-items:start}.cv-form .field{width:100%}.cv-direct{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--rule);font-size:16px;line-height:24px}.cv-direct a{text-underline-offset:3px}.about-lede{margin-top:var(--space-2);font-size:22px}.icon-row .icon-cell{display:grid;flex:0 0 24px;place-items:center start}.icon{width:18px;height:18px;color:var(--ink)}