:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--paper:#eef1f8;--paper-2:#fff;--ink:#18203a;--ink-soft:#5b6685;--ink-faint:#5b6478;--blueprint:#2f5fd0;--blueprint-700:#234aa8;--blueprint-soft:#9fb2e6;--good:#1f9d68;--good-bg:#e6f6ee;--good-ink:#15704a;--bad:#d6455f;--bad-bg:#fdeaed;--bad-ink:#a92e45;--warn:#b9791b;--line:#d6dded;--grid-minor:#2f5fd012;--grid-major:#2f5fd021;--radius:12px;--radius-sm:8px;--shadow:0 1px 2px #18203a0f, 0 8px 24px #18203a0f;--mono:ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace;--sans:ui-sans-serif, system-ui, -apple-system, "SF Pro Text", "Hiragino Sans", "Yu Gothic UI", "Segoe UI", sans-serif}*{box-sizing:border-box}html,body{height:100%;margin:0}body{font-family:var(--sans);color:var(--ink);background-color:var(--paper);background-image:linear-gradient(var(--grid-minor) 1px, transparent 1px), linear-gradient(90deg, var(--grid-minor) 1px, transparent 1px), linear-gradient(var(--grid-major) 1px, transparent 1px), linear-gradient(90deg, var(--grid-major) 1px, transparent 1px);-webkit-font-smoothing:antialiased;background-size:8px 8px,8px 8px,64px 64px,64px 64px}#app{flex-direction:column;min-height:100%;display:flex}.topbar{border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:10;background:#ffffffb3;align-items:center;gap:12px;padding:14px 20px;display:flex;position:sticky;top:0}.brand{letter-spacing:.02em;cursor:pointer;color:inherit;background:0 0;border:none;align-items:center;gap:10px;padding:0;font-size:1.05rem;font-weight:700;display:flex}.brand img{width:28px;height:28px}.brand small{color:var(--ink-faint);letter-spacing:0;font-weight:500}.topbar-spacer{flex:1}.crumb{min-width:0;color:var(--ink-soft);align-items:center;gap:12px;font-size:.9rem;display:flex}.crumb__back{color:var(--blueprint);flex:none;padding:8px 4px;font-weight:600;text-decoration:none}.crumb__back:hover{text-decoration:underline}.crumb__path{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.crumb__pos{font-family:var(--mono);color:var(--ink-faint);flex:none;font-size:.82rem}.crumb b{color:var(--ink)}.btn{font:inherit;border:1px solid var(--line);background:var(--paper-2);color:var(--ink);border-radius:var(--radius-sm);cursor:pointer;padding:9px 16px;font-weight:600;transition:border-color .15s,background .15s,transform 50ms}.btn:hover{border-color:var(--blueprint-soft)}.btn:active{transform:translateY(1px)}.btn--primary{background:var(--blueprint);border-color:var(--blueprint);color:#fff}.btn--primary:hover{background:var(--blueprint-700);border-color:var(--blueprint-700)}.btn--ghost{background:0 0}.btn:disabled{opacity:.5;cursor:not-allowed}main{flex:1;width:100%;max-width:1280px;margin:0 auto;padding:22px 20px 48px}.hidden{display:none!important}.intro{margin:4px 2px 22px}.intro h1{letter-spacing:.01em;margin:0 0 6px;font-size:1.7rem}.intro p{color:var(--ink-soft);max-width:62ch;margin:0;line-height:1.6}.track-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;display:grid}.track-card{background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);text-align:left;flex-direction:column;gap:8px;padding:16px 16px 14px;display:flex}.track-card__head{align-items:center;gap:10px;display:flex}.track-card__emoji{font-size:1.5rem;line-height:1}.track-card__title{margin:0;font-size:1.05rem;font-weight:700}.track-card__summary{color:var(--ink-soft);font-size:.9rem;line-height:1.5}.lesson-list{flex-direction:column;gap:2px;margin:2px 0 4px;display:flex}.lesson-row{text-align:left;font:inherit;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;min-height:40px;padding:6px 8px;font-size:.9rem;transition:background .12s;display:flex}.lesson-row:hover{background:#eef2fb}.lesson-row__mark{border:1.5px solid var(--ink-faint);width:16px;height:16px;color:var(--ink-faint);border-radius:50%;flex:none;place-items:center;font-size:.72rem;font-weight:700;display:grid}.lesson-row.is-done .lesson-row__mark{border-color:var(--good);background:var(--good);color:#fff}.lesson-row:focus-visible,.crumb__back:focus-visible{outline:2px solid var(--blueprint);outline-offset:1px}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.resume{background:var(--paper-2);border:1px solid var(--line);border-left:3px solid var(--blueprint);border-radius:var(--radius);box-shadow:var(--shadow);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 16px;margin:0 0 18px;padding:14px 16px;display:flex}.resume__text{flex-direction:column;gap:2px;min-width:0;display:flex}.resume__count{color:var(--ink-soft);font-size:.82rem}.resume__next{font-weight:600}.track-card__meta{color:var(--ink-faint);align-items:center;gap:8px;margin-top:auto;font-size:.82rem;display:flex}.track-card__bar{background:#e7ebf5;border-radius:999px;flex:1;height:6px;overflow:hidden}.track-card__bar>i{background:var(--blueprint);border-radius:999px;height:100%;transition:width .3s;display:block}.lesson{grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);align-items:start;gap:18px;display:grid}.panel{background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.load-error{max-width:62ch;padding:18px}.load-error h1{margin:0 0 8px;font-size:1.3rem}.load-error h1:focus{outline:none}.load-error p{color:var(--ink-soft);margin:0 0 14px;line-height:1.6}.lesson__doc{padding:18px 18px 16px}.lesson__heading{flex-wrap:wrap;align-items:baseline;gap:4px 10px;margin:0 0 8px;display:flex}.lesson__doc h1{margin:0;font-size:1.3rem}.lesson__done{color:var(--good-ink);background:var(--good-bg);border:1px solid #bfe6d2;border-radius:999px;padding:2px 10px;font-size:.78rem;font-weight:600}.lesson__doc h1:focus{outline:none}.lesson__doc .explain{color:var(--ink);font-size:.96rem;line-height:1.7}.lesson__doc .explain code{font-family:var(--mono);color:var(--blueprint-700);background:#eef2fb;border:1px solid #e0e7f7;border-radius:5px;padding:1px 5px;font-size:.88em}.lesson__doc .explain p{margin:0 0 10px}.task{border-left:3px solid var(--blueprint);border-radius:0 var(--radius-sm) var(--radius-sm) 0;background:#f3f6fd;margin-top:12px;padding:10px 14px;font-weight:600}.task .task__label{letter-spacing:.12em;text-transform:uppercase;color:var(--blueprint);margin-bottom:3px;font-size:.74rem;display:block}.mdn-link{color:var(--blueprint);margin-top:10px;font-size:.86rem;text-decoration:none;display:inline-block}.mdn-link:hover{text-decoration:underline}.editor-wrap{border:1px solid var(--line);border-radius:var(--radius-sm);background:#fbfcfe;margin-top:14px;position:relative;overflow:hidden}.editor-label{letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);justify-content:space-between;gap:8px;padding:8px 12px 0;font-size:.74rem;display:flex}.editor-stack{font-family:var(--mono);font-size:13.5px;line-height:1.6;position:relative}.editor-stack>pre,.editor-stack>textarea{font:inherit;white-space:pre;tab-size:2;border:0;margin:0;padding:10px 12px 14px;overflow:auto}.editor-stack>pre{pointer-events:none;color:var(--ink);z-index:0;position:absolute;inset:0}.editor-stack>textarea{z-index:1;resize:vertical;color:#0000;width:100%;min-height:180px;caret-color:var(--blueprint);background:0 0;outline:none;display:block;position:relative}.editor-stack>textarea::selection{background:#2f5fd033}.editor-wrap:focus-within{border-color:var(--blueprint);box-shadow:0 0 0 2px #2f5fd040}.editor-shortcut{letter-spacing:0;text-transform:none}@media (hover:none) and (pointer:coarse){.editor-shortcut{display:none}}.tok-sel{color:#234aa8;font-weight:600}.tok-prop{color:#0b7285}.tok-val{color:#1f6f43}.tok-num{color:#b5530f}.tok-punc{color:var(--ink-faint)}.tok-comment{color:#97a2ba;font-style:italic}.tok-atrule{color:#8a3ffc;font-weight:600}.actions{flex-wrap:wrap;justify-content:space-between;gap:10px 24px;margin-top:14px;display:flex}.actions__main,.actions__sub{flex-wrap:wrap;gap:10px;display:flex}.undo{border-radius:var(--radius-sm);border:1px solid var(--line);background:#f3f6fd;flex-wrap:wrap;align-items:center;gap:4px 12px;margin-top:12px;padding:8px 12px;font-size:.9rem;display:flex}.undo__btn{font:inherit;color:var(--blueprint);cursor:pointer;background:0 0;border:0;min-height:40px;padding:8px 4px;font-weight:700;text-decoration:underline}.banner{border-radius:var(--radius-sm);margin-top:14px;padding:12px 14px;font-weight:600;display:none}.banner--show{display:block}.banner--pass{background:var(--good-bg);color:var(--good-ink);border:1px solid #bfe6d2}.banner--fail{background:var(--bad-bg);color:var(--bad-ink);border:1px solid #f3c6cf}.banner ul{margin:6px 0 0;padding-left:18px;font-weight:500}.hints{flex-direction:column;gap:8px;margin-top:12px;display:flex}.hint{border-radius:var(--radius-sm);color:#6b5320;background:#fffaf0;border:1px solid #f0e2c4;padding:9px 12px;font-size:.9rem}.viz{flex-direction:column;gap:14px;display:flex;position:sticky;top:76px}.viz__stage{border-radius:var(--radius);border:1px solid var(--line);box-shadow:var(--shadow);aspect-ratio:4/3;background:#f7f9fd;position:relative;overflow:hidden}.viz__stage canvas{display:block;width:100%!important;height:100%!important}.viz__badge{letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);border:1px solid var(--line);background:#ffffffb3;border-radius:999px;padding:3px 10px;font-size:.72rem;position:absolute;top:10px;left:12px}.viz__note{border:1px dashed var(--line);border-radius:var(--radius);color:var(--ink-soft);background:#f7f9fd;margin:0;padding:12px 14px;font-size:.85rem;line-height:1.6}.preview{border-radius:var(--radius);border:1px solid var(--line);background:var(--paper-2);box-shadow:var(--shadow);overflow:hidden}.preview__head{border-bottom:1px solid var(--line);color:var(--ink-faint);letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:10px;padding:8px 12px;font-size:.78rem;display:flex}.preview__viewport{font-family:var(--mono);text-transform:none;letter-spacing:0;margin-left:auto}.preview__frame{background:repeating-conic-gradient(#f3f5fa 0% 25%,#fff 0% 50%) 50%/18px 18px;padding:14px;display:flex;position:relative;overflow:auto}.preview__frame:focus-visible{outline:2px solid var(--blueprint);outline-offset:-2px}.preview__frame iframe{background:#fff;border:0;flex:none;width:100%;height:280px;margin-inline:auto;box-shadow:0 1px #18203a14}.foot{text-align:center;color:var(--ink-faint);padding:18px;font-size:.82rem}.foot a{color:var(--ink-soft)}@media (max-width:920px){.lesson{grid-template-columns:minmax(0,1fr)}.viz{min-width:0;position:static}.preview{order:-1}}@media (max-width:600px){.topbar{padding:10px 16px}.brand small,.crumb__path{display:none}}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
