:root{--bg: #0b1220;--panel: #111a2e;--panel2: #16223a;--line: #263450;--ink: #e2e8f0;--dim: #94a3b8;--acc: #fbbf24;--good: #34d399;--bad: #f87171;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{touch-action:manipulation;overscroll-behavior:none;-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--ink);font:13px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;overflow:hidden}button,select,input{font:inherit;color:inherit}button{background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;cursor:pointer}button:hover{border-color:var(--acc)}button.danger{border-color:#7f1d1d;color:#fecaca;background:#3b1219}button.on{border-color:var(--acc);background:#3a2f12}input[type=text],input[type=number],select{background:#0b1220;border:1px solid var(--line);border-radius:6px;padding:4px 6px;width:100%}input[type=range]{accent-color:var(--acc);width:110px}.app{display:flex;flex-direction:column;height:100%}.toolbar{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--panel);border-bottom:1px solid var(--line);flex-wrap:wrap}.brand{font-weight:800;letter-spacing:.3px;color:var(--acc);margin-right:4px}.play{min-width:40px;font-size:15px;background:#14532d;border-color:#22c55e}.running .play{background:#78350f;border-color:var(--acc)}.ctl{display:flex;align-items:center;gap:6px;color:var(--dim)}.ctl b{color:var(--ink);min-width:38px}.ctl select{width:auto;text-transform:capitalize}.clock{font-variant-numeric:tabular-nums;font-weight:700;font-size:15px;display:flex;gap:6px;align-items:center;min-width:190px}.tier{color:#111;border-radius:10px;padding:1px 9px;font-size:11px;font-weight:800}.spacer{flex:1}.main{flex:1;display:flex;min-height:0}.palette{width:218px;background:var(--panel);border-right:1px solid var(--line);padding:10px;overflow-y:auto;touch-action:pan-y;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;user-select:none;-webkit-user-select:none}.palette h3,.panel h3{margin:4px 0 6px;font-size:12px;text-transform:uppercase;letter-spacing:.8px;color:var(--dim)}.pitem{touch-action:pan-y;-webkit-touch-callout:none;display:flex;align-items:center;gap:8px;padding:6px;margin-bottom:6px;border:1px solid var(--line);border-radius:10px;background:var(--panel2);cursor:grab}.pitem:hover{border-color:var(--acc)}.pitem svg{flex:none;background:#0f172a;border-radius:8px}.pname{font-weight:700}.pdesc{font-size:11px;color:var(--dim);line-height:1.25}.ghost{position:fixed;transform:translate(-50%,-50%);pointer-events:none;opacity:.85;z-index:50}.hint{color:var(--dim);font-size:12px;margin:0 0 8px}.stage{flex:1;min-width:0;position:relative}.canvas{width:100%;height:100%;display:block;touch-action:none;-webkit-user-select:none;user-select:none;transition:background .3s}.node .body{fill:#172036}.node{cursor:grab}.nlabel{fill:var(--ink);font-size:11px;font-weight:700;pointer-events:none}.nsub{fill:var(--dim);font-size:9.5px;pointer-events:none}.nval{font-size:10.5px;font-weight:700;pointer-events:none}.elabel{fill:#e2e8f0;font-size:10px;font-weight:700}.clocklbl{fill:#94a3b8;font-size:13px}.port{cursor:crosshair}.port .dot{transition:r .1s}.port:hover .dot{r:8.5}.port.valid .dot{stroke:#fff;animation:glow .9s infinite alternate}.swbtn{cursor:pointer}@keyframes glow{to{opacity:.45}}.flow{stroke-dasharray:7 11;animation:flow .8s linear infinite}.flow.rev{animation-direction:reverse}.paused .flow,.paused .spin,.paused .pulse{animation-play-state:paused}@keyframes flow{to{stroke-dashoffset:-18}}.spin{animation:spin 2s linear infinite;transform-box:view-box;transform-origin:0 0}@keyframes spin{to{transform:rotate(360deg)}}.pulse{animation:glow .6s infinite alternate}.side{width:300px;background:var(--panel);border-left:1px solid var(--line);overflow-y:auto}.panel{padding:10px 12px;border-bottom:1px solid var(--line)}.field{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.field>span:first-child{color:var(--dim);flex:none;width:112px}.numwrap{display:flex;align-items:center;gap:4px;flex:1}.unit{color:var(--dim);font-size:11px;width:38px}.row{display:flex;gap:8px;margin:8px 0}.live{background:#0b1220;border-radius:8px;padding:6px 8px;margin:8px 0;color:var(--dim)}.help{padding-left:16px;color:var(--dim)}.help li{margin-bottom:6px}kbd{background:var(--panel2);border:1px solid var(--line);border-radius:4px;padding:0 4px}.srow{display:flex;justify-content:space-between;gap:8px;padding:2px 0;border-bottom:1px dashed #1e2b45}.srow span{color:var(--dim)}.srow b{font-variant-numeric:tabular-nums}.srow.bad b,.srow.bad span{color:var(--bad)}.srow.warn b{color:var(--acc)}.srow.good b{color:var(--good)}.chart{margin:8px 0;background:#0b1220;border-radius:8px;padding:6px}.chart.empty{color:var(--dim);text-align:center;padding:28px 6px}.legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--dim)}.legend i,.brushes i,.rates i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:4px}.modal-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:#02060eb3;display:flex;align-items:center;justify-content:center;z-index:100}.modal{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px 18px;width:min(860px,96vw);max-height:94vh;overflow:auto;-webkit-user-select:none;user-select:none;touch-action:pan-y;-webkit-overflow-scrolling:touch}.mhead{display:flex;justify-content:space-between;align-items:center}.mhead h2{margin:0;font-size:18px}.modal h4{margin:14px 0 6px;color:var(--dim);font-weight:600}.tabs{display:flex;gap:6px;margin-top:10px}.tabs button{text-transform:capitalize}.rates{display:flex;gap:10px;flex-wrap:wrap}.rates label{display:flex;align-items:center;gap:4px}.rates input{width:72px}.brushes{display:flex;gap:8px;margin-bottom:8px;flex-wrap:wrap}.sched{display:grid;gap:2px}.srow2{display:grid;grid-template-columns:34px repeat(24,1fr);gap:2px;align-items:center}.cell{height:22px;border-radius:3px;cursor:pointer;opacity:.9}.cell:hover{opacity:1;outline:1px solid #fff}.hh,.dd{font-size:10px;color:var(--dim);text-align:center}@media (max-width: 900px){.palette{width:150px}.pdesc{display:none}.side{width:250px}}.stage .tools{position:absolute;left:12px;bottom:12px;display:flex;gap:6px;align-items:center}.tools button{background:#111a2eeb}.selcount{background:#111a2eeb;border:1px solid var(--acc);border-radius:8px;padding:5px 10px;color:var(--acc);font-weight:700}.canvas.panning,.gtab{cursor:grab}.toolbar .scname{width:190px;font-weight:700;background:transparent;border-color:transparent}.toolbar .scname:hover,.toolbar .scname:focus{background:#0b1220;border-color:var(--line)}.swatches{display:flex;gap:8px;margin:8px 0}.swatches button{width:24px;height:24px;padding:0;border-radius:50%;border:2px solid transparent}.swatches button.on{border-color:#fff}.curfield{display:flex;align-items:center;gap:8px;margin-top:12px;color:var(--dim)}.curfield input{width:90px}.tip{display:flex;flex-wrap:wrap;gap:2px 10px;font-size:11px;color:var(--dim);padding:4px 2px;min-height:52px}.tip>b{width:100%;color:var(--ink);font-size:12px}.tip i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:4px}.tip span b{color:var(--ink);font-variant-numeric:tabular-nums}.urow{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:8px;cursor:pointer;border:1px solid transparent}.urow:hover{background:var(--panel2)}.urow.on{border-color:var(--acc);background:var(--panel2)}.urow i{width:10px;height:10px;border-radius:50%;flex:none}.urow .uname{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.urow .ukw{color:var(--dim);font-size:11px}.urow b{min-width:64px;text-align:right;font-variant-numeric:tabular-nums}.ucard{margin-top:8px;border:1px solid var(--line);border-left-width:4px;border-radius:8px;padding:8px;background:#0e1628}.srow.link{cursor:pointer}.srow.link:hover span{color:var(--ink)}.chev{cursor:pointer}.hostrow{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid #1e2b45}.hostrow .fname{flex:1;min-width:0}.hostrow .fname b{display:block}.hostrow .fname span{color:var(--dim);font-size:11px}.hostmsg{padding:8px 10px;border-radius:8px;background:#0b1220;color:var(--dim);margin:8px 0}.hostmsg.err{color:#fecaca;background:#3b1219}.structs{display:grid;grid-template-columns:1fr 1fr;gap:10px}.structs button{text-align:left;display:flex;flex-direction:column;gap:4px;padding:10px 12px}.structs button span{color:var(--dim);font-size:12px;font-weight:400}.structs button.on{border-color:var(--acc);background:#3a2f12}.sched,.sched .cell{touch-action:none}.rates label input[type=number]{width:80px}.warnbtn{border-color:#b45309;background:#3a2512;color:#fde68a}@media (max-width: 700px){.structs{grid-template-columns:1fr}}.toolbar button:disabled{opacity:.35;cursor:default;border-color:var(--line)}.tpls{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}.tpl{display:flex;flex-direction:column;gap:4px;border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:var(--panel2)}.tpl span{color:var(--dim);font-size:12px;flex:1}.tpl small{color:#64748b}.tpl .row{margin:6px 0 0}.bmodes{display:grid;gap:6px}.bmodes label{display:flex;align-items:center;gap:8px}.bmodes label select{width:auto;min-width:270px}.prio{display:grid;gap:6px;max-width:420px}.pchip{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:10px;padding:7px 10px;background:var(--panel2)}.pchip.locked{border-style:dashed;color:var(--dim)}.pchip small{color:#64748b;margin-left:auto}.pchip .pn{width:20px;height:20px;border-radius:50%;background:#0b1220;text-align:center;line-height:20px;font-size:11px;color:var(--dim)}.pchip .pbtns{margin-left:auto;display:flex;gap:4px}.pchip .pbtns button{padding:2px 9px}.pchip .pbtns button:disabled{opacity:.3}.failbtn.on{background:#7f1d1d;border-color:#f87171;color:#fee2e2;animation:glow .9s infinite alternate}.toolbar input[type=time],.field input[type=time]{background:#0b1220;border:1px solid var(--line);border-radius:6px;padding:4px 6px;color:var(--ink);width:100%}.toolbar .scname.needname{border:1px dashed #b45309;background:#1c1409}.mk{font-style:normal;font-size:9px;font-weight:800;border-radius:4px;padding:0 4px;margin-right:4px;background:#1e293b;color:#94a3b8}.mk.billing{background:#064e3b;color:#6ee7b7}.mk.municipal{background:#78350f;color:#fde68a}.srow.total{border-top:1px solid var(--line);font-weight:700;margin-top:2px}.srow.total.good b{color:var(--good)}.srow.total.bad b{color:var(--bad)}.srow .dot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:6px}.ucard.recon{border-left-color:#fbbf24}.urow .ukw{min-width:70px;text-align:right}.dbpanel{margin:8px 0}.dbhead{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.way{border:1px solid var(--line);border-radius:10px;padding:6px;margin-bottom:6px;background:#0e1628}.way.trip{border-color:#f87171}.wayrow{display:flex;align-items:center;gap:6px;margin-bottom:4px}.wayrow input[type=text]{flex:1;min-width:0}.wayrow input[type=number]{width:64px}.wayrow select{flex:1;width:auto}.wayrow button{padding:4px 8px}.wayrow.chk{color:var(--dim)}.wayrow.chk input{width:auto}.wn{width:18px;text-align:center;color:var(--dim);font-size:11px}.waymeter{border-left:2px solid var(--line);padding-left:8px;margin:4px 0}
