﻿:root{--hue: 250;--bg: oklch(0.30 0 0);--surface: oklch(0.34 0 0);--surface-sunken: oklch(0.26 0 0);--text: oklch(0.86 0 0);--muted: oklch(0.70 0 0);--border: oklch(0.44 0 0);--accent: oklch(0.76 0.100 var(--hue));--page: var(--bg);--series-1: var(--accent);--series-2: oklch(0.74 0.10 calc(var(--hue) + 120));--series-3: oklch(0.74 0.10 calc(var(--hue) + 240))}[data-theme=light]{--bg: oklch(0.985 0 0);--surface: oklch(0.995 0 0);--surface-sunken: oklch(0.95 0 0);--text: oklch(0.28 0 0);--muted: oklch(0.50 0 0);--border: oklch(0.85 0 0);--accent: oklch(0.50 0.100 var(--hue));--page: linear-gradient( to bottom, oklch(0.998 0 0), oklch(0.975 0 0) );--series-2: oklch(0.50 0.10 calc(var(--hue) + 120));--series-3: oklch(0.50 0.10 calc(var(--hue) + 240))}@supports not (color: oklch(.5 .1 250)){:root{--bg: #494f5c;--surface: #3b3e48;--surface-sunken: #31333d;--text: #c6cddb;--muted: #a1a7b4;--border: #7d828a;--accent: #91bce6;--page: #494f5c;--series-1: #91bce6;--series-2: #91bce6;--series-3: #91bce6}}@font-face{font-family:"Hanken Grotesk";font-style:normal;font-weight:400 700;font-display:swap;src:url("fonts/hanken-grotesk-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:"Hanken Grotesk";font-style:normal;font-weight:400 700;font-display:swap;src:url("fonts/hanken-grotesk-latin-ext.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:400 700;font-display:swap;src:url("fonts/jetbrains-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}@font-face{font-family:"JetBrains Mono";font-style:italic;font-weight:400 700;font-display:swap;src:url("fonts/jetbrains-mono-latin-italic.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}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%;}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible;}pre{font-family:monospace,monospace;font-size:1em;}a{background-color:rgba(0,0,0,0)}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted;}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em;}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px;}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*!
 * animate.css -https://daneden.github.io/animate.css/
 * Version - 3.7.0
 * Licensed under the MIT license - http://opensource.org/licenses/MIT
 *
 * Copyright (c) 2018 Daniel Eden
 */@-webkit-keyframes bounceInRight{0%, 60%, 75%, 90%, to{-webkit-animation-timing-function:cubic-bezier(.215, .61, .355, 1);animation-timing-function:cubic-bezier(.215, .61, .355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInRight{0%, 60%, 75%, 90%, to{-webkit-animation-timing-function:cubic-bezier(.215, .61, .355, 1);animation-timing-function:cubic-bezier(.215, .61, .355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}to{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}to{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}@keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.delay-1s{-webkit-animation-delay:1s;animation-delay:1s}.animated.delay-2s{-webkit-animation-delay:2s;animation-delay:2s}.animated.delay-3s{-webkit-animation-delay:3s;animation-delay:3s}.animated.delay-4s{-webkit-animation-delay:4s;animation-delay:4s}.animated.delay-5s{-webkit-animation-delay:5s;animation-delay:5s}.animated.fast{-webkit-animation-duration:.8s;animation-duration:.8s}.animated.faster{-webkit-animation-duration:.5s;animation-duration:.5s}.animated.slow{-webkit-animation-duration:2s;animation-duration:2s}.animated.slower{-webkit-animation-duration:3s;animation-duration:3s}@media (prefers-reduced-motion){.animated{-webkit-animation:unset !important;animation:unset !important;-webkit-transition:none !important;transition:none !important}}.gg-check{box-sizing:border-box;position:relative;display:block;transform:scale(var(--ggs, 1));width:22px;height:22px;border:2px solid rgba(0,0,0,0);border-radius:100px}.gg-check::after{content:"";display:block;box-sizing:border-box;position:absolute;left:3px;top:-1px;width:6px;height:10px;border-width:0 2px 2px 0;border-style:solid;transform-origin:bottom left;transform:rotate(45deg)}.gg-clipboard{box-sizing:border-box;position:relative;display:block;transform:scale(var(--ggs, 1));width:18px;height:18px;border:2px solid;border-radius:2px}.gg-clipboard::after,.gg-clipboard::before{content:"";display:block;box-sizing:border-box;position:absolute;border-radius:2px;width:10px;left:2px}.gg-clipboard::before{border:2px solid;border-bottom-left-radius:3px;border-bottom-right-radius:3px;top:-2px;height:6px}.gg-clipboard::after{height:2px;background:currentColor;box-shadow:0 -4px 0 0;bottom:2px}form{margin-left:auto;margin-right:auto;width:26rem}form input{width:26rem;min-height:1.6rem;padding:.4rem;display:block;background-color:var(--surface);border:0px;border-radius:4px}form label{width:26rem;display:block;margin-top:1rem}form textarea{min-height:6rem;width:26rem;padding:.4rem;display:block;background-color:var(--surface);border:0px;border-radius:4px}form button{background-color:var(--surface);border:1px solid var(--text);border-radius:4px;margin-top:1rem;padding:.4rem;min-width:5rem}::-webkit-scrollbar{width:8px;height:8px;background:var(--surface-sunken)}::-webkit-scrollbar-thumb{background:#888}::-webkit-scrollbar-thumb:hover{background:var(--text)}html{background:var(--page);min-height:100%;line-height:1.6;letter-spacing:.06em}body,button,input,select,textarea{color:var(--text);font-family:"Hanken Grotesk",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}pre,code,pre tt{font-family:"JetBrains Mono",Consolas,"Andale Mono WT","Andale Mono",Menlo,Monaco,"Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L","Courier New",Courier,"YaHei Consolas Hybrid",monospace,"Segoe UI Emoji","PingFang SC","Microsoft YaHei";font-variant-ligatures:none;font-feature-settings:"liga" 0,"calt" 0}pre{max-height:40em;padding:.7em 1.1em;overflow:auto;font-size:.9em;line-height:1.5;letter-spacing:normal;white-space:pre;color:var(--text);background:var(--surface-sunken);border-radius:12px}pre code{padding:0;margin:0;background:rgba(0,0,0,0);font-size:inherit;color:inherit}code{color:var(--accent);font-size:.85em;overflow-wrap:anywhere;letter-spacing:normal}blockquote{border-left:.25em solid;margin:1em;padding:0 1em;font-style:italic}blockquote cite{font-weight:bold;font-style:normal}blockquote cite::before{content:"—— "}a{color:var(--text);text-decoration:none;border:none;transition-property:color;transition-duration:.4s;transition-timing-function:ease-out}a:hover{color:var(--accent)}a:focus{outline:none}article a{border-bottom:2px solid var(--accent)}hr{opacity:.2;border-width:0 0 5px 0;border-style:dashed;background:rgba(0,0,0,0);width:50%;margin:1.8em auto}table{border-collapse:collapse;border-spacing:0;empty-cells:show;width:100%;max-width:100%}table th,table td{padding:1.5%;border:1px solid}table th{font-weight:700;vertical-align:bottom}.section-inner{margin:0 auto;max-width:1200px;width:93%}.thin{max-width:42rem;margin:auto}.feather{display:inline-block;vertical-align:-.125em;width:1em;height:1em}.screen-reader-text{border:0;clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute !important;width:1px;word-wrap:normal !important}.screen-reader-text:focus{background-color:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto !important;clip-path:none;color:#21759b;display:block;font-size:14px;font-size:.875rem;font-weight:bold;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}.tabstrip{view-transition-name:tabstrip;padding-top:1.5rem}.chrome-row{display:grid;grid-template-columns:minmax(0, 1fr) minmax(0, 42rem) minmax(0, 1fr);align-items:baseline;padding-inline:min(3.5vw,1rem);column-gap:0;row-gap:.75rem}.chrome-row>.wordmark{grid-column:2;grid-row:1;justify-self:start;font-size:1.25rem;color:var(--text);white-space:nowrap;transition:color 120ms cubic-bezier(.2, 0, 0, 1)}.chrome-row>.wordmark:hover{color:var(--accent)}.chrome-row>.tabs{grid-column:2;grid-row:1;justify-self:end}.chrome-row>.back-link{grid-column:2;justify-self:start}@media (max-width: 520px){.tabstrip .tabs{grid-row:2;justify-self:start}}.tabs{display:flex;gap:1.5rem;align-items:baseline;font-size:1.25rem;letter-spacing:normal}.tabs a{color:var(--muted);padding-bottom:.25rem;border-bottom:2px solid rgba(0,0,0,0);transition:color 120ms cubic-bezier(.2, 0, 0, 1),border-color 120ms cubic-bezier(.2, 0, 0, 1)}.tabs a:hover{color:var(--text)}.tabs a[aria-current=page]{color:var(--accent);border-bottom-color:var(--accent)}.leaf-header{padding-top:1.5rem}.back-link{display:inline-flex;align-items:center;gap:.5rem;color:var(--muted);letter-spacing:normal;transition:color 120ms cubic-bezier(.2, 0, 0, 1)}.back-link:hover{color:var(--accent)}@view-transition{navigation:auto}::view-transition-old(root),::view-transition-new(root){animation-duration:200ms;animation-timing-function:cubic-bezier(.2, 0, 0, 1)}@media (prefers-reduced-motion: reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none !important}}.hdr-btn{border:none;background:none;padding:0;margin-left:.4em;cursor:pointer}#theme-toggle{position:fixed;top:1rem;right:1rem;z-index:2;display:inline-flex;margin:0;color:var(--muted);opacity:.7;transition:opacity 120ms cubic-bezier(.2, 0, 0, 1),color 120ms cubic-bezier(.2, 0, 0, 1)}#theme-toggle:hover{opacity:1;color:var(--accent)}#theme-toggle .feather-sun,#theme-toggle .feather-moon{display:none}[data-theme-mode=light] #theme-toggle .feather-monitor{display:none}[data-theme-mode=light] #theme-toggle .feather-sun{display:inline-block}[data-theme-mode=dark] #theme-toggle .feather-monitor{display:none}[data-theme-mode=dark] #theme-toggle .feather-moon{display:inline-block}.social-link{display:inline-flex;align-items:center;gap:.5rem;color:var(--muted);text-decoration:none}.social-link svg{width:1.1em;height:1.1em}.social-link:hover{color:var(--accent)}body{display:flex;flex-direction:column;min-height:100vh}.site-main{flex:1 0 auto;margin-top:3rem}h1.title{margin:0 0 1.5rem;font-size:1.953rem}.project-list{margin:0;padding:0;list-style:none}.project-item+.project-item{margin-top:2rem}.project-link{font-size:1.25rem;box-shadow:inset 0 -2px 0 var(--accent)}.project-link:hover{color:var(--accent)}.project-desc{margin:.5rem 0 0;color:var(--muted);font-size:1rem}.article-year+.article-year{margin-top:4rem}.year-label{margin:0 0 1.5rem;font-size:.875rem;font-weight:400;letter-spacing:.1em;color:var(--muted)}.article-list{margin:0;padding:0;list-style:none}.article-entry+.article-entry{margin-top:3rem}.article-link{display:block}.article-link:hover .article-title{color:var(--accent)}.article-title{margin:0;font-size:1.563rem;line-height:1.25;color:var(--text);transition:color 120ms cubic-bezier(.2, 0, 0, 1)}.article-dek{margin:.5rem 0 0;font-size:1rem;line-height:1.5;color:var(--muted)}.article-meta{margin:.75rem 0 0;font-size:.875rem;letter-spacing:normal;color:var(--muted)}.article-meta .meta-sep{margin:0 .5rem;opacity:.5}.article-meta .reading-time{white-space:nowrap}.about-intro>p:first-of-type{font-size:1.25rem;line-height:1.55;color:var(--text)}.posts-group{display:flex;margin-bottom:1.9em;line-height:normal}.posts-group .post-year{padding-top:6px;margin-right:1.8em;font-size:1.6em;opacity:.6}.posts-group .posts-list{flex-grow:1;margin:0;padding:0;list-style:none}.posts-group .post-item{border-bottom:1px var(--border) dashed}.posts-group .post-item a{display:flex;justify-content:space-between;align-items:baseline;padding:12px 0}.posts-group .post-day{flex-shrink:0;margin-left:1em;opacity:.6}.post-header{margin-top:1.2em;line-height:normal}.post-header .post-meta{font-size:.9em;letter-spacing:normal;opacity:.6}.post-header h1{margin-top:.1em}hr.post-end{width:50%;margin-top:1.6em;margin-bottom:.8em;margin-left:0;border-style:solid;border-bottom-width:4px}.content{font-size:1.125rem;line-height:1.7;letter-spacing:normal;text-align:left;--flow-space: 1.5rem}.content>*{margin-block:0}.content>*+*{margin-top:var(--flow-space)}.content>h2{--flow-space: 3rem}.content>h3,.content>h4,.content>h5,.content>h6{--flow-space: 2rem}.content a{color:inherit;font-weight:700;text-decoration:underline;border-bottom:none;box-shadow:none;transition:color .2s ease-out}.content a:hover{color:var(--accent)}.content h2,.content h3,.content h4,.content h5,.content h6{color:var(--accent)}.content figure{max-width:100%;height:auto;margin-inline:0;text-align:center}.content figure p{font-size:.8em;font-style:italic;opacity:.6}.content img{display:block;max-width:100%;height:auto;margin:auto;border-radius:4px}.content ul,.content ol{padding:0;margin-left:1.8em}.footnote-definition{font-size:.85em}.footnote-definition a{box-shadow:none;text-decoration:underline;transition-property:color}.footnote-definition a:hover{background:rgba(0,0,0,0)}.footnote-definition a.footnote-return{text-decoration:none}.footnote-definition ol{line-height:1.8}.footnote-definition p{display:inline}.footnote-ref a{box-shadow:none;text-decoration:none;padding:2px;border-radius:2px;background-color:var(--surface-sunken)}.post-info{font-size:.8rem;line-height:normal;opacity:.6}.post-info p{margin:.8em 0}.post-info a:hover{border-bottom:1px solid var(--accent)}.post-info svg{margin-right:.8em}.post-nav{display:flex;justify-content:space-between;margin-top:1.5em;margin-bottom:2.5em;font-size:1.2em}.post-nav a{flex-basis:50%;flex-grow:1}.post-nav .next-post{text-align:left;padding-right:5px}.post-nav .prev-post{text-align:right;padding-left:5px}.post-nav .post-nav-label{font-size:.8em;opacity:.8;text-transform:uppercase}@media (min-width: 800px){hr.post-end{width:40%}}@media (min-width: 1300px){.reading-layout{display:grid;grid-template-columns:minmax(0, 1fr) minmax(0, 42rem) minmax(0, 1fr);column-gap:2rem;align-items:start;max-width:none;width:auto;padding-inline:2rem;--bleed-max: 7rem;--bleed: clamp(0rem, 50vw - 21rem - 2rem, var(--bleed-max))}.reading-layout .content{display:flex;flex-direction:column}.reading-layout .content :is(pre,figure,.bleed):not(.no-bleed){box-sizing:border-box;align-self:center;width:max-content;min-width:100%;max-width:calc(100% + 2*var(--bleed))}.reading-layout .content figure>svg{width:100%;height:auto}.reading-layout .content figure>:is(p,figcaption){max-width:42rem;margin-inline:auto}.reading-layout>article.thin{grid-column:2;grid-row:1;margin:0}.reading-layout>.post-nav{grid-column:2;grid-row:2}hr.post-end{width:30%}}@media (min-width: 1800px){hr.post-end{width:30%}}@media (max-width: 760px){.posts-group{display:block}.posts-group .post-year{margin:-6px 0 4px}}@media (max-width: 520px){hr.post-end{width:60%}}