:root{--bg:#f6f7f9;--fg:#16213a;--muted:#566176;--line:#d9dee7;--card:#fff;--accent:#1b4fd6;--accent-soft:#e9eefb;--ok:#137a3f;--ok-bg:#e4f3ea;--bad:#c62828;--bad-bg:#fcebeb;--code-bg:#eceff4;--mark:#ffe14d;--mark-soft:#fff6c2;--tip-bg:var(--mark-soft);--tip-line:#d9b300;--warn-bg:#fff3f2;--warn-line:#c62828;--caution-bg:#fff6d6;--caution-line:#d9a300;--note-bg:#eef0f4;--note-line:#8a94a6;--marker-todo:#7b8599;--btn-bg:#16213a;--btn-fg:#fff;--mono:ui-monospace, "Cascadia Mono", Consolas, "Courier New", monospace;color:var(--fg);background:var(--bg);font-family:system-ui,-apple-system,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:17px;line-height:1.7}@media (prefers-color-scheme:dark){:root{--bg:#0e1522;--fg:#e6eaf2;--muted:#a3aec2;--line:#27324a;--card:#151e2e;--accent:#8fb0ff;--accent-soft:#1a2742;--ok:#6fd08c;--ok-bg:#12301f;--bad:#ff8f87;--bad-bg:#3a1b1e;--code-bg:#1b2538;--mark:#ffce4066;--mark-soft:#ffce4024;--tip-line:#c9a227;--warn-bg:#2e1a1d;--warn-line:#ff8f87;--caution-bg:#3a2c12;--caution-line:#c9a227;--note-bg:#19233a;--note-line:#55627c;--marker-todo:#7c89a6;--btn-bg:#e6eaf2;--btn-fg:#0e1522}}*{box-sizing:border-box}:root{accent-color:var(--accent);scrollbar-color:var(--note-line) transparent}::selection{background:var(--mark);color:var(--fg)}h1,h2,h3{text-wrap:balance}.lesson-body p,.lesson-body li,.prompt p,.prompt li{text-wrap:pretty}body{margin:0}a{color:var(--accent);text-underline-offset:3px}code{background:var(--code-bg);font-size:.92em;font-family:var(--mono);border-radius:3px;padding:.1em .35em}pre{background:var(--code-bg);border:1px solid var(--line);border-radius:4px;padding:12px 14px;line-height:1.55;overflow-x:auto}pre code{background:0 0;padding:0;font-size:.9em}h1,h2,h3{line-height:1.3}h1{font-weight:800}table{border-collapse:collapse;width:100%;margin:1em 0}th,td{border:1px solid var(--line);text-align:left;vertical-align:top;padding:8px 10px}th{background:var(--note-bg)}td code,th code{overflow-wrap:anywhere}.lesson-body{overflow-wrap:break-word}:focus-visible{outline:2px solid var(--fg);outline-offset:2px;box-shadow:0 0 0 5px var(--mark);border-radius:3px}.marker{border:2px solid var(--marker-todo);vertical-align:-.1em;background:0 0;flex:none;width:.8rem;height:.8rem;display:inline-block}.marker[data-kind=lesson]{border-radius:50%}.marker[data-kind=exercise]{border-radius:2px}.marker[data-state=done]{background:var(--fg);border-color:var(--fg)}.marker[data-state=next]{background:var(--mark);border-color:var(--fg)}.site-header{background:var(--bg);border-bottom:1px solid var(--line);z-index:10;align-items:center;gap:28px;padding:10px 24px;display:flex;position:sticky;top:0}.brand{color:var(--fg);align-items:center;gap:10px;font-weight:800;text-decoration:none;display:inline-flex}.brand:before{content:"";border:2px solid var(--fg);background:var(--mark);border-radius:50%;width:.7em;height:.7em}.site-nav{gap:18px;display:flex}.site-nav a{color:var(--muted);padding:2px 4px;text-decoration:none;transition:color .15s}.site-nav a:hover{color:var(--fg)}.site-nav a[aria-current=page]{color:var(--fg);background:linear-gradient(transparent 58%, var(--mark) 58%);font-weight:600}#app{max-width:1180px;margin:0 auto;padding:28px 24px 64px}.crumb{color:var(--muted);margin:0 0 4px;font-size:.9rem}.btn{font:inherit;border:1px solid var(--line);background:var(--card);color:var(--fg);cursor:pointer;border-radius:6px;padding:6px 14px;font-size:.95rem;font-weight:500;text-decoration:none;transition:border-color .15s,background-color .15s;display:inline-block}.btn:hover:not(:disabled){border-color:var(--fg)}.btn:disabled{opacity:.55;cursor:default}.btn-primary{background:var(--btn-bg);border-color:var(--btn-bg);color:var(--btn-fg)}.btn-primary:hover:not(:disabled){border-color:var(--btn-bg);opacity:.88}.btn-small{padding:2px 10px;font-size:.85rem;font-weight:400}.badge{background:var(--note-bg);color:var(--muted);border-radius:99px;padding:1px 10px;font-size:.8rem;display:inline-block}.badge.done{background:var(--ok-bg);color:var(--ok)}.lesson{max-width:42rem;margin:0 auto}.lesson-body{line-height:1.85}.lesson-body h1{margin-top:.2em;font-size:2rem}.lesson-body h2{border-top:1px solid var(--line);margin-top:2.2em;padding-top:.9em;font-size:1.4rem}.lesson-body h3{margin-top:1.8em;font-size:1.1rem}.lesson-actions{margin:2.2em 0 1em}.pager{border-top:1px solid var(--line);justify-content:space-between;gap:12px;margin-top:1.5em;padding-top:1em;display:flex}.pager a{max-width:48%;font-weight:500}.callout{border:1px solid var(--note-line);background:var(--note-bg);border-radius:2px;margin:1.4em 0;padding:10px 16px;line-height:1.75}.callout>:last-child{margin-bottom:0}.callout-title{width:fit-content;margin-bottom:4px;font-weight:700}.callout-tip{border-color:var(--tip-line);background:var(--tip-bg)}.callout-tip .callout-title{background:linear-gradient(transparent 50%, var(--mark) 50%);margin-left:-.3em;padding:0 .3em}.callout-warning{border-color:var(--warn-line);background:var(--warn-bg)}.callout-warning .callout-title{color:var(--bad);-webkit-text-decoration:underline wavy var(--bad) 1.5px;text-decoration:underline wavy var(--bad) 1.5px;text-underline-offset:5px}.callout-more{background:0 0;border-style:dashed}.callout-more>summary{cursor:pointer;font-weight:700}.try{border:1px solid var(--line);background:var(--card);border-radius:4px;margin:1.4em 0;overflow:hidden}.try-label{background:var(--note-bg);border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:6px 12px;font-size:.9rem;font-weight:600;display:flex}.try-body{grid-template-columns:1fr 1fr;min-height:180px;display:grid}.try-editor{border-right:1px solid var(--line);min-width:0}.try-editor .cm-editor{height:100%;max-height:360px;font-size:14px}.try-preview{background:#fff;min-width:0}.try-preview .preview-frame{border:0;width:100%;height:100%;min-height:180px;display:block}.try-js,.try-dom,.try-react{border:1px solid var(--line);background:var(--card);border-radius:4px;margin:1.4em 0;overflow:hidden}.try-actions{gap:8px;display:inline-flex}.try-js .try-label,.try-dom .try-label,.try-react .try-label{gap:8px}.try-js .try-label .btn,.try-dom .try-label .btn,.try-react .try-label .btn{white-space:nowrap;flex:none}.try-stack{grid-template-columns:1fr;min-width:0;display:grid}.try-js .try-editor{border-right:0;border-bottom:1px solid var(--line)}.try-js .try-output{border:0;border-radius:0;height:auto;min-height:60px;max-height:220px}.try-dom .try-body,.try-react .try-body{border-bottom:1px solid var(--line)}.try-console-label{color:var(--muted);background:var(--note-bg);border-top:1px solid var(--line);padding:4px 12px;font-size:.85rem}.try-dom .try-console,.try-react .try-console{border:0;border-radius:0;height:auto;min-height:48px;max-height:160px}.try-error{color:var(--bad);background:var(--bad-bg);border-radius:3px;margin-top:4px;padding:4px 8px}.exercise{grid-template-columns:minmax(280px,5fr) 7fr;align-items:stretch;gap:0;display:grid}.ex-left{min-width:0;padding-right:28px}.ex-right{border-left:1px solid var(--line);min-width:0;padding-left:28px}@media (width>=861px){.exercise{align-items:start}.ex-right{max-height:calc(100vh - 80px);position:sticky;top:64px;overflow-y:auto}}.ex-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.prompt h1{margin-top:.3em;font-size:1.5rem}.ex-actions{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 14px;display:flex}.quick-status{font-variant-numeric:tabular-nums;margin-left:auto;font-size:.9rem;font-weight:700}.quick-status.ok{color:var(--ok)}.quick-status.fail{color:var(--bad)}.notice{background:var(--caution-bg);border:1px solid var(--caution-line);border-radius:2px;padding:6px 10px;font-size:.9rem}.result-summary{margin:.6em 0;font-size:1.05rem;font-weight:700}.result-summary.ok{color:var(--ok)}.result-summary.fail{color:var(--bad)}.results-box{margin-top:1.4em}.results{margin:0;padding:0;list-style:none}.results li{border:1px solid #0000;border-radius:2px;gap:10px;margin-bottom:6px;padding:8px 12px;display:flex}.results li.ok{background:var(--ok-bg);border-color:var(--ok)}.results li.fail{background:var(--bad-bg);border-color:var(--bad)}.results li.bonus{background:var(--note-bg);border-color:var(--line)}.results li.ok .mark{color:var(--ok)}.results li.fail .mark{color:var(--bad)}.results .mark{flex:none;width:1.2em;font-weight:700}.results .hint{color:var(--muted);font-size:.9rem}.results .detail{color:var(--muted);font-size:.85rem;font-family:var(--mono);white-space:pre-wrap;word-break:break-word}.solution-panel{border:1px dashed var(--note-line);border-radius:2px;margin-top:1em;padding:8px 14px}.solution-file h3{margin-bottom:0;font-size:.95rem}.ex-tabs{gap:4px;display:flex}.ex-tab{font:inherit;border:1px solid var(--line);background:var(--note-bg);color:var(--muted);cursor:pointer;border-top:2px solid #0000;border-bottom:0;border-radius:4px 4px 0 0;padding:6px 12px;font-size:.9rem}.ex-tab:hover{color:var(--fg)}.ex-tab.active{background:var(--card);color:var(--fg);border-top-color:var(--fg);font-weight:600}.ex-panes{border:1px solid var(--line);background:var(--card)}.editor-pane .cm-editor{height:clamp(260px,44vh,520px);font-size:14px}.editor-pane .cm-scroller{overflow:auto}.ex-preview-label{color:var(--muted);margin:14px 0 4px;font-size:.9rem;font-weight:600}.ex-preview{border:1px solid var(--line);background:#fff;height:clamp(220px,32vh,360px)}.ex-preview .preview-frame{border:0;width:100%;height:100%;display:block}.desktop-hint{background:var(--tip-bg);border:1px solid var(--tip-line);border-radius:2px;padding:8px 12px;display:none}.hero,.course-map,.week-card{max-width:52rem;margin-left:auto;margin-right:auto}.hero{margin-bottom:32px}.hero h1{margin:0 0 .25em;font-size:2.5rem}.lead{color:var(--muted);max-width:40em;font-size:1.05rem}.continue-btn{border-radius:6px;padding:10px 22px;font-size:1rem;font-weight:600}.course-map{border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin-bottom:40px;padding:20px 0 14px}.map-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px 28px;display:grid}.map-label{justify-content:space-between;margin:0 0 8px;font-size:.95rem;font-weight:700;display:flex}.map-label span{color:var(--muted);font-variant-numeric:tabular-nums;font-weight:400}.map-dots{flex-wrap:wrap;gap:6px;display:flex}.map-dot{width:.9rem;height:.9rem;transition:transform .15s}.map-dot:hover{transform:scale(1.3)}.map-legend{color:var(--muted);flex-wrap:wrap;align-items:center;gap:4px 8px;margin:16px 0 0;font-size:.85rem;display:flex}.map-legend .marker{width:.7rem;height:.7rem;margin-left:10px}.map-legend .marker:first-child{margin-left:0}.map-total{font-variant-numeric:tabular-nums;margin-left:auto}@keyframes ink-in{0%{opacity:0;transform:scale(.2)}to{opacity:1;transform:none}}.map-animate .map-dot[data-state=done]{animation:.25s ease-out both ink-in;animation-delay:calc(var(--i) * 14ms)}.map-part{letter-spacing:.12em;color:var(--muted);grid-column:1/-1;margin:0;font-size:.8rem}.map-part:not(:first-child){margin-top:8px}.part-title{letter-spacing:.14em;max-width:52rem;color:var(--muted);margin:0 auto 14px;font-size:.85rem;font-weight:700}.part-title:not(:first-of-type){margin-top:56px}.week-card{border-top:2px solid var(--fg);margin-bottom:20px;padding-top:12px;scroll-margin-top:64px}.week-card>summary{cursor:pointer;align-items:baseline;gap:12px;padding:2px 0 4px;list-style:none;display:flex}.week-card>summary::-webkit-details-marker{display:none}.week-card>summary:before{content:"▸";color:var(--muted);flex:none;width:1em;font-size:.9rem;transition:transform .15s}.week-card[open]>summary:before{transform:rotate(90deg)}.week-card h2{margin:0;font-size:1.35rem}.week-card>summary .count{margin:0 0 0 auto}.week-card .count.all-done{color:var(--ok);font-weight:600}.week-card .badge.here{color:#16213a;background:#ffe14d;font-weight:600}.week-card .summary{color:var(--muted);margin:0 0 6px 1.6em}.week-card .items{margin-bottom:12px}.map-week-btn{font:inherit;color:var(--fg);cursor:pointer;-webkit-text-decoration:underline dotted var(--note-line);text-decoration:underline dotted var(--note-line);text-underline-offset:4px;background:0 0;border:0;padding:0;font-weight:700}.map-week-btn:hover{text-decoration-style:solid}a.map-dot{text-decoration:none;display:inline-block}.week-card .planned{color:var(--muted);margin:0;font-style:italic}.count{color:var(--muted);font-variant-numeric:tabular-nums;margin:0 0 8px;font-size:.85rem}.items{margin:0;padding:0;list-style:none}.item-row{border-top:1px solid var(--line);align-items:center;gap:12px;padding:7px 4px;transition:background-color .15s;display:flex}.item-row:hover{background:var(--note-bg)}.item-row a{color:var(--fg);flex:1;text-decoration:none}.item-row a:hover{color:var(--accent);text-decoration:underline}.item-row.is-next a{background:linear-gradient(transparent 58%, var(--mark) 58%);flex:0 auto;margin-right:auto;padding:0 .2em;font-weight:700}.item-row.is-next a:hover{color:var(--fg)}.glossary-bar{border-bottom:1px solid var(--line);margin-bottom:4px;padding:4px 0 8px}.glossary-bar .glossary-count{margin:6px 0 0}.glossary-jump{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.glossary-jump:empty{display:none}.glossary-jump button{font:inherit;border:1px solid var(--line);background:var(--card);color:var(--muted);cursor:pointer;border-radius:99px;padding:1px 10px;font-size:.82rem}.glossary-jump button:hover{color:var(--fg);border-color:var(--fg)}.glossary-group{scroll-margin-top:64px}.glossary-search{width:100%;max-width:420px;font:inherit;border:1px solid var(--line);background:var(--card);color:var(--fg);border-radius:6px;padding:8px 12px}.glossary-search:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:none}.glossary-count{color:var(--muted);font-size:.9rem}.glossary-group h2{margin-top:1.6em;font-size:1.1rem}.glossary-entry{border-top:1px solid var(--line);padding:8px 0}.glossary-entry .term{font-weight:700}.glossary-entry .zh{color:var(--muted);margin-left:6px}.glossary-entry p{margin:2px 0 0}.progress-page{max-width:780px;margin:0 auto}.progress-actions{flex-wrap:wrap;align-items:center;gap:12px;margin:1em 0;display:flex}.import-error{color:var(--bad);background:var(--bad-bg);border:1px solid var(--bad);border-radius:2px;padding:8px 12px}.import-ok{color:var(--ok);background:var(--ok-bg);border:1px solid var(--ok);border-radius:2px;padding:8px 12px}.not-found,.fatal-error{text-align:center;max-width:640px;margin:48px auto}.fatal-error{text-align:left;background:var(--bad-bg);border:1px solid var(--bad);border-radius:2px;padding:16px 24px}.boxmodel{color:#1f2933;max-width:520px;margin:1.2em auto .4em;font-size:14px;line-height:1.4}.bm{border-radius:6px;outline:3px solid #0000;padding:30px 22px 22px;position:relative}.bm-label{font-weight:700;position:absolute;top:6px;left:10px}.bm-label small{font-weight:400;display:none}.bm:hover:not(:has(.bm:hover)){outline-color:#1f2933}.bm:hover:not(:has(.bm:hover))>.bm-label small{display:inline}.bm-margin{background:#f9cc9d}.bm-border{background:#fde68a}.bm-padding{background:#c7e8b5}.bm-content{text-align:center;background:#a9cdf5;border-radius:4px;padding:18px;font-weight:700}.bm-caption{text-align:center;color:var(--muted);margin-top:0;font-size:.9rem}.anatomy{justify-content:center;align-items:flex-start;margin:1em 0 .3em;font-size:1.1rem;display:flex}.a-part{border-bottom:3px solid var(--accent);flex-direction:column;align-items:center;padding:6px 10px;display:flex}.a-part small{color:var(--muted);margin-top:4px;font-size:.78rem}.a-content{border-bottom-color:#2b9a54}.anatomy-note{text-align:center;color:var(--muted)}.filetree{font-family:var(--mono);background:var(--code-bg);border:1px solid var(--line);border-radius:4px;margin:1em 0;padding:10px 16px;font-size:.92rem}.filetree ul{border-left:1px solid var(--note-line);margin:0;padding-left:1.4em;list-style:none}.filetree>ul{border-left:0;padding-left:0}.filetree li{margin:2px 0}.filetree .note{color:var(--accent);font-family:system-ui,PingFang SC,Microsoft YaHei,sans-serif}.fx-demo{margin:1em 0}.fx-label{margin-top:8px;font-size:.9rem}.fx-row{background:var(--accent-soft);border-radius:4px;margin:4px 0 10px;padding:8px;display:flex}.fx-row i{text-align:center;background:var(--accent);color:#fff;border-radius:4px;width:38px;height:38px;margin:0 4px;font-style:normal;line-height:38px;display:block}.lesson-toc{display:none}@media (width>=1240px){.lesson{position:relative}.lesson-toc{width:13rem;max-height:calc(100vh - 120px);font-size:.88rem;line-height:1.5;display:block;position:fixed;top:84px;left:calc(50% + 21rem + 36px);overflow-y:auto}.lesson-toc p{color:var(--muted);margin:0 0 8px;font-weight:700}.lesson-toc ol{border-left:1px solid var(--line);margin:0;padding:0;list-style:none}.lesson-toc button{text-align:left;width:100%;font:inherit;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:2px;padding:4px 8px 4px 12px;display:block}.lesson-toc button:hover{color:var(--fg)}.lesson-toc button[aria-current=true]{color:var(--fg);background:var(--mark-soft);box-shadow:inset 0 -2px 0 var(--mark);font-weight:600}}@media (pointer:coarse){.btn{min-height:40px}.btn-small{min-height:32px}.map-dots{gap:10px}.map-dot{width:1.15rem;height:1.15rem}.item-row{padding-top:10px;padding-bottom:10px}.glossary-jump button{min-height:32px}}@media (width<=860px){#app{padding:16px 14px 48px}.exercise{grid-template-columns:1fr}.ex-left{padding-right:0}.ex-right{border-left:0;padding-left:0}.try-body{grid-template-columns:1fr}.try-editor{border-right:0;border-bottom:1px solid var(--line)}.desktop-hint{display:block}.site-header{gap:14px;padding:8px 14px}.hero h1{font-size:2rem}.map-grid{grid-template-columns:repeat(2,1fr)}.map-total{flex-basis:100%;margin-left:0}}.review-box{margin:1em 0}.review-box h3{margin:0 0 6px;font-size:1rem}.review-text{white-space:pre-wrap;background:var(--accent-soft);border:1px solid var(--accent);border-radius:2px;padding:10px 14px}.review-wait{color:var(--muted);margin:0}.review-error{color:var(--bad);background:var(--bad-bg);border:1px solid var(--bad);border-radius:2px;margin:0;padding:8px 12px}.output-panel,.console-panel{font-family:var(--mono);background:var(--code-bg);border:1px solid var(--line);white-space:pre-wrap;word-break:break-word;border-radius:2px;padding:6px 10px;font-size:.88rem;overflow:auto}.output-panel{height:200px}.console-panel{height:120px}.out-line{padding:1px 0}.out-line[data-level=warn]{color:var(--fg);background:var(--caution-bg)}.out-line[data-level=error]{color:var(--bad);background:var(--bad-bg)}.out-empty{color:var(--muted);font-family:inherit}.text-hint{color:var(--muted);margin:.4em 0}.solution-text{white-space:pre-wrap}.pack-download{margin:.2em 0 .6em}.local-steps{margin:.6em 0 1em;padding-left:1.4em}.local-steps li{margin:.5em 0}.local-steps pre{margin:.4em 0 0}@media (prefers-color-scheme:dark){.cm-editor{color:#16213a;background:#fbfbfc}.cm-editor .cm-gutters{color:#566176;background:#eef0f4;border-right:1px solid #d9dee7}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
