:root{--bg: #f4f2ef;--panel: #ffffff;--ink: #1f2328;--ink-2: #57606a;--line: #e2ddd6;--accent: #8b5e3c;--accent-ink: #ffffff;--top: #24201c;--top-ink: #f3ece4;--ok: #2e7d32;--warn: #ef6c00;--err: #c62828;--info: #1565c0;--hover: #f3ede6;--shadow: 0 6px 24px rgba(30, 20, 10, .16);--drawer-h: 250px;--left-w: 290px;--right-w: 300px}@media (prefers-color-scheme: dark){:root:not([data-theme=light]){--bg: #17181b;--panel: #1f2125;--ink: #e8e6e3;--ink-2: #a5a9b0;--line: #34373d;--hover: #2a2c31;--top: #121314;--top-ink: #ece6de;--accent: #c08a5d}}:root[data-theme=dark]{--bg: #17181b;--panel: #1f2125;--ink: #e8e6e3;--ink-2: #a5a9b0;--line: #34373d;--hover: #2a2c31;--top: #121314;--top-ink: #ece6de;--accent: #c08a5d}*{box-sizing:border-box}html,body{margin:0;height:100%}body{background:var(--bg);color:var(--ink);font:13px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;display:grid;grid-template-columns:var(--left-w) 1fr var(--right-w);grid-template-rows:auto 1fr var(--drawer-h);grid-template-areas:"top top top" "left view right" "left drawer right";overflow:hidden}body.drawer-collapsed{--drawer-h: 36px}button,select,input,textarea{font:inherit;color:inherit}button{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:4px 10px;cursor:pointer}button:hover{background:var(--hover)}button.active{background:var(--accent);color:var(--accent-ink);border-color:var(--accent)}button.ghost{background:transparent}button.primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent)}button.danger{color:var(--err)}select,input,textarea{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:4px 6px;min-width:0}input[type=checkbox]{accent-color:var(--accent)}#topbar{grid-area:top;background:var(--top);color:var(--top-ink);display:flex;align-items:center;gap:14px;padding:6px 12px;flex-wrap:wrap;z-index:5}#topbar button,#topbar select,#topbar input{background:#34302b;border-color:#4a443d;color:var(--top-ink)}#topbar button:hover{background:#443e37}#topbar button.active{background:var(--accent);border-color:var(--accent);color:#fff}.brand{display:flex;align-items:center;gap:8px;margin-right:6px}.brand b{display:block;font-size:14px}.brand small{color:#bfb4a8;font-size:11px}.logo{width:28px;height:28px;border-radius:7px;background:var(--accent) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M8 12h13v7a5 5 0 0 1-5 5h-3a5 5 0 0 1-5-5z' fill='%23fff'/%3E%3Cpath d='M21 14h2a3 3 0 0 1 0 6h-2' stroke='%23fff' stroke-width='2' fill='none'/%3E%3C/svg%3E") center/80% no-repeat}.tb-group{display:flex;align-items:center;gap:4px}.project input{width:200px}.project select{max-width:160px}.split{display:flex;gap:2px;align-items:center}.split select{max-width:150px}.chk{display:flex;align-items:center;gap:3px;font-size:12px;color:#d9cfc4}.snap{font-size:12px;color:#d9cfc4;display:flex;gap:4px;align-items:center}.pill{font-size:11px;padding:2px 8px;border-radius:999px;background:#4a443d;color:#e7ded3;white-space:nowrap}.pill.ok{background:#2e5d33}.pill.busy{background:#6b5a1e}.pill.err{background:#7a2323}.pill.off{background:#4a443d}.menu{position:relative}.menu .pop{display:none;position:absolute;top:calc(100% + 6px);left:0;min-width:230px;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);padding:6px;z-index:50;max-height:70vh;overflow:auto}.menu .pop.right{left:auto;right:0}.menu.open .pop{display:block}.menu .pop button,.menu .pop label.row{display:flex;width:100%;text-align:left;border:0;background:none;color:var(--ink);padding:6px 8px;border-radius:5px;gap:8px;align-items:center}.menu .pop button:hover,.menu .pop label.row:hover{background:var(--hover)}.menu .pop hr{border:0;border-top:1px solid var(--line);margin:4px 0}.menu .pop .sub{font-size:11px;color:var(--ink-2);padding:4px 8px;text-transform:uppercase;letter-spacing:.04em}.menu .pop input[type=range]{width:100%}.swatch{width:12px;height:12px;border-radius:3px;display:inline-block;flex:none;border:1px solid rgba(0,0,0,.15)}aside{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0}#left{grid-area:left}#right{grid-area:right;border-right:0;border-left:1px solid var(--line)}.panel-head{padding:10px 12px 8px;border-bottom:1px solid var(--line)}.panel-head h2{margin:0 0 6px;font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-2)}.panel-head input{width:100%}.panel-foot{padding:8px 12px;border-top:1px solid var(--line)}#catalog{overflow:auto;flex:1;padding:4px 0 10px}.cat{border-bottom:1px solid var(--line)}.cat>summary{cursor:pointer;padding:8px 12px;font-weight:600;list-style:none;display:flex;justify-content:space-between}.cat>summary::-webkit-details-marker{display:none}.cat>summary .n{color:var(--ink-2);font-weight:400}.prod{display:grid;grid-template-columns:14px 1fr auto;gap:8px;align-items:center;padding:6px 12px 6px 14px;cursor:pointer;border-left:3px solid transparent}.prod:hover{background:var(--hover)}.prod.active{border-left-color:var(--accent);background:var(--hover)}.prod .nm{font-size:12.5px}.prod .meta{font-size:11px;color:var(--ink-2)}.prod .pr{font-size:11px;color:var(--ink-2);text-align:right;white-space:nowrap}#viewport{grid-area:view;position:relative;overflow:hidden;min-height:0}#viewport canvas{display:block;outline:none}#viewport canvas[data-tool=place],#viewport canvas[data-tool=cable],#viewport canvas[data-tool=pathway],#viewport canvas[data-tool=measure],#viewport canvas[data-tool=calibrate]{cursor:crosshair}.label-layer{position:absolute;inset:0;pointer-events:none}#crosshair{display:none;position:absolute;left:50%;top:50%;width:18px;height:18px;margin:-9px;z-index:3;pointer-events:none;background:linear-gradient(#fff,#fff) center/2px 100% no-repeat,linear-gradient(#fff,#fff) center/100% 2px no-repeat;filter:drop-shadow(0 0 2px #000)}body.walking #crosshair{display:block}#walkHelp{display:none;position:absolute;left:50%;bottom:46px;transform:translate(-50%);background:#14100cbf;color:#fff;padding:8px 14px;border-radius:8px;text-align:center;font-size:12px;pointer-events:none}body.walk-mode:not(.walking) #walkHelp{display:block}#hint{position:absolute;left:10px;bottom:10px;right:260px;background:#ffffffe0;color:#222;padding:6px 10px;border-radius:6px;font-size:12px;pointer-events:none;box-shadow:0 1px 4px #0000001f}#status{position:absolute;right:10px;bottom:10px;background:#24201ce0;color:#fff;padding:6px 10px;border-radius:6px;font:12px/1.3 ui-monospace,Consolas,monospace;pointer-events:none;min-width:120px;text-align:right}#status:empty{display:none}#tooltip{position:fixed;pointer-events:none;background:#14100ceb;color:#fff;padding:4px 8px;border-radius:5px;font-size:12px;max-width:360px;z-index:40;display:none}#legend{position:absolute;top:10px;left:10px;background:#ffffffe6;color:#222;border-radius:6px;padding:6px 10px;font-size:11px;display:none;box-shadow:0 1px 4px #0000001f}#legend.show{display:block}#legend div{display:flex;gap:6px;align-items:center}.zone-label{font:600 11px system-ui;letter-spacing:.12em;color:#3c2d1e8c;text-shadow:0 1px 0 rgba(255,255,255,.7);white-space:nowrap}.grid-bubble{width:22px;height:22px;border-radius:50%;border:1.5px solid #4f6d8a;color:#2d4f70;background:#ffffffd9;font:600 11px system-ui;display:grid;place-items:center}.equip-tag{font:600 9px ui-monospace,Consolas,monospace;background:#ffffffd9;color:#444;border:1px solid #bbb;border-radius:8px;padding:0 4px;white-space:nowrap}.equip-tag.warn{color:#8a4b00;border-color:#e0a050}.device-label{font:600 10px system-ui;background:#24201cd9;color:#fff;padding:1px 5px;border-radius:4px;white-space:nowrap;transform:translateY(-6px)}.device-label[data-layer=cctv]{background:#a01e1ee0}.device-label[data-layer=pos]{background:#966e00e6}.device-label[data-layer=av]{background:#783c00e0}.device-label[data-layer=access]{background:#3c5a28e6}.cable-label{font:10px ui-monospace,Consolas,monospace;background:#ffffffe0;color:#333;padding:0 4px;border-radius:3px;white-space:nowrap}.cable-label.selected{background:#ffb300;color:#000}.measure-label{font:600 11px ui-monospace,Consolas,monospace;background:#ff3d00;color:#fff;padding:1px 6px;border-radius:4px}#props{overflow:auto;padding:10px 12px 20px;flex:1}#props .empty{color:var(--ink-2)}#props h3{margin:12px 0 6px;font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-2)}#props .kv{display:grid;grid-template-columns:92px 1fr;gap:6px 8px;align-items:center}#props .kv label{color:var(--ink-2);font-size:12px}#props .kv input,#props .kv select,#props .kv textarea{width:100%}#props .row-btns{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}#props .ports{width:100%;border-collapse:collapse;font-size:12px}#props .ports td{border-bottom:1px solid var(--line);padding:3px 4px}#props .big{font-size:15px;font-weight:600;margin-bottom:2px}#props .sub{color:var(--ink-2);font-size:12px;margin-bottom:8px}#props code{font-size:11px}.badge{display:inline-block;font-size:10.5px;padding:1px 6px;border-radius:999px;background:var(--hover);border:1px solid var(--line);margin:1px}#drawer{grid-area:drawer;background:var(--panel);border-top:1px solid var(--line);display:flex;flex-direction:column;min-height:0;min-width:0}#viewport,aside{min-width:0}#tabs{display:flex;gap:2px;padding:4px 8px;border-bottom:1px solid var(--line);align-items:center}#tabs button{border:0;background:none;padding:5px 10px;border-radius:6px}#tabs button.active{background:var(--hover);color:var(--accent);font-weight:600}#tabs .spacer{flex:1}.count{display:inline-block;min-width:18px;padding:0 5px;border-radius:999px;background:var(--err);color:#fff;font-size:11px;text-align:center}.count.zero{background:var(--ok)}#tabBody{overflow:auto;flex:1;padding:6px 10px 14px}body.drawer-collapsed #tabBody{display:none}table.grid{border-collapse:collapse;width:100%;font-size:12px}table.grid th{text-align:left;position:sticky;top:0;background:var(--panel);border-bottom:2px solid var(--line);padding:5px 6px;font-weight:600;color:var(--ink-2)}table.grid td{border-bottom:1px solid var(--line);padding:4px 6px;vertical-align:top}table.grid tr.click{cursor:pointer}table.grid tr.click:hover td{background:var(--hover)}table.grid td.num,table.grid th.num{text-align:right;font-variant-numeric:tabular-nums}table.grid tfoot td{font-weight:700;border-top:2px solid var(--line)}.tab-tools{display:flex;gap:8px;align-items:center;margin:2px 0 8px}.tab-tools .spacer{flex:1}.lvl{font-size:10.5px;font-weight:700;padding:1px 6px;border-radius:4px;color:#fff;text-transform:uppercase}.lvl.error{background:var(--err)}.lvl.warn{background:var(--warn)}.lvl.info{background:var(--info)}.portcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(460px,1fr));gap:12px}.portcard{border:1px solid var(--line);border-radius:8px;padding:8px}.portcard h4{margin:0 0 6px;font-size:13px;display:flex;justify-content:space-between}#topo svg{width:100%;min-height:200px}#topo text{font:11px system-ui;fill:var(--ink)}.help{columns:3 320px;column-gap:28px}.help h4{margin:8px 0 4px;break-after:avoid}.help p,.help li{margin:2px 0;color:var(--ink-2)}kbd{font:11px ui-monospace,Consolas,monospace;border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:0 4px;background:var(--hover)}#toasts{position:fixed;right:16px;top:64px;display:flex;flex-direction:column;gap:6px;z-index:60}.toast{background:var(--panel);border-left:4px solid var(--info);box-shadow:var(--shadow);border-radius:6px;padding:8px 12px;max-width:360px;font-size:12.5px;animation:tin .2s ease-out}.toast.warn{border-color:var(--warn)}.toast.ok{border-color:var(--ok)}.toast.err{border-color:var(--err)}@keyframes tin{0%{transform:translate(20px);opacity:0}}#modal{position:fixed;inset:0;background:#140f0a73;display:grid;place-items:center;z-index:80}#modal[hidden]{display:none}.modal-card{background:var(--panel);border-radius:10px;box-shadow:var(--shadow);width:min(560px,92vw);max-height:86vh;display:flex;flex-direction:column}.modal-body{padding:16px 18px;overflow:auto}.modal-body h3{margin:0 0 10px}.modal-body .kv{display:grid;grid-template-columns:130px 1fr;gap:8px;align-items:center}.modal-body .kv input,.modal-body .kv select,.modal-body textarea{width:100%}.modal-actions{display:flex;justify-content:flex-end;gap:8px;padding:10px 18px;border-top:1px solid var(--line)}@media (max-width: 1100px){:root{--left-w: 240px;--right-w: 260px}.brand small{display:none}}body.experience{grid-template-columns:1fr;grid-template-rows:auto 1fr;grid-template-areas:"top" "view"}body.experience .menu .pop.right{left:auto;right:0}#prompt{position:absolute;left:50%;bottom:84px;transform:translate(-50%);display:none;background:#14100cd1;color:#fff;padding:8px 16px;border-radius:999px;font-size:14px;pointer-events:none}#prompt.show{display:block}#prompt kbd,#walkHelp kbd{background:#fff;color:#222;border-color:#bbb}body.experience #walkHelp{bottom:24px}body.walk-mode #walkHelp{display:block}body.walk-mode.walking #walkHelp{opacity:.55}#orbitHelp{position:absolute;left:50%;bottom:24px;transform:translate(-50%);background:#14100cb3;color:#fff;padding:6px 14px;border-radius:8px;font-size:12px;pointer-events:none}body.walk-mode #orbitHelp,body.plan-mode #orbitHelp{display:none}#povToggle{display:none;margin-left:6px}body.walk-mode #povToggle{display:inline-block}#menuScrim{position:fixed;inset:0;background:#0f0c0959;opacity:0;pointer-events:none;transition:opacity .35s ease;z-index:70}#menuDrawer{position:fixed;top:0;right:0;height:100%;width:min(420px,92vw);z-index:71;background:#faf8f4;color:#1f1b17;box-shadow:-18px 0 40px #0000002e;transform:translate(105%);transition:transform .5s cubic-bezier(.22,1,.36,1);display:flex;flex-direction:column;font-family:Georgia,Times New Roman,serif}body.menu-open #menuDrawer{transform:translate(0)}body.menu-open #menuScrim{opacity:1;pointer-events:auto}#menuDrawer header{display:flex;justify-content:space-between;align-items:flex-start;padding:28px 28px 12px}#menuDrawer header small{font:600 11px system-ui;letter-spacing:.14em;text-transform:uppercase;color:#4f7d8c}#menuDrawer h2{margin:4px 0 0;font-size:34px;font-weight:500;letter-spacing:.02em}#menuDrawer .close{background:none;border:0;font-size:28px;line-height:1;color:#6b625a;cursor:pointer;padding:2px 6px}#menuDrawer nav{display:flex;gap:6px;padding:0 28px 14px;border-bottom:1px solid #e7e1d8}#menuDrawer nav button{font:600 13px system-ui;border:1px solid #ddd5ca;background:transparent;color:#4a423b;border-radius:999px;padding:6px 16px;cursor:pointer;transition:all .2s ease}#menuDrawer nav button.active{background:#1f6f6c;border-color:#1f6f6c;color:#fff}#menuDrawer .menu-body{flex:1;overflow:auto;padding:8px 28px 20px}#menuDrawer section{margin-top:18px}#menuDrawer h3{font:600 12px system-ui;letter-spacing:.16em;text-transform:uppercase;color:#9a7b5b;margin:0 0 6px}#menuDrawer .item{display:flex;justify-content:space-between;gap:16px;padding:12px 0;border-bottom:1px dashed #e4ddd2;opacity:0;transform:translate(16px)}body.menu-open #menuDrawer .item{animation:menuIn .45s cubic-bezier(.22,1,.36,1) forwards}#menuDrawer .item b{font-size:17px;font-weight:500}#menuDrawer .item p{margin:3px 0 0;font:13px system-ui;color:#7a7068}#menuDrawer .price{font:600 14px system-ui;color:#1f6f6c;white-space:nowrap;align-self:center}#menuDrawer footer{padding:14px 28px 22px;font:12px system-ui;color:#8a8077;border-top:1px solid #e7e1d8}@keyframes menuIn{to{opacity:1;transform:none}}#loader{position:fixed;inset:0;z-index:100;display:grid;place-items:center;background:radial-gradient(circle at 50% 40%,#2c2620,#17130f 70%);transition:opacity .8s ease,visibility .8s}body.loaded #loader{opacity:0;visibility:hidden}#viewport canvas{opacity:0;transition:opacity 1s ease .15s}body.loaded #viewport canvas{opacity:1}.ld-card{width:min(360px,82vw);text-align:center;color:#efe6da;font-family:Georgia,Times New Roman,serif}.ld-logo{width:64px;height:64px;margin:0 auto 18px;border-radius:16px;background:#8b5e3c;display:grid;place-items:center;animation:ldPulse 1.8s ease-in-out infinite}.ld-logo span{width:30px;height:22px;border:3px solid #fff;border-top:0;border-radius:0 0 10px 10px;position:relative}.ld-logo span:after{content:"";position:absolute;right:-11px;top:2px;width:8px;height:9px;border:3px solid #fff;border-left:0;border-radius:0 6px 6px 0}.ld-logo span:before{content:"";position:absolute;left:7px;top:-13px;width:3px;height:8px;border-radius:2px;background:#ffffffb3;box-shadow:8px -3px #ffffff80;animation:ldSteam 1.8s ease-in-out infinite}.ld-title{font-size:24px;letter-spacing:.03em}.ld-sub{font:13px system-ui;color:#b8aa98;margin:6px 0 22px}.ld-bar{height:4px;border-radius:4px;background:#ffffff1f;overflow:hidden}.ld-bar i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#c08a5d,#e8c9a2);transition:width .45s cubic-bezier(.22,1,.36,1);box-shadow:0 0 12px #e8c9a280}.ld-step{font:12px system-ui;color:#9c8f80;margin-top:12px;min-height:16px}@keyframes ldPulse{0%,to{transform:scale(1)}50%{transform:scale(1.06)}}@keyframes ldSteam{0%,to{opacity:.2;transform:translateY(2px)}50%{opacity:1;transform:translateY(-3px)}}#login{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:16px;background:#17130f8c;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;transition:opacity .5s ease}#login.show{opacity:1}#login.out{opacity:0;pointer-events:none}body.locked #topbar,body.locked #viewport{pointer-events:none}.lg-card{width:min(360px,100%);text-align:center;color:#efe6da;font-family:Georgia,Times New Roman,serif;padding:32px 28px 28px;border-radius:18px;background:#1c1713e0;border:1px solid rgba(232,201,162,.16);box-shadow:0 20px 60px #00000073;transform:translateY(10px);transition:transform .5s cubic-bezier(.22,1,.36,1)}#login.show .lg-card{transform:none}.lg-card input{display:block;width:100%;box-sizing:border-box;margin:0 0 10px;padding:11px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#ffffff0f;color:#efe6da;font:14px system-ui;outline:none}.lg-card input::placeholder{color:#9c8f80}.lg-card input:focus{border-color:#c08a5d;box-shadow:0 0 0 3px #c08a5d40}.lg-card button{width:100%;margin-top:4px;padding:11px;border:0;border-radius:10px;cursor:pointer;background:linear-gradient(90deg,#8b5e3c,#c08a5d);color:#fff;font:600 14px system-ui}.lg-card button:disabled{opacity:.6;cursor:wait}.lg-error{min-height:18px;margin:2px 0 8px;font:12px system-ui;color:#f2a08f}.menu[hidden]{display:none}
