/*!Fonts: Literata, Montserrat and Inconsolata, all SIL Open Font License 1.1.
Serving them is redistribution, so the license text ships with them:
/fonts/OFL-Literata.txt, /fonts/OFL-Montserrat.txt and
/fonts/OFL-Inconsolata.txt*/@font-face{font-family:literata;src:url(/fonts/literata-latin.woff2)format("woff2");font-weight:400 600;font-style:normal;font-display:swap}@font-face{font-family:literata;src:url(/fonts/literata-latin-italic.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:montserrat;src:url(/fonts/montserrat-latin.woff2)format("woff2");font-weight:400 600;font-style:normal;font-display:swap}@font-face{font-family:inconsolata;src:url(/fonts/inconsolata-latin.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{--font-text:"Literata", Georgia, "Times New Roman", serif;--font-display:"Montserrat", system-ui, -apple-system, "Segoe UI", sans-serif;--font-ui:var(--font-display);--font-mono:"Inconsolata", ui-monospace, SFMono-Regular, Menlo, monospace;--nav-row:80px;--bg:#fafaf9;--fg:#1a1a1a;--fg-muted:#646464;--fg-soft:#3d3d3d;--link:#1f5fbf;--link-hover:#14428a;--link-quiet:#000000;--border:#e4e4e2;--elevated:#f0f0ee;--sunken:#eeeeec;--bar:#cfcfcb}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#161616;--fg:#c4c4c4;--fg-muted:#8a8a8a;--fg-soft:#a9a9a9;--link:#6fa8ff;--link-hover:#9cc4ff;--link-quiet:#eaeaea;--border:#2e2e2e;--elevated:#1f1f1f;--sunken:#1c1c1c;--bar:#3a3a3a}}:root[data-theme=dark]{--bg:#161616;--fg:#c4c4c4;--fg-muted:#8a8a8a;--fg-soft:#a9a9a9;--link:#6fa8ff;--link-hover:#9cc4ff;--link-quiet:#eaeaea;--border:#2e2e2e;--elevated:#1f1f1f;--sunken:#1c1c1c;--bar:#3a3a3a}*{box-sizing:border-box}body{display:grid;grid-template-columns:12rem minmax(0,40rem);gap:0 3.5rem;max-width:58rem;margin:0 auto;padding:0 1.5rem;background:var(--bg);color:var(--fg);font:16px/1.7 var(--font-text)}main{grid-column:2;grid-row:1}footer.site{grid-column:1/-1;grid-row:2}.vh{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}a,a:visited{color:var(--link);text-decoration:none}a:hover,a:active{color:var(--link-hover);text-decoration:underline;text-underline-offset:.18em}a:focus-visible,button:focus-visible{outline:2px solid var(--link);outline-offset:2px;border-radius:2px}svg{fill:currentColor;display:block}.skip{position:absolute;left:-9999px;font-family:var(--font-ui)}.skip:focus{left:1rem;top:1rem}nav.site{grid-column:1;grid-row:1;position:sticky;top:0;align-self:start;max-height:100vh;overflow-y:auto;padding:3rem 0 2rem;font-family:var(--font-ui)}.brand{display:block;margin-bottom:3.5rem}.brand .avatar{flex:none;display:block;width:88px;height:88px;color:var(--fg)}nav.site ul{margin:0;padding:0;list-style:none}ul.menu{display:grid;gap:1.1rem}ul.menu>li{margin:0}.menu-row>a{display:block;padding:.15rem 0;font-size:.9375rem;color:var(--fg-muted)}.menu-row>a:hover{color:var(--link)}.menu-row>a[aria-current]{font-weight:600;color:var(--fg)}.menu-row{display:flex;align-items:center;gap:.35rem;height:1.6rem}button.disclose{display:flex;align-items:center;padding:6px 8px 6px 4px;margin:-6px -8px -6px -4px;border:0;background:0 0;color:var(--fg-muted);cursor:pointer;opacity:.55}button.disclose:hover{opacity:1;color:var(--link)}button.disclose svg{width:13px;height:13px;transform:rotate(-90deg);transition:transform .2s ease}button.disclose[aria-expanded=true] svg{transform:none}.submenu-wrap{max-height:0;overflow:hidden;transition:max-height .22s ease}.submenu-wrap[data-open=true]{max-height:40rem}@media(prefers-reduced-motion:reduce){button.disclose svg,.submenu-wrap{transition:none}}nav.site ul.submenu{margin:0 0 0 .55rem;padding:.4rem 0 .5rem 1.15rem;border-left:1px solid var(--border)}nav.site ul.submenu li.grp>a{font-size:.75rem;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-muted)}nav.site ul.submenu li.grp+li.grp{margin-top:.55rem}nav.site ul.sub2{margin:.1rem 0 0;padding-left:.7rem;list-style:none}ul.submenu a{display:block;padding:.3rem 0;font-size:.8125rem;color:var(--fg-muted)}ul.submenu a:hover{color:var(--link)}nav.site ul.social{display:flex;justify-content:space-between;width:var(--nav-row);margin-top:4rem}ul.social a{display:block;padding:9px;margin:-9px;color:var(--fg-muted)}ul.social a:hover{color:var(--link)}.privacy{display:block;padding:6px;margin:-6px;color:var(--fg-muted)}.privacy svg{display:block;width:16px;height:16px}.privacy:visited{color:var(--fg-muted)}.privacy:hover{color:var(--link)}.privacy[aria-current]{color:var(--fg)}.theme{position:relative;display:inline-flex;padding:2px;border:1px solid var(--border);border-radius:12px;background:var(--elevated)}.theme button{position:relative;z-index:1;display:grid;place-items:center;width:24px;height:20px;padding:0;border:0;background:0 0;color:var(--fg-muted);cursor:pointer}.theme button svg{width:12px;height:12px}.theme button::after{content:"";position:absolute;top:50%;left:50%;width:32px;height:40px;transform:translate(-50%,-50%)}.theme button:hover{color:var(--fg)}.theme button[aria-checked=true]{color:var(--bg)}.theme .knob{position:absolute;top:2px;left:2px;width:24px;height:20px;border-radius:10px;background:var(--fg);transition:transform .18s ease;transform:translateX(24px)}:root[data-choice=light] .theme .knob{transform:none}:root[data-choice=dark] .theme .knob{transform:translateX(48px)}@media(prefers-reduced-motion:reduce){.theme .knob{transition:none}}main{min-width:0;padding:3rem 0 5rem}.tagline{margin:0 0 2.25rem;color:var(--fg-muted)}.tagline p{margin:0}.tagline p+p{margin-top:.85rem}.tagline a,.tagline a:visited{color:var(--link-quiet)}.tagline a:hover{color:var(--link)}a.button:hover{text-decoration:none}a.button:hover span{text-decoration:underline;text-underline-offset:.18em}h1{margin:0 0 .6rem;font-family:var(--font-display);font-size:1.5rem;font-weight:600}p{margin:0 0 1rem}strong,b{font-weight:600}main h2{margin:2.5rem 0 1rem;padding-bottom:.6rem;border-bottom:1px solid var(--border);font:600 .75rem/1 var(--font-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--fg-muted)}.anchored{scroll-margin-top:1.5rem}main h2 a{display:inline-block;padding:6px 0;margin:-6px 0}.anchored>a,.anchored>a:visited{color:inherit}.anchored>a:hover{color:var(--link)}code{font-family:var(--font-mono);font-size:.9375em;overflow-wrap:break-word;word-break:break-word}pre{background:var(--elevated);border:1px solid var(--border);border-radius:6px;padding:.7rem .85rem;margin:1rem 0;overflow-x:auto}pre code{font-size:.875rem}.contact a,.contact a:visited{color:var(--link-quiet)}.contact a:hover{color:var(--link)}.contact a[href^="mailto:"],.contact a[href^="mailto:"]:visited{color:var(--link)}.contact a[href^="mailto:"]:hover{color:var(--link-hover)}.contact{color:var(--fg-soft);margin-top:2rem;max-width:34rem}ul.projects p:last-of-type{margin-bottom:0}ul.projects p:not(.meta) a,ul.projects p:not(.meta) a:visited{color:var(--link-quiet)}ul.projects p:not(.meta) a:hover{color:var(--link)}.group-desc{margin:0 0 1.25rem;font-size:.9375rem;color:var(--fg-muted)}.group-desc p{margin:0}ul.compact{margin:0;padding:0;list-style:none}ul.compact>li{display:grid;grid-template-columns:9rem 1fr;gap:0 1rem;padding:.4rem 0;font-size:.9375rem}ul.compact .name{font-family:var(--font-display);font-weight:600}ul.compact p.desc{margin:0;color:var(--fg-soft)}ul.compact p.desc a,ul.compact p.desc a:visited{color:var(--link-quiet)}ul.compact p.desc a:hover{color:var(--link)}ul.compact p.desc .refs a,ul.compact p.desc .refs a:visited{display:inline-block;font-family:var(--font-ui);margin-left:.7rem;padding:.2rem .35rem;font-size:.8125rem;white-space:nowrap;color:var(--link)}ul.compact p.desc .refs a:hover{color:var(--link-hover)}p.meta{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem;margin:.85rem 0 0;font:.8125rem/1.6 var(--font-ui);color:var(--fg-muted)}p.meta .left,p.meta .refs{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem 1rem}p.meta .left{gap:.35rem .75rem}.freshness time{font-size:.75rem;color:var(--fg-muted);font-variant-numeric:tabular-nums}p.meta .refs a{display:inline-block;padding:.35rem .4rem;margin:-.35rem -.4rem;font-weight:600}p.actions{display:flex;flex-wrap:wrap;gap:.4rem 1.75rem;margin-top:1.75rem}a.button{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--font-display);font-size:.95rem;font-weight:600}.post table{width:100%;margin:1.5rem 0;border-collapse:collapse;font-size:.9375rem}.post th,.post td{padding:.45rem .9rem .45rem 0;text-align:left;border-bottom:1px solid var(--border);vertical-align:baseline}.post th{font:600 .75rem/1 var(--font-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--fg-muted);padding-bottom:.55rem}.post td:not(:first-child),.post th:not(:first-child){text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}.post td:first-child{color:var(--fg)}.modal{position:fixed;inset:0;z-index:10;display:none;place-items:center;padding:1.25rem}.modal:target{display:grid}.modal .scrim{position:absolute;inset:0;background:rgb(0 0 0/.5)}.modal .panel{position:relative;width:min(26rem,100%);padding:1.75rem;border:1px solid var(--border);border-radius:8px;background:var(--bg)}.modal .close{position:absolute;top:.55rem;right:.85rem;color:var(--fg-muted);font-size:1.5rem;line-height:1}.modal .close:hover{color:var(--fg);text-decoration:none}.modal h2{margin:0 0 .4rem;font-family:var(--font-display);font-size:1.15rem;font-weight:600}.modal p{margin:0 0 1.25rem;font-size:.9375rem;color:var(--fg-muted)}.modal label{display:block;margin-bottom:.35rem;font-family:var(--font-ui);font-size:.8125rem;color:var(--fg-muted)}.modal input[type=email]{width:100%;padding:.55rem .7rem;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--fg);font-family:var(--font-ui);font-size:.9375rem}.modal button[type=submit]{width:100%;margin-top:.75rem;padding:.6rem;border:0;border-radius:6px;background:var(--link);color:var(--bg);font:600 .9375rem/1 var(--font-ui);cursor:pointer}.modal button[type=submit]:hover{background:var(--link-hover)}ul.entries{margin:1.5rem 0 0}ul.entries p.meta{justify-content:flex-start;gap:.45rem;margin-top:.5rem;font-variant-numeric:tabular-nums}ul.entries p.meta .dot{color:var(--border)}p.back{margin:0 0 1.25rem;font:.875rem/1 var(--font-ui)}p.back a,p.back a:visited{color:var(--fg-muted)}p.back a:hover{color:var(--link)}p.byline{font:.875rem/1.6 var(--font-ui);color:var(--fg-muted)}p.shell{margin:0 0 1.25rem;padding:.75rem .9rem;border:1px solid var(--border);border-radius:6px;background:var(--elevated);font:.875rem/1.8 var(--font-mono);overflow-wrap:anywhere}p.home{margin:0;font:600 .9375rem/1 var(--font-display)}p.shell .prompt{color:var(--fg-muted);user-select:none}p.shell .cmd{color:var(--fg)}p.shell .err{color:var(--fg-muted)}ul.cards{display:grid;gap:.75rem;margin:0;padding:0;list-style:none}ul.cards>li{padding:1.1rem 1.25rem;border:1px solid var(--border);border-radius:8px;background:var(--sunken);scroll-margin-top:1.5rem}ul.cards h3{margin:0 0 .35rem;font-family:var(--font-display);font-size:1.0625rem;font-weight:600}.card-head{display:flex;align-items:center;gap:.6rem;margin-bottom:.35rem}.card-head h3{margin:0}img.project-icon{flex:none;display:block;width:34px;height:34px;border:1px solid var(--border);border-radius:6px;background:var(--bg);object-fit:cover}ul.cards h3 a{color:inherit}ul.cards h3 a:hover{color:var(--link)}ul.cards p{margin:0 0 .5rem;color:var(--fg-soft)}ul.cards p:last-child{margin-bottom:0}a.entry{display:block;color:inherit}a.entry:hover{color:inherit;text-decoration:none}a.entry:hover h3{color:var(--link)}ul.entries>li:hover{border-color:var(--fg-muted)}@media(prefers-reduced-motion:no-preference){ul.cards>li{transition:border-color .15s ease}}.carousel{margin-top:1rem}ul.cards.track{display:grid;grid-auto-flow:column;grid-auto-columns:89%;gap:.75rem;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;padding-bottom:.85rem;scrollbar-width:thin;scrollbar-color:var(--bar)transparent}ul.cards.track>li{scroll-snap-align:start;height:100%}ul.cards.track:focus-visible{outline:2px solid var(--link);outline-offset:3px;border-radius:8px}@media(min-width:60rem){ul.cards.track{grid-auto-columns:64%}}.tags{display:flex;flex-wrap:wrap;gap:.35rem}.tag{display:inline-block;padding:.1rem .45rem;border:1px solid var(--border);border-radius:4px;background:var(--bg);font:500 .75rem/1.5 var(--font-ui);letter-spacing:.01em;color:var(--fg-muted);white-space:nowrap}.feature{margin-top:2.75rem}.feature h2 a{color:inherit}.feature h2 a:hover{color:var(--link)}p.more{margin:.9rem 0 0;font:600 .875rem/1 var(--font-ui)}p.more a{display:inline-block;padding:5px 0;margin:-5px 0}figure.chart{margin:1.75rem 0;padding:0}figure.chart table{width:100%;border-collapse:collapse;font-size:.9375rem}figure.chart th,figure.chart td{padding:.5rem .9rem .5rem 0;text-align:left;border-bottom:1px solid var(--border);vertical-align:middle}figure.chart thead th{font:600 .75rem/1 var(--font-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--fg-muted);padding-bottom:.55rem}figure.chart tbody th{font:1em/1.4 var(--font-text);letter-spacing:normal;text-transform:none;color:var(--fg)}figure.chart td.num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--fg-muted);padding-right:0}figure.chart td.val{color:var(--fg)}figure.chart .plot{width:34%;min-width:4rem;padding-right:.9rem}figure.chart td.plot{background:linear-gradient(var(--sunken),var(--sunken))0/calc(100% - .9rem)10px no-repeat}figure.chart td.plot span{display:block;width:var(--w);height:10px;border-radius:2px;background:var(--bar)}figure.chart tr.owned td.plot span{background:var(--link)}figure.chart tr.owned th{font-weight:600}figure.chart figcaption{margin-top:.8rem;font:.8125rem/1.6 var(--font-ui);color:var(--fg-muted)}figure.scatter svg{display:block;width:100%;height:auto;overflow:visible;font-family:var(--font-ui)}figure.scatter .axis line{stroke:var(--border);stroke-width:.4}figure.scatter text{fill:var(--fg-muted);font-size:2.1px}figure.scatter .mono{font-family:var(--font-mono)}figure.scatter .axis-label{fill:var(--fg-muted);font-size:2px;letter-spacing:.06em;text-transform:uppercase}figure.scatter .pt circle{fill:var(--bar)}figure.scatter .pt text{fill:var(--fg-muted)}figure.scatter .pt.owned circle{fill:var(--link)}figure.scatter .pt.owned text{fill:var(--fg);font-weight:600}footer.site{display:flex;align-items:center;justify-content:space-between;margin-top:1rem;padding:1.25rem 0 2.5rem;border-top:1px solid var(--border)}@media(max-width:44rem){body{display:block;max-width:40rem}main,nav.site,footer.site{grid-column:auto;grid-row:auto}nav.site{position:static;max-height:none;display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;padding:1.5rem 0 1rem;border-bottom:1px solid var(--border)}.brand{grid-column:1;grid-row:1/span 2;align-self:center;margin-bottom:0}nav.site ul.social{grid-column:2;grid-row:1;justify-self:end;align-self:start;margin-top:0}ul.menu{grid-column:2;grid-row:2;justify-self:end;align-self:end;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:0 1.25rem;margin-top:0}ul.menu>li{margin-bottom:0}button.disclose,.submenu-wrap{display:none}}@media(max-width:22.5rem){.brand .avatar{width:72px;height:72px}ul.menu{gap:0 1rem}main{padding:2rem 0 3rem}ul.compact>li{display:block;padding:.7rem 0;border-bottom:1px solid var(--border)}ul.compact>li:last-child{border-bottom:0}ul.compact .name{display:block;margin-bottom:.15rem}ul.compact p.desc .refs a{margin:0 .5rem 0 0;padding:.35rem .4rem}ul.compact p.desc .refs{display:block;margin-top:.1rem}ul.cards>li{padding:.95rem 1rem}.carousel{margin-left:-1.5rem;margin-right:-1.5rem}ul.cards.track{grid-auto-columns:86%;padding-left:1.5rem;padding-right:1.5rem;scroll-padding-left:1.5rem}figure.chart .plot{width:26%;min-width:3rem}figure.chart table{font-size:.875rem}footer.site{padding:1.5rem 0 2.5rem}}