:root{--bg: #14171b;--panel: #1f242b;--panel-2: #2a3039;--border: #39414c;--text: #e6e8eb;--muted: #9aa3ad;--accent: #f2c230;font-family:JetBrains Mono,Fira Mono,ui-monospace,monospace;font-size:13px;color:var(--text);background:var(--bg)}*{box-sizing:border-box}[hidden]{display:none!important}html,body{margin:0;height:100%;overflow:hidden}body{display:flex;flex-direction:column}.toolbar,.statusbar{display:flex;align-items:center;gap:12px;padding:6px 12px;background:var(--panel);border-bottom:2px solid var(--border);flex-wrap:wrap}.statusbar{border-bottom:0;border-top:2px solid var(--border);color:var(--muted);font-size:12px}.brand{font-weight:700;letter-spacing:2px;color:var(--accent)}.group{display:flex;align-items:center;gap:4px}.spacer{flex:1}.label{color:var(--muted);min-width:2.5em;text-align:center}button,select{font:inherit;color:var(--text);background:var(--panel-2);border:2px solid var(--border);border-radius:0;padding:4px 10px;cursor:pointer;image-rendering:pixelated}button:hover,select:hover{border-color:var(--muted)}button.toggle.on{border-color:var(--accent);color:var(--accent)}main{flex:1;position:relative;min-height:0}#scene{position:absolute;inset:0}#inspector{position:absolute;top:12px;right:12px;width:280px;max-width:calc(100% - 24px);background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px}#inspector h2{margin:0 0 8px;font-size:14px;color:var(--accent)}#inspector dl{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;margin:0}#inspector dt{color:var(--muted)}#inspector dd{margin:0}#legend{display:flex;gap:10px;flex-wrap:wrap}.dot{display:inline-block;width:8px;height:8px;margin-right:4px;vertical-align:middle}#library{position:absolute;top:12px;left:12px;bottom:12px;width:300px;max-width:calc(100% - 24px);overflow-y:auto;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px}#library h2,#library h3{margin:0 0 8px;font-size:14px;color:var(--accent)}#library h3{margin-top:14px;font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:1px}.lib-item{display:grid;grid-template-columns:84px 1fr;gap:8px;align-items:center;width:100%;text-align:left;padding:6px;margin-bottom:6px}.lib-item .thumb{width:84px;height:72px;display:flex;align-items:flex-end;justify-content:center;background:#161a1f}.lib-item small,.muted{color:var(--muted);font-size:11px}.pixel{image-rendering:pixelated;max-width:100%;max-height:100%}.tag{display:inline-block;padding:0 4px;border:1px solid var(--border);font-size:10px;color:var(--muted)}.tag.drawn{border-color:var(--accent);color:var(--accent)}.modal{position:absolute;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;padding:16px;z-index:8}.modal[hidden]{display:none}.modal-body{background:var(--panel);border:2px solid var(--border);box-shadow:6px 6px #000a;padding:14px 16px;width:min(980px,100%);max-height:100%;overflow:auto}.modal-body header{display:flex;align-items:baseline;gap:12px;margin-bottom:10px}.modal-body h2{margin:0;font-size:16px;color:var(--accent)}.showroom-main{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:16px}.stage{background:#161a1f;display:flex;align-items:center;justify-content:center;min-height:460px;border:2px solid var(--border)}.chips{display:flex;flex-wrap:wrap;gap:4px;margin:8px 0}.chips button.on{border-color:var(--accent);color:var(--accent)}.matrix{display:grid;grid-template-columns:auto repeat(4,1fr);gap:4px;margin-top:12px;align-items:center}.matrix .cell{background:#161a1f;height:96px;display:flex;align-items:flex-end;justify-content:center;padding:2px;cursor:pointer;border:2px solid transparent}.matrix .cell.on{border-color:var(--accent)}button.primary{border-color:var(--accent);color:var(--accent)}button.danger{border-color:#a82c25;color:#ff8a80}button:disabled{opacity:.4;cursor:default}:is(#palette,#site-palette){position:absolute;top:12px;left:12px;width:112px;display:flex;flex-direction:column;gap:4px;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:6px;z-index:2}:is(#palette,#site-palette):not([hidden])~#library{left:136px}:is(#palette,#site-palette) .tool{display:flex;gap:6px;align-items:center;padding:4px 6px;text-align:left}:is(#palette,#site-palette) .tool.on{border-color:var(--accent);color:var(--accent)}:is(#palette,#site-palette) .icon{width:14px;text-align:center}:is(#palette,#site-palette) .label{font-size:11px}:is(#palette,#site-palette) .hint{color:var(--muted);font-size:10px;line-height:1.3;margin-top:4px}.tool-options{display:flex;flex-direction:column;gap:2px}.tool-options select{width:100%;font-size:11px;padding:2px}#scene[data-tool=wall],#scene[data-tool=gate],#scene[data-tool=zone],#scene[data-tool=floor],#scene[data-tool=column],#scene[data-tool=place]{cursor:crosshair}#scene[data-tool=erase]{cursor:not-allowed}#warnings{position:absolute;right:12px;bottom:12px;width:320px;max-height:45%;overflow-y:auto;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px}#warnings h2,#inspector h3{margin:0 0 8px;font-size:14px;color:var(--accent)}#inspector h3{margin-top:10px;font-size:12px}.warn-item{display:grid;grid-template-columns:20px 1fr;gap:6px;width:100%;text-align:left;margin-bottom:4px}.warn-item.error,.warn-line.error{border-left:4px solid #ff3b30}.warn-item.warning,.warn-line.warning{border-left:4px solid #ff9500}.warn-item.info,.warn-line.info{border-left:4px solid #3a8fd0}.warn-line{padding:2px 6px;margin-bottom:2px;font-size:12px}#warnings-toggle.bad{border-color:#ff3b30;color:#ff8a80}#warnings-toggle.warn{border-color:#ff9500;color:#ffc27a}.status[data-state=dirty],.status[data-state=error]{color:#ffc27a}#inspector{max-height:calc(100% - 24px);overflow-y:auto}#inspector .field,.form .field{display:flex;flex-direction:column;gap:2px;margin-bottom:6px}.field span{color:var(--muted);font-size:11px}input[type=text],input[type=number],input[type=password]{font:inherit;color:var(--text);background:#161a1f;border:2px solid var(--border);padding:4px 6px;width:100%;min-width:0}input:disabled,select:disabled{opacity:.6}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 8px}.row{display:flex;align-items:center;gap:4px;margin:4px 0}.check{display:flex;align-items:center;gap:6px;margin:6px 0}.dialog{width:min(560px,100%)}.dialog footer{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.form-error{color:#ff8a80;min-height:1em;font-size:12px}.form h3{margin:12px 0 6px;font-size:12px;color:var(--muted);text-transform:uppercase}.admin-row{display:grid;grid-template-columns:1fr auto auto auto auto;gap:6px;align-items:center;padding:4px 0;border-bottom:1px solid var(--border)}.admin-add{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.admin-add input{flex:1 1 120px}code.token{display:block;word-break:break-all;background:#161a1f;border:2px solid var(--accent);padding:6px;user-select:all}.login{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(circle at 50% 30%,#262c34,var(--bg));padding:16px}.login-card{width:min(340px,100%);background:var(--panel);border:2px solid var(--border);box-shadow:6px 6px #000a;padding:20px;display:flex;flex-direction:column;gap:8px}.login-card h2{margin:0;font-size:16px}.login-card .field{display:flex;flex-direction:column;gap:2px}.lib-item{position:relative}.place-btn{position:absolute;right:6px;top:6px;border:2px solid var(--accent);color:var(--accent);width:22px;height:22px;line-height:18px;text-align:center;background:var(--panel-2)}@media(max-width:760px){.showroom-main{grid-template-columns:1fr}}@media(max-width:640px){.brand,#legend,:is(#palette,#site-palette) .label,:is(#palette,#site-palette) .hint{display:none}:is(#palette,#site-palette){width:auto}:is(#palette,#site-palette):not([hidden])~#library{left:64px}#inspector{top:auto;bottom:12px}}#user-info{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar{gap:8px;flex-wrap:nowrap;overflow-x:auto;white-space:nowrap}.toolbar>*{flex-shrink:0}@media(max-width:900px){.toolbar{flex-wrap:wrap}}.toolbar button,.toolbar select{padding:4px 8px}.toolbar .group{gap:2px}@media(max-width:1500px){.toolbar .brand,.toolbar .wide-only{display:none}}#people{position:absolute;top:12px;right:12px;bottom:12px;width:290px;max-width:calc(100% - 24px);overflow-y:auto;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px}#people:not([hidden])~#inspector,#people:not([hidden])+#inspector{right:316px}#people h2{margin:0 0 8px;font-size:14px;color:var(--accent)}#people h3{margin:10px 0 4px;font-size:11px;color:var(--muted);text-transform:uppercase}.person-item{display:grid;grid-template-columns:28px 1fr;gap:6px;align-items:center;width:100%;text-align:left;margin-bottom:3px;padding:3px 6px}.person-item.absent{opacity:.5}.person-item .avatar{height:34px;overflow:hidden;display:flex;align-items:flex-start;justify-content:center}.person-preview{display:flex;align-items:flex-end;gap:2px;background:#161a1f;padding:4px;margin-bottom:6px;overflow:hidden}.person-preview{justify-content:space-around}.person-preview .dir{width:52px;overflow:hidden;display:flex;justify-content:center}.swatches{display:flex;flex-wrap:wrap;gap:3px}.swatch{width:20px;height:20px;padding:0}.swatch.on{border-color:var(--accent);outline:1px solid var(--accent)}input[type=color]{width:100%;height:28px;padding:0 2px;background:#161a1f;border:2px solid var(--border)}.side-panel{position:absolute;top:12px;right:12px;bottom:12px;width:320px;max-width:calc(100% - 24px);overflow-y:auto;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px;z-index:3}.side-panel h2{margin:0 0 8px;font-size:14px;color:var(--accent)}.side-panel h3{margin:10px 0 4px;font-size:11px;color:var(--muted);text-transform:uppercase}.alert-item{border-left:4px solid #3a8fd0;background:var(--panel-2);padding:6px 8px;margin-bottom:4px}.alert-item.critical{border-left-color:#ff3b30}.alert-item.warning{border-left-color:#ff9500}.alert-item.acked,.alert-item.closed{opacity:.65}#alerts-toggle.alarm{border-color:#ff3b30;color:#fff;background:#a82c25;animation:blink 1s steps(2) infinite}@keyframes blink{50%{background:var(--panel-2)}}.toasts{position:absolute;top:12px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;gap:6px;z-index:10;width:min(420px,calc(100% - 24px));pointer-events:none}.toast{pointer-events:auto;background:var(--panel);border:2px solid var(--border);border-left:6px solid #3a8fd0;box-shadow:4px 4px #000a;padding:8px 10px}.toast.critical{border-left-color:#ff3b30}.toast.warning{border-left-color:#ff9500}.toast-head{display:flex;align-items:flex-start;gap:8px}.toast-head b{flex:1}.toast .close{padding:0 6px}.history-list{margin-top:8px}.history-item{display:grid;grid-template-columns:18px 1fr;gap:6px;width:100%;text-align:left;margin-bottom:2px;padding:3px 6px}.history-item .dot.st-running{color:#4cd964}.history-item .dot.st-idle{color:#f2c230}.history-item .dot.st-alarm{color:#ff3b30}.history-item .dot.st-setup{color:#3a8fd0}.history-item .dot.st-maintenance{color:#ff9500}.history-item .dot.st-off{color:#6b7178}.replay-bar{position:absolute;left:50%;bottom:12px;transform:translate(-50%);width:min(900px,calc(100% - 24px));display:flex;align-items:center;gap:8px;background:var(--panel);border:2px solid var(--accent);box-shadow:4px 4px #000a;padding:8px 12px;z-index:4}.replay-bar input[type=range]{flex:1}#rt-status[data-online=true]{color:#4cd964}#rt-status[data-online=false]{color:#ffc27a}body.mode-map .ws-only,body:not(.mode-map) .map-only{display:none!important}body.mode-cabinet .ws-only,body.mode-cabinet .view-only,body:not(.mode-cabinet) .cabinet-only{display:none!important}#site{position:absolute;inset:0}#site[data-tool=building],#site[data-tool=ground],#site[data-tool=item]{cursor:crosshair}#site[data-tool=erase]{cursor:not-allowed}#site-tip{position:absolute;pointer-events:none;z-index:5;min-width:160px;max-width:280px;background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:6px 8px;font-size:12px}#site-info{bottom:auto;max-height:calc(100% - 24px)}.muted{color:var(--muted)}.ws-summary{display:flex;flex-direction:column;gap:3px;margin:8px 0}.state-counts{display:flex;flex-wrap:wrap;gap:4px 10px}.state-count{display:inline-flex;align-items:center;gap:4px}.dot{display:inline-block;width:9px;height:9px;border:1px solid #0006;flex-shrink:0}.alert-line{border-left:4px solid #ff9500;padding-left:6px}.alert-line.critical{border-left-color:#ff3b30;color:#ff8a80}.ws-list{display:flex;flex-direction:column;gap:4px}.ws-item{display:grid;grid-template-columns:12px 1fr auto;gap:8px;align-items:center;text-align:left;width:100%}.ws-item .badge,.badge{min-width:20px;padding:0 4px;text-align:center;background:#ff9500;color:#111;font-weight:700}.badge.critical{background:#ff3b30;color:#fff}button.wide{width:100%;margin-top:4px}.form .row,#site-info .row{display:flex;gap:6px;align-items:center;margin-top:6px}#site-info .row .field{flex:1;min-width:0}#site-info .row .grow{flex:1}#site-info .form{border-top:2px solid var(--border);margin-top:10px;padding-top:8px}#site-info input,#site-info select{width:100%}#site-info .hint{font-size:11px;margin-top:10px}#map-status[data-state=dirty],#map-status[data-state=error]{color:#ffc27a}@media(max-width:640px){#site-info{top:auto;bottom:12px;max-height:45%}}.machine-panel{width:min(1100px,100%);display:flex;flex-direction:column;gap:10px}.machine-panel header{flex-wrap:wrap}.state-chip{display:inline-block;padding:1px 8px;border:2px solid var(--border);font-size:12px;background:var(--panel-2)}.state-chip.st-running,.state-chip.act-running{border-color:#4cd964;color:#4cd964}.state-chip.st-idle,.state-chip.act-idle{border-color:#f2c230;color:#f2c230}.state-chip.st-alarm{border-color:#ff3b30;color:#ff3b30}.state-chip.st-setup{border-color:#3a8fd0;color:#6fb3ea}.state-chip.st-maintenance{border-color:#ff9500;color:#ff9500}.state-chip.act-none,.state-chip.st-off{color:var(--muted)}.tabs{display:flex;gap:4px;border-bottom:2px solid var(--border);flex-wrap:wrap}.tabs .tab{border-bottom:none;margin-bottom:-2px}.tabs .tab.on{background:var(--panel);color:var(--accent);border-color:var(--border);border-bottom:2px solid var(--panel)}.machine-content{display:flex;flex-direction:column;gap:10px;min-height:240px}.machine-empty{max-width:520px}.camera-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px}.frame-view{background:#161a1f;border:2px solid var(--border);aspect-ratio:16 / 9;display:flex;align-items:center;justify-content:center;overflow:hidden}.frame-view img{width:100%;height:100%;object-fit:contain}.frame-info{display:flex;flex-direction:column;gap:8px}.frame-info pre.answer{white-space:pre-wrap;word-break:break-word;max-height:180px;overflow:auto;margin:4px 0 0;padding:6px 8px;background:#161a1f;border:2px solid var(--border);font:inherit;font-size:12px}.frame-strip{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px}.frame-strip .thumb{flex:0 0 auto;width:112px;height:64px;padding:0;border-width:3px;background:#161a1f}.frame-strip .thumb img{width:100%;height:100%;object-fit:cover;display:block}.frame-strip .thumb.act-running{border-color:#4cd964}.frame-strip .thumb.act-idle{border-color:#f2c230}.frame-strip .thumb.on{outline:2px solid var(--accent);outline-offset:1px}.small{font-size:11px}p.ok{color:#4cd964}.alarm{color:#ff6b61}.timeline-bar{position:relative;height:26px;background:#161a1f;border:2px solid var(--border);min-width:160px}.timeline-bar .seg{position:absolute;top:0;bottom:0}.seg.tl-running{background:#4cd964}.seg.tl-idle{background:#f2c230}.seg.tl-nodata{background:repeating-linear-gradient(45deg,#2a3039 0 4px,#1f242b 4px 8px)}.timeline-axis{display:flex;justify-content:space-between;font-size:11px}.timeline-legend{display:flex;gap:14px;font-size:12px}.timeline-legend i.seg{display:inline-block;position:static;width:14px;height:10px;margin-right:5px;vertical-align:middle}table.jobs{width:100%;border-collapse:collapse;font-size:12px}table.jobs th{text-align:left;color:var(--muted);font-weight:400;text-transform:uppercase;font-size:11px;border-bottom:2px solid var(--border);padding:4px 6px}table.jobs td{border-bottom:1px solid var(--border);padding:5px 6px;vertical-align:top}table.jobs td.num{white-space:nowrap}table.jobs td.actions{white-space:nowrap;text-align:right}table.jobs td.actions button{padding:2px 6px;margin-left:2px}table.jobs td.fact{min-width:180px}table.jobs td.fact .timeline-bar{height:14px}tr.job.st-running td:first-child{box-shadow:inset 3px 0 #4cd964}tr.job.st-paused td:first-child{box-shadow:inset 3px 0 #f2c230}.job-status{white-space:nowrap}.job-status.js-running{color:#4cd964}.job-status.js-paused{color:#f2c230}.job-status.js-cancelled{color:var(--muted);text-decoration:line-through}.job-add input[type=number]{width:110px}.job-add input[type=text]:first-child{flex:1 1 220px}.map-row{grid-template-columns:1fr minmax(160px,260px)}.tenant-row{grid-template-columns:1fr auto auto auto}.tenant-add{border-top:2px solid var(--border);padding-top:8px}#tenant-select{max-width:220px}#cabinet{position:absolute;inset:0;overflow:auto;padding:16px}.cabinet-inner{max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:14px}.cabinet-inner>header{display:flex;align-items:baseline;gap:12px}.cabinet-inner h2{margin:0;color:var(--accent);font-size:18px}.cabinet-inner>h3{margin:6px 0 0;color:var(--muted);text-transform:uppercase;font-size:12px}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.card{background:var(--panel);border:2px solid var(--border);box-shadow:4px 4px #0008;padding:10px 12px}.card h3{margin:0 0 8px;color:var(--accent);font-size:13px;text-transform:uppercase}.card h4{margin:10px 0 4px;font-size:11px;color:var(--muted);font-weight:400;text-transform:uppercase}.card p{margin:4px 0}.card .big{display:flex;align-items:baseline;gap:8px}.card .big b{font-size:26px}.card .kpis{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px}.card .kpis .big b{font-size:20px}ul.plain{list-style:none;margin:6px 0 0;padding:0;font-size:12px}.meter{position:relative;height:16px;background:#161a1f;border:2px solid var(--border);min-width:90px}.meter span{position:absolute;inset:0 auto 0 0;background:#4cd964}.meter em{position:relative;font-style:normal;font-size:11px;padding-left:6px;text-shadow:1px 1px 0 #000}.placeholder{border:2px dashed var(--border);color:var(--muted);padding:8px 10px;font-size:12px}@media(max-width:760px){.camera-grid{grid-template-columns:1fr}table.jobs{display:block;overflow-x:auto}}
