@font-face{font-family:Archivo;font-style:normal;font-weight:800;font-stretch:100%;font-display:swap;src:url(../media/a2947afc6a06879b-s.1gyfqm5yhhzs7.woff2)format("woff2");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:Archivo;font-style:normal;font-weight:800;font-stretch:100%;font-display:swap;src:url(../media/651aaf1801011892-s.357dd_6abeqge.woff2)format("woff2");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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Archivo;font-style:normal;font-weight:800;font-stretch:100%;font-display:swap;src:url(../media/75affa71d1e2f6a7-s.p.17-aodiw50953.woff2)format("woff2");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:Archivo;font-style:normal;font-weight:900;font-stretch:100%;font-display:swap;src:url(../media/a2947afc6a06879b-s.1gyfqm5yhhzs7.woff2)format("woff2");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:Archivo;font-style:normal;font-weight:900;font-stretch:100%;font-display:swap;src:url(../media/651aaf1801011892-s.357dd_6abeqge.woff2)format("woff2");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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Archivo;font-style:normal;font-weight:900;font-stretch:100%;font-display:swap;src:url(../media/75affa71d1e2f6a7-s.p.17-aodiw50953.woff2)format("woff2");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:Archivo Fallback;src:local(Arial);ascent-override:88.96%;descent-override:21.28%;line-gap-override:0.0%;size-adjust:98.7%}.archivo_d1f33b1b-module__ah4wWG__className{font-family:Archivo,Archivo Fallback;font-style:normal}.archivo_d1f33b1b-module__ah4wWG__variable{--font-archivo:"Archivo", "Archivo Fallback"}
:root{--night:#0c1020;--night-2:#151b33;--night-line:#ffffff1a;--night-text:#c3c9db;--bg:#fbfbf9;--card:#fff;--fg:#15171c;--muted:#646973;--line:#e7e7e3;--accent:#2f54eb;--accent-soft:#eef2ff;--warm:#e8742f;--sans:system-ui, -apple-system, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;--display:var(--font-archivo), var(--sans);--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--shell:1180px;--radius:12px}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--fg);font:16px/1.7 var(--sans);-webkit-font-smoothing:antialiased;margin:0}img,svg{max-width:100%;height:auto}a{color:inherit;text-decoration:none}:focus-visible{outline-offset:2px;border-radius:4px;outline:3px solid #6d8bff}.skip-link{color:var(--fg);z-index:30;background:#fff;padding:8px 14px;position:absolute;top:0;left:-999px}.skip-link:focus{top:8px;left:8px}.shell{width:min(100% - 32px, var(--shell));margin-inline:auto}h1,h2,h3{text-wrap:balance}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.site-header{background:var(--night);color:#fff}.header-inner{justify-content:space-between;align-items:center;gap:16px;min-height:60px;display:flex}.brand{font:800 17px/1 var(--display);letter-spacing:-.02em;color:#fff;align-items:center;min-height:44px;display:inline-flex}.brand span{color:#8fa6ff}.site-header nav{gap:4px;display:flex}.site-header nav a{color:var(--night-text);border-radius:8px;padding:10px 12px;font-size:15px;transition:color .2s,background .2s}.site-header nav a:hover,.site-header nav a[aria-current=page]{color:#fff;background:#ffffff12}.hero-band{background:radial-gradient(120% 140% at 70% 0%, var(--night-2), var(--night) 70%);color:#fff;position:relative;overflow:hidden}.hero-band:before{content:"";pointer-events:none;background:radial-gradient(circle,#6f8bff38,#0000 65%);border-radius:50%;width:520px;height:520px;animation:16s ease-in-out infinite alternate drift;position:absolute;top:-260px;right:-120px}@keyframes drift{0%{transform:translate(0)}to{transform:translate(-160px,60px)}}.hero{height:330px;position:relative}.hero canvas{touch-action:pan-y;width:100%;height:100%;display:block;position:absolute;inset:0}.hero h1{font:900 clamp(88px, 21vw, 248px)/1 var(--display);letter-spacing:-.04em;color:#0000;-webkit-user-select:none;user-select:none;margin:0;position:absolute;top:18px;left:0}.hero h1.fallback{color:#f1f3fa}.hero-cap{pointer-events:none;justify-content:space-between;align-items:flex-end;gap:20px;display:flex;position:absolute;bottom:22px;left:0;right:0}.hero-cap>*{pointer-events:auto}.hero-cap p{color:var(--night-text);max-width:32em;margin:0}.hero-cap p strong{color:#fff;font-weight:600}.socials{flex-wrap:wrap;gap:8px;display:flex}.socials a{border-radius:12px;place-items:center;width:44px;height:44px;transition:transform .2s ease-out,background .2s,color .2s;display:grid}.socials.on-dark a{color:#d3d8e8;border:1px solid var(--night-line);background:#ffffff0f}.socials.on-dark a:hover{color:#fff;background:#ffffff24;transform:translateY(-2px)}.socials.on-light a{color:#3b3f48;border:1px solid var(--line);background:var(--card)}.socials.on-light a:hover{color:var(--accent);border-color:var(--accent);transform:translateY(-2px)}.reading{grid-template-columns:minmax(0,1fr) 300px;gap:56px;padding:26px 0 64px;display:grid}.chips{flex-wrap:wrap;gap:4px;margin-bottom:4px;display:flex}.chips a{color:var(--muted);border-radius:999px;padding:8px 14px;font-size:14px;transition:background .2s,color .2s}.chips a:hover{color:var(--fg);background:#efefec}.chips a[aria-current=page]{background:var(--fg);color:#fff}.post-row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;gap:8px 24px;padding:18px 0;display:grid}.post-row h2,.post-row h3{letter-spacing:-.005em;margin:0;font-size:20px;font-weight:700;line-height:1.45;transition:color .2s}.post-row:hover h2,.post-row:hover h3{color:var(--accent)}.post-row p{color:var(--muted);margin:4px 0 0;font-size:15px}.post-row .meta{color:var(--muted);text-align:right;white-space:nowrap;font-size:13px}.post-row .meta span{display:block}.cat{color:var(--accent);background:var(--accent-soft);border-radius:6px;margin-bottom:6px;padding:1px 8px;font-size:12px;display:inline-block}.pin{color:var(--warm);vertical-align:2px;margin-right:6px;font-size:12px;font-weight:700}.more-link{border-bottom:2px solid var(--fg);align-items:center;gap:6px;min-height:32px;margin-top:18px;font-weight:600;display:inline-flex}.empty{color:var(--muted);padding:24px 0}.side{flex-direction:column;gap:30px;display:flex}.side h2{font:800 13px/1.2 var(--display);letter-spacing:.06em;text-transform:uppercase;margin:0 0 10px}.stars{font:900 36px/1 var(--display);letter-spacing:-.03em;font-variant-numeric:tabular-nums}.side small{color:var(--muted);margin-top:4px;font-size:13px;display:block}.cat-list a{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;min-height:44px;padding:8px 0;display:flex}.cat-list a:hover{color:var(--accent)}.cat-list span{color:var(--muted);font-variant-numeric:tabular-nums}.repo{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);margin-bottom:8px;padding:12px 14px;transition:border-color .2s,transform .2s ease-out;display:block}.repo:hover{border-color:#c8cfe8;transform:translateY(-1px)}.repo strong{font-weight:700}.repo .st{float:right;color:var(--muted);font-variant-numeric:tabular-nums;font-size:13px}.repo span{color:var(--muted);font-size:13px;display:block}.section{border-top:1px solid var(--line);padding:48px 0 64px}.section-head{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:18px;display:flex}.section-head h2{font:800 30px/1.2 var(--display);letter-spacing:-.02em;margin:0}.section-head a{color:var(--muted)}.project-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.project{border:1px solid var(--line);background:var(--card);border-radius:16px;flex-direction:column;gap:6px;padding:20px 22px;transition:transform .25s ease-out,box-shadow .25s;display:flex}.project:hover{transform:translateY(-3px);box-shadow:0 14px 34px #14182814}.project h3{font:800 22px/1.25 var(--display);letter-spacing:-.02em;margin:0}.project p{color:var(--muted);margin:0;font-size:15px}.project .facts{color:var(--muted);flex-wrap:wrap;gap:14px;margin-top:auto;padding-top:8px;font-size:13px;display:flex}.project .facts b{color:var(--fg);font-weight:600}.project-grid.compact{grid-template-columns:repeat(3,minmax(0,1fr))}.project-grid.compact .project{padding:16px 18px}.project-grid.compact .project h3{font-size:17px}.page-head{padding:40px 0 8px}.page-head .kicker{color:var(--muted);margin:0 0 6px;font-size:14px}.page-head h1{letter-spacing:-.02em;margin:0 0 10px;font-size:clamp(30px,4vw,42px);line-height:1.2}.page-head p{color:var(--muted);max-width:40em;margin:0}.list-wrap{max-width:860px;padding-bottom:64px}.month{font:600 13px/1 var(--mono);color:var(--muted);letter-spacing:.02em;padding:28px 0 4px}.tag-cloud{flex-wrap:wrap;gap:8px;margin-top:16px;display:flex}.tag-cloud a,.tags a{color:var(--accent);background:var(--accent-soft);border-radius:999px;align-items:center;min-height:32px;padding:6px 12px;font-size:14px;display:inline-flex}.breadcrumbs{color:var(--muted);flex-wrap:wrap;gap:6px;padding:18px 0 0;font-size:14px;display:flex}.breadcrumbs a{color:var(--accent);min-height:24px;padding:4px 0;display:inline-block}.progress{background:var(--accent);transform-origin:0;z-index:20;width:100%;height:3px;position:fixed;top:0;left:0;transform:scaleX(0)}.article-wrap{grid-template-columns:minmax(0,1fr) 220px;gap:64px;display:grid}.article{min-width:0;max-width:700px;padding:8px 0 64px}.article h1{letter-spacing:-.02em;margin:10px 0 14px;font-size:clamp(28px,4vw,40px);line-height:1.3}.article .byline{color:var(--muted);border-bottom:1px solid var(--line);flex-wrap:wrap;gap:4px 16px;padding-bottom:22px;font-size:14px;display:flex}.article .lead{color:#3a3d45;margin:24px 0 0;font-size:19px}.prose{font-size:18px;line-height:1.9}.prose h2{margin:42px 0 10px;scroll-margin-top:24px;font-size:25px;line-height:1.4}.prose h3{margin:30px 0 6px;scroll-margin-top:24px;font-size:20px}.prose p{margin:14px 0}.prose ul,.prose ol{margin:14px 0;padding-left:1.3em}.prose li{margin:6px 0}.prose a{color:var(--accent);border-bottom:1px solid}.prose blockquote{border-left:3px solid var(--accent);color:#3a3d45;margin:22px 0;padding:4px 0 4px 18px}.prose code{font:.86em var(--mono);background:var(--accent-soft);border-radius:5px;padding:2px 6px}.prose pre{color:#e6e8ee;font:14px/1.7 var(--mono);background:#13161d;border-radius:12px;margin:20px 0;padding:16px 18px;overflow-x:auto}.prose pre code{color:inherit;font-size:inherit;background:0 0;padding:0}.prose figure{margin:24px 0}.prose figure img{border:1px solid var(--line);border-radius:10px}.prose figcaption{color:var(--muted);text-align:center;margin-top:6px;font-size:14px}.prose hr{border:0;border-top:1px solid var(--line);margin:32px 0}.tags{flex-wrap:wrap;gap:8px;margin-top:36px;display:flex}.series-box{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);margin-top:24px;padding:14px 18px;font-size:15px}.series-box ol{margin:6px 0 0;padding-left:1.3em}.series-box li[aria-current]{font-weight:700}.series-box a{color:var(--accent)}.author-box{border-top:1px solid var(--line);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:28px;padding:20px 0;display:flex}.prev-next{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:24px;display:grid}.prev-next a{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);padding:14px 16px;line-height:1.5;transition:border-color .2s}.prev-next a:hover{border-color:var(--accent)}.prev-next small{color:var(--muted);font-size:12px;display:block}.prev-next .next{text-align:right;grid-column:2}.toc{align-self:start;padding-top:40px;font-size:14px;position:sticky;top:24px}.toc h2{letter-spacing:.08em;color:var(--muted);margin:0 0 8px;font-size:12px}.toc a{border-left:2px solid var(--line);color:var(--muted);padding:5px 0 5px 12px;line-height:1.5;transition:color .2s,border-color .2s;display:block}.toc a.l3{padding-left:24px}.toc a.on{border-color:var(--accent);color:var(--fg);font-weight:600}.doc{max-width:720px;padding:8px 0 64px;font-size:17px}.doc h1{margin:10px 0 16px;font-size:clamp(28px,4vw,38px);line-height:1.25}.doc h2{margin:32px 0 8px;font-size:22px}.doc a{color:var(--accent)}.doc details{border-bottom:1px solid var(--line);padding:6px 0}.doc summary{cursor:pointer;align-items:center;min-height:44px;display:flex}.doc summary h3{margin:0;font-size:17px}.button{background:var(--fg);color:#fff;border-radius:999px;align-items:center;min-height:44px;padding:0 20px;font-weight:600;display:inline-flex}.site-footer{border-top:1px solid var(--line);background:var(--card);color:var(--muted);padding:40px 0 24px}.footer-top{grid-template-columns:minmax(0,2fr) repeat(2,minmax(0,1fr));gap:28px;display:grid}.footer-top h2{letter-spacing:.06em;color:var(--fg);margin:0 0 10px;font-size:13px}.footer-top ul{gap:2px;margin:0;padding:0;list-style:none;display:grid}.footer-top ul a{align-items:center;min-height:32px;display:inline-flex}.footer-top a:hover,.footer-brand .brand{color:var(--fg)}.footer-brand .brand span{color:var(--accent)}.footer-brand p{max-width:36ch;margin:8px 0 14px}.footer-bottom{flex-wrap:wrap;gap:8px 24px;margin-top:28px;font-size:13px;display:flex}.footer-bottom a{min-height:24px;padding:4px 0;display:inline-block}@media (max-width:900px){.reading,.article-wrap{grid-template-columns:minmax(0,1fr);gap:32px}.toc{display:none}.project-grid.compact{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:640px){.hero{height:252px}.hero-cap{flex-direction:column;align-items:flex-start;gap:12px;bottom:16px}.hero-cap p{font-size:14px}.reading{padding-top:14px}.post-row{grid-template-columns:minmax(0,1fr)}.post-row .meta{text-align:left;order:-1}.post-row .meta span{margin-right:10px;display:inline}.project-grid,.project-grid.compact{grid-template-columns:minmax(0,1fr)}.prose{font-size:17px}.prose h2{font-size:21px}.prev-next{grid-template-columns:minmax(0,1fr)}.prev-next .next{grid-column:auto}.footer-top{grid-template-columns:1fr 1fr}.footer-brand{grid-column:1/-1}.site-header nav a{padding:10px 8px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.askai{flex-wrap:wrap;align-items:center;gap:2px 14px;padding-top:14px;padding-bottom:2px;font-size:13px;line-height:1.4;display:flex}.askai-label{opacity:.72}.askai .askai-links{font-size:inherit;flex-wrap:wrap;grid-template-columns:none;align-items:center;gap:0 14px;margin:0;padding:0;list-style:none;display:flex}.askai .askai-links li{border:0;margin:0;padding:0}.askai .askai-links button,.askai .askai-links a{min-width:28px;min-height:28px;box-shadow:none;color:inherit;font:inherit;letter-spacing:inherit;text-transform:none;opacity:.85;cursor:pointer;background:0 0;border:0;border-radius:2px;justify-content:center;align-items:center;gap:3px;margin:0;padding:0;text-decoration:none;transition:opacity .15s ease-out,transform .15s ease-out;display:inline-flex}.askai-links button:hover,.askai-links a:hover{opacity:1;text-underline-offset:3px;text-decoration:underline;transform:translateY(-1px)}.askai-links button:focus-visible,.askai-links a:focus-visible{opacity:1;outline-offset:2px;outline:2px solid}.askai-links button:after{content:"";opacity:.6;background:currentColor;width:8px;height:8px;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M3 1.5h5.5V7M8.5 1.5 1.5 8.5' fill='none' stroke='%23000' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M3 1.5h5.5V7M8.5 1.5 1.5 8.5' fill='none' stroke='%23000' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 50%/contain no-repeat}.askai .askai-faq{border-left:1px solid color-mix(in srgb, currentColor 25%, transparent);padding-left:14px}.inline-link{color:var(--accent);align-items:center;min-height:28px;display:inline-flex}
