@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-400.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,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:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-ext-400.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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-latin-500.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,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-latin-ext-500.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:600;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-600.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,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:600;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-ext-600.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:italic;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-400-italic.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,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:italic;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-ext-400-italic.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Saira Condensed;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/saira-condensed-latin-500.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Saira Condensed;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/saira-condensed-latin-ext-500.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Saira Condensed;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/saira-condensed-latin-600.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Saira Condensed;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/saira-condensed-latin-ext-600.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Saira Condensed;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/saira-condensed-latin-700.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Saira Condensed;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/saira-condensed-latin-ext-700.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:DF Mono Fallback;src:local(Noto Sans Mono);size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}@font-face{font-family:DF Mono Fallback;src:local(Liberation Mono),local(Courier New);size-adjust:99.9837%;ascent-override:102.517%;descent-override:27.5045%;line-gap-override:0%}@font-face{font-family:DF Mono Fallback;src:local(DejaVu Sans Mono),local(Menlo);size-adjust:99.6594%;ascent-override:102.85%;descent-override:27.594%;line-gap-override:0%}@font-face{font-family:DF Display Fallback;src:local(Impact);size-adjust:95.2931%;ascent-override:119.106%;descent-override:46.0684%;line-gap-override:0%}@font-face{font-family:DF Display Fallback;src:local(DejaVu Sans Condensed);size-adjust:78.95%;ascent-override:143.762%;descent-override:55.6048%;line-gap-override:0%}@font-face{font-family:DF Display Fallback;src:local(Arial Narrow);size-adjust:85.6256%;ascent-override:132.554%;descent-override:51.2697%;line-gap-override:0%}:root{color-scheme:light;--paper:#f7f5f0;--ink:#141412;--signal:#c0392b;--on-signal:#f7f5f0;--ink-soft:color-mix(in srgb, var(--ink) 66%, var(--paper));--line:color-mix(in srgb, var(--ink) 30%, var(--paper));--wash:color-mix(in srgb, var(--ink) 5%, var(--paper));--wash-2:color-mix(in srgb, var(--ink) 12%, var(--paper));--font-mono:"IBM Plex Mono", "DF Mono Fallback", "SF Mono", Menlo, Consolas, "Courier New", monospace;--font-display:"Saira Condensed", "DF Display Fallback", "Arial Narrow", Impact, sans-serif;--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--fs-display:clamp(3.4rem, 1.6rem + 7vw, 6.75rem);--fs-h1:clamp(2.5rem, 1.3rem + 4vw, 3.9rem);--fs-h2:clamp(1.75rem, 1.1rem + 2.4vw, 2.5rem);--fs-h3:1.5rem;--fs-h4:1.125rem;--fs-body:1.0625rem;--fs-small:.85rem;--fs-eyebrow:.72rem;--fs-tag:.7rem;--sp-1:.25rem;--sp-2:.5rem;--sp-3:1rem;--sp-4:1.5rem;--sp-5:2.5rem;--sp-6:4rem;--sp-7:6rem;--sp-8:8rem;--radius:2px;--radius-tag:5px;--shadow-press:4px 4px 0 0 var(--ink);--rail-w:330px;--col-reading:42rem;--col-wide:56rem;--tick:.12s}[data-theme=dark]{color-scheme:dark;--paper:#101010;--ink:#e8e6e1;--signal:#e4685a;--on-signal:#101010}*,:before,:after{box-sizing:border-box}html{scrollbar-width:thin;scrollbar-color:var(--ink) var(--paper)}body{background-color:var(--paper);color:var(--ink);font:400 var(--fs-body)/1.7 var(--font-mono);margin:0}:where(a[href]){color:var(--signal)}@keyframes df-page-in{0%{opacity:.92}to{opacity:1}}@keyframes df-page-out{0%{opacity:1}to{opacity:.96}}::view-transition-group(root){animation:none}::view-transition-old(root){animation:df-page-out var(--tick) both}::view-transition-new(root){animation:df-page-in var(--tick) both}h1,h2,h3,h4{margin:0}h1{font:600 var(--fs-h1)/1.05 var(--font-display);text-transform:uppercase}h2{font:600 var(--fs-h2)/1.1 var(--font-display);text-transform:uppercase}h3{font:600 var(--fs-h3)/1.1 var(--font-display)}h4{font:700 var(--fs-h4)/1.7 var(--font-mono)}:focus-visible{outline:2px solid var(--signal);outline-offset:3px}::selection{background-color:var(--ink);color:var(--paper)}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}::view-transition-old(root),::view-transition-new(root){animation:none!important}}.ic-14{flex:none;width:14px;height:14px}.ic-18{flex:none;width:18px;height:18px}.ic-24{flex:none;width:24px;height:24px}.icon-btn{border:2px solid var(--ink);border-radius:var(--radius);width:44px;height:44px;color:var(--ink);box-shadow:3px 3px 0 0 var(--ink);cursor:pointer;transition:background-color var(--tick), color var(--tick), box-shadow var(--tick), transform var(--tick);background:0 0;justify-content:center;align-items:center;padding:0;display:inline-flex}.icon-btn:hover{background:var(--wash)}.icon-btn:active{box-shadow:0 0 0 0 var(--ink);transform:translate(1.5px,1.5px)}.icon-btn:disabled,.icon-btn[aria-disabled=true]{background:var(--wash);color:var(--ink-soft);box-shadow:none;cursor:not-allowed;border-style:dashed;transform:none}.i-sun{display:none}html[data-theme=dark] .i-sun{display:block}html[data-theme=dark] .i-moon{display:none}.link-grow{color:var(--ink);border-bottom:0;text-decoration:none}.link-grow:hover{border-bottom:2px solid var(--ink);margin-bottom:-2px}.skip-link{top:-4rem;left:var(--sp-3);z-index:100;padding:var(--sp-2) var(--sp-3);border:2px solid var(--ink);background:var(--paper);color:var(--ink);box-shadow:var(--shadow-press);font:600 var(--fs-small) var(--font-mono);transition:top var(--tick);text-decoration:none;position:fixed}.skip-link:focus-visible{top:var(--sp-3)}.shell{min-height:100vh}.main-content{padding:calc(64px + var(--sp-2)) var(--sp-3) 0}@media (width>=48rem){.main-content{padding:calc(64px + var(--sp-2)) var(--sp-5) 0}}@media (width>=75rem){.shell{grid-template-columns:var(--rail-w) 1fr;display:grid}.main-content{padding:var(--sp-6) var(--sp-6) 0}}.rail{display:none}@media (width>=75rem){.rail{gap:var(--sp-2);height:100vh;padding:var(--sp-4);border-right:1px dashed var(--ink);flex-direction:column;display:flex;position:sticky;top:0}}.brand{color:var(--ink);text-decoration:none;display:block}.brand-name{font:700 1.75rem/1 var(--font-display);text-transform:uppercase;letter-spacing:.02em;color:var(--ink);display:block}.brand-role{font:600 var(--fs-eyebrow) var(--font-mono);text-transform:uppercase;letter-spacing:.14em;color:var(--ink-soft);margin-top:.35rem;display:block}.nav-list{margin-top:var(--sp-6);gap:var(--sp-1);flex-direction:column;display:flex}.nav-link{font:500 1.05rem var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);border-bottom:0;padding:.35rem 0;text-decoration:none;display:inline-block}.nav-link:before{content:"";background:0 0;width:.5em;height:.5em;margin-right:.6em;display:inline-block}.nav-list .nav-link.active{padding-left:var(--sp-3);font-weight:600}.nav-list .nav-link.active:before{background:var(--signal)}.rail-foot{gap:var(--sp-3);flex-direction:column;margin-top:auto;display:flex}.icon-row{gap:var(--sp-2);flex-wrap:wrap;display:flex}.rail-foot .icon-row>a:first-of-type,.menu-controls .icon-row>a:first-of-type{margin-left:auto}.palette-trigger{border:1px dashed var(--line);width:100%;color:var(--ink-soft);font:500 var(--fs-eyebrow) var(--font-mono);text-transform:uppercase;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:.45rem;padding:.45rem .6rem;display:flex}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.palette-trigger:hover{color:var(--ink);border-color:var(--ink)}.palette-trigger span{color:var(--signal)}.palette-trigger kbd{font-size:inherit;font-family:var(--font-mono);margin-left:auto}.palette-backdrop{z-index:70;background:var(--ink);opacity:.72;position:fixed;inset:0}.command-palette{inset:var(--sp-5) var(--sp-3) auto;z-index:71;max-width:46rem;color:var(--ink);margin:0 auto;position:fixed}.palette-box{max-height:calc(100vh - var(--sp-8));padding:var(--sp-3);border:3px solid var(--ink);background:var(--paper);box-shadow:8px 8px 0 0 var(--ink);animation:.16s ease-out palette-in;overflow:auto}.palette-head{justify-content:space-between;align-items:center;gap:var(--sp-2);display:flex}.palette-head h2{font:600 var(--fs-h3) var(--font-display)}.palette-close{color:var(--ink-soft);font:500 var(--fs-small) var(--font-mono);cursor:pointer;background:0 0;border:0}.palette-close:hover{color:var(--signal)}.palette-field{margin:var(--sp-3) 0 var(--sp-2)}.palette-input{border:2px solid var(--ink);background:var(--paper);width:100%;color:var(--ink);font:400 var(--fs-body) var(--font-mono);margin:0;padding:.7rem}.palette-results{max-height:55vh;overflow:auto}.palette-group{margin-top:var(--sp-3)}.palette-group h3{margin-bottom:var(--sp-1);color:var(--ink-soft);font:600 var(--fs-eyebrow) var(--font-mono);letter-spacing:.14em;text-transform:uppercase}.palette-group ul{margin:0;padding:0;list-style:none}.palette-group li{border-top:1px dashed var(--line)}.palette-group li a{padding:.65rem var(--sp-2);color:var(--ink);text-decoration:none;display:block}.palette-group li a:hover,.palette-group li a[aria-selected=true]{background:var(--ink);color:var(--paper)}.palette-group li a span{font:500 var(--fs-small) var(--font-mono);display:block}.palette-group li a small{color:var(--ink-soft);font-size:var(--fs-eyebrow);margin-top:.2rem;display:block}.palette-group li a:hover small,.palette-group li a[aria-selected=true] small{color:var(--paper)}.palette-empty{padding:var(--sp-4) 0;color:var(--ink-soft)}@keyframes palette-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.palette-box{animation:none}}.topbar{z-index:40;justify-content:space-between;align-items:center;gap:var(--sp-2);height:64px;padding:0 var(--sp-3);background:var(--paper);border-bottom:1px solid var(--line);display:flex;position:fixed;top:0;left:0;right:0}.topbar .brand-name{font-size:1.4rem}.topbar-actions{gap:var(--sp-2);display:flex}@media (width>=75rem){.topbar{display:none}}.menu-btn{position:relative}.menu-btn .i-menu,.menu-btn .i-close{margin:auto;transition:opacity .2s,transform .2s;position:absolute;inset:0}.menu-btn .i-close{opacity:0;transform:rotate(-90deg)}html:has(.menu-overlay:popover-open) .menu-btn .i-menu{opacity:0;transform:rotate(90deg)}html:has(.menu-overlay:popover-open) .menu-btn .i-close{opacity:1;transform:none}.menu-overlay[popover]{z-index:35;padding:var(--sp-4);background:var(--paper);color:var(--ink);opacity:0;width:auto;height:auto;transition:opacity .2s, transform .2s, display .2s allow-discrete;border:none;margin:0;position:fixed;inset:64px 0 0;overflow:auto;transform:translateY(-8px)}.menu-overlay[popover]:popover-open{opacity:1;flex-direction:column;display:flex;transform:none}@starting-style{.menu-overlay[popover]:popover-open{opacity:0;transform:translateY(-8px)}}.menu-overlay .nav-link{padding:var(--sp-3) 0;border-bottom:1px dashed var(--line);font-size:1.3rem;font-weight:600}.menu-controls{gap:var(--sp-3);padding-top:var(--sp-4);flex-direction:column;margin-top:auto;display:flex}.menu-controls .palette-trigger{min-height:44px}.menu-controls .icon-row{width:100%}@media (width>=75rem){.menu-overlay[popover],.menu-overlay[popover]:popover-open{display:none}}.footer{margin-top:var(--sp-8);padding:var(--sp-6) 0 var(--sp-5);text-align:center}.footer .dots{font-size:var(--fs-small);color:var(--ink-soft);letter-spacing:.35em}.btn{align-items:center;gap:var(--sp-2);font-family:var(--font-sans);text-transform:uppercase;border:2px solid var(--ink);border-radius:var(--radius);background:var(--paper);color:var(--ink);box-shadow:var(--shadow-press);cursor:pointer;transition:box-shadow var(--tick), transform var(--tick);padding:.8rem 1.6rem;font-size:.95rem;font-weight:700;text-decoration:none;display:inline-flex}.btn:hover{background:var(--ink);color:var(--paper)}.btn:active{box-shadow:0 0 0 0 var(--ink);transform:translate(2px,2px)}.btn:focus-visible{outline:2px solid var(--signal);outline-offset:3px}.btn-primary{background:var(--ink);color:var(--paper)}.btn-primary:hover{background:var(--paper);color:var(--ink)}.btn-sm{box-shadow:3px 3px 0 0 var(--ink);padding:.35rem .7rem;font-size:.78rem}.btn:disabled,.btn[aria-disabled=true]{background:var(--wash);color:var(--ink-soft);box-shadow:none;cursor:not-allowed;border-style:dashed;transform:none}.link{color:var(--signal);border-bottom:2px solid var(--signal);text-decoration:none}.link:hover{border-bottom-color:#0000}.link:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.chip{font:600 var(--fs-small) var(--font-mono);text-transform:uppercase;letter-spacing:.08em;border:2px solid var(--ink);border-radius:var(--radius);color:var(--ink);box-shadow:3px 3px 0 0 var(--ink);transition:box-shadow var(--tick), transform var(--tick);background:0 0;align-items:center;gap:.3rem;padding:.35rem .7rem;text-decoration:none;display:inline-flex}button.chip{cursor:pointer}:is(a,button).chip:hover{background:var(--ink);color:var(--paper)}:is(a,button).chip:active{box-shadow:0 0 0 0 var(--ink);transform:translate(2px,2px)}:is(a,button).chip:has(svg){justify-content:center;min-width:44px;min-height:44px}.chip.copied svg{color:var(--signal)}.tag{color:var(--ink);font-size:var(--fs-tag);text-transform:lowercase;border:2px solid var(--ink);border-top-left-radius:var(--radius-tag);border-bottom-left-radius:var(--radius-tag);padding:.12rem .35rem .12rem .2rem;line-height:1.15;text-decoration:none;display:inline-block}.tag:before{content:"•";color:var(--signal);margin-right:.15rem}a.tag:hover{background:var(--ink);color:var(--paper)}a.tag:hover:before{color:var(--paper)}a.tag{color:var(--ink)}.field{margin-bottom:var(--sp-3)}.field label{font-size:var(--fs-eyebrow);margin-bottom:var(--sp-1);display:block}.field label:before{content:"> ";color:var(--signal)}input[type=text],input[type=email],input[type=search],input[type=number],textarea{width:100%;font:400 1rem var(--font-mono);color:var(--ink);border:2px solid var(--ink);border-radius:var(--radius);background:0 0;padding:.6rem .7rem}input:focus-visible,textarea:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.field.invalid input,.field.invalid textarea{border-style:dashed}.field .msg{font-size:var(--fs-small);color:var(--signal)}.field.valid .msg-ok{font-size:var(--fs-small);color:var(--ink-soft)}.codeblock{border:2px solid var(--ink);border-radius:var(--radius);background:var(--ink);color:var(--paper);margin:0 0 var(--sp-4);overflow:hidden}.codeblock-bar{font:500 .75rem var(--font-mono);background:color-mix(in srgb, var(--paper) 14%, var(--ink));border-bottom:1px dashed color-mix(in srgb, var(--paper) 40%, var(--ink));justify-content:space-between;align-items:center;padding:.35rem .8rem;display:flex}.codeblock pre{padding:.9rem var(--sp-3);font:400 .85rem/1.55 var(--font-mono);margin:0;overflow-x:auto}.codeblock pre code{color:inherit;font-size:inherit;background:0 0;padding:0}.codeblock pre span{color:var(--shiki-dark)}[data-theme=dark] .codeblock pre span{color:var(--shiki-light)}.copy-btn{border:1px solid var(--paper);color:var(--paper);font:500 .68rem var(--font-mono);text-transform:uppercase;padding:.15rem var(--sp-2);cursor:pointer;background:0 0;align-items:center;gap:.3rem;display:inline-flex}.copy-btn:hover{background:var(--paper);color:var(--ink)}.copy-btn.copied svg{color:var(--signal)}code{background:var(--ink);color:var(--paper);border-radius:var(--radius);padding:.08em .35em;font-size:.85em}.post-entry{gap:var(--sp-1) var(--sp-1);padding:var(--sp-4) var(--sp-3);border-bottom:1px dashed var(--line);grid-template-columns:3rem 1fr;display:grid}.post-entry:hover{background:var(--wash);box-shadow:inset 3px 0 0 var(--signal)}.post-entry .num{font:400 .8rem var(--font-mono);color:var(--ink-soft);padding-top:.35rem}.post-entry h3,.post-entry h2{font:600 var(--fs-h3)/1.1 var(--font-display);text-transform:uppercase;margin-bottom:.35rem}.post-entry h3 a,.post-entry h2 a{font-size:inherit}.post-entry :is(h2,h3) .link-grow:hover,.proj-card h3 a.link-grow:hover{text-underline-offset:.15em;border-bottom:0;margin-bottom:0;text-decoration:underline 2px}.post-entry .excerpt{font-size:var(--fs-small);color:var(--ink-soft);max-width:56ch;margin:var(--sp-2) 0}.entry-meta{font:600 var(--fs-eyebrow) var(--font-mono);color:var(--ink-soft);letter-spacing:.14em;text-transform:uppercase;margin-bottom:var(--sp-2)}.entry-meta .cat{color:var(--signal);text-decoration:none}.entry-meta a.cat{border-bottom:2px solid var(--signal)}.entry-meta .sep{color:var(--line);margin:0 .5em}.tag-row{gap:var(--sp-2);flex-wrap:wrap;display:flex}.grid-cells{grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));display:grid}.grid-cells>*{outline:1px dashed var(--ink);outline-offset:-1px;padding:var(--sp-3) var(--sp-4)}.proj-card{overflow-wrap:anywhere;min-width:0}.proj-card h3{font:600 1.35rem/1.1 var(--font-display);text-transform:uppercase;margin:var(--sp-2) 0 .4rem}.proj-card h3 a{font-size:inherit;text-decoration:none}.proj-card .desc{font-size:var(--fs-small);color:var(--ink-soft);margin:var(--sp-2) 0}.proj-card .chip{max-width:100%;margin-top:.4rem}.type-chip{color:var(--ink-soft);border-width:1px;border-color:var(--line);pointer-events:none;font-size:.6rem}.pagination{gap:var(--sp-2);margin:var(--sp-6) 0;flex-wrap:wrap;justify-content:center;display:flex}.pagination a,.pagination span{text-align:center;border:2px solid var(--ink);min-width:2.6rem;font:400 var(--fs-small) var(--font-mono);color:var(--ink);padding:.4rem .7rem;text-decoration:none}.pagination a:hover{background:var(--ink);color:var(--paper)}.pagination .page-current{background:var(--signal);color:var(--on-signal);border-color:var(--signal);font-weight:600}.empty-state{text-align:center;padding:var(--sp-6) 0}.empty-state :is(h2,h3){font:600 1.6rem var(--font-display);text-transform:uppercase}.hazard{margin:var(--sp-4) 0;background:repeating-linear-gradient(-55deg, var(--ink) 0 10px, var(--paper) 10px 20px);padding:6px}.hazard>div{background:var(--paper);padding:var(--sp-4);text-align:center}.notice-slab{background:var(--ink);color:var(--paper);border:3px dashed var(--paper);padding:var(--sp-3);font-size:var(--fs-small);line-height:1.6}.notice-slab .btn{border-color:var(--paper);color:var(--paper);box-shadow:4px 4px 0 0 var(--paper);margin-top:var(--sp-2);background:0 0}.notice-slab .btn:hover{background:var(--paper);color:var(--ink)}.notice-slab .link{color:var(--paper);border-bottom-color:var(--paper)}.notice-slab .link:hover{border-bottom-color:#0000}.dots-divider{text-align:center;color:var(--ink-soft);letter-spacing:.3em;margin:var(--sp-6) 0;font-size:var(--fs-small)}.cursor:after{content:"_";font-weight:700;animation:1.1s steps(2,jump-none) infinite blink}@keyframes blink{0%,49%{opacity:1}50%,to{opacity:0}}.end-cursor{margin:var(--sp-5) 0;font-weight:700}.loader{padding:var(--sp-4);justify-content:center;gap:8px;display:flex}.loader span{background:var(--ink);width:8px;height:8px;animation:1.2s steps(2,jump-none) infinite dotblink}.loader span:nth-child(2){animation-delay:.4s}.loader span:nth-child(3){animation-delay:.8s}@keyframes dotblink{0%,49%{opacity:1}50%,to{opacity:0}}@media (prefers-reduced-motion:reduce){.cursor:after,.loader span{animation:none}}:where(img[data-astro-image=constrained]){max-width:100%;height:auto}.redirect-page{max-width:var(--col-reading);padding:var(--sp-7) 0}.redirect-copy{color:var(--ink-soft);font:400 var(--fs-body)/1.7 var(--font-mono);margin-bottom:var(--sp-5);overflow-wrap:anywhere}.eyebrow{font:600 var(--fs-eyebrow) var(--font-mono);text-transform:uppercase;letter-spacing:.14em;color:var(--ink-soft)}.page-title{font:600 var(--fs-h1)/1.05 var(--font-display);text-transform:uppercase;margin:.2rem 0 var(--sp-2)}.display{font:700 var(--fs-display)/.95 var(--font-display);text-transform:uppercase;margin:var(--sp-2) 0 .8rem}.prompt{font:500 var(--fs-small) var(--font-mono);color:var(--ink-soft)}.sig{color:var(--signal);font-weight:600}.lede{font:400 var(--fs-body) var(--font-mono);color:var(--ink-soft);max-width:38rem;line-height:1.7}.typed-line{font:400 1.15rem var(--font-mono);color:var(--ink);margin-bottom:var(--sp-3)}.hero{min-height:max(90vh, calc(100vh - var(--sp-8)));padding:var(--sp-6) 0;flex-direction:column;justify-content:center;display:flex;position:relative;overflow:hidden}.hero:before{content:"";pointer-events:none;opacity:.45;background-image:radial-gradient(var(--line) 1px, transparent 1.4px);background-size:22px 22px;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#000 55%,#0000);mask-image:linear-gradient(#000 55%,#0000)}.hero-inner{position:relative}.hero-stats{margin-top:var(--sp-6);font:600 var(--fs-eyebrow) var(--font-mono);text-transform:uppercase;letter-spacing:.14em;color:var(--ink-soft)}.hero-stats .sep{color:var(--line);margin:0 .5em}.btn-row{gap:var(--sp-2);margin-top:var(--sp-5);flex-wrap:wrap;align-items:center;display:flex}.section-title{font:600 var(--fs-h2)/1.1 var(--font-display);text-transform:uppercase;margin:var(--sp-7) 0 var(--sp-4)}.center{text-align:center}.cta-band{background:var(--ink);color:var(--paper);border:3px dashed var(--paper);padding:var(--sp-5) var(--sp-4);gap:var(--sp-3);margin:var(--sp-8) 0;flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex}.cta-band h2{font:600 1.9rem/1.1 var(--font-display);text-transform:uppercase}.cta-band p{font-size:var(--fs-small);color:color-mix(in srgb, var(--paper) 72%, var(--ink));margin:.3rem 0 0}.cta-band .btn{border-color:var(--paper);color:var(--paper);box-shadow:4px 4px 0 0 var(--paper);background:0 0}.cta-band .btn:hover{background:var(--paper);color:var(--ink)}.article{max-width:var(--col-wide)}.article-head{margin-bottom:var(--sp-5)}.article-head>p{margin:0 0 var(--sp-3)}.article-head .row{gap:var(--sp-2);flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex}.article-head .entry-meta{margin:0}.prose>*{max-width:var(--col-reading)}.prose .codeblock,.prose p:has(>img[data-astro-image]){max-width:100%}.prose>h1+p>img[data-astro-image]{width:100%}.prose h2{font:600 var(--fs-h2)/1.1 var(--font-display);text-transform:uppercase;margin:var(--sp-6) 0 var(--sp-3)}.prose h3{font:600 var(--fs-h3)/1.1 var(--font-display);text-transform:uppercase;margin:var(--sp-5) 0 var(--sp-2)}.prose h4{font:600 var(--fs-h4) var(--font-mono);margin:var(--sp-4) 0 var(--sp-2)}.prose p{margin:0 0 var(--sp-3);line-height:1.7}.prose p.article-button-row{justify-content:center;align-items:center;gap:var(--sp-2);margin:var(--sp-4) 0;flex-wrap:wrap;display:flex}.prose p.article-button-row:has(>a[href="http://danielefavi.github.io/freethebean/"]){gap:var(--sp-3);margin-bottom:var(--sp-5)}.article .prose h1{margin:var(--sp-3) 0 var(--sp-2)}.wave-tool{max-width:var(--col-reading);border:2px dashed var(--ink);padding:var(--sp-3);margin:var(--sp-5) 0 var(--sp-5)}.wave-tool h2{margin-top:0}.wave-preview{width:var(--wave-width);height:var(--wave-height);min-width:8rem;max-width:100%;margin:var(--sp-4) 0;position:relative;overflow:visible}.wave-dot{top:0;left:calc(var(--wave-index) * (var(--wave-size) + var(--wave-gap,6px)));width:var(--wave-size);height:var(--wave-size);background:var(--wave-color);animation:df-wave-movement var(--wave-cycle) infinite ease-in-out;animation-delay:calc(var(--wave-index) * var(--wave-delay,-.3s));border-radius:50%;position:absolute}@keyframes df-wave-movement{0%,to{transform:translateY(0)}50%{transform:translateY(var(--wave-amplitude,30px))}}.wave-fields{gap:var(--sp-2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.wave-fields .field{margin:0}.wave-fields .msg{min-height:1.4em}.wave-actions{gap:var(--sp-2);margin-top:var(--sp-2);flex-wrap:wrap;display:flex}.wave-form>.msg{min-height:1.4em;margin:var(--sp-1) 0 0}.wave-defaults{color:var(--ink-soft);font-size:var(--fs-small)}.wave-output{border:2px solid var(--ink);border-radius:var(--radius);background:var(--ink);color:var(--paper);margin:var(--sp-3) 0 var(--sp-4);overflow:hidden}.wave-output .codeblock-bar{font:500 .75rem var(--font-mono);background:color-mix(in srgb, var(--paper) 14%, var(--ink));border-bottom:1px dashed color-mix(in srgb, var(--paper) 40%, var(--ink));justify-content:space-between;align-items:center;padding:.35rem .8rem;display:flex}.wave-output pre{padding:.9rem var(--sp-3);font:400 .85rem/1.55 var(--font-mono);margin:0;overflow-x:auto}.wave-output pre code{color:inherit;font-size:inherit;background:0 0;padding:0}@media (width<=36rem){.wave-fields{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.wave-dot{animation:none}}.email-tool{max-width:var(--col-reading);border:2px dashed var(--ink);padding:var(--sp-2) var(--sp-3) var(--sp-3);margin:var(--sp-5) 0}.email-tool h2{margin-top:0}.email-fields{gap:var(--sp-2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.email-fields .field{margin:0}.email-tool .btn{width:fit-content;max-width:100%;margin:var(--sp-2) auto 0;display:flex}.email-tool .msg{margin:var(--sp-1) 0 0}.email-tool [data-email-status]{padding-block:var(--sp-3) var(--sp-2)}.email-tool .msg:empty{display:none}.field-help{color:var(--ink-soft);font-size:var(--fs-small);margin:var(--sp-1) 0 0}.email-output{margin-top:var(--sp-3);border:2px solid var(--ink);background:var(--ink);color:var(--paper)}.email-output .codeblock-bar{align-items:center;gap:var(--sp-1);font:500 .75rem var(--font-mono);background:color-mix(in srgb, var(--paper) 14%, var(--ink));border-bottom:1px dashed color-mix(in srgb, var(--paper) 40%, var(--ink));grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);padding:.35rem .8rem;display:grid}.email-output textarea{width:100%;min-height:9rem;padding:var(--sp-2);resize:vertical;background:var(--ink);color:var(--paper);font:400 .8rem/1.5 var(--font-mono);border:0;border-radius:0;display:block}.email-preview{padding:var(--sp-2);border-top:1px dashed color-mix(in srgb, var(--paper) 40%, var(--ink));color:var(--paper);font:400 var(--fs-small) var(--font-mono);overflow-wrap:anywhere;margin:0}@media (width<=36rem){.email-fields{grid-template-columns:1fr}}blockquote{border-left:4px solid var(--ink);background:var(--wash);padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-3);font-style:italic}.prev-next{gap:var(--sp-2);margin:var(--sp-6) 0 var(--sp-4);grid-template-columns:1fr 1fr;display:grid}.prev-next .btn{width:100%}.prev-next .btn.prev{grid-column:1}.prev-next .btn.next{grid-column:2}@media (width<=47.99rem){.prev-next{grid-template-columns:1fr}.prev-next .btn.prev,.prev-next .btn.next{grid-column:auto}}.filter-bar{margin:var(--sp-5) 0 var(--sp-6);max-width:32rem}.proj-section{scroll-margin-top:var(--sp-6)}.small-soft{font-size:var(--fs-small);color:var(--ink-soft)}.hidden{display:none!important}.contact{max-width:var(--col-reading)}.contact>p{margin:0 0 var(--sp-3)}.contact-mail{font-size:1.3rem;font-weight:600}.contact>p.contact-find{margin-top:var(--sp-4)}.search-page{max-width:var(--col-wide)}.search-form{max-width:var(--col-reading);margin:0 0 var(--sp-6)}.search-form .btn{margin-top:var(--sp-1)}.search-results{max-width:var(--col-reading)}.search-group{margin:var(--sp-5) 0}.search-group h3{font:600 var(--fs-h3)/1.1 var(--font-display);text-transform:uppercase;margin:0 0 var(--sp-2)}.search-group ul{margin:0;padding:0;list-style:none}.search-group li{border-top:1px dashed var(--ink);padding:var(--sp-2) 0}.search-group li p{color:var(--ink-soft);margin:var(--sp-1) 0 0}.term-row{justify-content:center;gap:var(--sp-1) var(--sp-2);flex-wrap:wrap;display:flex}.hazard h2{margin-top:0}.hazard h3{margin:var(--sp-4) 0 var(--sp-2);font:600 var(--fs-h3)/1.1 var(--font-display);text-transform:uppercase}.not-found{max-width:var(--col-reading)}.not-found .page-title{max-width:28rem;margin-bottom:var(--sp-5)}.not-found-help{color:var(--ink-soft);margin:0}.hash-page{max-width:var(--col-reading)}.hash-tool{margin:var(--sp-4) 0 var(--sp-6)}.hash-tool .btn{margin-top:var(--sp-1)}.result-box{gap:var(--sp-2);align-items:stretch;display:flex}.result-box input{flex:1;min-width:0}.result-box .copy-btn{flex:none}.hash-tool .msg{min-height:1.4em;margin:var(--sp-1) 0 0}.hash-copy{max-width:var(--col-reading)}@media (width<=36rem){.result-box{display:block}.result-box .copy-btn{margin-top:var(--sp-1)}}.proj-section .proj-card h3{margin:var(--sp-4) 0}.article .prose{flex-direction:column;display:flex}.article .prose>h1{order:-2}.article .prose>.article-meta{text-align:right;order:-1;max-width:100%}
