/* ============================================================
   Hyvä Professional Developer Trainer — styles
   Brand cues: deep navy canvas, blue→orange gradient accents.
   ============================================================ */
:root{
  --navy:#0a0e2a; --navy-2:#11163a; --panel:#161b42; --panel-2:#1d2350;
  --line:#2a3163; --line-2:#3a4280;
  --ink:#eef1ff; --ink-dim:#aab1e0; --ink-mute:#7b83bd;
  --blue:#4f5bff; --indigo:#6b3df5; --magenta:#b13bd0; --rose:#e0457a; --orange:#ff6a3d;
  --green:#23d18b; --green-d:#0f7a52; --amber:#ffb020; --red:#ff5470; --red-d:#7a1530;
  --grad:linear-gradient(90deg,#4f5bff 0%,#6b3df5 22%,#b13bd0 48%,#e0457a 72%,#ff6a3d 100%);
  --radius:14px; --shadow:0 10px 40px rgba(0,0,0,.45);
  --mono:"SFMono-Regular",ui-monospace,"JetBrains Mono","Fira Code",Menlo,Consolas,monospace;
  --sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:radial-gradient(1200px 700px at 80% -10%,#1a1f55 0%,var(--navy) 55%) fixed,var(--navy);
  color:var(--ink); font-family:var(--sans); font-size:15px; line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
#app.loading{display:grid;place-items:center;min-height:100vh;color:var(--ink-mute);font-size:18px}
a{color:#9ab0ff;text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3,h4{line-height:1.2;margin:0 0 .4em}
code{font-family:var(--mono);font-size:.92em}
::selection{background:rgba(107,61,245,.45)}

/* ---------- Layout shell ---------- */
.shell{display:grid;grid-template-columns:262px 1fr;min-height:100vh}
.sidebar{
  position:sticky;top:0;height:100vh;overflow-y:auto;
  background:linear-gradient(180deg,var(--navy-2),var(--navy));
  border-right:1px solid var(--line);padding:20px 14px;
}
.main{padding:30px 38px 90px;max-width:1080px;margin:0 auto;width:100%}
@media(max-width:880px){
  .shell{grid-template-columns:1fr}
  .sidebar{position:static;height:auto;border-right:0;border-bottom:1px solid var(--line)}
  .main{padding:22px 16px 80px}
}

/* ---------- Brand / sidebar ---------- */
.brand{display:flex;align-items:center;gap:10px;margin:2px 8px 18px}
.brand .logo{width:34px;height:34px;border-radius:9px;background:var(--grad);display:grid;place-items:center;font-weight:800;color:#0a0e2a;font-size:19px;font-style:italic}
.brand b{font-size:15px;letter-spacing:.2px}
.brand small{display:block;color:var(--ink-mute);font-size:11px;font-weight:500;letter-spacing:.3px;text-transform:uppercase}
.nav{display:flex;flex-direction:column;gap:3px;margin-bottom:18px}
.nav a{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;color:var(--ink-dim);font-weight:600;font-size:14px}
.nav a:hover{background:var(--panel);text-decoration:none;color:var(--ink)}
.nav a.active{background:var(--panel-2);color:#fff;box-shadow:inset 3px 0 0 0 var(--blue)}
.nav a .ic{width:18px;text-align:center;opacity:.9}
.nav .sec{font-size:10.5px;text-transform:uppercase;letter-spacing:.9px;color:var(--ink-mute);margin:14px 12px 5px;font-weight:700}

.readiness-mini{margin:6px 8px 4px;padding:12px;border:1px solid var(--line);border-radius:12px;background:var(--panel)}
.readiness-mini .lbl{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--ink-mute);font-weight:700}
.readiness-mini .val{font-size:26px;font-weight:800;margin:2px 0 6px}
.bar{height:8px;border-radius:6px;background:var(--navy-2);overflow:hidden;border:1px solid var(--line)}
.bar > span{display:block;height:100%;background:var(--grad)}

/* ---------- Buttons & chips ---------- */
.btn{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--line-2);background:var(--panel-2);color:var(--ink);
  padding:10px 16px;border-radius:10px;font-weight:700;font-size:14px;cursor:pointer;transition:.12s;font-family:inherit}
.btn:hover{border-color:var(--blue);background:var(--panel);text-decoration:none}
.btn.primary{background:var(--grad);border:0;color:#0a0e2a}
.btn.primary:hover{filter:brightness(1.08)}
.btn.ghost{background:transparent}
.btn.sm{padding:6px 11px;font-size:13px;border-radius:8px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:700;border:1px solid var(--line-2);color:var(--ink-dim)}
.chip.green{background:rgba(35,209,139,.13);border-color:var(--green-d);color:#7df0bf}
.chip.amber{background:rgba(255,176,32,.13);border-color:#7a5a10;color:#ffd27d}
.chip.red{background:rgba(255,84,112,.13);border-color:var(--red-d);color:#ff9bb0}
.chip.blue{background:rgba(79,91,255,.15);border-color:#33408f;color:#aeb9ff}

/* ---------- Cards / panels ---------- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow)}
.grid{display:grid;gap:16px}
.grid.cols-2{grid-template-columns:1fr 1fr}
.grid.cols-3{grid-template-columns:repeat(3,1fr)}
@media(max-width:760px){.grid.cols-2,.grid.cols-3{grid-template-columns:1fr}}
.page-head{margin-bottom:22px}
.page-head h1{font-size:28px}
.page-head p{color:var(--ink-dim);margin:.3em 0 0;max-width:70ch}
.kicker{font-size:12px;letter-spacing:1.5px;text-transform:uppercase;font-weight:700;
  background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent;margin-bottom:6px}

/* ---------- Dashboard readiness ring ---------- */
.ready-hero{display:grid;grid-template-columns:auto 1fr;gap:26px;align-items:center}
@media(max-width:680px){.ready-hero{grid-template-columns:1fr;text-align:center;justify-items:center}}
.ring{--p:0;width:148px;height:148px;border-radius:50%;display:grid;place-items:center;flex:none;
  background:conic-gradient(var(--blue) 0,var(--indigo) calc(var(--p)*.25*1%),var(--magenta) calc(var(--p)*.5*1%),var(--rose) calc(var(--p)*.75*1%),var(--orange) calc(var(--p)*1%),var(--navy-2) 0)}
.ring .hole{width:116px;height:116px;border-radius:50%;background:var(--panel);display:grid;place-items:center;text-align:center}
.ring .pct{font-size:34px;font-weight:800;line-height:1}
.ring .sub{font-size:11px;color:var(--ink-mute);text-transform:uppercase;letter-spacing:.5px}
.gate-list{display:flex;flex-direction:column;gap:9px;margin-top:6px}
.gate{display:flex;align-items:center;gap:11px;font-size:14px}
.gate .dot{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:13px;font-weight:800;flex:none}
.gate .dot.ok{background:var(--green);color:#04220f}
.gate .dot.no{background:var(--navy-2);border:1px solid var(--line-2);color:var(--ink-mute)}
.gate .meta{color:var(--ink-mute);font-size:12.5px}
.verdict{font-size:15px;font-weight:700;padding:11px 15px;border-radius:11px;margin-top:4px}
.verdict.ready{background:rgba(35,209,139,.12);border:1px solid var(--green-d);color:#7df0bf}
.verdict.notready{background:rgba(255,176,32,.10);border:1px solid #6a4d10;color:#ffd27d}

/* ---------- Topic progress cards ---------- */
.topic-card{display:block;border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;background:var(--panel);transition:.12s}
.topic-card:hover{border-color:var(--line-2);background:var(--panel-2);text-decoration:none;transform:translateY(-1px)}
.topic-card .top{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.topic-card .num{font-size:12px;font-weight:800;color:var(--ink-mute)}
.topic-card h3{font-size:16px;color:var(--ink);margin:.3em 0 .1em}
.topic-card .wt{font-size:12px;color:var(--ink-mute);font-weight:700}
.topic-card .blurb{color:var(--ink-dim);font-size:13px;margin:.2em 0 .7em}
.topic-card .bar{margin-top:8px}

/* ---------- Learn view ---------- */
.learn-wrap{display:grid;grid-template-columns:1fr;gap:0}
.obj-nav{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:20px}
.obj-nav a{padding:6px 12px;border:1px solid var(--line);border-radius:999px;font-size:13px;font-weight:700;color:var(--ink-dim)}
.obj-nav a.active{background:var(--panel-2);color:#fff;border-color:var(--blue)}
.obj-nav a.done::after{content:"✓";margin-left:6px;color:var(--green)}

.lesson{max-width:none}
.lesson h2{font-size:22px;margin-top:6px}
.lesson .exam-note{font-size:13px;color:var(--ink-dim);border-left:3px solid var(--line-2);padding-left:12px;margin:8px 0 22px}
.lesson h3.lh{font-size:18px;margin-top:30px;padding-top:6px;border-top:1px solid var(--line)}
.lesson p{margin:.7em 0}
.lesson ul,.lesson ol{margin:.7em 0;padding-left:22px}
.lesson li{margin:.32em 0}
.lesson li::marker{color:var(--ink-mute)}
.lesson strong{color:#fff}
.lesson em{color:#cdd4ff}

.note{border-radius:11px;padding:13px 15px;margin:16px 0;border:1px solid;font-size:14px}
.note .tag{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;display:block;margin-bottom:5px}
.note.tip{background:rgba(35,209,139,.08);border-color:var(--green-d)}
.note.tip .tag{color:#7df0bf}
.note.warn{background:rgba(255,84,112,.07);border-color:var(--red-d)}
.note.warn .tag{color:#ff9bb0}
.note.exam{background:rgba(255,106,61,.09);border-color:#7a3a1f}
.note.exam .tag{color:#ffb38f}
.note.info{background:rgba(79,91,255,.08);border-color:#33408f}
.note.info .tag{color:#aeb9ff}

.lesson table{border-collapse:collapse;width:100%;margin:16px 0;font-size:13.5px}
.lesson th,.lesson td{border:1px solid var(--line);padding:8px 11px;text-align:left;vertical-align:top}
.lesson th{background:var(--panel-2);font-weight:700}

/* ---------- Code blocks ---------- */
.code{background:#0b0f24;border:1px solid var(--line);border-radius:11px;margin:14px 0;overflow:hidden}
.code .cap{display:flex;justify-content:space-between;align-items:center;background:var(--navy-2);
  padding:6px 12px;border-bottom:1px solid var(--line);font-size:11.5px;color:var(--ink-mute)}
.code .cap .lang{text-transform:uppercase;letter-spacing:.6px;font-weight:700}
.code .cap .copy{cursor:pointer;color:var(--ink-dim);font-weight:700;background:none;border:0;font-family:inherit;font-size:11.5px}
.code .cap .copy:hover{color:#fff}
.code pre{margin:0;padding:13px 15px;overflow-x:auto;font-family:var(--mono);font-size:12.8px;line-height:1.6;color:#d6dcff;tab-size:2}
.code pre code{white-space:pre}
/* syntax tokens */
.tok-key{color:#c792ea}.tok-str{color:#c3e88d}.tok-com{color:#5f6896;font-style:italic}
.tok-fn{color:#82aaff}.tok-num{color:#f78c6c}.tok-tag{color:#f07178}.tok-attr{color:#ffcb6b}
.tok-var{color:#89ddff}.tok-punc{color:#89919e}

/* ---------- Lesson footer / mark read ---------- */
.lesson-foot{display:flex;justify-content:space-between;align-items:center;gap:14px;margin-top:34px;
  padding-top:20px;border-top:1px solid var(--line);flex-wrap:wrap}

/* ---------- Quiz / question rendering ---------- */
.quiz-head{display:flex;justify-content:space-between;align-items:center;gap:14px;margin-bottom:18px;flex-wrap:wrap}
.q-progress{font-size:13px;color:var(--ink-mute);font-weight:700}
.q-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:22px;box-shadow:var(--shadow)}
.q-meta{display:flex;gap:8px;align-items:center;margin-bottom:12px;flex-wrap:wrap}
.q-prompt{font-size:17px;font-weight:600;line-height:1.45}
.q-prompt code{background:var(--navy-2);padding:1px 6px;border-radius:5px;color:#ffcb6b}
.q-hint{font-size:13px;color:var(--ink-mute);margin-top:4px}
.opts{display:flex;flex-direction:column;gap:10px;margin-top:18px}
.opt{display:flex;gap:12px;align-items:flex-start;border:1px solid var(--line);border-radius:11px;padding:13px 15px;cursor:pointer;transition:.1s;background:var(--navy-2)}
.opt:hover{border-color:var(--line-2);background:var(--panel-2)}
.opt.sel{border-color:var(--blue);background:rgba(79,91,255,.12)}
.opt .box{width:24px;height:24px;border-radius:7px;border:2px solid var(--line-2);flex:none;display:grid;place-items:center;font-weight:800;font-size:13px;color:var(--ink-mute)}
.opt.multi .box{border-radius:7px}
.opt.single .box{border-radius:50%}
.opt.sel .box{border-color:var(--blue);background:var(--blue);color:#fff}
.opt .otext{flex:1}
.opt .otext code{background:#0b0f24;padding:1px 5px;border-radius:5px;color:#ffcb6b}
.opt.correct{border-color:var(--green);background:rgba(35,209,139,.12)}
.opt.correct .box{border-color:var(--green);background:var(--green);color:#04220f}
.opt.wrong{border-color:var(--red);background:rgba(255,84,112,.12)}
.opt.wrong .box{border-color:var(--red);background:var(--red);color:#fff}
.opt.locked{cursor:default}
.opt .opt-code{margin-top:8px}

.feedback{margin-top:18px;border-radius:11px;padding:15px 17px;border:1px solid}
.feedback.ok{background:rgba(35,209,139,.09);border-color:var(--green-d)}
.feedback.no{background:rgba(255,84,112,.08);border-color:var(--red-d)}
.feedback .verd{font-weight:800;font-size:15px;margin-bottom:6px}
.feedback.ok .verd{color:#7df0bf}.feedback.no .verd{color:#ff9bb0}
.feedback .ex{font-size:14px;color:var(--ink-dim)}
.feedback .ex code{background:var(--navy-2);padding:1px 5px;border-radius:5px;color:#ffcb6b}
.quiz-actions{display:flex;justify-content:space-between;gap:12px;margin-top:20px;flex-wrap:wrap}

/* ---------- Mock exam ---------- */
.exam-bar{position:sticky;top:0;z-index:30;display:flex;justify-content:space-between;align-items:center;
  gap:14px;background:var(--navy-2);border:1px solid var(--line);border-radius:12px;padding:11px 16px;margin-bottom:18px;flex-wrap:wrap}
.timer{font-family:var(--mono);font-size:21px;font-weight:700}
.timer.warn{color:#ffd27d}.timer.danger{color:#ff9bb0}
.exam-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:7px;margin:6px 0 4px}
.exam-grid button{aspect-ratio:1;border:1px solid var(--line);background:var(--navy-2);color:var(--ink-dim);
  border-radius:8px;font-weight:700;font-size:12.5px;cursor:pointer;font-family:inherit}
.exam-grid button.answered{background:var(--panel-2);color:#fff;border-color:var(--line-2)}
.exam-grid button.flagged{box-shadow:inset 0 0 0 2px var(--amber)}
.exam-grid button.cur{outline:2px solid var(--blue);outline-offset:1px}
.exam-result .score{font-size:56px;font-weight:800;line-height:1}
.exam-result .verdict-big{font-size:20px;font-weight:800;margin:4px 0 2px}
.bd-row{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line)}
.bd-row .bar{width:160px}
@media(max-width:600px){.bd-row .bar{width:90px}}

/* ---------- Progress page ---------- */
.obj-row{display:grid;grid-template-columns:60px 1fr 150px 90px;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid var(--line);font-size:14px}
@media(max-width:640px){.obj-row{grid-template-columns:48px 1fr 70px}.obj-row .accfill{display:none}}
.obj-row .oid{font-weight:800;color:var(--ink-mute);font-size:13px}

.toast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%);background:var(--panel-2);
  border:1px solid var(--line-2);border-radius:10px;padding:11px 18px;font-weight:700;box-shadow:var(--shadow);z-index:80;animation:tin .25s ease}
@keyframes tin{from{opacity:0;transform:translate(-50%,12px)}to{opacity:1;transform:translate(-50%,0)}}
.muted{color:var(--ink-mute)}
.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.spread{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
hr.sep{border:0;border-top:1px solid var(--line);margin:22px 0}
