:root{
  --bg:#E7EDE9; --panel:#FFFFFF; --panel-2:#F3F7F4; --ink:#16231C; --muted:#586A60; --line:#D2DCD5;
  --accent:#EE6A1C; --accent-ink:#FFFFFF; --accent-soft:#FCE5D5;
  --teal:#0B7A75; --teal-soft:#DCF0EE;
  --mat:#3A765B; --mat-edge:#2F634C;
  --ok:#17904F; --ok-soft:#DCF2E5; --warn:#A86E00; --warn-soft:#FAEFD3; --bad:#C63636; --bad-soft:#FBE0E0;
  --code-bg:#15201B; --code-ink:#DDE8E2; --code-kw:#FF9E5E; --code-fn:#7FD6CB; --code-num:#F2CD5C; --code-str:#B5E08A; --code-com:#7D9288; --code-const:#C9A7FF;
  --shadow:0 1px 2px rgba(18,40,30,.07),0 6px 22px rgba(18,40,30,.06);
  --font-display:'Baloo 2','Trebuchet MS',system-ui,sans-serif;
  --font-body:'Lexend',system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-mono:'JetBrains Mono',ui-monospace,Consolas,monospace;
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    color-scheme:dark;
    --bg:#0E1411; --panel:#151D19; --panel-2:#1A2420; --ink:#E2ECE6; --muted:#8FA096; --line:#28352E;
    --accent:#FF7A2E; --accent-ink:#1A0E05; --accent-soft:#3A2416;
    --teal:#3CC2B8; --teal-soft:#15302D;
    --mat:#22493A; --mat-edge:#1B3B2F;
    --ok:#4BCB85; --ok-soft:#14301F; --warn:#E8B04A; --warn-soft:#352A12; --bad:#FF6B6B; --bad-soft:#3A1818;
    --code-bg:#0B110E;
    --shadow:0 1px 2px rgba(0,0,0,.3),0 6px 22px rgba(0,0,0,.25);
  }
}
:root[data-theme="dark"]{
  color-scheme:dark;
  --bg:#0E1411; --panel:#151D19; --panel-2:#1A2420; --ink:#E2ECE6; --muted:#8FA096; --line:#28352E;
  --accent:#FF7A2E; --accent-ink:#1A0E05; --accent-soft:#3A2416;
  --teal:#3CC2B8; --teal-soft:#15302D;
  --mat:#22493A; --mat-edge:#1B3B2F;
  --ok:#4BCB85; --ok-soft:#14301F; --warn:#E8B04A; --warn-soft:#352A12; --bad:#FF6B6B; --bad-soft:#3A1818;
  --code-bg:#0B110E;
  --shadow:0 1px 2px rgba(0,0,0,.3),0 6px 22px rgba(0,0,0,.25);
}
*{box-sizing:border-box}
[hidden]{display:none !important}
html,body{height:100%;margin:0}
body{background:var(--bg);color:var(--ink);font-family:var(--font-body);font-size:14px;line-height:1.5;display:flex;flex-direction:column;overflow:hidden}
button,select,input{font:inherit;color:inherit}
button{cursor:pointer}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
b,strong{font-weight:600}

