.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}:root{--grey-50: #fafafa;--grey-100: #f5f5f5;--grey-200: #e6e6e6;--grey-300: #d6d6d6;--grey-400: #a5a5a5;--grey-500: #767676;--grey-600: #575757;--grey-800: #262626;--grey-900: #1a1a1a;--grey-950: #0a0a0a;--white: #ffffff;--black: #000000;--orange-500: #ef6654;--purple-300: #c7bfe8;--red-500: #d12b2b;--red-400: #ff6b6b;--green-500: #3fa756;--teal-200: #abdad5;--color-background-primary: var(--white);--color-background-secondary: var(--grey-50);--color-background-raised: var(--grey-200);--color-background-inverse: var(--grey-950);--color-text-main: var(--grey-950);--color-text-secondary: var(--grey-500);--color-text-tertiary: var(--grey-400);--color-text-inverse: var(--white);--color-text-on-brand: var(--grey-950);--color-pulse-dot: var(--green-500);--color-text-error: var(--red-500);--shadow-raised: 0 .125rem .25rem rgb(0 0 0 / .03), 0 .75rem 1.5rem rgb(0 0 0 / .06);--shadow-sm-ring: 0 0 .125rem 0 rgb(15 15 16 / .06);--shadow-sm-drop: 0 .125rem .25rem -.125rem rgb(15 15 16 / .1);--shadow-sm: var(--shadow-sm-ring), var(--shadow-sm-drop);--tooltip-fill: rgb(0 0 0 / .75);--tooltip-blur: .75rem;--tooltip-edge: rgb(255 255 255 / .08);--color-border-light: var(--grey-100);--color-border-default: var(--grey-200);--color-border-bold: var(--grey-500);--color-data-secondary: var(--orange-500);--color-decoration-orange: var(--orange-500);--color-decoration-purple: var(--purple-300);--color-decoration-matcha: var(--green-500);--color-decoration-light-blue: var(--teal-200);--font-family-primary: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;--font-family-secondary: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;--font-size-12: .75rem;--font-size-14: .875rem;--font-size-16: 1rem;--font-size-20: 1.25rem;--font-size-24: 1.5rem;--font-size-40: 2.5rem;--line-height-20: 1.6667;--line-height-20-on-16: 1.25;--line-height-20-on-14: 1.4286;--line-height-24: 1.5;--line-height-28-on-16: 1.75;--line-height-40-on-20: 2;--line-height-32-on-16: 2;--line-height-44-on-24: 1.8333;--line-height-56-on-40: 1.4;--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-bold: 700;--letter-spacing-0-15: .0125em;--letter-spacing-0-5: -.0179em;--letter-spacing-0-5-on-40: -.0125em;--letter-spacing-0-5-on-24: -.0208em;--letter-spacing-2: -.1em;--letter-spacing-2-on-16: -.125em;--xs: .25rem;--sm: .5rem;--md: 1rem;--lg: 1.5rem;--xl: 2.5rem;--xxl: 5rem;--3xl: 10rem;--radius-default: 1rem;--radius-pill: 62.4375rem;--stroke-weight-border: 1px;--stroke-weight-2: 2px;--ease-out-quint: cubic-bezier(.22, 1, .36, 1);--ease-overshoot: cubic-bezier(.22, 1.4, .36, 1);--duration-fast: .2s;--duration-medium: .28s;--duration-slow: .45s;--dash-length: .25rem;--dash-gap: .325rem;--dash-rule: repeating-linear-gradient(to right, var(--color-border-default) 0 var(--dash-length), transparent var(--dash-length) calc(var(--dash-length) + var(--dash-gap)));--wave-length: 1.25rem;--wave-rule: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 6' preserveAspectRatio='none'%3E%3Cpath d='M0 3 C 2 1, 6 1, 8 3 S 14 5, 16 3' fill='none' stroke='%23ef6654' stroke-width='2.8' stroke-linecap='round'/%3E%3C/svg%3E");--wave-rule-highlight: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 6' preserveAspectRatio='none'%3E%3Cpath d='M0 3 C 2 1, 6 1, 8 3 S 14 5, 16 3' fill='none' stroke='%23abdad5' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");--color-noise: var(--grey-500);--noise-opacity: .15;--noise-pattern: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");--project-cover-ratio: 16 / 9;--page-max-width: 110rem;--prose-max-width: 55rem;--navbar-logo-size: 1.75rem;--navbar-inset: var(--lg);--navbar-content-height: 1.75rem;--navbar-height: calc(var(--navbar-content-height) + (var(--md) * 2) + (var(--navbar-inset) * 2));--page-gutter: var(--xxl)}@media(max-width:1100px){:root{--page-gutter: var(--xl)}}@media(max-width:640px){:root{--page-gutter: var(--lg);--navbar-inset: var(--md)}}:root[data-theme=dark]{--color-background-primary: var(--black);--color-background-secondary: var(--grey-900);--color-background-raised: var(--grey-800);--color-background-inverse: var(--white);--color-text-main: var(--white);--color-text-secondary: var(--grey-300);--color-text-tertiary: var(--grey-500);--color-text-inverse: var(--grey-950);--color-text-error: var(--red-400);--color-border-light: var(--grey-800);--color-border-default: var(--grey-600);--color-border-bold: var(--grey-300);--shadow-raised: 0 .125rem .25rem rgb(0 0 0 / .32), 0 .75rem 1.5rem rgb(0 0 0 / .44);--shadow-sm-ring: 0 0 .125rem 0 rgb(0 0 0 / .5);--shadow-sm-drop: 0 .125rem .25rem -.125rem rgb(0 0 0 / .6);--tooltip-fill: rgb(10 10 10 / .88);--tooltip-blur: 1rem;--tooltip-edge: rgb(255 255 255 / .14)}@font-face{font-family:Geist;font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;src:url(/fonts/geist-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}body{margin:0;background:var(--color-background-primary);color:var(--color-text-main);font-family:var(--font-family-primary);font-size:var(--font-size-16);line-height:var(--line-height-28-on-16);letter-spacing:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:after{content:"";position:fixed;inset:0;z-index:100;pointer-events:none;background-color:var(--color-noise);-webkit-mask-image:var(--noise-pattern);mask-image:var(--noise-pattern);opacity:var(--noise-opacity)}@media print{body:after{content:none}}img,svg{display:block;max-width:100%}a{color:inherit}:focus-visible{outline:var(--stroke-weight-2) solid currentColor;outline-offset:3px;border-radius:2px}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.mono-label{font-family:var(--font-family-secondary);font-size:var(--font-size-12);line-height:var(--line-height-20);letter-spacing:var(--letter-spacing-0-15);text-transform:uppercase}.type-h1{font-size:var(--font-size-40);line-height:var(--line-height-56-on-40);letter-spacing:var(--letter-spacing-0-5-on-40)}@media(max-width:640px){.type-h1{font-size:var(--font-size-24);line-height:var(--line-height-44-on-24);letter-spacing:var(--letter-spacing-0-5-on-24)}}.type-h2{font-size:var(--font-size-24);line-height:var(--line-height-44-on-24);letter-spacing:var(--letter-spacing-0-5-on-24)}.type-h3{font-size:var(--font-size-20);line-height:var(--line-height-40-on-20);letter-spacing:var(--letter-spacing-2)}@media(max-width:640px){.type-h3{font-size:var(--font-size-16);line-height:var(--line-height-32-on-16);letter-spacing:var(--letter-spacing-2-on-16)}}.type-meta{font-size:var(--font-size-16);line-height:var(--line-height-20-on-16);letter-spacing:normal}@media(max-width:640px){.type-meta{font-size:var(--font-size-14);line-height:var(--line-height-20-on-14)}}.type-body{font-size:var(--font-size-16);line-height:var(--line-height-28-on-16);letter-spacing:normal}.type-footnote{font-size:var(--font-size-12);line-height:var(--line-height-20);letter-spacing:normal}.page-section-header{display:flex;gap:var(--sm);align-items:center;width:100%;padding-top:var(--lg);background-image:var(--dash-rule);background-repeat:no-repeat;background-position:top left;background-size:100% var(--stroke-weight-border);margin:0;color:var(--color-text-tertiary)}.placeholder{display:grid;place-items:center;width:100%;height:100%;background:var(--color-background-secondary)}.placeholder__note{color:var(--color-text-tertiary)}.pulse-dot{--pulse-size: var(--sm);--pulse-spread: .575rem;--pulse-color: var(--color-pulse-dot);--pulse-ring: 50%;--pulse-duration: 1.75s;flex:none;display:inline-block;width:var(--pulse-size);height:var(--pulse-size);border-radius:var(--radius-pill);background:var(--pulse-color);animation:pulse-dot var(--pulse-duration) ease-out infinite}@keyframes pulse-dot{0%{opacity:.9;box-shadow:0 0 color-mix(in srgb,var(--pulse-color) var(--pulse-ring),transparent)}70%{opacity:.55;box-shadow:0 0 0 var(--pulse-spread) color-mix(in srgb,var(--pulse-color) 0%,transparent)}to{opacity:.9;box-shadow:0 0 color-mix(in srgb,var(--pulse-color) 0%,transparent)}}@media(prefers-reduced-motion:reduce){.pulse-dot{animation:none;opacity:.9}}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}::view-transition-old(root){animation:page-dissolve-out .4s ease-in-out both}::view-transition-new(root){animation:page-dissolve-in .4s ease-in-out both}@keyframes page-dissolve-out{0%{opacity:1}35%{opacity:1}to{opacity:0}}@keyframes page-dissolve-in{0%{opacity:0}to{opacity:1}}::view-transition-image-pair(root){isolation:auto}::view-transition-old(root),::view-transition-new(root){mix-blend-mode:normal}:root[data-theme-switching]::view-transition-old(root){animation:none}:root[data-theme-switching]::view-transition-new(root){animation:theme-reveal .5s var(--ease-out-quint) both}@keyframes theme-reveal{0%{clip-path:circle(0 at var(--theme-x) var(--theme-y))}to{clip-path:circle(var(--theme-r) at var(--theme-x) var(--theme-y))}}@media(prefers-reduced-motion:reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}
