:root{--c-bg:#0d0d0d;--c-card:#1a1a1a;--c-card-hi:#1f1f1f;--c-border:#333333;--c-text:#f2f2f2;--c-text-2:#e0e0e0;--c-text-dim:#7a7a7a;--c-text-faint:#555555;--c-accent:#4ade80}:root[data-theme=light]{--c-bg:#ffffff;--c-card:#f4f4f4;--c-card-hi:#eef7f0;--c-border:#e2e2e2;--c-text:#1a1a1a;--c-text-2:#333333;--c-text-dim:#6b6b6b;--c-text-faint:#9a9a9a;--c-accent:#16a34a}:root{--font-mono:"JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular,
               "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
               "Helvetica Neue", Arial, "PingFang TC", "Noto Sans TC",
               "Microsoft JhengHei", sans-serif;--radius:6px;--border-w:1px;--maxw:720px;--maxw-wide:940px;--pad-x:20px;--gap-thumb:8px;--row-py:6px;--card-pad:12px;--thumb-w:192px;--thumb-h:136px;--fs-meta:0.8125rem;--fs-body:0.875rem;--fs-title:1rem;--fs-h2:1.375rem;--fs-h1:1.875rem}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--c-bg);color:var(--c-text-2);font-family:var(--font-sans);font-size:var(--fs-body);line-height:1.65;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}img{max-width:100%;height:auto;display:block}a{color:var(--c-accent);text-decoration:none}a:hover{text-decoration:underline;text-underline-offset:2px}[hidden]{display:none!important}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:600;line-height:1.3;color:var(--c-text);margin:0 0 .6em}hr{border:0;border-top:var(--border-w)solid var(--c-border);margin:1.5rem 0}::selection{background:var(--c-accent);color:var(--c-bg)}.site{min-height:100dvh;display:flex;flex-direction:column}.wrap{width:100%;max-width:var(--maxw-wide);margin-inline:auto;padding-inline:var(--pad-x)}.site-main{flex:1 0 auto;padding-block:32px}.site-header{position:sticky;top:0;z-index:100;background:var(--c-bg);border-bottom:var(--border-w)solid var(--c-border);transition:background .2s ease,border-color .2s ease,box-shadow .2s ease}.site-header.is-stuck{background:color-mix(in srgb,var(--c-bg) 58%,transparent);-webkit-backdrop-filter:blur(16px)saturate(180%);backdrop-filter:blur(16px)saturate(180%);border-bottom-color:color-mix(in srgb,var(--c-border) 55%,transparent);box-shadow:0 1px color-mix(in srgb,var(--c-text) 9%,transparent)inset,0 12px 32px -18px rgba(0,0,0,.5)}@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.site-header.is-stuck{background:color-mix(in srgb,var(--c-bg) 92%,transparent)}}@media(prefers-reduced-motion:reduce){.site-header{transition:none}}.site-header .wrap{display:flex;align-items:center;flex-wrap:wrap;gap:12px 18px;min-height:56px;padding-block:8px}.site-brand{font-family:var(--font-mono);font-weight:600;color:var(--c-text);white-space:nowrap}.site-brand:hover{text-decoration:none}.site-nav{display:flex;flex-wrap:wrap;gap:4px 16px;margin-inline-start:auto;font-family:var(--font-mono);font-size:var(--fs-meta)}.site-nav a{color:var(--c-text-dim)}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--c-accent);text-decoration:none}.header-tools{display:flex;align-items:center;gap:6px;flex:none}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;background:0 0;border:var(--border-w)solid var(--c-border);border-radius:var(--radius);color:var(--c-text-dim);cursor:pointer}.icon-btn svg{display:block}.icon-btn:hover{color:var(--c-accent);border-color:var(--c-accent)}.nav-toggle{display:none}.header-search{position:relative}.search-panel{position:absolute;inset-inline-end:0;top:calc(100% + 8px);width:min(360px,78vw);padding:8px;background:var(--c-card);border:var(--border-w)solid var(--c-border);border-radius:var(--radius);z-index:50}.search-input{width:100%;box-sizing:border-box;padding:7px 9px;background:var(--c-bg);color:var(--c-text);border:var(--border-w)solid var(--c-border);border-radius:4px;font-family:var(--font-sans);font-size:var(--fs-body)}.search-input:focus{outline:none;border-color:var(--c-accent)}.search-results{list-style:none;margin:6px 0 0;padding:0;max-height:52vh;overflow-y:auto}.search-result{display:block;padding:6px;border-radius:4px;color:inherit}.search-result:hover{background:var(--c-bg);text-decoration:none}.search-result__title{display:block;font-family:var(--font-mono);font-size:var(--fs-body);color:var(--c-text)}.search-result__summary{display:block;font-size:var(--fs-meta);color:var(--c-text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-empty{padding:6px;color:var(--c-text-faint)}.site-footer{border-top:var(--border-w)solid var(--c-border);color:var(--c-text-faint);font-size:var(--fs-meta)}.site-footer .wrap{padding-block:24px;display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 16px}.site-footer a{color:var(--c-text-dim)}.footer-nav{display:flex;gap:16px}.footer-author{font-family:var(--font-mono);color:var(--c-text-dim)}.footer-copyright p{margin:0}.phase-placeholder{border:1px dashed var(--c-border);border-radius:var(--radius);padding:var(--card-pad);color:var(--c-text-dim);font-family:var(--font-mono);font-size:var(--fs-meta)}.article-content{max-width:var(--maxw)}.article-content :where(figure){margin:1.5rem 0}.article-content :where(figcaption){margin-top:.4rem;color:var(--c-text-faint);font-size:var(--fs-meta)}.article-content :where(img){border-radius:var(--radius)}.article-content :where(pre){overflow-x:auto;border:var(--border-w)solid var(--c-border);border-radius:var(--radius);padding:var(--card-pad)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.page-lede{margin:0 0 20px;color:var(--c-text-dim);font-size:var(--fs-body)}.home-intro,.list-intro{color:var(--c-text-dim)}.list-head{margin-bottom:14px}.list-head h1{margin:0;font-size:var(--fs-h1)}.work-list{list-style:none;margin:0;padding:0}.work-row{padding:14px 0}.work-row__link{position:relative;display:flex;gap:16px;align-items:stretch;color:inherit}.work-row__thumb{flex:none;width:var(--thumb-w);min-height:var(--thumb-h);border-radius:var(--radius);overflow:hidden;background:var(--c-card);border:var(--border-w)solid var(--c-border)}.work-row__thumb img{width:100%;height:100%;object-fit:cover}.work-row__body{flex:auto;min-width:0;min-height:var(--thumb-h);display:flex;flex-direction:column;gap:4px;padding-top:2px}.work-row__title{font-family:var(--font-mono);font-size:var(--fs-title);font-weight:600;line-height:1.35;color:var(--c-text)}.work-row__title-link{color:var(--c-text)}.work-row__title-link::after{content:"";position:absolute;inset:0;z-index:0}.work-row__title-link:hover{color:var(--c-accent);text-decoration:none}.work-row__ext{color:var(--c-text-faint);font-weight:400}.work-row__cats{position:relative;z-index:1;display:flex;flex-wrap:wrap;gap:6px}.work-row__cat{font-family:var(--font-mono);font-size:var(--fs-meta);line-height:1.6;color:var(--c-accent);border:var(--border-w)solid var(--c-border);border-radius:var(--radius);padding:1px 7px}.work-row__cat:hover{border-color:var(--c-accent);text-decoration:none}.work-row__summary{color:var(--c-text-dim);font-size:var(--fs-body);line-height:1.55;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.work-row__foot{margin-top:auto;display:flex;flex-direction:column;gap:4px;padding-top:6px}.work-row__tags{position:relative;z-index:1;display:flex;flex-wrap:wrap;gap:4px 10px;font-family:var(--font-mono);font-size:var(--fs-meta)}.work-row__tag{color:var(--c-text-dim)}.work-row__tag:hover{color:var(--c-accent);text-decoration:none}.work-row__meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text-faint)}.work-row__meta .project-dates{color:var(--c-text-faint)}.work-row.is-highlight .work-row__title-hl{padding:1px 8px;color:var(--c-text);background:linear-gradient( to bottom,transparent 8%,color-mix(in srgb,var(--c-accent) 38%,transparent) 8%,color-mix(in srgb,var(--c-accent) 38%,transparent) 94%,transparent 94% );border-radius:6px 12px 8px 10px/10px 8px 12px 6px;-webkit-box-decoration-break:clone;box-decoration-break:clone}.more-link{display:inline-block;margin-top:18px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-accent)}.pagination{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:6px;margin-top:28px;padding-top:16px;border-top:var(--border-w)solid var(--c-border)}.pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 8px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text-dim);border:var(--border-w)solid var(--c-border);border-radius:var(--radius)}.pagination__btn:hover{color:var(--c-accent);border-color:var(--c-accent);text-decoration:none}.pagination__btn.is-current{color:var(--c-bg);background:var(--c-accent);border-color:var(--c-accent)}.pagination__btn.is-disabled{opacity:.35;pointer-events:none}.term-cloud{display:flex;flex-wrap:wrap;gap:8px}.term-chip{display:inline-flex;align-items:baseline;gap:6px;padding:5px 10px;font-family:var(--font-mono);font-size:var(--fs-body);color:var(--c-text-dim);border:var(--border-w)solid var(--c-border);border-radius:var(--radius)}.term-chip:hover{color:var(--c-accent);border-color:var(--c-accent);text-decoration:none}.term-chip__count{font-size:var(--fs-meta);color:var(--c-text-faint)}.empty{color:var(--c-text-dim)}.single{width:100%;max-width:var(--maxw);margin-inline:auto;padding-inline:var(--pad-x)}.single-head{margin-bottom:4px}.single-cats{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.chip{font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-accent);border:var(--border-w)solid var(--c-border);border-radius:var(--radius);padding:2px 8px;line-height:1.7}.chip:hover{border-color:var(--c-accent);text-decoration:none}.single-title{margin:0 0 10px;font-size:var(--fs-h1);line-height:1.25;color:var(--c-text)}.single-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text-faint)}.single-meta__sep{color:var(--c-border)}.single-meta__ext{color:var(--c-text-dim)}.single-meta .project-dates{color:var(--c-text-faint)}.article-content{color:var(--c-text-2);font-size:.9375rem;line-height:1.75;word-wrap:break-word}.article-content>:first-child{margin-top:0}.article-content>:last-child{margin-bottom:0}.article-content p{margin:0 0 1.1em}.article-content a{color:var(--c-accent);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}.article-content strong{color:var(--c-text)}.article-content h1,.article-content h2,.article-content h3,.article-content h4{color:var(--c-text);line-height:1.35;margin:1.8em 0 .7em}.article-content h2{font-size:var(--fs-h2);padding-bottom:.3em;border-bottom:var(--border-w)solid var(--c-border)}.article-content h3{font-size:1.15rem}.article-content h4{font-size:1rem}.article-content ul,.article-content ol{margin:0 0 1.1em;padding-inline-start:1.4em}.article-content li{margin:.3em 0}.article-content li::marker{color:var(--c-text-faint)}.article-content blockquote{margin:1.2em 0;padding:.2em 0 .2em 1em;border-left:3px solid var(--c-border);color:var(--c-text-dim)}.article-content hr{margin:2em 0}.article-content>hr:last-child{display:none}.article-content :not(pre)>code{font-family:var(--font-mono);font-size:.85em;background:var(--c-card);border:var(--border-w)solid var(--c-border);border-radius:4px;padding:.12em .4em}.article-content pre{margin:1.3em 0;overflow-x:auto;background:var(--c-card);border:var(--border-w)solid var(--c-border);border-radius:var(--radius);padding:var(--card-pad);font-size:.85rem;line-height:1.6}.article-content pre code{font-family:var(--font-mono);background:0 0;border:0;padding:0}.article-content figure{margin:1.6em 0;text-align:center}.article-content figure img,.article-content .article-img{margin-inline:auto;border:var(--border-w)solid var(--c-border);border-radius:var(--radius)}.article-content.img-zoom-ready .article-img{cursor:zoom-in}.article-content figcaption{margin-top:.5em;text-align:center;color:var(--c-text-faint);font-size:var(--fs-meta)}html.lightbox-open{overflow:hidden}.lightbox{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:clamp(16px,4vw,48px);background:color-mix(in srgb,#000 84%,transparent);cursor:zoom-out;overscroll-behavior:contain;animation:lightbox-in .12s ease-out}.lightbox__img{max-width:100%;max-height:100%;width:auto;height:auto;border:var(--border-w)solid var(--c-border);border-radius:var(--radius);background:var(--c-bg)}@keyframes lightbox-in{from{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.lightbox{animation:none}}.article-content table{width:100%;border-collapse:collapse;margin:1.3em 0;font-size:.9em}.article-content th,.article-content td{border:var(--border-w)solid var(--c-border);padding:6px 10px;text-align:start}.article-content th{background:var(--c-card);font-family:var(--font-mono)}.article-content dl{margin:0 0 1.1em}.article-content dt{font-family:var(--font-mono);color:var(--c-text);margin-top:.8em}.article-content dd{margin:.2em 0 0 1.2em;color:var(--c-text-dim)}.single-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:34px;padding-top:16px;border-top:var(--border-w)solid var(--c-border)}.tag{font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text-dim)}.tag:hover{color:var(--c-accent);text-decoration:none}.error-page{padding-block:64px 96px;text-align:center}.error-page .error-code{font-family:var(--font-mono);font-size:3rem;color:var(--c-accent);margin:0 0 4px}.error-page h1{font-size:var(--fs-h2);margin:0 0 8px}.error-page p{color:var(--c-text-dim);margin:0 0 20px}@media(max-width:640px){:root{--fs-h1:1.5rem;--pad-x:16px}.site-header .wrap{gap:10px 12px}.site-nav{order:10;flex-basis:100%;margin-inline-start:0;flex-direction:column;gap:2px;display:none;padding-top:8px;border-top:var(--border-w)solid var(--c-border);font-size:var(--fs-body)}.site-nav[data-open=true]{display:flex}.nav-toggle{display:inline-flex}.header-tools{margin-inline-start:auto}.work-row__link{flex-direction:column;gap:10px}.work-row__thumb{width:100%;height:auto;aspect-ratio:192/136}.work-row__body{min-height:0}.work-row__foot{margin-top:12px;padding-top:0}.work-row.is-highlight .work-row__title-hl{margin-inline-start:0}.pagination{gap:8px}.article-content{font-size:.9375rem}.article-content h2{font-size:1.2rem}}@media(min-width:641px){.nav-toggle{display:none}}.single{position:relative}.article-content :where(h2,h3,h4){scroll-margin-top:84px}.toc-toggle{position:fixed;right:16px;top:68px;z-index:101;display:inline-flex;align-items:center;gap:6px;padding:9px 14px;font:inherit;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text);background:var(--c-card);border:var(--border-w)solid var(--c-border);border-radius:999px;cursor:pointer}.toc-toggle:hover{border-color:var(--c-accent)}.toc-backdrop{position:fixed;inset:0;z-index:98;background:rgba(0,0,0,.5)}.toc-panel{position:fixed;left:0;right:0;top:57px;z-index:99;max-height:calc(70dvh - 57px);overflow-y:auto;padding:16px var(--pad-x)20px;background:var(--c-bg);border-bottom:var(--border-w)solid var(--c-border);border-radius:0 0 12px 12px;font-size:var(--fs-body);transform:translateY(-100%);visibility:hidden;transition:transform .2s ease,visibility 0s linear .2s}.toc[data-open=true] .toc-panel{transform:none;visibility:visible;transition:transform .2s ease}@media(prefers-reduced-motion:reduce){.toc-panel{transition:none}}.toc-title{margin-bottom:8px;font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--c-text-faint)}.toc-panel ul{list-style:none;margin:0;padding:0}.toc-panel ul ul{padding-inline-start:14px}.toc-panel a{display:block;padding:6px 0 6px 10px;color:var(--c-text-dim);border-inline-start:2px solid var(--c-border);line-height:1.4}.toc-panel a:hover{color:var(--c-text)}.toc-panel a.is-active{color:var(--c-accent);border-inline-start-color:var(--c-accent)}@media(min-width:1240px){.toc{position:absolute;top:0;bottom:0;left:calc(100% + 8px);width:220px}.toc-toggle,.toc-backdrop{display:none}.toc-panel{position:sticky;top:88px;z-index:auto;max-height:calc(100dvh - 120px);padding:0;background:0 0;border:0;border-radius:0;font-size:var(--fs-meta);transform:none;visibility:visible}.toc-panel a{padding-block:4px}}@media print{.site-header,.site-footer,.search-panel,.single-tags,.toc{display:none}.single,.wrap{max-width:none}}