:root{--bg:#f3efe6;--paper:#fbf8f2;--ink:#1b1814;--muted:#5e584f;--line:#d8d0c3;--accent:#8a2e1d;--forest:#214c3b;--alert:#9b1c1c;--code-bg:#f6f1e8;--chip:#ece6da;--serif:"Noto Serif TC", "Source Han Serif TC", "Songti TC", serif;--sans:"Noto Sans TC", "PingFang TC", "Microsoft JhengHei", "Noto Sans", sans-serif;--mono:"IBM Plex Mono", "SFMono-Regular", ui-monospace, monospace;--measure:42rem;--wide:52rem}*,:before,:after{box-sizing:border-box}html{color-scheme:light;background:var(--bg)}html:focus-within{scroll-behavior:smooth}body{min-height:100vh;color:var(--ink);background:var(--bg);font-family:var(--sans);text-rendering:optimizelegibility;margin:0;font-size:1.0625rem;line-height:1.85}a{color:var(--accent);text-underline-offset:.18em;text-decoration-thickness:1px}a:hover{color:var(--ink)}img,svg{max-width:100%;height:auto}:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.skip-link{z-index:20;background:var(--ink);color:var(--paper);padding:.4rem .7rem;text-decoration:none;position:absolute;top:-3.5rem;left:1rem}.skip-link:focus{top:.7rem}.site-header,.site-footer{width:min(var(--wide), calc(100% - 2rem));margin-inline:auto}.site-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:baseline;gap:1rem;padding:1.4rem 0 1.1rem;display:flex}.logo{font-family:var(--sans);letter-spacing:.04em;color:var(--ink);white-space:nowrap;font-size:1.05rem;font-weight:700;text-decoration:none}.nav{gap:1.1rem;font-size:.95rem;display:flex}.nav a{color:var(--muted);text-decoration:none}.nav a:hover,.nav a[aria-current=page]{color:var(--ink)}.site-footer{border-top:1px solid var(--line);color:var(--muted);margin-top:3rem;padding:2.5rem 0 2.8rem;font-size:.9rem}.wrap{width:min(var(--measure), calc(100% - 2rem));margin-inline:auto;padding:2.4rem 0 1rem}.wrap-wide{width:min(var(--wide), calc(100% - 2rem));margin-inline:auto;padding:2.4rem 0 1rem}h1,h2,h3,.lede{font-family:var(--serif);font-weight:700;line-height:1.4}h1{letter-spacing:.02em;margin:0 0 .8rem;font-size:clamp(1.8rem,3.4vw,2.4rem)}h2{margin:2.4rem 0 .8rem;padding-top:.4rem;font-size:1.4rem}h3{margin:1.6rem 0 .5rem;font-size:1.12rem}p{margin:0 0 1rem}.lede{color:var(--muted);margin-bottom:1.6rem;font-size:1.15rem;font-weight:600}.meta{color:var(--muted);margin-bottom:1.6rem;font-size:.92rem}.chip-row{flex-wrap:wrap;gap:.4rem;margin:0 0 1.2rem;display:flex}.chip{background:var(--chip);color:var(--muted);border-radius:999px;padding:.1rem .55rem;font-size:.8rem;display:inline-block}.home-hero{padding-top:3rem}.tutorial-list,.upcoming-list{margin:0 0 2rem;padding:0;list-style:none}.tutorial-card{border-top:1px solid var(--line);color:inherit;padding:1.1rem 0 1.2rem;text-decoration:none;display:block}.tutorial-card:hover .tutorial-title{color:var(--accent)}.tutorial-title{font-family:var(--serif);margin:0 0 .35rem;font-size:1.25rem;font-weight:700}.tutorial-desc,.upcoming-list p{color:var(--muted);margin:0}.upcoming-list li{border-top:1px solid var(--line);padding:.85rem 0}.upcoming-kicker{letter-spacing:.08em;color:var(--muted);margin-bottom:.15rem;font-size:.8rem}.article-body h2:first-child{margin-top:.5rem}.article-body ul,.article-body ol{margin:0 0 1.1rem;padding-left:1.3rem}.article-body li+li{margin-top:.25rem}.article-body table{border-collapse:collapse;width:100%;margin:0 0 1.2rem;font-size:.95rem}.article-body th,.article-body td{border:1px solid var(--line);text-align:left;vertical-align:top;padding:.45rem .6rem}.article-body th{background:var(--chip);font-weight:500}.table-wrap,.diagram-wrap,.code-wrap{margin:0 0 1.3rem;overflow-x:auto}.diagram-wrap{background:var(--paper);border:1px solid var(--line);padding:.8rem}.filename{font-family:var(--mono);color:var(--muted);margin:0 0 .35rem;font-size:.8rem}.code-wrap pre{border:1px solid var(--line);margin:0;padding:1rem 1.1rem;font-size:.82rem;line-height:1.55;overflow-x:auto;background:var(--code-bg)!important}.callout{background:var(--paper);border:1px solid var(--line);border-left:3px solid var(--accent);margin:0 0 1.3rem;padding:.85rem 1rem .7rem}.callout p:last-child{margin-bottom:0}.checklist{background:var(--paper);border:1px solid var(--line);padding:.9rem 1rem .7rem 1.9rem}.toc{background:var(--paper);border:1px solid var(--line);margin:0 0 2rem;padding:.9rem 1rem}.toc h2{font-size:.95rem;font-family:var(--sans);margin:0 0 .4rem;padding:0;font-weight:500}.toc ol{margin:0;padding-left:1.2rem}.toc a{color:var(--ink);text-decoration:none}.toc a:hover{color:var(--accent)}.download-list a{font-family:var(--mono);font-size:.9rem}.not-found{padding-top:4rem}.affiliate-slot{border:1px dashed var(--line);background:var(--paper);color:var(--muted);margin:2.4rem 0 0;padding:.85rem 1rem;font-size:.9rem}.affiliate-slot p{margin:0}.group-label{letter-spacing:.08em;color:var(--muted);margin:2rem 0 .4rem;font-size:.8rem}.tutorial-list .meta{margin:.35rem 0 0}
