@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0;mix-blend-mode:plus-lighter}to{opacity:1;mix-blend-mode:plus-lighter}}@keyframes astroFadeOut{0%{opacity:1;mix-blend-mode:plus-lighter}to{opacity:0;mix-blend-mode:plus-lighter}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*),[data-astro-transition-scope]{animation:none!important}}.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}.descent[data-astro-cid-spmxhl3h]{z-index:100;pointer-events:none;display:none;position:fixed;inset:0;overflow:hidden}:root[data-descent] .descent[data-astro-cid-spmxhl3h]{animation:1.3s linear both rumble;display:block}.strip[data-astro-cid-spmxhl3h]{background:linear-gradient(to bottom, #05060f 0 32%, #0b1030 32% 38%, #16245a 38% 44%, var(--sky-1) 44% 54%, var(--sky-2) 54% 64%, var(--sky-3) 64% 73%, var(--sky-4) 73% 82%, var(--sky-5) 82% 90%, transparent 90%);height:260vh;animation:1.8s cubic-bezier(.5,0,.2,1) both reentry;position:absolute;inset:0 0 auto}.space-stars[data-astro-cid-spmxhl3h]{background:url(/sprites/stars.svg) 0 0 / calc(60 * var(--px) / 2) calc(60 * var(--px) / 2);position:absolute;inset:0 0 68%}.strip[data-astro-cid-spmxhl3h] img[data-astro-cid-spmxhl3h]{height:auto;image-rendering:pixelated;position:absolute}@keyframes reentry{to{translate:0 -100%}}@keyframes rumble{0%,20%{translate:0}25%{translate:-2px 1px}30%{translate:2px -1px}35%{translate:-3px 2px}40%{translate:3px -1px}45%{translate:-2px -2px}50%{translate:2px 1px}60%{translate:-1px 1px}70%{translate:1px -1px}80%,to{translate:0}}:root[data-instant]::view-transition-group(*),:root[data-instant]::view-transition-old(*),:root[data-instant]::view-transition-new(*){animation:none!important}.tuft[data-astro-cid-c4ouxohe]{--px:4.5px;left:72%;top:calc(var(--sea-h) - 30px);width:calc(18 * var(--px));height:calc(14 * var(--px));cursor:pointer;background:url(/sprites/tuft.svg) 0 0 / calc(72 * var(--px)) 100%;anchor-name:--tuft;border:0;padding:0;animation:9s step-end infinite rustle;position:absolute}.tuft[data-astro-cid-c4ouxohe]:after{content:"";background:url(/sprites/eyes.svg) 0 0 / calc(36 * var(--px)) 100%;opacity:0;animation:9s step-end infinite peek;position:absolute;inset:0}.tuft[data-astro-cid-c4ouxohe][hidden]{display:none}.tuft[data-astro-cid-c4ouxohe]:hover{animation-duration:1.2s}.tuft[data-astro-cid-c4ouxohe]:hover:after,.tuft[data-astro-cid-c4ouxohe]:focus-visible:after{opacity:1;animation:none}.tuft[data-astro-cid-c4ouxohe]:focus-visible{outline:var(--px) dashed var(--dialog-ink);outline-offset:var(--px)}@keyframes rustle{0%,76%{background-position-x:0}68%,74%{background-position-x:calc(-18 * var(--px))}70%,75%{background-position-x:calc(-54 * var(--px))}72%{background-position-x:calc(-36 * var(--px))}}@keyframes peek{0%,96%{opacity:0;background-position-x:0}77%{opacity:1}86%{background-position-x:calc(-18 * var(--px))}87.5%{background-position-x:0}}@media (prefers-reduced-motion:reduce){.tuft[data-astro-cid-c4ouxohe]:after{opacity:1;animation:none}}.sky-controls[data-astro-cid-c4ouxohe]{width:min(22rem,100vw - 2rem);color:var(--dialog-ink);background:var(--dialog-bg);border:var(--px) solid var(--dialog-ink);border-radius:calc(var(--px) * 2);box-shadow:inset 0 0 0 var(--px) var(--dialog-bg), inset 0 0 0 calc(var(--px) * 2) var(--dialog-frame), 0 calc(var(--px) * 2) 0 oklch(0% 0 0/.25);font-family:var(--font-pixel);margin:0;padding:1.25rem 1.5rem;inset:auto auto 1rem 50%;translate:-50%}@supports (anchor-name:--a){.sky-controls[data-astro-cid-c4ouxohe]{position-anchor:--tuft;position-area:top;position-try-fallbacks:flip-block;margin-block:calc(var(--px) * 2);inset:auto;translate:none}}.sky-controls[data-astro-cid-c4ouxohe]::backdrop{background:0 0}h2[data-astro-cid-c4ouxohe]{margin:0 0 .75rem;font-size:1.25rem}fieldset[data-astro-cid-c4ouxohe]{border:0;grid-template-columns:repeat(3,1fr);gap:.25rem .5rem;margin:0 0 1rem;padding:0;display:grid}legend[data-astro-cid-c4ouxohe]{opacity:.7;margin-bottom:.375rem;font-size:.875rem}label[data-astro-cid-c4ouxohe]{cursor:pointer;padding-left:1.1em;position:relative}input[data-astro-cid-c4ouxohe]{opacity:0;pointer-events:none;position:absolute}.cursor[data-astro-cid-c4ouxohe]{visibility:hidden;font-size:.7em;position:absolute;top:50%;left:0;translate:0 -50%}label[data-astro-cid-c4ouxohe]:has(:checked) .cursor[data-astro-cid-c4ouxohe]{visibility:visible}label[data-astro-cid-c4ouxohe]:hover,label[data-astro-cid-c4ouxohe]:has(:focus-visible){text-underline-offset:.2em;text-decoration:underline}.close[data-astro-cid-c4ouxohe]{font:inherit;color:var(--dialog-bg);background:var(--dialog-ink);border-radius:var(--px);cursor:pointer;border:0;padding:.25rem .75rem}@layer reset{*,:before,:after,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;line-height:1.5}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}hr{height:0;color:inherit;border-top-width:1px}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:1em}ol,ul{list-style:none}img,svg,video{vertical-align:middle;max-width:100%;height:auto;display:block}button,input,select,textarea{font:inherit;color:inherit;letter-spacing:inherit;background-color:#0000;border-radius:0}[hidden]:where(:not([hidden=until-found])){display:none!important}}:root{--t-sky-1:oklch(68% .14 240);--t-sky-2:oklch(74% .12 235);--t-sky-3:oklch(80% .1 228);--t-sky-4:oklch(86% .07 220);--t-sky-5:oklch(92% .04 210);--t-sea-1:oklch(55% .17 255);--t-sea-2:oklch(65% .14 245);--t-sea-foam:oklch(97% .02 220);--wl:1;--wc:1;--sky-1:oklch(from var(--t-sky-1) calc(l * var(--wl)) calc(c * var(--wc)) h);--sky-2:oklch(from var(--t-sky-2) calc(l * var(--wl)) calc(c * var(--wc)) h);--sky-3:oklch(from var(--t-sky-3) calc(l * var(--wl)) calc(c * var(--wc)) h);--sky-4:oklch(from var(--t-sky-4) calc(l * var(--wl)) calc(c * var(--wc)) h);--sky-5:oklch(from var(--t-sky-5) calc(l * var(--wl)) calc(c * var(--wc)) h);--sea-1:oklch(from var(--t-sea-1) calc(l * var(--wl)) calc(c * var(--wc)) h);--sea-2:oklch(from var(--t-sea-2) calc(l * var(--wl)) calc(c * var(--wc)) h);--sea-foam:oklch(from var(--t-sea-foam) calc(l * var(--wl)) calc(c * var(--wc)) h);--cloud-time:brightness(1);--cloud-weather:saturate(1);--ground-time:brightness(1);--ground-weather:saturate(1);--band-ink:var(--dialog-ink);--grass-light:oklch(82% .19 135);--grass:#4a8a46;--dialog-bg:oklch(98% .01 95);--dialog-ink:oklch(30% .02 260);--dialog-frame:oklch(62% .09 215);--font-pixel:var(--font-geist-pixel);--px:4px;--gutter:clamp(2rem, 5vw, 3rem)}::selection{color:oklch(25% .03 260);text-shadow:none;background:oklch(88% .16 95)}:root[data-time=night]{--t-sky-1:oklch(20% .06 275);--t-sky-2:oklch(24% .07 272);--t-sky-3:oklch(28% .07 268);--t-sky-4:oklch(32% .07 262);--t-sky-5:oklch(37% .06 255);--t-sea-1:oklch(24% .08 262);--t-sea-2:oklch(31% .08 256);--t-sea-foam:oklch(62% .04 245);--cloud-time:brightness(.45) saturate(.6);--ground-time:brightness(.5) saturate(.8);--band-ink:oklch(94% .02 250)}:root[data-time=dawn]{--t-sky-1:oklch(58% .1 265);--t-sky-2:oklch(68% .09 300);--t-sky-3:oklch(76% .09 345);--t-sky-4:oklch(83% .09 30);--t-sky-5:oklch(90% .07 75);--t-sea-1:oklch(48% .12 270);--t-sea-2:oklch(60% .1 290);--t-sea-foam:oklch(94% .04 60);--cloud-time:sepia(.25) saturate(1.4) hue-rotate(-15deg);--ground-time:brightness(.85)}:root[data-time=dusk]{--t-sky-1:oklch(48% .13 295);--t-sky-2:oklch(62% .14 330);--t-sky-3:oklch(70% .14 10);--t-sky-4:oklch(77% .14 45);--t-sky-5:oklch(85% .12 75);--t-sea-1:oklch(40% .12 280);--t-sea-2:oklch(52% .13 320);--t-sea-foam:oklch(90% .07 60);--cloud-time:sepia(.4) saturate(1.8) hue-rotate(-25deg) brightness(.95);--ground-time:brightness(.75) saturate(.9)}:root[data-weather=cloudy]{--wl:.97;--wc:.45;--cloud-weather:grayscale(.3)}:root[data-weather=rain]{--wl:.85;--wc:.25;--cloud-weather:grayscale(.8) brightness(.8);--ground-weather:brightness(.85) saturate(.8)}:root[data-weather=snow]{--wl:1.02;--wc:.15;--cloud-weather:grayscale(.6);--ground-weather:saturate(.35) brightness(1.3)}:root[data-weather=storm]{--wl:.6;--wc:.25;--cloud-weather:grayscale(.9) brightness(.55);--ground-weather:brightness(.7) saturate(.7);--band-ink:oklch(94% .02 250)}body{min-height:100dvh;color:var(--dialog-ink);background:var(--sky-5);flex-direction:column;margin:0;font-family:system-ui,sans-serif;display:flex}.sky-life{z-index:0;pointer-events:none;position:fixed;inset:0;overflow:hidden}.page-bg{z-index:-1;background:var(--c);view-transition-class:band;position:fixed;inset:0}body>main{flex:1 0 auto}.site-title{z-index:1;width:fit-content;font-family:var(--font-pixel);color:#fff;--o:.03em;--drop:calc(var(--o) * 2.5);--ink:var(--dialog-ink);text-shadow:var(--o) 0 var(--ink), calc(var(--o) * -1) 0 var(--ink), 0 var(--o) var(--ink), 0 calc(var(--o) * -1) var(--ink), var(--o) var(--o) var(--ink), calc(var(--o) * -1) calc(var(--o) * -1) var(--ink), var(--o) calc(var(--o) * -1) var(--ink), calc(var(--o) * -1) var(--o) var(--ink), var(--drop) var(--drop) 0 var(--ink);view-transition-class:band;margin:0;font-size:clamp(3rem,10vw,6.5rem);line-height:1;text-decoration:none;position:relative}.site-header{padding:1.25rem var(--gutter) 0}.site-title-sm{--o:.05em;--drop:0;font-size:clamp(1.5rem,3vw,2rem);display:block}.site-title-sm:hover{translate:0 calc(var(--px) * -1)}.site-title-sm:focus-visible{outline:var(--px) dashed var(--dialog-ink);outline-offset:var(--px)}.home{flex-direction:column;display:flex}.hero{padding:3rem var(--gutter);background:var(--c);flex:30 0 auto;align-items:center;display:flex}.contents{flex-direction:column;flex:60 0 auto;display:flex}.band-link{flex:1 0 calc(var(--px) * 16);padding-inline:var(--gutter);color:var(--band-ink);align-items:center;text-decoration:none;display:flex;position:relative}.band-fill{z-index:-1;background:var(--c);view-transition-class:band;position:absolute;inset:0}.band-link:hover .band-fill,.band-link:focus-visible .band-fill{filter:brightness(1.06)}.band-link:focus-visible{outline:var(--px) dashed var(--band-ink);outline-offset:calc(var(--px) * -3)}.band-label{z-index:1;font-family:var(--font-pixel);font-size:clamp(1.5rem,4vw,2.25rem);position:relative}.cursor{visibility:hidden;margin-right:.35em;font-size:.6em;position:absolute;top:50%;right:100%;translate:0 -50%}.band-link:hover .cursor,.band-link:focus-visible .cursor{visibility:visible;animation:.8s step-end infinite blink}@keyframes blink{50%{visibility:hidden}}.section-nav{font-family:var(--font-pixel);flex-wrap:wrap;gap:.25rem 1.25rem;margin-bottom:1.5rem;display:flex}.section-nav a{color:inherit;text-decoration:none}.section-nav a:hover,.section-nav a[aria-current=page]{text-underline-offset:.25em;text-decoration:underline}::view-transition-group(*.band){animation-duration:.5s;animation-timing-function:cubic-bezier(.7,0,.3,1)}.dither{--tile:calc(var(--px) * 2);height:calc(var(--tile) * 3);background:conic-gradient(from 90deg at var(--px) var(--px), var(--a) 75%, var(--b) 0) 0 0 / var(--tile) var(--tile) repeat-x, repeating-conic-gradient(var(--a) 0 25%, var(--b) 0 50%) 0 var(--tile) / var(--tile) var(--tile) repeat-x, conic-gradient(from 90deg at var(--px) var(--px), var(--b) 75%, var(--a) 0) var(--px) calc(var(--tile) * 2) / var(--tile) var(--tile) repeat-x;flex:none}.cloud{width:calc(var(--w) * var(--px) * 2);height:calc(var(--h) * var(--px) * 2);filter:var(--cloud-time) var(--cloud-weather);animation:linear infinite drift;position:absolute;left:0}.stars,.precip,.flash{display:none;position:absolute;inset:0}.stars{background:url(/sprites/stars.svg) 0 0 / calc(60 * var(--px) / 2) calc(60 * var(--px) / 2);animation:4s steps(2,end) infinite alternate twinkle;bottom:35%;mask-image:linear-gradient(#000 40%,#0000)}:root[data-time=night]:not([data-weather]) .stars,:root[data-time=night][data-weather=cloudy] .stars{display:block}:root[data-weather=cloudy] .stars{opacity:.5}@keyframes twinkle{to{opacity:.7}}.precip:before,.precip:after{content:"";--a:calc(var(--px) / 2);background:var(--tile) 0 0 / calc(var(--tw) * var(--a)) calc(var(--th) * var(--a));animation:linear infinite fall;position:absolute;inset:0}.precip:after{--a:calc(var(--px) * .75);animation-duration:calc(var(--speed) * .7)}.precip:before{opacity:.6;animation-duration:var(--speed)}@keyframes fall{to{background-position:calc(var(--drift) * var(--tw) * var(--a)) calc(2 * var(--th) * var(--a))}}:root[data-weather=rain] .precip,:root[data-weather=storm] .precip{--tile:url(/sprites/rain.svg);--tw:24;--th:36;--drift:0;--speed:.9s;display:block}:root[data-weather=rain] .precip{opacity:.45}:root[data-weather=storm] .precip{--speed:.6s;opacity:.6}:root[data-weather=snow] .precip{--tile:url(/sprites/snow.svg);--tw:40;--th:40;--drift:1;--speed:14s;display:block}:root:has(.scene) .sky-life,:root:has(.scene) footer.ground{display:none}:root[data-weather=storm] .flash{opacity:0;background:#fff;animation:11s infinite lightning;display:block}@keyframes lightning{93%{opacity:0}94%{opacity:.45}95%{opacity:0}96.5%{opacity:.3}98%{opacity:0}}:root[data-time=night] .bird,:root[data-weather=rain] .bird,:root[data-weather=storm] .bird,:root[data-weather=snow] .bird{display:none}.bird{--art:calc(var(--px) * var(--scale));width:calc(22 * var(--art));height:calc(15 * var(--art));background:url(/sprites/bird.svg) 0 0 / calc(88 * var(--art)) 100%;animation-name:flap,fly,bob;animation-timing-function:steps(4,end),linear,ease-in-out;animation-iteration-count:infinite;position:absolute;left:0}@keyframes flap{to{background-position-x:calc(-88 * var(--art))}}@keyframes fly{0%{translate:100vw}25%,to{translate:-100%}}@keyframes bob{50%{transform:translateY(calc(var(--art) * 3))}}.bat{--art:calc(var(--px) * var(--scale));width:calc(16 * var(--art));height:calc(8 * var(--art));background:url(/sprites/bat.svg) 0 0 / calc(64 * var(--art)) 100%;animation-name:flutter,fly,swoop;animation-timing-function:steps(4,end),linear,ease-in-out;animation-iteration-count:infinite;display:none;position:absolute;left:0}:root[data-time=night]:not([data-weather]) .bat,:root[data-time=night][data-weather=cloudy] .bat{display:block}@keyframes flutter{to{background-position-x:calc(-64 * var(--art))}}@keyframes swoop{20%{transform:translateY(calc(var(--art) * 14))}45%{transform:translateY(calc(var(--art) * -6))}70%{transform:translateY(calc(var(--art) * 10))}}@keyframes drift{0%{translate:100vw}to{translate:-100%}}h1,h2{font-family:var(--font-pixel);font-weight:400}.page-title{margin-bottom:1rem;font-size:2.25rem;line-height:2.5rem}.stage{padding:clamp(2rem,12vh,8rem) clamp(.5rem,2.5vw,1rem) 4rem}.content{line-height:1.65}.content>*+*{margin-top:1em}.content h2{margin-top:2em;font-size:1.5rem}.content :is(ul,ol){padding-left:1.5em}.content ul{list-style:square}.content ol{list-style:decimal}.content li+li{margin-top:.25em}.content blockquote{border-left:var(--px) solid var(--dialog-frame);padding-left:1em;font-style:italic}.content blockquote>*+*{margin-top:1em}.content img{max-width:100%;height:auto}.content :not(pre)>code{background:oklch(from var(--dialog-ink) l c h / .08);border-radius:3px;padding:.1em .3em;font-size:.9em}.content pre{border-radius:var(--px);padding:1em;font-size:.875rem;overflow-x:auto}.content a{color:inherit;text-decoration:underline;text-decoration-color:var(--dialog-frame);text-underline-offset:.2em;overflow-wrap:anywhere;text-decoration-thickness:2px}.content a:hover{text-decoration-color:currentColor}.content a:focus-visible{outline:2px dashed var(--dialog-ink);outline-offset:2px}.content a[href^=http]:after{content:"↗";content:"↗" / "";margin-left:.15em;font-size:.8em;display:inline-block}.tone-demo{background:oklch(from var(--dialog-bg) calc(l - .03) c h);border:2px solid var(--dialog-ink);border-radius:var(--px);font-family:var(--font-pixel);flex-wrap:wrap;align-items:center;gap:1rem 2rem;padding:1rem 1.25rem;display:flex}.tone-play{min-width:6.5rem;font:inherit;color:var(--dialog-bg);background:var(--dialog-ink);border-radius:var(--px);cursor:pointer;border:0;padding:.5rem 1rem}.tone-play:hover{background:oklch(from var(--dialog-ink) calc(l + .1) c h)}.tone-play:focus-visible,.tone-demo input:focus-visible{outline:2px dashed var(--dialog-ink);outline-offset:2px}.tone-duty{border:0;flex-wrap:wrap;gap:.25rem 1rem;margin:0;padding:0;display:flex}.tone-duty legend{opacity:.7;margin-bottom:.25rem;font-size:.875em}.tone-duty label{cursor:pointer;align-items:center;gap:.35rem;display:flex}.tone-demo input{accent-color:var(--dialog-frame)}.tone-volume{gap:.25rem;font-size:.875em;display:grid}.tone-volume input{width:10rem}.chips{font-family:var(--font-pixel);flex-wrap:wrap;gap:.5rem;padding:0;font-size:.875rem;list-style:none;display:flex}.content .chips{padding-left:0;list-style:none}.content .chips li{margin:0}.chips li{border:2px solid var(--dialog-ink);border-radius:var(--px);padding:.125rem .5rem}.content a.button{font-family:var(--font-pixel);color:var(--dialog-bg);background:var(--dialog-ink);border-radius:var(--px);padding:.5rem 1rem;text-decoration:none;display:inline-block}.content a.button:after{content:none}.content a.button:hover{background:oklch(from var(--dialog-ink) calc(l + .1) c h)}.dialog{z-index:1;background:var(--dialog-bg);border:var(--px) solid var(--dialog-ink);border-radius:calc(var(--px) * 2);max-width:clamp(42rem,62vw,54rem);box-shadow:inset 0 0 0 var(--px) var(--dialog-bg), inset 0 0 0 calc(var(--px) * 2) var(--dialog-frame), 0 calc(var(--px) * 2) 0 oklch(0% 0 0/.2);margin-inline:auto;padding:clamp(1.25rem,5vw,2rem);font-size:clamp(1rem,.85rem + .25vw,1.125rem);position:relative}.ground{--sea-h:calc(var(--px) * 20);--grass-w:calc(32 * var(--px));--grass-h:calc(13 * var(--px));background:url(/sprites/grass.svg) 0 calc(var(--sea-h) - var(--px) * 6) / var(--grass-w) var(--grass-h) repeat-x, linear-gradient(var(--sea-foam) 0 var(--px), transparent 0) 0 0 / 100% var(--sea-h) no-repeat, linear-gradient(var(--sea-1) 0 50%, var(--sea-2) 50%) 0 0 / 100% var(--sea-h) no-repeat, var(--grass);height:clamp(9rem,22vh,12rem);filter:var(--ground-time) var(--ground-weather);position:relative;overflow-x:clip}.boat{--bpx:3px;left:0;top:calc(var(--sea-h) * .3 - (var(--waterline) + 2) * var(--bpx));width:calc(var(--w) * var(--bpx));height:calc(var(--h) * var(--bpx));background:var(--src) 0 0 / 100% 100%;animation-name:sail,swell;animation-timing-function:linear,step-end;animation-iteration-count:infinite;position:absolute;translate:-100%}@keyframes sail{0%{translate:-100%}33.333%{translate:100vw}to{translate:100vw}}@keyframes swell{50%{transform:translateY(var(--bpx))}}:root[data-weather=storm] .boat{display:none}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.cloud{translate:var(--x) 0;animation:none}.boat{animation:none;translate:18vw}.boat~.boat{display:none}.bird,.bat,.flash{display:none!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}