/* ---------- header ---------- */
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.top{display:flex;align-items:center;gap:16px;padding:8px 12px;min-height:60px}
.brand{display:flex;align-items:center;gap:9px;flex:none;color:inherit;text-decoration:none}
.brand h1{font-family:var(--font-display);font-weight:800;font-size:22px;line-height:1;margin:0;letter-spacing:-.01em;white-space:nowrap}
.brand h1 span{color:var(--accent)}
/* project picker: one button instead of a row of pills */
.proj-nav{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;gap:6px}
.nav-arrow{flex:none;width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:var(--panel);color:var(--muted);display:grid;place-items:center}
.nav-arrow:hover:not(:disabled){color:var(--ink);border-color:var(--muted)}
.nav-arrow:disabled{opacity:.35;cursor:default}
.proj-pick{min-width:0;max-width:340px;flex:0 1 340px;display:flex;align-items:center;gap:10px;border:1px solid var(--line);background:var(--panel);border-radius:14px;padding:5px 12px 5px 6px;text-align:left;transition:border-color .15s,box-shadow .15s}
.proj-pick:hover,.proj-pick[aria-expanded="true"]{border-color:var(--teal);box-shadow:0 0 0 3px var(--teal-soft)}
.pp-num{flex:none;width:32px;height:32px;border-radius:10px;display:grid;place-items:center;background:var(--teal);color:#fff;font-weight:700;font-size:14px}
.pp-num.done{background:var(--ok)}
.pp-text{min-width:0;flex:1;display:flex;flex-direction:column;line-height:1.2}
.pp-kicker{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
.pp-name{font-weight:600;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pp-caret{flex:none;color:var(--muted);transition:transform .15s}
.proj-pick[aria-expanded="true"] .pp-caret{transform:rotate(180deg)}
/* the project panel */
.proj-menu{position:fixed;inset:64px 0 0;z-index:80;background:rgba(10,20,15,.28);display:flex;justify-content:center;align-items:flex-start;padding:6px 16px 16px}
.proj-menu-card{width:min(760px,100%);max-height:100%;overflow:auto;background:var(--panel);border:1px solid var(--line);border-radius:18px;box-shadow:0 18px 50px rgba(0,0,0,.18);padding:18px}
.pm-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:14px}
.pm-head h2{font-family:var(--font-display);font-size:22px;margin:0;line-height:1.1}
.pm-bar{flex:0 1 220px;height:8px;border-radius:99px;background:var(--panel-2);border:1px solid var(--line);overflow:hidden;margin-bottom:6px}
.pm-bar i{display:block;height:100%;background:var(--ok);border-radius:99px;transition:width .3s}
.pm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px}
.pm-item{display:flex;align-items:center;gap:10px;border:1px solid var(--line);background:var(--panel);border-radius:12px;padding:10px;text-align:left;min-height:56px}
.pm-item:hover{border-color:var(--teal);background:var(--panel-2)}
.pm-item[aria-current="true"]{border-color:var(--teal);background:var(--teal-soft)}
.pm-item .num{flex:none;width:30px;height:30px;border-radius:9px;display:grid;place-items:center;background:var(--panel-2);border:1px solid var(--line);font-weight:700;font-size:13px;color:var(--muted)}
.pm-item.done .num{background:var(--ok);border-color:var(--ok);color:#fff}
.pm-item[aria-current="true"] .num{background:var(--teal);border-color:var(--teal);color:#fff}
.pm-item b{display:block;font-size:14px;line-height:1.25}
.pm-item small{display:block;color:var(--muted);font-size:12px}
.pm-item.free{grid-column:1/-1;border-style:dashed}
/* right side */
.top-actions{display:flex;align-items:center;gap:8px;flex:none}
.icon-btn{border:1px solid var(--line);background:var(--panel);border-radius:12px;min-width:40px;height:40px;display:flex;align-items:center;justify-content:center;gap:6px;color:var(--muted);padding:0 10px;font-weight:500;font-size:13.5px}
.icon-btn:hover{color:var(--ink);border-color:var(--muted)}
.icon-btn[aria-pressed="true"]{opacity:.7}
.run{display:flex;align-items:center;gap:8px;border:0;background:var(--accent);color:var(--accent-ink);font-weight:600;font-size:15px;border-radius:999px;height:42px;padding:0 20px 0 14px;box-shadow:0 2px 0 rgba(0,0,0,.18)}
.run:hover{filter:brightness(1.06)}
.run.stop{background:var(--ink);color:var(--bg)}
.power{display:none}
.power.on{display:block}
.power i{width:9px;height:9px;border-radius:50%;display:block;background:#3BE37A;box-shadow:0 0 8px #3BE37A}
.acct{position:relative}
.avatar{position:relative;width:40px;height:40px;border-radius:50%;border:0;background:var(--teal);color:#fff;font-family:var(--font-display);font-weight:800;font-size:17px;display:grid;place-items:center}
.avatar[aria-expanded="true"]{box-shadow:0 0 0 3px var(--teal-soft)}
.save-dot{position:absolute;right:0;bottom:0;width:11px;height:11px;border-radius:50%;background:var(--ok);border:2px solid var(--bg)}
.save-dot.saving{background:var(--warn)} .save-dot.error{background:var(--bad)}
.menu{position:absolute;right:0;top:calc(100% + 8px);z-index:85;min-width:210px;background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 34px rgba(0,0,0,.16);padding:6px}
.menu-head{padding:8px 10px 10px;border-bottom:1px solid var(--line);margin-bottom:4px;display:flex;flex-direction:column}
.menu-head .save{font-size:12px;color:var(--muted)}
.menu a,.menu button{display:block;width:100%;text-align:left;border:0;background:none;padding:9px 10px;border-radius:9px;color:var(--ink);text-decoration:none;font-size:14px}
.menu a:hover,.menu button:hover{background:var(--panel-2)}
.menu form{margin:0}

/* ---------- layout ---------- */
.tabbar{display:none;gap:4px;padding:0 16px 10px}
.tabbar button{flex:1;border:1px solid var(--line);background:var(--panel);border-radius:10px;padding:8px;font-weight:500}
.tabbar button[aria-selected="true"]{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.app{flex:1;min-height:0;display:grid;grid-template-columns:300px minmax(0,1.4fr) minmax(0,1fr);gap:10px;padding:0 12px 12px}
.pane{background:var(--panel);border:1px solid var(--line);border-radius:16px;min-height:0;min-width:0;display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow)}
/* Tablet landscape (900-1199): lesson stays on the left, Circuit and Code share the right. */
@media (min-width:900px) and (max-width:1199px){
  .tabbar{display:flex;padding-left:calc(12px + 290px + 10px)}
  .tabbar button[data-tab="lesson"]{display:none}
  .app{grid-template-columns:290px minmax(0,1fr)}
  .app > .code{display:none}
  .app[data-tab="code"] > .circuit{display:none}
  .app[data-tab="code"] > .code{display:flex}
  .pane.circuit{overflow-y:auto}
  .stage-wrap{flex:none;height:min(58vh,560px);min-height:340px}
  .inspector,.status,.serial{flex:none}
}
/* Tablet portrait and phones: one pane at a time. */
@media (max-width:899px){
  .tabbar{display:flex}
  .app{grid-template-columns:minmax(0,1fr)}
  .app > .pane{display:none}
  .app[data-tab="lesson"] > .lesson,.app[data-tab="circuit"] > .circuit,.app[data-tab="code"] > .code{display:flex}
  .app[data-tab="lesson"] > .lesson{display:block}
  .pane.circuit{overflow-y:auto}
  .stage-wrap{flex:none;height:min(60vh,560px);min-height:320px}
  .inspector,.status,.serial{flex:none}
}
/* Header: drop words before dropping controls. */
@media (max-width:1199px){
  .brand h1{display:none}
  .top{gap:10px}
}
@media (max-width:760px){
  .top{flex-wrap:wrap;row-gap:8px}
  .brand h1{display:block;font-size:19px}
  .top-actions{margin-left:auto}
  .icon-btn.labelled span{display:none}
  .proj-nav{order:3;flex-basis:100%}
  .proj-pick{flex:1;max-width:none}
  .proj-menu{top:112px}
  .tabbar button{padding:10px}
}
@media (max-width:420px){
  .brand h1{display:none}
  .run{padding:0 14px 0 12px}
}

/* ---------- lesson ---------- */
.lesson{overflow-y:auto;padding:20px 20px 28px;display:block}
.eyebrow{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--teal)}
.lesson h2{font-family:var(--font-display);font-weight:800;font-size:30px;line-height:1.05;margin:4px 0 8px;text-wrap:balance}
.goal{margin:0 0 6px;color:var(--ink);font-size:15px}
.lesson section{margin-top:20px}
.lesson h3{font-family:var(--font-display);font-weight:700;font-size:17px;margin:0 0 6px;line-height:1.2}
.lesson ul,.lesson ol{margin:0;padding-left:20px}
.lesson li{margin:3px 0}
.lesson p{margin:0 0 8px}
.lesson .muted{color:var(--muted)}
.sec-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sec-head h3{margin-right:auto !important}
.progress{font-size:12px;font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums}
.progress.full{color:var(--ok)}
.steps{list-style:none;padding:0 !important;display:flex;flex-direction:column;gap:6px;margin-top:6px !important}
.step{display:grid;grid-template-columns:26px 1fr;column-gap:10px;row-gap:6px;align-items:start;padding:9px 10px;border:1px solid var(--line);border-radius:12px;background:var(--panel)}
/* "Show me" sits under the step text so the text keeps the full width */
.step .step-actions{grid-column:2;display:flex;gap:6px;align-items:center}
.step.done .show-btn{display:none}
.say-btn{width:28px;height:24px;border-radius:8px;border:1px solid var(--line);background:var(--panel-2);color:var(--muted);display:grid;place-items:center;padding:0}
.say-btn:hover{color:var(--teal);border-color:var(--teal)}
.voice-toggle{display:inline-flex;align-items:center;gap:5px;margin-left:8px;border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:3px 10px;font-size:12px;font-weight:600}
.voice-toggle[aria-pressed="true"]{background:var(--teal);border-color:var(--teal);color:#fff}
.step .mark{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:600;background:var(--panel-2);color:var(--muted);border:1px solid var(--line)}
.step.done{background:var(--ok-soft);border-color:transparent}
.step.done .mark{background:var(--ok);color:#fff;border-color:var(--ok)}
.step.next{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.step .txt{font-size:13.5px;line-height:1.4}
.show-btn{border:1px solid var(--line);background:var(--panel-2);border-radius:8px;padding:2px 8px;font-size:12px;color:var(--muted)}
.show-btn:hover{color:var(--ink);border-color:var(--muted)}
.btn{border:1px solid var(--line);background:var(--panel);border-radius:10px;padding:7px 12px;font-weight:500;font-size:13px;display:inline-flex;align-items:center;gap:6px}
.btn:hover{border-color:var(--muted)}
.btn.primary{background:var(--teal);border-color:var(--teal);color:#fff}
.btn.accent{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.btn.danger{color:var(--bad)}
.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.parts-list li::marker{color:var(--teal)}
.callout{border-radius:12px;padding:10px 12px;background:var(--teal-soft);font-size:13px}
.lesson-foot{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap}

/* ---------- circuit ---------- */
.pane-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;min-height:50px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.pane-bar .label{font-size:12px;color:var(--muted);margin-right:2px}
.add{border:1px dashed var(--line);background:var(--panel-2);border-radius:9px;padding:4px 9px;font-size:12.5px;font-weight:500}
.add:hover{border-style:solid;border-color:var(--teal);color:var(--teal)}
.spacer{flex:1}
.stage-wrap{position:relative;flex:1;min-height:300px;background:var(--mat)}
#stage{position:absolute;inset:0;width:100%;height:100%;touch-action:none;display:block;user-select:none;-webkit-user-select:none}
.zoom{position:absolute;right:10px;bottom:10px;display:flex;flex-direction:column;gap:4px}
.zoom button{width:32px;height:32px;border-radius:9px;border:0;background:rgba(0,0,0,.35);color:#fff;font-size:17px;line-height:1;display:grid;place-items:center}
.zoom button:hover{background:rgba(0,0,0,.5)}
.tip{position:absolute;pointer-events:none;background:#101614;color:#fff;font-size:12px;padding:3px 8px;border-radius:6px;white-space:nowrap;transform:translate(12px,-130%);z-index:3}
.stage-note{position:absolute;left:10px;top:10px;right:60px;color:rgba(255,255,255,.92);font-size:12.5px;pointer-events:none;text-shadow:0 1px 2px rgba(0,0,0,.4)}
.inspector{display:flex;align-items:center;gap:10px;padding:8px 10px;border-top:1px solid var(--line);flex-wrap:wrap;min-height:48px;font-size:13px}
.inspector .what{font-weight:500}
.inspector select{border:1px solid var(--line);border-radius:8px;padding:4px 6px;background:var(--panel)}
.controls{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-left:auto}
.ctl{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted)}
.ctl input[type=range]{width:120px;accent-color:var(--teal)}
.ctl output{font-variant-numeric:tabular-nums;color:var(--ink);min-width:34px}
.press{border:0;background:#D8433A;color:#fff;border-radius:999px;padding:6px 14px;font-weight:600;font-size:12.5px;touch-action:none}
.press:active,.press.down{background:#9E2C25}
.status{display:flex;flex-direction:column;gap:6px;padding:6px 10px;border-top:1px solid var(--line);max-height:96px;overflow-y:auto}
.msg{display:flex;gap:8px;align-items:flex-start;font-size:13px;padding:6px 10px;border-radius:10px;background:var(--panel-2);line-height:1.4}
.msg .dot{flex:none;width:8px;height:8px;border-radius:50%;margin-top:6px;background:var(--muted)}
.msg.ok{background:var(--ok-soft)} .msg.ok .dot{background:var(--ok)}
.msg.warn{background:var(--warn-soft)} .msg.warn .dot{background:var(--warn)}
.msg.bad{background:var(--bad-soft)} .msg.bad .dot{background:var(--bad)}
.serial{border-top:1px solid var(--line)}
.serial-head{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:12px;color:var(--muted)}
.serial-head strong{color:var(--ink);font-weight:600}
.serial-head button{border:0;background:none;color:var(--muted);font-size:12px;padding:2px 6px;border-radius:6px}
.serial-head button:hover{background:var(--panel-2);color:var(--ink)}
#serialOut{margin:0;height:96px;overflow-y:auto;background:var(--code-bg);color:#9FF0B8;font-family:var(--font-mono);font-size:12px;padding:8px 10px;white-space:pre-wrap}
.serial.closed #serialOut{display:none}

/* svg parts */
.gridline{stroke:rgba(255,255,255,.07);stroke-width:1;fill:none}
.gridline2{stroke:rgba(255,255,255,.14);stroke-width:1;fill:none}
.ruler{fill:rgba(255,255,255,.35);font:600 10px var(--font-mono)}
.leg{stroke:#B9C2C7;stroke-width:2.6;fill:none;stroke-linecap:round}
.plabel{fill:rgba(255,255,255,.92);font:500 11px var(--font-body);text-anchor:middle}
.ptag{fill:rgba(255,255,255,.55);font:600 10px var(--font-mono);text-anchor:middle}
.comp{cursor:grab}
.comp.sel .selbox{stroke:#FFD166;stroke-width:1.6;stroke-dasharray:4 3;fill:rgba(255,209,102,.07)}
.selbox{fill:transparent;stroke:none}
.term{cursor:crosshair}
.term .hit{fill:transparent}
.term .dot{fill:#F5E6B8;stroke:#6E5A1E;stroke-width:1;transition:transform .12s;transform-box:fill-box;transform-origin:center}
.term.on .dot{fill:#FFC53D}
.term:hover .dot,.term.pend .dot{transform:scale(1.7)}
.term.board .dot{fill:#2A2A2A;stroke:#C8A84A;stroke-width:1.4}
.term.board.on .dot{fill:#C8A84A}
.wire{fill:none;stroke-linecap:round;stroke-width:4}
.wire-under{fill:none;stroke:rgba(0,0,0,.35);stroke-width:6.5;stroke-linecap:round}
.wire-hit{fill:none;stroke:transparent;stroke-width:14;cursor:pointer}
.wire.sel{stroke-width:5.5}
.wire-sel-glow{fill:none;stroke:#FFD166;stroke-width:10;stroke-linecap:round;opacity:.55}
.rubber{fill:none;stroke:#FFD166;stroke-width:3;stroke-dasharray:7 6;pointer-events:none}
.ghost{fill:none;stroke:#FFD166;stroke-width:3;stroke-dasharray:3 7;stroke-linecap:round;pointer-events:none;animation:dash 1s linear infinite}
.hint-ring{fill:none;stroke:#FFD166;stroke-width:3;pointer-events:none;animation:pulse 1.1s ease-out infinite;transform-box:fill-box;transform-origin:center}
@keyframes pulse{0%{transform:scale(.6);opacity:1}100%{transform:scale(2.2);opacity:0}}
@keyframes dash{to{stroke-dashoffset:-20}}
.wave{fill:none;stroke:#FFD166;stroke-width:2.5;stroke-linecap:round;animation:wv .5s ease-in-out infinite alternate}
.wave.w2{animation-delay:.15s}
@keyframes wv{from{opacity:.25}to{opacity:1}}
.badge-bad{animation:blink .6s steps(2) infinite}
@keyframes blink{50%{opacity:.2}}
.silk{fill:rgba(255,255,255,.9);font-family:var(--font-body);font-weight:500}
@media (prefers-reduced-motion:reduce){.hint-ring,.ghost,.wave,.badge-bad{animation:none}}

/* ---------- code pane ---------- */
.tabs{display:flex;align-items:flex-end;gap:2px;padding:6px 6px 0;min-height:50px;border-bottom:1px solid var(--line)}
.tabs button{border:0;background:none;padding:8px 14px;border-radius:10px 10px 0 0;font-weight:500;color:var(--muted);position:relative}
.tabs button[aria-selected="true"]{color:var(--ink)}
.tabs button[aria-selected="true"]::after{content:"";position:absolute;left:10px;right:10px;bottom:-1px;height:3px;border-radius:3px;background:var(--accent)}
.tabs .ready-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--ok);margin-left:6px;vertical-align:middle}
.code-body{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}
.view{flex:1;min-height:0;display:flex;flex-direction:column}
.blockly-wrap{position:relative;flex:1;min-height:320px}
#blockly{position:absolute;inset:0}
.code-note{font-size:12px;color:var(--muted);padding:7px 12px;border-top:1px solid var(--line);display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.code-note .spacer{flex:1}
.bz{display:flex;gap:4px}
.bz button{border:1px solid var(--line);background:var(--panel);border-radius:8px;width:28px;height:26px}
.cpp-wrap{flex:1;min-height:0;overflow:auto;background:var(--code-bg)}
pre.cpp{margin:0;padding:16px 18px;color:var(--code-ink);font:13px/1.65 var(--font-mono);tab-size:2;counter-reset:ln}
pre.cpp .ln{display:block;padding-left:3.2em;position:relative;min-height:1.65em}
pre.cpp .ln::before{counter-increment:ln;content:counter(ln);position:absolute;left:0;width:2.2em;text-align:right;color:#4E6158}
.k{color:var(--code-kw)} .f{color:var(--code-fn)} .n{color:var(--code-num)} .s{color:var(--code-str)} .c{color:var(--code-com);font-style:italic} .cn{color:var(--code-const)}
.upload{overflow-y:auto;padding:18px 20px 28px}
.upload h3{font-family:var(--font-display);font-size:19px;margin:0 0 8px;font-weight:700}
.ready{border:1px solid var(--line);border-radius:14px;padding:12px 14px;margin-bottom:18px}
.ready.all{border-color:var(--ok);background:var(--ok-soft)}
.ready ul{list-style:none;padding:0;margin:8px 0 0;display:flex;flex-direction:column;gap:6px}
.ready li{display:flex;gap:8px;align-items:center;font-size:13.5px}
.ready .ck{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;border:1.5px solid var(--line);flex:none}
.ready li.yes .ck{background:var(--ok);border-color:var(--ok);color:#fff}
.howto{counter-reset:s;list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
.howto li{display:grid;grid-template-columns:30px 1fr;gap:10px;font-size:13.5px}
.howto li::before{counter-increment:s;content:counter(s);width:26px;height:26px;border-radius:8px;background:var(--teal-soft);color:var(--teal);font-weight:600;display:grid;place-items:center;font-size:13px}
.howto code,.lesson code{font-family:var(--font-mono);font-size:12px;background:var(--panel-2);padding:1px 5px;border-radius:5px;border:1px solid var(--line)}
.upload a{color:var(--teal)}
.safety{margin-top:18px;background:var(--warn-soft);border-radius:12px;padding:10px 14px;font-size:13px}
.safety ul{margin:4px 0 0;padding-left:18px}

/* modal & toast */
.modal{position:fixed;inset:0;background:rgba(0,0,0,.4);display:grid;place-items:center;z-index:100;padding:16px}
.modal-card{background:var(--panel);border-radius:16px;padding:18px;width:min(380px,100%);box-shadow:0 20px 60px rgba(0,0,0,.3)}
.modal-card p{margin:0 0 10px;font-weight:500}
.modal-card input{width:100%;border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:var(--panel-2);margin-bottom:12px}
.modal-card .row{justify-content:flex-end}
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:var(--ink);color:var(--bg);padding:8px 16px;border-radius:999px;font-size:13px;font-weight:500;z-index:110;box-shadow:var(--shadow)}
.blocklyTreeLabel,.blocklyText,.blocklyFlyoutLabelText{font-family:var(--font-body) !important}
.load-err{padding:20px;color:var(--bad)}
.addsel{border:1px solid var(--teal);background:var(--teal-soft);color:var(--teal);border-radius:10px;padding:7px 10px;font-size:13px;font-weight:600;cursor:pointer}
.pchip{display:inline-block;font-size:11px;font-weight:600;padding:1px 8px;border-radius:999px;margin-left:4px;vertical-align:1px;white-space:nowrap}
.pchip.have{background:var(--ok-soft);color:var(--ok)}
.pchip.buy{background:var(--accent-soft);color:var(--accent)}
.callout.buy{background:var(--accent-soft);margin-top:10px}
.callout.bbtip{margin-top:10px}
.linkbtn{border:0;background:none;padding:0;color:var(--teal);font-weight:600;text-decoration:underline;text-underline-offset:2px}
.buy-list{display:flex;flex-direction:column;gap:8px}
.buy-card{border:1px solid var(--line);border-radius:12px;padding:10px 12px}
.buy-card.got{background:var(--ok-soft);border-color:transparent}
.buy-card p{margin:4px 0;font-size:13px}
.buy-card .btn,.lesson a.btn{padding:4px 10px;font-size:12px;text-decoration:none;color:var(--ink)}
.ck-row{display:flex;gap:8px;align-items:flex-start;font-size:13.5px;cursor:pointer}
.ck-row input{margin-top:3px;accent-color:var(--ok)}
.kit-grid{display:grid;grid-template-columns:1fr;gap:6px}
ul.plain li{margin:6px 0}
.lesson a{color:var(--teal)}
.term.hole .dot{fill:#57534A;stroke:none}
.term.hole.on .dot{fill:#C8A84A}
.term.hole:hover .dot{fill:#C8A84A}
@media (max-width:640px){
  .lesson h2{font-size:26px}
  .ctl input[type=range]{width:96px}
}



/* code editor */
.code-bar{display:flex;align-items:center;gap:6px;padding:8px 10px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.mode-pill{font-size:12px;font-weight:600;padding:3px 10px;border-radius:999px;background:var(--teal-soft);color:var(--teal)}
.mode-pill.custom{background:var(--accent-soft);color:var(--accent)}
.editor-wrap{flex:1;min-height:320px;position:relative;background:var(--code-bg)}
.editor-wrap .CodeMirror{position:absolute;inset:0;height:auto;background:var(--code-bg);color:var(--code-ink);font:13px/1.65 var(--font-mono)}
.CodeMirror-gutters{background:var(--code-bg);border-right:1px solid rgba(255,255,255,.06)}
.CodeMirror-linenumber{color:#4E6158}
.CodeMirror-cursor{border-left:2px solid #FFB27A}
.CodeMirror-selected,.CodeMirror-focused .CodeMirror-selected{background:rgba(127,214,203,.18)}
.CodeMirror-matchingbracket{color:#fff !important;background:rgba(255,178,122,.25)}
.cm-s-default .cm-keyword{color:var(--code-kw)}
.cm-s-default .cm-number{color:var(--code-num)}
.cm-s-default .cm-string{color:var(--code-str)}
.cm-s-default .cm-comment{color:var(--code-com);font-style:italic}
.cm-s-default .cm-meta{color:var(--code-const)}
.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:var(--code-kw)}
.cm-s-default .cm-def{color:var(--code-fn)}
.cm-s-default .cm-variable,.cm-s-default .cm-variable-2,.cm-s-default .cm-property,.cm-s-default .cm-operator{color:var(--code-ink)}
.cm-s-default .cm-builtin{color:var(--code-fn)}
.cm-errline{background:rgba(255,80,80,.18)}
/* upload */
.flash-card{border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:18px;display:flex;flex-direction:column;gap:10px}
.flash-bar{height:10px;border-radius:99px;background:var(--panel-2);border:1px solid var(--line);overflow:hidden}
.flash-bar i{display:block;height:100%;background:var(--accent);border-radius:99px;transition:width .15s}
.flash-bar.wait i{width:35%;animation:flashwait 1.1s ease-in-out infinite alternate}
@keyframes flashwait{from{margin-left:0}to{margin-left:65%}}
.spinner{display:inline-block;width:14px;height:14px;flex:none;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.btn:disabled{opacity:.55;cursor:not-allowed}
.btn[aria-busy="true"]{cursor:progress;opacity:.9}
@media (prefers-reduced-motion:reduce){.spinner,.flash-bar.wait i{animation-duration:2.5s}}
.conn{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;border-radius:12px;border:1px solid var(--line);background:var(--panel-2)}
.conn.ok{background:var(--ok-soft)} .conn.bad{background:var(--bad-soft)} .conn.warn,.conn.checking{background:var(--warn-soft)}
.conn-light{flex:none;width:14px;height:14px;margin-top:3px;border-radius:50%;background:var(--muted);box-shadow:0 0 0 3px color-mix(in srgb,currentColor 12%,transparent)}
.conn.ok .conn-light{background:var(--ok,#1f9d55)} .conn.bad .conn-light{background:var(--bad,#d64545)}
.conn.warn .conn-light,.conn.checking .conn-light{background:var(--warn,#d98200)} .conn.checking .conn-light{animation:blink 1s infinite}
.conn-main{display:flex;flex-direction:column;gap:4px;min-width:0;font-size:13.5px}
.conn-main .row{margin-top:6px}
.conn-chip{font-size:12.5px}
.linkish{background:none;border:0;padding:0;color:var(--accent);text-decoration:underline;font-size:12.5px;align-self:flex-start;cursor:pointer}
.conn-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-left:6px;vertical-align:1px;background:var(--muted)}
.conn-dot.ok{background:var(--ok,#1f9d55)} .conn-dot.bad{background:var(--bad,#d64545)} .conn-dot.unplugged,.conn-dot.picked,.conn-dot.checking{background:var(--warn,#d98200)}
.flash-status{font-size:13.5px;padding:8px 12px;border-radius:10px;background:var(--panel-2)}
.flash-status.ok{background:var(--ok-soft)} .flash-status.bad{background:var(--bad-soft)} .flash-status.warn{background:var(--warn-soft)}
.compile-out{margin:0;max-height:220px;overflow:auto;background:var(--code-bg);color:var(--code-ink);font:12px/1.5 var(--font-mono);padding:10px 12px;border-radius:10px;white-space:pre-wrap}
.err-link{border:0;background:none;color:var(--bad);text-decoration:underline;padding:0;font:inherit;cursor:pointer}
details.alt{border:1px solid var(--line);border-radius:14px;padding:10px 14px;margin-bottom:6px}
details.alt summary{cursor:pointer;font-weight:600}
details.alt[open] summary{margin-bottom:10px}

/* wire colours */
.swatches{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap}
.swatch{width:26px;height:26px;border-radius:50%;border:2px solid var(--panel);background:var(--c);box-shadow:0 0 0 1px var(--line);padding:0}
.swatch.on{box-shadow:0 0 0 2px var(--ink)}
.btn.small{padding:3px 10px;font-size:12.5px;min-height:0}
.btn.small.on{background:var(--teal-soft);border-color:var(--teal);color:var(--teal)}
.wire-key{display:inline-flex;align-items:center;gap:4px 6px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin-left:8px}
.wire-key i{width:14px;height:4px;border-radius:2px;background:var(--c);display:inline-block;margin-left:4px;box-shadow:0 0 0 1px rgba(0,0,0,.15)}

/* my parts box */
.inv-list{display:flex;flex-direction:column;gap:4px}
.inv-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:10px;border:1px solid var(--line)}
.inv-row.got{background:var(--ok-soft);border-color:transparent}
.inv-row .ck-row{flex:1;min-width:0}
.inv-name{flex:1;min-width:0;font-size:13.5px;font-weight:500}
.inv-count{font-size:13px;color:var(--muted)}
.qty{width:58px;flex:none;border:1px solid var(--line);border-radius:8px;padding:5px 6px;background:var(--panel);text-align:center;font-size:13px}
.icon-x{flex:none;width:28px;height:28px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--muted);font-size:17px;line-height:1;padding:0}
.icon-x:hover{color:var(--bad);border-color:var(--bad)}
.add-part{display:flex;gap:6px;margin-top:8px}
.add-part #myPartName{flex:1;min-width:0;border:1px solid var(--line);border-radius:8px;padding:7px 10px;background:var(--panel)}
.pchip.warn{background:var(--warn-soft);color:var(--warn)}

/* canvas extras */
.inspector:empty{display:none}
.stage-hint{position:absolute;left:10px;bottom:10px;max-width:calc(100% - 70px);background:rgba(10,20,15,.55);color:#fff;font-size:12px;padding:5px 11px;border-radius:999px;pointer-events:none;backdrop-filter:blur(2px)}
.seg{display:inline-flex;padding:3px;border-radius:11px;background:var(--panel-2);border:1px solid var(--line)}
.seg button{border:0;background:none;padding:5px 11px;border-radius:8px;font-size:12.5px;font-weight:600;color:var(--muted)}
.seg button[aria-pressed="true"]{background:var(--panel);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.12)}
/* code pane fold */
.fold-btn{flex:none;width:32px;height:32px;border-radius:9px;border:1px solid var(--line);background:var(--panel);color:var(--muted);display:grid;place-items:center;padding:0;align-self:center;margin:0 2px 6px}
.fold-btn:hover{color:var(--ink);border-color:var(--muted)}
.code-rail{display:none}
.rail-item{width:36px;height:36px;border-radius:10px;border:0;background:none;color:var(--muted);display:grid;place-items:center}
.rail-item:hover{background:var(--panel-2);color:var(--ink)}
.rail-label{writing-mode:vertical-rl;transform:rotate(180deg);font-size:12px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-top:8px}
@media (min-width:1200px){
  .app.code-folded{grid-template-columns:300px minmax(0,1fr) 52px}
  .app.code-folded > .code > :not(.code-rail){display:none}
  .app.code-folded .code-rail{display:flex;flex-direction:column;align-items:center;gap:6px;padding:9px 0}
  .app.code-folded .code-rail .fold-btn{margin:0 0 6px}
}
@media (max-width:1199px){#codeFold{display:none}}
@media (max-width:520px){.seg button{padding:5px 8px}}

/* voice settings */
.voice-bar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:6px 0 8px;padding:8px;border-radius:12px;background:var(--teal-soft)}
.voice-bar select{max-width:100%;flex:1 1 150px;border:1px solid var(--line);border-radius:9px;padding:5px 8px;background:var(--panel);font-size:12.5px}
/* tools panel */
.tools{position:absolute;right:10px;top:10px;max-height:calc(100% - 20px);width:min(330px,calc(100% - 20px));z-index:6;background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 34px rgba(0,0,0,.2);display:flex;flex-direction:column;overflow:hidden}
.tools-head{display:flex;align-items:flex-start;gap:6px;padding:8px;border-bottom:1px solid var(--line)}
.tool-tabs{display:flex;flex-wrap:wrap;gap:4px;flex:1}
.tool-tabs button{border:0;background:none;padding:5px 9px;border-radius:8px;font-size:12.5px;font-weight:600;color:var(--muted)}
.tool-tabs button[aria-selected="true"]{background:var(--ink);color:var(--bg)}
.tool-body{padding:12px 14px;overflow-y:auto;font-size:13.5px}
.tool-body p{margin:0 0 8px}
.small-list li{margin:6px 0;font-size:13px}
.calc{display:flex;flex-direction:column;gap:8px}
.calc label{display:flex;flex-direction:column;gap:3px;font-size:12px;font-weight:600;color:var(--muted)}
.calc select,.calc input{border:1px solid var(--line);border-radius:9px;padding:7px 9px;background:var(--panel-2);font-size:13.5px;color:var(--ink);font-weight:400}
.calc-out{margin-top:10px;padding:10px 12px;border-radius:12px;background:var(--panel-2);display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.calc-out .big{font:800 26px/1 var(--font-display)}
.calc-out .big-sm{font-size:15px}
.calc-out p{margin:0;font-size:12.5px}
.bands{display:block}
.red-t{color:#E53935} .warn-t{color:var(--warn)}
/* multimeter readout on the canvas */
/* Multimeter: looks like a real handheld DMM, with probe leads drawn over the circuit */
.meter-leads{position:absolute;inset:0;width:100%;height:100%;z-index:5;pointer-events:none;overflow:visible}
.meter-leads .probe-g{pointer-events:auto;cursor:grab}
.meter-leads .probe-hit{fill:transparent}
.meter-leads.dragging .probe-g{pointer-events:none}
.meter-leads.dragging{cursor:grabbing}
.meter-leads .probe-g.dragging{filter:drop-shadow(0 6px 6px rgba(0,0,0,.35))}
.meter{position:absolute;z-index:6;width:150px;display:flex;flex-direction:column;align-items:stretch;gap:6px;user-select:none;-webkit-user-select:none;touch-action:none}
.mm-body{background:linear-gradient(#FFD23F,#F4BD17);border-radius:22px 22px 26px 26px;padding:8px 9px 10px;box-shadow:inset 0 0 0 3px #E0A800,inset 0 -6px 0 rgba(0,0,0,.08),0 10px 22px rgba(0,0,0,.35);cursor:move;display:flex;flex-direction:column;gap:8px}
.mm-top{display:flex;align-items:center;justify-content:space-between;padding:0 2px}
.mm-brand{font:700 9px/1 var(--font-body);letter-spacing:1px;color:#3B3000}
.mm-brand b{background:#1B1D1E;color:#FFD23F;border-radius:3px;padding:1px 3px;margin-left:2px}
.mm-x{width:20px;height:20px;border-radius:50%;border:0;background:rgba(0,0,0,.15);color:#1B1D1E;font-size:14px;line-height:1;cursor:pointer;padding:0}
.mm-lcd{position:relative;height:50px;border-radius:7px;background:linear-gradient(#C3D1AD,#AFC096);border:3px solid #2A2D2E;box-shadow:inset 0 2px 5px rgba(0,0,0,.3);display:flex;align-items:flex-end;justify-content:flex-end;gap:3px;padding:0 7px 5px;color:#16200F;overflow:hidden}
.mm-body.beep .mm-lcd{background:linear-gradient(#DDF1BC,#C8E59D)}
.mm-lcd.off{background:linear-gradient(#9DA98E,#8E9A80)}
.lcd-ghost{position:absolute;right:26px;bottom:3px;font:600 28px/1 var(--font-mono);color:#16200F;opacity:.07;letter-spacing:1px}
.mm-lcd.off .lcd-ghost{display:none}
.lcd-ann{position:absolute;left:6px;top:4px;font:700 9px/1 var(--font-mono);letter-spacing:.5px}
.lcd-num{position:relative;font:600 28px/1 var(--font-mono);letter-spacing:1px}
.lcd-unit{position:relative;font:600 13px/1 var(--font-mono);margin-bottom:3px;min-width:14px}
.mm-dial{position:relative;height:118px;margin:0 auto;width:120px}
.mm-dial .knob{position:absolute;left:30px;top:32px;width:60px;height:60px;border-radius:50%;background:radial-gradient(circle at 40% 35%,#4A4F52,#1E2123 70%);box-shadow:0 3px 6px rgba(0,0,0,.4),inset 0 0 0 4px #2E3234;transition:rotate .2s}
.mm-dial .knob i{position:absolute;left:26px;top:3px;width:8px;height:24px;border-radius:4px;background:#F4F4F4;box-shadow:0 0 0 1px #999}
.dial-mark{position:absolute;translate:-50% -50%;border:0;background:transparent;font:700 11px/1 var(--font-body);color:#3B3000;cursor:pointer;padding:3px 4px;border-radius:6px;display:flex}
.dial-mark.on{background:#1B1D1E;color:#FFD23F}
.dial-mark:focus-visible{outline:2px solid #1B1D1E}
.mm-jacks{display:flex;justify-content:space-around;align-items:flex-end;padding:0 2px}
.jack{display:flex;flex-direction:column;align-items:center;gap:3px;font:700 8.5px/1 var(--font-body);color:#3B3000}
.jack i{width:16px;height:16px;border-radius:50%;background:radial-gradient(circle,#050505 30%,#3A3A3A 32%,#3A3A3A 55%,#1B1D1E 58%);box-shadow:0 0 0 2px #1B1D1E}
.jack.vo i,.jack.amp i{box-shadow:0 0 0 2px #D32F2F}
.jack.amp{opacity:.55}
.mm-note{background:rgba(22,35,28,.92);color:#fff;font-size:11.5px;line-height:1.35;border-radius:10px;padding:7px 9px;box-shadow:0 4px 12px rgba(0,0,0,.25)}
.mm-note .red-t{color:#FF8A80}
@media (max-width:760px){.meter{width:132px}.mm-dial{scale:.88;margin:-6px auto}}

/* paid projects */
.pm-item.locked{opacity:.8}
.pm-item.locked .num{background:var(--panel-2);border-color:var(--line);font-size:14px}
.pm-item.locked small{color:var(--accent);font-weight:600}
.pm-unlock{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 14px;margin-bottom:12px;border-radius:12px;background:var(--accent-soft);font-weight:600}
.unlock-card{max-width:420px;text-align:center}
.ub-lock{font-size:40px;line-height:1}
.unlock-card h2{font-family:var(--font-display);font-size:24px;margin:6px 0}
.ub-price{font-size:20px;color:var(--accent)}
.ub-how{text-align:left;background:var(--panel-2);border-radius:12px;padding:12px 14px;margin:12px 0}
.ub-how p{margin:4px 0 0}
.unlock-card .row{justify-content:center}
/* Blockly's toolbox sits at z-index 70; keep menus and dialogs above it */
.blocklyToolboxDiv,.blocklyFlyout{z-index:30}

/* driver help on the upload screen */
.driver-help[open]{border-color:var(--accent);background:var(--accent-soft)}
.driver-help p{margin:6px 0}
.btn.small-dl{padding:6px 12px;font-size:13px;margin:6px 8px 2px 0;text-decoration:none;color:var(--accent-ink)}
.plain-tight{margin:4px 0 0;padding-left:18px}
.plain-tight li{margin:3px 0}

/* guest mode (/simulate/) */
.guest-bar{margin:0 12px 10px;padding:9px 14px;border-radius:12px;background:var(--accent-soft);font-size:13.5px}
.guest-bar a{color:var(--accent);font-weight:600}
.guest-btn{height:40px;border-radius:999px;padding:0 16px;font-weight:600;text-decoration:none}
.btn.accent.guest-btn{color:var(--accent-ink)}
@media (max-width:760px){.guest-btn:not(.accent){display:none}}
.unlock-card a.btn{text-decoration:none;color:var(--ink);font-weight:600;margin:2px}
.unlock-card a.btn.accent{color:var(--accent-ink)}
.buy-card .bought-btn{padding:4px 10px;font-size:12px;color:#fff;margin-left:auto}
.small-note{font-size:12px;margin-top:8px}

/* project builder */
.builder-cta{background:var(--teal-soft);border-radius:14px;padding:12px 14px}
.builder-card{width:min(620px,100%);max-height:calc(100vh - 32px);overflow:auto}
.builder-card h2{font-family:var(--font-display);margin:0 0 4px;font-size:24px}
.b-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:12px 0}
.b-grid label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;font-weight:600}
.b-grid label small{font-weight:400;color:var(--muted)}
.b-wide{grid-column:1/-1}
.b-grid input,.b-grid select,.b-grid textarea{border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:var(--panel-2);font:inherit;font-weight:400;font-size:13.5px}
.b-steps{background:var(--panel-2);border-radius:12px;padding:10px 12px;font-size:13px;max-height:180px;overflow:auto;margin-bottom:10px}
.b-steps ol{margin:6px 0 0;padding-left:20px}
.b-check{display:flex;gap:8px;align-items:center;font-size:13.5px;margin:6px 0}
.b-error{color:var(--bad);font-weight:600}
.b-check input{width:auto !important;flex:none;margin:0;accent-color:var(--teal)}
.b-check{justify-content:flex-start;text-align:left;font-weight:500}
