:root{
  --bg:#0a0e16; --bg2:#0f1420; --panel:#141a2a; --panel2:#1c2438; --panel3:#26304a;
  --ink:#eef2fa; --muted:#a3b0c7; --dim:#7884a0;
  --accent:#7aa2ff; --accent2:#9d7aff; --accent3:#5ec2ff; --gold:#ffd166;
  --ok:#3ecf8e; --warn:#ffb547; --err:#ff6b6b; --info:#7ad4ff;
  --code:#0a1020; --border:#2a3854; --border-soft:#1d2640;
  --shadow-sm:0 1px 2px rgba(0,0,0,.18), 0 1px 3px rgba(0,0,0,.12);
  --shadow-md:0 4px 8px rgba(0,0,0,.18), 0 2px 4px rgba(0,0,0,.10);
  --shadow-lg:0 16px 36px rgba(0,0,0,.32), 0 4px 12px rgba(0,0,0,.18);
  --shadow-glow:0 0 0 1px rgba(122,162,255,.18), 0 8px 28px rgba(122,162,255,.18);
  --rad-sm:6px; --rad:10px; --rad-lg:14px;
  --t-fast:.15s; --t-base:.25s; --t-slow:.45s;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:radial-gradient(ellipse at top, #131a2c 0%, var(--bg) 60%) fixed;color:var(--ink);font-family:'Inter',ui-sans-serif,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
::selection{background:rgba(122,162,255,.35);color:#fff}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
button{font-family:inherit}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}
.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}
.skip-link{position:absolute;left:-9999px;top:0;background:var(--accent);color:#0b0f17;padding:8px 12px;border-radius:4px;font-weight:700}
.skip-link:focus{left:8px;top:8px;z-index:100}
/* layout */
.app{display:flex;flex-direction:column;min-height:100vh}
header.topbar{background:linear-gradient(180deg,rgba(14,22,40,.95),rgba(20,28,48,.92));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--border-soft);padding:12px 20px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;position:sticky;top:0;z-index:10;box-shadow:var(--shadow-sm)}
header .brand{font-weight:800;font-size:16px;background:linear-gradient(90deg,#7aa2ff 0%,#9d7aff 60%,#ffd166 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex-shrink:1}
header .stats{display:flex;gap:10px;flex-wrap:wrap;align-items:center;flex:1}
header .stat{font-size:12px;color:var(--muted);background:rgba(28,36,56,.72);padding:6px 12px;border-radius:99px;border:1px solid var(--border-soft);white-space:nowrap;transition:all var(--t-fast)}
header .stat:hover{border-color:var(--border);background:rgba(38,48,74,.85)}
header .stat b{color:var(--ink);font-weight:700;margin-left:4px}
header .xp-bar{flex:1;min-width:160px;max-width:300px;height:8px;background:rgba(28,36,56,.6);border-radius:99px;overflow:hidden;border:1px solid var(--border-soft);position:relative}
header .xp-bar > div{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2),var(--gold));width:0%;transition:width var(--t-slow) cubic-bezier(.4,.0,.2,1);box-shadow:0 0 12px rgba(122,162,255,.5)}
header .lvl{font-size:12px;color:var(--gold);font-weight:700}
header .lvl b{font-size:14px;color:var(--gold)}
.body{display:grid;grid-template-columns:300px 1fr;flex:1}
aside{background:linear-gradient(180deg,var(--panel) 0%,var(--bg2) 100%);border-right:1px solid var(--border-soft);padding:16px;height:calc(100vh - 60px);position:sticky;top:60px;overflow-y:auto;scrollbar-width:thin;transform:none}
aside::-webkit-scrollbar{width:6px}
aside::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
aside nav.tabs{display:flex;gap:4px;margin-bottom:14px;flex-wrap:wrap;background:rgba(10,16,32,.5);padding:4px;border-radius:var(--rad);border:1px solid var(--border-soft)}
aside nav.tabs button{flex:1;min-width:54px;background:transparent;color:var(--muted);border:none;border-radius:6px;padding:7px 4px;font-size:12px;cursor:pointer;font-weight:600;letter-spacing:.01em;transition:all var(--t-fast)}
aside nav.tabs button:hover{background:rgba(122,162,255,.08);color:var(--ink)}
aside nav.tabs button.active{background:linear-gradient(180deg,var(--accent),#6a8fe8);color:#0a0e16;font-weight:700;box-shadow:0 2px 8px rgba(122,162,255,.4)}
aside .item{display:flex;justify-content:space-between;align-items:center;width:100%;text-align:left;background:transparent;border:1px solid transparent;color:var(--ink);padding:9px 11px;border-radius:8px;margin-bottom:3px;cursor:pointer;font-size:13px;transition:all var(--t-fast);position:relative}
aside .item:hover{background:rgba(38,48,74,.5);transform:translateX(2px)}
aside .item.active{background:linear-gradient(90deg,rgba(122,162,255,.15),rgba(122,162,255,.05));border-color:var(--accent);box-shadow:inset 3px 0 0 var(--accent)}
aside .item .badge{font-size:10px;padding:3px 8px;border-radius:99px;background:rgba(42,56,84,.8);color:var(--muted);white-space:nowrap;font-weight:600;transition:all var(--t-fast)}
aside .item .badge.done{background:linear-gradient(90deg,var(--ok),#2ab87a);color:#0a0e16}
aside .item .badge.locked{background:#3a2a2a;color:#aa6a6a}
aside .phase-progress{height:3px;background:rgba(28,36,56,.6);border-radius:2px;overflow:hidden;margin-top:4px}
aside .phase-progress > div{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2));transition:width var(--t-base)}
aside .tools{margin-top:14px;display:flex;gap:6px;flex-wrap:wrap}
aside button.tool{background:var(--panel2);color:var(--ink);border:1px solid var(--border);border-radius:6px;padding:6px 8px;font-size:11px;cursor:pointer}
aside button.tool:hover{background:#243049}
main{padding:32px 44px;max-width:1100px;width:100%;animation:fade-in var(--t-slow) ease-out}
@keyframes fade-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@keyframes hero-orb{0%,100%{transform:translate(0,0) scale(1)}33%{transform:translate(30px,-20px) scale(1.1)}66%{transform:translate(-20px,30px) scale(.95)}}
.hero{position:relative;background:linear-gradient(135deg,rgba(122,162,255,.12) 0%,rgba(157,122,255,.08) 50%,rgba(255,209,102,.06) 100%);border:1px solid var(--border);border-radius:var(--rad-lg);padding:24px 28px;margin-bottom:18px;overflow:hidden;box-shadow:var(--shadow-md)}
.hero::before{content:"";position:absolute;width:200px;height:200px;border-radius:50%;background:radial-gradient(circle, rgba(122,162,255,.25) 0%, transparent 70%);top:-80px;right:-60px;filter:blur(20px);animation:hero-orb 12s ease-in-out infinite}
.hero::after{content:"";position:absolute;width:160px;height:160px;border-radius:50%;background:radial-gradient(circle, rgba(255,209,102,.18) 0%, transparent 70%);bottom:-50px;left:30%;filter:blur(20px);animation:hero-orb 15s ease-in-out infinite reverse}
.hero > *{position:relative;z-index:1}
.hero h2{margin:0 0 8px;font-size:clamp(22px, 4vw, 32px)}
.hero .meta{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.hero .intro-text{color:var(--muted);font-size:15px;line-height:1.65;max-width:760px}
.hero .progress-ring{position:absolute;top:24px;right:28px;width:60px;height:60px;display:none}
@media(min-width:600px){.hero .progress-ring{display:block}}
.hero .progress-ring svg{transform:rotate(-90deg)}
.hero .progress-ring circle{fill:none;stroke-width:5}
.hero .progress-ring .track{stroke:rgba(28,36,56,.6)}
.hero .progress-ring .bar{stroke:url(#progGrad);transition:stroke-dashoffset var(--t-slow)}
.hero .progress-ring .label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:var(--ink)}
h2{margin:0 0 12px;font-size:30px;font-weight:800;letter-spacing:-.02em;background:linear-gradient(180deg,#fff,#cdd6e6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
h3{margin-top:28px;font-size:19px;color:var(--accent);font-weight:700;letter-spacing:-.01em}
h4{font-size:15px;margin-top:16px;color:var(--accent2);font-weight:700;letter-spacing:-.005em}
p{margin:8px 0}
code,pre,kbd{font-family:'JetBrains Mono','Fira Code',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-ligatures:contextual}
code{background:linear-gradient(180deg,rgba(255,209,102,.08),rgba(255,209,102,.04));padding:2px 6px;border-radius:5px;font-size:12.5px;color:#ffdb8a;border:1px solid rgba(255,209,102,.12)}
pre{background:linear-gradient(180deg,#0a1020,#070c1a);border:1px solid var(--border);border-radius:var(--rad);padding:16px;overflow-x:auto;overflow-y:hidden;font-size:13px;line-height:1.6;position:relative;box-shadow:var(--shadow-sm);scrollbar-width:thin}
pre::-webkit-scrollbar{height:8px}
pre::-webkit-scrollbar-track{background:rgba(255,255,255,.02);border-radius:0 0 var(--rad) var(--rad)}
pre::-webkit-scrollbar-thumb{background:var(--border);border-radius:99px}
pre::-webkit-scrollbar-thumb:hover{background:var(--accent)}
pre code{background:none;border:none;padding:0;color:#d3dcef;white-space:pre}
pre .copy{position:absolute;top:8px;right:8px;background:rgba(28,36,56,.85);color:var(--muted);border:1px solid var(--border);border-radius:5px;padding:4px 10px;font-size:11px;cursor:pointer;transition:all var(--t-fast);font-family:'Inter',sans-serif;font-weight:600}
pre .copy:hover{color:var(--ink);border-color:var(--accent);background:rgba(38,48,74,.95)}
pre .copy.copied{color:var(--ok);border-color:var(--ok);background:rgba(62,207,142,.15)}
/* Token highlights inside code */
pre .kw{color:#ff9ad9;font-weight:600}
pre .str{color:#ffd166}
pre .num{color:#7ad4ff}
pre .com{color:#7884a0;font-style:italic}
pre .fn{color:#7aa2ff}
/* Step-card lesson layout */
.step-card{
  position:relative;
  background:linear-gradient(180deg,var(--panel) 0%,rgba(20,26,42,.6) 100%);
  border:1px solid var(--border-soft);border-radius:var(--rad);
  padding:22px 22px 22px 70px;margin:16px 0;
  box-shadow:var(--shadow-sm);transition:border-color var(--t-base);
}
.step-card:hover{border-color:var(--border)}
.step-card > .step-num{
  position:absolute;top:20px;left:16px;
  width:38px;height:38px;border-radius:50%;
  background:linear-gradient(135deg,var(--accent),var(--accent2));
  color:#fff;font-weight:700;font-size:15px;
  display:grid;place-items:center;
  font-family:'JetBrains Mono','Fira Code',monospace;
  box-shadow:0 4px 12px rgba(122,162,255,.35);
}
.step-card h3{
  margin:0 0 10px;font-size:18px;font-weight:700;
  color:var(--accent2);background:none;-webkit-text-fill-color:initial;
  background-clip:initial;-webkit-background-clip:initial;
}
.step-card > .body{font-size:14.5px;line-height:1.7;color:var(--ink);margin-bottom:10px}
.step-card > .body p{margin:6px 0}
.step-card > .body b,.step-card > .body strong{color:var(--accent)}
.code-block{
  margin-top:12px;border:1px solid var(--border);border-radius:var(--rad);
  overflow:hidden;background:linear-gradient(180deg,#0a1020,#070c1a);
}
.code-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:8px 14px;background:rgba(255,255,255,.03);
  border-bottom:1px solid var(--border-soft);
}
.code-head .lang{
  font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700;
  color:var(--accent);letter-spacing:.05em;text-transform:uppercase;
  padding:2px 8px;border-radius:4px;background:rgba(122,162,255,.1);
  border:1px solid rgba(122,162,255,.2);
}
.code-block pre{
  border:none;border-radius:0;box-shadow:none;margin:0;padding:14px 16px;
}
.code-block .copy{position:relative;top:auto;right:auto}
@media(max-width:600px){
  .step-card{padding:18px 16px 16px 56px}
  .step-card > .step-num{left:12px;width:30px;height:30px;font-size:13px;top:18px}
}
/* Phase game (interactive widget per phase) */
.phase-game{
  background:linear-gradient(135deg,rgba(122,162,255,.06),rgba(157,122,255,.04));
  border:1px solid rgba(122,162,255,.25);
  border-radius:var(--rad);
  padding:18px 22px;margin:18px 0;
  position:relative;overflow:hidden;
}
.phase-game::before{
  content:"";position:absolute;top:-30px;right:-30px;
  width:120px;height:120px;border-radius:50%;
  background:radial-gradient(circle,rgba(122,162,255,.25),transparent 70%);
  filter:blur(20px);pointer-events:none;
}
.phase-game h3{
  margin:0 0 4px;font-size:17px;font-weight:700;
  color:var(--accent2);background:none;-webkit-text-fill-color:initial;
  background-clip:initial;-webkit-background-clip:initial;
  display:flex;align-items:center;gap:8px;
  position:relative;z-index:1;
}
.phase-game .why{
  font-size:13.5px;color:var(--muted);margin-bottom:14px;line-height:1.55;
  position:relative;z-index:1;
}
.phase-game .why b{color:var(--accent)}
.game-stage{
  background:linear-gradient(180deg,rgba(7,9,18,.55),rgba(7,9,18,.75));
  border:1px solid var(--border);border-radius:10px;
  padding:14px;position:relative;z-index:1;
}
.game-stage canvas{
  width:100%;display:block;border-radius:6px;
  background:rgba(7,9,18,.4);
}
.game-stage .hint{
  font-size:13px;color:var(--muted);margin-bottom:10px;
  display:flex;align-items:center;gap:6px;
}
.game-stage .hint b{color:var(--accent)}
.game-controls{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;align-items:center}
.game-controls .demo-slider,
.game-stage .demo-slider{
  display:inline-flex;align-items:center;gap:10px;
  background:rgba(255,255,255,.04);border:1px solid var(--border);
  padding:6px 12px;border-radius:8px;font-size:12.5px;color:var(--muted);
}
.game-controls input[type=range],
.game-stage input[type=range]{
  -webkit-appearance:none;appearance:none;
  width:110px;height:4px;
  background:rgba(255,255,255,.1);border-radius:99px;outline:none;
}
.game-controls input[type=range]::-webkit-slider-thumb,
.game-stage input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;width:14px;height:14px;border-radius:50%;
  background:var(--accent);cursor:pointer;box-shadow:0 0 0 3px rgba(122,162,255,.2);
}
.game-controls .val,
.game-stage .val{font-family:'JetBrains Mono',monospace;color:var(--accent);font-weight:600;min-width:36px;text-align:right}
.game-controls .demo-btn,
.game-stage .demo-btn{
  padding:7px 14px;border-radius:7px;
  background:linear-gradient(135deg,var(--accent),var(--accent2));color:#fff;
  border:none;font-weight:600;font-size:13px;cursor:pointer;
  font-family:inherit;transition:all .15s;
}
.game-controls .demo-btn:hover,
.game-stage .demo-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(122,162,255,.4)}
.game-controls .demo-btn.alt,
.game-stage .demo-btn.alt{
  background:rgba(255,255,255,.06);border:1px solid var(--border);
}
.game-readout{
  display:flex;gap:16px;flex-wrap:wrap;margin-top:10px;
  font-family:'JetBrains Mono',monospace;font-size:12.5px;color:var(--muted);
}
.game-readout b{color:var(--accent);font-weight:700;margin-right:4px}
.game-readout .ok{color:var(--ok)}
.game-readout .err{color:var(--err)}
#bpe-tokens .tok{
  display:inline-block;padding:5px 9px;border-radius:5px;
  font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;
  color:#0a0e16;line-height:1.2;
  animation:tok-pop .25s cubic-bezier(.16,1,.3,1);
}
@keyframes tok-pop{from{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}
.card{background:linear-gradient(180deg,var(--panel) 0%,rgba(20,26,42,.6) 100%);border:1px solid var(--border-soft);border-radius:var(--rad);padding:18px;margin:14px 0;box-shadow:var(--shadow-sm);transition:all var(--t-base)}
.card:hover{border-color:var(--border)}
.tag{display:inline-block;padding:3px 10px;border-radius:99px;background:rgba(28,36,56,.6);color:var(--muted);font-size:11px;margin-right:6px;font-weight:600;letter-spacing:.02em;border:1px solid var(--border-soft)}
.tag.gold{background:rgba(255,209,102,.10);color:var(--gold);border:1px solid rgba(255,209,102,.4)}
ul.checks{list-style:none;padding:0}
ul.checks li{padding:6px 0;border-bottom:1px solid var(--border);display:flex;gap:10px;align-items:flex-start}
.quiz{background:linear-gradient(180deg,var(--panel2),var(--panel));border:1px solid var(--border);border-radius:var(--rad);padding:18px;margin:14px 0;box-shadow:var(--shadow-sm)}
.quiz .q{font-weight:700;margin-bottom:10px;font-size:15px;letter-spacing:-.005em}
.quiz .options label{display:block;background:rgba(20,26,42,.7);border:1px solid var(--border-soft);border-radius:8px;padding:10px 14px;margin:6px 0;cursor:pointer;transition:all var(--t-fast)}
.quiz .options label:hover{border-color:var(--accent);background:rgba(122,162,255,.05);transform:translateX(2px)}
.quiz .options input{margin-right:10px;accent-color:var(--accent)}
.quiz textarea{width:100%;min-height:90px;background:var(--code);border:1px solid var(--border);color:var(--ink);border-radius:8px;padding:10px;font-family:inherit;font-size:14px;transition:border-color var(--t-fast)}
.quiz textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(122,162,255,.18)}
.quiz .actions{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}
.quiz button{background:linear-gradient(180deg,var(--accent),#6a8fe8);color:#0a0e16;border:none;border-radius:8px;padding:9px 16px;font-weight:700;cursor:pointer;font-size:13px;transition:all var(--t-fast);box-shadow:0 2px 6px rgba(122,162,255,.3)}
.quiz button:hover{transform:translateY(-1px);box-shadow:0 4px 10px rgba(122,162,255,.45)}
.quiz button.ghost{background:transparent;color:var(--accent);border:1px solid var(--accent);box-shadow:none}
.quiz button.ghost:hover{background:rgba(122,162,255,.1)}
.quiz .feedback{margin-top:8px;padding:10px;border-radius:6px;font-size:13px}
.quiz .feedback.ok{background:rgba(62,207,142,.12);border:1px solid var(--ok)}
.quiz .feedback.bad{background:rgba(255,107,107,.10);border:1px solid var(--err)}
.quiz .feedback.info{background:rgba(122,162,255,.10);border:1px solid var(--accent)}
.scorebar{height:10px;background:var(--panel);border-radius:6px;overflow:hidden;margin-top:6px}
.scorebar > div{height:100%;background:var(--ok)}
.lesson-toc{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 20px}
.lesson-toc a{background:var(--panel2);border:1px solid var(--border);padding:4px 10px;border-radius:99px;font-size:12px;color:var(--ink)}
.callout{border-left:4px solid var(--accent);padding:8px 14px;background:rgba(122,162,255,.07);border-radius:0 8px 8px 0;margin:10px 0}
.callout.warn{border-color:var(--warn);background:rgba(255,181,71,.08)}
.callout.tester{border-color:var(--gold);background:rgba(255,209,102,.07)}
.formula{background:var(--code);padding:8px;border-radius:6px;font-family:ui-monospace,monospace;font-size:14px;display:block;margin:6px 0;color:#e8d27a;border:1px solid var(--border)}
table{width:100%;border-collapse:collapse;margin:10px 0;font-size:13px}
th,td{border:1px solid var(--border);padding:6px 10px;text-align:left}
th{background:var(--panel2)}
hr{border:none;border-top:1px solid var(--border);margin:20px 0}
.nav-bottom{display:flex;justify-content:space-between;margin-top:30px;padding-top:14px;border-top:1px solid var(--border);gap:8px;flex-wrap:wrap}
.nav-bottom button{background:var(--panel2);color:var(--ink);border:1px solid var(--border);border-radius:6px;padding:9px 14px;cursor:pointer;font-size:13px}
.nav-bottom .complete{background:var(--ok);color:#0b0f17;font-weight:700;border:none}
.nav-bottom .complete[disabled]{background:var(--panel2);color:var(--muted);cursor:not-allowed}
.xp-pop{position:fixed;right:20px;bottom:20px;background:linear-gradient(135deg,var(--gold),#ffb547);color:#0a0e16;padding:10px 18px;border-radius:99px;font-weight:700;box-shadow:0 8px 24px rgba(255,209,102,.45), 0 0 0 1px rgba(255,209,102,.3);transform:translateY(20px) scale(.9);opacity:0;transition:all var(--t-base) cubic-bezier(.4,.0,.2,1);z-index:50;font-size:13px;letter-spacing:.01em}
.xp-pop.show{transform:translateY(0) scale(1);opacity:1}
@keyframes confetti-fall{0%{transform:translateY(-100vh) rotate(0)}100%{transform:translateY(100vh) rotate(720deg)}}
.confetti{position:fixed;top:0;width:8px;height:14px;pointer-events:none;z-index:99;animation:confetti-fall 2.4s linear forwards}
/* games */
.game-card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:16px;margin:12px 0;cursor:pointer;transition:border-color .2s}
.game-card:hover{border-color:var(--accent)}
.game-card h3{margin-top:0}
.game-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.match-board{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}
.match-col{display:flex;flex-direction:column;gap:6px}
.match-item{background:var(--panel2);border:1px solid var(--border);padding:8px 10px;border-radius:6px;cursor:pointer;font-size:13px;transition:all .15s}
.match-item:hover{border-color:var(--accent)}
.match-item.selected{border-color:var(--accent);background:rgba(122,162,255,.12)}
.match-item.matched{background:rgba(62,207,142,.15);border-color:var(--ok);cursor:default;opacity:.7}
.match-item.wrong{background:rgba(255,107,107,.15);border-color:var(--err);animation:shake .3s}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-4px)}75%{transform:translateX(4px)}}
.order-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}
.order-item{background:var(--panel2);border:1px solid var(--border);padding:8px 10px;border-radius:6px;cursor:grab;font-size:13px;display:flex;align-items:center;gap:10px}
.order-item.dragging{opacity:.4}
.order-item .num{background:var(--accent);color:#0b0f17;border-radius:99px;width:22px;height:22px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}
.order-item.correct{background:rgba(62,207,142,.12);border-color:var(--ok)}
.order-item.wrong{background:rgba(255,107,107,.12);border-color:var(--err)}
.flash-card{background:var(--panel2);border:1px solid var(--border);border-radius:10px;padding:24px;text-align:center;margin:14px 0;min-height:160px;display:flex;flex-direction:column;justify-content:center;align-items:center}
.flash-card .q{font-size:18px;margin-bottom:14px}
.flash-card .opts{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:100%;max-width:500px}
.flash-card .opts button{background:var(--panel);border:1px solid var(--border);color:var(--ink);padding:10px;border-radius:6px;cursor:pointer;font-size:13px}
.flash-card .opts button:hover{border-color:var(--accent)}
.flash-card .opts button.right{background:var(--ok);color:#0b0f17;border-color:var(--ok)}
.flash-card .opts button.wrong{background:var(--err);color:#0b0f17;border-color:var(--err)}
.token-lab input{width:100%;background:var(--code);border:1px solid var(--border);color:var(--ink);border-radius:6px;padding:10px;font-size:14px;margin-bottom:10px}
.token-out{display:flex;flex-wrap:wrap;gap:4px;padding:10px;background:var(--code);border-radius:6px;border:1px solid var(--border);min-height:60px}
.token{padding:3px 8px;border-radius:4px;font-family:ui-monospace,monospace;font-size:12px;border:1px solid}
.attn-grid{display:grid;gap:2px;margin:14px 0}
.attn-cell{padding:6px;text-align:center;border-radius:4px;font-size:11px;font-family:ui-monospace,monospace}
.bar{height:18px;border-radius:4px;background:var(--accent);margin:2px 0}
.bar-row{display:grid;grid-template-columns:80px 1fr 60px;gap:8px;align-items:center;font-size:12px;margin:4px 0}
/* portfolio */
.portfolio-row{display:grid;grid-template-columns:160px 1fr 1fr 1fr 60px;gap:8px;align-items:center;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px}
.portfolio-row input{background:var(--code);border:1px solid var(--border);color:var(--ink);border-radius:4px;padding:6px;font-size:12px;width:100%}
.portfolio-row .label{color:var(--muted)}
.portfolio-row .check{background:var(--ok);color:#0b0f17;border:none;border-radius:4px;padding:6px 10px;cursor:pointer;font-weight:600;font-size:11px}
.portfolio-row .check.unchecked{background:var(--panel2);color:var(--muted)}
/* badges */
.badge-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;margin-top:12px}
.badge-card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:14px;text-align:center;opacity:.4;transition:all .2s;position:relative}
.badge-card.earned{opacity:1;border-color:var(--gold);background:linear-gradient(180deg,var(--panel),rgba(255,209,102,.08))}
.badge-card.tier-bronze.earned{border-color:#cd7f32;background:linear-gradient(180deg,var(--panel),rgba(205,127,50,.10))}
.badge-card.tier-silver.earned{border-color:#c0c0c0;background:linear-gradient(180deg,var(--panel),rgba(192,192,192,.10))}
.badge-card.tier-gold.earned{border-color:#ffd166;background:linear-gradient(180deg,var(--panel),rgba(255,209,102,.12))}
.badge-card .tier-tag{position:absolute;top:6px;right:8px;font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.badge-card.earned.tier-bronze .tier-tag{color:#cd7f32}
.badge-card.earned.tier-silver .tier-tag{color:#c0c0c0}
.badge-card.earned.tier-gold .tier-tag{color:#ffd166}
.streak-banner{background:linear-gradient(90deg,rgba(255,107,107,.15),rgba(255,181,71,.15));border:1px solid var(--err);color:var(--ink);padding:8px 14px;border-radius:8px;margin-bottom:12px;font-size:13px;display:flex;align-items:center;gap:8px}
.timer-stat{display:flex;align-items:center;gap:6px}
.timer-stat #timer-btn{transition:transform .15s}
.timer-stat #timer-btn:hover{transform:scale(1.15)}
.timer-stat.running{border-color:var(--ok)}
.timer-stat.running #timer-display{color:var(--ok);font-variant-numeric:tabular-nums}
.timer-stat.paused #timer-display{color:var(--warn);font-variant-numeric:tabular-nums}
.badge-card .icon{font-size:38px;margin-bottom:6px}
.badge-card h4{margin:4px 0;color:var(--gold)}
.badge-card p{font-size:11px;color:var(--muted);margin:0}
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin:10px 0}
.kpi{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:12px;text-align:center}
.kpi .v{font-size:26px;font-weight:700;color:var(--accent)}
.kpi .l{font-size:11px;color:var(--muted);margin-top:4px}
/* hamburger button - hidden on desktop */
.hamburger{display:none;background:transparent;border:none;cursor:pointer;width:44px;height:44px;padding:10px;border-radius:8px;flex-direction:column;justify-content:space-between;align-items:center;transition:background var(--t-fast)}
.hamburger:hover{background:rgba(122,162,255,.1)}
.hamburger span{width:22px;height:2px;background:var(--ink);border-radius:2px;transition:all var(--t-base);transform-origin:center}
.hamburger.open span:nth-child(1){transform:translateY(8px) rotate(45deg)}
.hamburger.open span:nth-child(2){opacity:0}
.hamburger.open span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}
.drawer-backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:9;backdrop-filter:blur(2px);opacity:0;transition:opacity var(--t-base)}
.drawer-backdrop.show{display:block;opacity:1}
/* mobile bottom nav (Phase 9+ feel) */
.mobile-nav{display:none;position:fixed;bottom:0;left:0;right:0;background:linear-gradient(180deg,rgba(20,26,42,.92),rgba(10,14,22,.98));backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-top:1px solid var(--border);padding:8px 12px env(safe-area-inset-bottom);z-index:8;justify-content:space-around;gap:6px;box-shadow:0 -4px 14px rgba(0,0,0,.4)}
.mobile-nav button{flex:1;background:transparent;color:var(--muted);border:none;padding:8px 6px;border-radius:8px;font-size:11px;font-weight:600;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px;min-height:48px;transition:all var(--t-fast)}
.mobile-nav button.active{color:var(--accent);background:rgba(122,162,255,.1)}
.mobile-nav button .ico{font-size:18px;line-height:1}
.mobile-nav button .badge-dot{display:inline-block;width:6px;height:6px;border-radius:99px;background:var(--err);position:absolute;top:4px;right:18px}
.mobile-nav button{position:relative}

@media(max-width:900px){
  .body{grid-template-columns:1fr}
  aside{position:fixed;top:0;left:0;width:88%;max-width:340px;height:100vh;height:100dvh;z-index:11;transform:translateX(-105%);transition:transform var(--t-base) cubic-bezier(.4,.0,.2,1);box-shadow:var(--shadow-lg);padding-top:20px}
  aside.open{transform:translateX(0)}
  main{padding:18px 16px 80px 16px}
  header.topbar{padding:8px 12px;gap:10px}
  header .brand{font-size:14px}
  header .stats{gap:6px}
  header .stat{font-size:11px;padding:5px 8px}
  header .xp-bar{order:5;width:100%;flex:none;min-width:0;max-width:none;height:6px;margin-top:4px}
  header .stat.timer-stat{order:6;width:100%;justify-content:center;background:rgba(28,36,56,.4);padding:6px}
  header .stat[aria-label="XP this level"]{display:none}
  header .stat[aria-label="Day streak"]{padding:5px 8px}
  header .stat[aria-label="Badges earned"]{padding:5px 8px}
  .hamburger{display:flex}
  .mobile-nav{display:flex}
  .match-board{grid-template-columns:1fr}
  .portfolio-row{grid-template-columns:1fr;gap:4px;padding:10px;border:1px solid var(--border);border-radius:8px;margin:6px 0}
  .portfolio-row .label{font-weight:700;color:var(--accent)}
  .flash-card .opts{grid-template-columns:1fr}
  .nav-bottom{flex-direction:column;gap:6px}
  .nav-bottom button{width:100%}
  .kpi-row{grid-template-columns:1fr 1fr}
  h2{font-size:22px}
  h3{font-size:17px}
  .card{padding:14px;border-radius:12px}
  pre{font-size:12px;padding:12px}
  .quiz{padding:14px}
  .minilab{padding:14px}
  table{font-size:12px;display:block;overflow-x:auto}
  .viz-svg{margin:10px -4px}
  details.try{padding:8px 12px}
  details.try summary{font-size:13px}
}
@media(max-width:480px){
  header .stat[aria-label="Day streak"] b,
  header .stat[aria-label="Badges earned"] b{display:inline-block}
  header .brand{font-size:13px}
  .badge-grid{grid-template-columns:1fr 1fr}
  .kpi-row{grid-template-columns:1fr}
  .game-grid{grid-template-columns:1fr}
}
/* inline interactives */
details.try{background:rgba(255,209,102,.07);border:1px solid var(--gold);border-radius:8px;padding:10px 14px;margin:10px 0}
details.try summary{cursor:pointer;font-weight:600;color:var(--gold);outline:none}
details.try summary:hover{color:#ffe28a}
details.try[open] summary{margin-bottom:8px}
details.try .ans{background:var(--code);padding:10px;border-radius:6px;border:1px solid var(--border);color:var(--ink);font-size:13px;margin-top:6px}
.tryq{background:rgba(122,162,255,.06);border-left:4px solid var(--accent);padding:10px 14px;margin:10px 0;border-radius:0 8px 8px 0}
.tryq b{color:var(--accent)}
.mistake{background:rgba(255,107,107,.06);border-left:4px solid var(--err);padding:10px 14px;margin:10px 0;border-radius:0 8px 8px 0}
.mistake b{color:var(--err)}
.trap{background:linear-gradient(90deg,rgba(255,107,107,.08),rgba(62,207,142,.08));border:1px solid var(--border);border-radius:8px;padding:12px 14px;margin:12px 0}
.trap .wrong{color:var(--err);font-weight:600}
.trap .right{color:var(--ok);font-weight:600;margin-top:6px}
.trap .why{color:var(--muted);font-size:13px;margin-top:6px}
.interview{background:rgba(157,122,255,.06);border-left:4px solid var(--accent2);padding:10px 14px;margin:10px 0;border-radius:0 8px 8px 0}
.interview b{color:var(--accent2)}
.minilab{background:linear-gradient(180deg,var(--panel2),var(--panel));border:1px solid var(--border);border-radius:var(--rad);padding:18px;margin:14px 0;box-shadow:var(--shadow-sm)}
.minilab label{display:flex;align-items:center;gap:10px;margin:10px 0;font-size:13px;color:var(--ink);font-weight:500}
.minilab input[type=number]{background:var(--code);border:1px solid var(--border);color:var(--ink);padding:7px 10px;border-radius:6px;width:90px;font-family:'JetBrains Mono',monospace;transition:border-color var(--t-fast)}
.minilab input[type=number]:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(122,162,255,.18)}
.minilab input[type=range]{flex:1;accent-color:var(--accent)}
.minilab .out{margin-top:12px;padding:12px;background:var(--code);border-radius:8px;border:1px solid var(--border);font-family:'JetBrains Mono',monospace;font-size:13px;line-height:1.6}
.viz-svg{width:100%;max-width:600px;display:block;margin:14px auto;border-radius:8px;background:linear-gradient(180deg,#0a1020,#070c1a);border:1px solid var(--border)}
.viz-svg .axis{stroke:var(--border);stroke-width:1}
.viz-svg .grid{stroke:rgba(42,56,84,.3);stroke-width:1;stroke-dasharray:2,3}
.viz-svg text{fill:var(--muted);font-family:'JetBrains Mono',monospace;font-size:11px}
.viz-svg .curve{fill:none;stroke-width:2;filter:drop-shadow(0 0 4px currentColor)}
.viz-svg .curve.sigmoid{stroke:#7aa2ff}
.viz-svg .curve.tanh{stroke:#9d7aff}
.viz-svg .curve.relu{stroke:#3ecf8e}
.viz-svg .curve.gelu{stroke:#ffd166}
.viz-svg .curve.silu{stroke:#7ad4ff}
.viz-svg .vec{stroke-width:3;fill:none}
.viz-svg .vec.a{stroke:#7aa2ff;filter:drop-shadow(0 0 6px #7aa2ff)}
.viz-svg .vec.b{stroke:#ffd166;filter:drop-shadow(0 0 6px #ffd166)}
.viz-svg .vec-tip{fill:currentColor}
.viz-tag{display:inline-block;padding:2px 8px;border-radius:99px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#0a0e16}
.viz-tag.a{background:#7aa2ff}
.viz-tag.b{background:#ffd166}
.viz-tag.r{background:#3ecf8e}

/* ===== Stage B: animations ===== */
.reveal{opacity:0;transform:translateY(18px);transition:opacity .55s ease,transform .55s cubic-bezier(.16,1,.3,1)}
.reveal.in{opacity:1;transform:none}
.view-in{animation:fade-in .35s ease-out}
@keyframes quiz-pulse{0%{box-shadow:0 0 0 0 rgba(62,207,142,.55)}100%{box-shadow:0 0 0 14px rgba(62,207,142,0)}}
.quiz-correct{animation:quiz-pulse .7s ease-out;border-color:var(--ok)!important}
@keyframes quiz-shake{0%,100%{transform:translateX(0)}20%,60%{transform:translateX(-6px)}40%,80%{transform:translateX(6px)}}
.quiz-wrong{animation:quiz-shake .45s ease;border-color:var(--err)!important}
@keyframes xp-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
#xp-bar-fill{background-size:200% 100%;animation:xp-shimmer 3.5s linear infinite}
@keyframes lvl-burst{0%{box-shadow:0 0 0 0 rgba(255,209,102,.7)}100%{box-shadow:0 0 0 22px rgba(255,209,102,0)}}
.lvl-burst{animation:lvl-burst .9s ease-out 2;border-radius:99px}
button:not(:disabled):active{transform:scale(.96)}
#hero-particles{position:absolute;inset:0;pointer-events:none;z-index:0}
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .reveal{opacity:1;transform:none}
}
/* ===== Stage C: reference/resources/guide ===== */
.ref-card{background:linear-gradient(180deg,var(--panel),rgba(20,26,42,.6));border:1px solid var(--border-soft);border-radius:var(--rad);padding:14px 16px;margin:10px 0}
.ref-card p{color:var(--muted);font-size:13.5px;margin:4px 0 0}
.gloss-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;margin-top:12px}
.gloss-grid .ref-card{margin:0}
.ref-table{width:100%;border-collapse:collapse;font-size:13.5px}
.ref-table th,.ref-table td{padding:8px 10px;border-bottom:1px solid var(--border-soft);text-align:left;vertical-align:top}
.ref-table th{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.04em}
@media print{
  header.topbar,aside,.mobile-nav,.tools,#streak-banner,.hero button{display:none!important}
  .body{display:block}
  body,html{background:#fff!important;color:#111!important}
  main{max-width:100%;padding:0}
  h2,h3,h4{color:#111!important;-webkit-text-fill-color:#111!important;background:none!important}
  .ref-card,.guide-week{border:1px solid #bbb;break-inside:avoid;background:#fff}
  .ref-card p,.ref-table td{color:#222!important}
  a{color:#111;text-decoration:underline}
}
