@import"https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,300;1,9..144,400;1,9..144,500;1,9..144,600&family=Instrument+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--cream: #F5F0E8;--cream-deep: #EFE7DA;--cream-edge: #E6DDCB;--tan: #EBDFC9;--tan-soft: #F1E8D7;--tan-deep: #D9C7A6;--tan-edge: #C9B68F;--ink: #14110D;--ink-2: #2B2620;--ink-3: #574E42;--ink-4: #8A7E6C;--ink-5: #B8AC97;--rust: #C0392B;--rust-deep: #9E2C20;--rust-soft: #E5BFB9;--rust-wash: #F4E2DE;--gray-callout:#E8E5E0;--gray-rule: #D6D1C8;--gray-mono: #43403B;--positive: #4E6A3E;--warning: #B8801E;--negative: #9E2C20;--info: #3D5A6B;--serif: "Fraunces", "Source Serif Pro", Georgia, "Times New Roman", serif;--sans: "Instrument Sans", "Söhne", "Inter", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;--mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--t-display-1: 700 64px/1.05 var(--serif);--t-display-2: 600 48px/1.08 var(--serif);--t-h1: 600 40px/1.12 var(--serif);--t-h2: 600 30px/1.18 var(--serif);--t-h3: 600 22px/1.25 var(--serif);--t-h4: 600 18px/1.3 var(--serif);--t-lede: 400 22px/1.45 var(--serif);--t-body: 400 17px/1.55 var(--serif);--t-body-sm: 400 15px/1.5 var(--serif);--t-italic: italic 400 17px/1.55 var(--serif);--t-ui: 500 14px/1.3 var(--sans);--t-ui-sm: 500 12px/1.3 var(--sans);--t-label: 500 12px/1.2 var(--sans);--t-mono: 500 13px/1.45 var(--mono);--t-mono-sm: 500 11px/1.4 var(--mono);--t-section-no:600 12px/1 var(--mono);--t-callout: 400 14px/1.55 var(--mono);--tr-tight: -.01em;--tr-normal: 0;--tr-wide: .04em;--tr-extra: .14em;--s-1: 4px;--s-2: 8px;--s-3: 12px;--s-4: 16px;--s-5: 24px;--s-6: 32px;--s-7: 48px;--s-8: 64px;--s-9: 96px;--s-10: 128px;--r-0: 0;--r-1: 2px;--r-2: 4px;--r-3: 6px;--r-pill: 999px;--shadow-0: none;--shadow-1: 0 1px 0 rgba(20,17,13,.04), 0 1px 2px rgba(20,17,13,.04);--shadow-2: 0 2px 6px rgba(20,17,13,.06), 0 8px 24px rgba(20,17,13,.06);--shadow-3: 0 10px 40px rgba(20,17,13,.12);--border-hair: 1px solid var(--cream-edge);--border-card: 1px solid var(--tan-edge);--border-strong: 1px solid var(--ink);--border-rust: 1px solid var(--rust);--border-rule: 1px solid var(--gray-rule);--container: 1200px;--container-rd: 900px;--gutter: 32px}html,body{background:var(--cream);color:var(--ink-2);font:var(--t-body);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1{font:var(--t-h1);color:var(--ink);letter-spacing:var(--tr-tight)}h2{font:var(--t-h2);color:var(--ink);letter-spacing:var(--tr-tight)}h3{font:var(--t-h3);color:var(--ink)}h4{font:var(--t-h4);color:var(--ink)}p{font:var(--t-body);color:var(--ink-2);text-wrap:pretty}a{color:var(--rust);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--rust-deep);text-decoration-thickness:2px}code,kbd,samp{font:var(--t-mono);color:var(--gray-mono);background:var(--gray-callout);padding:2px 6px;border-radius:var(--r-1)}hr{border:0;border-top:var(--border-rule);margin:var(--s-6) 0}.eyebrow,.smallcaps{font:var(--t-label);text-transform:uppercase;letter-spacing:var(--tr-extra);color:var(--ink-3)}.section-no{font:var(--t-section-no);color:var(--rust);letter-spacing:var(--tr-extra);text-transform:uppercase}.italic-note{font:var(--t-italic);color:var(--ink-3)}.lede{font:var(--t-lede);color:var(--ink);text-wrap:balance;max-width:38ch}.card{background:var(--tan-soft);border:var(--border-card);border-radius:var(--r-2);padding:var(--s-5)}.callout{background:var(--gray-callout);border-left:2px solid var(--ink);font:var(--t-callout);color:var(--gray-mono);padding:var(--s-4) var(--s-5)}::selection{background:var(--rust);color:var(--cream)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--cream);color:var(--ink-2);font:var(--t-body)}:root{--accent: var(--rust);--accent-deep: var(--rust-deep);--accent-soft: var(--rust-soft);--accent-wash: var(--rust-wash);--rail: 720px;--site-w: 880px;--pad-x: 48px}::selection{background:var(--accent);color:var(--cream)}a{color:var(--accent);text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px;transition:color .18s ease}a:hover{color:var(--accent-deep)}.site{min-height:100vh;display:flex;flex-direction:column;max-width:var(--site-w);margin:0 auto;padding:0 var(--pad-x)}.ft-header{display:flex;align-items:center;justify-content:space-between;padding:40px 0 56px}.ft-header .brand{display:inline-flex;align-items:baseline;gap:6px;text-decoration:none}.ft-header .brand .mono{font:var(--t-mono);font-size:14px;color:var(--ink);letter-spacing:var(--tr-tight);font-weight:600}.ft-header .brand .dot{width:5px;height:5px;background:var(--accent);border-radius:50%;transform:translateY(-1px)}.ft-header .brand:hover .mono{color:var(--ink)}.ft-header .brand:hover .dot{background:var(--accent-deep)}.ft-nav{display:flex;gap:28px}.ft-nav a{font:var(--t-mono);font-size:13px;color:var(--ink-3);text-decoration:none;letter-spacing:0;padding-bottom:2px;border-bottom:1px solid transparent;transition:color .18s ease,border-color .18s ease}.ft-nav a:hover{color:var(--ink)}.ft-nav a.active{color:var(--ink);border-bottom-color:var(--accent)}.ft-footer{margin-top:auto;padding:56px 0 40px;border-top:1px solid var(--cream-edge);display:flex;justify-content:space-between;align-items:baseline;font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.ft-footer a{color:var(--ink-4);text-decoration:none}.ft-footer a:hover{color:var(--accent)}.ft-footer .links{display:flex;gap:20px}.page{padding:16px 0 96px}.eyebrow{font:var(--t-mono-sm);color:var(--accent);letter-spacing:var(--tr-extra);text-transform:uppercase;margin-bottom:24px}h1.display{font:600 56px/1.05 var(--serif);font-variation-settings:"opsz" 144;letter-spacing:-.015em;color:var(--ink);margin:0 0 32px;max-width:16ch;text-wrap:balance}h1.display em{color:var(--accent);font-style:italic;font-weight:500}h1.page-title{font:600 40px/1.1 var(--serif);font-variation-settings:"opsz" 144;letter-spacing:-.01em;color:var(--ink);margin:0 0 12px}h2.section{font:600 24px/1.2 var(--serif);color:var(--ink);margin:56px 0 16px}.lede{font:400 19px/1.55 var(--serif);color:var(--ink-2);text-wrap:pretty;max-width:38ch;margin:0 0 40px}.prose{max-width:var(--rail)}.prose p{font:400 17px/1.7 var(--serif);color:var(--ink-2);margin:0 0 24px;text-wrap:pretty}.prose p em{font-style:italic;color:var(--ink)}.prose p strong{font-weight:600;color:var(--ink)}.prose p a{color:var(--accent)}.prose h2{font:600 24px/1.3 var(--serif);color:var(--ink);margin:56px 0 16px;letter-spacing:-.005em}.prose h3{font:600 18px/1.3 var(--serif);color:var(--ink);margin:40px 0 12px}.prose ol,.prose ul{font:400 17px/1.7 var(--serif);color:var(--ink-2);padding-left:24px;margin:0 0 24px}.prose ol li,.prose ul li{margin-bottom:8px}.prose ol{list-style:decimal}.prose ul{list-style:disc}.prose blockquote{border-left:2px solid var(--accent);padding:4px 0 4px 24px;margin:32px 0;font:italic 400 19px/1.55 var(--serif);color:var(--ink-3)}.prose code{font:500 .9em/1 var(--mono);background:var(--gray-callout);color:var(--gray-mono);padding:1px 6px;border-radius:var(--r-1)}.prose pre{font:500 13px/1.6 var(--mono);background:var(--ink);color:#e6ddcb;padding:24px 28px;margin:32px 0;border-radius:var(--r-2);overflow-x:auto;border:1px solid var(--ink)}.prose pre code{font:inherit;background:transparent;color:inherit;padding:0;border-radius:0}.prose pre .tok-k{color:#e5bfb9}.prose pre .tok-s{color:#c9b68f}.prose pre .tok-c{color:#8a7e6c;font-style:italic}.prose pre .tok-n{color:#ebdfc9}.prose pre .tok-f{color:#f5f0e8;font-weight:600}.prose pre .tok-p{color:#b8ac97}.prose table{width:100%;border-collapse:collapse;margin:32px 0;font:400 15px/1.5 var(--serif)}.prose th,.prose td{text-align:left;padding:12px 16px;border-bottom:1px solid var(--cream-edge)}.prose th{font:var(--t-mono-sm);text-transform:uppercase;letter-spacing:var(--tr-extra);color:var(--ink-4);border-bottom:1px solid var(--ink);padding-bottom:10px}.prose td{color:var(--ink-2)}.prose tbody tr:last-child td{border-bottom:none}.prose figure{margin:40px 0}.prose figure .img{width:100%;aspect-ratio:16/9;background:var(--tan-soft);border:1px solid var(--tan-edge);border-radius:var(--r-2);display:flex;align-items:center;justify-content:center;font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.prose figure figcaption{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:.04em;margin-top:12px;text-align:left}.prose hr,hr.rule{border:0;border-top:1px solid var(--cream-edge);margin:56px 0}.home{padding-top:24px}.home .role-line{font:var(--t-mono);font-size:14px;color:var(--ink-3);letter-spacing:0;margin-bottom:40px}.home .role-line .sep{color:var(--accent);padding:0 8px}.home .intro{max-width:56ch;margin-bottom:56px}.home .intro p{font:400 18px/1.65 var(--serif);color:var(--ink-2);margin:0 0 20px;text-wrap:pretty}.home .quick-links{list-style:none;padding:0;margin:56px 0 0;display:grid;grid-template-columns:1fr;gap:0;border-top:1px solid var(--cream-edge)}.home .quick-links li{border-bottom:1px solid var(--cream-edge)}.home .quick-links a{display:grid;grid-template-columns:90px 1fr 24px;gap:24px;align-items:baseline;padding:20px 0;text-decoration:none;color:var(--ink-2);transition:color .18s ease,padding .18s ease}.home .quick-links a:hover{color:var(--ink);padding-left:8px}.home .quick-links a:hover .arrow{color:var(--accent);transform:translate(4px)}.home .quick-links .label{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.home .quick-links .desc{font:400 16px/1.4 var(--serif);color:var(--ink-2)}.home .quick-links .arrow{font:var(--t-mono);color:var(--ink-4);text-align:right;transition:color .18s ease,transform .18s ease}.about .meta-line{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase;margin-bottom:32px}.about .meta-line .sep{padding:0 10px;color:var(--ink-5)}.about-facts{border-top:1px solid var(--cream-edge);border-bottom:1px solid var(--cream-edge);margin:64px 0 0;padding:24px 0;display:grid;grid-template-columns:repeat(2,1fr);gap:16px 32px}.about-facts .fact{display:grid;grid-template-columns:100px 1fr;gap:16px}.about-facts .fact .k{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.about-facts .fact .v{font:400 15px/1.4 var(--serif);color:var(--ink-2)}.projects-list{list-style:none;padding:0;margin:48px 0 0;border-top:1px solid var(--ink)}.proj{display:grid;grid-template-columns:50px 1fr;gap:32px;padding:32px 0;border-bottom:1px solid var(--cream-edge)}.proj.featured{background:linear-gradient(to right,var(--accent-wash) 0%,transparent 70%);padding-left:16px;padding-right:16px;margin:0 -16px}.proj .idx{font:var(--t-mono);font-size:13px;color:var(--accent);letter-spacing:var(--tr-extra);padding-top:4px}.proj .body{display:flex;flex-direction:column;gap:8px}.proj .head{display:flex;justify-content:space-between;align-items:baseline;gap:16px}.proj .name{font:600 22px/1.2 var(--serif);color:var(--ink);margin:0;display:inline-flex;align-items:baseline;flex-wrap:wrap;gap:12px}.proj .name a{color:inherit;text-decoration:none}.proj .name a:hover,.proj .name a:hover .ext{color:var(--accent)}.proj .name .ext{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);margin-left:8px;vertical-align:4px;transition:color .18s ease}.proj .name .status{font:var(--t-mono-sm);color:var(--accent);letter-spacing:var(--tr-extra);text-transform:uppercase;font-size:10.5px;font-weight:600;vertical-align:4px;white-space:nowrap}.proj .years{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase;white-space:nowrap}.proj .role{font:italic 400 14px/1.4 var(--serif);color:var(--ink-3)}.proj .blurb{font:400 16px/1.55 var(--serif);color:var(--ink-2);margin:4px 0 0;max-width:60ch}.proj .badge{font:var(--t-mono-sm);color:var(--accent);letter-spacing:var(--tr-extra);text-transform:uppercase;margin-top:4px}.blog .lede{margin-bottom:56px}.posts{list-style:none;padding:0;margin:0;border-top:1px solid var(--ink)}.post-row{border-bottom:1px solid var(--cream-edge)}.post-row a{display:grid;grid-template-columns:110px 1fr 24px;gap:32px;align-items:baseline;padding:24px 0;text-decoration:none;color:inherit;transition:padding .18s ease}.post-row a:hover{padding-left:8px}.post-row a:hover .arr{color:var(--accent);transform:translate(4px)}.post-row a:hover .title{color:var(--accent)}.post-row .date{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.post-row .body{display:flex;flex-direction:column;gap:6px}.post-row .title{font:600 20px/1.25 var(--serif);color:var(--ink);margin:0;transition:color .18s ease}.post-row .desc{font:400 15px/1.5 var(--serif);color:var(--ink-3)}.post-row .arr{font:var(--t-mono-sm);color:var(--ink-4);text-align:right;transition:color .18s ease,transform .18s ease}.year-divider{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase;padding:32px 0 8px}.post-page .back{display:inline-flex;align-items:baseline;gap:8px;font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase;text-decoration:none;margin-bottom:56px}.post-page .back:hover{color:var(--accent)}.post-page .back .ar{transition:transform .18s ease}.post-page .back:hover .ar{transform:translate(-4px)}.post-page header.post-head{margin-bottom:56px}.post-page .post-meta{font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase;margin-bottom:24px}.post-page .post-meta .sep{color:var(--ink-5);padding:0 10px}.post-page h1.post-title{font:600 44px/1.1 var(--serif);font-variation-settings:"opsz" 144;letter-spacing:-.015em;color:var(--ink);margin:0 0 16px;max-width:22ch;text-wrap:balance}.post-page .post-sub{font:italic 400 19px/1.5 var(--serif);color:var(--ink-3);max-width:42ch}.post-page .post-foot{margin-top:96px;padding-top:32px;border-top:1px solid var(--cream-edge);display:flex;justify-content:space-between;align-items:baseline;font:var(--t-mono-sm);color:var(--ink-4);letter-spacing:var(--tr-extra);text-transform:uppercase}.post-page .post-foot a{color:var(--ink-4);text-decoration:none}.post-page .post-foot a:hover{color:var(--accent)}body.density-tight .ft-header{padding:28px 0 40px}body.density-tight .ft-footer{padding:40px 0 28px}body.density-tight .home .intro p{font-size:16px;line-height:1.6}body.density-tight .prose p{font-size:15.5px;line-height:1.6}body.density-tight .home .quick-links a{padding:14px 0}body.density-tight .post-row a{padding:16px 0}body.density-tight .proj{padding:20px 0}body.lean-mono .home .intro p,body.lean-mono .home .quick-links .desc,body.lean-mono .lede,body.lean-mono .about .meta-line,body.lean-mono .post-row .desc,body.lean-mono .proj .blurb,body.lean-mono .post-page .post-sub{font-family:var(--mono);font-size:14px;line-height:1.65;letter-spacing:0}body.lean-mono .prose p,body.lean-mono .prose ol,body.lean-mono .prose ul{font-family:var(--mono);font-size:14.5px;line-height:1.75}body.lean-mono h1.display,body.lean-mono h1.page-title,body.lean-mono h1.post-title{font-family:var(--mono);font-weight:600;letter-spacing:-.02em;font-size:38px;line-height:1.15}body.lean-mono h2.section,body.lean-mono .prose h2,body.lean-mono .post-row .title,body.lean-mono .proj .name{font-family:var(--mono);font-weight:600;letter-spacing:-.01em}body.lean-mono .home .role-line{font-size:13px}
