:root{--panel:#161c1e;--surface:#20282b;--surface-header:#263034;--surface-elevated:#2b373b;--ink:#e4e9e6;--muted:#9aa8a3;--rule:#3d4a4e;--field:#141a1c;--focus:#6aaee8;--off:#5b6663;--on:#2e8b4a;--warn:#c98a12;--fault:#b3322a;--navy:#101516;--sidebar-w:220px;--bg:var(--panel);--card-bg:var(--surface);--card-bg-header:var(--surface-header);--border:var(--rule);--text-main:var(--ink);--text-muted:var(--muted);--text-dim:#71817c}*{box-sizing:border-box}body{font-family:Bahnschrift,DIN Alternate,DIN\ 2014,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:var(--panel);color:var(--ink);margin:0;font-size:14px;line-height:1.5;min-height:100vh}.bg-white{background-color:var(--surface)!important}.bg-light,.bg-white{color:var(--ink)!important}.bg-light{background-color:var(--surface-header)!important}.text-dark{color:var(--ink)!important}.text-muted,.text-secondary{color:var(--muted)!important}.border,.border-bottom,.border-end,.border-start,.border-top{border-color:var(--rule)!important}.border-dashed{border-style:dashed!important;border-color:var(--rule)!important}.app-wrap{display:flex;min-height:100vh;background-color:var(--panel)}.sidebar{width:var(--sidebar-w);min-width:var(--sidebar-w);background:var(--navy);border-right:1px solid var(--rule);display:flex;flex-direction:column;z-index:200}.sidebar-brand{padding:16px;border-bottom:1px solid var(--rule);color:var(--ink);font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px}.sidebar-brand small{font-size:11px;color:var(--muted);font-weight:400;display:block}.nav-section{padding:8px 10px}.nav-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);padding:4px 6px 2px}.nav-btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;color:var(--muted);font-size:13px;font-weight:600;border:none;background:none;border-radius:4px;cursor:pointer;text-align:left;transition:background .15s,color .15s}.nav-btn:hover{background:rgba(228,233,230,.06);color:var(--ink)}.nav-btn.active{background:var(--ink);color:var(--surface);font-weight:700}.nav-btn.active svg{stroke:var(--surface)}.nav-btn .badge{margin-left:auto;font-size:10px;padding:2px 6px}.sidebar-footer{margin-top:auto;padding:12px 10px;border-top:1px solid var(--rule)}.sidebar-footer .reset-btn{width:100%;background:var(--surface);border:1px solid var(--rule);color:var(--muted);font-size:12px;padding:6px;border-radius:4px;cursor:pointer;font-weight:600;transition:all .15s}.sidebar-footer .reset-btn:hover{color:var(--ink);border-color:var(--ink);background:var(--surface-header)}.sidebar-backdrop{display:none;position:fixed;inset:0;background:rgba(10,16,18,.75);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:190}@media (max-width:991px){.sidebar{position:fixed;top:0;bottom:0;left:0;transform:translateX(-100%);transition:transform .25s}.sidebar.open{transform:translateX(0)}.sidebar-backdrop{display:block}}.main-wrap{flex:1 1;display:flex;flex-direction:column;min-width:0;height:100vh;overflow-y:auto;background-color:var(--panel)}.top-bar{height:52px;background:var(--panel);border-bottom:1px solid var(--rule);justify-content:space-between;padding:0 16px;gap:12px;position:-webkit-sticky;position:sticky;top:0;z-index:100}.demo-pill,.top-bar{display:flex;align-items:center}.demo-pill{font-size:11px;font-weight:700;letter-spacing:.05em;padding:3px 10px;border-radius:999px;background:rgba(179,50,42,.18);color:#f87171;border:1px solid var(--fault);gap:5px}.demo-dot{width:6px;height:6px;border-radius:50%;background:var(--fault);animation:blink 1.8s infinite}@keyframes blink{0%,to{opacity:1}50%{opacity:.3}}.uk-clock{font-family:ui-monospace,Consolas,monospace;font-size:13px;font-weight:600;border:1px solid var(--rule);padding:3px 10px;border-radius:4px;color:var(--focus)}.panel-tabs,.uk-clock{background:var(--surface)}.panel-tabs{display:flex;border:2px solid var(--ink);border-radius:6px;overflow:hidden}.panel-tab{flex:1 1;text-align:center;padding:9px 12px;color:var(--ink);text-decoration:none;font-weight:600;font-size:14px;border:none;background:transparent;border-left:2px solid var(--ink);cursor:pointer;transition:all .15s ease}.panel-tab:first-child{border-left:none}.panel-tab.active{background:var(--ink)!important;color:var(--surface)!important;font-weight:700}.panel-tab:focus-visible{outline:3px solid var(--focus);outline-offset:-3px}.card{background:var(--surface)!important;border:1px solid var(--rule)!important;border-radius:6px;overflow:hidden;color:var(--ink)}.card-header{padding:12px 16px;border-bottom:1px solid var(--rule)!important;font-weight:600;font-size:13px;color:var(--ink)!important;background:var(--surface-header)!important;display:flex;align-items:center;justify-content:space-between}.card-body{padding:16px;color:var(--ink)}.card-body,.stat-card{background:var(--surface)}.stat-card{border:1px solid var(--rule);border-radius:6px;padding:14px 16px;transition:border-color .15s ease}.stat-card:hover{border-color:var(--ink)}.stat-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:4px}.stat-value{font-size:22px;font-weight:700;color:var(--ink);line-height:1}.stat-sub{font-size:11px;color:var(--text-dim);margin-top:3px}.table{color:var(--ink)!important;border-color:var(--rule)!important;margin-bottom:0}.table-light{background-color:var(--surface-header)!important;color:var(--muted)!important}.table>:not(caption)>*>*{background-color:transparent!important;color:var(--ink)!important;border-bottom-color:var(--rule)!important}.simple-table{width:100%;border-collapse:collapse;font-size:13px;color:var(--ink)}.simple-table th{background:var(--surface-header);color:var(--muted);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.04em;padding:10px 12px;text-align:left}.simple-table td,.simple-table th{border-bottom:1px solid var(--rule)}.simple-table td{padding:11px 12px;vertical-align:middle;color:var(--ink)}.simple-table tbody tr:hover td{background:rgba(228,233,230,.04)}.simple-table tbody tr:last-child td{border-bottom:none}.lamp{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--ink)}.lamp i{width:12px;height:12px;border-radius:50%;background:var(--off);box-shadow:inset 0 0 0 2px rgba(0,0,0,.3);display:inline-block;transition:all .2s}.lamp.on i{background:var(--on);box-shadow:0 0 0 3px rgba(46,139,74,.35)}.lamp.relay-on i{background:var(--warn);box-shadow:0 0 0 3px rgba(201,138,18,.35)}.lamp.alarm-on i{background:var(--fault);box-shadow:0 0 0 3px rgba(179,50,42,.45)}.badge-online{background:rgba(46,139,74,.2);color:#4ade80;border:1px solid var(--on)}.badge-offline{background:var(--surface-header);color:var(--muted);border:1px solid var(--rule)}.badge-active{background:rgba(106,174,232,.2);color:var(--focus);border:1px solid var(--focus)}.badge-alarm{background:rgba(179,50,42,.25);color:#f87171;border:1px solid var(--fault)}.badge-warn{background:rgba(201,138,18,.2);color:#facc15;border:1px solid var(--warn)}.badge-parent{background:rgba(168,85,247,.2);color:#c084fc;border:1px solid #7c3aed}.badge-child{background:rgba(106,174,232,.15);color:var(--focus)}.badge-child,.badge-neutral{border:1px solid var(--rule)}.badge-neutral{background:var(--surface-header);color:var(--muted)}.sbadge{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600}.sbadge .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.relay-active{background:var(--warn);color:#161c1e;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:700;animation:pulse-relay 1.2s infinite}@keyframes pulse-relay{0%,to{opacity:1}50%{opacity:.65}}.relay-switch{width:120px;height:120px;border-radius:50%;border:4px solid var(--rule);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;font-weight:700;font-size:14px;gap:4px;transition:all .2s}.relay-switch.on{background:var(--warn);color:#161c1e;border-color:#fde047;box-shadow:0 0 20px rgba(201,138,18,.5)}.relay-switch.off{background:var(--surface);color:var(--muted)}.relay-switch.off:hover{background:var(--surface-header);color:var(--ink)}.form-check-input{background-color:var(--off)!important;border-color:var(--rule)!important;cursor:pointer}.form-check-input:checked{background-color:var(--on)!important;border-color:var(--on)!important}.flow-node{background:var(--surface);border:2px solid var(--rule);border-radius:6px;padding:14px;transition:all .25s;color:var(--ink)}.flow-node.triggered{border-color:var(--fault);background:rgba(179,50,42,.15)}.flow-node.active{border-color:var(--focus);background:rgba(106,174,232,.12)}.own-relay-card{border:2px solid var(--fault);border-radius:6px;background:var(--surface-header);padding:8px 10px;transition:all .2s}.own-relay-card.active{background:rgba(179,50,42,.22);border-color:var(--fault);box-shadow:0 0 12px rgba(179,50,42,.4)}.yellow-callout{background:rgba(201,138,18,.15);border:1px solid var(--warn);color:#fde68a;border-radius:4px;padding:8px 12px}.log-row{padding:8px 0;border-bottom:1px solid var(--rule)}.log-row:last-child{border-bottom:none}.toast-stack{position:fixed;bottom:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;max-width:340px}.toast-item{background:var(--surface);border-radius:6px;padding:10px 14px;box-shadow:0 10px 25px rgba(0,0,0,.6);border:1px solid var(--rule);border-left:4px solid var(--focus);color:var(--ink);display:flex;align-items:flex-start;gap:10px;font-size:13px;animation:slide-up .2s ease}.toast-item.success{border-left-color:var(--on)}.toast-item.danger{border-left-color:var(--fault)}.toast-item.warning{border-left-color:var(--warn)}@keyframes slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.modal-overlay{position:fixed;inset:0;background:rgba(10,16,18,.75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:1050;padding:16px}.modal-box{background:var(--surface);border:1px solid var(--rule);border-radius:6px;width:100%;max-width:520px;box-shadow:0 25px 50px -12px rgba(0,0,0,.8);color:var(--ink)}.modal-head{padding:14px 18px;background:var(--surface-header);border-bottom:1px solid var(--rule);font-weight:700;font-size:15px;color:var(--ink);display:flex;align-items:center;justify-content:space-between}.modal-body{padding:18px;background:var(--surface);color:var(--ink)}.modal-foot{padding:12px 18px;background:var(--surface-header);border-top:1px solid var(--rule);display:flex;justify-content:flex-end;gap:8px}.btn-close{filter:invert(1) grayscale(100%) brightness(200%);opacity:.75}.btn-close:hover{opacity:1}.form-control,.form-select{font-size:13px!important;background-color:var(--field)!important;border:1px solid var(--rule)!important;color:var(--ink)!important;border-radius:4px}.form-control::placeholder{color:var(--muted)!important}.form-control:focus,.form-select:focus{background-color:var(--field)!important;border-color:var(--focus)!important;outline:2px solid var(--focus)!important;outline-offset:1px;box-shadow:none!important;color:#fff!important}.form-control:disabled,.form-select:disabled{background-color:rgba(20,26,28,.6)!important;border-color:var(--rule)!important;color:var(--muted)!important;opacity:.5}label.form-label{font-size:12px;font-weight:600;color:var(--ink);margin-bottom:4px}.btn-sm{padding:6px 12px!important;font-size:12px!important;border-radius:4px!important;font-weight:600!important}.btn-primary{background-color:var(--ink)!important;border-color:var(--ink)!important;color:var(--surface)!important;font-weight:700!important}.btn-primary:hover{background-color:#fff!important;border-color:#fff!important;color:#000!important}.btn-light{background-color:transparent!important;border:1px solid var(--rule)!important;color:var(--ink)!important}.btn-light:hover{background-color:var(--surface-header)!important;border-color:var(--ink)!important;color:#fff!important}.btn-outline-secondary{border-color:var(--rule)!important;color:var(--muted)!important;background:transparent!important}.btn-outline-secondary:hover{background-color:var(--surface-header)!important;color:var(--ink)!important;border-color:var(--ink)!important}.btn-danger,.btn-outline-danger{border:1px solid var(--fault)!important;color:#f87171!important;background-color:transparent!important}.btn-danger:hover,.btn-outline-danger:hover{background-color:rgba(179,50,42,.25)!important;color:#faa!important;border-color:#f87171!important}.contact-open{background:rgba(46,139,74,.2);color:#4ade80;border:2px solid var(--on);border-radius:6px}.contact-closed,.contact-open{padding:8px 16px;font-weight:700;text-align:center}.contact-closed{background:rgba(179,50,42,.25);color:#f87171;border:2px solid var(--fault);border-radius:6px;animation:blink .8s infinite}.drop-zone{border:2px dashed var(--rule);border-radius:6px;background:var(--field);padding:16px;text-align:center;transition:all .2s ease;min-height:90px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--muted)}.drop-zone.drag-over{border-color:var(--focus);background:rgba(106,174,232,.1);transform:scale(1.01)}.draggable-card{background:var(--surface-header);border:1px solid var(--rule);border-radius:4px;padding:8px 10px;cursor:-webkit-grab;cursor:grab;transition:transform .15s,box-shadow .15s;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--ink)}.draggable-card:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,0,0,.3);border-color:var(--ink)}.draggable-card:active{cursor:-webkit-grabbing;cursor:grabbing}.flow-pill{padding:6px 14px;border-radius:4px;font-size:12px;font-weight:600;border:1px solid var(--rule);background:var(--surface-header);color:var(--ink);cursor:pointer;transition:all .15s;display:inline-flex;align-items:center;gap:6px}.flow-pill:hover{background:var(--surface-elevated);border-color:var(--ink);color:#fff}.flow-pill.active{background:var(--ink);color:var(--surface);border-color:var(--ink)}.flow-canvas{background:var(--panel);background-image:radial-gradient(var(--rule) 1.2px,transparent 1.2px);background-size:24px 24px;border:1px solid var(--rule);border-radius:8px;min-height:520px;position:relative;overflow:hidden;display:flex;flex-direction:column}.canvas-toolbar{background:var(--surface);border-bottom:1px solid var(--rule);padding:10px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.canvas-node{background:var(--surface-header);border:1.5px solid var(--rule);border-radius:6px;box-shadow:0 4px 14px rgba(0,0,0,.35);padding:14px;transition:all .2s ease;min-width:220px;color:var(--ink)}.canvas-node:hover{box-shadow:0 6px 20px rgba(0,0,0,.5);border-color:var(--ink)}.canvas-node.node-triggered{border-color:var(--fault);background:rgba(179,50,42,.18);box-shadow:0 0 16px rgba(179,50,42,.3)}.canvas-node.node-active{border-color:var(--focus);background:rgba(106,174,232,.18);box-shadow:0 0 16px rgba(106,174,232,.3)}.canvas-tray{background:var(--surface);border-top:1px solid var(--rule);padding:10px 16px;display:flex;align-items:center;gap:10px;overflow-x:auto}.chip-device{background:var(--surface-header);border:1px solid var(--rule);border-radius:20px;padding:5px 12px;font-size:12px;font-weight:500;display:inline-flex;align-items:center;gap:6px;cursor:-webkit-grab;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;color:var(--ink);transition:all .15s ease}.chip-device:hover{background:var(--surface-elevated);border-color:var(--ink);color:#fff;transform:translateY(-1px)}.chip-device:active{cursor:-webkit-grabbing;cursor:grabbing}