:root,:root.light{--text-0:#212121;--text-1:#666;--text-2:#b3b3b3;--bg-0:#fff;--bg-1:#fafafa;--bg-2:#ededed;--border-color:var(--bg-2);--primary-color:#2979ff;--hover-color:white;--github-hover:#8250df;--rss-color:#ee802f;--rss-hover:#f5913e}@media (prefers-color-scheme:dark){:root,:root.dark{--text-0:#f0f0f0;--text-1:#ababab;--text-2:#787878;--bg-0:#121212;--bg-1:#1f1f1f;--bg-2:#383838;--border-color:var(--bg-2);--primary-color:#2979ff;--hover-color:white;--github-hover:#a371f7;--rss-hover:#ffa94d}}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400;src:url(/fonts/SpaceGrotesk/SpaceGrotesk-Regular.woff2)format("woff2");font-display:optional}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:700;src:url(/fonts/SpaceGrotesk/SpaceGrotesk-Bold.woff2)format("woff2");font-display:optional}.cards{column-count:var(--columns,2);column-gap:20px;padding:12px 0}@media (width<=640px){.cards{column-count:1}}@media (width<=720px){.cards{gap:16px}}.card{background:var(--bg-1);border:2px solid var(--border-color);break-inside:avoid;border-radius:10px;flex-direction:column;margin-bottom:20px;display:flex}.card-media{width:100%;height:var(--media-height,200px);background:var(--bg-2);flex-shrink:0;overflow:hidden}@media (width<=720px){.card-media{height:160px}}.card-image{object-fit:cover;width:100%;height:100%;display:block}.card-content{flex-direction:column;flex:1;gap:12px;padding:20px;display:flex}@media (width<=720px){.card-content{padding:16px}}.card-title{margin:0;line-height:1.3}@media (width<=720px){.card-title{font-size:1.1rem}}.card-tagline{color:var(--text-1);margin:0;font-size:.95rem;line-height:1.5}.card-footer{justify-content:space-between;align-items:center;gap:12px;margin-top:auto;display:flex}.card-links{flex-shrink:0;gap:10px;display:flex}.card-tags{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px;display:flex}.card-tag{color:var(--text-1);white-space:nowrap;font-size:.7rem}.icon-button{background:var(--bg-2);color:var(--text-color);border-radius:6px;align-items:center;gap:3px;padding:4px 8px;font-size:.75rem;display:inline-flex;border:1px solid var(--border-color)!important}.icon-button svg,.icon-button img{flex-shrink:0;width:16px;height:16px}.icon-button:hover{cursor:pointer;background:var(--bg-1);color:var(--text-color);border:1px solid var(--border-color)}:root{--code-font:var(--code-font), monospace;--bg-primary:var(--bg-1);--text-color:var(--text-0);--label-color:#f0f0f0}.code-label{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#333;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-js,.label-javascript{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#f7df1e;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-yaml{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#f71e6a;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-shell{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#4eaa25;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-json{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#1e90ff;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-python{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#3572a5;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-css{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#264de4;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-scss{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#c76494;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-go{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#00add8;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-markdown{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#00f;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-rust{color:#111;letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#ff4647;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-java{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#f89820;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-csharp{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#178600;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-ruby{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#701516;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-swift{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#f05138;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-php{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#777bb4;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-typescript,.label-ts{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#3178c6;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-scala{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#c22d40;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-kotlin{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#f18e33;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-lua{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:navy;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-perl{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#0298c3;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-haskell{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#5e5086;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-r{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#198ce7;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-dart{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#00d2b8;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-elixir{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#6e4a7e;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-clojure{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#5881d8;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-bash,.label-fish{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#4eaa25;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-html{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#e34c26;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}.label-toml{color:var(--label-color);letter-spacing:.025rem;text-align:right;text-transform:uppercase;background:#9c4221;border-radius:0 0 .25rem .25rem;margin-top:.1rem;padding:.1rem .5rem;font-size:12px;position:absolute;top:0;right:0}code{background-color:var(--bg-primary);border:1px solid var(--border-color);font-family:var(--code-font);border-radius:5px;padding:.1em .2em}pre{border:1px solid var(--border-color);border-radius:5px;padding:1em;line-height:1.4;position:relative;overflow-x:auto;background-color:var(--bg-primary)!important}pre code{color:var(--text-color);font-size:100%;font-family:var(--code-font);border:none;padding:0;background-color:#0000!important}@media (prefers-color-scheme:dark){.astro-code,.astro-code span{color:var(--shiki-dark)!important;font-style:var(--shiki-dark-font-style)!important;font-weight:var(--shiki-dark-font-weight)!important;text-decoration:var(--shiki-dark-text-decoration)!important}}.clipboard-button,.clipboard-button svg{all:unset;cursor:pointer;z-index:10;fill:var(--text-color);background-color:#0000;border:none;position:absolute;bottom:5px;right:5px}.page-header{font-size:2.5em;line-height:1.2;font-family:var(--header-font);margin:4rem 0 1rem}hgroup{margin-bottom:1rem}hgroup .page-header{margin-bottom:0}.page-subtitle{color:var(--text-2);margin-top:.25rem;margin-bottom:0;font-size:1.1rem}.not-found-header{font-family:var(--header-font);text-align:center;font-size:3em;position:absolute;top:40%;left:50%;transform:translate(-50%,-50%)}nav{flex-flow:wrap;justify-content:space-between;padding:0;display:flex}@media (width<=600px){nav{flex-direction:column}}nav .left-nav{flex-direction:row;align-items:center;gap:12px;font-size:1.5rem;display:flex}nav .left-nav .socials{flex-flow:wrap;justify-content:flex-start;align-items:flex-end;gap:8px;display:flex}nav .left-nav .socials .social{color:var(--text-0);transition:color .15s}nav .left-nav .socials .social svg{width:16px;height:16px;display:block}nav .left-nav .socials .social[data-social=bluesky]{--social-hover:#0085ff}nav .left-nav .socials .social[data-social=mastodon]{--social-hover:#6364ff}nav .left-nav .socials .social[data-social=github]{--social-hover:var(--github-hover)}nav .left-nav .socials .social[data-social=rss]{color:var(--rss-color);--social-hover:var(--rss-hover)}nav .left-nav .socials .social:hover{color:var(--social-hover);background-color:#0000}nav .right-nav{flex-flow:wrap;align-items:center;display:flex}nav .right-nav a{border-bottom:2px solid var(--primary-color);margin-right:.5em}.meta{color:#999;flex-wrap:wrap;align-items:center;gap:0 .3em;display:flex}h1,h2,h3,h4,h5,h6{font-family:var(--header-font);margin-top:2em}h1{font-size:1.2rem}h2{font-size:2rem}h3{font-size:1.6rem}h4{font-size:1.3rem}h5{font-size:1.1rem}h6{font-size:1rem}h1:before{color:var(--primary-color);content:"# "}h2:before{color:var(--primary-color);content:"## "}h3:before{color:var(--primary-color);content:"### "}h4:before{color:var(--primary-color);content:"#### "}h5:before{color:var(--primary-color);content:"##### "}h6:before{color:var(--primary-color);content:"###### "}img{border-radius:.5rem;max-width:100%}figure{box-sizing:border-box;text-align:center;max-width:100%;margin:1.5rem 0;display:block}figure img{max-height:500px}figure figcaption{color:var(--text-2)}figure figcaption p{margin:0}@media screen and (width>=600px){figure{padding:0 40px}}.draft-label{color:var(--hover-color);background-color:var(--primary-color);border-radius:4px;margin-left:6px;padding:2px 4px;text-decoration:none}::-moz-selection{background:var(--primary-color);color:var(--hover-color);text-shadow:none}::selection{background:var(--primary-color);color:var(--hover-color)}hr{color:var(--border-color);background:0 0;margin:1.2rem auto}blockquote{border-left:3px solid var(--primary-color);color:#737373;margin:0;padding-left:1em}a{color:inherit;text-decoration:none}a:hover{background-color:var(--primary-color);color:var(--hover-color)}a:hover>code{background-color:var(--primary-color);color:var(--hover-color);border:none;padding:0 .2em}main a{border-bottom:2px solid var(--primary-color);z-index:1;position:relative}main .meta a,main .cards a,main .heading-anchor{border-bottom:none}time{color:var(--text-1)}.post-list>ul,.tag-list>ul{margin:0;padding:1rem 0 0}.post-list .list-item,.tag-list .list-item{margin-bottom:.5rem;list-style-type:none}.post-list .post-header,.tag-list .post-header{align-items:center;display:grid}@media (width<=640px){.post-list .post-header,.tag-list .post-header{grid-template-rows:auto 1fr;margin:1.6rem 0}}@media (width>=640px){.post-list .post-header,.tag-list .post-header{grid-template-columns:auto 1fr;gap:1rem}}.post-list .post-header h1,.tag-list .post-header h1{font-weight:400;font-family:var(--header-font);margin:0}.post-list .post-header h1 a,.tag-list .post-header h1 a{border-bottom:none}.post-list .post-header time,.tag-list .post-header time{font-family:var(--mono-text-font);text-align:left;margin:0}del{text-decoration-color:var(--primary-color);text-decoration-thickness:3px}.external-link-icon{vertical-align:middle;width:.75em;height:.75em;margin-left:.15em;display:inline-block;transform:translateY(-10%)}.permalink-symbol{color:var(--text-1);vertical-align:middle;border-bottom:none;align-items:center;margin-left:.35em;text-decoration:none;display:inline-flex;transform:translateY(-10%)}.permalink-symbol:hover{color:var(--primary-color);background-color:#0000}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.footnotes{font-size:.9rem}.footnotes p{margin:.25em 0}.pagination{gap:1rem;padding:0;list-style-type:none;display:flex}table{border-spacing:0;border-collapse:collapse}table th{border:1px solid #dfe2e5;padding:6px 13px;font-size:large}table td{border:1px solid #dfe2e5;padding:6px 13px}.tags a:before{content:"#";display:inline;white-space:nowrap!important}.tags a+a{margin-left:.3em}@media only screen and (width<=1365px){.toc{display:none}}.toc li,.toc a{font-family:var(--text-font);color:var(--text-2);border-bottom:none;transition:none}.toc a:hover{transition:none;color:var(--hover-color)!important}.toc .heading{font-weight:700}.toc ul{margin-top:0;margin-bottom:0;padding-left:1em;list-style-type:none}.toc>ul{padding-left:0}.toc li.selected,.toc li.selected>a,.toc .parent>a{color:var(--text-0)}:root{--font-size-base:16px;--mono-stack:"SF Mono Powerline", "SF Mono", "Jetbrains Mono", ui-monospace, monospace;--text-font:var(--mono-stack);--header-font:"Space Grotesk", "Helvetica", sans-serif;--mono-text-font:var(--mono-stack);--code-font:var(--mono-stack);--line-height:1.5;--page-width:920px}html{background-color:var(--bg-0);color:var(--text-0);font-family:var(--text-font);line-height:var(--line-height)}@media (width<=992px){html{font-size:calc(var(--font-size-base) * .97)}}@media (width<=768px){html{font-size:calc(var(--font-size-base) * .95)}}@media (width<=576px){html{font-size:calc(var(--font-size-base) * .92)}}body{flex-wrap:wrap;flex-grow:1;min-height:calc(100vh - 150px);margin-bottom:1.5rem;padding:.9rem .9rem 1.5rem;display:flex}@media (width>=992px){body{flex-direction:row;justify-content:center;align-items:flex-start}}body .content{width:100%;max-width:var(--page-width);word-wrap:break-word;flex-shrink:0;margin:0 auto;padding-bottom:1.5rem}body .left-content{width:100%}@media (width>=992px){body .left-content{flex:1 1 0;min-width:0}}body .right-content{width:100%}@media (width>=992px){body .right-content{flex:1 1 0;min-width:0;max-height:calc(100vh - 100px);padding:1em;position:sticky;top:60px;overflow-y:auto}}footer{max-width:var(--page-width);flex-basis:100%;margin:100px auto 0;padding:0 24px}
