.astro-route-announcer{position:absolute;left:0;top:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;width:1px;height:1px}@font-face{font-family:Inter;font-weight:100 900;font-style:normal;font-display:swap;src:url(/assets/fonts/InterVariable.woff2) format("woff2")}@font-face{font-family:Inter;font-weight:100 900;font-style:italic;font-display:swap;src:url(/assets/fonts/InterVariable-Italic.woff2) format("woff2")}@font-face{font-family:Hanken Grotesk;font-weight:100 900;font-style:normal;font-display:swap;src:url(/assets/fonts/HankenGrotesk-Variable.woff2) format("woff2")}@font-face{font-family:Hanken Grotesk;font-weight:100 900;font-style:italic;font-display:swap;src:url(/assets/fonts/HankenGrotesk-VariableItalic.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:400;font-display:swap;src:url(/assets/fonts/IBMPlexMono-Regular.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:400;font-style:italic;font-display:swap;src:url(/assets/fonts/IBMPlexMono-Italic.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:450;font-display:swap;src:url(/assets/fonts/IBMPlexMono-Text.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:450;font-style:italic;font-display:swap;src:url(/assets/fonts/IBMPlexMono-TextItalic.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:500;font-display:swap;src:url(/assets/fonts/IBMPlexMono-Medium.woff2) format("woff2")}@font-face{font-family:IBM Plex Mono;font-weight:500;font-style:italic;font-display:swap;src:url(/assets/fonts/IBMPlexMono-MediumItalic.woff2) format("woff2")}:root{--step--2: clamp(.6944rem, .6856rem + .0444vw, .72rem);--step--1: clamp(.8333rem, .8101rem + .1159vw, .9rem);--step-0: clamp(1.125rem, .9565rem + .2174vw, 1.125rem);--step-1: clamp(1.2rem, 1.1283rem + .3587vw, 1.4063rem);--step-2: clamp(1.44rem, 1.3295rem + .5527vw, 1.7578rem);--step-3: clamp(1.728rem, 1.5648rem + .8161vw, 2.1973rem);--step-4: clamp(2.0736rem, 1.8395rem + 1.1704vw, 2.7466rem);--step-5: clamp(2.4883rem, 2.1597rem + 1.6433vw, 3.4332rem);--space-3xs: clamp(.25rem, .2283rem + .1087vw, .3125rem);--space-2xs: clamp(.5rem, .4783rem + .1087vw, .5625rem);--space-xs: clamp(.75rem, .7065rem + .2174vw, .875rem);--space-s: clamp(1rem, .9565rem + .2174vw, 1.125rem);--space-m: clamp(1.5rem, 1.4348rem + .3261vw, 1.6875rem);--space-l: clamp(2rem, 1.913rem + .4348vw, 2.25rem);--space-xl: clamp(3rem, 2.8696rem + .6522vw, 3.375rem);--space-2xl: clamp(4rem, 3.8261rem + .8696vw, 4.5rem);--space-3xl: clamp(6rem, 5.7391rem + 1.3043vw, 6.75rem);--space-3xs-2xs: clamp(.25rem, .1413rem + .5435vw, .5625rem);--space-2xs-xs: clamp(.5rem, .3696rem + .6522vw, .875rem);--space-xs-s: clamp(.75rem, .6196rem + .6522vw, 1.125rem);--space-m-l: clamp(1.5rem, 1.2391rem + 1.3043vw, 2.25rem);--space-l-xl: clamp(2rem, 1.5217rem + 2.3913vw, 3.375rem);--space-xl-2xl: clamp(3rem, 2.4783rem + 2.6087vw, 4.5rem);--space-2xl-3xl: clamp(4rem, 3.0435rem + 4.7826vw, 6.75rem);--space-s-m: clamp(1rem, .7609rem + 1.1957vw, 1.6875rem);--space-s-l: clamp(1rem, .5652rem + 2.1739vw, 2.25rem);--space-s-xl: clamp(1rem, .1739rem + 4.1304vw, 3.375rem);--space-s-2xl: clamp(1rem, -.2174rem + 6.087vw, 4.5rem);--space-s-3xl: clamp(1rem, -1rem + 10vw, 6.75rem);--space-m-2xl: clamp(1.5rem, .4565rem + 5.2174vw, 4.5rem);--flow-space: var(--space-m-l);--flow-space-lg: var(--space-m-2xl);--flow-space-xl: var(--space-s-3xl);--font-stack: "Inter", ui-sans-serif, system-ui, -apple-system, "BlinkMacSystemFont", "Segoe UI", sans-serif;--font-stack-heading: "Hanken Grotesk", ui-sans-serif, system-ui, -apple-system, "BlinkMacSystemFont", "Segoe UI", sans-serif;--font-stack-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--background-color: #f5f3ee;--background-color-secondary: #fff;--background-color-tertiary: #e5dfd5;--text-color: #1c1c14;--text-color-muted: #1c1c1480;--link-color: #1b5e4b;--link-color-hover: #093a2a;font-family:var(--font-stack)}[data-user-theme=dark]{--background-color: #1a1712;--background-color-secondary: #221e18;--background-color-tertiary: #2d2820;--text-color: #ece7dd;--text-color-muted: #a39a8c;--link-color: #5cba9b;--link-color-hover: #34a17c}*,*:before,*:after{box-sizing:border-box}html{-moz-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin-block-end:0}ul[role=list],ol[role=list]{list-style:none}body{margin:0;min-height:100vh;line-height:1.618}h1,h2,h3,h4,button,input,label{line-height:1.2}h1,h2,h3,h4{text-wrap:balance}a:not([class]){text-decoration-skip-ink:auto}img,picture{max-width:100%;display:block;height:auto}input,button,textarea,select{font-family:inherit;font-size:inherit}textarea:not([rows]){min-height:10em}:target{scroll-margin-block:5ex}body{background-color:var(--background-color);font-size:var(--step-0);font-weight:450;color:var(--text-color);letter-spacing:-.014em;font-feature-settings:"cv11" 1}::selection{background-color:var(--link-color);color:var(--background-color)}.iframe iframe{width:100%}h1,h2,h3,h4,h5,h6{font-family:var(--font-stack-heading);font-weight:700;text-wrap:balance;letter-spacing:-.02em;word-break:break-word;font-feature-settings:"ss01" 1}h1,.h1{font-size:var(--step-4);letter-spacing:-.035em}h2,.h2{font-size:var(--step-3);letter-spacing:-.03em}h3,.h3{font-size:var(--step-2)}h4,.h4{font-size:var(--step-1)}p code,li code{display:inline;font-family:var(--font-stack-mono);font-weight:450;font-size:var(--step-0);background-color:var(--background-color-secondary);font-size:calc(var(--step-0) - 2px);text-wrap-mode:wrap;text-wrap-style:pretty;padding:2px 4px}a{font-weight:inherit;color:var(--link-color);text-underline-offset:1.5px;transition:color .2s ease-in-out,text-underline-offset .2s ease-in-out}a:hover,a:focus{color:var(--link-color-hover);text-underline-offset:3px}p,li{text-wrap:pretty}p.lead,li.lead{font-size:var(--step-1);font-weight:550;letter-spacing:-.01em}figure{margin:0;padding:0}@media(min-width:800px){figure{margin-right:calc(-1 * var(--flow-space-xl));margin-left:calc(-1 * var(--flow-space-xl))}}figure img{border-radius:.5rem;overflow:hidden}figure figcaption{font-size:var(--step--1);color:var(--text-color-muted);margin-top:.5rem;font-style:italic;text-wrap:pretty}@media(min-width:800px){figure figcaption{padding-right:var(--flow-space-xl);padding-left:var(--flow-space-xl)}}blockquote{margin:0;padding:0;font-family:var(--font-stack-heading);font-feature-settings:"ss01" 1;font-size:var(--step-1);font-weight:500;font-style:italic;color:var(--text-color-muted);border-left:4px solid var(--background-color-tertiary);padding-left:var(--flow-space);text-wrap:pretty}time{font-family:var(--font-stack-mono);font-size:var(--step--1);font-weight:500;color:var(--text-color-muted)}lite-youtube{max-width:100%!important}.o-container{max-width:75ch;margin:0 auto;padding:0 var(--flow-space)}.o-btn{display:inline-flex;justify-content:center;align-items:center;padding:.5rem 1rem;background-color:var(--background-color-secondary);color:var(--text-color);border:none;border-radius:1.25rem;cursor:pointer;text-decoration:none;box-shadow:0 1px 2px var(--background-color-tertiary);transition:background-color .2s ease-in-out,box-shadow .2s ease-in-out}.o-btn svg{width:24px;height:24px;margin-right:8px}.o-btn:hover,.o-btn:focus{background-color:var(--background-color-tertiary)}.o-dropdown{position:absolute;background-color:var(--background-color-secondary)}.o-dropdown.hidden{display:none}.o-list{margin:0;padding:0;list-style:none}.o-list--inline{display:inline-flex;flex-wrap:wrap;gap:var(--space-s)}.o-list--inline li{display:flex;align-items:center}.o-list--inline li svg{width:32px;margin-right:var(--space-2xs)}.c-flow>*+*{margin-block-start:var(--flow-space)}.c-flow>:is(h2,h3,h4):not(:first-child){margin-block-start:var(--flow-space-lg)}.c-flow>:is(h1,h2,h3)+p,.c-flow>:is(h1,h2,h3)+ul{margin-block-start:var(--space-xs-s)}.c-flow>time+:is(h1,h2,h3,h4):not(:first-child){margin-block-start:var(--space-2xs)}.hidden{display:none!important}.c-header{padding:var(--space-s-xl) 0}.c-header__inner{display:flex;justify-content:space-between;align-items:flex-start}@media(min-width:768px){.c-header__inner{align-items:center}}.c-header__logo{font-size:var(--step-2);font-family:var(--font-stack-heading);font-feature-settings:"ss01" 1;letter-spacing:-.03em}.c-header__logo strong{font-weight:800}.c-header__right{position:relative;padding-left:1rem}.c-header__right svg{margin-right:0}@media(min-width:768px){.c-header__right svg{margin-right:.5rem}}.c-header__right #theme-toggle{padding:.5rem;display:flex;align-items:center;justify-content:center;transition:all .2s ease}@media(min-width:768px){.c-header__right #theme-toggle{padding:.5rem 1rem}}.c-header__right #theme-toggle svg{margin-right:0;transition:opacity .2s ease}.c-header__right #theme-toggle:hover{opacity:.7}.c-header__right #theme-toggle .hidden{display:none}.c-nav{display:flex;flex-direction:row;justify-content:space-between;margin-top:.5rem}.c-nav ul{display:flex;flex-direction:row;list-style:none;padding:0;margin:0}.c-nav ul li{margin-right:1rem}.c-nav ul li:last-of-type{margin-right:0}nav{font-family:var(--font-stack)}.c-footer{padding:var(--space-s-xl) 0;font-size:var(--step--1);text-align:center}.c-footer ul{display:flex;margin:0 0 1rem;padding:0;justify-content:center;list-style:none}.c-footer ul li{margin:0 1rem}.c-footer ul li a{color:var(--link-color);text-decoration:none;transition:color .2s ease-in-out}.c-footer ul li a:hover,.c-footer ul li a:focus{color:var(--link-color-hover)}.c-footer ul li a svg path{fill:currentColor}.c-pagination{margin-top:var(--space-xl)}.c-article+.c-article{margin-block-start:var(--flow-space-lg)}.c-article--project{display:flex;align-items:flex-start}.c-article--project .c-article__left{flex-grow:1}.c-article--project .c-article__left h2{margin-block-start:0}.c-article--project .c-article__right{margin-block-start:0;width:20%;flex-shrink:0;padding-left:var(--space-m)}.c-article .expressive-code{margin-inline:calc(-1 * var(--flow-space))}@media(min-width:980px){.c-article .expressive-code{margin-inline:calc(-1 * var(--flow-space-xl))}}.c-article .expressive-code code{counter-reset:step;counter-increment:step 0}.c-article .expressive-code code .ec-line:before{content:counter(step);counter-increment:step;width:1rem;padding-left:1rem;margin-right:1.5rem;display:inline-block;text-align:right;color:#738a9466}.c-home .lead{font-family:var(--font-stack-heading);font-feature-settings:"ss01" 1;font-size:var(--step-3);font-weight:700;letter-spacing:-.03em;line-height:1.2;text-wrap:balance}.c-alert{padding:var(--space-m);border-radius:var(--border-radius)}.c-alert time{margin-bottom:.5rem;font-weight:500;display:block}.c-alert--update{background-color:var(--background-color-secondary);border-radius:.25rem}.c-gallery{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;-webkit-overflow-scrolling:touch}@media(min-width:800px){.c-gallery{margin-right:calc(-1 * var(--flow-space-xl));margin-left:calc(-1 * var(--flow-space-xl))}}.c-gallery::-webkit-scrollbar{width:10px;height:10px}.c-gallery::-webkit-scrollbar-thumb{background:#000;border-radius:10px}.c-gallery::-webkit-scrollbar-track{background:transparent}.c-gallery>figure{display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 var(--flow-space) 0 0;width:100%;flex-shrink:0;scroll-snap-align:center}.u-flex-direction-column{flex-direction:column}
