:root{--bg:#f4f6f9;--panel:#fff;--line:#d9dee7;--text:#1b2430;--muted:#65748b;--accent:#2563eb;--accent-text:#fff;--danger:#d92d20;--warn:#b54708;--ok:#067647;--grid-dot:#c3cbd8;--wire:#475569;--canvas:#fbfcfe;--board:#efe9d8;--board-edge:#b9ae92;--board-channel:#d8cfb6;--hole:#4b4636;--rail-pos:#d92d20;--rail-neg:#2563eb;--board-text:#7a6f55;--glow:0 0 0 3px #2563eb40}@media (prefers-color-scheme:dark){:root{--bg:#0f141b;--panel:#171e28;--line:#2b3646;--text:#e6ebf3;--muted:#93a1b5;--accent:#5b8def;--grid-dot:#2f3b4d;--wire:#9fb0c8;--canvas:#121923;--board:#2b3140;--board-edge:#475066;--board-channel:#212633;--hole:#0d1117;--board-text:#8b97ad}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:14px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}button,input,select{font:inherit;color:inherit}button{background:var(--panel);border:1px solid var(--line);cursor:pointer;border-radius:6px;padding:5px 10px}button:hover:not(:disabled){border-color:var(--accent)}button:disabled{opacity:.45;cursor:default}button:focus-visible,input:focus-visible,select:focus-visible{box-shadow:var(--glow);border-color:var(--accent);outline:none}button.primary{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}button.danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 50%, var(--line))}button.primary.danger,button.danger.primary{color:#fff;background:var(--danger);border-color:var(--danger)}input,select{background:var(--panel);border:1px solid var(--line);border-radius:6px;width:100%;padding:5px 8px}h1,h2,h3{margin:0}h2{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:8px;font-size:13px}h3{color:var(--muted);margin:12px 0 6px;font-size:12px}.hint{color:var(--muted);margin:6px 0;font-size:12.5px}.app{grid-template:"bar bar bar""ban ban ban""pal can side"1fr/210px 1fr 300px;height:100%;display:grid}.toolbar{background:var(--panel);border-bottom:1px solid var(--line);flex-wrap:wrap;grid-area:bar;align-items:center;gap:6px;padding:8px 12px;display:flex}.brand{margin-right:6px;font-weight:700}.project-name{width:200px}.dirty{color:var(--warn);font-size:12px}.sep{background:var(--line);width:1px;height:22px;margin:0 4px}.spacer{flex:1}.zoom{text-align:center;min-width:44px;color:var(--muted)}.banners{flex-direction:column;grid-area:ban;display:flex}.banner{border-bottom:1px solid var(--line);align-items:center;gap:8px;padding:7px 14px;font-size:13px;display:flex}.banner.ok{background:color-mix(in srgb, var(--ok) 14%, var(--panel))}.banner.error{background:color-mix(in srgb, var(--danger) 14%, var(--panel))}.banner.warn{background:color-mix(in srgb, var(--warn) 14%, var(--panel))}.banner button:last-child:not(:only-of-type){margin-left:0}.palette{background:var(--panel);border-right:1px solid var(--line);grid-area:pal;padding:12px;overflow:auto}.palette ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.palette-item{text-align:left;cursor:grab;align-items:center;gap:8px;width:100%;padding:6px 8px;display:flex}.palette-item svg{color:var(--text);flex:none}.canvas{background:var(--canvas);grid-area:can;min-height:320px;position:relative;overflow:hidden}.workspace{touch-action:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;color:var(--text);cursor:default;display:block}.empty-hint{fill:var(--muted);pointer-events:none;font-size:14px}.wire{fill:none;stroke:var(--wire);stroke-width:3px;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}.wire.draft{stroke:var(--accent);stroke-dasharray:6 5}.wire-hit{fill:none;stroke:#0000;stroke-width:14px;cursor:pointer}.wire-halo{fill:none;stroke:var(--accent);stroke-opacity:.35;stroke-width:9px;stroke-linecap:round;pointer-events:none}.comp{cursor:grab}.comp-hit{fill:#0000}.sel-box{pointer-events:none;fill:color-mix(in srgb, var(--accent) 8%, transparent);stroke:var(--accent);stroke-dasharray:4 3}.comp-label{fill:var(--text);pointer-events:none;font-size:12px;font-weight:600}.comp-measure{fill:var(--muted);font-variant-numeric:tabular-nums;pointer-events:none;paint-order:stroke;stroke:var(--canvas);stroke-width:3px;font-size:11px}.terminal{cursor:crosshair}.terminal-hit{fill:#0000}.terminal-dot{fill:var(--panel);stroke:var(--text);stroke-width:2px}.terminal.linked .terminal-dot{fill:var(--text)}.terminal:hover .terminal-dot,.terminal.hot .terminal-dot{fill:var(--accent);stroke:var(--accent)}.switch-toggle{cursor:pointer}.toggle{fill:#94a3b8}.toggle.on{fill:var(--ok)}.side{background:var(--panel);border-left:1px solid var(--line);grid-area:side;overflow:auto}.props,.results{padding:12px}.results{border-top:1px solid var(--line)}.results header{justify-content:space-between;align-items:center;display:flex}.status{border:1px solid var(--line);border-radius:99px;padding:2px 8px;font-size:12px}.status.on{color:var(--ok);border-color:var(--ok)}.status.bad{color:var(--danger);border-color:var(--danger)}.field{margin:8px 0}.field label{color:var(--muted);margin-bottom:3px;font-size:12px;display:block}.unit{opacity:.8}.field-error{color:var(--danger);margin:4px 0 0;font-size:12px}input[aria-invalid=true]{border-color:var(--danger)}.check{align-items:center;gap:8px;margin:8px 0;display:flex}.check input{width:auto}.actions{gap:8px;margin-top:10px;display:flex}.readout{font-variant-numeric:tabular-nums;grid-template-columns:auto 1fr;gap:2px 12px;margin:12px 0 0;display:grid}.readout dt{color:var(--muted)}.readout dd{text-align:right;margin:0}.issues{gap:6px;margin:8px 0;padding:0;list-style:none;display:grid}.issue{border-radius:6px;padding:6px 8px;font-size:12.5px}.issue button{text-align:left;background:0 0;border:0;width:100%;padding:0}.issue.error{background:color-mix(in srgb, var(--danger) 13%, var(--panel))}.issue.warning{background:color-mix(in srgb, var(--warn) 13%, var(--panel))}table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;margin-top:8px;font-size:12.5px}th,td{border-bottom:1px solid var(--line);text-align:right;padding:4px 6px}thead th,tbody th{text-align:left}.auth{place-items:center;min-height:100%;padding:16px;display:grid}.auth form{background:var(--panel);border:1px solid var(--line);border-radius:12px;gap:6px;width:min(380px,100%);padding:24px;display:grid}.tabs{gap:6px;margin:8px 0;display:flex}.tabs button{flex:1}.tabs [aria-selected=true]{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.form-errors{color:var(--danger);margin:4px 0;padding-left:18px;font-size:13px}.modal-backdrop{z-index:10;background:#0006;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;width:min(520px,100%);max-height:80vh;padding:18px;overflow:auto}.project-list{gap:6px;margin:8px 0;padding:0;list-style:none;display:grid}.project-list li{gap:6px;display:flex}.project-open{text-align:left;flex:1;display:grid}@media (width<=900px){.app{grid-template:"bar""ban""pal""can"minmax(360px,1fr)"side"/1fr;height:auto;min-height:100%}.palette{border-right:0;border-bottom:1px solid var(--line);padding:8px}.palette section{display:contents}.palette h2,.palette h3{display:none}.palette ul{display:contents}.palette{gap:6px;display:flex;overflow-x:auto}.palette-item{white-space:nowrap;width:auto}.side{border-left:0;border-top:1px solid var(--line)}.project-name{width:140px}}.stop-time{width:78px}.scope{border-top:1px solid var(--line);padding:12px}.scope header{justify-content:space-between;align-items:center;display:flex}.scope select{width:auto}.scope-plot{background:var(--canvas);border:1px solid var(--line);border-radius:6px;width:100%;height:auto}.scope-frame{fill:none;stroke:var(--line)}.scope-grid{stroke:var(--line);stroke-dasharray:3 3}.scope-tick{fill:var(--muted);font-size:8.5px}.scope-cursor{stroke:var(--text);stroke-opacity:.6;stroke-dasharray:2 2}.scope input[type=range]{width:100%;padding:0}.legend{flex-wrap:wrap;gap:4px 12px;margin:4px 0 0;padding:0;list-style:none;display:flex}.legend label{align-items:center;gap:4px;font-size:12px;display:inline-flex}.legend input{width:auto}.swatch{border-radius:2px;width:10px;height:10px;display:inline-block}.toolbar select{width:auto}.toolbar input.stop-time{width:78px}.board-body{fill:var(--board);stroke:var(--board-edge);stroke-width:2px}.board-channel{fill:var(--board-channel)}.board-holes{fill:var(--hole)}.board-num{fill:var(--board-text);font-size:9px}.rail-pos{stroke:var(--rail-pos);stroke-width:1.5px}.rail-neg{stroke:var(--rail-neg);stroke-width:1.5px}.rail-sign{font-size:13px;font-weight:700}.rail-sign.pos{fill:var(--rail-pos)}.rail-sign.neg{fill:var(--rail-neg)}.hole-used{fill:var(--accent);stroke:var(--panel);stroke-width:1.5px}.hole-hover{fill:none;stroke:var(--accent);stroke-width:2px}.hole-hud{fill:var(--muted);font-variant-numeric:tabular-nums;font-size:12px}.board .comp-hit{cursor:grab}@media (width<=900px){.toolbar{scrollbar-width:thin;flex-wrap:nowrap;padding:6px 8px;overflow-x:auto}.toolbar>*{flex:none}.toolbar .spacer{flex:1 0 8px}}.palette-hint{margin:0 0 6px}.guide{border-bottom:1px solid var(--line);padding:12px}.guide header{justify-content:space-between;align-items:center;display:flex}.guide .icon{padding:0 8px;font-size:18px;line-height:1.2}.guide-progress{color:var(--muted);margin:6px 0;font-size:12.5px}.bar{background:var(--line);border-radius:2px;height:4px;margin-top:4px;display:block;overflow:hidden}.bar>span{background:var(--ok);height:100%;display:block}.chips{flex-wrap:wrap;gap:4px;margin:8px 0;padding:0;list-style:none;display:flex}.chip{font-variant-numeric:tabular-nums;min-width:30px;padding:3px 6px}.chip.done{border-color:var(--ok);color:var(--ok)}.chip.blocked{color:var(--muted);border-style:dashed}.chip.current{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.step-title{color:var(--text);text-transform:none;letter-spacing:0;margin:10px 0 2px;font-size:15px}.step-text{margin:2px 0 6px}.status-line{margin:4px 0;font-size:12.5px;font-weight:600}.status-line.done{color:var(--ok)}.status-line.blocked{color:var(--muted)}.status-line.todo{color:var(--warn)}.checks{gap:3px;margin:6px 0;padding:0;font-size:12.5px;list-style:none;display:grid}.checks li.ok{color:var(--ok)}.checks li.bad{color:var(--text)}.checks li.blocked{color:var(--muted)}.nets{margin:6px 0;font-size:12.5px}.nets ul{margin:4px 0 0;padding-left:18px}.guide-controls{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.guide-controls.secondary button{font-size:12.5px}.issue.ok{background:color-mix(in srgb, var(--ok) 14%, var(--panel))}.ghost{color:var(--accent);opacity:.4}.ghost.current{opacity:.85}.ghost-wire{fill:none;stroke:var(--accent);stroke-width:3px;stroke-dasharray:2 6;stroke-linecap:round;opacity:.45}.ghost-wire.current{opacity:.95;stroke-dasharray:8 5}.guide-hole{fill:none;stroke:var(--warn);stroke-width:2.5px;animation:1.6s ease-in-out infinite pulse}.guide-box{fill:none;stroke:var(--warn);stroke-width:2.5px;stroke-dasharray:6 4;pointer-events:none}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.guide-hole{animation:none}}button.active{background:color-mix(in srgb, var(--accent) 16%, var(--panel));border-color:var(--accent)}@media (width<=900px){.palette-hint{display:none}}.wire-outline{fill:none;stroke:var(--canvas);stroke-width:6px;stroke-linecap:round;stroke-linejoin:round;pointer-events:none;opacity:.9}.swatches{flex-wrap:wrap;gap:6px;margin:8px 0 4px;display:flex}.swatch-btn{border:2px solid var(--line);border-radius:50%;width:24px;height:24px;padding:0}.swatch-btn.none{border-radius:6px;width:auto;height:24px;padding:0 8px;font-size:12px}.swatch-btn.on{outline:2px solid var(--accent);outline-offset:2px}.guide-editor h3,.guide-editor h4{text-transform:none;letter-spacing:0;color:var(--muted);margin:10px 0 4px;font-size:12px}.edit-steps{gap:3px;max-height:190px;margin:8px 0;padding:0;list-style:none;display:grid;overflow:auto}.edit-steps button{text-align:left;align-items:baseline;gap:8px;width:100%;display:flex}.edit-steps button.current{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}.edit-steps .num{font-variant-numeric:tabular-nums;opacity:.8;min-width:1.4em}.step-items{gap:3px;margin:0;padding:0;font-size:12.5px;list-style:none;display:grid}.step-items li{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:6px;padding:2px 4px;display:flex}.preview{border:1px dashed var(--line);border-radius:8px;margin-top:12px;padding:8px}textarea{background:var(--panel);border:1px solid var(--line);width:100%;font:inherit;color:inherit;resize:vertical;border-radius:6px;padding:6px 8px}.guide .tabs{margin:6px 0}.badge{border:1px solid var(--line);color:var(--muted);border-radius:99px;padding:2px 8px;font-size:12px}.link-btn{border:1px solid var(--line);color:var(--text);border-radius:6px;padding:5px 10px;text-decoration:none}.auth-card{background:var(--panel);border:1px solid var(--line);border-radius:12px;gap:8px;width:min(380px,100%);padding:24px;display:grid}p.ok{color:var(--ok);font-weight:600}.app.shared{grid-template-columns:0 1fr 300px;grid-template-areas:"bar bar bar""ban ban ban""pal can side"}@media (width<=900px){.app.shared{grid-template:"bar""ban""can"minmax(360px,1fr)"side"/1fr}}.wire-outline[data-color=black]{stroke:#cbd5e1;opacity:.75}.wire-outline[data-color=white]{stroke:#475569;opacity:.85}.terminal[data-level=high] .terminal-dot{fill:#e8590c}.terminal[data-level=low] .terminal-dot{fill:#1c7ed6}.terminal[data-level=undefined] .terminal-dot{fill:#f59f00}.gpio-list{gap:6px;margin:6px 0;padding:0;list-style:none;display:grid}.gpio-list li{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.gpio-list .gpio-name{min-width:58px;font-size:12.5px;font-weight:600}.gpio-list select{flex:56px;min-width:56px}.gpio-read{color:var(--muted);font-variant-numeric:tabular-nums;flex-basis:100%;font-size:11.5px}.gpio-read:empty{display:none}.files-panel textarea.file-editor{tab-size:2;resize:vertical;box-sizing:border-box;width:100%;min-height:180px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}.files-panel ul.file-list{max-height:150px;margin:0 0 8px;padding:0;list-style:none;overflow:auto}.files-panel ul.file-list button{text-align:left;width:100%}.files-panel ul.file-list button[aria-current=true]{font-weight:700}.files-panel .banner-inline{background:#80808026;border-radius:6px;margin:6px 0;padding:6px 8px;font-size:12px}
