@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2)format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-vietnamese-wght-normal.DadHysG0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-latin-wght-normal.XN7g48iV.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#0b0d14;--deep:#07080d;--card:#11141c;--raise:#1a1e28;--line:#eef0f514;--line-strong:#eef0f529;--t1:#eef0f5;--t2:#a3a9b8;--t3:#7a8296;--acc:#8fd694;--onacc:#0b0d14;--sans:"Geist Variable", Geist, Inter, "Hiragino Kaku Gothic ProN", "Noto Sans JP", sans-serif;--mono:"Geist Mono Variable", "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--ease:cubic-bezier(.22, 1, .36, 1);--w:1280px;--pad:32px}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}body{background:var(--bg);color:var(--t1);font-family:var(--sans);-webkit-font-smoothing:antialiased;margin:0;font-size:15px;line-height:22px}a{color:inherit;text-decoration:none}img,svg,canvas{max-width:100%}:focus-visible{outline:2px solid var(--acc);outline-offset:3px;border-radius:4px}.skip{background:var(--t1);color:var(--onacc);z-index:50;border-radius:8px;padding:8px 12px;position:absolute;top:0;left:-9999px}.skip:focus{top:16px;left:16px}.wrap{max-width:var(--w);padding:0 var(--pad);margin:0 auto}.disp{font-family:var(--sans);letter-spacing:-.03em}.mono,.meta{font-family:var(--mono);font-variant-numeric:tabular-nums}.muted{color:var(--t2)}.dim{color:var(--t3)}.site-header{border-bottom:1px solid var(--line);position:relative}.site-header .wrap{align-items:center;gap:32px;height:64px;display:flex}.brand{letter-spacing:-.02em;font-size:18px;font-weight:600}.site-nav{color:var(--t2);gap:24px;font-size:14px;display:flex}.site-nav a:hover{color:var(--t1)}.h-spacer{flex:1}.lang{border:1px solid var(--line);font-size:12px;font-family:var(--mono);border-radius:8px;padding:2px;display:flex}.lang a,.lang span{color:var(--t3);border-radius:6px;padding:2px 8px}.lang .on{background:var(--raise);color:var(--t1)}.lang span[aria-disabled=true]{cursor:not-allowed;opacity:.5}.rss-link{color:var(--t3);font-size:13px;font-family:var(--mono)}.rss-link:hover{color:var(--t1)}.btn{height:48px;transition:background-color .15s var(--ease), transform .15s var(--ease);border:1px solid #0000;border-radius:10px;justify-content:center;align-items:center;padding:0 20px;font-size:15px;font-weight:500;display:inline-flex}.btn:active{transform:scale(.98)}.btn-primary{background:var(--t1);color:var(--onacc);box-shadow:inset 0 1px #ffffff1f}.btn-primary:hover{background:#fff}.btn-secondary{background:var(--raise);border-color:var(--line);color:var(--t1)}.btn-secondary:hover{background:#222735}.hero{grid-template-columns:5fr 6fr;align-items:center;gap:64px;min-height:620px;padding:48px 0;display:grid}.hero h1{margin:0 0 24px;font-size:clamp(40px,5vw,64px);font-weight:500;line-height:1.04}.hero .sub{color:var(--t2);max-width:36rem;margin:0 0 32px;font-size:19px;line-height:29px}.hero-actions{flex-wrap:wrap;gap:12px;display:flex}.keycap-panel{background:var(--deep);border:1px solid var(--line);border-radius:16px;height:520px;position:relative;overflow:hidden}.keycap-panel canvas{width:100%;height:100%;display:block}.keycap-caption{font-family:var(--mono);color:var(--t3);background:#07080db8;border-radius:6px;padding:4px 8px;font-size:12px;position:absolute;bottom:20px;left:24px}.section{border-top:1px solid var(--line);padding:64px 0}.section h2{letter-spacing:-.02em;margin:0 0 32px;font-size:28px;font-weight:500;line-height:1.15}.feature-grid{grid-template-columns:7fr 5fr;gap:24px;display:grid}.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:24px}.lead-card{flex-direction:column;display:flex}.lead-card h3{letter-spacing:-.02em;margin:8px 0;font-size:24px;font-weight:500;line-height:30px}.category-label{color:var(--t3);font-size:13px}.list{flex-direction:column;display:flex}.list-row{border-bottom:1px solid var(--line);grid-template-columns:1fr auto;gap:16px;padding:20px 0;display:grid}.list-row:first-child{padding-top:0}.list-row:last-child{border-bottom:0;padding-bottom:0}.list-row h4{letter-spacing:-.01em;margin:4px 0 0;font-size:17px;font-weight:500}.list-row .meta{color:var(--t3);align-self:end;font-size:12px}.card-index{gap:16px;display:grid}.card-index .card:hover{border-color:var(--line-strong)}.card-index h3{letter-spacing:-.02em;margin:8px 0 6px;font-size:20px;font-weight:500;line-height:26px}.card-index p{color:var(--t2);margin:0}.card-meta{color:var(--t3);font-size:12px;font-family:var(--mono);gap:12px;display:flex}.categories{grid-template-columns:repeat(var(--cat-cols,4), 1fr);border:1px solid var(--line);border-radius:16px;display:grid;overflow:hidden}.categories div{border-right:1px solid var(--line);padding:20px 24px}.categories div:last-child{border-right:0}.categories b{font-size:15px;font-weight:500;display:block}.categories span{color:var(--t3);font-size:12px;font-family:var(--mono)}.article-grid{grid-template-columns:200px minmax(0,720px) 1fr;gap:48px;padding:48px 0 72px;display:grid}.toc{color:var(--t3);align-self:start;font-size:13px;position:sticky;top:24px}.toc a{border-left:1px solid var(--line);padding:4px 0 4px 12px;display:block}.toc a:hover,.toc a.on{color:var(--t1)}.crumbs{color:var(--t3);font-size:13px;font-family:var(--mono)}.article-head h1{letter-spacing:-.03em;margin:12px 0 16px;font-size:clamp(32px,4vw,44px);font-weight:500;line-height:1.1}.disclosure{color:var(--t2);background:var(--raise);border:1px solid var(--line);border-radius:10px;gap:10px;margin:0 0 24px;padding:12px 16px;font-size:14px;line-height:20px;display:flex}.disclosure svg{stroke:currentColor;fill:none;stroke-width:1.5px;flex:none;width:16px;height:16px;margin-top:3px}.disclosure b{color:var(--t1);font-weight:500}.disclosure a{color:var(--t1);text-underline-offset:3px;text-decoration:underline}.byline{color:var(--t3);font-size:13px;font-family:var(--mono);margin-bottom:24px}.tldr{border-left:2px solid var(--acc);margin:0 0 32px;padding:4px 0 4px 20px}.tldr b{font-weight:500}.tldr ul{color:var(--t2);margin:8px 0 0;padding-left:20px}.prose{color:var(--t2)}.prose>p,.prose li{font-size:17px;line-height:28px}.prose h2{color:var(--t1);letter-spacing:-.02em;margin:40px 0 16px;scroll-margin-top:24px;font-size:24px;font-weight:500;line-height:30px}.prose h3{color:var(--t1);margin:32px 0 12px;font-size:18px;font-weight:500}.prose a{color:var(--t1);text-underline-offset:3px;text-decoration:underline;text-decoration-color:var(--line-strong)}.prose a:hover{text-decoration-color:var(--acc)}.prose ul,.prose ol{padding-left:22px}.prose li{padding:3px 0}.prose code{font-family:var(--mono);background:var(--raise);border:1px solid var(--line);border-radius:6px;padding:1px 5px;font-size:14px}.prose pre{background:var(--deep);border:1px solid var(--line);border-radius:12px;padding:16px;overflow-x:auto}.prose pre code{background:0 0;border:0;padding:0}.prose blockquote{border-left:2px solid var(--line-strong);color:var(--t2);margin:24px 0;padding:4px 0 4px 20px}.prose table{border-collapse:collapse;width:100%;margin:24px 0;font-size:14px}.prose th{color:var(--t3);text-align:left;font-size:13px;font-weight:500;font-family:var(--mono)}.prose th,.prose td{border-bottom:1px solid var(--line);text-align:left;padding:12px 16px}.prose img{border:1px solid var(--line);border-radius:12px}.pros-cons{grid-template-columns:1fr 1fr;gap:16px;margin:16px 0 8px;display:grid}.pros-cons ul{margin:12px 0 0;padding:0;list-style:none}.pros-cons li{gap:10px;padding:6px 0;font-size:15px;line-height:22px;display:flex}.pros-cons svg{width:16px;height:16px;stroke:var(--acc);fill:none;stroke-width:1.5px;flex:none;margin-top:3px}.cta-card{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:24px;margin:32px 0;display:flex}.cta-card h3{letter-spacing:-.01em;margin:0 0 4px;font-size:18px;font-weight:500}.cta-card .note{color:var(--t3);font-size:12px;font-family:var(--mono);margin-top:8px}.author-card{align-items:center;gap:16px;margin-top:32px;display:flex}.author-avatar{background:var(--raise);border:1px solid var(--line);width:48px;height:48px;color:var(--t2);font-weight:500;font-family:var(--mono);border-radius:12px;place-items:center;display:grid}.progress{transform-origin:0;background:var(--acc);z-index:40;width:100%;height:2px;position:fixed;top:0;left:0;transform:scaleX(0)}.page{max-width:720px;padding:64px 0 96px}.page h1{letter-spacing:-.03em;margin:0 0 16px;font-size:clamp(32px,4vw,44px);font-weight:500;line-height:1.1}.page .page-lead{color:var(--t2);margin:0 0 32px;font-size:19px;line-height:29px}.page .prose>:first-child{margin-top:0}.site-footer{border-top:1px solid var(--line);color:var(--t2);padding:48px 0;font-size:13px;line-height:20px}.site-footer .wrap{grid-template-columns:1fr 1fr 1fr;gap:32px;display:grid}.site-footer b{color:var(--t1);font-size:16px;font-weight:500}.site-footer a{text-underline-offset:3px;text-decoration:underline;text-decoration-color:var(--line-strong)}.site-footer a:hover{text-decoration-color:var(--acc)}.site-footer p{margin:8px 0 0}.footer-langs{font-family:var(--mono);color:var(--t3);margin-top:8px}.not-found{align-content:center;gap:16px;min-height:60vh;padding:96px 0;display:grid}.not-found h1{letter-spacing:-.03em;margin:0;font-size:clamp(32px,4vw,44px);font-weight:500}.not-found p{color:var(--t2);margin:0}@media (width<=900px){.article-grid{grid-template-columns:minmax(0,720px);gap:32px;padding:32px 0 72px}.toc{flex-wrap:wrap;order:-1;gap:4px 16px;display:flex;position:static}.toc a{border-left:0;padding-left:0}}@media (width<=600px){:root{--pad:20px}.site-nav,.rss-link{display:none}.hero{grid-template-columns:1fr;gap:40px;min-height:0;padding:48px 0}.hero h1{font-size:40px}.hero .sub{font-size:17px;line-height:26px}.keycap-panel{height:340px}.feature-grid{grid-template-columns:1fr}.categories{grid-template-columns:1fr 1fr}.categories div:nth-child(2n){border-right:0}.categories div:nth-child(-n+2){border-bottom:1px solid var(--line)}.section{padding:48px 0}.site-footer .wrap,.pros-cons{grid-template-columns:1fr}.cta-card{align-items:flex-start}}
