:root{color-scheme:light;--bg: #ffffff;--fg: #111111;--muted: #666666;--line: #6e6e6e;--font-sans: "Segoe UI", "PingFang SC", "Hiragino Sans GB", sans-serif;--font-display: "Caveat Branch", cursive;--font-mono: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;--nav-width: clamp(3.75rem, 12vw + 1.25rem, 7.5rem);--gutter: clamp(.75rem, 2vw + .35rem, 1.75rem);--edge: clamp(.625rem, 2vw + .35rem, 1rem);--shell: 44rem;--shell-pad-top: clamp(1.25rem, 4vw + .5rem, 3rem);--brand-size: clamp(1.875rem, 4vw + .85rem, 2.75rem);--frame-rule-y: 26rem;--safe-left: env(safe-area-inset-left, 0px);--safe-right: env(safe-area-inset-right, 0px);--chrome-top: max(var(--shell-pad-top), env(safe-area-inset-top, 0px));--masthead-block: calc(var(--chrome-top) + var(--brand-size) + 1.25rem);--ease-out: linear;--content-fade-ms: .1s;--content-fade-ease: linear;--motion-ms: var(--content-fade-ms);--row-gap: 2.25rem;--row-lh: 1.4}*,*:before,*:after{box-sizing:border-box;cursor:default}html{scrollbar-gutter:stable;overflow-x:hidden;overflow-y:auto;font-family:var(--font-sans);font-size:100%;line-height:1.6;background:var(--bg);color:var(--fg);-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;min-height:100vh;min-height:100dvh;overscroll-behavior-x:none;user-select:none;cursor:default}@media(pointer:coarse){html{scrollbar-gutter:auto}}a{color:inherit;text-decoration:none;-webkit-user-drag:none;touch-action:manipulation}a:focus,button:focus{outline:none}a:focus-visible,button:focus-visible{outline:1px solid var(--line);outline-offset:3px}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.masthead a,.side-nav a{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}main ::selection{background:#d8d8d8;color:var(--fg)}.shell{width:min(100% - 2 * var(--edge) - var(--safe-left) - var(--safe-right),var(--shell));margin:0 auto;padding:0 var(--safe-right) max(1.5rem,env(safe-area-inset-bottom,0px)) var(--safe-left);min-height:100vh;min-height:100dvh;display:flex;flex-direction:column;box-sizing:border-box}.side-nav a[data-pending]{color:var(--line);text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:.25em;text-decoration-thickness:1px}.masthead{position:sticky;top:0;z-index:2;flex-shrink:0;display:grid;grid-template-columns:var(--nav-width) minmax(0,1fr);padding:var(--chrome-top) 0 1.25rem;background:var(--bg)}.masthead-bar{grid-column:2;display:flex;align-items:baseline;margin-left:var(--gutter);min-width:0}.brand{color:var(--fg);font-family:var(--font-display);font-size:var(--brand-size);font-weight:600;line-height:1;letter-spacing:.01em}.frame{display:grid;grid-template-columns:var(--nav-width) minmax(0,1fr);flex:1}.side-nav{position:sticky;top:var(--masthead-block);align-self:start;z-index:1;padding:var(--gutter) var(--gutter) var(--gutter) 0;background:var(--bg)}.side-nav ul{display:flex;flex-direction:column;align-items:flex-end;gap:clamp(.5rem,1.5vw,calc(2.25rem - 1rem * var(--row-lh)));margin:0;padding:0;list-style:none}.side-nav li{line-height:var(--row-lh)}.side-nav a{display:inline-flex;align-items:center;padding:.45rem .65rem;margin:-.45rem -.65rem;color:var(--muted);font-size:clamp(.8125rem,2.2vw,.9375rem);line-height:1.3;transition:color var(--motion-ms) var(--ease-out)}.side-nav a[aria-current=page],.side-nav a:active{color:var(--fg);text-decoration:none}@media(pointer:coarse){.side-nav a,.entries a.entry{min-height:2.75rem}}@media(hover:hover)and (pointer:fine){a:hover,.side-nav a:hover,.prose a:hover,.entries a.entry:hover,.entries a.entry:hover .entry-summary,.entries a.entry-writing:hover .entry-date{color:var(--fg)}}main{position:relative;padding:var(--gutter) 0 var(--gutter) var(--gutter);min-width:0;user-select:text}main:before{content:"";display:block;position:sticky;top:var(--masthead-block);z-index:2;--frame-h: min(var(--frame-rule-y), 70dvh);width:calc(100% + var(--gutter));height:var(--frame-h);margin:calc(var(--gutter) * -1) 0 calc(var(--gutter) - var(--frame-h)) calc(var(--gutter) * -1);box-sizing:border-box;border-top:1px solid var(--line);border-left:1px solid var(--line);pointer-events:none}main>.content-frost{position:sticky;top:var(--masthead-block);z-index:1;height:2rem;margin:0 0 -2rem calc(var(--gutter) * -1);width:calc(100% + var(--gutter));pointer-events:none;opacity:0;transition:opacity var(--motion-ms) var(--ease-out);background:#ffffff8c;-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);-webkit-mask-image:linear-gradient(to bottom,#000 40%,transparent);mask-image:linear-gradient(to bottom,#000 40%,transparent)}html.is-scrolled main>.content-frost{opacity:1}html[data-astro-transition] main>.content-frost{-webkit-backdrop-filter:none;backdrop-filter:none;background:#ffffffe0;-webkit-mask-image:none;mask-image:none}@media(prefers-reduced-transparency:reduce){main>.content-frost{background:linear-gradient(to bottom,rgb(255 255 255 / .94),rgb(255 255 255 / .55) 45%,transparent);-webkit-backdrop-filter:none;backdrop-filter:none;-webkit-mask-image:none;mask-image:none}}main :first-child{margin-top:0}@keyframes branch-out{to{opacity:0}}@keyframes branch-in{0%{opacity:0}}::view-transition{pointer-events:none}::view-transition-old(content){z-index:1}::view-transition-new(content){z-index:0}@media(prefers-reduced-motion:reduce){html::view-transition-old(content){animation:branch-out var(--content-fade-ms) var(--content-fade-ease) both!important}html::view-transition-new(content){animation:branch-in var(--content-fade-ms) var(--content-fade-ease) var(--content-fade-ms) both!important}html[data-astro-transition-fallback=old] .content[data-astro-transition-scope],html[data-astro-transition-fallback=old].content[data-astro-transition-scope]{animation:branch-out var(--content-fade-ms) var(--content-fade-ease) both!important}html[data-astro-transition-fallback=new] .content[data-astro-transition-scope],html[data-astro-transition-fallback=new].content[data-astro-transition-scope]{animation:branch-in var(--content-fade-ms) var(--content-fade-ease) var(--content-fade-ms) both!important}}h1{font-size:1.5rem;font-weight:600;line-height:1.25;letter-spacing:-.02em;margin:0 0 .75rem}h2{font-size:1.125rem;font-weight:600;line-height:1.3;margin:1.75rem 0 .5rem}p,ul,ol{margin:0 0 1rem}ul,ol{padding-left:1.25rem}.prose{font-size:1rem;font-weight:400;line-height:1.7;overflow-wrap:break-word}.prose>:first-child{margin-top:0}.prose :last-child{margin-bottom:0}.prose h2{font-size:1.1875rem;font-weight:600;line-height:1.35;letter-spacing:-.015em;margin:2rem 0 .7rem}.prose h3{font-size:1.0625rem;font-weight:600;line-height:1.4;letter-spacing:-.01em;margin:1.5rem 0 .5rem}.prose p{margin:0 0 1.25rem}.prose ul,.prose ol{margin:0 0 1.05rem;padding-left:1.35rem}.prose ul{list-style:none;padding-left:0}.prose ul>li{position:relative;padding-left:1.05rem}.prose ul>li:before{content:"–";position:absolute;left:0;color:var(--muted);font-weight:400}.prose li+li{margin-top:.45rem}.prose li>p{margin:0}.prose li>ul,.prose li>ol{margin:.45rem 0 0}.prose a{color:var(--muted);transition:color var(--motion-ms) var(--ease-out)}.prose a:active{color:var(--fg)}.prose strong{font-weight:600}.prose code{font-size:.84em;letter-spacing:0}.prose pre{margin:0 0 1.05rem;font-size:.875rem;line-height:1.55;letter-spacing:0;border-color:#e5e5e5;white-space:pre-wrap;overflow-x:auto}.prose pre code{font-size:inherit}.prose img{display:block;max-width:100%;height:auto;margin:1.25rem 0 .35rem}.prose:has(.home-hero){line-height:var(--row-lh)}.prose:has(.home-hero) p{margin:0 0 calc(var(--row-gap) - 1rem * var(--row-lh))}.prose:has(.home-hero) p:has(+.home-hero){margin-bottom:0}.home-hero,.home-hero img{margin:0}.prose:has(.home-hero) p+.home-hero{margin-top:3.5rem}.prose p:has(>img){margin-bottom:0}.prose p:has(>img)+p:has(>em:only-child){margin-top:0;color:var(--muted);font-size:.875rem;line-height:1.55;letter-spacing:.01em}.prose p:has(>img)+p:has(>em:only-child) em{font-style:normal}.project-cover{margin:0 0 1.25rem}.project-cover img{display:block;width:100%;height:auto}.project-cover figcaption{margin-top:.5rem;color:var(--muted);font-size:.875rem;line-height:1.5}.project-head,.writing-head{margin:0}.project-head h1,.writing-head h1{margin:0 0 .35rem;text-wrap:balance}.lede{margin:0;font-size:1rem;line-height:1.6;text-wrap:pretty}.writing-head+.prose{margin-top:1.75rem}.writing .meta{font-variant-numeric:tabular-nums}.writing .prose{line-height:1.8}html[lang=zh-CN] .writing .prose{line-height:1.9}.writing .prose p,.writing .prose ul,.writing .prose ol{margin-bottom:1.25rem}.writing .prose li+li{margin-top:.55rem}.project-rule{margin:1.25rem 0;border:0;border-top:1px solid #e5e5e5}.project-links{margin:0;padding:0;list-style:none}.project-links li+li{margin-top:.5rem}.prose .tool-archive{margin:0 0 1.25rem}.prose .tool-archive>summary{cursor:pointer;color:var(--muted);font-size:.9375rem;font-weight:400;letter-spacing:.015em;list-style:none;user-select:none}.prose .tool-archive>summary::-webkit-details-marker{display:none}.prose .tool-archive>summary:before{content:"▸";display:inline-block;margin-right:.4em;transition:transform var(--motion-ms) var(--ease-out)}.prose .tool-archive[open]>summary:before{transform:rotate(90deg)}.prose .tool-archive>summary:hover{color:var(--fg)}.prose .tool-archive[open]>summary{margin-bottom:1.25rem}.prose .archive-reason{margin:.5rem 0 0;color:var(--muted);font-size:.875rem;line-height:1.55}.prose .archive-reason a{color:inherit;text-decoration:underline;text-decoration-color:#c4c4c4;text-underline-offset:.25em}.prose .skill-entry{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:1.25rem;align-items:center;margin:0 0 1.05rem}.prose .skill-entry>p{margin:0;min-width:0}.prose .skill-entry>.skill-link{margin:0;justify-self:end;white-space:nowrap}.prose .tool-link{margin:.75rem 0 0;text-align:right}.project-links a,.prose .skill-link a,.prose .tool-link a{color:var(--muted);font-size:.9375rem;font-weight:400;letter-spacing:.015em;text-decoration:underline;text-decoration-color:#c4c4c4;text-underline-offset:.25em;text-decoration-thickness:1px;transition:color var(--motion-ms) var(--ease-out),text-decoration-color var(--motion-ms) var(--ease-out)}.project-links a.primary,.prose .skill-link a.primary,.prose .tool-link a.primary{color:var(--fg);font-weight:600;text-decoration-color:var(--line);text-decoration-thickness:1.5px}.project-links a:after,.prose .skill-link a:after,.prose .tool-link a:after{content:"↗";margin-left:.3em;font-size:.75em;text-decoration:none}@media(hover:hover)and (pointer:fine){.project-links a:hover,.prose .skill-link a:hover,.prose .tool-link a:hover{color:var(--fg);text-decoration-color:var(--fg)}}.prose table{width:100%;border-collapse:collapse;margin:0 0 1.25rem;color:var(--fg);font-size:1rem;font-weight:400;line-height:1.7;letter-spacing:.01em;border:1px solid #e5e5e5}.prose th,.prose td{padding:.75rem 1rem;border:1px solid #e5e5e5;text-align:left;vertical-align:top}.prose th{background:#f7f7f7;color:var(--fg);font-weight:600;line-height:1.4;letter-spacing:.015em}.prose td{background:var(--bg)}.prose td:first-child{font-weight:600;letter-spacing:.015em}.prose th strong,.prose td:first-child strong{font-weight:inherit}.not-found h1{margin-bottom:.5rem}.not-found-hint{margin:0 0 1.25rem;color:var(--muted);font-size:.9375rem;line-height:1.55}.not-found-home{color:var(--fg);font-size:.9375rem;font-weight:600;letter-spacing:.015em;text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:.25em;text-decoration-thickness:1.5px;transition:text-decoration-color var(--motion-ms) var(--ease-out)}@media(hover:hover)and (pointer:fine){.not-found-home:hover{text-decoration-color:var(--fg)}}.empty-action{appearance:none;margin:0;padding:0;border:0;background:none;color:var(--fg);font:inherit;font-size:inherit;line-height:inherit;text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:.25em;cursor:pointer;transition:text-decoration-color var(--motion-ms) var(--ease-out)}@media(hover:hover)and (pointer:fine){.empty-action:hover{text-decoration-color:var(--fg)}}.filters{display:flex;flex-wrap:wrap;gap:var(--row-gap) 1.25rem;margin:0 0 var(--row-gap)}.filters button{appearance:none;margin:0;padding:0;border:0;background:none;color:var(--muted);font:inherit;font-size:1rem;line-height:var(--row-lh);transition:color var(--motion-ms) var(--ease-out)}.filters button[aria-pressed=true],.filters button:active{color:var(--fg)}@media(pointer:coarse){.filters button{min-height:2.75rem}}@media(hover:hover)and (pointer:fine){.filters button:hover{color:var(--fg)}}.empty{color:var(--muted)}.meta{color:var(--muted);font-size:.875rem}[data-writing]{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.entries{display:flex;flex-direction:column;gap:var(--row-gap);margin:0;padding:0;list-style:none}.entries .entry{display:block;padding:0}.entries .entry-writing{display:grid;grid-template-columns:minmax(0,1fr) max-content;column-gap:.85rem;align-items:baseline}.entries .entry-writing .entry-title{grid-column:1;grid-row:1}.entries .entry-writing .entry-date{grid-column:2;grid-row:1;text-align:right}.entries a.entry{color:var(--fg);-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;transition:color var(--motion-ms) var(--ease-out)}.entries a.entry-writing,.entries a.entry:active,.entries a.entry-writing:active .entry-date{color:var(--fg)}.entry-title{display:block;margin:0;font-size:1rem;font-weight:400;line-height:var(--row-lh)}.entry-date{margin:0;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.875rem;line-height:var(--row-lh);letter-spacing:.01em;transition:color var(--motion-ms) var(--ease-out)}.entry-summary{display:block;margin:.2rem 0 0;color:var(--muted);font-size:.875rem;line-height:1.5;text-wrap:pretty;transition:color var(--motion-ms) var(--ease-out)}.entries:has(.entry-row){display:grid;grid-template-columns:max-content minmax(0,max-content);column-gap:clamp(.75rem,2.5vw,1.5rem);row-gap:var(--row-gap)}.entries:has(.entry-row)>li,.entries .entry-row{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;align-items:baseline;line-height:var(--row-lh)}.entry-value{justify-self:start;min-width:0;user-select:text;-webkit-user-select:text}.content:has(.entry-row){container-type:inline-size}@container (max-width: 15rem){.entries:has(.entry-row){display:flex;flex-direction:column}.entries:has(.entry-row)>li,.entries .entry-row{display:flex;flex-direction:column;align-items:flex-start;grid-template-columns:none;grid-column:auto}}.placeholder{margin:0;color:var(--fg);font-size:1rem;line-height:1.7;letter-spacing:.08em}code,pre{font-family:var(--font-mono);font-size:.875em}pre{overflow-x:auto;padding:.875rem 1rem;border:1px solid #e5e5e5;background:#f7f7f7}
