:root{--ink: #0b1220;--panel: #111a2c;--panel-2: #0e1626;--line: #24334d;--text: #d7e2f0;--muted: #7c8da6;--cyan: #38bdf8;--green: #34d399;--amber: #fbbf24;--violet: #a78bfa;--red: #f87171;--mono: "Cascadia Code", "JetBrains Mono", Consolas, "Courier New", monospace;--sans: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--ink);color:var(--text);font-family:var(--sans);font-size:14px}button{font-family:inherit}input,select{font-family:var(--mono);background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:4px;padding:7px 9px;font-size:13px}input:focus,button:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}input[readonly]{color:var(--muted);background:transparent}.app-shell{height:100%;display:flex;flex-direction:column}.app-main{flex:1;min-height:0}.app-footer{flex-shrink:0;text-align:center;padding:7px 12px;font-size:12px;color:var(--muted);background:var(--panel);border-top:1px solid var(--line)}.app-footer a{color:var(--cyan);text-decoration:none}.app-footer a:hover{text-decoration:underline}.impersonation-banner{flex-shrink:0;display:flex;align-items:center;justify-content:center;gap:14px;padding:8px 14px;background:#3b2f0e;color:var(--amber);border-bottom:1px solid var(--amber);font-size:13px}.impersonation-banner .btn{border-color:var(--amber);color:var(--amber);padding:4px 10px;font-size:12px}.center-screen{height:100%;display:flex;align-items:center;justify-content:center;background:radial-gradient(ellipse 60% 50% at 50% -10%,#16233d 0%,transparent 60%),var(--ink)}.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:28px;width:360px;max-width:calc(100vw - 32px)}.card h1{margin:0 0 4px;font-size:20px;letter-spacing:.02em}.card .tagline{color:var(--muted);font-size:12.5px;margin:0 0 20px}.brand-mark{font-family:var(--mono);color:var(--cyan)}.field{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}.field label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.btn{border:1px solid var(--line);background:var(--panel-2);color:var(--text);border-radius:5px;padding:8px 14px;cursor:pointer;font-size:13px}.btn:hover{border-color:var(--cyan)}.btn.primary{background:var(--cyan);border-color:var(--cyan);color:#04121f;font-weight:600}.btn.primary:hover{filter:brightness(1.1)}.btn.danger:hover{border-color:var(--red);color:var(--red)}.btn.block{width:100%}.form-error{color:var(--red);font-size:12.5px;margin:4px 0 10px}.link-button{background:none;border:none;color:var(--cyan);cursor:pointer;font-size:12.5px;padding:0}.google-slot{display:flex;justify-content:center;margin-bottom:4px;min-height:0}.google-slot.hidden{display:none}.auth-divider{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:11.5px;margin:14px 0}.auth-divider:before,.auth-divider:after{content:"";flex:1;border-top:1px dashed var(--line)}.demo-hint{margin-top:16px;padding-top:12px;border-top:1px dashed var(--line);color:var(--muted);font-size:12px}.demo-hint code{font-family:var(--mono);color:var(--text)}.topo-list{display:flex;flex-direction:column;gap:8px;margin:16px 0;max-height:40vh;overflow-y:auto}.topo-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;background:var(--panel-2);border:1px solid var(--line);border-radius:6px;cursor:pointer}.topo-item:hover{border-color:var(--cyan)}.topo-item .name{font-weight:600}.topo-item .meta{color:var(--muted);font-size:11.5px;font-family:var(--mono)}.topo-item .icon-btn{visibility:hidden}.topo-item:hover .icon-btn{visibility:visible}.icon-btn{background:none;border:none;color:var(--muted);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:4px}.icon-btn:hover{color:var(--red)}.empty-note{color:var(--muted);font-size:13px;text-align:center;padding:18px 0}.row{display:flex;gap:8px}.row>input{flex:1}.workspace{height:100%;display:grid;grid-template-rows:46px 1fr 128px;grid-template-columns:168px 1fr;grid-template-areas:"topbar topbar" "palette canvas" "log log"}.topbar{grid-area:topbar;display:flex;align-items:center;gap:14px;padding:0 14px;background:var(--panel);border-bottom:1px solid var(--line)}.topbar .brand{font-family:var(--mono);font-weight:700;color:var(--cyan);letter-spacing:.04em}.topbar .topo-name{color:var(--muted);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}.topbar .spacer{flex:1}.topbar .user{color:var(--muted);font-size:12.5px;font-family:var(--mono)}.toolbelt{display:flex;gap:4px;background:var(--panel-2);border:1px solid var(--line);border-radius:6px;padding:3px}.tool-btn{border:none;background:transparent;color:var(--muted);padding:5px 12px;border-radius:4px;cursor:pointer;font-size:12.5px;display:flex;gap:6px;align-items:center}.tool-btn:hover{color:var(--text)}.tool-btn.active{background:var(--cyan);color:#04121f;font-weight:600}.tool-btn .kbd{font-family:var(--mono);font-size:10px;opacity:.65}.busy-dot{width:8px;height:8px;border-radius:50%;background:var(--amber);animation:pulse .9s ease-in-out infinite}@keyframes pulse{50%{opacity:.25}}.palette{grid-area:palette;background:var(--panel);border-right:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:10px;overflow-y:auto}.palette h2{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin:0}.palette-item{display:flex;align-items:center;gap:10px;background:var(--panel-2);border:1px solid var(--line);border-radius:8px;padding:9px 10px;cursor:grab;-webkit-user-select:none;user-select:none}.palette-item:active{cursor:grabbing}.palette-item:hover{border-color:var(--accent, var(--cyan))}.palette-item img{width:34px;height:34px;pointer-events:none}.palette-item .info .name{font-size:13px;font-weight:600}.palette-item .info .ports{font-size:10.5px;color:var(--muted);font-family:var(--mono)}.palette .hint{margin-top:auto;color:var(--muted);font-size:11.5px;line-height:1.55;border-top:1px dashed var(--line);padding-top:10px}.palette .hint b{color:var(--text);font-weight:600}.canvas-wrap{grid-area:canvas;position:relative;overflow:hidden;background-image:radial-gradient(circle,#223148 1.1px,transparent 1.1px);background-size:26px 26px;background-position:13px 13px}.canvas-wrap.tool-cable{cursor:crosshair}.canvas-wrap.tool-ping{cursor:cell}.canvas-wrap.tool-delete{cursor:not-allowed}.topology-svg{width:100%;height:100%;display:block}.cable{stroke:#5a6c87;stroke-width:2.2;fill:none}.cable.selected{stroke:var(--cyan);filter:drop-shadow(0 0 4px rgba(56,189,248,.7))}.cable-hit{stroke:transparent;stroke-width:14;fill:none;cursor:pointer}.cable-pending{stroke:var(--cyan);stroke-width:2;stroke-dasharray:6 5;fill:none;pointer-events:none;animation:march .6s linear infinite}@keyframes march{to{stroke-dashoffset:-11}}.port-label{font-family:var(--mono);font-size:9px;fill:var(--muted);pointer-events:none}.port-led{pointer-events:none}.node-group{cursor:pointer}.node-group .node-label{font-family:var(--mono);font-size:11.5px;fill:var(--text);text-anchor:middle;pointer-events:none}.node-group .node-sublabel{font-family:var(--mono);font-size:9.5px;fill:var(--muted);text-anchor:middle;pointer-events:none}.node-group .selection-ring{fill:none;stroke:var(--cyan);stroke-width:1.5;stroke-dasharray:5 4;animation:march .8s linear infinite}.frame-chip{position:absolute;top:12px;right:12px;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:5px 14px;font-family:var(--mono);font-size:11.5px;pointer-events:none;display:flex;align-items:center;gap:8px}.frame-chip .swatch{width:9px;height:9px;border-radius:50%}.canvas-empty{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;pointer-events:none;color:var(--muted);font-size:13.5px;text-align:center;line-height:1.7}.event-log{grid-area:log;background:var(--panel-2);border-top:1px solid var(--line);font-family:var(--mono);font-size:12px;padding:8px 12px;overflow-y:auto}.event-log .entry{padding:1.5px 0;color:var(--muted);white-space:pre-wrap}.event-log .entry.ok{color:var(--green)}.event-log .entry.error{color:var(--red)}.event-log .entry .ts{opacity:.55;margin-right:8px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#040912a8;display:flex;align-items:center;justify-content:center;z-index:40}.modal{background:var(--panel);border:1px solid var(--line);border-radius:10px;width:430px;max-width:calc(100vw - 30px);max-height:calc(100vh - 60px);display:flex;flex-direction:column;box-shadow:0 18px 50px #00000080}.modal.wide{width:640px}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--line)}.modal-head h3{margin:0;font-size:14px;display:flex;align-items:center;gap:8px}.modal-head .device-dot{width:9px;height:9px;border-radius:50%}.modal-body{padding:16px;overflow-y:auto}.modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--line)}.port-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:6px}.port-cell{display:flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--panel-2);border-radius:5px;padding:7px 9px;cursor:pointer;font-family:var(--mono);font-size:11.5px;color:var(--text);text-align:left}.port-cell:hover:not(:disabled){border-color:var(--cyan)}.port-cell:disabled{opacity:.32;cursor:not-allowed}.port-cell .led{width:7px;height:7px;border-radius:50%;flex-shrink:0}.led.up{background:var(--green);box-shadow:0 0 5px var(--green)}.led.down{background:var(--red)}.port-cell .ip{margin-left:auto;color:var(--muted);font-size:10px}.mode-toggle{display:flex;gap:6px;margin-bottom:16px}.mode-toggle button{flex:1;padding:8px;border:1px solid var(--line);background:var(--panel-2);color:var(--muted);border-radius:5px;cursor:pointer;font-size:13px}.mode-toggle button.active{border-color:var(--cyan);color:var(--text);background:#38bdf817}.mac-line{font-family:var(--mono);font-size:11.5px;color:var(--muted);margin-bottom:14px}.terminal{background:#05090f;border-radius:6px;border:1px solid var(--line);padding:10px 12px;height:380px;overflow-y:auto;font-family:var(--mono);font-size:12.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.terminal .cmdline{color:#e6edf7}.terminal .cmdline .prompt{color:var(--green)}.terminal .output{color:#9fb0c7}.terminal .output.err{color:var(--red)}.terminal-input-row{display:flex;align-items:center;gap:8px;margin-top:10px;font-family:var(--mono);font-size:12.5px}.terminal-input-row .prompt{color:var(--green);white-space:nowrap}.terminal-input-row input{flex:1;background:#05090f;border:1px solid var(--line)}.quick-ips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.quick-ip{font-family:var(--mono);font-size:11px;border:1px solid var(--line);background:var(--panel-2);color:var(--muted);border-radius:999px;padding:3px 10px;cursor:pointer}.quick-ip:hover{color:var(--text);border-color:var(--cyan)}.quick-ip .who{opacity:.7;margin-right:5px}.admin-shell{height:100%;display:flex;flex-direction:column}.admin-shell .topbar{flex-shrink:0;height:46px}.admin-tabs{display:flex;gap:4px;background:var(--panel-2);border:1px solid var(--line);border-radius:6px;padding:3px}.admin-main{flex:1;min-height:0;overflow-y:auto;padding:18px;max-width:1100px;width:100%;margin:0 auto}.admin-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:14px}.admin-toolbar input{width:260px}.admin-toolbar .spacer{flex:1}.muted{color:var(--muted);font-size:12.5px}.mono{font-family:var(--mono)}.admin-table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:8px;background:var(--panel)}.admin-table{width:100%;border-collapse:collapse;font-size:13px}.admin-table th,.admin-table td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--line);white-space:nowrap}.admin-table tbody tr:last-child td{border-bottom:none}.admin-table th{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:var(--panel-2);-webkit-user-select:none;user-select:none}.admin-table th.sortable{cursor:pointer}.admin-table th.sortable:hover{color:var(--text)}.admin-table td.actions{display:flex;gap:6px}.btn.small{padding:4px 10px;font-size:12px}.badge{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-family:var(--mono);border:1px solid var(--line);color:var(--muted)}.badge.role-admin{color:var(--violet);border-color:var(--violet)}.badge.role-user{color:var(--cyan);border-color:var(--line)}.badge.status-success{color:var(--green);border-color:var(--green)}.badge.status-failure{color:var(--red);border-color:var(--red)}.admin-footnote{margin-top:10px;line-height:1.5}.email-editor{display:grid;grid-template-columns:1fr 1fr;gap:20px;align-items:start}.email-editor-pane h2{font-size:15px;margin:0 0 6px}.email-body-input{font-family:var(--mono);background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:4px;padding:9px;font-size:12px;line-height:1.5;min-height:320px;resize:vertical}.email-preview{width:100%;height:380px;border:1px solid var(--line);border-radius:8px;background:#fff}.email-saved-note{align-self:center}@media(max-width:900px){.email-editor{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){.cable-pending,.selection-ring,.busy-dot{animation:none}}
