.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/space-grotesk-var.woff2)format("woff2")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-400.woff2)format("woff2")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/ibm-plex-mono-500.woff2)format("woff2")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-mono-600.woff2)format("woff2")}:root{--font-sans:"Space Grotesk", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", ui-sans-serif, system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "Cascadia Code", Consolas, "Courier New", monospace;--bg:#fff;--surface:#fff;--surface-2:#f7f7f7;--ink:oklch(26% .012 60);--ink-2:oklch(50% .014 60);--ink-3:oklch(64% .013 62);--ink-4:oklch(76% .012 64);--line:oklch(90% .014 75);--line-2:oklch(84% .016 72);--accent:#2a2a2a;--accent-ink:#000}html.dark{--bg:oklch(17% .006 60);--surface:oklch(20% .006 60);--surface-2:oklch(24% .008 60);--ink:oklch(91% .008 60);--ink-2:oklch(72% .01 60);--ink-3:oklch(60% .01 62);--ink-4:oklch(46% .01 64);--line:oklch(28% .01 75);--line-2:oklch(34% .012 72);--accent:#e8e8e8;--accent-ink:#fff}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--bg);min-height:100vh;color:var(--ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;flex-direction:column;margin:0;font-size:15px;line-height:1.7;display:flex}main{flex:1;width:100%}a{color:inherit;text-decoration:none}::selection{background:var(--ink);color:var(--bg)}.container{width:100%;max-width:720px;margin:0 auto;padding:0 1.5rem}.site-header{z-index:50;background:var(--bg);background:color-mix(in srgb, var(--bg) 82%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.5);border-bottom:1px solid var(--line);width:100%;position:sticky;top:0}.header-inner{align-items:center;gap:1rem;max-width:720px;height:60px;margin:0 auto;padding:0 1.5rem;display:flex}.brand{align-items:center;gap:9px;display:flex}.brand-dot{background:var(--accent);border-radius:50%;flex-shrink:0;width:9px;height:9px}.brand-path{font-family:var(--font-mono);color:var(--ink-4);font-size:14px;transition:color .15s}.brand:hover .brand-path{color:var(--ink-2)}.nav{align-items:center;gap:1.15rem;margin-left:auto;display:flex}.nav-link{font-family:var(--font-mono);letter-spacing:.02em;color:var(--ink-3);font-size:12.5px;transition:color .15s}.nav-link:hover,.nav-link.active{color:var(--accent-ink)}.theme-toggle{cursor:pointer;font-family:var(--font-mono);letter-spacing:.02em;color:var(--ink-3);background:0 0;border:none;padding:0;font-size:12.5px;transition:color .15s}.theme-toggle:hover{color:var(--accent-ink)}.icon-sun,html.dark .icon-moon{display:none}html.dark .icon-sun{display:inline}.hero{padding:6.5rem 0 3.2rem}.hero h1{letter-spacing:-.02em;color:var(--ink);margin:0;font-size:clamp(26px,3.6vw,36px);font-weight:600;line-height:1.1}.hero-desc{max-width:52ch;color:var(--ink-2);margin:1.1rem 0 0;font-size:15px;line-height:1.7}.hero-desc-line{margin-top:.5rem;display:block}.ulink{color:var(--accent-ink);text-decoration:underline;text-decoration-color:var(--ink-4);text-underline-offset:3px;transition:text-decoration-color .15s}.ulink:hover{text-decoration-color:var(--accent-ink)}.year-groups{flex-direction:column;gap:2.4rem;padding-bottom:2.4rem;display:flex}.year-group{grid-template-columns:56px 1fr;align-items:start;gap:1rem;display:grid}.year-label{font-family:var(--font-mono);letter-spacing:.02em;color:var(--ink-4);padding-top:9px;font-size:12px;position:sticky;top:76px}.post-list{margin:0;padding:0;list-style:none}.post-row{text-align:left;align-items:baseline;gap:1rem;width:100%;padding:7px 0;display:flex}.row-date{width:56px;font-family:var(--font-mono);letter-spacing:.01em;color:var(--ink-4);flex-shrink:0;font-size:12px;transition:color .15s}.post-row:hover .row-date{color:var(--accent)}.row-title{letter-spacing:-.005em;min-width:0;color:var(--ink);flex:1;font-size:14px;font-weight:500;line-height:1.45;transition:color .15s}.post-row:hover .row-title{color:var(--accent-ink)}.more-link{padding-bottom:3rem}.more-link a{font-family:var(--font-mono);color:var(--ink-3);font-size:12.5px;transition:color .15s}.more-link a:hover{color:var(--accent-ink)}.page{padding-bottom:5rem}.page-head{padding:2.2rem 0 1.6rem}.page-head h1{letter-spacing:-.02em;margin:0;font-size:clamp(22px,3.6vw,30px);font-weight:600;line-height:1.2}.page-sub{color:var(--ink-3);margin:.7rem 0 0;font-size:13.5px}.page-sub code{font-family:var(--font-mono);color:var(--ink-4);font-size:.9em}.crumbs{font-family:var(--font-mono);letter-spacing:.01em;color:var(--ink-3);flex-wrap:wrap;align-items:center;gap:.45rem;padding-top:1.7rem;font-size:12.5px;display:flex}.crumbs a{color:var(--ink-3);transition:color .15s}.crumbs a:hover{color:var(--accent-ink)}.crumbs-current,.crumbs-sep{color:var(--ink-4)}.tree{background:var(--surface);border:1px solid var(--line);font-family:var(--font-mono);border-radius:6px;margin-top:.6rem;padding:.9rem 1rem 1rem;font-size:13px}.tree-root{color:var(--ink-3);border-bottom:1px dashed var(--line);margin-bottom:.35rem;padding-bottom:.45rem}.tree-list,.tree-sub{margin:0;padding:0;list-style:none}.tree-sub{border-left:1px solid var(--line-2);margin-left:.5rem;padding-left:1.15rem}details>summary{list-style:none}details>summary::-webkit-details-marker{display:none}.dir-row{cursor:pointer;user-select:none;align-items:baseline;gap:.5rem;padding:.32rem 0;display:flex}.dir-row:before{content:"▸";color:var(--ink-4);font-size:10px;transition:transform .15s;display:inline-block}details[open]>summary.dir-row:before{transform:rotate(90deg)}.dir-name{color:var(--ink-2);font-weight:500;transition:color .15s}.dir-row:hover .dir-name{color:var(--accent-ink)}.dir-count{color:var(--ink-4);font-size:11px}.file-row{align-items:baseline;gap:.75rem;padding:.3rem 0;display:flex}.file-name{color:var(--ink);transition:color .15s}.file-ext{color:var(--ink-4)}.file-row:hover .file-name{color:var(--accent-ink);text-underline-offset:3px;text-decoration:underline}.file-date{color:var(--ink-4);margin-left:auto;font-size:11px}.tree-hint{color:var(--ink-3);margin-top:1.3rem;font-size:13px}.tree-hint code,.prose code,.page-sub code{font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--line);border-radius:4px;padding:.08em .35em;font-size:.88em}.post{padding-bottom:3rem}.post-head{padding:2.4rem 0 1.9rem}.post-head h1{letter-spacing:-.025em;margin:0;font-size:clamp(24px,4vw,34px);font-weight:700;line-height:1.2}.post-meta{color:var(--ink-3);flex-wrap:wrap;align-items:baseline;gap:.6rem;margin-top:.9rem;font-size:13px;display:flex}.post-meta time{font-family:var(--font-mono)}.sep{color:var(--ink-4)}.prose{color:var(--ink);overflow-wrap:break-word;font-size:15.5px;line-height:1.85}.prose>:first-child{margin-top:0}.prose p{margin:0 0 1.1em}.prose h2{letter-spacing:-.01em;margin:2.1em 0 .75em;font-size:1.35em;font-weight:600;line-height:1.35}.prose h3{letter-spacing:-.005em;margin:1.7em 0 .55em;font-size:1.13em;font-weight:600}.prose a{color:var(--accent-ink);text-decoration:underline;text-decoration-color:var(--ink-4);text-underline-offset:3px;transition:text-decoration-color .15s}.prose a:hover{text-decoration-color:var(--accent-ink)}.prose ul,.prose ol{margin:0 0 1.1em;padding-left:1.5em}.prose li{margin-bottom:.4em}.prose li::marker{color:var(--ink-4)}.prose blockquote{border-left:2px solid var(--ink-4);color:var(--ink-2);margin:1.5em 0;padding:.1em 0 .1em 1.1em}.prose blockquote p{margin:.6em 0}.prose code{font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--line);border-radius:4px;padding:.12em .4em;font-size:.86em}.prose pre{background:var(--surface-2);border:1px solid var(--line);border-radius:6px;margin:1.5em 0;padding:1rem 1.1rem;font-size:13px;line-height:1.7;overflow-x:auto}.prose pre code{font-size:inherit;background:0 0;border:none;padding:0}.prose img{border-radius:4px;max-width:100%}.prose hr{border:none;border-top:1px solid var(--line);margin:2.4em 0}.prose table{border-collapse:collapse;width:100%;margin:1.5em 0;font-size:.93em}.prose th,.prose td{border:1px solid var(--line);text-align:left;padding:.5em .8em}.prose th{background:var(--surface-2);font-weight:600}.astro-code,.astro-code span{color:var(--shiki-light)!important;background-color:var(--shiki-light-bg)!important}html.dark .astro-code,html.dark .astro-code span{color:var(--shiki-dark)!important;background-color:var(--shiki-dark-bg)!important}.post-nav{border-top:1px solid var(--line);grid-template-columns:1fr 1fr;gap:1.5rem;margin-top:3.5rem;padding-top:1.5rem;display:grid}.post-nav-item{padding:.4rem 0;display:block}.nav-label{font-family:var(--font-mono);letter-spacing:.02em;color:var(--ink-4);margin-bottom:.3rem;font-size:11.5px;display:block}.nav-title{color:var(--ink);font-size:13.5px;font-weight:500;line-height:1.4;transition:color .15s;display:block}.post-nav-item:hover .nav-title{color:var(--accent-ink)}.post-nav-next{text-align:right}.dir-section{margin-top:2.4rem}.dir-section:first-of-type{margin-top:.6rem}.dir-section-title{font-family:var(--font-mono);letter-spacing:.04em;color:var(--ink-4);margin:0 0 .7rem;font-size:12px;font-weight:500}.empty{text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:6px;padding:2.5rem 1rem;font-size:14px}.site-footer{border-top:1px solid var(--line);margin-top:6.5rem}.footer-inner{max-width:720px;font-family:var(--font-mono);color:var(--ink-4);flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.5rem 1.5rem;margin:0 auto;padding:1.5rem 1.5rem 2rem;font-size:11.5px;display:flex}.footer-inner a{color:var(--ink-3);transition:color .15s}.footer-inner a:hover{color:var(--accent-ink)}@keyframes vt-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes vt-out{0%{opacity:1}to{opacity:0;transform:translateY(-6px)}}::view-transition-new(root){animation:.22s vt-in}::view-transition-old(root){animation:.16s vt-out}@media (width<=640px){.hero{padding:4.5rem 0 2.4rem}.nav{gap:.8rem}.year-group{grid-template-columns:44px 1fr}.row-date{width:44px}.post-nav{grid-template-columns:1fr;gap:.6rem}.post-nav-next{text-align:left}}
