:root{--ink:#151a1e;--soft-ink:#364149;--paper:#f6f1e6;--deep-paper:#ebe4d5;--surface:#fffdf7;--steel:#245b73;--dark-steel:#173f51;--orange:#d96535;--soft-orange:#f9e4d8;--line:#c8d0d4;--dark-line:#8e9aa1;--success:#276749;--danger:#a33d31;--code:#11181c;--code-text:#e7ecef;--header:64px;--course:272px;--source:320px;--display:"Noto Serif SC",serif;--body:"Noto Sans SC",sans-serif;--mono:"JetBrains Mono",monospace}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-height:100vh;color:var(--ink);font-family:var(--body);background:linear-gradient(90deg,#151a1e09 1px,transparent 1px),linear-gradient(#151a1e09 1px,transparent 1px),var(--paper);background-size:24px 24px}button,input,textarea{font:inherit}button{color:inherit}a{color:var(--steel)}:focus-visible{outline:3px solid #d9653573;outline-offset:2px}.skip-link{position:fixed;z-index:1000;left:1rem;top:-5rem;padding:.75rem 1rem;color:#fff;background:var(--ink)}.skip-link:focus{top:.5rem}.svg-sprite{position:absolute;width:0;height:0;overflow:hidden}svg{width:1.2rem;height:1.2rem;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.eyebrow{font:600 .68rem/1 var(--mono);letter-spacing:.14em;color:var(--orange)}
.topbar{height:var(--header);position:fixed;inset:0 0 auto;z-index:100;display:grid;grid-template-columns:var(--course) minmax(180px,1fr) auto;align-items:center;gap:1rem;padding:0 1rem;color:#fff;background:var(--ink);border-bottom:1px solid #30383e}.brand{display:flex;align-items:center;gap:.75rem;color:#fff;text-decoration:none}.brand-mark{display:grid;place-items:center;width:36px;height:36px;border:1px solid #73818a;font:700 .78rem var(--mono)}.brand strong,.brand small{display:block;white-space:nowrap}.brand strong{font:700 .92rem var(--display)}.brand small{margin-top:.15rem;color:#aeb9bf;font-size:.66rem}.topbar-progress{display:flex;align-items:center;justify-content:center;gap:.75rem;color:#c6d0d5;font:.72rem var(--mono)}.progress-track{width:min(34vw,360px);height:3px;background:#465158;overflow:hidden}.progress-track span{display:block;width:0;height:100%;background:var(--orange);transition:width .25s}.topbar-actions{display:flex;gap:.25rem}.icon-button,.text-button{border:0;background:transparent;color:inherit;cursor:pointer;min-width:40px;min-height:40px;display:inline-flex;align-items:center;justify-content:center}.text-button{gap:.45rem;padding:0 .7rem;font-size:.78rem;color:#d7dfe3}.icon-button:hover,.text-button:hover{background:#ffffff14}
.app-shell{min-height:100vh;padding-top:var(--header)}.course-rail,.source-rail{position:fixed;top:var(--header);bottom:0;z-index:60;background:var(--surface);overflow-y:auto}.course-rail{left:0;width:var(--course);border-right:1px solid var(--line);display:flex;flex-direction:column}.source-rail{right:0;width:var(--source);border-left:1px solid var(--line);transform:translateX(100%);transition:transform .25s;padding:1.25rem}body.sources-open .source-rail{transform:none}.rail-heading,.source-heading{display:flex;align-items:center;justify-content:space-between;gap:1rem}.rail-heading{padding:1.35rem 1rem 1rem;border-bottom:1px solid var(--line)}.rail-heading h1,.source-heading h2{margin:.25rem 0 0;font:700 1.08rem var(--display)}#course-navigation{flex:1;padding:.8rem 0}.phase-label{padding:.8rem 1rem .35rem;color:#66737a;font:600 .65rem var(--mono);letter-spacing:.08em}.module-nav{border-block:1px solid transparent}.module-nav.is-active{background:#eef1ed;border-color:var(--line)}.module-button,.lesson-button{width:100%;border:0;background:transparent;text-align:left;cursor:pointer}.module-button{padding:.7rem 1rem;display:grid;grid-template-columns:30px 1fr auto;gap:.55rem;align-items:center}.module-number{color:var(--orange);font:600 .68rem var(--mono)}.module-title{font-size:.8rem;font-weight:600;line-height:1.45}.module-count{color:#7b878d;font:.65rem var(--mono)}.lesson-list{display:none;padding:0 0 .5rem 2.45rem}.module-nav.is-active .lesson-list{display:block}.lesson-button{position:relative;padding:.42rem 1rem;color:#536169;font-size:.72rem;line-height:1.35;border-left:1px solid var(--line)}.lesson-button:before{content:"";position:absolute;left:-3px;top:50%;width:5px;height:5px;border-radius:50%;background:var(--dark-line)}.lesson-button.is-current{color:var(--dark-steel);font-weight:700;border-left-color:var(--steel)}.lesson-button.is-current:before{background:var(--orange)}.lesson-button.is-complete:after{content:"✓";float:right;color:var(--success)}.rail-footer{position:sticky;bottom:0;padding:.7rem;background:var(--surface);border-top:1px solid var(--line);display:grid;grid-template-columns:repeat(3,1fr);gap:.25rem}.rail-action{display:flex;flex-direction:column;align-items:center;gap:.25rem;padding:.45rem .2rem;border:0;background:transparent;cursor:pointer;color:#59666d;font-size:.64rem}.rail-action:hover{color:var(--steel);background:#edf1f1}
.learning-stage{min-height:calc(100vh - var(--header));margin-left:var(--course);transition:margin-right .25s}body.sources-open .learning-stage{margin-right:var(--source)}#app-view{min-height:calc(100vh - var(--header))}.overview{padding:clamp(2rem,5vw,5rem);max-width:1260px;margin:auto}.overview-header{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(260px,.65fr);gap:clamp(2rem,6vw,5rem);align-items:end;padding-bottom:2.2rem;border-bottom:3px solid var(--ink)}.overview-index{color:var(--orange);font:600 .72rem var(--mono);letter-spacing:.14em}.overview h2{font:900 clamp(2.25rem,5vw,4.6rem)/1.12 var(--display);margin:.7rem 0 1.25rem;max-width:15ch}.overview-lead{font-size:1.06rem;line-height:1.9;color:var(--soft-ink);max-width:62ch}.overview-facts{border-left:1px solid var(--dark-line);padding-left:1.5rem}.fact{display:flex;justify-content:space-between;gap:1rem;padding:.8rem 0;border-bottom:1px solid var(--line)}.fact strong{font:700 1.6rem var(--display)}.fact span{color:#66737a;font-size:.76rem}.phase-section{padding:2.6rem 0 1rem}.phase-section>header{display:grid;grid-template-columns:90px 1fr;align-items:baseline;gap:1rem;margin-bottom:1.2rem}.phase-section h3{margin:0;font:700 1.5rem var(--display)}.module-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.module-card{grid-column:span 4;min-height:190px;display:flex;flex-direction:column;padding:1.25rem;text-align:left;border:1px solid var(--dark-line);background:#fffdf7d1;cursor:pointer}.module-card:nth-child(3n+2){transform:translateY(1rem)}.module-card:hover{border-color:var(--steel);box-shadow:6px 6px 0 #245b731f}.module-code{color:var(--orange);font:600 .68rem var(--mono)}.module-card h4{font:700 1.05rem/1.5 var(--display);margin:.6rem 0}.module-card p{margin:0 0 1rem;color:#5d6970;font-size:.78rem;line-height:1.65}.module-card footer{margin-top:auto;display:flex;justify-content:space-between;font:.66rem var(--mono);color:#68757c}
.lesson-page{max-width:1120px;margin:auto;padding:clamp(1.5rem,4vw,4rem) clamp(1.25rem,5vw,5rem) 7rem}.lesson-header{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2rem;padding-bottom:1.7rem;border-bottom:3px solid var(--ink)}.lesson-breadcrumb{color:var(--orange);font:600 .7rem var(--mono);letter-spacing:.08em}.lesson-header h1{font:900 clamp(2rem,4.5vw,3.75rem)/1.2 var(--display);margin:.65rem 0 1rem;max-width:18ch}.lesson-summary{color:var(--soft-ink);font-size:1rem;line-height:1.85;max-width:65ch}.lesson-position{align-self:start;min-width:92px;padding:.8rem;border:1px solid var(--dark-line);text-align:right}.lesson-position strong{display:block;font:700 1.55rem var(--mono)}.lesson-position span{color:#69767d;font:.64rem var(--mono)}.lesson-block{display:grid;grid-template-columns:148px minmax(0,1fr);gap:2rem;padding:2rem 0;border-bottom:1px solid var(--line)}.block-label{color:var(--steel);font:600 .7rem var(--mono);letter-spacing:.08em}.block-body h2{font:700 1.45rem/1.4 var(--display);margin:-.3rem 0 1rem}.block-body h3{font:700 1rem var(--display);margin:1.5rem 0 .5rem}.block-body p,.block-body li{font-size:.94rem;line-height:1.9}.block-body ul,.block-body ol{padding-left:1.3rem}.definition{padding:1.25rem 1.4rem;border-left:4px solid var(--steel);background:#edf2f1;font-size:1rem;line-height:1.9}.explain-grid{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line)}.explain-cell{padding:1rem;min-height:112px}.explain-cell:nth-child(odd){border-right:1px solid var(--line)}.explain-cell:nth-child(n+3){border-top:1px solid var(--line)}.explain-cell strong{display:block;color:var(--dark-steel);margin-bottom:.4rem}.explain-cell p{margin:0;font-size:.82rem;line-height:1.7}.flowline{display:flex;flex-wrap:wrap;align-items:stretch;gap:.6rem;margin:1.2rem 0}.flow-node{flex:1 1 140px;padding:.9rem;border:1px solid var(--dark-line);background:var(--surface)}.flow-node b{display:block;color:var(--dark-steel);font-family:var(--display);margin-bottom:.3rem}.flow-arrow{align-self:center;color:var(--orange);font:700 1.3rem var(--mono)}.callout{margin:1rem 0;padding:1rem 1.2rem;background:var(--soft-orange);border:1px solid #e3ad8f}.callout strong{color:#863916}.comparison{width:100%;border-collapse:collapse;margin:1rem 0}.comparison th,.comparison td{padding:.7rem .85rem;border:1px solid var(--line);text-align:left;font-size:.8rem;line-height:1.55}.comparison th{color:var(--dark-steel);background:#e8eeed}pre{overflow:auto;margin:1rem 0;padding:1.1rem 1.25rem;color:var(--code-text);background:var(--code);border-left:4px solid var(--orange);font:.82rem/1.72 var(--mono);white-space:pre}code{font-family:var(--mono)}p code,li code,td code{padding:.1rem .32rem;color:#8a3517;background:var(--soft-orange);font-size:.9em}.output{padding:1rem;color:#c8f3dd;background:#17231e;border-left:4px solid #3c9b70;font:.78rem/1.6 var(--mono);white-space:pre-wrap}
.practice{padding:1.4rem;background:#fff7df;border:1px solid #dfc984}.practice h2{margin-top:0}details.hint,details.answer{margin-top:.8rem;border:1px solid var(--dark-line);background:var(--surface)}details summary{padding:.8rem 1rem;cursor:pointer;font-weight:700;color:var(--dark-steel)}details>div{padding:0 1rem 1rem}.check-options{display:grid;gap:.55rem;margin:1rem 0}.check-option{display:flex;gap:.65rem;padding:.75rem;border:1px solid var(--line);background:var(--surface);cursor:pointer}.check-feedback{min-height:1.5rem;font-size:.82rem;font-weight:600}.lab-panel{margin-top:1rem;border:1px solid #53626a;background:var(--code);color:var(--code-text)}.lab-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.7rem;padding:.75rem 1rem;border-bottom:1px solid #39464d}.lab-status{display:flex;align-items:center;gap:.5rem;font:.7rem var(--mono);color:#aebbc1}.status-dot{width:8px;height:8px;border-radius:50%;background:#7f8b91}.status-dot.ready{background:#54b384}.status-dot.busy{background:#e59a54;animation:pulse 1s infinite}@keyframes pulse{50%{opacity:.35}}.lab-actions{display:flex;gap:.4rem}.lab-button{display:inline-flex;align-items:center;gap:.4rem;border:1px solid #5b6970;background:#263239;color:#fff;padding:.45rem .7rem;cursor:pointer;font-size:.72rem}.lab-button.primary{border-color:var(--orange);background:var(--orange)}.code-editor{display:block;width:100%;min-height:260px;resize:vertical;border:0;padding:1rem 1.2rem;color:#e7ecef;background:#11181c;font:.8rem/1.7 var(--mono);tab-size:4}.lab-output{min-height:100px;max-height:320px;overflow:auto;padding:1rem 1.2rem;color:#c9f0da;background:#17231e;border-top:1px solid #39464d;font:.76rem/1.65 var(--mono);white-space:pre-wrap}.lab-output.error{color:#ffc3bb;background:#2a1715}.lab-output table{border-collapse:collapse;width:max-content;min-width:100%;color:var(--code-text);white-space:nowrap}.lab-output th,.lab-output td{padding:.5rem .65rem;border:1px solid #44535b;text-align:left}.lab-output th{color:#f2b08e}.lab-output img{max-width:100%;background:#fff}.lesson-footer{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:2rem}.nav-button{display:inline-flex;align-items:center;gap:.5rem;max-width:42%;padding:.75rem 1rem;border:1px solid var(--dark-line);background:var(--surface);cursor:pointer;font-size:.78rem}.nav-button.next{margin-left:auto;color:#fff;background:var(--dark-steel);border-color:var(--dark-steel)}.complete-button{border:0;padding:.78rem 1rem;color:#fff;background:var(--orange);cursor:pointer;font-weight:700}.complete-button.is-complete{background:var(--success)}
.source-heading{padding-bottom:1rem;border-bottom:2px solid var(--ink)}.source-card{padding:1rem 0;border-bottom:1px solid var(--line)}.source-type{color:var(--orange);font:600 .64rem var(--mono)}.source-card h3{font:700 .9rem/1.5 var(--display);margin:.35rem 0}.source-card p{color:#59666d;font-size:.73rem;line-height:1.65}.source-card a{font-size:.7rem;font-weight:700}.source-policy{margin-top:1.2rem;padding:.8rem;color:#66737a;background:var(--deep-paper);font-size:.68rem;line-height:1.6}.search-dialog{width:min(720px,calc(100vw - 2rem));max-height:calc(100vh - 2rem);border:1px solid var(--dark-line);padding:0;background:var(--surface);box-shadow:12px 12px 0 #151a1e40}.search-dialog::backdrop{background:#151a1ea6}.search-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.2rem;border-bottom:1px solid var(--line)}.search-header label{font:700 1rem var(--display)}#search-input{width:calc(100% - 2.4rem);margin:1.2rem;padding:.9rem 1rem;border:1px solid var(--dark-line);background:var(--paper)}.search-results{padding:0 1.2rem 1.2rem;overflow-y:auto;max-height:540px}.search-result{width:100%;padding:.9rem 0;border:0;border-bottom:1px solid var(--line);background:transparent;text-align:left;cursor:pointer}.search-result strong{display:block;font-family:var(--display)}.search-result span{color:#68757c;font-size:.7rem}.toast{position:fixed;z-index:200;right:1rem;bottom:1rem;transform:translateY(140%);padding:.8rem 1rem;color:#fff;background:var(--ink);font-size:.78rem;transition:transform .22s}.toast.show{transform:none}.drawer-backdrop{position:fixed;z-index:50;inset:var(--header) 0 0;background:#151a1e8c}.mobile-only{display:none}
body.presentation{overflow:hidden;background:var(--ink)}body.presentation .topbar,body.presentation .course-rail,body.presentation .source-rail{display:none}body.presentation .app-shell{padding:0}body.presentation .learning-stage{margin:0;height:100vh;display:grid;place-items:center}body.presentation .lesson-page{width:min(1180px,96vw,calc(92vh * 16 / 9));height:min(92vh,calc(96vw * 9 / 16));overflow:auto;background:var(--surface);padding:3rem 4rem 5rem}body.presentation .lesson-footer{position:sticky;bottom:-4rem;padding:.8rem 0;background:linear-gradient(transparent,var(--surface) 25%)}
@media(max-width:1100px){.topbar{grid-template-columns:auto 1fr auto}.mobile-only{display:inline-flex}.desktop-only{display:none}.course-rail{transform:translateX(-100%);transition:transform .25s;box-shadow:12px 0 30px #151a1e33}body.course-open .course-rail{transform:none}.learning-stage{margin-left:0}body.sources-open .learning-stage{margin-right:0}.source-rail{box-shadow:-12px 0 30px #151a1e33}.overview{padding:2rem}}
@media(max-width:760px){.topbar{padding:0 .5rem;gap:.25rem}.brand small,.topbar-progress{display:none}.brand strong{font-size:.78rem}.source-rail{width:min(90vw,340px)}.overview{padding:1.25rem}.overview-header{grid-template-columns:1fr;gap:1.25rem}.overview h2{font-size:2.35rem}.overview-facts{border-left:0;border-top:1px solid var(--dark-line);padding:1rem 0 0}.module-card{grid-column:span 12;min-height:160px}.module-card:nth-child(3n+2){transform:none}.phase-section>header{grid-template-columns:62px 1fr}.lesson-page{padding:1.2rem 1rem 6rem}.lesson-header{grid-template-columns:1fr;gap:1rem}.lesson-position{justify-self:start;text-align:left}.lesson-block{grid-template-columns:1fr;gap:.65rem;padding:1.5rem 0}.explain-grid{grid-template-columns:1fr}.explain-cell:nth-child(odd){border-right:0}.explain-cell:nth-child(n+2){border-top:1px solid var(--line)}.lesson-footer{display:grid;grid-template-columns:1fr 1fr}.nav-button{max-width:none}.complete-button{grid-column:1/-1;grid-row:1}}
@media print{.topbar,.course-rail,.source-rail,.lesson-footer,.lab-actions{display:none!important}.app-shell{padding:0}.learning-stage{margin:0!important}.lesson-page{max-width:none;padding:1cm}body{background:#fff}}

.status-dot.error{background:#d96858}.lab-status>div{display:grid;gap:.1rem}.lab-status strong{color:#fff}.lab-status small{color:#9fadb4}.lab-schema{margin:0;padding:.7rem 1rem;color:#aebbc1;background:#1c272d;border-top:1px solid #39464d;font:.7rem/1.6 var(--mono)}.output-muted{color:#91a098}.output-line,.output-error{white-space:pre-wrap}.output-error{color:#ffc3bb}.lab-plot{display:block;margin:.8rem 0}.result-table-wrap{max-width:100%;overflow:auto;margin:.5rem 0}
