@font-face{font-family:Instrument Serif;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/instrument-serif-latin-400-normal.DnYpCC2O.woff2)format("woff2"),url(/_astro/instrument-serif-latin-400-normal.BVbkICAY.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2)format("woff2"),url(/_astro/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2)format("woff2"),url(/_astro/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2)format("woff2"),url(/_astro/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff)format("woff")}:root{--color-paper:oklch(98% .012 85);--color-ink:oklch(21% .014 70);--color-muted:oklch(46% .015 70);--color-accent:oklch(36% .065 162);--color-accent-hover:oklch(28% .06 162);--color-rule:oklch(84% .018 80);--color-code:oklch(95% .016 80);--color-clear:transparent;--font-display:"Instrument Serif", Georgia, serif;--font-body:"IBM Plex Sans", system-ui, sans-serif;--font-code:ui-monospace, "Cascadia Code", monospace;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--space-8:4rem;--space-9:6rem;--text-small:.875rem;--text-body:1.0625rem;--text-prose:1.125rem;--text-title:clamp(2.75rem, 5.2vw, 4.75rem);--text-hero:clamp(3.5rem, 7.5vw, 6.75rem);--text-section:clamp(2rem, 3vw, 2.625rem);--rule-thin:1px;--radius-small:3px}*{box-sizing:border-box}html,body{overflow-x:clip}html{color:var(--color-ink);background:var(--color-paper)}body{font-family:var(--font-body);font-size:var(--text-body);margin:0;line-height:1.6}h1,h2,h3{font-family:var(--font-display);overflow-wrap:anywhere;min-width:0;font-style:normal;font-weight:400;line-height:1.08}h1,h2,h3,p{margin:0}a{color:var(--color-accent);text-underline-offset:.22em;text-decoration-thickness:1px}a:hover{color:var(--color-accent-hover)}a:active{text-decoration-thickness:2px}:focus-visible{outline:2px solid var(--color-accent);outline-offset:5px}main:focus{outline:none}img,video{max-width:100%;height:auto}.shell{max-width:1240px;padding:0 var(--space-7);margin:auto}.masthead{justify-content:space-between;align-items:center;gap:var(--space-6);padding:var(--space-6) 0;display:flex}.wordmark{color:var(--color-ink);font-family:var(--font-display);font-size:2rem;line-height:1;text-decoration:none}nav{gap:var(--space-7);display:flex}nav a{white-space:nowrap;padding-block:var(--space-3)}.masthead nav a{color:var(--color-ink);text-decoration:none}.masthead nav a:hover,.masthead nav a[aria-current]{text-decoration:underline}.skip-link{left:var(--space-4);background:var(--color-paper);padding:var(--space-4);z-index:5;position:absolute;top:-100px}.skip-link:focus{top:var(--space-4)}.intro{padding:var(--space-8) 0 var(--space-8)}.intro h1{font-size:var(--text-hero);letter-spacing:-.035em;margin-bottom:var(--space-5)}.intro-statement{max-width:1000px;font-size:clamp(1.375rem,2.35vw,2rem);line-height:1.4}.intro-detail{color:var(--color-muted);margin:var(--space-3) 0 var(--space-4);font-size:1.25rem}.text-link{align-items:center;gap:var(--space-2);padding-block:var(--space-2);white-space:nowrap;font-weight:500;display:inline-flex}.home-columns{gap:var(--space-7);grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);display:grid}h2{font-size:var(--text-section)}.home-projects{border-left:var(--rule-thin) solid var(--color-rule);padding-left:var(--space-7)}.post-list,.project-shortlist,.project-directory,.keep-reading ul{margin:0;padding:0;list-style:none}.post-list li{border-bottom:var(--rule-thin) solid var(--color-rule);padding:var(--space-5) 0}.post-list h3,.project-shortlist h3{margin-bottom:var(--space-2);font-size:1.875rem}.post-list h3 a,.project-shortlist h3 a,.project-directory h2 a{color:var(--color-ink);text-decoration:none}.post-list h3 a:hover,.project-shortlist h3 a:hover,.project-directory h2 a:hover{color:var(--color-accent);text-decoration:underline}time,.article-meta{color:var(--color-muted);font-size:var(--text-small)}.post-list p,.project-shortlist p{color:var(--color-muted);margin-top:var(--space-2)}.home-columns .text-link{margin-top:var(--space-4)}.project-shortlist li{margin-top:var(--space-5)}.latest{margin-top:var(--space-8)}.section-head{justify-content:space-between;align-items:baseline;gap:var(--space-5);display:flex}.section-head p{color:var(--color-muted)}.latest .post-list{gap:var(--space-6);grid-template-columns:repeat(3,minmax(0,1fr));display:grid}.latest .post-list h3{font-size:1.65rem}.page-heading{padding:var(--space-8) 0 var(--space-7)}.eyebrow{font-size:var(--text-small);color:var(--color-muted);font-weight:500}.page-heading h1{font-size:var(--text-title);margin:var(--space-3) 0 var(--space-5);letter-spacing:-.025em}.page-heading>p:last-child{max-width:650px;color:var(--color-muted);font-size:1.25rem}.archive{max-width:810px}.archive .post-list li{padding-block:var(--space-6)}.project-directory{gap:0 var(--space-8);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.project-directory li{border-top:var(--rule-thin) solid var(--color-rule);padding:var(--space-6) 0}.project-directory h2{margin:var(--space-2) 0 var(--space-4);font-size:2.25rem}.project-directory p{color:var(--color-muted);max-width:480px}.project-arrow{color:var(--color-accent);font-family:var(--font-body);font-size:1.25rem}.article-heading{padding:var(--space-7) 0;max-width:920px}.back-link{font-size:var(--text-small);margin-bottom:var(--space-6)}.article-heading h1{font-size:var(--text-title);letter-spacing:-.025em;margin-bottom:var(--space-5)}.article-meta{gap:var(--space-3);margin-bottom:var(--space-5);flex-wrap:wrap;display:flex}.standfirst{color:var(--color-muted);max-width:750px;font-size:1.3rem;line-height:1.65}.article-grid{gap:var(--space-8);grid-template-columns:minmax(0,740px);align-items:start;display:grid}.article-grid.has-outline{grid-template-columns:minmax(0,740px) minmax(0,1fr)}.prose{font-size:var(--text-prose);overflow-wrap:anywhere;min-width:0;line-height:1.85}.prose>:first-child{margin-top:0}.prose p,.prose ul,.prose ol,.prose pre,.prose blockquote,.prose table{margin:0 0 var(--space-5)}.prose h2{margin:var(--space-7) 0 var(--space-5);scroll-margin-top:var(--space-5);font-size:2.25rem}.prose h3{margin:var(--space-6) 0 var(--space-4);font-size:1.75rem}.prose li+li{margin-top:var(--space-2)}.prose blockquote{padding:var(--space-4) var(--space-5);border-left:2px solid var(--color-accent);background:var(--color-code);color:var(--color-muted);font-size:var(--text-body);margin-left:0}.prose blockquote p:last-child{margin-bottom:0}code{font-family:var(--font-code);font-size:.85em}.prose :not(pre)>code{background:var(--color-code);border-radius:var(--radius-small);padding:.1em .3em}.prose pre{padding:var(--space-5);border:var(--rule-thin) solid var(--color-rule);border-radius:var(--radius-small);font-size:.95rem;line-height:1.65;overflow-x:auto;background:var(--color-code)!important}.prose pre code{font-size:inherit}.prose table{border-collapse:collapse;font-size:var(--text-body);display:block;overflow-x:auto}.prose th,.prose td{border-bottom:var(--rule-thin) solid var(--color-rule);padding:var(--space-3);text-align:left}.prose hr{border:0;border-top:var(--rule-thin) solid var(--color-rule);margin:var(--space-7) 0}.prose video{margin:var(--space-5) 0;display:block}.article-outline{top:var(--space-6);border-left:var(--rule-thin) solid var(--color-rule);padding-left:var(--space-5);position:sticky}.article-outline nav{font-size:var(--text-small);display:block}.article-outline ul{padding:0;list-style:none}.article-outline li{margin-top:var(--space-3)}.article-outline a{white-space:normal;padding:0;text-decoration:none;display:block}.article-outline a:hover{text-decoration:underline}.about-copy{max-width:740px}.keep-reading{border-top:var(--rule-thin) solid var(--color-rule);padding-top:var(--space-6);margin-top:var(--space-8);max-width:740px}.keep-reading li{margin-top:var(--space-5)}.keep-reading a{font-size:1.2rem;display:block}.site-footer{margin-top:var(--space-8)}.contact-close{justify-content:space-between;align-items:center;gap:var(--space-6);border-top:var(--rule-thin) solid var(--color-rule);padding:var(--space-7) 0;display:flex}.contact-close h2{margin-top:var(--space-3);font-size:clamp(2rem,3.5vw,3rem)}.contact-link{font-size:1.25rem}.footer-line{border-top:var(--rule-thin) solid var(--color-rule);padding:var(--space-5) 0 var(--space-6);justify-content:space-between;align-items:center;gap:var(--space-5);display:flex}.footer-name{font-family:var(--font-display);font-size:1.75rem;display:block}.footer-note{color:var(--color-muted);font-size:var(--text-small);display:block}.footer-line nav{gap:var(--space-5);font-size:var(--text-small)}@media (width<=900px){.shell{padding-inline:var(--space-6)}.article-grid.has-outline{grid-template-columns:minmax(0,740px)}.article-outline{padding:var(--space-4) 0;border-left:0;border-block:var(--rule-thin) solid var(--color-rule);grid-row:1;position:static}.article-outline ul{columns:2;column-gap:var(--space-6)}.article-outline li{break-inside:avoid}}@media (width<=640px){.shell{padding-inline:var(--space-4)}.masthead{gap:var(--space-4);padding:var(--space-5) 0}.wordmark{font-size:1.7rem}.masthead nav{gap:var(--space-4);font-size:.9375rem}.intro{padding-block:var(--space-7)}.intro-detail{font-size:var(--text-body)}.home-columns,.latest .post-list,.project-directory{grid-template-columns:minmax(0,1fr)}.home-projects{padding:var(--space-6) 0 0;border-left:0;border-top:var(--rule-thin) solid var(--color-rule)}.latest{margin-top:var(--space-7)}.section-head{display:block}.section-head p{margin-top:var(--space-2)}.latest .post-list{gap:0}.page-heading{padding-block:var(--space-7) var(--space-5)}.article-heading{padding-block:var(--space-5)}.article-heading h1{font-size:2.8rem}.article-outline ul{columns:1}.standfirst{font-size:1.15rem}.prose{font-size:var(--text-body)}.prose pre{padding:var(--space-4);font-size:.85rem}.contact-close{display:block}.contact-link{margin-top:var(--space-4)}.footer-line{align-items:flex-start}}
