:root{color-scheme:light;--paper:#f6f7f5;--panel:#fcfcfb;--panel-sunk:#eff1ee;--ink:#171c1a;--ink-soft:#39433f;--ink-muted:#667069;--ink-faint:#98a19b;--line:#dfe3dd;--line-strong:#c4cbc3;--accent:#1b4b7f;--accent-soft:#4c7bae;--mark:#a33b22;--mark-wash:#f0e2dc;--code-bg:#f1f3f0;--code-line:#e4e7e2;--grid:color-mix(in srgb, var(--ink) 7%, transparent);--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Noto Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC", sans-serif;--font-serif:"Source Serif 4", "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, "Noto Serif SC", "Source Han Serif SC", "Songti SC", "SimSun", serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--measure:66ch;--page-max:1120px;--rail:8.5rem;--gutter:clamp(1.15rem, 4vw, 3.25rem);--s1:.25rem;--s2:.5rem;--s3:.75rem;--s4:1rem;--s5:1.5rem;--s6:2rem;--s7:3rem;--s8:4.5rem;--s9:7rem;--ease:cubic-bezier(.22, .68, .35, 1)}[data-theme=dark]{color-scheme:dark;--paper:#0d1113;--panel:#131819;--panel-sunk:#191f20;--ink:#e6eae7;--ink-soft:#bac3bd;--ink-muted:#838e88;--ink-faint:#5a6560;--line:#222a29;--line-strong:#303a38;--accent:#7fb2e0;--accent-soft:#5a8fc0;--mark:#e08a6e;--mark-wash:#2a1d18;--code-bg:#111617;--code-line:#1b2223}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:5.5rem}@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(--paper);color:var(--ink);font-family:var(--font-sans);font-feature-settings:"kern" 1, "liga" 1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;font-size:1rem;line-height:1.7;overflow-x:hidden}img,svg,video{max-width:100%;height:auto;display:block}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:none}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:1px}::selection{background:color-mix(in srgb, var(--accent) 22%, transparent)}h1,h2,h3,h4,h5,h6{font-family:var(--font-serif);letter-spacing:-.012em;text-wrap:balance;margin:0;font-weight:600;line-height:1.24}p{margin:0 0 var(--s4)}strong{font-weight:650}:where(p,li,h1,h2,h3,h4,blockquote,td,dd){text-spacing-trim:trim-start}.mono-meta{font-family:var(--font-mono);letter-spacing:.04em;font-variant-numeric:tabular-nums;color:var(--ink-muted);font-size:.72rem}.grid-field{background-image:repeating-linear-gradient(to right, var(--grid) 0 1px, transparent 1px 2rem), repeating-linear-gradient(to bottom, var(--grid) 0 1px, transparent 1px 2rem);background-position:50%}.shell{width:100%;max-width:var(--page-max);padding-inline:var(--gutter);margin-inline:auto}.skip-link{left:var(--s4);z-index:100;padding:var(--s2) var(--s4);background:var(--ink);color:var(--paper);transition:top .2s var(--ease);font-size:.85rem;position:absolute;top:-100px}.skip-link:focus{top:var(--s4)}.rail-layout{gap:var(--s4);grid-template-columns:1fr;display:grid}@media (width>=62rem){.rail-layout{grid-template-columns:var(--rail) minmax(0, 1fr);gap:var(--s7)}}.rule{background:var(--line);border:0;height:1px;margin:0}@media (prefers-reduced-motion:no-preference){.stage-rule{transform-origin:0;animation:rule-draw .62s var(--ease) both}.stage-text{animation:stage-in .68s var(--ease) both;animation-delay:calc(90ms + var(--stage-i,0) * 70ms)}.stage-row{animation:stage-in .6s var(--ease) both;animation-delay:calc(.12s + var(--stage-i,0) * 55ms)}}@keyframes rule-draw{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes stage-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:no-preference){.reveal{opacity:0;transition:opacity .62s var(--ease), transform .62s var(--ease);transform:translateY(16px)}.reveal.is-in{opacity:1;transform:none}}.theme-toggle{border:1px solid var(--line);color:var(--ink-muted);font-family:var(--font-mono);letter-spacing:.06em;transition:color .25s var(--ease), border-color .25s var(--ease);align-items:center;gap:.4rem;padding:.3rem .55rem;font-size:.68rem;display:inline-flex}.theme-toggle:hover{color:var(--ink);border-color:var(--line-strong)}.theme-toggle svg{width:.95rem;height:.95rem}.progress{z-index:60;pointer-events:none;background:0 0;height:2px;position:fixed;inset:0 0 auto}.progress>i{background:var(--accent);transform-origin:0;height:100%;display:block;transform:scaleX(0)}.masthead{z-index:50;background:color-mix(in srgb, var(--paper) 88%, transparent);-webkit-backdrop-filter:saturate(1.4)blur(10px);border-bottom:1px solid var(--line);position:sticky;top:0}.masthead__inner{justify-content:space-between;align-items:center;gap:var(--s4);flex-wrap:wrap;min-height:4.25rem;display:flex}.brand{align-items:center;gap:.7rem;min-width:0;display:inline-flex}.brand__mark{object-fit:cover;border:1px solid var(--line-strong);filter:grayscale(.16);width:2.25rem;height:2.25rem;transition:filter .35s var(--ease), transform .35s var(--ease);border-radius:50%}.brand:hover .brand__mark{filter:grayscale(0);transform:rotate(-4deg)scale(1.04)}.brand__text{flex-direction:column;min-width:0;display:flex}.brand__name{font-family:var(--font-serif);letter-spacing:-.01em;white-space:nowrap;font-size:1.06rem;font-weight:650;line-height:1.25}.brand__tag{color:var(--ink-faint);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-size:.66rem;overflow:hidden}@media (width<=30rem){.brand__tag{display:none}}.nav{flex-wrap:wrap;align-items:center;gap:.15rem;display:flex}.nav__link{color:var(--ink-muted);transition:color .24s var(--ease);align-items:center;gap:.35rem;padding:.45rem .6rem;font-size:.88rem;display:inline-flex;position:relative}.nav__link:hover,.nav__link.is-active{color:var(--ink)}.nav__link.is-active:after{content:"";background:var(--accent);height:1.5px;position:absolute;bottom:.1rem;left:.6rem;right:.6rem}.nav__search svg{width:.95rem;height:.95rem}@media (width<=34rem){.nav__search-label{display:none}}.hero{isolation:isolate;border-bottom:1px solid var(--line);position:relative;overflow:hidden}.hero--has-bg:before{content:"";z-index:-2;background-image:var(--hero-bg);opacity:.9;background-position:50%;background-size:cover;position:absolute;inset:0}.hero__veil{z-index:-1;background:linear-gradient(100deg, color-mix(in srgb, var(--paper) 96%, transparent) 0%, color-mix(in srgb, var(--paper) 90%, transparent) 42%, color-mix(in srgb, var(--paper) 62%, transparent) 100%);position:absolute;inset:0}[data-theme=dark] .hero__veil{background:linear-gradient(100deg, color-mix(in srgb, var(--paper) 94%, transparent) 0%, color-mix(in srgb, var(--paper) 86%, transparent) 42%, color-mix(in srgb, var(--paper) 55%, transparent) 100%)}.hero:not(.hero--has-bg):before{content:"";z-index:-2;background-image:repeating-linear-gradient(to right, var(--grid) 0 1px, transparent 1px 2rem), repeating-linear-gradient(to bottom, var(--grid) 0 1px, transparent 1px 2rem);position:absolute;inset:0;-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.hero__inner{flex-direction:column;justify-content:flex-end;display:flex;position:relative}.hero--tall .hero__inner{min-height:clamp(22rem,52vh,34rem);padding-block:var(--s7) var(--s7)}.hero--compact .hero__inner{min-height:clamp(11rem,26vh,16rem);padding-block:var(--s6) var(--s5)}.hero__eyebrow{color:var(--ink-faint);margin:0 0 var(--s3)}.hero__title{letter-spacing:-.022em;max-width:20ch;font-size:clamp(1.9rem,1.1rem + 2.6vw,3.15rem);font-weight:640}.hero__quote{margin:var(--s5) 0 0;padding-left:var(--s4);border-left:2px solid var(--accent);font-family:var(--font-serif);color:var(--ink-soft);max-width:46ch;font-size:clamp(.95rem,.9rem + .3vw,1.12rem);line-height:1.85}.hero__rule{background:var(--line-strong);position:absolute;bottom:0;left:0;right:0}.foot{margin-top:var(--s9);padding-block:var(--s7) var(--s5);border-top:1px solid var(--line);background:var(--panel-sunk)}.foot__grid{gap:var(--s6) var(--s7);grid-template-columns:1fr;display:grid}@media (width>=40rem){.foot__grid{grid-template-columns:1.6fr 1fr 1fr 1fr}}.foot__name{font-family:var(--font-serif);margin:0 0 .15rem;font-size:1.15rem;font-weight:650}.foot__bio{color:var(--ink-muted);margin:0 0 var(--s3);font-size:.9rem}.foot__mail{color:var(--accent);border-bottom:1px solid color-mix(in srgb, var(--accent) 35%, transparent);padding-bottom:1px}.foot__head{margin:0 0 var(--s3);color:var(--ink-faint)}.foot__list{flex-direction:column;gap:.4rem;margin:0;padding:0;font-size:.9rem;list-style:none;display:flex}.foot__list a{color:var(--ink-soft);transition:color .22s var(--ease)}.foot__list a:hover{color:var(--accent)}.foot__base{justify-content:space-between;gap:var(--s3);margin-top:var(--s7);padding-top:var(--s4);border-top:1px solid var(--line);flex-wrap:wrap;display:flex}@media (width<=40rem){.foot__built{display:none}}.prose{font-family:var(--font-serif);color:var(--ink-soft);max-width:var(--measure);font-size:1.0625rem;line-height:1.82}.prose>:first-child{margin-top:0}.prose h2,.prose h3,.prose h4{color:var(--ink);font-family:var(--font-serif);scroll-margin-top:5.5rem;position:relative}.prose h2{margin:var(--s8) 0 var(--s4);padding-top:var(--s4);border-top:1px solid var(--line);font-size:1.5rem}.prose h3{margin:var(--s6) 0 var(--s3);font-size:1.2rem}.prose h4{margin:var(--s5) 0 var(--s3);color:var(--ink-soft);font-size:1.05rem}.prose :is(h2,h3,h4)>a.anchor{text-align:right;width:1.1rem;color:var(--ink-faint);font-family:var(--font-mono);opacity:0;transition:opacity .2s var(--ease), color .2s var(--ease);font-weight:400;position:absolute;left:-1.3rem}.prose :is(h2,h3,h4):hover>a.anchor{opacity:1}.prose :is(h2,h3,h4)>a.anchor:hover{color:var(--accent)}@media (width<=68rem){.prose :is(h2,h3,h4)>a.anchor{opacity:.35;margin-right:.35rem;position:static}}.prose p{margin:0 0 var(--s4)}.prose a{color:var(--accent);text-decoration:underline;text-decoration-color:color-mix(in srgb, var(--accent) 38%, transparent);text-underline-offset:.22em;transition:text-decoration-color .22s var(--ease), color .22s var(--ease);text-decoration-thickness:1px}.prose a:hover{text-decoration-color:currentColor}.prose strong{color:var(--ink);font-weight:650}.prose ul,.prose ol{margin:0 0 var(--s4);padding-left:1.5rem}.prose li{margin-bottom:.4rem}.prose li::marker{color:var(--ink-faint)}.prose ul ul,.prose ol ol,.prose ul ol,.prose ol ul{margin-top:.4rem;margin-bottom:0}.prose input[type=checkbox]{accent-color:var(--accent);margin-right:.4rem}.prose blockquote{margin:var(--s5) 0;padding:.9rem var(--s5);border-left:3px solid var(--mark);background:color-mix(in srgb, var(--mark-wash) 55%, transparent);color:var(--ink-soft);font-style:normal}.prose blockquote>:last-child{margin-bottom:0}.prose blockquote p{font-size:1rem}.prose :not(pre)>code{font-family:var(--font-mono);background:var(--code-bg);border:1px solid var(--line);color:var(--ink);word-break:break-word;border-radius:2px;padding:.12em .36em;font-size:.86em}.prose pre{margin:var(--s5) 0;background:var(--code-bg);border:1px solid var(--line);counter-reset:codeline;border-radius:3px;font-size:.875rem;line-height:1.7;overflow:auto}.prose pre>code{font-family:var(--font-mono);padding:var(--s3) 0;background:0 0;border:0;width:max-content;min-width:100%;display:grid}.prose pre code .line{padding-inline:.85rem 1rem;min-height:1.7em;padding-left:3.1rem;display:block;position:relative}.prose pre code .line:before{counter-increment:codeline;content:counter(codeline);text-align:right;width:2.4rem;color:var(--ink-faint);font-variant-numeric:tabular-nums;user-select:none;border-right:1px solid var(--code-line);padding-right:.7rem;position:absolute;top:0;left:0}.prose pre code .line.highlighted{background:color-mix(in srgb, var(--accent) 9%, transparent)}.prose pre code .line.highlighted:before{color:var(--accent);font-weight:600}.prose pre[data-language]:before{content:attr(data-language);margin-bottom:calc(-1 * var(--s3) + .2rem);text-align:right;font-family:var(--font-mono);letter-spacing:.04em;color:var(--ink-faint);user-select:none;pointer-events:none;padding:.45rem .85rem 0;font-size:.7rem;line-height:1;display:block;position:sticky;left:0}.prose pre[data-language=plaintext]:before,.prose pre[data-language=text]:before,.prose pre[data-language=txt]:before{content:none}.prose pre code{letter-spacing:.01em}.prose .astro-code,.prose pre.astro-code{color:var(--shiki-light);background-color:var(--shiki-light-bg)}[data-theme=dark] .prose .astro-code,[data-theme=dark] .prose pre.astro-code{color:var(--shiki-dark);background-color:var(--shiki-dark-bg)}.prose .astro-code span,.prose pre.astro-code span{color:var(--shiki-light)}[data-theme=dark] .prose .astro-code span,[data-theme=dark] .prose pre.astro-code span{color:var(--shiki-dark)}.prose .astro-code,.prose pre.astro-code{background-color:var(--code-bg)!important}.prose table{width:100%;margin:var(--s5) 0;border-collapse:collapse;font-family:var(--font-sans);font-size:.9rem;display:block;overflow-x:auto}@media (width>=48rem){.prose table{display:table}}.prose thead{border-bottom:1px solid var(--line-strong)}.prose th{text-align:left;color:var(--ink);white-space:nowrap;padding:.55rem .75rem;font-weight:600}.prose td{border-top:1px solid var(--line);vertical-align:top;padding:.55rem .75rem}.prose tbody tr:hover{background:color-mix(in srgb, var(--ink) 3%, transparent)}.prose img{margin:var(--s5) auto;border:1px solid var(--line);background:var(--panel);border-radius:3px}[data-theme=dark] .prose img{filter:invert(.92)hue-rotate(180deg)}[data-theme=dark] .prose img[data-raw]{filter:none}.prose hr{background:var(--line);height:1px;margin:var(--s7) 0;border:0}.prose .katex{font-size:1.04em}.prose .katex-display{margin:var(--s5) 0;padding:var(--s3) 0;overflow:auto hidden}.prose p>.katex-display{margin:0}.prose p[style*=text-align]{text-align:center}.prose code.math-inline{display:none}.prose sup{font-size:.75em}.prose kbd{font-family:var(--font-mono);border:1px solid var(--line-strong);background:var(--panel);border-bottom-width:2px;border-radius:3px;padding:.1em .4em;font-size:.8em}.prose mark{background:color-mix(in srgb, var(--mark-wash) 80%, transparent);color:inherit;padding:.05em .2em}.prose :where(.plantuml-source,[data-plantuml]){display:none}
