:root{--bg:#0E1013;--panel:#111418;--card:#13161B;--line:#22262D;--line2:#2A2F37;--board:#1A1E24;--deep:#14171C;--trace:#2A2F37;--pad:#4FD1C5;--ink:#E8EAED;--muted:#AAB2BC;--dim:#8A939E;--chip:#1A1E24;--chip2:#252A31;--red:#FF5A4E;--green:#3FCF8E;--yellow:#F5A524;--blue:#6CB4FF;--violet:#B79CFF;--bad:#FF7A6E;--mono:'IBM Plex Mono',ui-monospace,Menlo,monospace;color-scheme:dark;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);}html{scroll-padding-top:env(safe-area-inset-top,0px)}*,*::before,*::after{box-sizing:inherit}body{margin:0;background-color:var(--bg);color:var(--ink);font:17px/1.55 IBM Plex Sans,system-ui,-apple-system,Segoe UI,sans-serif;background-image:repeating-linear-gradient(90deg,transparent 0 58px,rgba(211,144,69,.07) 58px 60px),repeating-linear-gradient(0deg,transparent 0 58px,rgba(211,144,69,.07) 58px 60px)}main{max-width:720px;margin:0 auto;padding:16px 16px 48px}h1,h2,h3{font-family:IBM Plex Sans,system-ui,sans-serif;line-height:1.15;margin:0 0 .4em}h1{font-size:clamp(30px,8vw,46px);font-weight:700}h2{font-size:26px;font-weight:600}h3{font-size:20px;font-weight:600}p{margin:.3em 0 .8em}button{font:inherit;color:inherit}:focus-visible{outline:3px solid var(--yellow);outline-offset:2px}.btn{font:600 17px IBM Plex Sans,system-ui,sans-serif;background:var(--pad);color:#2A1C00;border:0;border-radius:14px;padding:12px 18px;min-height:46px;cursor:pointer;box-shadow:0 4px 0 #9C7A22}.btn:active{transform:translateY(3px);box-shadow:0 1px 0 #9C7A22}.btn:disabled{opacity:.45;cursor:default}.btn.line{background:transparent;color:var(--ink);border:2px solid var(--muted);box-shadow:none}.back{background:none;border:0;color:var(--muted);font:600 16px IBM Plex Sans,sans-serif;padding:8px 0;cursor:pointer;margin-bottom:6px}.panel{background:var(--deep);border:2px solid rgba(211,144,69,.4);border-radius:18px;padding:16px;margin:14px 0}.muted{color:var(--muted)}.small{font-size:14px}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.hero{display:grid;grid-template-columns:1fr;gap:8px;align-items:center;margin:8px 0 18px}.hero svg{width:min(260px,70vw);height:auto;display:block;margin:0 auto}.hero .lead{font-size:19px}.namebox{display:flex;gap:8px;flex-wrap:wrap}.namebox input{flex:1 1 180px;min-height:46px;border-radius:12px;border:2px solid var(--muted);background:var(--deep);color:var(--ink);font:600 18px IBM Plex Sans,sans-serif;padding:8px 12px}.trace{position:relative;list-style:none;margin:0;padding:0 0 0 0}.trace::before{content:"";position:absolute;left:25px;top:20px;bottom:20px;width:6px;background:var(--trace);border-radius:3px}.trace li{position:relative;margin:0 0 12px}.mission{display:flex;gap:14px;align-items:center;width:100%;text-align:left;background:none;border:0;padding:6px 4px;cursor:pointer;border-radius:14px}.mission:hover .mtxt{border-color:var(--pad)}.padnum{flex:0 0 56px;height:56px;border-radius:50%;background:var(--pad);color:#2A1C00;display:grid;place-items:center;font:700 22px IBM Plex Sans,sans-serif;border:6px solid var(--trace);position:relative;z-index:1}.padnum.done{background:var(--green);color:#063}.mtxt{flex:1;background:var(--deep);border:2px solid rgba(211,144,69,.35);border-radius:14px;padding:10px 14px}.mtxt b{font:600 18px IBM Plex Sans,sans-serif;display:block}.mtxt span{color:var(--muted);font-size:15px}details.grown{margin-top:24px}details.grown summary{cursor:pointer;font:600 17px IBM Plex Sans,sans-serif;color:var(--muted)}details.grown li{margin-bottom:6px}.qn{color:var(--muted);font-size:14px}.qq{font:600 20px IBM Plex Sans,sans-serif}.qsvg{background:#F4F4EE;border-radius:12px;padding:10px;display:flex;justify-content:center;margin:6px 0;color:#111}.qsvg svg{max-width:220px;height:auto}.opts{display:grid;gap:8px}.opt{text-align:left;background:var(--board);border:2px solid transparent;border-radius:12px;padding:12px 14px;min-height:46px;cursor:pointer;font-weight:600}.opt.right{border-color:var(--green);background:#1B7A45}.opt.wrong{border-color:var(--bad);background:#6B2D25}.fb{margin-top:10px}.win{background:var(--pad);color:#2A1C00;border-radius:18px;padding:16px;margin-top:16px}.win h3{margin-bottom:4px}.win .btn{background:#2A1C00;color:var(--pad);box-shadow:none}.brain{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.blk{background:var(--board);border:2px solid rgba(255,255,255,.15);border-radius:14px;padding:12px 6px;cursor:pointer;min-height:84px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;font:600 15px IBM Plex Sans,sans-serif;text-align:center}.blk .e{font-size:28px;line-height:1}.blk.seen{border-color:var(--green)}.blk.cpu{background:var(--chip);border-color:var(--pad)}.info{min-height:110px}.info .e{font-size:34px}.full{font:600 16px IBM Plex Sans,sans-serif;color:var(--pad);margin:.2em 0}.fx{font-size:11px;line-height:1.25;color:var(--muted);min-height:28px}.words dt{font:700 18px IBM Plex Sans,sans-serif;color:var(--pad);margin-top:10px}.words dd{margin:0}.mems{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mem{background:var(--chip);border-radius:14px;padding:10px;text-align:center;border:2px solid var(--chip2);transition:opacity .3s}.mem .val{font:700 26px IBM Plex Sans,sans-serif;margin:4px 0}.mem .k{font-size:13px;color:var(--muted)}.off .mem{opacity:.3}.power{display:flex;align-items:center;gap:10px;background:var(--chip);border-radius:40px;padding:6px 14px 6px 6px;border:0;cursor:pointer;font:600 16px IBM Plex Sans,sans-serif}.power i{width:52px;height:30px;border-radius:15px;background:#555;position:relative;display:block}.power i::after{content:"";position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:50%;background:#ddd;transition:left .2s}.power[aria-pressed="true"] i{background:var(--green)}.power[aria-pressed="true"] i::after{left:25px}.steps{list-style:none;padding:0;margin:8px 0}.steps li{padding:4px 0 4px 30px;position:relative}.steps li::before{content:"";position:absolute;left:0;top:7px;width:18px;height:18px;border-radius:50%;border:2px solid var(--muted)}.steps li.ok::before{background:var(--green);border-color:var(--green)}.steps li.ok{color:var(--muted);text-decoration:line-through}.bits{display:grid;grid-template-columns:repeat(8,1fr);gap:5px}.bit{display:flex;flex-direction:column;align-items:center;gap:4px}.bit button{width:100%;aspect-ratio:1/1.5;border-radius:10px;border:0;background:#333;cursor:pointer;font:700 22px IBM Plex Sans,sans-serif;color:#888;position:relative}.bit button.on{background:var(--yellow);color:#3a2a00;box-shadow:0 0 18px rgba(255,212,59,.6)}.bit small{font-size:13px;color:var(--muted)}.dec{font:700 58px IBM Plex Sans,sans-serif;text-align:center;line-height:1;margin:14px 0 4px}.target{text-align:center;font:600 19px IBM Plex Sans,sans-serif}.drum{width:150px;height:150px;border-radius:50%;border:0;background:var(--red);color:#fff;font:700 22px IBM Plex Sans,sans-serif;cursor:pointer;display:block;margin:10px auto;box-shadow:0 8px 0 #9e2a22;touch-action:manipulation}.drum:active{transform:translateY(6px);box-shadow:0 2px 0 #9e2a22}.lane{background:var(--chip);border-radius:12px;padding:8px;margin:8px 0;position:relative;height:58px}.lane .car{position:absolute;left:8px;top:10px;font-size:32px;transform:scaleX(-1)}.lane .lbl{position:absolute;right:10px;top:4px;font-size:13px;color:var(--muted)}.lane .flag{position:absolute;right:10px;bottom:4px;font-size:18px}.chipwrap{display:grid;grid-template-columns:1fr 70px 1fr;align-items:stretch;max-width:420px;margin:0 auto}.pcol{display:flex;flex-direction:column;gap:3px;padding:10px 0}.pin{display:flex;align-items:center;gap:6px;border:0;background:none;cursor:pointer;padding:0;height:26px;font:600 13px IBM Plex Sans,sans-serif;color:var(--ink)}.pcol.l .pin{flex-direction:row-reverse;justify-content:flex-start}.pin .leg{width:22px;height:10px;background:#C8CCD0;border-radius:2px;flex:0 0 22px}.pin .tag{border-radius:7px;padding:2px 7px;min-width:62px;text-align:center;border:2px solid transparent}.pin .no{font-size:11px;color:var(--muted);width:18px;text-align:center}.pin.sel .tag{border-color:#fff}.k-power .tag{background:#E0554A;color:#fff}.k-gnd .tag{background:#111;color:#fff;border-color:#555}.k-dig .tag{background:#2F7FC1;color:#fff}.k-pwm .tag{background:#1AA8A0;color:#fff}.k-ana .tag{background:var(--yellow);color:#3a2a00}.k-xtal .tag{background:var(--violet);color:#2a0a4a}.k-rst .tag{background:#fff;color:#111}.cbody{background:var(--chip);border-radius:6px;position:relative;display:flex;align-items:center;justify-content:center}.cbody::before{content:"";position:absolute;top:-1px;left:50%;width:24px;height:12px;margin-left:-12px;background:var(--bg);border-radius:0 0 12px 12px}.cbody span{writing-mode:vertical-rl;font:700 16px IBM Plex Sans,sans-serif;color:#9aa;letter-spacing:.05em}.legend{display:flex;flex-wrap:wrap;gap:6px;font-size:13px;margin:6px 0}.legend span{border-radius:7px;padding:2px 8px}.chal{background:var(--pad);color:#2A1C00;border-radius:14px;padding:12px 14px;font:600 18px IBM Plex Sans,sans-serif}.pcb{background:var(--board);border-radius:18px;padding:14px;border:3px solid #0a3;box-shadow:inset 0 0 0 2px rgba(0,0,0,.2)}.leds{display:flex;gap:18px;justify-content:center;margin:6px 0 14px}.led{display:flex;flex-direction:column;align-items:center;font-size:13px;gap:4px}.led i{width:30px;height:30px;border-radius:50% 50% 40% 40%;display:block;opacity:.25;transition:opacity .15s,box-shadow .15s}.led.on i{opacity:1}.led.r i{background:var(--red)}.led.r.on i{box-shadow:0 0 22px var(--red)}.led.g i{background:var(--green)}.led.g.on i{box-shadow:0 0 22px var(--green)}.led.y i{background:var(--yellow)}.led.y.on i{box-shadow:0 0 22px var(--yellow)}.tacts{display:flex;gap:20px;justify-content:center}.tact{width:84px;height:84px;border-radius:14px;background:#C8CCD0;border:0;display:grid;place-items:center;cursor:pointer;touch-action:none;user-select:none;-webkit-user-select:none}.tact b{width:48px;height:48px;border-radius:50%;background:#222;display:block;box-shadow:0 5px 0 #000}.tact.down b{transform:translateY(4px);box-shadow:0 1px 0 #000}.tlbl{text-align:center;font-size:13px;margin-top:4px}.slider{width:100%;accent-color:var(--pad);height:30px}.code{background:#0B1410;border-radius:12px;padding:10px;font:13px/1.6 ui-monospace,Menlo,Consolas,monospace;overflow-x:auto;white-space:pre}.code div{padding:0 6px;border-radius:5px}.code div.hot{background:rgba(255,212,59,.22)}.code .c{color:#7fa08c}table.pins{width:100%;border-collapse:collapse;font-size:15px}table.pins td{padding:4px 6px;border-bottom:1px solid rgba(255,255,255,.1)}table.pins td:last-child{text-align:right;font-weight:800}.extled{width:40px;height:40px;border-radius:50%;background:var(--blue);display:inline-block;vertical-align:middle}.counter{font:700 72px IBM Plex Sans,sans-serif;text-align:center;line-height:1}.status{text-align:center;min-height:52px;font:600 18px IBM Plex Sans,sans-serif}.status.irq{color:var(--red)}.status.rst{color:var(--yellow)}.volt{display:flex;justify-content:center;gap:8px;align-items:center;font-size:15px}.volt b{padding:2px 10px;border-radius:8px;background:var(--green);color:#063}.volt b.low{background:var(--red);color:#fff}.cert{background:#FFF8E1;color:#3a2a00;border-radius:18px;padding:22px;text-align:center;border:6px double var(--trace)}.cert h2{font-size:30px}.practice{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:8px}.ptile{background:var(--deep);border:2px solid rgba(211,144,69,.4);border-radius:16px;padding:14px 10px;cursor:pointer;display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left}.ptile .e{font-size:28px}.ptile b{font:600 18px IBM Plex Sans,sans-serif}.ptile span:last-child{font-size:13px;color:var(--muted)}.ptile:hover{border-color:var(--pad)}.fc{perspective:1200px;height:290px;width:100%;border:0;background:none;padding:0;cursor:pointer;display:block;margin:10px 0}.fc-in{position:relative;width:100%;height:100%;transition:transform .5s;transform-style:preserve-3d}.fc.flip .fc-in{transform:rotateY(180deg)}.face{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;border-radius:20px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:18px;text-align:center;gap:8px}.ffront{background:var(--chip);border:3px solid var(--pad);color:var(--ink)}.ffront .big{font:700 clamp(34px,10vw,52px) IBM Plex Sans,sans-serif;color:var(--pad);line-height:1.1}.fbk{background:var(--pad);color:#2A1C00;transform:rotateY(180deg)}.fbk .big{font:700 24px IBM Plex Sans,sans-serif;line-height:1.2}.hint{font-size:14px;opacity:.75}.bar{height:10px;background:var(--chip);border-radius:5px;overflow:hidden}.bar i{display:block;height:100%;background:var(--green);transition:width .3s}.seg{display:inline-flex;background:var(--chip);border-radius:12px;padding:3px}.seg button{border:0;background:none;padding:8px 12px;border-radius:10px;cursor:pointer;font:600 14px IBM Plex Sans,sans-serif;min-height:40px}.seg button[aria-pressed="true"]{background:var(--pad);color:#2A1C00}.streak{font:600 16px IBM Plex Sans,sans-serif;color:var(--yellow)}.bsvg{width:100%;max-width:420px;height:auto;display:block;margin:0 auto;touch-action:manipulation}.hs{cursor:pointer}.hs:focus{outline:none}.hs:focus-visible .num{stroke:#fff;stroke-width:4}.hs .num{fill:#fff;stroke:var(--pad);stroke-width:3}.hs .nt{font:700 12px IBM Plex Sans,sans-serif;fill:#1a1a1a;pointer-events:none}.hs.seen .num{fill:var(--green)}.hs.sel .num{fill:var(--yellow);stroke:#fff;stroke-width:4}.hs:hover .num{stroke:#fff}.tryit{background:var(--board);border-left:5px solid var(--pad);border-radius:10px;padding:10px 12px;margin:8px 0}.modebar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;margin:8px 0}.wiring{position:relative;display:grid;grid-template-columns:minmax(108px,1fr) 34px minmax(150px,1.35fr);align-items:center;margin:10px 0}.wsvg{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;overflow:visible;z-index:2}.wbox{background:var(--chip);border-radius:14px;padding:10px}.wlbl{font:600 13px IBM Plex Sans,sans-serif;color:var(--muted);margin-bottom:4px}.wt{display:block;width:100%;margin:7px 0;min-height:44px;border-radius:10px;border:3px solid transparent;font:800 14px IBM Plex Sans,sans-serif;cursor:pointer;text-align:left;padding:6px 10px}.wt.pick{border-color:#fff;box-shadow:0 0 0 3px var(--yellow)}.wt:disabled,.wp:disabled{cursor:default}.wtab{border-collapse:collapse;width:100%}.wtab th{font:800 13px IBM Plex Sans,sans-serif;text-align:left;padding:2px 4px 2px 6px;white-space:nowrap}.wtab thead th{color:var(--muted);font-size:11px;text-align:center}.wtab td{padding:2px}.wp{width:100%;min-width:32px;min-height:40px;border-radius:8px;border:3px solid #4a4f53;background:#141719;color:#ccc;font-weight:800;cursor:pointer}.wp.on{border-color:var(--c);background:#23282b}.wfb .bad{color:var(--bad)}.upl{display:grid;grid-template-columns:1fr 70px 1fr;align-items:center;gap:6px;margin-top:8px}.pbrd{background:var(--board);border-radius:12px;padding:10px;text-align:center}.leds2{font-size:12px;display:flex;flex-wrap:wrap;gap:4px;justify-content:center;align-items:center;margin-top:6px}.dot{width:12px;height:12px;border-radius:50%;display:inline-block;opacity:.2}.dot.blue{background:#4E8BFF}.dot.amber{background:#FFB23B}.dot.lit{opacity:1;box-shadow:0 0 10px currentColor}.bits-fly{font:12px ui-monospace,Menlo,monospace;color:var(--yellow);text-align:center;overflow:hidden;white-space:nowrap}.servo{width:100%;max-width:320px;display:block;margin:0 auto 6px}.loop{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:12px 0 4px;font-size:13px}.lb{flex:1 1 70px;background:var(--chip);border-radius:10px;padding:6px;text-align:center;border:2px solid transparent;transition:border-color .2s}.lb.hot{border-color:var(--yellow)}.irscene{position:relative;height:80px;background:var(--chip);border-radius:12px;overflow:hidden;margin-bottom:8px}.irs{position:absolute;left:8px;top:14px;width:52px;height:52px;background:#A84A2A;border-radius:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:9px;text-align:center;line-height:1.1}.irled{width:12px;height:12px;border-radius:50%;background:#FF4B3E;box-shadow:0 0 10px #FF4B3E;margin-bottom:3px}.irled.dim{opacity:.35;box-shadow:none}.irled:not(.dim){opacity:0}.beam{position:absolute;left:60px;right:0;top:34px;height:12px;background:linear-gradient(90deg,rgba(200,120,255,.9),transparent);transition:opacity .3s}.obj{position:absolute;top:10px;width:22px;height:60px;border-radius:5px;border:2px solid #777;transition:left .2s}.micsvg{width:100%;max-width:320px;display:block;margin:0 auto}.graph{width:100%;height:80px;background:var(--chip);border-radius:10px}.remote-wrap{display:flex;gap:14px;align-items:center;justify-content:center;margin:10px 0;flex-wrap:wrap}.remote{background:#1C1C1C;border-radius:22px;padding:10px 10px 14px;width:190px}.rtip{height:18px;display:flex;justify-content:center}.rtip span{width:14px;height:10px;border-radius:5px;background:#555}.rtip span.flash{animation:irf .5s}@keyframes irf{0%,100%{background:#555}20%,60%{background:#C99BFF;box-shadow:0 0 16px #C99BFF}40%,80%{background:#555}}.keys{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.key{min-height:40px;border-radius:12px;border:0;background:#3A3A3A;color:#fff;font:700 12px IBM Plex Sans,sans-serif;cursor:pointer}.key:active{background:#666}.rx{text-align:center}.tsop{width:34px;height:40px;background:#111;border-radius:6px 6px 16px 16px;margin:0 auto 4px;border:2px solid #444}.decode{background:var(--chip);border-radius:12px;padding:10px 12px}.hexsplit{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;text-align:center;font-size:11px;color:var(--muted)}.hexsplit span{background:var(--board);border-radius:8px;padding:4px}.hexsplit b{display:block;font:700 18px IBM Plex Sans,sans-serif;color:var(--yellow)}.chg{display:grid;grid-template-columns:1fr 80px 1fr;gap:8px;align-items:center;background:#C4532C;border-radius:14px;padding:12px;margin:10px 0}.sock{background:#1b1b1b;border:3px dashed #888;border-radius:12px;min-height:70px;color:#fff;cursor:pointer;display:flex;flex-direction:column;gap:2px;align-items:center;justify-content:center;font-size:13px}.chgmid{text-align:center;font-size:11px}.cled{display:block;width:16px;height:16px;border-radius:50%;background:#FF4B3E;margin:0 auto 4px;opacity:.2}.cled.lit{opacity:1;box-shadow:0 0 14px #FF4B3E}.hot{grid-column:1/-1;background:rgba(0,0,0,.25);border:2px solid #FFB23B;color:#FFD9A0;border-radius:10px;min-height:40px;cursor:pointer;font-weight:800}.plug.pickp{border-color:var(--yellow);box-shadow:0 0 0 3px var(--yellow)}.chapter{font:600 15px IBM Plex Sans,sans-serif;color:var(--pad);text-transform:uppercase;letter-spacing:.06em;margin:22px 0 8px}.bkta{width:100%;min-height:60px;font:12px ui-monospace,Menlo,monospace;background:var(--chip);color:var(--muted);border:1px solid #444;border-radius:8px;padding:6px;margin:4px 0}.ctools{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;padding:2px 0 6px;margin:10px 0 0}.ctool{flex:0 0 auto;width:68px;min-height:66px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border-radius:12px;border:2px solid transparent;background:var(--chip);cursor:pointer;font:600 12px IBM Plex Sans,sans-serif;padding:4px 2px}.ctool[aria-pressed="true"]{border-color:var(--pad);background:var(--chip2);box-shadow:0 0 0 2px rgba(235,196,92,.35)}.ctool svg{width:56px;height:36px;overflow:visible}.ctool .e{font-size:24px;line-height:36px}.ctip{margin:4px 0 6px;min-height:1.4em}.csvg{width:100%;max-width:640px;height:auto;display:block;margin:0 auto;border-radius:16px;touch-action:manipulation;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;cursor:pointer;overflow:visible}.csvg.draw{touch-action:none;cursor:crosshair}.cstage{position:relative;perspective:1100px;margin:8px auto 18px;max-width:640px;padding:8px 4px 28px;transform-style:preserve-3d}.cboard,.bboard{position:relative;transform-style:preserve-3d;transition:transform .35s ease}.cboard{transform-origin:50% 52%}.bstage{perspective:1200px;margin:8px auto 18px;max-width:420px;padding:8px 0 24px;transform-style:preserve-3d}.bboard{transform-origin:50% 48%}.csvg text,.ctool text{font:700 11px IBM Plex Sans,sans-serif;fill:#fff;text-anchor:middle;dominant-baseline:central;pointer-events:none}.csvg text.clbl,.ctool text.clbl{fill:var(--ink)}.flow{stroke:#FFE680;stroke-width:4;stroke-linecap:round;stroke-dasharray:.1 12;animation:cflow 1s linear infinite;pointer-events:none}@keyframes cflow{to{stroke-dashoffset:-12.1}}.fan{transform-box:fill-box;transform-origin:center;animation:cspin 1s linear infinite}@keyframes cspin{to{transform:rotate(360deg)}}.cflag{animation:cpulse 1s ease-in-out infinite}@keyframes cpulse{50%{opacity:.2}}.cst{padding:4px 0 8px;border-bottom:1px solid rgba(255,255,255,.08)}.cst:last-child{border-bottom:0}.cstb{background:none;border:0;padding:4px 0;cursor:pointer;text-align:left;font:inherit;color:inherit;display:block}.cst.bad .cstb b{color:var(--bad)}.cwhy{background:var(--board);border-radius:12px;padding:10px 12px;margin:6px 0}.cwhy p{margin:.2em 0 .6em}.cmini{min-height:38px;padding:6px 12px;font-size:15px}.cseg{flex-wrap:wrap;margin:4px 0 10px}.cins h3{font-size:19px}.c3wrap{position:relative;width:100%;max-width:640px;margin:0 auto;border-radius:18px;overflow:hidden;background:radial-gradient(ellipse at 50% 38%,#1b6e45 0%,#0c4128 55%,#07301c 100%);box-shadow:inset 0 0 0 1px rgba(235,196,92,.25)}.c3canvas{display:block;width:100%;height:100%;touch-action:none;cursor:grab}.c3canvas:active{cursor:grabbing}.c3hint{position:absolute;left:12px;right:12px;top:10px;transition:opacity .6s;font:600 12px IBM Plex Sans,sans-serif;color:var(--muted);pointer-events:none;text-shadow:0 1px 2px #000}.c3ui{position:absolute;right:8px;bottom:8px;display:flex;gap:6px}.c3b{width:40px;height:40px;border-radius:50%;border:0;background:rgba(9,30,19,.78);color:var(--ink);font:700 18px IBM Plex Sans,sans-serif;cursor:pointer;box-shadow:0 0 0 1px rgba(235,196,92,.35)}.c3b:active{transform:scale(.94)}.c3load{display:grid;place-items:center;aspect-ratio:4/3;max-width:640px;margin:0 auto;border-radius:18px;background:#0c4128;color:var(--muted);font:600 16px IBM Plex Sans,sans-serif;text-align:center;padding:16px}.cghost{opacity:.5;animation:cghost 1.4s ease-in-out infinite}@keyframes cghost{50%{opacity:.22}}.gwire{stroke:#7fe6ff;stroke-width:6;stroke-dasharray:8 6;stroke-linecap:round;fill:none;animation:gdash 1s linear infinite}@keyframes gdash{to{stroke-dashoffset:-14}}.csvg text.cgl{fill:rgba(242,247,238,.45);font-size:10px}.ctool.cneed{border-color:#7fe6ff;animation:cneed 1s ease-in-out infinite}@keyframes cneed{50%{box-shadow:0 0 0 4px rgba(127,230,255,.45)}}.gdots{display:flex;gap:5px;margin:10px 0 4px}.gdots i{flex:1;height:6px;border-radius:3px;background:var(--chip)}.gdots i.ok{background:var(--green)}.gdots i.cur{background:#7fe6ff}.gfb{color:#FFD9A0;font-weight:700}.lcds{display:flex;flex-wrap:wrap;gap:8px}.lcd{flex:1 1 150px;display:flex;align-items:baseline;gap:6px;background:#1c2a20;border:3px solid #F2C230;border-radius:12px;padding:8px 12px;color:#9CFF9C;font-family:ui-monospace,Menlo,Consolas,monospace;box-shadow:inset 0 2px 8px rgba(0,0,0,.6)}.lcd b{font-size:28px;letter-spacing:.04em}.lcd span{font-size:13px;color:#7fd07f}.lcd .lcdl{font:700 11px IBM Plex Sans,sans-serif;color:#F2C230;margin-right:auto;align-self:center}.cmeterp{background:#2a2410;border-color:#F2C230}table.nb{width:100%;border-collapse:collapse;margin-top:10px;font-size:14px}table.nb th{text-align:left;color:var(--muted);font-weight:700;padding:4px 6px}table.nb td{padding:5px 6px;border-top:1px solid rgba(255,255,255,.1)}.csvg text.cmr{fill:#9CFF9C;font-family:ui-monospace,Menlo,monospace;font-size:10px}.clcd rect{fill:#1c2a20;stroke:#F2C230;stroke-width:2}.csvg .clcd text{fill:#9CFF9C;font-family:ui-monospace,Menlo,monospace;font-size:13px}.csvg .cprobe text{font-size:12px}@media (min-width:640px){.hero{grid-template-columns:1.1fr .9fr}}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
/* ---- Uniko Lab ---- */
.ulab{grid-template-columns:minmax(230px,23%) minmax(0,1fr) minmax(300px,27%)}
.ulab .num,.ulab .nt{display:none}.ulab .bsvg{max-width:none;width:100%;height:100%}.ulab #uflat{justify-content:center}
.ulab .hs[data-id="11"],.ulab .hs[data-id="12"],.ulab .hs[data-id="5"],.ulab .hs[data-id="15"],.ulab .hs[data-id="14"]{cursor:pointer;touch-action:none}
.ugo{background:var(--pad);color:#2A1C00;border-color:var(--pad);font-weight:800}.ugo.on{background:#2a2410;color:var(--pad)}.lbtn:disabled{opacity:.4;cursor:default}
.ufile{cursor:pointer}.useg button{padding:6px 10px;min-height:34px;font-size:13px}
.uprog{padding:12px}.uphead{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:8px}.uphead b{font:600 16px IBM Plex Sans,sans-serif}
.uscript{margin-bottom:14px}.uloose{opacity:.6}
.ublk{padding:6px 10px;margin:3px 0;border-radius:8px;font:700 13px IBM Plex Sans,sans-serif;color:#fff;line-height:1.3;border:2px solid transparent;transition:box-shadow .1s}
.ublk.k-ev{background:#ffbf00;color:#3a2a00;border-radius:14px 14px 8px 8px}.ublk.k-ct{background:#ffab19;color:#3a2200}.ublk.k-op{background:#40bf4a}.ublk.k-va{background:#ff8c1a}.ublk.k-pin{background:#0fbd8c}
.ublk.unk{background:repeating-linear-gradient(45deg,#555,#555 6px,#666 6px,#666 12px)}.uelse{padding:3px 10px;font-size:12px}
.usub{margin-left:12px;padding-left:8px;border-left:3px solid rgba(255,171,25,.55);min-height:8px}
.ublk.ucur{box-shadow:0 0 0 3px #fff,0 0 16px 4px rgba(255,255,255,.6)}.ublk.uflag{border-color:#ff5a4e;animation:cpulse 1s ease-in-out infinite}
.upick{display:grid;gap:8px}.upex{text-align:left;border:1px solid rgba(255,255,255,.1);background:rgba(9,58,35,.8);border-radius:14px;padding:10px 12px;cursor:pointer;color:var(--ink)}.upex b{display:block;font:600 15px IBM Plex Sans,sans-serif}.upex span{font-size:13px;color:var(--muted)}.upex:hover{border-color:var(--pad)}
.uerr{background:rgba(255,154,140,.12);border:1px solid rgba(255,154,140,.4);border-radius:12px;padding:10px 12px;margin-bottom:10px;color:var(--bad)}
.uin h4{font:700 13px IBM Plex Sans,sans-serif;color:var(--pad);margin:14px 0 6px;text-transform:uppercase;letter-spacing:.06em}.uin h4:first-child{margin-top:0}
.ubtns{display:flex;gap:8px}.uhold{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:12px 6px;border-radius:14px;border:0;background:#c8ccd0;color:#111;font:800 17px IBM Plex Sans,sans-serif;cursor:pointer;box-shadow:0 5px 0 #7d8488;touch-action:none;user-select:none;-webkit-user-select:none}
.uhold small{font:700 11px IBM Plex Sans,sans-serif;color:#444}.uhold.down{transform:translateY(4px);box-shadow:0 1px 0 #7d8488;background:#aab0b5}.uhold.ursb{background:#e8ecef;font-size:14px}
.ujmp{display:flex;margin-bottom:8px}.ujmp button{flex:1;font-size:13px}.udim{opacity:.35;pointer-events:none}
.ubig{background:var(--pad);color:#2A1C00;font-size:15px}
.usett{margin-top:14px}.usett summary{cursor:pointer;color:var(--muted)}
.utl{width:100%;height:auto;background:rgba(0,0,0,.25);border-radius:10px;display:block}
table.upins{width:100%;border-collapse:collapse;font-size:13px;margin-top:10px}table.upins th{text-align:left;color:var(--muted);padding:4px}table.upins td{padding:5px 4px;border-top:1px solid rgba(255,255,255,.08)}
.useri{font:13px ui-monospace,Menlo,Consolas,monospace;background:#0b1410;border-radius:10px;padding:8px;height:calc(100% - 50px);min-height:160px;overflow-y:auto;margin-bottom:8px;color:#9cff9c}.useri span{color:#557a60;margin-right:8px}
@media (max-width:900px){.ulab{grid-template-rows:auto minmax(220px,1fr) minmax(0,26vh) minmax(0,34vh) auto}.ulab .ltools{overflow-y:auto;overflow-x:hidden;border-top:1px solid rgba(255,255,255,.08)}}
.ulb{position:relative}
.ubadge{position:absolute;left:18px;top:16px;z-index:2;padding:7px 13px;border-radius:20px;font:800 13px IBM Plex Sans,sans-serif;letter-spacing:.04em;pointer-events:none;background:rgba(7,40,24,.85);color:var(--muted);border:1px solid rgba(255,255,255,.15)}
.ubadge:empty{display:none}.ubadge.run{background:#1f8a4c;color:#fff;border-color:#4be67c;animation:urun 1.6s ease-in-out infinite}.ubadge.pause{background:#6b5410;color:#ffe9a0;border-color:#ffd43b}.ubadge.done{background:#333;color:#ddd}.ubadge.err{background:#6b2d25;color:#fff}.ubadge.ready{color:var(--pad);border-color:rgba(235,196,92,.5)}
@keyframes urun{50%{box-shadow:0 0 0 6px rgba(75,230,124,.25)}}
.utoast{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);z-index:3;max-width:min(520px,90%);padding:12px 18px;border-radius:14px;background:var(--pad);color:#2A1C00;font:700 15px IBM Plex Sans,sans-serif;box-shadow:0 10px 30px rgba(0,0,0,.4);text-align:center}
.uempty{position:absolute;inset:auto 0 0 0;margin:auto;top:0;height:max-content;width:min(360px,85%);z-index:2;display:grid;gap:4px;padding:18px 20px;border-radius:18px;background:rgba(7,40,24,.93);border:1px solid rgba(235,196,92,.45);box-shadow:0 20px 40px rgba(0,0,0,.45)}.uempty[hidden]{display:none}.uempty b{font:600 18px IBM Plex Sans,sans-serif;color:var(--pad);margin-top:6px}.uempty span{color:var(--muted);font-size:14px}
.uprog.upulse{animation:upulse .5s ease-in-out 3}@keyframes upulse{50%{box-shadow:inset 0 0 0 3px var(--pad)}}

/* Arduino Lab: the Uno beside the build board, jumper wires, the program and pins panes */
.lab-arduino{background:linear-gradient(160deg,#0b7f89,#073c42)}.lab-arduino::after{background:radial-gradient(circle,rgba(47,179,189,.25),transparent 70%)}
.csvg .uno text{pointer-events:none}.csvg text.unot{font:800 8.5px IBM Plex Sans,sans-serif;fill:rgba(255,255,255,.75)}
.csvg text.unochip{font:800 11px ui-monospace,Menlo,monospace;fill:#8d969c;letter-spacing:1px}
.csvg text.unologo{font:800 22px IBM Plex Sans,sans-serif;fill:#fff;letter-spacing:2px}.csvg text.unouno{font:800 italic 30px IBM Plex Sans,sans-serif;fill:#fff}
.csvg text.unopin{font:800 10px IBM Plex Sans,sans-serif;fill:#fff}.csvg text.unopin.off{fill:rgba(255,255,255,.4)}.csvg text.unopin.pwm{fill:#bff3f7}
.csvg .upin{cursor:pointer}.csvg .upin:hover{fill:rgba(127,230,255,.35)}
.jwsw{display:inline-block;width:16px;height:16px;border-radius:50%;vertical-align:middle;box-shadow:0 0 0 1px rgba(255,255,255,.35)}
.unolab h4.mph{margin:14px 0 0;font-size:14px}.unolab table.upins b.hi{color:var(--yellow)}.unolab table.upins b.bad{color:var(--red)}
.unolab .uphead{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px}
.upick.flash{animation:cpulse .5s ease-in-out 3}
/* Sensor library */
.slib{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
.scard{display:flex;flex-direction:column;gap:4px;padding:16px;border-radius:20px;background:linear-gradient(180deg,rgba(22,110,62,.55),rgba(8,52,31,.92));border:1px solid rgba(235,196,92,.2);color:var(--ink);text-decoration:none;transition:transform .2s,border-color .2s}
.scard:hover{transform:translateY(-3px);border-color:var(--pad)}.scard b{font:700 18px IBM Plex Sans,sans-serif}.scard p{margin:0;color:var(--muted);font-size:14px}
.smpic{width:100%;height:110px;margin-bottom:6px;overflow:visible}.smpic.big{height:220px}
.smpic text{font:700 11px IBM Plex Sans,sans-serif;fill:#fff;text-anchor:middle;dominant-baseline:central}.smpic text.cml{font-size:8px;fill:rgba(255,255,255,.8)}.smpic text.smleg{font-size:13px;fill:var(--pad)}
.sdet{display:grid;grid-template-columns:minmax(220px,1fr) 1.3fr;gap:20px;align-items:center;margin:8px 0 18px}.spicw{background:radial-gradient(circle at 50% 40%,#1b6e45,#0a3a22);border-radius:22px;padding:18px}
.sgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin-bottom:16px}.sgrid h3{margin-top:0}
.lab-sensors{background:linear-gradient(160deg,#6a4fb0,#2c1f55)}.lab-sensors::after{background:radial-gradient(circle,rgba(199,155,255,.22),transparent 70%)}
.csvg text.cml,.ctool text.cml{font-size:8px;fill:rgba(255,255,255,.8)}
@media (max-width:640px){.sdet{grid-template-columns:1fr}}
/* ==================== Studio ====================
   Dark graphite, IBM Plex. A sidebar with every level, a slim top bar, full-width pages. */
body{font:15px/1.55 'IBM Plex Sans',system-ui,-apple-system,Segoe UI,sans-serif;background:var(--bg);background-image:none;color:var(--ink);-webkit-font-smoothing:antialiased}
h1,h2,h3{font-family:'IBM Plex Sans',system-ui,sans-serif;letter-spacing:-.015em;line-height:1.2}
h1{font-size:clamp(26px,2.6vw,34px);font-weight:600}h2{font-size:21px;font-weight:600}h3{font-size:16px;font-weight:600}
a{color:inherit;text-decoration:none}.ulink{color:var(--pad);text-decoration:underline;text-underline-offset:3px;text-decoration-color:rgba(79,209,197,.4)}
.ico{flex:0 0 auto;display:block}
:focus-visible{outline:2px solid var(--pad);outline-offset:2px}
.muted{color:var(--muted)}.small{font-size:13px}
.eyebrow{display:block;font:500 11.5px var(--mono);letter-spacing:.07em;text-transform:uppercase;color:var(--pad)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:600 14px 'IBM Plex Sans',sans-serif;background:var(--pad);color:#0B1513;border:1px solid var(--pad);border-radius:8px;padding:0 16px;min-height:40px;box-shadow:none;cursor:pointer}
.btn:hover{filter:brightness(1.08)}.btn:active{transform:none;box-shadow:none;filter:brightness(.94)}
.btn.line{background:transparent;color:var(--ink);border:1px solid var(--line2)}.btn.line:hover{border-color:#3D444F;filter:none}
.back{font:500 14px 'IBM Plex Sans',sans-serif;color:var(--muted)}.back:hover{color:var(--ink)}
.panel{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px}
.bar{height:6px;background:var(--line);border-radius:3px;overflow:hidden;display:block}.bar i{display:block;height:100%;background:var(--pad);border-radius:3px}.bar.thin{height:4px}
.seg{display:inline-flex;background:var(--bg);border:1px solid var(--line2);border-radius:8px;padding:2px}.seg button{font:500 13px 'IBM Plex Sans',sans-serif;min-height:32px;padding:0 11px;border-radius:6px;color:var(--muted)}.seg button[aria-pressed="true"]{background:#232830;color:var(--ink)}
.opt{background:var(--card);border:1px solid var(--line2);border-radius:8px;font-weight:500;padding:11px 14px}.opt:hover{border-color:#3D444F}.opt.right{background:rgba(63,207,142,.1);border-color:var(--green)}.opt.wrong{background:rgba(255,90,78,.1);border-color:var(--red)}
.qq{font:600 18px 'IBM Plex Sans',sans-serif}.qn{font:500 12px var(--mono);color:var(--dim)}
.win{background:#0F2523;border:1px solid rgba(79,209,197,.5);color:var(--ink);border-radius:12px;padding:18px}.win .btn{background:var(--pad);color:#0B1513}.win .btn:not(:first-child){background:transparent;color:var(--ink);border-color:var(--line2)}
.tryit{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--pad);border-radius:8px;padding:10px 12px}
.chal{background:#19160F;border:1px solid rgba(245,165,36,.6);color:var(--ink);border-radius:10px;padding:12px 14px;font:500 14.5px/1.5 'IBM Plex Sans',sans-serif}
.steps li::before{border:1.5px solid var(--line2);width:16px;height:16px;top:8px}.steps li.ok::before{background:var(--pad);border-color:var(--pad)}
.slider{accent-color:var(--pad)}
.namebox input,input[type="text"]{min-height:40px;border-radius:8px;border:1px solid var(--line2);background:var(--bg);color:var(--ink);font:400 14px 'IBM Plex Sans',sans-serif;padding:0 12px}
.words{columns:2 320px;column-gap:40px}.words dt{font:600 14px var(--mono);color:var(--pad);margin-top:12px;break-after:avoid}.words dd{margin:0;color:var(--muted);font-size:14px;break-inside:avoid}
details.grown{margin-top:44px;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:transparent}details.grown summary{cursor:pointer;font:600 14px 'IBM Plex Sans',sans-serif;color:var(--muted)}details.grown li{color:var(--muted);font-size:14px}
.foot{margin:36px 0 0;font-size:12px;color:var(--dim)}
.cert{background:#16181C;color:var(--ink);border:1px solid var(--yellow);border-radius:14px}.cert h2{font-size:24px}
/* ---- Shell ---- */
.app{display:grid;grid-template-columns:240px minmax(0,1fr);min-height:100vh}
.side{position:sticky;top:0;height:100vh;overflow-y:auto;display:flex;flex-direction:column;gap:22px;padding:18px 12px 14px;background:var(--panel);border-right:1px solid var(--line);z-index:21}
.logo{display:flex;align-items:center;gap:10px;padding:0 8px;font:700 16px 'IBM Plex Sans',sans-serif;letter-spacing:-.01em;color:var(--ink)}
.logo .lg{width:28px;height:28px;border-radius:7px;background:var(--pad);color:#0E1013;display:grid;place-items:center}
.snavs{display:flex;flex-direction:column;gap:2px}
.snav{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:7px;color:var(--muted);font-weight:500;font-size:14px}.snav:hover{color:var(--ink);background:#171A20}.snav.on{background:#1C2026;color:var(--ink)}
.slvs{display:flex;flex-direction:column;gap:1px}.slh{font:500 11px var(--mono);letter-spacing:.08em;color:var(--dim);text-transform:uppercase;padding:0 10px 6px}
.slvl{display:grid;grid-template-columns:22px minmax(0,1fr) auto;gap:8px;align-items:center;padding:6px 10px;border-radius:6px;font-size:13px;color:#C9CFD6}.slvl:hover{background:#171A20}.slvl.on{background:#1C2026;color:var(--ink)}
.slvl .n,.slvl .m{font:500 11px var(--mono);color:var(--dim)}.slvl .t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.slvl .m.ok{color:var(--pad)}.slvl .m.cur{color:var(--yellow)}.slvl.soon,.slvl.soon .t{color:#6B747F}
.sprog{margin-top:auto;padding:12px;border:1px solid var(--line);border-radius:8px;display:flex;flex-direction:column;gap:8px;font-size:12px;color:var(--muted)}.sprog>span:first-child{display:flex;justify-content:space-between}.sprog b{font:500 12px var(--mono);color:var(--ink)}
.shell{min-width:0;display:flex;flex-direction:column}
.top{position:sticky;top:0;z-index:20;height:56px;display:flex;align-items:center;gap:16px;padding:0 36px;border-bottom:1px solid var(--line);background:rgba(14,16,19,.9);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
.tcr{min-width:0;flex:1}
.crumbs{display:flex;align-items:center;gap:8px;font:400 13px 'IBM Plex Sans',sans-serif;color:var(--dim);margin:0 0 14px;flex-wrap:wrap}.crumbs a:hover{color:var(--ink)}.crumbs span:not(:last-child){color:#4A525C}
.top .crumbs{margin:0;flex-wrap:nowrap;overflow:hidden;white-space:nowrap}.top .crumbs>*:last-child{color:var(--ink)}
.tsw{position:relative}
.tsearch{display:flex;align-items:center;gap:8px;width:320px;height:34px;padding:0 10px;border:1px solid var(--line2);border-radius:7px;color:var(--dim);background:var(--panel)}.tsearch:focus-within{border-color:var(--pad)}
.tsearch input{flex:1;min-width:0;background:none;border:0;color:var(--ink);font:400 13px 'IBM Plex Sans',sans-serif;outline:none;-webkit-appearance:none;appearance:none}.tsearch input::-webkit-search-cancel-button{display:none}
.tsearch kbd{font:500 11px var(--mono);border:1px solid var(--line2);border-radius:4px;padding:0 5px;color:var(--dim)}
.tres{position:absolute;right:0;top:40px;width:420px;max-height:440px;overflow:auto;background:#15181D;border:1px solid var(--line2);border-radius:10px;padding:6px;box-shadow:0 16px 40px rgba(0,0,0,.55);z-index:30}.tres[hidden]{display:none}
.tres a{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:8px 10px;border-radius:6px;font-size:13px}.tres a b{font-weight:500}.tres a span{color:var(--dim);font:400 11.5px var(--mono);white-space:nowrap}.tres a.on,.tres a:hover{background:#1F242B}.tres p{margin:8px 10px}
main{max-width:1000px;margin:0;padding:32px 36px 64px}main.wide{max-width:none}
/* ---- Home ---- */
.hgrid{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(280px,1fr);gap:20px}
.hcont{display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,300px);gap:28px;padding:28px;border:1px solid var(--line);border-radius:12px;background:var(--card)}
.hcm{display:flex;flex-direction:column;gap:10px;min-width:0}.hcm h1{font-size:30px;margin:0;line-height:1.15}.hcm .lead{color:var(--muted);margin:0 0 6px;font-size:15px}.hcm .row{margin-top:auto;padding-top:10px}
.hcm .namebox{display:flex;flex-direction:column;gap:6px;margin-top:6px}.hcm .namebox .row{padding:0}
.hcl{list-style:none;margin:0;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--bg);display:flex;flex-direction:column;gap:2px;align-self:start}
.hcl a{display:flex;gap:10px;align-items:center;padding:7px 8px;border-radius:6px;font-size:13px;color:var(--muted)}.hcl a:hover{background:#171A20;color:var(--ink)}
.hcl .mn,.mlist .mn{flex:0 0 auto;width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font:500 11px var(--mono);border:1px solid var(--line2);color:var(--muted)}
.hcl li.ok .mn,.mlist a.ok .mn{background:var(--pad);border-color:var(--pad);color:#0E1013}.hcl li.cur a{color:var(--ink);background:#1A1E24}.hcl li.cur .mn,.mlist a.cur .mn{border-color:var(--yellow);color:var(--yellow)}
.hstats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-content:start}
.stat{display:flex;flex-direction:column;gap:6px;padding:16px 18px;border:1px solid var(--line);border-radius:12px}.stat .sl{font-size:12px;color:var(--dim)}.stat b{font:500 26px var(--mono);line-height:1.15;letter-spacing:-.02em}.stat b small{font-size:15px;color:#6B747F}
.sec{margin-top:40px}.sechead{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 12px;margin-bottom:14px}.sechead h2,.sechead h1{margin:0}.sechead p{margin:0;font-size:13px}
.lvgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.lvcard{display:flex;flex-direction:column;gap:8px;padding:16px;min-height:150px;border:1px solid var(--line);border-radius:10px;background:var(--card);transition:border-color .15s}.lvcard:hover{border-color:#3A414B}.lvcard.cur{border-color:var(--yellow)}
.lvtop{display:flex;justify-content:space-between;gap:8px;font:500 11px var(--mono);color:var(--dim);text-transform:uppercase;letter-spacing:.06em}.lvcard.done .st{color:var(--pad)}.lvcard.cur .st{color:var(--yellow)}
.lvcard b{font-size:15px;font-weight:600;line-height:1.3}.lvb{font-size:12.5px;color:var(--dim);flex:1;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.lvcard.cur .bar i{background:var(--yellow)}
.lvcard.soon{border-style:dashed;background:transparent}.lvcard.soon b{color:var(--dim)}
.lbgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}.lbgrid.full{grid-template-columns:repeat(auto-fill,minmax(290px,1fr))}
.lbcard,.psm{display:flex;flex-direction:column;gap:4px;padding:16px;border:1px solid var(--line);border-radius:10px;background:var(--panel);transition:border-color .15s}.lbcard:hover,.psm:hover{border-color:#3A414B}
.lbic{width:34px;height:34px;border-radius:8px;display:grid;place-items:center;margin-bottom:8px;background:#1C2026;color:var(--pad)}
.lbcard b,.psm b{font-weight:600}.lbs{font-size:12.5px;color:var(--dim)}.lbl{font:400 11.5px var(--mono);color:var(--muted);margin-top:auto;padding-top:8px}
.lbcard.soon{border-style:dashed;background:transparent}.lbcard.soon:hover{border-color:var(--line)}.lbcard.soon .lbic{background:#1C2026;color:#6B747F}.lbcard.soon .lbl{color:var(--yellow)}
.lbcard ul{margin:6px 0 4px;padding-left:16px;font-size:13px;color:var(--muted)}.lbcard li{margin:2px 0}
.lab-arduino .lbic{background:#0B3A3E;color:#5ED3DC}.lab-sensors .lbic{background:#2A2346;color:#B79CFF}.lab-uniko .lbic{background:#16304A;color:#6CB4FF}.lab-board .lbic{background:#3A2E18;color:#F5A524}
.ptiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}
.badges{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.badge{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px dashed var(--line2);border-radius:10px}.badge>span:last-child{display:flex;flex-direction:column}.badge b{font-weight:600;font-size:14px}.badge span span{font-size:12px;color:var(--dim)}
.medal{flex:0 0 auto;display:grid;place-items:center;width:40px;height:40px;border-radius:50%;font-size:20px;border:1px solid var(--line2);background:var(--card);color:var(--dim)}
.badge.got{border-style:solid;border-color:#3A3220;background:#15130E}.badge.got .medal{background:#2A2414;border-color:var(--yellow)}
/* ---- Level page ---- */
.lvhead{display:flex;justify-content:space-between;align-items:flex-end;gap:24px;flex-wrap:wrap;padding-bottom:22px;margin-bottom:6px;border-bottom:1px solid var(--line)}.lvhead>div{flex:1 1 420px}
.lvhead h1{margin:6px 0 4px}.lvhead .lead{color:var(--muted);max-width:62ch;margin:0 0 14px}.lvhead .bar{max-width:420px}
.mlist{list-style:none;margin:0;padding:0}
.mlist a{display:grid;grid-template-columns:36px minmax(0,1fr) 70px 70px;align-items:center;gap:14px;padding:14px 8px;border-bottom:1px solid var(--line)}.mlist a:hover{background:var(--card)}
.mlist .mn{width:28px;height:28px;font-size:12px}.mlist .mt b{display:block;font-weight:600}.mlist .mt span{font-size:13px;color:var(--dim)}
.mlist .mk,.mlist .ms{font:400 11.5px var(--mono);color:var(--dim)}.mlist a.ok .ms{color:var(--pad)}.mlist a.cur .ms{color:var(--yellow)}
.chnav{display:flex;justify-content:space-between;gap:12px;margin:22px 0 0;font-size:13px;color:var(--muted)}.chnav a:hover{color:var(--ink)}
/* ---- Sensor library ---- */
.slib{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.scard{display:flex;flex-direction:column;gap:4px;padding:16px;border-radius:10px;background:var(--card);border:1px solid var(--line);color:var(--ink);transition:border-color .15s}.scard:hover{border-color:#3A414B;transform:none}
.scard b{font:600 15px 'IBM Plex Sans',sans-serif}.scard p{margin:0;color:var(--dim);font-size:13px}
.smpic{width:100%;height:110px;margin-bottom:8px;overflow:visible;background:#0F2A1C;border-radius:8px;padding:10px 0}.smpic.big{height:240px;background:none;padding:0}
.smpic text{font:600 11px 'IBM Plex Sans',sans-serif}
.spicw{background:radial-gradient(circle at 50% 40%,#13452C,#0A2A1A);border:1px solid var(--line);border-radius:12px;padding:18px}
.sdet .lead{color:var(--muted)}
.sgrid .panel h3{margin-top:0}
/* ---- Lab workbench ---- */
body.labmode{overflow:hidden}body.labmode .side,body.labmode .top{display:none}body.labmode .app{display:block}
.lab{position:fixed;inset:0;z-index:30;display:grid;height:100vh;height:100dvh;grid-template-columns:minmax(200px,236px) minmax(0,1fr) minmax(300px,380px);grid-template-rows:auto minmax(0,1fr) auto;grid-template-areas:"head head head" "tools board side" "foot foot foot";background:#0B0D10;font-size:14px}
.lhead{grid-area:head;display:flex;align-items:center;gap:14px;padding:8px 16px;min-height:56px;background:var(--panel);border-bottom:1px solid var(--line)}
.lexit{display:flex;align-items:center;gap:6px;height:34px;padding:0 10px;border:1px solid var(--line2);border-radius:7px;color:var(--muted);font:500 13px 'IBM Plex Sans',sans-serif}.lexit:hover{color:var(--ink);border-color:#3D444F}
.ltitle{min-width:0}.ltitle b{display:block;font:600 15px 'IBM Plex Sans',sans-serif;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ltitle .eyebrow{font-size:10.5px;color:var(--dim)}
.lprog{display:flex;gap:4px}.lprog i{width:22px;height:4px;border-radius:2px;background:var(--line2)}.lprog i.ok{background:var(--pad)}
.lctl{margin-left:auto;display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.lbtn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line2);background:transparent;color:var(--ink);border-radius:7px;padding:0 12px;font:500 13px 'IBM Plex Sans',sans-serif;cursor:pointer;min-height:34px}.lbtn:hover{border-color:#3D444F}.lbtn:disabled{opacity:.4;cursor:default}
.ugo{background:var(--pad);color:#0B1513;border-color:var(--pad);font-weight:600}.ugo:hover{border-color:var(--pad);filter:brightness(1.08)}.ugo.on{background:var(--yellow);border-color:var(--yellow);color:#1A1204}
.lab .cbar{display:flex;align-items:center;gap:6px}.lab .cbar .muted{display:none}.lab .cbar .seg button{min-height:30px;font-size:12.5px}
.ltools{grid-area:tools;overflow-y:auto;padding:12px;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;gap:12px}
.tfind{display:flex;align-items:center;gap:8px;height:32px;padding:0 10px;border:1px solid var(--line2);border-radius:7px;color:var(--dim);flex:0 0 auto}.tfind:focus-within{border-color:var(--pad)}.tfind input{flex:1;min-width:0;background:none;border:0;color:var(--ink);font:400 13px 'IBM Plex Sans',sans-serif;outline:none}
.tgrp{display:flex;flex-direction:column;gap:6px}.tgrp[hidden]{display:none}.tgh{font:500 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.lab .ctools{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px;margin:0;padding:0}
.ctool{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:58px;padding:4px 2px;border-radius:8px;border:1px solid var(--line);background:transparent;color:#C9CFD6;cursor:pointer;font:500 10.5px 'IBM Plex Sans',sans-serif}
.lab .ctool{width:auto}.ctool:hover{border-color:#3D444F;background:#15181D}.ctool[hidden]{display:none}
.ctool[aria-pressed="true"]{border-color:var(--pad);background:#14201F;box-shadow:none;color:var(--ink)}
.ctool svg{width:46px;height:28px;overflow:visible}.ctool .e{display:grid;place-items:center;height:28px;color:var(--muted)}.ctool .e svg{width:20px;height:20px}
.ctool.cneed{border-color:#7fe6ff}
.lbar{position:absolute;top:10px;left:50%;transform:translateX(-50%);z-index:6;display:flex;align-items:center;gap:4px;padding:4px;max-width:calc(100% - 16px);overflow-x:auto;background:rgba(17,20,24,.92);border:1px solid var(--line2);border-radius:12px;box-shadow:0 10px 30px -12px rgba(0,0,0,.6);backdrop-filter:blur(6px)}
.btool,.lab .lbar .btool{display:flex;flex-direction:row;justify-content:flex-start;min-height:0;min-width:0;align-items:center;gap:6px;height:36px;padding:0 10px;border-radius:8px;border:1px solid transparent;background:transparent;color:#C9CFD6;font:500 12.5px 'IBM Plex Sans',sans-serif;cursor:pointer;white-space:nowrap;flex:none}
.btool:hover:not(:disabled){background:#1C2026}.btool:disabled{opacity:.35;cursor:default}
.btool[aria-pressed="true"]{border-color:var(--pad);background:#14201F;color:var(--ink)}
.btool svg{width:30px;height:20px;overflow:visible}.btool .e{display:grid;place-items:center;color:var(--muted)}.btool .e svg{width:18px;height:18px}.btool[data-h] svg{width:18px;height:18px}
.btool.cneed{border-color:#7fe6ff}
.bsep{width:1px;height:22px;background:var(--line2);margin:0 4px;flex:none}.bsep.wide{margin:0 4px 0 14px}
.btool.bdel{color:#E8A39C}.btool.bdel .e{color:#E8A39C}.btool.bdel[aria-pressed="true"]{border-color:var(--red);background:#2A1513;color:#FFB4AC}
.lab.erasing .lboard{box-shadow:inset 0 0 0 2px rgba(255,90,78,.55)}.lab.erasing .csvg{cursor:crosshair}
@container (max-width:680px){.btool .bl{display:none}.lab .lbar .btool{padding:0 8px}}
.lbar{scrollbar-width:none}.lbar::-webkit-scrollbar{display:none}
.ctw{position:relative;display:grid;min-width:0}.ctw[hidden]{display:none}
.cinfo{position:absolute;top:3px;right:3px;width:17px;height:17px;border-radius:50%;border:1px solid var(--line2);background:var(--panel);color:var(--dim);font:600 10.5px/15px var(--mono);padding:0;cursor:pointer;text-align:center}.cinfo:hover,.cinfo:focus-visible{color:var(--pad);border-color:var(--pad)}
.wpop{position:fixed;z-index:60;width:min(380px,calc(100vw - 16px));max-height:calc(100vh - 16px);overflow:auto;background:var(--card);border:1px solid var(--line2);border-radius:12px;padding:14px 16px;box-shadow:0 24px 60px -20px rgba(0,0,0,.7);display:flex;flex-direction:column;gap:10px}
.wphead{display:flex;justify-content:space-between;align-items:center;gap:8px}.wpx{background:none;border:0;color:var(--muted);font-size:22px;line-height:1;cursor:pointer;padding:0 4px}
.wppic{display:grid;place-items:center;background:var(--deep);border-radius:8px;padding:8px}.wppic .smpic{max-width:100%;height:auto;max-height:130px}
.wptab{font-size:12.5px}.wppin{display:inline-block;font:500 11.5px var(--mono);color:var(--pad);border:1px solid #1f4d49;border-radius:5px;padding:1px 6px;white-space:nowrap}
.lboard{grid-area:board;min-width:0;min-height:0;padding:58px 10px 10px;position:relative;container-type:inline-size;display:flex;background:radial-gradient(ellipse at 50% 45%,#191D23 0%,#0B0D10 75%)}
.lab .cstage{flex:1;display:flex;margin:0;padding:0;max-width:none;min-height:0}.lab .cboard{flex:1;display:flex;min-height:0}
.lab .csvg{max-width:none;width:100%;height:100%;border-radius:12px}
.lab .c3wrap{aspect-ratio:auto!important;max-width:none!important;width:100%;height:100%;flex:1;background:transparent;box-shadow:none;border-radius:0}.lab .c3load{flex:1;aspect-ratio:auto;max-width:none;background:transparent}
.c3wrap{background:radial-gradient(ellipse at 50% 40%,#1A1E24 0%,#0E1013 70%);box-shadow:inset 0 0 0 1px var(--line);border-radius:12px}
.c3load{background:var(--card);color:var(--dim);font:500 14px 'IBM Plex Sans',sans-serif;border-radius:12px}
.c3b{border-radius:8px;background:rgba(19,22,27,.9);box-shadow:0 0 0 1px var(--line2);font:500 16px 'IBM Plex Sans',sans-serif;color:var(--ink)}
.c3hint{font:400 12px 'IBM Plex Sans',sans-serif;color:var(--dim);text-shadow:none}
.lside{grid-area:side;display:flex;flex-direction:column;min-height:0;background:var(--panel);border-left:1px solid var(--line)}
.lside #cmeter:not(:empty){padding:12px 14px 0}.lside .cmeterp{margin:0;padding:10px}.lside .lcd b{font-size:22px}
.ltabs{display:flex;gap:0;padding:0 8px;border-bottom:1px solid var(--line);overflow-x:auto}
.ltabs button{flex:0 0 auto;border:0;background:none;color:var(--dim);font:500 13px 'IBM Plex Sans',sans-serif;padding:12px 11px;cursor:pointer;position:relative;white-space:nowrap}.ltabs button:hover{color:var(--ink)}
.ltabs button[aria-selected="true"]{color:var(--ink);box-shadow:inset 0 -2px 0 var(--pad)}
.lbadge:not(:empty){display:inline-grid;place-items:center;min-width:17px;height:17px;margin-left:5px;border-radius:9px;background:var(--red);color:#fff;font:600 10.5px var(--mono);padding:0 4px}
.lpane{flex:1;overflow-y:auto;padding:14px 16px 18px}.lpane[hidden]{display:none}
.lpane .panel{margin:0 0 10px;padding:12px}.lpane .chal{font-size:14px}.lpane .cins{margin:0}
.lintro{margin-bottom:12px;font-size:14px;color:var(--muted)}.lintro summary{cursor:pointer;font:500 12px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--dim);margin-bottom:6px}.lintro p{margin:.3em 0 .6em}.lintro b{color:var(--ink)}
.lempty{padding:10px 2px;font-size:13px}
.lfoot{grid-area:foot;display:flex;align-items:center;gap:14px;padding:6px 16px;min-height:38px;background:var(--panel);border-top:1px solid var(--line);font-size:12.5px}
.ltip{flex:1;color:var(--dim);min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.lsum{border:0;background:rgba(79,209,197,.1);color:var(--pad);font:500 12px var(--mono);padding:5px 10px;border-radius:6px;cursor:pointer;white-space:nowrap}.lsum:empty{display:none}.lsum.bad{background:rgba(255,90,78,.12);color:var(--bad)}
.lpn{display:flex;gap:6px}.lpn a{padding:4px 10px;border:1px solid var(--line2);border-radius:6px;font:500 12px 'IBM Plex Sans',sans-serif;color:var(--muted);white-space:nowrap}.lpn a:hover{color:var(--ink);border-color:#3D444F}
/* status lines, "Why?" help and the goal panel inside the lab */
.cst{padding:8px 0;border-bottom:1px solid var(--line)}.cstb{display:flex;align-items:flex-start;gap:10px;font-size:13.5px;line-height:1.45}
.sdot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;margin-top:6px;background:var(--pad)}.cst.bad .sdot{background:var(--red)}.cst.bad .cstb b{color:var(--ink)}
.cwhy{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin:6px 0 4px 18px;font-size:13.5px}.cwhy p{margin:.2em 0 .6em}.cwhy .lbl2{font:500 10.5px var(--mono);letter-spacing:.07em;text-transform:uppercase;color:var(--dim);display:block}
.cst .btn.cmini,.cmini{min-height:30px;padding:0 10px;font-size:12.5px;border-radius:6px}.cst>.btn.line.cmini{margin-left:18px}
.gdots i{height:4px}.gdots i.ok{background:var(--pad)}
.lcd{border-width:1px;border-radius:8px;background:#11181A;border-color:#3A3420}.lcd .lcdl{font:500 10.5px var(--mono)}.cmeterp{background:#15140F;border:1px solid #3A3420}
table.upins{font-size:12.5px}table.upins th{font:500 11px var(--mono);color:var(--dim);text-transform:uppercase;letter-spacing:.05em}table.upins td{border-top:1px solid var(--line)}table.upins td:first-child{font-family:var(--mono)}
.useri{background:#0A0C0E;border:1px solid var(--line);border-radius:8px;font:12.5px var(--mono)}
.ublk{font:500 12.5px 'IBM Plex Sans',sans-serif;border-radius:6px}
.upex{background:var(--card);border:1px solid var(--line);border-radius:8px}.upex:hover{border-color:#3D444F}.upex b{font:600 14px 'IBM Plex Sans',sans-serif}
.uphead b{font:600 14px 'IBM Plex Sans',sans-serif}
.uin h4{font:500 11px var(--mono);letter-spacing:.07em;color:var(--dim)}
.ubadge{font:500 11.5px var(--mono);background:rgba(17,20,24,.9);border-color:var(--line2)}
.utoast{background:var(--pad);color:#0B1513;font:500 14px 'IBM Plex Sans',sans-serif;border-radius:10px}
.uempty{background:rgba(17,20,24,.96);border:1px solid var(--line2);border-radius:12px}.uempty b{font:600 15px 'IBM Plex Sans',sans-serif;color:var(--ink)}
.uhold{font:600 15px 'IBM Plex Sans',sans-serif;border-radius:10px}
.ulab{grid-template-columns:minmax(230px,23%) minmax(0,1fr) minmax(300px,27%)}
.ulab .ltools{display:block}
@media (max-width:1100px){.hgrid{grid-template-columns:1fr}.hstats{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:900px){
.app{grid-template-columns:1fr}
.side{position:sticky;top:0;height:auto;flex-direction:row;align-items:center;gap:8px;padding:8px 12px;border-right:0;border-bottom:1px solid var(--line);overflow-x:auto}
.slvs,.sprog{display:none}.snavs{flex-direction:row}.snav{padding:7px 9px}
.top{position:static;height:auto;min-height:48px;padding:8px 16px;flex-wrap:wrap;background:var(--bg)}
main{padding:20px 16px 48px}.hcont{grid-template-columns:1fr}.hstats{grid-template-columns:repeat(2,minmax(0,1fr))}
.lab{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(220px,1fr) auto minmax(0,38vh) auto;grid-template-areas:"head" "board" "tools" "side" "foot"}
/* every tool visible at once: one wrapping grid, no sideways scrolling */
.ltools{display:grid;grid-template-columns:repeat(auto-fill,minmax(64px,1fr));gap:5px;max-height:34vh;overflow-y:auto;overflow-x:hidden;border:0;border-top:1px solid var(--line);padding:8px 10px}
.tfind,.tgh{display:none}.tgrp,.lab .ctools{display:contents}.lab .ctool{min-width:0;min-height:56px}
.lside{border-left:0;border-top:1px solid var(--line)}
.lhead{flex-wrap:wrap;gap:8px}.lprog{display:none}.lctl{width:100%;justify-content:flex-start}.lexit span{display:none}.lpn a:first-child{display:none}
.ulab{grid-template-rows:auto minmax(220px,1fr) minmax(0,26vh) minmax(0,34vh) auto}}
@media (max-width:560px){.snav span,.logo>span:last-child{display:none}.tcr{display:none}.tsw{flex:1}.tsearch{width:auto}.tres{width:calc(100vw - 32px)}
.mlist a{grid-template-columns:32px minmax(0,1fr) auto}.mlist .mk{display:none}.hcont{padding:18px}.hcm h1{font-size:24px}.sdet{grid-template-columns:1fr}
.lab{grid-template-rows:auto minmax(250px,1fr) auto minmax(0,36vh) auto}.lfoot{gap:8px;padding:6px 10px}.ltip{font-size:12px}}
.ltabs{scrollbar-width:none}.ltabs::-webkit-scrollbar{display:none}
/* tablets in landscape: slimmer side columns and compact tiles, so the board gets room and every tool fits */
@media (min-width:901px) and (max-width:1250px){
.lab{grid-template-columns:200px minmax(0,1fr) 300px}.ulab{grid-template-columns:minmax(220px,24%) minmax(0,1fr) 290px}
.ltools{padding:10px 8px;gap:8px}.tgrp{gap:4px}.lab .ctools{gap:4px}
.lab .ctool{min-height:50px;gap:2px;font-size:10px}.ctool svg{width:42px;height:24px}.ctool .e{height:24px}
.tfind{height:30px}
.lhead{gap:10px;padding:6px 12px}.lbtn{padding:0 10px;font-size:12.5px}}
/* tablets in portrait: give the board a little more of the height */
@media (min-width:561px) and (max-width:900px){.lab:not(.ulab){grid-template-rows:auto minmax(240px,1fr) auto minmax(0,32vh) auto}}
@media (min-width:901px) and (max-height:720px){.tfind{display:none}.lab .ctool{min-height:48px}}
.certname{margin:8px 0 12px}.certname input{text-align:center}
/* certificates and badges: line icons in place of emoji */
.certic{display:grid;place-items:center;width:72px;height:72px;margin:0 auto 6px;border-radius:50%;border:1px solid var(--yellow);color:var(--yellow);background:#1C1810}
.badge.got .medal{color:var(--yellow)}
.blk .e{display:grid;place-items:center;height:34px;color:var(--pad)}.info .e{color:var(--pad)}.info .row .e{display:grid;place-items:center}
.lane .car{transform:none;top:16px;color:var(--yellow)}.lane .flag{color:var(--muted)}
.mem .val .ico{margin:4px auto}
.plug .ico,.hot .ico{display:inline-block;vertical-align:-3px}
/* Learners: the sidebar chip and the "Who's learning?" page */
.av{flex:0 0 auto;display:inline-grid;place-items:center;border-radius:50%;color:#0E1013;font-weight:700;line-height:1}
.av.plus{background:transparent!important;border:1.5px dashed var(--line2);color:var(--muted);font-weight:400}
.slearner{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;margin-top:-8px}.slearner:hover,.slearner.on{border-color:#3A414B;background:#171A20}
.sln{display:flex;flex-direction:column;min-width:0;line-height:1.25}.sln b{font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sln span{font-size:11.5px;color:var(--dim)}
.who h1{margin:0 0 4px}
.wgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px;margin-top:20px}
.wcard{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px;padding:22px 16px;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--ink);cursor:pointer;font:inherit;transition:border-color .15s}
.wcard:hover{border-color:#3A414B}.wcard.on{border-color:var(--pad)}.wcard b{font-size:16px;font-weight:600}.wcard span{font-size:13px;color:var(--dim)}
.wcard.wnew{border-style:dashed;background:transparent}.wadd{cursor:default;align-items:stretch;text-align:left}.wadd label{font-size:13px;color:var(--muted)}.wadd .row{justify-content:flex-start}
.wlist{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.wrow{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 14px;border-top:1px solid var(--line)}.wrow:first-child{border-top:0}
.wrow input{flex:1 1 160px;min-width:0}
.wsw{display:flex;gap:4px}.wc{width:20px;height:20px;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}.wc.on{border-color:var(--ink)}
.wdel{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.wdanger{background:var(--red);border-color:var(--red);color:#fff}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
@media (max-width:900px){.slearner{margin:0;padding:4px;border:0}.sln{display:none}}
/* Arduino Lab: Code mode (the block editor is big, the board is a small live view) and Chip mode
   (the board and sensors are big, the code sits beside them and lights up the block that is running) */
.lcode{grid-area:code;display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--bg);position:relative}
.lcbar{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--line);background:var(--panel);min-height:42px}
.lcname{flex:1;min-width:0;font:600 13px 'IBM Plex Sans',sans-serif;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lcex{height:30px;border-radius:6px;border:1px solid var(--line2);background:var(--card);color:var(--ink);font:500 12.5px 'IBM Plex Sans',sans-serif;padding:0 6px;max-width:150px}
.bly{flex:1;min-height:0;position:relative}
.lcmsg{position:absolute;inset:42px 0 0;display:grid;place-items:center;text-align:center;padding:20px;color:var(--muted);font-size:13.5px;pointer-events:none}.lcmsg[hidden]{display:none}.lcmsg b{display:block;color:var(--ink)}
.lmode button{display:inline-flex;align-items:center;gap:5px;min-height:30px;font-size:12.5px;padding:4px 11px}
.lmode button svg{width:14px;height:14px}
.unolab.m-code{grid-template-columns:minmax(0,1fr) minmax(280px,30%);grid-template-rows:auto minmax(0,44fr) minmax(0,56fr) auto;grid-template-areas:"head head" "code board" "code side" "foot foot"}
.unolab.m-code .ltools{display:none}
.unolab.m-code .lboard{border-left:1px solid var(--line);border-bottom:1px solid var(--line)}
.unolab.m-code .lside{border-left:1px solid var(--line)}
.unolab.m-code #blyv,.unolab.m-code #lcedit,.unolab.m-code #cflow,.unolab.m-code #cclr{display:none}
.unolab.m-chip{grid-template-rows:auto minmax(0,1fr) minmax(0,1fr) auto;grid-template-areas:"head head head" "tools board code" "tools board side" "foot foot foot"}
.unolab.m-chip .lcode{border-left:1px solid var(--line);border-bottom:1px solid var(--line)}
.unolab.m-chip #bly,.unolab.m-chip #lcnew,.unolab.m-chip #lcex,.unolab.m-chip #lctest{display:none}
.unolab.m-noed .bly{display:none}
/* the running block glows; a block the program doctor is worried about pulses red */
.clrun>.blocklyPath{stroke:#FFFFFF!important;stroke-width:3px!important;filter:drop-shadow(0 0 6px rgba(255,255,255,.75))}
.clflag>.blocklyPath{stroke:var(--red)!important;stroke-width:3px!important;animation:cpulse 1s ease-in-out infinite}
.lcode .blocklyToolboxDiv{background:var(--panel);border-right:1px solid var(--line)}
.lcode .blocklyTreeRow{height:34px;line-height:34px;margin-bottom:2px;border-radius:0 6px 6px 0}
.lcode .blocklyTreeLabel{font:500 13px 'IBM Plex Sans',sans-serif;color:var(--muted)}
.lcode .blocklyTreeSelected .blocklyTreeLabel{color:#fff}
.lcode .blocklyFlyoutButton .blocklyFlyoutButtonBackground{fill:var(--card);stroke:var(--line2)}
.lcode .blocklyFlyoutButton .blocklyText{fill:var(--ink)}
.blocklyWidgetDiv,.blocklyDropDownDiv,.blocklyTooltipDiv{z-index:100000}
@media (min-width:901px) and (max-width:1250px){.unolab.m-code{grid-template-columns:minmax(0,1fr) 300px}}
@media (max-width:900px){
.unolab.m-code{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) minmax(0,30vh) auto;grid-template-areas:"head" "code" "board" "foot"}
.unolab.m-code .lside{display:none}.unolab.m-code .lboard{border-left:0;border-top:1px solid var(--line)}
.unolab.m-chip{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(200px,1fr) minmax(0,24vh) auto minmax(0,26vh) auto;grid-template-areas:"head" "board" "code" "tools" "side" "foot"}
.unolab.m-chip .ltools{max-height:18vh}.unolab.m-chip .lcode{border-left:0;border-top:1px solid var(--line)}
.lcex{max-width:120px}}
/* tablets in portrait: in Chip mode the code sits beside the board, so the board keeps most of the height */
@media (min-width:561px) and (max-width:900px){
.unolab.m-chip{grid-template-columns:minmax(0,1fr) minmax(250px,38%);grid-template-rows:auto minmax(0,1fr) auto minmax(0,24vh) auto;grid-template-areas:"head head" "board code" "tools tools" "side side" "foot foot"}
.unolab.m-chip .lcode{border-top:0;border-left:1px solid var(--line)}
.unolab.m-chip .ltools{max-height:none}}
@media (max-width:560px){.lcname{display:none}.lcbar{justify-content:flex-end}}
/* Uniko Lab: Board mode keeps the program list beside the board; Code mode opens the block editor */
.ulab.m-chip .lcode{display:none}
.ulab.m-code{grid-template-columns:minmax(0,1fr) minmax(280px,30%);grid-template-rows:auto minmax(0,44fr) minmax(0,56fr) auto;grid-template-areas:"head head" "code board" "code side" "foot foot"}
.ulab.m-code .uprog,.ulab.m-code #ustep,.ulab.m-code #uspeed,.ulab.m-code .uempty{display:none}
.ulab.m-code .lboard,.ulab.m-code .lside{border-left:1px solid var(--line)}
@media (max-width:900px){.ulab.m-code{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) minmax(0,30vh) auto;grid-template-areas:"head" "code" "board" "foot"}.ulab.m-code .lside{display:none}}
/* Chip mode code bar: what the program is doing, slow motion and Step */
.lcnow{font:500 11px var(--mono);letter-spacing:.04em;text-transform:uppercase;color:var(--dim);display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.lcnow::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--dim)}.lcnow:empty{display:none}
.lcnow.run{color:var(--green)}.lcnow.run::before{background:var(--green);animation:cpulse 1.2s ease-in-out infinite}.lcnow.pause{color:var(--yellow)}.lcnow.pause::before{background:var(--yellow)}.lcnow.err{color:var(--bad)}.lcnow.err::before{background:var(--bad)}
.lcsp button{min-height:28px;padding:3px 9px;font-size:12px}
.unolab.m-code .lcnow,.unolab.m-code .lcsp,.unolab.m-code #lcstep{display:none}
.unolab.m-chip .lcname{flex:0 1 auto}.unolab.m-chip .lcbar{flex-wrap:wrap;row-gap:6px}.unolab.m-chip #lcedit{margin-left:auto}
.lcexs{margin-top:10px}.lcexs summary{cursor:pointer;font:500 12px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--dim);margin-bottom:8px}
.unolab.m-chip .lcname{flex:1 1 auto;order:1}.unolab.m-chip .lcnow{order:2}.unolab.m-chip #lcedit{order:3;margin-left:0}
.unolab.m-chip .lcbar::after{content:"";order:4;flex-basis:100%;height:0}.unolab.m-chip .lcsp{order:5}.unolab.m-chip #lcstep{order:6}
.lcnow.ready{color:var(--pad)}.lcnow.ready::before{background:var(--pad)}
@media (max-width:900px){.unolab.m-chip .lcname{display:none}.unolab.m-chip .lcnow{flex:1}}
/* Focus mode: one thing, full screen. Code mode keeps only the block editor; otherwise the board and its parts. */
.lfexit{display:none}
.lab.focus{grid-template-columns:minmax(200px,236px) minmax(0,1fr)!important;grid-template-rows:minmax(0,1fr)!important;grid-template-areas:"tools board"!important}
.lab.focus .lhead,.lab.focus .lside,.lab.focus .lfoot,.lab.focus .lcode{display:none!important}
.lab.focus .ltools{display:flex!important;max-height:none!important}
.lab.focus .lboard{border:0!important}
.lab.unolab.m-code.focus{grid-template-columns:minmax(0,1fr)!important;grid-template-areas:"code"!important}
.lab.unolab.m-code.focus .lcode{display:flex!important}.lab.unolab.m-code.focus .lboard,.lab.unolab.m-code.focus .ltools,.lab.unolab.m-code.focus .lcbar{display:none!important}
.lab.focus .lfexit{display:inline-flex;align-items:center;gap:8px;position:fixed;top:calc(12px + env(safe-area-inset-top,0px));right:16px;z-index:40;border:1px solid var(--line2);background:rgba(17,20,24,.92);color:var(--ink);font:500 13px 'IBM Plex Sans',sans-serif;padding:8px 14px;border-radius:999px;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.4);backdrop-filter:blur(6px)}
.lab.focus .lfexit:hover{border-color:var(--pad)}
.lfexit kbd{font:500 10.5px var(--mono);color:var(--dim);border:1px solid var(--line2);border-radius:4px;padding:1px 5px}
.lfocus svg{vertical-align:-2px}
@media (hover:none){.lfexit kbd{display:none}}
@media (max-width:900px){.lab.focus{grid-template-columns:minmax(0,1fr)!important;grid-template-rows:minmax(0,1fr) auto!important;grid-template-areas:"board" "tools"!important}
.lab.focus .ltools{display:grid!important;max-height:30vh!important}
.lab.unolab.m-code.focus{grid-template-rows:minmax(0,1fr)!important}}
/* ---- Garage: kits on the left, the robot turning in the middle, the build budget on the right ---- */
.garage{grid-template-columns:minmax(260px,300px) minmax(0,1fr) minmax(300px,360px)}
.gkits{display:flex;flex-direction:column;gap:10px;padding:0}
.gtabs{display:flex;gap:0;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none;padding:0 6px}
.gtabs button{flex:0 0 auto;border:0;background:none;color:var(--dim);font:500 13px 'IBM Plex Sans',sans-serif;padding:12px 10px;cursor:pointer}
.gtabs button[aria-selected="true"]{color:var(--ink);box-shadow:inset 0 -2px 0 var(--pad)}
#gcards{display:flex;flex-direction:column;gap:8px;padding:4px 12px 14px;overflow-y:auto}
.gcard{text-align:left;display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;font:inherit}
.gcard b{font:600 14px 'IBM Plex Sans',sans-serif}.gcard span{font-size:12.5px;color:var(--muted);line-height:1.4}.gcard em{font:500 11.5px var(--mono);font-style:normal;color:var(--dim)}
.gcard:hover{border-color:#3D444F}.gcard.on{border-color:var(--pad);box-shadow:inset 0 0 0 1px var(--pad);background:#14201f}
.gcard.locked{opacity:.55;cursor:not-allowed}.gcard .glock{color:var(--yellow);display:inline-flex;gap:5px;align-items:center}
.glook{display:flex;flex-direction:column;gap:8px}.glook label,.glbl{font:500 11px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--dim);margin-top:4px}
.glook input{height:38px;border-radius:8px;border:1px solid var(--line2);background:var(--card);color:var(--ink);font:600 15px 'IBM Plex Sans',sans-serif;padding:0 10px;letter-spacing:.06em}
.gsw{display:flex;flex-wrap:wrap;gap:6px}.gsw button{width:28px;height:28px;border-radius:50%;border:2px solid transparent;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,0,0,.25)}.gsw button[aria-pressed="true"]{border-color:var(--ink)}
.gview{padding:0}
.gside .lpane{display:flex;flex-direction:column;gap:6px}
.gbar{display:grid;grid-template-columns:62px minmax(0,1fr) auto;gap:10px;align-items:center;font-size:12.5px;color:var(--muted)}
.gbar i{height:6px;border-radius:3px;background:var(--line);overflow:hidden}.gbar i b{display:block;height:100%;background:var(--pad);border-radius:3px}
.gbar em{font:500 11.5px var(--mono);font-style:normal;color:var(--ink);font-variant-numeric:tabular-nums}
.gbar.warn i b{background:var(--yellow)}.gbar.bad i b{background:var(--red)}.gbar.bad em{color:var(--bad)}
.gbal{display:grid;grid-template-columns:62px minmax(0,1fr) auto;gap:10px;align-items:center;font-size:12.5px;color:var(--muted)}
.gbal i{position:relative;height:6px;border-radius:3px;background:linear-gradient(90deg,var(--red),var(--yellow),var(--pad))}.gbal i b{position:absolute;top:-4px;width:4px;height:14px;margin-left:-2px;border-radius:2px;background:var(--ink)}
.gbal em{font:500 11.5px var(--mono);font-style:normal;color:var(--ink)}
.gperf{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.gperf div{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:8px}
.gperf b{display:block;font:600 18px var(--mono);font-variant-numeric:tabular-nums}.gperf span{font-size:11.5px;color:var(--dim)}
.gprob{display:flex;flex-direction:column;gap:3px;padding:9px 11px;border-radius:8px;border:1px solid rgba(255,90,78,.35);background:rgba(255,90,78,.08);font-size:13px}.gprob b{font-weight:600}.gprob span{color:var(--muted)}.gprob .lbtn{align-self:flex-start;margin-top:6px}
.gready{display:flex;gap:8px;align-items:center;padding:9px 11px;border-radius:8px;background:rgba(79,209,197,.1);color:var(--pad);font:600 13px 'IBM Plex Sans',sans-serif}
.gwh{display:flex;flex-direction:column;gap:4px;font-size:13px;color:var(--muted)}.gwh .row{margin-top:4px;gap:6px}.gwh .lbtn{font-size:12px}
/* ---- Robot lab: like the Arduino Lab, with the track in place of the board ---- */
.robolab.m-chip{grid-template-columns:minmax(0,1fr) minmax(300px,30%);grid-template-rows:auto minmax(0,42fr) minmax(0,58fr) auto;grid-template-areas:"head head" "board code" "board side" "foot foot"}
.robolab.m-code{grid-template-columns:minmax(0,1fr) minmax(300px,32%);grid-template-rows:auto minmax(0,44fr) minmax(0,56fr) auto;grid-template-areas:"head head" "code board" "code side" "foot foot"}
.robolab .lcode{grid-area:code}.robolab.m-chip .lcode{border-left:1px solid var(--line);border-bottom:1px solid var(--line)}.robolab.m-code .lboard{border-left:1px solid var(--line);border-bottom:1px solid var(--line)}
.robolab.m-code #blyv,.robolab.m-code #lcedit{display:none}.robolab.m-chip #bly,.robolab.m-chip #lcex,.robolab.m-chip #lctest{display:none}
.robolab .lside{border-left:1px solid var(--line)}
.rview{padding:0}.rworlds{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.rworlds .lbtn[aria-pressed="true"]{border-color:var(--pad);color:var(--pad)}.rworlds .lbtn:disabled{opacity:.4}
.rclock{font:500 12px var(--mono);color:var(--muted);font-variant-numeric:tabular-nums}
.rres.won{border-left-color:var(--green)}.rres.lost{border-left-color:var(--red)}
@media (max-width:900px){
.garage{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(240px,1fr) minmax(0,30vh) minmax(0,30vh) auto;grid-template-areas:"head" "board" "tools" "side" "foot"}
.garage .gkits{max-height:none;display:flex!important}
.robolab.m-chip,.robolab.m-code{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) minmax(0,26vh) minmax(0,28vh) auto;grid-template-areas:"head" "board" "code" "side" "foot"}
.robolab.m-code{grid-template-areas:"head" "code" "board" "side" "foot"}}
/* Garage tags: a dot and a name beside each part (tap for more). Solid backgrounds, no blur: they move every frame. */
.rblabels{position:absolute;inset:0;pointer-events:none;z-index:2;overflow:hidden}
.rbl{position:absolute;left:0;top:0;pointer-events:auto;cursor:pointer;max-width:220px;padding:5px 10px;border-radius:999px;background:rgba(14,16,20,.86);border:1px solid rgba(255,255,255,.13);color:var(--ink);font:inherit;text-align:left;opacity:0;transition:opacity .3s;will-change:transform}
.rbl b{display:flex;align-items:center;gap:7px;font:600 12.5px 'IBM Plex Sans',sans-serif;white-space:nowrap}.rbl b i{width:7px;height:7px;border-radius:50%;flex:0 0 auto}
.rbl span{display:none;font:400 12px 'IBM Plex Sans',sans-serif;color:var(--muted);margin-top:3px;line-height:1.35;white-space:normal}
.rbl.open{border-radius:10px}.rbl.open span{display:block}
.gover{position:absolute;inset:0;pointer-events:none;z-index:3}
.greads{position:absolute;left:12px;top:12px;display:flex;gap:6px;flex-wrap:wrap}.greads span{display:flex;flex-direction:column;padding:6px 11px;border-radius:9px;background:rgba(14,16,20,.82);border:1px solid rgba(255,255,255,.1);font:500 15px var(--mono);color:var(--ink);font-variant-numeric:tabular-nums}
.greads em{font:500 10.5px 'IBM Plex Sans',sans-serif;font-style:normal;color:var(--dim);letter-spacing:.04em}
.gsys{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);pointer-events:auto;background:rgba(14,16,20,.88);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:4px}
.gsys button{display:inline-flex;align-items:center;gap:6px;min-height:34px;padding:4px 13px;font-size:13px}.gsys button i{width:7px;height:7px;border-radius:50%}
.gview .c3ui{bottom:64px}
@media (max-width:560px){.greads span{font-size:12px;padding:4px 8px}.gsys button{padding:4px 8px;font-size:12px}}
.gview3 button{min-height:30px;font-size:12.5px;padding:4px 11px}
@media (max-width:560px){.rbl span{display:none}.rbl{padding:5px 8px}.rbl b{font-size:10px;letter-spacing:.08em}}
.gview .c3hint{display:none}
.rview .c3hint{display:none}
/* Showroom: designs, locked ones shown too */
.gdes b{display:flex;align-items:center;gap:8px}.gdes b i{width:10px;height:10px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.3)}.gdes .glock{margin-left:auto;color:var(--yellow)}
.gdes.shut{opacity:.78}.gdes.shut b{color:var(--muted)}
.gdhead h3{margin:2px 0 4px;font:600 22px 'IBM Plex Sans',sans-serif}.gdhead p{color:var(--muted);font-size:13.5px;margin:0 0 10px}
.gparts{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:13px;color:var(--muted)}.gparts li{display:flex;gap:7px;align-items:center}.gparts li.ok{color:var(--ink)}.gparts li.ok svg{color:var(--pad)}.gparts li svg{color:var(--yellow)}
.gunl{display:grid;grid-template-columns:minmax(0,1fr) 80px auto;gap:8px;align-items:center;font-size:12.5px;color:var(--muted);margin:4px 0}.gunl i{height:5px;border-radius:3px;background:var(--line);overflow:hidden}.gunl i b{display:block;height:100%;background:var(--yellow)}.gunl.ok i b{background:var(--pad)}
.gunl em{font:500 11px var(--mono);font-style:normal;color:var(--ink)}
.greads .gtag{border-color:rgba(79,209,197,.5)}.greads .gtag.shut{border-color:rgba(245,165,36,.6)}.greads .gtag.shut em{color:var(--yellow)}
/* Robot lab: debrief, replay bar, graph, rivals and robot codes */
.rdeb{list-style:none;margin:0 0 10px;padding:0;display:flex;flex-direction:column;gap:6px}.rdeb li{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:start;font-size:13px;color:var(--muted);line-height:1.4}
.rdeb li.key{color:var(--ink)}.rdeb li.key span{font-weight:500}
.rdt{border:1px solid var(--line2);background:var(--card);color:var(--pad);font:500 11px var(--mono);border-radius:6px;padding:2px 6px;cursor:pointer;white-space:nowrap}.rdt:hover{border-color:var(--pad)}
.rgraph{width:100%;height:auto;border-radius:8px;border:1px solid var(--line);margin-top:10px;cursor:crosshair;display:block}
.rkey{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:6px}.rkey i{display:inline-block;width:10px;height:3px;border-radius:2px;margin-right:-5px}
.rrep{position:absolute;left:50%;bottom:12px;transform:translateX(-50%);z-index:4;display:flex;gap:8px;align-items:center;padding:6px 8px;border-radius:12px;background:rgba(14,16,20,.9);border:1px solid rgba(255,255,255,.12);width:min(560px,calc(100% - 24px))}
.rrep input{flex:1;min-width:60px;accent-color:var(--pad)}.rrep .rrt{font:500 12px var(--mono);color:var(--ink);min-width:48px;font-variant-numeric:tabular-nums}.rrep .seg button{min-height:28px;padding:2px 8px;font-size:12px}
.rriv{display:inline-flex;align-items:center;gap:6px}.rriv i{width:9px;height:9px;border-radius:50%}
.rcard{display:flex;flex-direction:column;gap:8px;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--card);margin:6px 0 10px}
.rcard textarea{width:100%;border-radius:8px;border:1px solid var(--line2);background:#0d0f12;color:var(--ink);font:12px var(--mono);padding:8px;resize:vertical;word-break:break-all}
@media (max-width:560px){.rrep{flex-wrap:wrap}}
#ltheirs[hidden]{display:none}

/* ---- accounts: sign-in page, class-code login, account page, school dashboard (js/account.js) ---- */
body.gatemode .side,body.gatemode .top{display:none}body.gatemode .app{display:block}body.gatemode main{max-width:none;padding:0}
.welcome{min-height:100vh;max-width:980px;margin:0 auto;padding:48px 24px 40px;display:flex;flex-direction:column;gap:22px}
.wbrand{display:flex;align-items:center;gap:10px;font:700 26px 'IBM Plex Sans',sans-serif}.wbrand .lg{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;background:#14201F;color:var(--pad)}
.wtag{margin:-8px 0 6px;color:var(--muted);font-size:17px}
.wcols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.25fr);gap:18px;align-items:start}
.wkid{display:flex;flex-direction:column;gap:8px;padding:26px;border-radius:16px;background:linear-gradient(160deg,#16302C,#111A19);border:1px solid #1f4d49;color:var(--ink)}
.wkid b{font-size:22px}.wkid>span:not(.btn):not(.wkic){color:var(--muted)}.wkid .btn{align-self:flex-start;margin-top:14px}.wkic{font-size:40px;line-height:1}
.wadult{padding:24px;border-radius:16px;background:var(--card);border:1px solid var(--line)}
.aform{display:flex;flex-direction:column;gap:12px;max-width:520px}.aform h2{margin:0 0 2px;font-size:20px}.aform .btn{align-self:flex-start}
.afield{display:flex;flex-direction:column;gap:5px;font-size:13px;color:var(--muted);min-width:0}.row>.afield{flex:1 1 180px}
.afield input,.afield select,.sbody textarea,.sbody select,.wrow select,.scnew input,#crf input,#aaf input{min-height:40px;border-radius:8px;border:1px solid var(--line2);background:var(--bg);color:var(--ink);font:400 14px 'IBM Plex Sans',sans-serif;padding:0 12px;min-width:0}
.sbody textarea{padding:10px 12px;width:100%;resize:vertical;margin:8px 0}
.akinds{display:grid;grid-template-columns:1fr 1fr;gap:8px}.akind{display:flex;flex-direction:column;gap:4px;text-align:left;padding:12px;border-radius:10px;border:1px solid var(--line2);background:transparent;color:var(--ink);cursor:pointer;font:inherit}
.akind span{font-size:12.5px;color:var(--muted)}.akind.on{border-color:var(--pad);background:#14201F}
.amsg{margin:0;padding:10px 12px;border-radius:8px;background:#2A1513;color:#FFB4AC;font-size:13.5px}.amsg.good{background:#13261F;color:#8FE3B9}
.wguest{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding-top:18px;border-top:1px solid var(--line)}
.wfirst{border-top:0;padding-top:0}.wsoon{opacity:.55}.wsoon .wkid{cursor:default}.btn:disabled{opacity:.5;cursor:default;filter:none}
.soonpill{align-self:flex-start;font:500 11px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--yellow);border:1px solid rgba(245,165,36,.4);border-radius:99px;padding:3px 9px;margin-top:6px}
.wback{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:14px}
.join .aform{max-width:640px}.jcin{font:600 34px var(--mono);letter-spacing:.3em;text-transform:uppercase;text-align:center;max-width:320px;min-height:64px;border-radius:12px;border:1px solid var(--line2);background:var(--bg);color:var(--ink)}
.jnames{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}.jname{display:flex;flex-direction:column;align-items:center;gap:8px;padding:16px 8px;border-radius:12px;border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;font:600 15px 'IBM Plex Sans',sans-serif}.jname:hover{border-color:var(--pad)}
.jslots{display:flex;gap:10px}.jslot{width:64px;height:64px;border-radius:14px;border:2px dashed var(--line2);display:grid;place-items:center;font-size:36px}.jslot.on{border-style:solid;border-color:var(--pad)}
.jpad{display:grid;grid-template-columns:repeat(3,88px);gap:10px}.pic{width:88px;height:88px;border-radius:16px;border:1px solid var(--line2);background:var(--card);font-size:46px;cursor:pointer;line-height:1}.pic:hover,.pic:focus-visible{border-color:var(--pad);background:#14201F}.pic:active{transform:scale(.95)}
.picm{font-size:20px;line-height:1;margin-right:2px}
.scgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}.sccard{display:flex;flex-direction:column;gap:6px;padding:16px;border-radius:12px;border:1px solid var(--line);background:var(--card);color:var(--ink)}a.sccard:hover{border-color:var(--pad)}
.sccode{font:600 15px var(--mono);letter-spacing:.14em;color:var(--pad)}.sccard .sccode{margin-top:auto}.scnew{border-style:dashed;background:transparent}.scnew .btn{align-self:flex-start}
.howto{margin:0;padding-left:20px;color:var(--muted)}.howto li{margin:6px 0}
.stabs{margin:6px 0 18px;flex-wrap:wrap}.sbody{display:flex;flex-direction:column;gap:14px}
.tscroll{overflow-x:auto;border:1px solid var(--line);border-radius:12px}
.pgrid{border-collapse:collapse;width:100%;font-size:13px;min-width:640px}.pgrid th{font:500 11px var(--mono);color:var(--dim);text-align:center;padding:10px 6px;border-bottom:1px solid var(--line)}.pgrid th:first-child{text-align:left;padding-left:14px}
.pgrid td{padding:8px 6px;border-top:1px solid var(--line);text-align:center;font-variant-numeric:tabular-nums}.pgrid td:first-child{text-align:left;padding-left:14px}.pgrid td:first-child a{display:flex;align-items:center;gap:8px;color:var(--ink)}
.pc{color:var(--dim)}.pc.some{background:rgba(245,165,36,.12);color:#F5C978}.pc.full{background:rgba(63,207,142,.16);color:#8FE3B9}
.pics{display:inline-flex;gap:2px;flex:none}
.aslist{display:flex;flex-direction:column;gap:8px}.asrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink)}a.asrow:hover{border-color:var(--pad)}
.asrow.ok{border-color:#1f4d3a}.asic{width:30px;height:30px;border-radius:8px;display:grid;place-items:center;background:#1C2026;color:var(--pad);flex:none}.asrow.ok .asic{background:#13261F;color:var(--green)}
.ast{flex:1;min-width:0;display:flex;flex-direction:column}.good{color:var(--green)}
.hset{margin-top:0;margin-bottom:28px}
.lvlist{display:flex;flex-direction:column;gap:6px}.lvrow{border:1px solid var(--line);border-radius:10px;background:var(--card)}.lvrow summary{display:grid;grid-template-columns:28px minmax(0,1fr) auto 120px;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;list-style:none}
.lvrow summary::-webkit-details-marker{display:none}.lvrow .n{font:500 11px var(--mono);color:var(--dim)}.lvrow ul{margin:0;padding:0 14px 12px 52px;list-style:none;font-size:13.5px;color:var(--muted)}.lvrow li{margin:4px 0;display:flex;gap:6px;align-items:center}.lvrow li.ok{color:var(--ink)}
.sdanger{margin-top:28px}.sdanger summary{cursor:pointer}.sdanger form{margin:10px 0}
.lcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.lcard{border:1.5px dashed var(--line2);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:3px;background:var(--card);break-inside:avoid}
.lch{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted)}.lch .lg{color:var(--pad)}.lcn{font:700 22px 'IBM Plex Sans',sans-serif;margin:4px 0 6px}
.lcl{font:500 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--dim);margin-top:4px}.lcc{font:700 24px var(--mono);letter-spacing:.2em}.lcp .picm{font-size:30px;margin-right:6px}.lcs{font-size:12px;color:var(--muted);margin-top:8px}
@media (max-width:760px){.wcols{grid-template-columns:1fr}.welcome{padding:28px 16px}.akinds{grid-template-columns:1fr}.jpad{grid-template-columns:repeat(3,76px)}.pic{width:76px;height:76px;font-size:40px}.lvrow summary{grid-template-columns:24px minmax(0,1fr) auto}.lvrow summary .bar{display:none}}
@media print{body{background:#fff!important;color:#000}.side,.top,.noprint,#hassign{display:none!important}.app{display:block}main{padding:0;max-width:none}
 .lcards{grid-template-columns:repeat(3,1fr);gap:8px}.lcard{background:#fff;border-color:#888;color:#000}.lcl,.lch,.lcs{color:#444}}

/* ---- micro:bit Lab (js/microbit-lab.js) ---- */
.lab.mblab{grid-template-columns:minmax(0,1fr) minmax(340px,440px);grid-template-areas:"head head" "code sim" "foot foot"}
.mbcode{grid-area:code;position:relative;min-height:0;min-width:0;background:var(--bg)}
.mbsim{grid-area:sim;min-height:0;overflow-y:auto;border-left:1px solid var(--line);background:radial-gradient(ellipse at 50% 20%,#191D23 0%,#0B0D10 70%);display:flex;flex-direction:column;gap:14px;padding:16px}
.mbwrap{display:grid;place-items:center}.mbsvg{width:100%;max-width:400px;height:auto;filter:drop-shadow(0 18px 30px rgba(0,0,0,.55))}
.mbsvg .mbbtn,.mbsvg .mblogo,.mbsvg .mbpad[data-pin]:not([data-pin=""]){cursor:pointer}
.mbsvg .mbbtn.on .mbcap{fill:#2d2d2d;stroke:var(--pad)}.mbsvg .mblogo.on ellipse{stroke:#fff3c4}
.mbsvg .mbpad.touch rect{filter:brightness(1.25)}.mbsvg .mbpad.hi circle:first-of-type{fill:#3a2a0a}
.mbsvg .mbpl,.mbsvg .mbbl{fill:#e9e9e9;font:700 15px 'IBM Plex Sans',sans-serif;text-anchor:middle}.mbsvg .mbbl{font-size:18px}.mbsvg .mbname{fill:#cfcfcf;font:600 15px 'IBM Plex Sans',sans-serif;text-anchor:middle}
.mbctl{display:flex;flex-direction:column;gap:14px}.mbrow{display:flex;flex-wrap:wrap;gap:6px}
.mbhold{touch-action:none;user-select:none;-webkit-user-select:none}.mbhold.on{border-color:var(--pad);background:#14201F}
.mbtilt{display:flex;gap:14px;align-items:center}
.mbpadc{position:relative;flex:none;width:128px;height:128px;border-radius:50%;background:radial-gradient(circle,#1C2026 0%,#13161B 70%);border:1px solid var(--line2);touch-action:none;cursor:grab}
.mbdot{position:absolute;left:50%;top:50%;width:24px;height:24px;margin:-12px 0 0 -12px;border-radius:50%;background:var(--pad);box-shadow:0 0 12px rgba(79,209,197,.6);pointer-events:none}
.mbax{position:absolute;font:500 9.5px var(--mono);color:var(--dim);pointer-events:none}.mbax-u{top:5px;left:50%;transform:translateX(-50%)}.mbax-d{bottom:5px;left:50%;transform:translateX(-50%)}.mbax-l{left:6px;top:50%;transform:translateY(-50%)}.mbax-r{right:6px;top:50%;transform:translateY(-50%)}
.mbread{display:flex;flex-direction:column;gap:4px;min-width:0}.mbread .lbtn{align-self:flex-start;margin-top:4px}
.mbsl{display:grid;grid-template-columns:1fr;gap:4px}.mbsl input{width:100%;margin-bottom:6px}
.mbpins{display:flex;flex-direction:column;gap:6px}.mbouts{display:flex;flex-wrap:wrap;gap:6px}.mbo{font:500 12px var(--mono);border:1px solid var(--line2);border-radius:6px;padding:2px 8px}.mbo.hi{border-color:var(--yellow);color:var(--yellow)}
.mbmodal[hidden]{display:none}.mbmodal{position:absolute;inset:0;z-index:40;background:rgba(5,6,8,.7);display:grid;place-items:center;padding:16px}
.mbdlg{width:min(640px,100%);max-height:90vh;overflow:auto;background:var(--card);border:1px solid var(--line2);border-radius:14px;padding:18px 20px;display:flex;flex-direction:column;gap:12px}.mbdlg h3{margin:0}
.mbcodebox{width:100%;font:12.5px/1.5 var(--mono);background:var(--bg);color:var(--ink);border:1px solid var(--line2);border-radius:8px;padding:10px;resize:vertical}
@media (max-width:900px){.lab.mblab{overflow-y:auto;grid-template-columns:minmax(0,1fr);grid-template-rows:max-content max-content 72vh max-content;grid-template-areas:"head" "sim" "code" "foot";align-content:start}.lab.mblab .lfoot{position:sticky;bottom:0;z-index:5}.mbsim{border-left:0;border-bottom:1px solid var(--line);overflow:visible}.mbsvg{max-width:320px}}
/* micro:bit missions: the task list above the board */
.mbmis{display:flex;flex-direction:column;gap:10px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 14px}
.mbintro{font-size:13.5px;color:var(--muted);display:flex;flex-direction:column;gap:6px}.mbintro p{margin:0}.mbintro b{color:var(--ink)}.mbintro .lbtn{align-self:flex-start}
.mbtasks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.mbtasks li{display:flex;gap:10px;align-items:flex-start;font-size:13.5px;color:var(--dim)}
.mbtasks li.cur{color:var(--ink)}.mbtasks li.ok{color:var(--muted)}.mbtasks p{margin:4px 0;color:var(--muted)}.mbtasks li.cur p{color:#C9CFD6}.mbtasks .row{margin-top:4px;gap:6px}
.mbtn{flex:none;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font:600 11px var(--mono);border:1px solid var(--line2)}.mbtasks li.cur .mbtn{border-color:var(--yellow);color:var(--yellow)}.mbtasks li.ok .mbtn{background:#13261F;border-color:#1f4d3a;color:var(--green)}
.mbhint{background:#1C2026;border-radius:8px;padding:6px 10px}
.mbgrid{border-collapse:collapse;font:500 11px var(--mono);margin-top:4px}.mbgrid th{color:var(--pad);padding:2px 6px;font-weight:500}.mbgrid td{border:1px solid var(--line2);padding:4px 6px;text-align:center;color:var(--muted)}
.mbmis .win{margin:0}
.mbabout{align-self:flex-start}
.wcopy{margin:auto 0 0;padding-top:24px;font-size:12.5px;color:var(--dim)}
/* ESP32 and Pico labs (js/boards-more.js): pin labels, the pretend Wi-Fi waves, the dashboard phone */
.unolab.b-esp32 .ufile,.unolab.b-esp32 #msave,.unolab.b-pico .ufile,.unolab.b-pico #msave{display:none}
.csvg text.bpin{font-size:9.5px}.csvg text.bpin.ino{fill:#ffcf8a}.csvg text.bpin.adc{fill:#bff3f7}.csvg text.bpin.pwr{fill:#ffd0c9}.csvg text.bino{fill:#ffcf8a}
.csvg text.besp1{font-size:11px;fill:#3c444b;text-anchor:middle;letter-spacing:.5px}.csvg text.besp2{font:800 20px IBM Plex Sans,sans-serif;fill:#2b3238;text-anchor:middle;letter-spacing:1px}.csvg text.besp3{fill:#59626a;text-anchor:middle}
.csvg text.bpi1{font-size:10px;fill:#aab3ba;text-anchor:middle;letter-spacing:.5px}.csvg text.bpi2{fill:#7d868d}.csvg text.bpi3{font:800 17px IBM Plex Sans,sans-serif;fill:rgba(255,255,255,.85);letter-spacing:1px}
.bwifi path{stroke:rgba(255,255,255,.14)}.bwifi.on path{stroke:#4FD1C5;animation:bwifi 1.6s infinite}.bwifi.on path:nth-child(2){animation-delay:.2s}.bwifi.on path:nth-child(3){animation-delay:.4s}.bwifi.join path{stroke:#FFD43B;animation:bwifi .6s infinite}
@keyframes bwifi{0%,100%{opacity:.35}50%{opacity:1}}
.babout{margin-top:12px}.babout ul{margin:8px 0 0;padding-left:18px;color:var(--muted)}.babout li{margin:5px 0}.babout b{color:var(--ink)}
.wpcare{border-left:3px solid var(--yellow);padding-left:8px}
.dphone{border:2px solid var(--line2,#3A414B);border-radius:22px;padding:12px;background:var(--card);display:grid;gap:10px;max-width:300px;margin:0 auto 10px}
.dphone .dbar{display:flex;flex-direction:column;gap:2px;font:600 13px 'IBM Plex Sans',sans-serif;text-align:center}.dnet{font:500 11px var(--mono);color:var(--muted)}.dnet.on{color:#4FD1C5}.dnet.join{color:var(--yellow)}
.dvals{display:grid;gap:6px;min-height:44px}.dval{display:flex;justify-content:space-between;align-items:baseline;border:1px solid var(--line);border-radius:10px;padding:8px 10px}.dval span{font-size:12.5px;color:var(--muted)}.dval b{font:600 20px var(--mono)}
.dsw{display:grid;grid-template-columns:1fr 1fr;gap:8px}.dtog{border:1px solid var(--line);background:transparent;color:var(--ink);border-radius:12px;padding:12px 8px;font:600 13px 'IBM Plex Sans',sans-serif;cursor:pointer}.dtog[aria-pressed=true]{background:#4FD1C5;border-color:#4FD1C5;color:#062a26}
.dphone.off .dsw,.dphone.off .slider,.dphone.off label{opacity:.45}
.lab-esp32 .lbic{background:#16263F;color:#7FB2FF}.lab-pico .lbic{background:#123523;color:#5FD08F}
.unolab.b-esp32 .ltabs button{padding:12px 8px}
/* ---- Scope and serial plotter (js/scope.js) ---- */
/* The scope sits along the bottom of the board; on small screens (and beside the code editor) it is a sheet over the lower panels. */
.scp{grid-area:board;align-self:end;z-index:7;height:268px;margin:0 10px 10px;display:flex;flex-direction:column;min-width:0;background:var(--card);border:1px solid var(--line2);border-radius:12px;box-shadow:0 -10px 30px -16px rgba(0,0,0,.7);overflow:hidden}
.scp[hidden]{display:none}.lab.scopeon .lboard{padding-bottom:288px}
.scph{display:flex;align-items:center;gap:10px;padding:6px 8px 6px 12px;border-bottom:1px solid var(--line);font-size:12.5px;flex:none}.scph b{font:600 13px 'IBM Plex Sans',sans-serif}.scgap{flex:1}
.scch{display:inline-flex;align-items:center;gap:6px;color:var(--muted);min-width:0;white-space:nowrap}.scch i,.scm i,.scsay i,.spleg i{flex:none;display:inline-block;width:10px;height:10px;border-radius:3px}
.scch button{border:0;background:none;color:var(--dim);font-size:16px;line-height:1;padding:0 4px;cursor:pointer}.scch button:hover{color:var(--ink)}.scch button[hidden]{display:none}
.scph .lbtn{min-height:28px;padding:0 10px}.scph .scx{font-size:18px;padding:0 9px}
.scpb{flex:1;display:flex;min-height:0}.scscr{flex:1;min-width:0;position:relative;background:#07100C}.scscr canvas{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;cursor:crosshair}
.scmsg{position:absolute;inset:0;margin:0;display:grid;place-items:center;text-align:center;padding:0 20px;color:var(--muted);font-size:13.5px;pointer-events:none}.scmsg:empty{display:none}
.scside{flex:0 1 340px;max-width:42%;min-width:0;overflow-y:auto;padding:8px 10px;border-left:1px solid var(--line);display:flex;flex-direction:column;gap:6px}
.scctl{display:flex;flex-wrap:wrap;align-items:flex-end;gap:6px 8px}.scctl label{display:flex;flex-direction:column;gap:2px;font:500 10.5px var(--mono);letter-spacing:.04em;color:var(--dim)}
.scctl select{height:30px;border-radius:7px;border:1px solid var(--line2);background:var(--bg);color:var(--ink);font:500 12.5px 'IBM Plex Sans',sans-serif;padding:0 6px}
.scctl .lbtn{min-height:30px;padding:0 10px;font-size:12.5px}.scctl .lbtn[aria-pressed="true"]{border-color:var(--pad);background:#14201F}
.scax{margin:0;font-size:12px;color:var(--dim)}
.scm{width:100%;border-collapse:collapse;font:500 11.5px var(--mono)}.scm th{font:500 9.5px var(--mono);letter-spacing:.03em;text-transform:uppercase;color:var(--dim);text-align:left;padding:2px 3px}.scm td{padding:3px;border-top:1px solid var(--line);white-space:nowrap}.scm tr[hidden]{display:none}
.scsay{margin:0;display:flex;gap:8px;align-items:flex-start;font-size:13px;line-height:1.4}.scsay i{margin-top:4px}.scsay[hidden]{display:none}
.unolab.m-code .scp{position:fixed;right:0;bottom:0;width:max(280px,30%);height:auto;max-height:56dvh;margin:0;border-radius:12px 0 0 0;z-index:35}
.unolab.m-code.scopeon .lboard{padding-bottom:10px}.unolab.m-code .scph{flex-wrap:wrap;gap:6px 8px}.unolab.m-code .scph>b{display:none}
.unolab.m-code .scpb{flex-direction:column;overflow-y:auto}.unolab.m-code .scscr{flex:0 0 150px}.unolab.m-code .scside{flex:none;border-left:0;border-top:1px solid var(--line);overflow:visible}
@media (min-width:901px) and (max-width:1250px){.unolab.m-code .scp{width:300px}.scside{flex-basis:300px}}
@media (max-width:900px){.scp,.unolab.m-code .scp{position:fixed;left:0;right:0;bottom:0;width:auto;height:auto;max-height:54dvh;margin:0;border-radius:14px 14px 0 0;z-index:35}
.lab.scopeon .lboard{padding-bottom:10px}.scpb{flex-direction:column;overflow-y:auto}.scscr{flex:0 0 150px}.scside{flex:none;border-left:0;border-top:1px solid var(--line);overflow:visible}
.scch{font-size:12px}.scph{gap:8px;flex-wrap:wrap}.scph>b{display:none}}
/* the plotter, above the serial monitor's text */
.lpane[data-pane="serial"]:not([hidden]){display:flex;flex-direction:column}.lpane[data-pane="serial"] .useri{flex:1 1 0;height:auto;min-height:70px}.lpane[data-pane="serial"]>.lbtn{align-self:flex-start}
.spl{margin-bottom:8px;flex:none}.spl[hidden]{display:none}.splh{display:flex;align-items:center;gap:8px;margin-bottom:6px}.spleg{flex:1;display:flex;flex-wrap:wrap;gap:2px 12px;font-size:12.5px;color:var(--muted)}.spleg span{display:inline-flex;align-items:center;gap:5px}.spleg b{font:500 12px var(--mono);color:var(--ink)}
.splh .lbtn{min-height:28px;padding:0 10px}.splc{height:130px;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#07100C}.splc canvas{width:100%;height:100%;display:block}
/* "See the code" (js/code-view.js): the block program as typed code, beside the blocks or over them */
.ctx[hidden]{display:none}.ctx{position:absolute;inset:0;z-index:80;display:flex;flex-direction:column;min-height:0;background:var(--bg);border-left:1px solid var(--line)}
.ctx-split>.ctx{left:auto;width:46%}.lcode.ctx-split>.bly{margin-right:46%}.mbcode.ctx-split{padding-right:46%}
.ctxbar{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--line);background:var(--panel);min-height:42px}.ctxbar b{font:600 13px 'IBM Plex Sans',sans-serif;margin-right:auto;white-space:nowrap}.ctxbar .small{font-size:12px}
.ctxscroll{flex:1;min-height:0;overflow:auto;position:relative}
.ctxhelp{position:sticky;left:0;margin:0;padding:8px 12px;font-size:12.5px;line-height:1.45;color:var(--muted);border-bottom:1px solid var(--line)}
.ctxpre{margin:0;padding:8px 0 16px;min-width:max-content;font:12.5px/1.6 var(--mono);color:var(--ink);counter-reset:ctl;-webkit-user-select:text;user-select:text;tab-size:2}
.ctl{display:block;min-width:max-content;padding:0 14px 0 0;white-space:pre;border-left:3px solid transparent}.ctl::before{counter-increment:ctl;content:counter(ctl);display:inline-block;width:2.4em;margin-right:12px;text-align:right;color:var(--dim);opacity:.6;-webkit-user-select:none;user-select:none}
.ctl.on{background:rgba(245,165,36,.16);border-left-color:var(--yellow)}
.ctc{color:#7F8B99;font-style:italic}.cts{color:#E6C07B}.ctn{color:#F5A524}.ctk{color:var(--violet)}.cta{color:var(--pad)}
.ctbtn{white-space:nowrap}.ctbtn.on{border-color:var(--pad);color:var(--pad)}.unolab.m-chip .ctbtn{order:3}
@media (max-width:560px){.lcbar:has(.ctbtn){flex-wrap:wrap}.ctxpre{font-size:12px}.ctxhelp{font-size:12px;padding:6px 10px}}
/* ---- Breadboard (js/breadboard.js): print on the board, the hidden strips, and room to scroll on a phone ---- */
.csvg text.bbnum{font:600 7px IBM Plex Sans,sans-serif;fill:#8a8472}.csvg text.bbnum.b{fill:#5d584a;font-weight:800}
.csvg text.bbsign{font:800 15px IBM Plex Sans,sans-serif}
.csvg text.bbl{font:800 7.5px IBM Plex Sans,sans-serif;fill:#2a2c2f;paint-order:stroke;stroke:#f3f0e4;stroke-width:2.4px;stroke-linejoin:round}.csvg text.bbl.bbleg{font-size:5.4px;stroke-width:2px}
.csvg text.bbw{font:800 8px IBM Plex Sans,sans-serif;fill:#fff}.csvg text.bbk{font:800 12px IBM Plex Sans,sans-serif;fill:#2A1C00}
.csvg text.bbr{font:700 8px ui-monospace,Menlo,monospace;fill:#0d3b1c;paint-order:stroke;stroke:#f3f0e4;stroke-width:2.4px}
.bbstrip{fill:#c98a3c;fill-opacity:.42;stroke:#a86a22;stroke-opacity:.55;stroke-width:1}.bbstrip.on{fill-opacity:.6;stroke-opacity:1;stroke-width:2}.bbstrip.flag{fill:#FF5A4E;stroke:#FF5A4E;fill-opacity:.4}
.flow.bbflow{stroke:#fff3a6;stroke-width:3;stroke-dasharray:.1 8;animation-name:bbflow;filter:drop-shadow(0 0 1.2px #7a5200)}@keyframes bbflow{to{stroke-dashoffset:-8.1}}
.lab.bread .gwire{stroke-width:4}
.bbhow{margin:0 0 8px;padding-left:18px;font-size:13.5px;color:var(--muted);display:flex;flex-direction:column;gap:5px}.bbhow b{color:var(--ink)}.bbex{display:flex;flex-direction:column;gap:6px}
#bbshow[aria-pressed="true"]{border-color:var(--pad);color:var(--pad)}
@media (max-width:700px){.lab.bread .cboard{display:block;overflow:auto;-webkit-overflow-scrolling:touch}.lab.bread .csvg{width:660px;height:446px;margin:0}.lab.bread.unolab .csvg{width:1000px;height:440px}}
/* toolbox groups: on a wide screen each heading folds its group away; on a phone a row of group names filters the one flat grid */
.tgh{align-items:center;gap:6px;width:100%;padding:3px 0;background:none;border:0;cursor:pointer;text-align:left}.tgh span{flex:1}.tgh i{font-style:normal;opacity:.7}
.tgh::after{content:'';width:6px;height:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);margin:0 4px 3px 2px;transition:transform .15s}
.tgrp.shut .tgh::after{transform:rotate(-45deg);margin-bottom:0}.tgh:hover,.tgh:focus-visible{color:var(--ink)}
.tchips{display:none}
@media (min-width:901px){.tgh{display:flex}.ltools:not(.finding) .tgrp.shut .ctools{display:none}.ltools.finding .tgh::after{visibility:hidden}}
@media (max-width:900px){.tchips{display:flex;grid-column:1/-1;gap:6px;overflow-x:auto;position:sticky;top:-8px;z-index:2;background:var(--panel);padding:6px 0;margin-top:-8px;min-height:40px;box-sizing:border-box;scrollbar-width:none}.tchips::-webkit-scrollbar{display:none}
.tchip{flex:0 0 auto;height:28px;padding:0 11px;border-radius:14px;border:1px solid var(--line2);background:transparent;color:var(--muted);font:500 12px 'IBM Plex Sans',sans-serif;cursor:pointer}.tchip[aria-pressed="true"]{border-color:var(--pad);color:var(--ink);background:#14201F}}
/* Displays and smart parts (js/displays.js): the big copy of a screen in the Part panel, and keys big enough for a finger */
.dscr{background:#05080c;border:1px solid var(--line2);border-radius:8px;padding:8px;margin:8px 0;display:grid;place-items:center}
.dpix{display:block;width:256px;max-width:100%;height:auto;image-rendering:pixelated;image-rendering:crisp-edges;image-rendering:pixelated}.dpix.doff{background:#0b0f14;border-radius:3px}
.dneo{display:flex;gap:6px;justify-content:space-between;background:#15171a;border-radius:8px;padding:10px 8px;margin:8px 0}.dneo span{display:grid;justify-items:center;gap:4px;font:500 10.5px var(--mono);color:var(--dim)}.dneo i{width:20px;height:20px;border-radius:50%;border:2px solid #e9edf2}
.dkp{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;max-width:240px;margin:8px auto;padding:10px;background:#1d2023;border-radius:10px;touch-action:none;user-select:none;-webkit-user-select:none}
.dkp button{min-height:44px;border-radius:8px;border:0;background:#e9edf2;color:#14171c;font:700 16px 'IBM Plex Sans',sans-serif;cursor:pointer}.dkp button.alt{background:#c2412d;color:#fff}.dkp button[aria-pressed=true]{background:var(--pad);color:#14171c}
.drem{margin:8px auto;width:min(210px,100%)}.drem .key{min-height:34px;font-size:11.5px;border-radius:8px;touch-action:manipulation}
.scside select{min-width:0;max-width:100%}
/* Sample sandbox: a strip under the lab header saying nothing here is saved, with the way back */
.sbar{flex:0 0 100%;order:9;display:flex;align-items:center;justify-content:space-between;gap:8px 16px;flex-wrap:wrap;padding:7px 12px;border-radius:8px;background:#2A2410;border:1px solid #5C4A12;color:#F3E3A6;font-size:13px}
.lhead:has(.sbar){flex-wrap:wrap}.sbact{display:flex;gap:8px;flex-wrap:wrap}.sbar .sback{background:var(--pad);color:#06201D;border-color:transparent;font-weight:600;text-decoration:none;display:inline-flex;align-items:center}
@media (max-width:900px){.sbar{order:-1;font-size:12.5px;padding:5px 8px;flex-wrap:nowrap}.sbact{flex-wrap:nowrap}.sbar .lbtn{min-height:30px;padding:0 9px;white-space:nowrap}.sbmore,.lab.sample .ltitle,.lab.sample .lexit,.lab.sample .ufile,.lab.sample #msave,.lab.sample #lfocus{display:none}}
.wptry{align-self:flex-start;text-decoration:none}
.prjsel{max-width:150px;text-overflow:ellipsis;font-weight:600;cursor:pointer}
.smallnote{position:fixed;inset:0;z-index:90;background:rgba(5,6,8,.78);display:grid;place-items:center;padding:16px}.snbox{max-width:380px;background:var(--card);border:1px solid var(--line2);border-radius:14px;padding:18px 18px 16px;box-shadow:0 24px 60px -20px rgba(0,0,0,.7)}.snbox h3{margin:0 0 8px}.snbox p{margin:0 0 10px}.snbox .row{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
.slh2{margin-top:12px}
.codemis .lcex,.codemis .lcexs{display:none}
/* ---- Hero reel (js/hero.js): five chapters, moved only with transform, opacity and stroke ---- */
.reel{max-width:1180px;margin:0 auto 26px}
.hstage{position:relative;aspect-ratio:1000/560;max-height:min(66vh,640px);width:100%;border-radius:18px;overflow:hidden;border:1px solid var(--line);background:radial-gradient(120% 90% at 50% 38%,#16211F 0,#0F1215 52%,#0B0D10 100%)}
.hsc{position:absolute;inset:0;opacity:0;visibility:hidden;transition:opacity .6s,visibility 0s .6s}.hsc.on{opacity:1;visibility:visible;transition:opacity .6s}
.hart,.hart>svg{position:absolute;inset:0;width:100%;height:100%}.hart>svg{inset:7% 0 auto;height:66%}
.hcap{position:absolute;left:0;right:0;bottom:0;padding:44px 28px 20px;background:linear-gradient(transparent,rgba(8,10,12,.9) 62%)}
.hlab,.hbrand{font:500 11.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--pad)}.hbrand{position:absolute;left:28px;top:18px;color:var(--dim)}
.hcap .hline{margin:6px 0 0;font:700 clamp(18px,2.7vw,34px)/1.12 'IBM Plex Sans',sans-serif;letter-spacing:-.01em;color:#fff;max-width:32ch}
.hbar{display:flex;gap:6px;margin:8px 2px 0}.hseg{position:relative;flex:1;height:16px;padding:0;background:none;border:0;cursor:pointer}
.hseg::before,.hseg i{content:'';position:absolute;left:0;right:0;top:7px;height:2px;border-radius:2px;background:var(--line2)}.hseg i{background:var(--pad);transform:scaleX(0);transform-origin:left}
.hseg.done i{transform:scaleX(1)}.hseg.on i{animation:hrBar var(--dur) linear forwards}.hseg:hover::before{background:#3A414B}
.hcta{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px}.hcta .small{max-width:36ch}
.hpause{margin-left:auto;background:none;border:0;color:var(--dim);font:500 11.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;padding:8px 4px}.hpause:hover{color:var(--ink)}
.reel.paused *,.reel.away *{animation-play-state:paused!important}
.reel .csvg{cursor:default}.reel .mbsvg{filter:none}
.hsc.on .hcap>*{animation:hrUp .7s .15s both ease-out}.hsc.on .hcap .hline{animation-delay:.3s}
.hr-tr{fill:none;stroke:#4FD1C5;stroke-width:5;stroke-linecap:round;stroke-dasharray:1}.hsc.on .hr-tr{animation:hrDraw .7s var(--d) both ease-out}
.hr-pop,.hr-ring,.hr-pad{transform-box:fill-box;transform-origin:center}.hsc.on .hr-pop{animation:hrPop .5s var(--d) both cubic-bezier(.2,1.4,.4,1)}
.hsc.on .hr-glow{animation:hrIn .5s var(--d) both,hrPulse 2.4s calc(var(--d) + .5s) infinite ease-in-out}.hsc.on .hr-lit{animation:hrIn .3s var(--d) both}
.hr-dot{fill:#D8FFFA;offset-rotate:0deg;display:none}.hr-pulse{fill:#fff;offset-rotate:0deg;display:none}
@supports (offset-path:path("M0 0")){.hr-dot,.hr-pulse{display:inline}.hsc.on .hr-dot{animation:hrFlow var(--t) var(--d) linear infinite,hrIn .5s 3s both}.hsc.on .hr-pulse{animation:hrFlow 5.2s .4s linear both}}
.hr-mono{font:600 15px var(--mono);fill:#C9CFD6}.hr-blk{font:600 14.5px 'IBM Plex Sans',sans-serif;fill:#fff}.hr-name{font:600 15px 'IBM Plex Sans',sans-serif;fill:#C9CFD6}
.hsc.on .hr-drop{animation:hrDrop .45s var(--d) both cubic-bezier(.2,1.3,.4,1)}.hsc.on .hr-up{animation:hrUp .7s var(--d) both ease-out}
.hr-st1 rect,.hr-st2 rect{stroke:#fff;stroke-width:2.5;stroke-opacity:0}.hsc.on .hr-st1 rect{animation:hrSt 1.2s 3.8s infinite steps(1)}.hsc.on .hr-st2 rect{animation:hrSt 1.2s 4.4s infinite steps(1)}
.hr-blink{opacity:.12}.hr-blinkg{opacity:0}.hsc.on .hr-blink{animation:hrBl 1.2s 3.8s infinite steps(1)}.hsc.on .hr-blinkg{animation:hrBlg 1.2s 3.8s infinite steps(1)}
.hsc.on .hr-float{animation:hrFloat 4.6s var(--d) ease-in-out infinite alternate}.reel .mbglow.hr-beat{opacity:.9}.hsc.on .mbglow.hr-beat{animation:hrBeat 1.1s 1.6s infinite ease-in-out}
.hr-path0,.hr-path{fill:none;stroke:#22262D;stroke-width:6;stroke-linecap:round;stroke-linejoin:round}.hr-path{stroke:#4FD1C5;stroke-dasharray:1}.hsc.on .hr-path{animation:hrDraw 5.2s .4s linear both}
.hr-pad0{fill:#14171C;stroke:#2A2F37;stroke-width:2}.hsc.on .hr-pad{animation:hrPop .45s var(--d) both cubic-bezier(.2,1.5,.4,1)}
.hr-ring{fill:none;stroke:#4FD1C5;stroke-width:2;opacity:0}.hr-win{stroke:#F5A524}.hsc.on .hr-ring{animation:hrRing .9s var(--d) both ease-out}.hsc.on .hr-win{animation:hrRing 1.6s var(--d) infinite ease-out}
.hr-num{font:700 13px var(--mono);fill:#06201D}.hr-lv{font:600 15px 'IBM Plex Sans',sans-serif;fill:#E8EAED}.hr-lvw{font-size:21px;font-weight:700;fill:#F5A524}.hsc.on .hr-lv{animation:hrLit .5s var(--d) both}
.hr-more{font:500 13px var(--mono);fill:var(--dim)}.hsc.on .hr-more{animation:hrIn .6s var(--d) both}
.hgal{position:absolute;inset:8% 2% 27%}
.hbot{position:absolute;left:var(--x);top:50%;width:17%;margin:0;border-radius:12px;overflow:hidden;background:#14171C;border:1px solid rgba(255,255,255,.14);box-shadow:0 18px 40px -12px rgba(0,0,0,.85);z-index:calc(10 - var(--a));
transform:translate(-50%,-50%) translateY(calc(var(--a)*var(--a)*3%)) rotate(calc(var(--o)*3deg)) scale(calc(1 - var(--a)*.05))}
.hvid{width:38%;z-index:11;border-color:var(--c)}.hvid video{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;background:#101317}
.hbot img{display:block;width:100%;height:auto}.hbot figcaption{display:flex;justify-content:space-between;align-items:baseline;gap:8px;padding:6px 10px 7px;font:600 13px 'IBM Plex Sans',sans-serif;border-top:2px solid var(--c)}.hbot figcaption span{font:500 11px var(--mono);color:var(--dim)}.hbr figcaption{flex-direction:row-reverse}
.hsc.on .hbot{animation:hrFan .9s var(--d) both cubic-bezier(.2,1,.3,1)}
@keyframes hrBar{to{transform:scaleX(1)}}@keyframes hrDraw{from{stroke-dashoffset:1}to{stroke-dashoffset:0}}@keyframes hrIn{from{opacity:0}}@keyframes hrLit{from{opacity:.28}}
@keyframes hrPop{from{opacity:0;transform:scale(.55)}}@keyframes hrUp{from{opacity:0;transform:translateY(24px)}}@keyframes hrDrop{from{opacity:0;transform:translateY(-18px)}}
@keyframes hrPulse{50%{opacity:.55}}@keyframes hrFlow{from{offset-distance:0%}to{offset-distance:100%}}@keyframes hrFloat{to{transform:translateY(-8px)}}
@keyframes hrSt{0%{stroke-opacity:1}50%,100%{stroke-opacity:0}}@keyframes hrBl{0%{opacity:1}50%,100%{opacity:.12}}@keyframes hrBlg{0%{opacity:1}50%,100%{opacity:0}}
@keyframes hrBeat{0%,100%{opacity:.2}35%{opacity:1}}@keyframes hrRing{from{transform:scale(.45);opacity:.9}to{transform:scale(1);opacity:0}}
@keyframes hrFan{from{opacity:0;transform:translate(-50%,-50%) scale(.7)}}
@media (max-width:700px){.hstage{aspect-ratio:1/1}.hcap{padding:30px 16px 14px}.hbrand{left:16px;top:12px;font-size:10px}.hlab{font-size:10px}.hbot{width:21%}.hvid{width:52%}.hbot:not(.hvid) figcaption{display:none}.hbot figcaption{font-size:11px;padding:4px 7px 5px}.hbot figcaption span{display:none}.hpause{margin-left:0}}
@media (prefers-reduced-motion:reduce){.reel *{animation:none!important}.hr-dot,.hr-pulse,.hpause{display:none!important}.hr-blink,.hr-blinkg{opacity:1}}
.welcome.whero{max-width:1100px;padding-top:28px;gap:14px}.whero .wtag{margin:-8px 0 0}.hshow{margin:0 0 14px}.hhide{margin-left:4px}
/* ---- Front page (js/about.js): a header with four links, the headline beside the reel, three audience cards, and the sheets they open ---- */
.fdnav{display:flex;align-items:center;gap:10px 22px;flex-wrap:wrap;padding-bottom:16px;border-bottom:1px solid var(--line)}.fdnav .wbrand{margin-right:auto;font-size:22px}.fdlinks{display:flex;gap:6px 22px;flex-wrap:wrap}
.ablk{background:none;border:0;padding:6px 0;color:var(--muted);font:500 15px 'IBM Plex Sans',sans-serif;cursor:pointer}.ablk:hover{color:var(--ink)}
.fdhero{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:30px;align-items:center;padding:22px 0 8px}.fdtxt{display:flex;flex-direction:column;gap:16px;min-width:0}
.fdtxt h1{margin:0;font:700 clamp(30px,4.4vw,54px)/1.04 'IBM Plex Sans',sans-serif;letter-spacing:-.015em;text-wrap:balance}.fdtxt h1 em{font-style:normal;color:var(--pad)}.fdtxt .lead{margin:0;max-width:52ch}
.fdhero .reel{margin:0}.fdhero .hstage{max-height:none}.fdhero .hcap .hline{font-size:clamp(16px,1.9vw,24px)}
.abfacts{display:flex;gap:8px 24px;flex-wrap:wrap;font:500 12.5px var(--mono);color:var(--dim)}.abfacts b{color:var(--ink);font-weight:500}
.fddoors{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}
.abdoor{display:flex;flex-direction:column;gap:8px;text-align:left;background:var(--card);border:1px solid var(--line);border-top:3px solid var(--c);border-radius:14px;padding:18px;color:var(--ink);font:inherit;cursor:pointer}.abdoor:hover{background:#171B21}
.abdoor .eyebrow,.absheet .eyebrow{color:var(--c)}.abdoor b{font-size:18px;line-height:1.25}.abd{color:var(--muted);font-size:14px}.abgo{margin-top:auto;padding-top:6px;color:var(--c);font-weight:600;font-size:14px;display:inline-flex;align-items:center;gap:6px}
.abmodal{position:fixed;inset:0;z-index:95;background:rgba(5,6,8,.8);display:grid;place-items:center;padding:16px;animation:hrIn .2s both}
.absheet{width:100%;max-width:700px;max-height:100%;overflow:auto;display:flex;flex-direction:column;gap:14px;background:var(--card);border:1px solid var(--line2);border-top:3px solid var(--c);border-radius:16px;padding:22px 24px 24px;box-shadow:0 30px 80px -20px rgba(0,0,0,.8);animation:hrUp .28s both ease-out}
.abtop{display:flex;align-items:center;justify-content:space-between}.abx{width:34px;height:34px;border-radius:8px;border:1px solid var(--line2);background:none;color:var(--ink);font-size:20px;line-height:1;cursor:pointer}
.absheet h2{margin:0;font-size:clamp(22px,3vw,30px);line-height:1.15;text-wrap:balance}.absheet .lead{margin:0}
.abpts{list-style:none;margin:0;padding:0;display:grid;gap:10px}.abpts li{display:grid;grid-template-columns:20px 1fr;color:var(--muted)}.abpts li::before{content:'';width:8px;height:8px;border-radius:50%;background:var(--c);margin:8px 0 0 3px}.abpts b{color:var(--ink)}
.absoon{display:flex;gap:6px;flex-wrap:wrap}.absheet .abcta{background:var(--c);color:#0B0D10}
.hablinks{display:flex;gap:4px 16px;flex-wrap:wrap;margin-left:8px}.hablinks .ablk{font-size:13.5px;padding:4px 0}
@media (max-width:900px){.fdhero{grid-template-columns:minmax(0,1fr)}.fdlinks{order:3;width:100%}}
@media (prefers-reduced-motion:reduce){.abmodal,.absheet{animation:none}}
.aset{display:flex;flex-direction:column;gap:16px}.aset .row{align-items:flex-end}.aset .afield{flex:1 1 240px;margin:0}.adel{display:flex;flex-direction:column;gap:12px;border-top:1px solid var(--line);padding-top:14px}.adel p{margin:0}.btn.danger{background:var(--bad);color:#1A0B09}.btn.line.danger{background:none;color:var(--bad);border-color:rgba(255,122,110,.45)}
