:root{--spring-elegant-easing:linear(0 0%, .005927 1%, .022466 2%, .047872 3%, .080554 4%, .119068 5%, .162116 6%, .208536 7.0%, .2573 8%, .3075 9%, .358346 10%, .409157 11%, .45935 12%, .508438 13%, .556014 14.0%, .601751 15%, .645389 16%, .686733 17%, .72564 18%, .762019 19%, .795818 20%, .827026 21%, .855662 22%, .881772 23%, .905423 24%, .926704 25%, .945714 26%, .962568 27%, .977386 28%, .990295 29.0%, 1.00143 30%, 1.01091 31%, 1.01888 32%, 1.02547 33%, 1.03079 34%, 1.03498 35%, 1.03816 36%, 1.04042 37%, 1.04189 38%, 1.04266 39%, 1.04283 40%, 1.04247 41%, 1.04168 42%, 1.04052 43%, 1.03907 44%, 1.03737 45%, 1.03549 46%, 1.03348 47%, 1.03138 48%, 1.02922 49%, 1.02704 50%, 1.02486 51%, 1.02272 52%, 1.02063 53%, 1.01861 54%, 1.01667 55.0%, 1.01482 56.0%, 1.01307 57.0%, 1.01142 58.0%, 1.00989 59%, 1.00846 60%, 1.00715 61%, 1.00594 62%, 1.00485 63%, 1.00386 64%, 1.00296 65%, 1.00217 66%, 1.00147 67%, 1.00085 68%, 1.00031 69%, .999849 70%, .999457 71%, .999128 72%, .998858 73%, .99864 74%, .99847 75%, .998342 76%, .998253 77%, .998196 78%, .998169 79%, .998167 80%, .998186 81%, .998224 82%, .998276 83%, .998341 84%, .998415 85%, .998497 86%, .998584 87%, .998675 88%, .998768 89%, .998861 90%, .998954 91%, .999045 92%, .999134 93%, .99922 94%, .999303 95%, .999381 96%, .999455 97%, .999525 98%, .999589 99%, .99965 100%);--spring-elegant-easing-light:linear(0 0%, .003894 1%, .014828 2%, .031757 3%, .053732 4%, .079896 5%, .109479 6%, .141786 7.0%, .176202 8%, .212175 9%, .249219 10%, .286907 11%, .324863 12%, .362763 13%, .400326 14.0%, .437313 15%, .473521 16%, .508781 17%, .542956 18%, .575932 19%, .607625 20%, .637968 21%, .666915 22%, .694437 23%, .720519 24%, .74516 25%, .76837 26%, .790168 27%, .810581 28.0%, .829644 29.0%, .847395 30%, .86388 31%, .879146 32%, .893244 33%, .906226 34%, .918147 35%, .92906 36%, .93902 37%, .948082 38%, .956301 39%, .963727 40%, .970415 41%, .976413 42%, .98177 43%, .986534 44%, .990748 45%, .994457 46%, .997701 47%, 1.00052 48%, 1.00295 49%, 1.00502 50%, 1.00678 51%, 1.00824 52%, 1.00944 53%, 1.0104 54%, 1.01115 55.0%, 1.01172 56.0%, 1.01212 57.0%, 1.01237 58.0%, 1.01249 59%, 1.0125 60%, 1.01242 61%, 1.01225 62%, 1.01201 63%, 1.01172 64%, 1.01137 65%, 1.01099 66%, 1.01057 67%, 1.01013 68%, 1.00968 69%, 1.00921 70%, 1.00874 71%, 1.00826 72%, 1.00779 73%, 1.00732 74%, 1.00686 75%, 1.00641 76%, 1.00598 77%, 1.00555 78%, 1.00515 79%, 1.00476 80%, 1.00439 81%, 1.00403 82%, 1.00369 83%, 1.00337 84%, 1.00307 85%, 1.00279 86%, 1.00252 87%, 1.00227 88%, 1.00204 89%, 1.00183 90%, 1.00163 91%, 1.00144 92%, 1.00127 93%, 1.00111 94%, 1.00097 95%, 1.00084 96%, 1.00072 97%, 1.00061 98%, 1.00051 99%, 1.00042 100%);--spring-bouyant:linear(0 0%, .004379 1%, .017027 2%, .037197 3%, .064139 4%, .097098 5%, .135326 6%, .178089 7.0%, .224667 8%, .274366 9%, .326515 10%, .380476 11%, .435642 12%, .491445 13%, .547353 14.0%, .602874 15%, .65756 16%, .711 17%, .76283 18%, .812725 19%, .860402 20%, .90562 21%, .948177 22%, .98791 23%, 1.02469 24%, 1.05844 25%, 1.08908 26%, 1.11659 27%, 1.14099 28.0%, 1.16229 29.0%, 1.18055 30%, 1.19584 31%, 1.20827 32%, 1.21794 33%, 1.22498 34%, 1.22954 35%, 1.23176 36%, 1.23181 37%, 1.22985 38%, 1.22606 39%, 1.2206 40%, 1.21366 41%, 1.2054 42%, 1.19601 43%, 1.18564 44%, 1.17446 45%, 1.16264 46%, 1.15032 47%, 1.13765 48%, 1.12476 49%, 1.11178 50%, 1.09884 51%, 1.08603 52%, 1.07347 53%, 1.06124 54%, 1.04942 55.0%, 1.03808 56.0%, 1.02729 57.0%, 1.01708 58.0%, 1.00752 59%, .998624 60%, .990425 61%, .982939 62%, .976176 63%, .970139 64%, .964824 65%, .960222 66%, .956318 67%, .953091 68%, .950518 69%, .94857 70%, .947216 71%, .946423 72%, .946154 73%, .946371 74%, .947035 75%, .948105 76%, .949542 77%, .951304 78%, .953352 79%, .955646 80%, .958146 81%, .960816 82%, .963619 83%, .966522 84%, .96949 85%, .972494 86%, .975505 87%, .978496 88%, .981443 89%, .984323 90%, .987118 91%, .989809 92%, .992382 93%, .994822 94%, .99712 95%, .999265 96%, 1.00125 97%, 1.00308 98%, 1.00473 99%, 1.00622 100%);--theme-change-speed:.3s;--transition-fast:.15s ease;--transition-medium:.25s ease}.cta-btn{color:#fff;cursor:pointer;transition:transform var(--hover-speed,.65s) var(--spring-bouyant), filter var(--hover-speed,.65s) var(--spring-bouyant), border-color .2s ease;will-change:transform, filter;filter:drop-shadow(0 0 #0000);-webkit-tap-highlight-color:transparent;background:#1a1a1a;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:6px;padding:10px 24px;font-family:inherit;font-size:.95rem;font-weight:600;text-decoration:none;display:inline-flex}.cta-btn:hover{filter:drop-shadow(0 4px 12px #00000026);transform:scale(1.04)}.cta-btn:active{transform:scale(.97)}.cta-btn svg{flex-shrink:0}.hover-lift,.post-cover,img{--_easing:var(--spring-elegant-easing-light,cubic-bezier(.4, 0, .2, 1));transition:transform var(--hover-speed,.65s) var(--spring-bouyant), filter var(--hover-speed,.65s) var(--spring-bouyant), border-color .2s ease;will-change:transform, filter;filter:drop-shadow(0 0 #0000);-webkit-tap-highlight-color:transparent}.hover-lift:hover,.post-cover:hover,img:hover{filter:drop-shadow(0 4px 12px #0000001a);transform:scale(1.02)}.hover-lift:active,.post-cover:active,img:active{transform:scale(.98)}body.has-preset.brightness-light{--code-mix:black}body.has-preset.brightness-dark{--code-mix:white}body.has-preset{background:var(--page-bg);color:var(--page-fg)}body.has-preset article .cta-btn{background:var(--page-fg);color:var(--page-bg)}body.has-preset a,body.has-preset a:visited{color:var(--page-primary)}body.has-preset article a:not(.cta-btn):not(.nav-link),body.has-preset article a:not(.cta-btn):not(.nav-link):visited{color:var(--page-fg)}body.has-preset .post-meta,body.has-preset .meta,body.has-preset .index-date{color:var(--page-secondary)}body.has-preset .post-date,body.has-preset .post-date a{color:var(--page-tertiary)}body.has-preset header a,body.has-preset header a:visited,body.has-preset header li{color:var(--page-fg)}body.has-preset .hr-list{border-bottom-color:var(--page-tertiary)}body.has-preset footer{border-top-color:var(--page-tertiary)}body.has-preset .social-links a{color:var(--page-secondary)}body.has-preset .social-links a:hover{color:var(--page-fg)}body.has-preset :not(pre)>code{background:color-mix(in srgb, var(--page-fg) 12%, var(--page-bg))!important;color:var(--page-fg)!important;border:1px solid color-mix(in srgb, var(--page-fg) 18%, var(--page-bg))!important}body.has-preset pre:not(.code-block pre){background:var(--code-bg,color-mix(in srgb, var(--code-mix) 8%, var(--page-bg)))!important;border-color:var(--code-border,color-mix(in srgb, var(--code-mix) 15%, var(--page-bg)))!important}body.has-preset pre:not(.code-block pre) *{background-color:#0000!important}*,:after,:before{box-sizing:border-box;padding:0}body{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#000;background:#fffdfa;margin:0;padding:0 2rem;font:1rem/1.5 Bricolage Grotesque,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;overflow-x:clip}.skip-link{z-index:100;background:#eee;position:absolute;top:-40px;left:0}.skip-link:focus{top:0}header{align-items:center;gap:1.5rem;padding:1rem 0;display:flex;position:relative}header .theme-toggle{cursor:pointer;color:inherit;opacity:.5;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:opacity .2s;display:flex}header .theme-toggle:hover{opacity:1}header .theme-toggle:hover .theme-icon--light{transform:rotate(20deg)scale(1.15)}header .theme-icon-wrap{flex-shrink:0;width:18px;height:18px;display:block;position:relative}header .theme-icon{transform-origin:50%;transition:opacity .3s,transform .5s cubic-bezier(.34,1.56,.64,1);position:absolute;inset:0}header .theme-icon--light{opacity:1;transform:rotate(0)scale(1)}header .theme-icon--dark{opacity:0;pointer-events:none;transform:rotate(-30deg)scale(.5)}@media (prefers-reduced-motion:reduce){header .theme-icon{transition:opacity .15s}header .theme-icon--light,header .theme-icon--dark,header .theme-toggle:hover .theme-icon--light,header .theme-toggle:hover .theme-icon--dark{transform:none!important}}header .burger{cursor:pointer;color:inherit;background:0 0;border:none;border-radius:8px;padding:8px;transition:background .18s;display:none}header .burger:hover{background:color-mix(in srgb, currentColor 10%, transparent)}header .burger span{background:currentColor;width:18px;height:2px;margin:4px 0;transition:all .3s;display:block}@media (width<=900px){header .burger{z-index:2;display:block}header .nav-menu{opacity:0;visibility:hidden;pointer-events:none;transform-origin:100% 0;min-width:200px;transition:opacity .18s ease, visibility 0s linear .24s, transform .24s var(--spring-bouyant,ease);z-index:1000;background:#fff;border:1px solid #ececec;border-radius:12px;padding:5px;position:absolute;top:calc(100% + 8px);right:0;transform:translateY(-6px)scale(.97);box-shadow:0 10px 30px #0000001f,0 2px 6px #0000000f}header .nav-menu.active{opacity:1;visibility:visible;pointer-events:auto;transition:opacity .18s ease, transform .24s var(--spring-bouyant,ease);transform:translateY(0)scale(1)}header .nav-menu ul{flex-direction:column;align-items:stretch;gap:1px}header .nav-menu ul li{justify-content:unset;border-bottom:none;height:auto;font-size:14px;display:block}header.menu-open .burger span:first-child{transform:rotate(45deg)translate(4px,6px)}header.menu-open .burger span:nth-child(2){opacity:0}header.menu-open .burger span:last-child{transform:rotate(-45deg)translate(4px,-6px)}}body.dark-mode{transition:background var(--theme-change-speed) ease, color var(--theme-change-speed) ease}body.dark-mode .theme-icon--light{opacity:0;pointer-events:none;transform:rotate(90deg)scale(.5)}body.dark-mode .theme-icon--dark{opacity:1;pointer-events:auto;transform:rotate(0)scale(1)}body.dark-mode header .theme-toggle:hover .theme-icon--light{transform:rotate(90deg)scale(.5)}body.dark-mode header .theme-toggle:hover .theme-icon--dark{transform:rotate(-10deg)scale(1.15)}body.dark-mode:not(.has-preset) a:not(.post-card),body.dark-mode:not(.has-preset) a:not(.post-card):visited{color:#c8c4be}body.dark-mode:not(.has-preset) a:not(.post-card):hover{color:#fff}body.dark-mode:not(.has-preset) .meta,body.dark-mode:not(.has-preset) .index-date{color:#888}body.dark-mode:not(.has-preset) .hr-list{border-bottom-color:#333}body.dark-mode:not(.has-preset) footer{color:#777;border-top-color:#333}body.dark-mode:not(.has-preset) footer a{color:#888}body.dark-mode:not(.has-preset) footer a:hover{color:#ddd}body.dark-mode:not(.has-preset) :not(pre)>code{color:#e8e5e0;background:#2a2a2a;border:1px solid #3a3a3a}body.dark-mode:not(.has-preset) pre:not(.code-block pre){background:#222!important;border-color:#333!important}body.dark-mode.has-preset{transition:background var(--theme-change-speed) ease, color var(--theme-change-speed) ease}header .nav-menu{margin-left:auto}header a{text-decoration:none}header .nav-link span{position:relative}header .nav-link span:after{content:"";transform-origin:100%;width:100%;height:1.5px;transition:transform .35s var(--spring-elegant-easing);background:currentColor;position:absolute;bottom:-2px;left:0;transform:scaleX(0)}header .nav-link:hover span:after,header li.active .nav-link span:after{transform-origin:0;transform:scaleX(1)}header ul{padding:0;list-style-type:none}header li,header a{display:inline}.link{text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}.time{font-variant-numeric:tabular-nums;white-space:nowrap}blockquote{--callout-accent:#8c8477;border:1px solid color-mix(in srgb, var(--callout-accent) 22%, transparent);background:color-mix(in srgb, var(--callout-accent) 8%, transparent);border-radius:12px;margin:1.5rem 0;padding:.65rem .9rem}blockquote p{margin:0}blockquote p+p{margin-top:.75rem}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}blockquote:not([data-callout]){border-color:color-mix(in srgb, var(--page-fg,currentColor) 15%, transparent);background:color-mix(in srgb, var(--page-fg,currentColor) 4%, transparent)}blockquote[data-callout]{color:var(--callout-text)}.callout-title{letter-spacing:-.01em;align-items:center;gap:.5em;margin-bottom:.25rem;font-weight:600;display:flex}.callout-title:before{content:"";width:1.15em;height:1.15em;-webkit-mask:var(--callout-icon) center/contain no-repeat;mask:var(--callout-icon) center/contain no-repeat;background-color:currentColor;flex:none}blockquote[data-callout=standard]{--callout-accent:#8c8477;--callout-text:#6b6358;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/></svg>")}blockquote[data-callout=info]{--callout-accent:#2563eb;--callout-text:#2563eb;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M12 16v-4'/><path d='M12 8h.01'/></svg>")}blockquote[data-callout=tip]{--callout-accent:#16a34a;--callout-text:#15803d;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5'/><path d='M9 18h6'/><path d='M10 22h4'/></svg>")}blockquote[data-callout=warning]{--callout-accent:#d97706;--callout-text:#b45309;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z'/><path d='M12 9v4'/><path d='M12 17h.01'/></svg>")}blockquote[data-callout=error]{--callout-accent:#dc2626;--callout-text:#dc2626;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='m15 9-6 6'/><path d='m9 9 6 6'/></svg>")}blockquote[data-callout=hint]{--callout-accent:#7c3aed;--callout-text:#7c3aed;--callout-icon:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3a6 6 0 0 0-6 6c0 1.7.7 3.2 1.8 4.3.5.5.9 1.1 1 1.7l.2 1h6l.2-1c.1-.6.5-1.2 1-1.7A6 6 0 0 0 12 3Z'/><path d='M9 18h6'/><path d='M10 22h4'/></svg>")}body.dark-mode blockquote[data-callout=standard]{--callout-accent:#a8a094;--callout-text:#a8a094}body.dark-mode blockquote[data-callout=info]{--callout-accent:#60a5fa;--callout-text:#60a5fa}body.dark-mode blockquote[data-callout=tip]{--callout-accent:#4ade80;--callout-text:#4ade80}body.dark-mode blockquote[data-callout=warning]{--callout-accent:#fbbf24;--callout-text:#fbbf24}body.dark-mode blockquote[data-callout=error]{--callout-accent:#f87171;--callout-text:#f87171}body.dark-mode blockquote[data-callout=hint]{--callout-accent:#a78bfa;--callout-text:#a78bfa}a,a:visited{color:inherit}a:hover,a.heading-link{text-decoration:none}article a:not(.cta-btn):not(.nav-link){color:var(--page-fg,inherit);text-underline-offset:2px;font-weight:600;text-decoration:underline 1.5px;transition:opacity .2s}article a:not(.cta-btn):not(.nav-link):hover{opacity:.8}pre{overflow-wrap:normal;border:1px solid #e5e5e5;border-radius:12px;padding:1rem;overflow:scroll auto}code,pre{font-feature-settings:"liga" 1, "calt" 1;font-family:Fira Code,SF Mono,Monaco,Consolas,Lucida Console,DejaVu Sans Mono,monospace;font-size:small}pre code{background:0 0;margin:0;padding:0}:not(pre)>code{overflow-wrap:anywhere;box-decoration-break:clone;background:#eee;border:1px solid #ddd;border-radius:4px;margin:0;padding:.1rem .3rem;overflow:visible}ul{list-style-type:square}ul,ol{padding-left:1.2rem}.list{padding-left:0;line-height:2;list-style-type:none}.list li{padding-bottom:.1rem}.meta{color:#777}main#main{flex-direction:column;min-height:100vh;display:flex}.content{flex-direction:column;flex:1 0 auto;width:100%;max-width:70ch;margin:0 auto;display:flex}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{margin-top:2em}h2.post{padding-top:.25rem;font-size:2.5rem;font-weight:800;line-height:120%}header ul a:first-child{padding-left:1rem}.nav{content:"";background:#000;max-width:10%;height:1px}.list li{align-items:baseline;display:flex}.list li time{flex:0 auto}.hr-list{border:0;border-bottom:1px dotted #ccc;flex:1 0 1rem;height:1px;margin:0 .5rem}.m,hr{border:0;margin:3rem 0}img{border-radius:16px;max-width:100%;height:auto}.post-video{border-radius:16px;max-width:100%;height:auto;display:block}.post-meta{opacity:.6;margin-bottom:1rem}.post-categories .post-category{font-weight:600;display:inline}.post-cover{border-radius:16px;width:100%;height:auto;margin-bottom:1.5rem}.post-cover.cover-top{margin-top:1.5rem}.project-figure{margin:2rem 0}.project-figure img{border-radius:16px;width:100%;height:auto;display:block}.project-figure figcaption{color:#888;text-align:center;margin-top:.75rem;font-size:.85rem;line-height:1.4}h2.post.no-top-spacing{margin-top:0;margin-bottom:.5rem;padding-top:0}.post-date{margin:5% 0}.index-date{color:#9a9a9a}.animate-blink{opacity:1;animation:1s infinite opacity}@keyframes opacity{0%{opacity:1}50%{opacity:.5}to{opacity:0}}.tags{justify-content:space-between;display:flex}.tags ul{margin:0;padding:0}.tags li{display:inline}.avatar{float:right;border-radius:50%;width:120px;height:120px;margin:-10px 0 0 15px;position:relative}table{border-collapse:collapse;width:100%}th,td{border:1px solid color-mix(in srgb, var(--page-fg,currentColor) 15%, var(--page-bg,#fffdfa));text-align:left;padding:8px}th{background-color:color-mix(in srgb, var(--page-fg,currentColor) 8%, var(--page-bg,#fffdfa))}footer{border-top:1px dotted #ccc;margin-top:auto;padding-top:1rem}.social-links{flex-wrap:wrap;gap:.5rem 1rem;margin-bottom:.5rem;padding:0;display:flex}.social-links a{color:#555;font-size:.9rem;text-decoration:none}.social-links a:hover{color:#000}.full-width{max-width:100%;height:auto}
