:root{--font-family-heading:'Inter', system-ui, sans-serif;--font-family-paragraph:'Inter', system-ui, sans-serif;--font-family-mono:'JetBrains Mono', ui-monospace, monospace;--font-family-serif:'Source Serif 4', Georgia, serif;--font-family-content:'Source Serif 4', Georgia, serif;--font-family-highlight:'JetBrains Mono', ui-monospace, monospace;--font-family-monospace:'JetBrains Mono', ui-monospace, monospace;--base-color:#ffffff;--base-offset-color:#f4f2ec;--highlight-color:#E63946;--heading-color:#111111;--text-color:#1a1a1a;--muted-color:#888888;--hairline-color:#eeeeee}body,html{margin:0;padding:0}ol,ul{margin:0;padding:0;list-style:none}ol li,ul li{list-style:none}h1,h2,h3{margin-top:20px;margin-bottom:20px}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;font-family:var(--font-family-mono);font-size:12px;letter-spacing:.04em}@media(min-width:767px){.header{margin-bottom:40px}}.header a.header-logo{font-weight:500;text-transform:uppercase;color:var(--highlight-color);text-decoration:none;margin-right:30px}.hamburger-trigger{height:30px;display:flex;align-items:center}@media(min-width:992px){.hamburger-trigger{display:none}}.hamburger{border:none;cursor:pointer;outline:none;position:relative;display:block;width:30px;height:20px;background:0 0;border-top:2px solid;border-bottom:2px solid;font-size:0;transition:all .25s ease-in-out;color:var(--highlight-color)}.hamburger:before,.hamburger:after{content:'';display:block;width:100%;height:2px;position:absolute;top:50%;left:50%;background:currentColor;transform:translate(-50%,-50%);transition:transform .25s ease-in-out}.hamburger:hover{opacity:.7}.hamburger.is-active{border-color:transparent;z-index:100;color:var(--base-color)}.hamburger.is-active:hover{opacity:1}.hamburger.is-active:before{transform:translate(-50%,-50%)rotate(45deg)}.hamburger.is-active:after{transform:translate(-50%,-50%)rotate(-45deg)}.footer{display:flex;justify-content:space-between;align-items:baseline;font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);margin-top:40px;padding-top:14px;border-top:1px solid var(--hairline-color)}.footer a{color:var(--muted-color);text-decoration:none;margin-left:12px}.footer a:hover{color:var(--highlight-color)}a{color:var(--highlight-color);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3{font-size:2em;margin-top:20px;margin-bottom:20px;color:var(--heading-color);font-family:var(--font-family-heading)}p{color:var(--text-color)}ol,ul{margin:0;padding:0;list-style:none}ol li,ul li{list-style:none}.content{font-size:18px}.content p{font-size:24px;line-height:1.6;margin:0;padding:0;margin-bottom:20px}.content h1{font-size:40px;line-height:1.6;font-weight:700;margin-top:30px;margin-bottom:20px}.content h1:first-of-type{margin-top:0}.content h2{font-size:28px;line-height:1.4;font-weight:700;margin-top:30px;margin-bottom:20px}.content h2:first-of-type{margin-top:0}@media(min-width:767px){.content h2{font-size:30px;line-height:1.4}}.content h3{font-size:22px;line-height:1.4;font-weight:700;margin-top:30px;margin-bottom:20px}.content ul{list-style:disc}.content ul li{list-style:disc}.content ol{list-style:decimal}.content ol li{list-style:decimal}.content ul,.content ol{margin-left:0;margin-top:10px;margin-bottom:20px}.content ul li,.content ol li{font-size:18px;line-height:20px;margin-bottom:10px;margin-left:0}@media(min-width:767px){.content ul li,.content ol li{margin-left:20px}}@media(min-width:767px){.content ul,.content ol{margin-left:20px}}.content a{text-decoration:underline}.content blockquote{border-left:5px solid var(--highlight-color);margin:30px 0;padding:20px}.content blockquote p{font-size:20px;display:inline;color:var(--color-base-text)}.content img{margin:40px 0;max-width:100%;height:auto}.content figure{margin:2.6rem 0 1.18rem}.content figure img{margin:0}.content figure figcaption{margin-top:10px}.content figure figcaption h4{margin:0;font-size:1rem;font-weight:700}.content figure figcaption p{margin:0}.content code,.content pre{font-family:var(--font-family-monospace)}.content .highlight pre{border-radius:3px;font-size:14px;line-height:18px;padding:30px;overflow:auto;font-family:var(--font-family-monospace)}.dot{color:var(--highlight-color)}.footnotes ol{list-style:decimal}.footnotes ol li{list-style:decimal}.intro{margin-bottom:40px}.intro h1{font-family:var(--font-family-heading);font-weight:900;letter-spacing:-.025em;color:var(--heading-color);font-size:40px;line-height:1.05;margin-top:0;margin-bottom:18px}@media(min-width:767px){.intro h1{width:92%;font-size:56px;line-height:1.02;margin-bottom:22px}}.intro h1 strong{color:var(--highlight-color)}.intro h2{font-family:var(--font-family-heading);font-weight:900;font-size:34px;line-height:1.1}@media(min-width:767px){.intro h2{width:80%}}.intro h3{font-family:var(--font-family-heading);font-weight:800;letter-spacing:-.015em;color:var(--heading-color);font-size:20px;line-height:1.25;margin:0 0 18px}@media(min-width:767px){.intro h3{font-size:24px}}.intro p{font-family:var(--font-family-serif);font-size:18px;line-height:1.6;color:#333}@media(min-width:767px){.intro p{width:80%;font-size:19px}}.intro .read-more{font-family:var(--font-family-mono);font-size:13px;font-weight:500}.intro img{max-width:75%}.summary{margin-bottom:50px;font-size:18px;line-height:24px;font-family:var(--font-family-highlight)}@media(min-width:767px){.summary{margin-bottom:80px;font-size:18px;line-height:26px}}.summary .summary-date{font-weight:700;color:var(--heading-color)}.summary .summary-title{margin:16px 0;width:80%;font-size:34px;line-height:38px}@media(min-width:767px){.summary .summary-title{width:80%;font-size:52px;line-height:58px}}.summary .summary-description{width:80%}.author{margin-top:30px;margin-bottom:30px;color:var(--heading-color)}.author img{width:30px;height:30px;border-radius:50%;display:inline-block;vertical-align:middle;border:2px solid var(--heading-color)}.author .author-name{display:inline-block;vertical-align:middle;font-weight:700;margin-left:5px}.author .author-date{display:inline-block;vertical-align:middle}.author-large{font-size:20px}.author-large img{width:50px;height:50px}.author-large .author-name{display:inline-block;vertical-align:middle;font-weight:700;margin-left:5px}.author-large .author-title{display:inline-block;vertical-align:middle}ul.pagination{display:flex;justify-content:center;list-style:none;margin:20px 0;padding:0}ul.pagination li{list-style:none;text-decoration:none;border:2px solid var(--highlight-color);border-right:none;text-align:center;vertical-align:middle}ul.pagination li:hover{border-color:var(--highlight-color);background-color:var(--highlight-color);color:#fff}ul.pagination li:hover a{color:#fff}ul.pagination li.pagination-item-current{border-color:var(--highlight-color);background-color:var(--highlight-color);color:#fff}ul.pagination li.pagination-item-current a{color:#fff}ul.pagination li a{padding:9px 13px;display:block;color:var(--highlight-color);text-decoration:none}ul.pagination li:last-of-type{border-right:2px solid var(--highlight-color);border-top-right-radius:3px;border-bottom-right-radius:3px}ul.pagination li:last-of-type:hover{border-color:var(--highlight-color)}ul.pagination li:last-of-type.active{border-color:var(--highlight-color)}ul.pagination li:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px}ul.pagination li svg{width:8px;line-height:10px;margin-bottom:2px;vertical-align:middle}.menu-main{display:none;flex:0}@media(min-width:992px){.menu-main{display:block}}.menu-main>ul{display:flex;align-items:center;justify-content:flex-start;list-style:none;margin:0;padding:0}.menu-main>ul>li{margin-left:14px}.menu-main>ul>li>a{display:inline-block;color:var(--highlight-color);text-decoration:none}.menu-main>ul>li>a:hover{text-decoration:underline}.menu-main>ul>li.active>a{font-weight:500}.menu-main>ul>li:first-of-type{margin-left:0}.menu-main-mobile{position:fixed;background:var(--highlight-color);top:0;left:0;width:100%;height:100vh;opacity:0;visibility:hidden;transition:opacity .35s,visibility .35s,height .35s;overflow:hidden;display:none;justify-content:center;flex-direction:column}.menu-main-mobile.open{opacity:1;visibility:visible;height:100%;z-index:10;display:flex}.menu-main-mobile.open li{animation:fadeInTop .5s ease forwards;animation-delay:.1s}.menu-main-mobile.open li:nth-of-type(2){animation-delay:.15s}.menu-main-mobile.open li:nth-of-type(3){animation-delay:.2s}.menu-main-mobile.open li:nth-of-type(4){animation-delay:.25s}.menu-main-mobile.open li:nth-of-type(5){animation-delay:.3s}.menu-main-mobile.open li:nth-of-type(6){animation-delay:.35s}.menu-main-mobile ul{font-size:2rem;font-family:var(--font-family-heading);text-align:center;list-style:none;margin:0;flex:0}.menu-main-mobile ul li{display:block;position:relative;opacity:0}.menu-main-mobile ul li a{display:block;position:relative;color:var(--base-color);text-decoration:none}.menu-main-mobile ul li a:hover{opacity:.7}.menu-main-mobile ul li ul.sub-menu{font-size:1.2rem}.hamburger-trigger{height:30px;display:flex;align-items:center}@media(min-width:992px){.hamburger-trigger{display:none}}.hamburger{border:none;cursor:pointer;outline:none;position:relative;display:block;width:30px;height:20px;background:0 0;border-top:2px solid;border-bottom:2px solid;font-size:0;transition:all .25s ease-in-out;color:var(--highlight-color)}.hamburger:before,.hamburger:after{content:'';display:block;width:100%;height:2px;position:absolute;top:50%;left:50%;background:currentColor;transform:translate(-50%,-50%);transition:transform .25s ease-in-out}.hamburger:hover{opacity:.7}.hamburger.is-active{border-color:transparent;z-index:100;color:var(--base-color)}.hamburger.is-active:hover{opacity:1}.hamburger.is-active:before{transform:translate(-50%,-50%)rotate(45deg)}.hamburger.is-active:after{transform:translate(-50%,-50%)rotate(-45deg)}@keyframes fadeInTop{0%{opacity:0;top:20%}100%{opacity:1;top:0}}.tiles{display:grid;grid-template-columns:1fr;gap:10px;margin-top:10px}@media(min-width:767px){.tiles{grid-template-columns:repeat(3,minmax(0,1fr))}}.tile{display:flex;flex-direction:column;justify-content:space-between;min-height:130px;padding:16px 18px;border:1px solid var(--hairline-color);color:var(--heading-color);text-decoration:none;transition:border-color .15s ease}.tile:hover{border-color:var(--heading-color)}.tile .tile-label{font-family:var(--font-family-mono);font-size:10px;letter-spacing:.08em;color:var(--muted-color);margin-bottom:10px}.tile .tile-title{font-family:var(--font-family-heading);font-weight:900;font-size:19px;letter-spacing:-.02em;line-height:1.1}.tile .tile-title .dot{color:var(--highlight-color)}.tile .tile-sub{font-size:12px;color:#555;margin-top:14px;line-height:1.4}.tile-accent{background:var(--heading-color);border-color:var(--heading-color);color:#fff}.tile-accent .tile-label{color:var(--highlight-color)}.tile-accent .tile-title{color:#fff}.tile-accent .tile-sub{color:#bbb}.tile-accent:hover{border-color:var(--highlight-color)}.section-head{font-family:var(--font-family-mono);font-size:11px;letter-spacing:.1em;color:var(--highlight-color);margin:28px 0 12px;padding-top:18px;border-top:1px solid var(--hairline-color)}.post-rows{margin-bottom:6px}.post-row{display:grid;grid-template-columns:90px 1fr auto;gap:14px;padding:10px 0;border-bottom:1px solid #f0f0f0;align-items:baseline}.post-row:last-child{border-bottom:0}.post-row .post-row-date{font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);white-space:nowrap}.post-row .post-row-title{font-family:var(--font-family-heading);font-weight:500;font-size:14px;color:var(--heading-color);text-decoration:none;line-height:1.4}.post-row .post-row-title:hover{color:var(--highlight-color)}.post-row .post-row-tag{font-family:var(--font-family-mono);font-size:10px;color:var(--highlight-color);text-align:right;text-decoration:none}.currently{display:grid;grid-template-columns:1fr;gap:10px;margin-top:10px}@media(min-width:767px){.currently{grid-template-columns:1fr 1fr}}.currently-card{border:1px solid var(--hairline-color);padding:12px 14px}.currently-card .currently-label{font-family:var(--font-family-mono);font-size:10px;color:var(--muted-color);letter-spacing:.06em;margin-bottom:6px}.currently-card .currently-title{font-family:var(--font-family-heading);font-weight:500;font-size:13px}.currently-card .currently-title a{color:var(--heading-color);text-decoration:none}.currently-card .currently-title a:hover{color:var(--highlight-color)}.currently-card .currently-sub{font-size:11px;color:#777;margin-top:2px}.newsletter{margin-top:10px;max-width:520px}.newsletter .newsletter-blurb{font-family:var(--font-family-serif);font-size:15px;line-height:1.5;color:#333;margin:0 0 14px}.newsletter .newsletter-form{display:flex;gap:8px;align-items:stretch}.newsletter input[type=email]{flex:1;min-width:0;font-family:var(--font-family-mono);font-size:13px;color:var(--heading-color);padding:10px 12px;border:1.5px solid var(--heading-color);border-radius:0;background:#fff}.newsletter input[type=email]::placeholder{color:var(--muted-color)}.newsletter input[type=email]:focus{outline:none;border-color:var(--highlight-color)}.newsletter button[type=submit]{font-family:var(--font-family-mono);font-size:13px;font-weight:500;color:#fff;background:var(--highlight-color);border:1.5px solid var(--highlight-color);padding:10px 18px;cursor:pointer;white-space:nowrap;transition:background .12s}.newsletter button[type=submit]:hover{background:#cf2d3a}.newsletter .newsletter-note{font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);margin:10px 0 0}.newsletter .newsletter-note a{color:var(--highlight-color);text-decoration:none}.newsletter .newsletter-note a:hover{text-decoration:underline}.post{max-width:660px}.post-crumb{font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);letter-spacing:.04em;margin:20px 0 10px}.post-crumb a{color:var(--highlight-color);text-decoration:none}.post-crumb a:hover{text-decoration:underline}.post-cat{display:inline-block;font-family:var(--font-family-mono);font-size:10px;letter-spacing:.08em;color:#fff;background:var(--highlight-color);padding:3px 8px;margin-bottom:14px}.post-title{font-family:var(--font-family-heading);font-weight:900;font-size:34px;line-height:1.05;letter-spacing:-.025em;color:var(--heading-color);margin:0 0 14px}@media(min-width:767px){.post-title{font-size:40px}}.post-title .dot{color:var(--highlight-color)}.post-meta{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);padding:12px 0;border-top:1px solid var(--hairline-color);border-bottom:1px solid var(--hairline-color);margin-bottom:24px}.post-meta .post-meta-sep{color:var(--hairline-color)}.post-meta .post-meta-share{margin-left:auto;color:var(--highlight-color);cursor:pointer;user-select:none}.post-meta .post-meta-share:hover{text-decoration:underline}.post-dek{font-family:var(--font-family-serif);font-size:19px;line-height:1.55;color:#222;margin:0 0 24px;font-weight:400}.post-substack-link{font-family:var(--font-family-mono);font-size:11px;margin-bottom:20px}.post-substack-link a{color:var(--highlight-color);text-decoration:none}.post-substack-link a:hover{text-decoration:underline}.post-hero{margin:0 0 28px}.post-hero img{width:100%;display:block;border:1px solid var(--hairline-color)}.post-body{font-family:var(--font-family-serif);font-size:16px;line-height:1.75;color:#1a1a1a}.post-body p{font-size:16px;line-height:1.75;margin:0 0 18px}.post-body h2,.post-body h3{font-family:var(--font-family-heading);font-weight:900;letter-spacing:-.01em;color:var(--heading-color);margin:36px 0 12px}.post-body h2{font-size:22px}.post-body h3{font-size:19px}.post-body h4{font-family:var(--font-family-heading);font-weight:800;font-size:16px;margin:28px 0 8px;color:var(--heading-color)}.post-body a{color:var(--highlight-color);text-decoration:none;border-bottom:1px solid rgba(230,57,70,.35)}.post-body a:hover{border-bottom-color:var(--highlight-color)}.post-body strong{color:var(--heading-color)}.post-body em{font-style:italic}.post-body code{font-family:var(--font-family-mono);font-size:13px;background:var(--base-offset-color);padding:1px 5px;color:#444}.post-body pre{font-family:var(--font-family-mono);font-size:12.5px;line-height:1.6;background:#111;color:#f1efe8;padding:18px 22px;margin:8px 0 26px;overflow-x:auto;border-radius:0}.post-body pre code{background:0 0;color:inherit;padding:0;font-size:inherit}.post-body blockquote{font-style:italic;font-size:20px;line-height:1.45;color:var(--heading-color);border-left:3px solid var(--highlight-color);padding:4px 0 4px 20px;margin:22px 0 28px;letter-spacing:-.01em}.post-body blockquote p{margin:0}.post-body .footnotes{border-top:1px solid var(--hairline-color);margin-top:36px;padding-top:20px;font-family:var(--font-family-serif);font-size:13px;color:#666;line-height:1.65}.post-body .footnotes::before{content:'NOTES';display:block;font-family:var(--font-family-mono);font-size:11px;letter-spacing:.08em;color:var(--highlight-color);margin-bottom:10px;font-style:normal}.post-body .footnotes ol{padding-left:20px}.post-body .footnotes li{margin-bottom:6px}.post-body .footnotes a{color:var(--highlight-color);border-bottom:none}.post-body sup{font-family:var(--font-family-mono);font-size:10px;color:var(--highlight-color)}.post-body sup a{color:var(--highlight-color);border-bottom:none}.post-body ul,.post-body ol{padding-left:22px;margin-bottom:18px}.post-body ul li,.post-body ol li{margin-bottom:4px}.post-body hr{border:none;border-top:1px solid var(--hairline-color);margin:30px 0}.post-body img{max-width:100%;display:block;margin:0 auto}.post-figure{margin:10px 0 26px}.post-figure img{max-width:100%;display:block;border:1px solid var(--hairline-color)}.post-figure .post-figcaption{font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);margin-top:8px;padding:4px 0 4px 10px;border-left:2px solid var(--highlight-color)}.post-figure .post-figcaption b{color:var(--highlight-color);font-weight:500;margin-right:4px}.post-tags{display:flex;flex-wrap:wrap;gap:8px;margin:32px 0 24px}.post-tags .post-tag{font-family:var(--font-family-mono);font-size:11px;color:#444;border:1px solid #ddd;padding:4px 10px;letter-spacing:.04em;text-decoration:none}.post-tags .post-tag:hover{border-color:var(--heading-color)}.post-prevnext{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:26px 0 20px}.post-pn{border:1px solid var(--hairline-color);padding:14px 16px}.post-pn:hover{border-color:var(--heading-color)}.post-pn .post-pn-label{font-family:var(--font-family-mono);font-size:10px;color:var(--highlight-color);letter-spacing:.08em;margin-bottom:8px}.post-pn .post-pn-title{display:block;font-family:var(--font-family-heading);font-weight:500;font-size:13px;color:var(--heading-color);text-decoration:none;line-height:1.35}.post-pn .post-pn-title:hover{color:var(--highlight-color)}.post-pn-next{text-align:right}.post-footer{display:flex;justify-content:space-between;font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color);margin-top:20px;padding-top:14px;border-top:1px solid var(--hairline-color)}.post-footer a{color:var(--highlight-color);text-decoration:none;margin-left:12px}.post-footer a:first-child{margin-left:0}.post-footer a:hover{text-decoration:underline}.index-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px}.index-filters .index-filter{font-family:var(--font-family-mono);font-size:10px;letter-spacing:.06em;color:#555;border:1px solid #ddd;padding:4px 10px;text-decoration:none}.index-filters .index-filter:hover{border-color:var(--heading-color);color:var(--heading-color)}.projects-list{display:flex;flex-direction:column;gap:0}.project-row{display:flex;justify-content:space-between;align-items:baseline;gap:20px;padding:14px 0;border-bottom:1px solid var(--hairline-color);text-decoration:none;color:inherit}.project-row:first-child{border-top:1px solid var(--hairline-color)}.project-row:hover .project-name{color:var(--highlight-color)}.project-row .project-row-left{display:flex;flex-direction:column;gap:4px}.project-row .project-name{font-family:var(--font-family-heading);font-weight:800;font-size:15px;color:var(--heading-color);letter-spacing:-.01em}.project-row .project-tagline{font-size:13px;color:#555;line-height:1.4}.project-row .project-row-right{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex-shrink:0}.project-row .project-year{font-family:var(--font-family-mono);font-size:11px;color:var(--muted-color)}.project-row .project-status{font-family:var(--font-family-mono);font-size:10px;letter-spacing:.06em;padding:2px 7px;border:1px solid}.project-row .project-status-live{color:#2d8a4e;border-color:#2d8a4e}.project-row .project-status-wip{color:#b45309;border-color:#b45309}.project-row .project-status-archived{color:var(--muted-color);border-color:#ddd}html,body{box-sizing:border-box}body{background:var(--base-color);font-family:var(--font-family-paragraph);color:var(--text-color);margin:0;padding:20px;overflow-x:hidden;-webkit-font-smoothing:antialiased}@media(min-width:767px){body{padding:40px}}body.frame{min-height:100vh;border:6px solid var(--highlight-color);border-radius:4px}.wrapper{max-width:820px;margin:0 auto}