:root{font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serif;color-scheme:dark;--bg:#101218;--panel:#1a1e28;--card:#1e222e;--border:#303747;--text:#ecf0f7;--muted:#97a2b5;--subtle:#78849b;--accent:#6386fb;--green:#32c993;--red:#f26775;--blue:#7193ff;--gray:#7e899a}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);margin:0}button,input,select{font:inherit;color:inherit}button{cursor:pointer;background:#252b39;border:1px solid var(--border);padding:9px 13px;border-radius:8px;font-size:12px;white-space:nowrap}button:hover{background:#30394c}button:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button.primary{background:var(--accent);border-color:var(--accent);color:white;font-weight:650}button.primary:hover{background:#7697ff}button.danger-btn{color:#ff8a95;border-color:#7d414c}button.wide{width:100%}.error{color:var(--red);font-size:12px;margin:10px 0}.muted{color:var(--muted)}.eyebrow{font-size:10px;letter-spacing:.12em;color:#a3b9ff;font-weight:700}.auth{min-height:100vh;display:flex;align-items:center;justify-content:center}.auth-panel{width:min(420px,90vw);border:1px solid var(--border);border-radius:18px;background:var(--panel);padding:32px}.auth-panel h1{margin:15px 0 5px;font-size:26px}.auth-panel p{color:var(--muted);margin-bottom:24px}.auth-panel label{display:block;font-size:12px;margin:12px 0}.auth-panel input{display:block;width:100%;margin-top:8px}.brand-mark{display:grid;place-items:center;background:#2c3f6d;color:#bbcbff;width:40px;height:40px;border-radius:11px;font-size:26px}input,select{background:#222836;border:1px solid var(--border);border-radius:8px;padding:10px;max-width:100%;font-size:13px}#shell{display:flex;min-height:100vh}.sidebar{width:224px;flex:none;background:#171b25;border-right:1px solid var(--border);display:flex;flex-direction:column;position:sticky;top:0;height:100vh}.brand{display:flex;align-items:center;gap:11px;padding:23px 17px;font-size:19px;font-weight:800;border-bottom:1px solid var(--border)}.brand .brand-mark{width:31px;height:31px;font-size:20px}.nav-label{color:var(--subtle);font-size:10px;letter-spacing:.15em;padding:25px 22px 9px}.sidebar nav{padding:0 9px;display:flex;flex-direction:column;gap:4px}.sidebar nav button{display:flex;align-items:center;gap:12px;text-align:left;padding:12px;border:0;background:transparent;color:#adb7cc;font-weight:570;font-size:13px}.sidebar nav button.active{background:#293a61;color:#b4c8ff}.sidebar nav button:hover{background:#292f3e}.sidebar nav button span{flex:1}.sidebar-bottom{margin-top:auto;border-top:1px solid var(--border);padding:16px;display:flex;gap:9px;align-items:center;color:var(--muted);font-size:11px}.sidebar-bottom button{margin-left:auto}.status-signal{color:var(--muted)}.status-signal.ok{color:var(--green)}.main{flex:1;min-width:0;padding:27px clamp(16px,2vw,34px) 65px}.toolbar{display:flex;justify-content:space-between;gap:14px;align-items:center;margin-bottom:22px}.toolbar h1{font-size:24px;margin:4px 0 0;letter-spacing:-.035em}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.focusbar{border:1px solid var(--border);border-radius:12px;background:var(--panel);display:flex;gap:20px;align-items:center;padding:14px 17px;min-height:98px;margin-bottom:18px}.focus-title{flex:0 0 180px;min-width:0}.focus-title strong{display:block;font-size:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:5px 0}.focus-title small{color:var(--muted);font-size:11px}.focus-scroller{display:flex;gap:8px;overflow-x:auto;align-items:stretch;padding-bottom:2px;flex:1;min-width:0}.connection-chip{border:1px solid var(--border);padding:12px 13px;border-radius:9px;min-width:155px;max-width:240px;cursor:pointer;text-align:left;background:#242a38;display:flex;gap:9px;align-items:flex-start}.connection-chip:hover{background:#2b3447}.connection-chip strong{display:block;max-width:190px;overflow:hidden;text-overflow:ellipsis}.connection-chip small{display:block;color:var(--muted);margin-top:5px}.pill{font-size:11px;padding:4px 8px;border:1px solid var(--border);border-radius:15px;display:inline-block}.dot{height:8px;width:8px;border-radius:50%;background:var(--gray);display:inline-block;flex-shrink:0;margin-top:4px}.dot.online{background:var(--green)}.dot.pending{background:var(--blue)}.dot.unreachable,.dot.stale,.dot.no_handshake{background:var(--red)}.dot.unverified,.dot.not_configured,.dot.disabled,.dot.interface_down{background:var(--gray)}.page{display:none}.page.active{display:block}.map-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(285px,330px);gap:15px}.map-card,.inspector,.surface{border:1px solid var(--border);background:var(--panel);border-radius:12px;min-width:0}.card-head,.section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:15px 17px;border-bottom:1px solid var(--border)}h2{font-size:15px;margin:0 0 6px}h3{font-size:14px;margin:3px 0 13px}p{margin:0;color:var(--muted);font-size:12px;line-height:1.5}.map-tools{display:flex;align-items:center;gap:6px}.search{display:flex;align-items:center;border:1px solid var(--border);border-radius:8px;padding:0 9px;background:#242a35}.search input{width:125px;border:0;background:transparent;padding:9px 4px}.map-stage{height:580px;position:relative;overflow:auto;background-color:#141921;background-image:radial-gradient(#273245 1.1px,transparent 1.1px);background-size:23px 23px;touch-action:none}.node-layer,.map-lines{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.map-lines{overflow:visible}.edge-hit{pointer-events:stroke;cursor:pointer;stroke:transparent;stroke-width:20;fill:none}.edge-visible{pointer-events:none;stroke-width:3;fill:none}.edge-visible.online{stroke:var(--green)}.edge-visible.pending{stroke:url(#blueStripes);stroke-width:4}.edge-visible.disabled,.edge-visible.unverified,.edge-visible.not_configured,.edge-visible.interface_down{stroke:var(--gray);stroke-dasharray:4 7;opacity:.7}.edge-visible.unreachable,.edge-visible.stale,.edge-visible.no_handshake{stroke:var(--red)}.node{pointer-events:auto;position:absolute;width:170px;height:105px;border:1px solid #394153;border-radius:12px;background:#1e2430;box-shadow:0 10px 24px #0002;user-select:none;transform:translate(-50%,-50%);cursor:grab}.node.selected{border-color:var(--accent);box-shadow:0 0 0 3px #5b79e133}.node:hover{border-color:#7795ca}.node-body{padding:12px 12px 7px;overflow:hidden}.node-name{font-size:12px;font-weight:700;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.node-meta{font-size:11px;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin-top:5px}.node-status{font-size:11px;margin-top:13px;display:flex;gap:7px;align-items:center}.node-status .dot{margin:0}.port{position:absolute;z-index:10;width:18px;height:18px;border-radius:50%;background:#171e2d;border:2px solid #7393fc;pointer-events:auto;cursor:crosshair;display:grid;place-items:center;color:#a9baff;font-weight:700;font-size:9px;touch-action:none}.port:hover{background:#7393fc;color:#fff;transform:scale(1.18)}.port.in{left:calc(50% - 9px);top:-10px}.port.out{left:calc(50% - 9px);bottom:-10px}.legend{padding:13px 17px;display:flex;gap:18px;align-items:center;flex-wrap:wrap;border-top:1px solid var(--border);font-size:11px;color:var(--muted)}.legend span{display:flex;align-items:center;gap:8px}.legend .legend-help{margin-left:auto}.line{width:26px;border-top:3px solid var(--green)}.line.blue{border-top:4px dashed var(--blue)}.line.gray{border-top:3px dashed var(--gray)}.line.red{border-color:var(--red)}.inspector{align-self:stretch;min-height:500px}.inspect-head{padding:19px;border-bottom:1px solid var(--border)}.inspect-head h2{font-size:17px;overflow-wrap:anywhere}.inspect-body{padding:17px}.kv{display:flex;gap:12px;justify-content:space-between;padding:11px 0;border-bottom:1px solid #303542;font-size:12px;align-items:baseline}.kv span{color:var(--muted)}.kv strong{font-weight:600;text-align:right;overflow-wrap:anywhere}.inspect-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:19px}.inspect-actions button{white-space:normal}.inspect-list{display:flex;flex-direction:column;gap:8px;margin-top:16px}.inspect-list button{text-align:left;padding:11px;white-space:normal}.inspect-list .dot{margin-right:8px}.surface{margin-bottom:16px}.surface>.field,.surface>.output,.surface>.diag-grid,.surface>.service-grid,.surface>.actions{margin:20px}.surface>h2{padding:18px}.table-scroll{overflow:auto}table{width:100%;border-collapse:collapse;font-size:12px;min-width:760px}td,th{text-align:left;padding:15px;border-bottom:1px solid var(--border)}th{font-size:10px;letter-spacing:.07em;color:var(--muted)}td{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field{display:flex;flex-direction:column;gap:7px;font-size:12px;color:var(--muted);min-width:0}.field input,.field select{width:100%;color:var(--text)}.field.compact{max-width:350px;margin:20px}.output{white-space:pre-wrap;overflow:auto;max-height:450px;background:#11151c;border:1px solid #30394a;border-radius:9px;color:#c7d7f1;font-size:12px;padding:16px;min-height:115px}.in-surface{margin:20px}.service-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.service-box{border:1px solid var(--border);border-radius:9px;padding:18px;background:var(--card)}.diag-grid{display:grid;grid-template-columns:repeat(3,minmax(140px,1fr)) auto;align-items:end;gap:12px}.section-header h2{font-size:18px}.spaced{margin-top:16px}#draftRows,#activityRows{padding:15px}.draft-item{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:12px;border-bottom:1px solid var(--border);font-size:12px}.center-message{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--muted)}.modal-backdrop{position:fixed;inset:0;background:#000b;z-index:80;display:grid;place-items:center;padding:18px}.modal-backdrop[hidden],#shell[hidden],#auth[hidden],.center-message[hidden],#toast[hidden]{display:none!important}.modal{width:min(650px,100%);max-height:90vh;display:flex;flex-direction:column;border:1px solid #3b4557;border-radius:15px;background:#1d222d;box-shadow:0 25px 80px #000a;overflow:hidden}.modal header{display:flex;align-items:start;justify-content:space-between;gap:15px;padding:22px 24px;border-bottom:1px solid var(--border)}.modal header h2{font-size:19px}.modal-body{padding:22px 24px;overflow-y:auto}.modal footer{border-top:1px solid var(--border);padding:14px 22px;display:flex;justify-content:flex-end;gap:8px}.modal .close{background:transparent;border:0}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.form-grid .field{font-size:12px}.wide-field{grid-column:1/-1}.helper{font-size:11px;color:var(--muted);padding:12px;background:#252c3b;border-radius:8px;margin:14px 0}.warning{color:#ffbd7a}.toast{position:fixed;z-index:120;top:25px;right:25px;max-width:370px;background:#243149;border:1px solid var(--accent);border-radius:9px;padding:14px;font-size:12px;box-shadow:0 15px 40px #0006}@media(max-width:1300px){.map-layout{grid-template-columns:minmax(0,1fr) 280px}.map-tools .search{display:none}}@media(max-width:1050px){.sidebar{width:74px}.sidebar .brand span:not(.brand-mark),.sidebar .nav-label,.sidebar nav span,.sidebar-bottom span:not(.status-signal){display:none}.sidebar nav button{justify-content:center;font-size:19px}.toolbar{align-items:flex-start}.map-layout{grid-template-columns:1fr}.inspector{min-height:0}}@media(max-width:700px){.main{padding:15px}.toolbar{flex-direction:column}.focusbar{flex-direction:column;align-items:stretch}.focus-title{flex:auto}.diag-grid,.service-grid,.form-grid{grid-template-columns:1fr}.wide-field{grid-column:1}.map-stage{height:480px}.actions{gap:6px}.toolbar .actions button{padding:8px}.sidebar{width:60px}}

/* Ports face the adjacent routing tier. Each server retains both directions. */
.node.router .port.out{top:-10px;bottom:auto}
.node.router .port.in{bottom:-10px;top:auto}
.node.server .port.in{bottom:-10px;top:auto}
.node.server .port.out{top:-10px;bottom:auto}

/* v0.6.1 interaction and typography audit */
:root { --purple: #a68bff; }
.map-tools { flex-wrap:wrap; justify-content:flex-end; gap:10px; min-width:0; }
.map-scale-control { display:flex; align-items:center; gap:9px; color:var(--muted); font-size:12px; white-space:nowrap; }
.map-scale-control input { width:112px; padding:0; accent-color:var(--accent); }
.map-scale-control output { min-width:34px; text-align:right; font-variant-numeric:tabular-nums; }
.node { transform:translate(-50%,-50%) scale(var(--map-scale, 1)); }
.port { font-size:0; }
.port-label { position:absolute; left:50%; transform:translateX(-50%); color:#b2c5e8; font-size:10px; line-height:12px; white-space:nowrap; pointer-events:none; text-shadow:0 1px 4px #151921; }
.port.in .port-label { top:calc(100% + 7px); }
.port.out .port-label { bottom:calc(100% + 7px); }
.port:hover .port-label { color:#ffffff; }
.edge-visible.interserver { stroke:var(--purple); }
.edge-visible.dimmed { opacity:.14; stroke-width:2; }
.edge-visible.pending { stroke:var(--blue); stroke-dasharray:8 5; }
.edge-visible.pending.dimmed { opacity:.3; }
.line.purple { border-color:var(--purple); }
.nav-icon { width:22px; height:22px; flex:0 0 22px !important; display:grid; place-items:center; }
.sidebar nav button { min-height:44px; min-width:0; line-height:1.25; gap:12px; }
.sidebar nav button>span:not(.nav-icon) { min-width:0; overflow:hidden; text-overflow:ellipsis; }
.focus-scroller { min-height:65px; }
.connection-chip { min-height:60px; min-width:158px; max-width:225px; flex:0 0 auto; }
.connection-chip>span { min-width:0; max-width:100%; }
.connection-chip strong,.connection-chip small { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.toolbar,.section-header,.card-head { flex-wrap:wrap; }
.toolbar .actions { justify-content:flex-end; }
.inspect-body .kv { align-items:flex-start; }
.inspect-body .kv>span { flex:1 1 42%; min-width:0; overflow-wrap:anywhere; }
.inspect-body .kv>strong { flex:1 1 55%; min-width:0; overflow-wrap:anywhere; }
.modal-actions { flex-wrap:wrap; }
.node-status { white-space:nowrap; overflow:hidden; }
@media (max-width: 1250px) { .map-tools .map-scale-control input {width:70px} }
@media (max-width: 760px) { .map-scale-control {width:100%; justify-content:flex-end} .map-stage { height:560px } }

/* Slightly larger default text, responsive controls */
.node-name{font-size:13px}.node-meta,.node-status{font-size:12px}.inspect-body,.connection-chip{font-size:13px}.nav-icon svg{width:21px;height:21px}.map-stage{min-height:580px}
/* Interactive onboarding; all content wraps and remains scrollable on mobile. */
.onboard-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:12px 0 18px}
.onboard-choice{display:flex;flex-direction:column;align-items:flex-start;text-align:left;gap:8px;white-space:normal;padding:17px;min-height:86px}
.onboard-choice b{font-size:14px;color:var(--text)}
.onboard-choice small{font-size:11px;color:var(--muted);line-height:1.45;overflow-wrap:anywhere}
.modal details{border:1px solid var(--border);border-radius:9px;padding:12px;min-width:0}
.modal details summary{cursor:pointer;font-size:12px;color:var(--text)}
.modal .output{min-height:75px;max-height:370px;overflow:auto;overflow-wrap:anywhere;user-select:text}
@media(max-width:700px){.onboard-choices{grid-template-columns:1fr}.modal header{padding:15px}.modal-body{padding:16px}.modal footer{padding:10px;flex-wrap:wrap}}

/* v0.8.2: the viewport scrolls the scene, never compresses nodes into each other. */
.map-viewport{width:100%;overflow:auto;max-height:670px;background:#141921;border-bottom:1px solid var(--border)}
.map-stage{width:var(--canvas-width,1760px);height:630px;min-height:630px;overflow:hidden;touch-action:none}
.map-lines{z-index:1;overflow:hidden;isolation:isolate}
.node-layer{z-index:2}
.node{z-index:1;isolation:isolate;box-shadow:0 12px 28px #0008}
.node.selected{z-index:3}
.edge-visible{stroke-linecap:round;stroke-linejoin:round}
.edge-hit{stroke-linejoin:round}
#applyPendingBtn{box-shadow:0 0 0 1px #7995ee22}
#pendingCount{font-variant-numeric:tabular-nums}
@media (max-width:1100px){.map-stage{height:620px;min-height:620px}.map-viewport{max-height:660px}}


/* v0.8.3 theme refinement */
:root{--bg:#0a1020;--bg-2:#0f1730;--panel:rgba(16,24,40,.72);--panel-strong:rgba(20,28,47,.86);--card:rgba(25,35,58,.58);--card-2:rgba(27,38,64,.66);--border:rgba(129,158,255,.16);--border-strong:rgba(129,158,255,.34);--text:#eef4ff;--muted:#a6b6d0;--subtle:#8192b4;--accent:#7a98ff;--accent-soft:rgba(122,152,255,.16);--green:#37d3a0;--red:#fb6f82;--blue:#8aa8ff;--gray:#72809a;}
html,body{min-height:100%;}
body{background:radial-gradient(circle at top left,rgba(65,93,191,.18),transparent 28%),radial-gradient(circle at top right,rgba(55,211,160,.08),transparent 24%),linear-gradient(180deg,#08101d 0%,#0a1223 48%,#09101d 100%);color:var(--text);}
body::before{content:'';position:fixed;inset:0;pointer-events:none;background-image:radial-gradient(rgba(122,152,255,.18) 1px,transparent 1.25px);background-size:40px 40px;opacity:.33;}
.sidebar{background:linear-gradient(180deg,rgba(12,18,32,.86),rgba(11,17,30,.92));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-right:1px solid rgba(122,152,255,.14);box-shadow:inset -1px 0 0 rgba(255,255,255,.03);}
.toolbar,.focusbar,.surface,.map-card,.inspector,.modal,.auth-panel{background:var(--panel);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid var(--border);box-shadow:0 12px 40px rgba(0,0,0,.22), inset 0 1px 0 rgba(255,255,255,.04);}
.toolbar,.focusbar,.surface,.map-card,.inspector{border-radius:20px;}
.main{background:transparent;}
button{background:rgba(37,50,79,.66);border:1px solid rgba(138,168,255,.18);border-radius:12px;transition:background .18s ease,border-color .18s ease,transform .18s ease,box-shadow .18s ease;box-shadow:inset 0 1px 0 rgba(255,255,255,.03);}
button:hover{background:rgba(48,65,100,.88);border-color:rgba(138,168,255,.32);transform:translateY(-1px);}
button.primary{background:linear-gradient(180deg,#7396ff,#5f83f8);border-color:#88a6ff;box-shadow:0 8px 20px rgba(95,131,248,.34),inset 0 1px 0 rgba(255,255,255,.16);} 
button.primary:hover{background:linear-gradient(180deg,#81a3ff,#6a8efb);}
input,select{background:rgba(17,24,40,.7);border:1px solid rgba(138,168,255,.18);border-radius:12px;}
#page-topology .map-layout{gap:18px;}
.map-viewport{background:linear-gradient(180deg,rgba(9,15,29,.78),rgba(7,14,26,.86));border:1px solid rgba(122,152,255,.12);border-radius:18px;overflow:auto;}
.map-stage{min-height:980px;position:relative;}
.map-lines{position:absolute;inset:0;overflow:visible;}
.edge-halo{fill:none;stroke-width:14;opacity:.10;stroke-linecap:round;stroke-linejoin:round;filter:blur(5px);} 
.edge-visible{fill:none;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;opacity:.96;} 
.edge-visible.online{stroke:#49ddb0}.edge-halo.online{stroke:#49ddb0}
.edge-visible.pending{stroke:#8aa8ff;stroke-dasharray:8 8}.edge-halo.pending{stroke:#8aa8ff}
.edge-visible.disabled,.edge-visible.unverified,.edge-visible.not_configured{stroke:#79879f}.edge-halo.disabled,.edge-halo.unverified,.edge-halo.not_configured{stroke:#79879f}
.edge-visible.unreachable,.edge-visible.interface_down,.edge-visible.no_handshake,.edge-visible.stale{stroke:#f97887}.edge-halo.unreachable,.edge-halo.interface_down,.edge-halo.no_handshake,.edge-halo.stale{stroke:#f97887}
.edge-visible.interserver.online{stroke:#b393ff}.edge-halo.interserver.online{stroke:#b393ff}
.edge-visible.dimmed,.edge-halo.dimmed{opacity:.2}
.edge-hit{fill:none;stroke:transparent;stroke-width:18;cursor:pointer}
.node{position:absolute;width:252px;transform:translate(-50%,-50%) scale(var(--map-scale, 1));transform-origin:center center;}
.node .node-body{position:relative;overflow:hidden;background:linear-gradient(180deg,rgba(21,29,47,.48),rgba(17,25,42,.62));backdrop-filter:blur(14px) saturate(135%);-webkit-backdrop-filter:blur(14px) saturate(135%);border:1px solid rgba(126,154,255,.28);border-radius:22px;padding:18px 18px 16px;box-shadow:0 20px 40px rgba(0,0,0,.18),inset 0 1px 0 rgba(255,255,255,.06);}
.node .node-body::before{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(255,255,255,.06),rgba(255,255,255,0) 24%,rgba(122,152,255,.02));pointer-events:none;}
.node.selected .node-body{border-color:rgba(130,160,255,.7);box-shadow:0 0 0 1px rgba(130,160,255,.18),0 22px 48px rgba(51,85,201,.18),inset 0 1px 0 rgba(255,255,255,.08);} 
.node-name{font-size:18px;font-weight:700;line-height:1.15;letter-spacing:-.015em;margin-bottom:8px;text-wrap:balance;}
.node-meta{color:#bfd0f6;font-size:14px;opacity:.9;margin-bottom:18px}
.node-status{display:flex;align-items:center;gap:10px;color:#dce7ff;font-size:15px;font-weight:520}
.port{width:32px;height:32px;border-radius:999px;background:rgba(20,29,48,.8);border:3px solid #7598ff;box-shadow:0 0 0 5px rgba(117,152,255,.1), 0 10px 24px rgba(0,0,0,.25);}
.port .port-label{font-size:12px;font-weight:800;letter-spacing:.08em;color:#dce7ff;text-shadow:0 1px 0 rgba(0,0,0,.35)}
.port.in{bottom:-16px}.port.out{top:-16px}
.legend,.focus-scroller,.inspect-list,.table-scroll table tbody tr td,.draft-item,.connection-chip,.service-box,.activity .surface{font-size:14px}
.legend{background:rgba(12,18,31,.54);border:1px solid rgba(122,152,255,.12);border-radius:16px;padding:12px 14px;color:var(--muted)}
.focusbar{padding:16px 18px}.focus-scroller{gap:10px}
.connection-chip,.inspect-list button,.draft-item,.service-box,tbody tr{background:rgba(18,26,42,.54);border:1px solid rgba(122,152,255,.12);border-radius:16px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
.connection-chip{display:flex;align-items:center;gap:12px;min-width:200px;padding:12px 14px}.connection-chip strong{display:block;font-size:14px}.connection-chip small{color:var(--muted)}
.inspect-list button{display:flex;align-items:center;gap:12px;padding:12px 14px;width:100%;text-align:left}
.inspect-list button span{font-weight:600}
.table-scroll table{border-collapse:separate;border-spacing:0 10px}
tbody tr{box-shadow:0 8px 20px rgba(0,0,0,.08)}
tbody td{border-top:1px solid rgba(122,152,255,.1);border-bottom:1px solid rgba(122,152,255,.1);background:transparent}
tbody td:first-child{border-left:1px solid rgba(122,152,255,.1);border-radius:14px 0 0 14px}
tbody td:last-child{border-right:1px solid rgba(122,152,255,.1);border-radius:0 14px 14px 0}
.status-cell{text-align:center;width:62px}
.dot{display:inline-block;width:12px;height:12px;border-radius:999px;box-shadow:0 0 0 5px rgba(255,255,255,.02),0 0 14px currentColor}
.dot.online{color:#49ddb0;background:#49ddb0}.dot.pending{color:#8aa8ff;background:#8aa8ff}.dot.unreachable,.dot.interface_down,.dot.no_handshake,.dot.stale{color:#f97887;background:#f97887}.dot.unverified,.dot.disabled,.dot.not_configured{color:#7f8ca8;background:#7f8ca8}
.inspector .inspect-head p{color:var(--muted)}
.sidebar #nav button{border-radius:14px;background:transparent;border-color:transparent}
.sidebar #nav button.active,.sidebar #nav button:hover{background:rgba(122,152,255,.1);border-color:rgba(122,152,255,.18)}
.sidebar-bottom{background:rgba(11,18,30,.54);border:1px solid rgba(122,152,255,.12);border-radius:14px;padding:10px 12px}
.modal-backdrop{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);background:rgba(3,8,16,.58)}
.helper,.warning{background:rgba(17,24,40,.66);border:1px solid rgba(122,152,255,.12);border-radius:14px;padding:12px 14px}
.output{background:rgba(9,15,26,.82);border:1px solid rgba(122,152,255,.12);border-radius:16px}
@media (max-width:1280px){.node{width:228px}.map-stage{min-height:920px}}


/* v0.8.4: original Bezier links behind lightweight translucent cards. */
.node{height:auto;min-height:0;background:transparent;border:0;box-shadow:none;overflow:visible;isolation:auto;}
.node.selected{box-shadow:none;}
.node:hover{border-color:transparent;}
.node .node-body{
  min-height:130px;
  border-radius:17px;
  background:rgba(23,32,51,.54);
  backdrop-filter:blur(5px);
  -webkit-backdrop-filter:blur(5px);
  border:1px solid rgba(139,162,216,.32);
  box-shadow:0 7px 18px rgba(0,0,0,.18);
  padding:16px 17px 13px;
}
.node .node-body::before{background:linear-gradient(180deg,rgba(255,255,255,.025),transparent 40%);}
.node.selected .node-body{border-color:rgba(137,165,255,.8);box-shadow:0 0 0 1px rgba(137,165,255,.15),0 9px 22px rgba(0,0,0,.2);}
.node-status{margin-top:10px;}
.node-meta{margin-bottom:14px;}
.node .port{width:21px;height:21px;border:2px solid #849fff;background:#152038;
  box-shadow:0 0 0 2px rgba(132,159,255,.09);}
.node .port.in{top:-28px;bottom:auto;left:calc(50% - 10.5px);}
.node .port.out{bottom:-28px;top:auto;left:calc(50% - 10.5px);}
.node .port.in .port-label{top:auto;bottom:calc(100% + 6px);}
.node .port.out .port-label{bottom:auto;top:calc(100% + 6px);}
.port .port-label{font-size:10px;letter-spacing:.05em;text-shadow:none;}
.edge-visible{stroke-width:2.4;stroke-linecap:round;opacity:.84;}
.edge-visible.dimmed{opacity:.16;}
.edge-halo{display:none;}
.edge-hit{stroke-width:15;}
#dragLine{stroke-width:2.3;filter:none;}
/* Override old per-role port orientation, which otherwise wins specificity. */
.node.router .port.in,.node.server .port.in{top:-28px;bottom:auto;}
.node.router .port.out,.node.server .port.out{top:auto;bottom:-28px;}


/* v0.8.5: zoomed canvases never collapse into a narrow strip at the left. */
.map-stage{width:var(--canvas-width,1760px);height:var(--canvas-height,900px);min-height:0;max-width:none;}
/* A router is a client/output endpoint only. Port remains outside card bounds. */
.node.router .port.in{display:none!important}
.node.router .port.out{top:-29px;bottom:auto;left:calc(50% - 10.5px)}
.node.router .port.out .port-label{top:auto;bottom:calc(100% + 6px)}
/* The server's incoming port faces its router clients, under its card. */
.node.server .port.in{top:auto;bottom:-29px;left:calc(50% - 10.5px)}
.node.server .port.in .port-label{bottom:auto;top:calc(100% + 6px)}
.node.server .port.out{top:-29px;bottom:auto;left:calc(50% - 10.5px)}
.node.server .port.out .port-label{top:auto;bottom:calc(100% + 6px)}

/* v0.8.6: mouse-pan virtual map; original 75% is now 100%. */
.map-viewport{overflow:auto!important;scrollbar-width:none!important;overscroll-behavior:contain;cursor:grab;touch-action:none;}
.map-viewport::-webkit-scrollbar{display:none!important;width:0!important;height:0!important;}
.map-viewport.is-panning{cursor:grabbing;}
.map-stage{width:var(--canvas-width,20000px)!important;height:var(--canvas-height,16000px)!important;min-height:0!important;}
.node{transform:translate(-50%,-50%) scale(var(--map-scale,.75));}

.field[hidden]{display:none!important}

.edge-visible.configuration_drift{stroke:var(--red);opacity:1}
.dot.configuration_drift{color:var(--red);background:var(--red)}

/* v0.8.11 tactile destructive confirmation and source editing */
.hold-confirm { position:relative; isolation:isolate; overflow:hidden; touch-action:none; user-select:none; min-width:145px; }
.hold-confirm::before{content:'';position:absolute;z-index:-1;inset:0;right:calc(100% - var(--hold-progress,0%));background:rgba(255,255,255,.22);transition:right .045s linear;pointer-events:none;}
.hold-confirm.holding{border-color:rgba(255,255,255,.75);transform:none;}
button[hidden],[hidden]{display:none!important}
.code-editor{display:block;margin:10px 0 16px;width:100%;min-height:260px;resize:vertical;white-space:pre;tab-size:2;line-height:1.4;font:12px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace;background:rgba(4,10,21,.88);border:1px solid var(--border);border-radius:12px;color:var(--text);padding:14px;}
.code-editor.init{min-height:135px}

/* v0.8.11: distinguish staged operations without changing live status color. */
.edge-visible.draft-connect {stroke:url(#connectStripes)!important;stroke-width:4!important;stroke-dasharray:10 4!important;opacity:1;}
.edge-visible.draft-disconnect {stroke:url(#disconnectStripes)!important;stroke-width:4!important;stroke-dasharray:10 4!important;opacity:1;}
.edge-visible.draft-connect.dimmed,.edge-visible.draft-disconnect.dimmed{opacity:.4;}
.line.draft-connect{border-top:4px dashed #52f0b5;}
.line.draft-disconnect{border-top:4px dashed #ff8193;}
.dot.draft-connect{color:#52f0b5;background:#52f0b5;}
.dot.draft-disconnect{color:#ff8193;background:#ff8193;}

/* Clear, non-interactive state when a destructive preview is blocked. */
button:disabled{cursor:not-allowed;opacity:.42;filter:saturate(.55);box-shadow:none;pointer-events:none;}
button:disabled:hover{transform:none;}

/* v0.8.12 — forgiving connector hitboxes and destination snapping. */
.node .port{isolation:isolate;}
.node .port::before{content:'';position:absolute;inset:-23px;border-radius:50%;z-index:-1;cursor:crosshair;}
.node.drop-target .node-body{border-color:rgba(99,240,185,.95);box-shadow:0 0 0 3px rgba(67,214,170,.14),0 10px 25px rgba(0,0,0,.22);}
#linkIp[readonly],#linkIface[readonly]{color:var(--text);background:rgba(22,37,60,.72);font-variant-numeric:tabular-nums;}
#linkDiscovery[data-discovery-state="existing"]{border-color:rgba(56,212,155,.42);}
#linkDiscovery[data-discovery-state="ambiguous"]{border-color:rgba(248,116,128,.55);}

/* AWG 3.1 saved profiles / critical compatibility warnings */
.awg-node-section{margin:16px 0;padding:15px 17px;display:flex;gap:20px;align-items:center;justify-content:space-between;background:rgba(26,37,61,.65);border:1px solid rgba(130,160,255,.22);border-radius:14px}
.awg-node-section p{margin:4px 0 0;max-width:450px}
.awg-risk{border:1px solid rgba(245,81,97,.55);color:#ffb8bf;background:rgba(113,23,40,.17);border-radius:12px;padding:13px 15px;margin:13px 0 17px}
.awg-option{padding:9px;background:rgba(22,31,52,.54);border:1px solid rgba(130,160,255,.13);border-radius:10px}
.awg-option.awg-shared{border-color:rgba(245,81,97,.46);background:rgba(113,23,40,.10)}
.awg-option small{font-size:10px;color:var(--muted)}.awg-red{font-size:10px;font-weight:750;letter-spacing:.04em;color:#ff788a;margin-left:7px}
.awg-observed{margin-top:15px}.awg-live{background:rgba(12,20,35,.7);padding:12px 14px;border:1px solid var(--border);border-radius:11px;margin-bottom:9px}.awg-live p{font-size:11px;line-height:1.7;overflow-wrap:anywhere}.awg-live small{color:var(--muted)}
.awg-form{max-height:40vh;overflow-y:auto;scrollbar-width:thin;margin:12px 0}

/* Large AWG 3.1 CPS I1 editor: preserve full 1250-byte decoy and allow wrapping. */
.awg-cps { width:100%; min-height:94px; max-height:190px; resize:vertical;
    border:1px solid var(--border); border-radius:10px; padding:12px; background:rgba(11,18,35,.9);
    color:var(--text); font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace;
    overflow-wrap:anywhere; word-break:break-all; }
.awg-preset-actions { display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin:12px 0 20px; }
.awg-preset-actions small { color:var(--muted); }


/* v0.8.22 — consistent semantic button styles and unsaved-layout feedback */
:root{--action:#7797ff;--action-hover:#8ca8ff;--danger:#ff7887;--positive:#36cc9d;}
button, .modal footer button, .toolbar button, .actions button{
  border-radius:12px;min-height:38px;border:1px solid rgba(140,167,223,.24);
  background:rgba(29,42,69,.8);color:#eaf0fc;font-weight:550;
  box-shadow:none;transition:background .16s,border-color .16s,box-shadow .16s;
}
button:hover,.modal footer button:hover,.toolbar button:hover{background:rgba(50,65,96,.95);border-color:rgba(145,178,255,.43);transform:none;}
button.primary, .modal footer button.primary,.toolbar button.primary{
  color:#fff;background:#6889f5;border-color:#87a1fb;box-shadow:0 4px 14px rgba(80,107,214,.17);
}
button.primary:hover{background:#7999ff;}
button.danger-btn, .modal footer button.danger-btn{
  color:#ff92a0;background:rgba(118,43,59,.21);border-color:rgba(255,119,136,.53);box-shadow:none;
}
button.danger-btn:hover{background:rgba(135,43,59,.33);border-color:#ff8996;}
button.success-btn,.modal footer button.success-btn{
  color:#a4f5d8;background:rgba(30,115,86,.21);border-color:rgba(61,212,166,.49);box-shadow:none;
}
button.success-btn:hover{background:rgba(37,139,99,.33);border-color:#53deb1;}
button.hold-confirm::before{background:rgba(255,255,255,.19)}
button.danger-btn.hold-confirm::before{background:rgba(255,105,128,.32)}
button.success-btn.hold-confirm::before{background:rgba(43,209,158,.28)}
#saveLayout.unsaved{border-color:rgba(245,184,85,.58);color:#ffcf80;background:rgba(111,81,36,.24)}
button:disabled{opacity:.46;box-shadow:none}

/* v0.8.25: node identity status: live AWG, trusted SSH, offline. */
.node-status .dot.awg-online{background:#37d3a0;color:#37d3a0}
.node-status .dot.ssh-online{background:#ad87fa;color:#ad87fa}
.node-status .dot.node-offline{background:#f97887;color:#f97887}
.node-status{font-size:12px;gap:7px;}
.node-status .dot{height:9px;width:9px;}

.legend-help .dot{width:8px;height:8px;vertical-align:middle;box-shadow:none;margin:0 3px 0 0}

/* v0.8.26 group selection */
.node.multi-selected .node-body{border-color:rgba(111,183,255,.97)!important;box-shadow:0 0 0 2px rgba(103,166,255,.5),0 12px 28px rgba(0,0,0,.27)!important;}
.node-marquee{position:fixed;z-index:200;pointer-events:none;border:1px dashed #88aeff;background:rgba(103,145,246,.14);border-radius:5px;box-sizing:border-box;}
.node-marquee[hidden]{display:none!important;}

/* v0.8.36: optional RU1 uplink switch in Ubuntu enrollment */
.server-peer-toggle{padding:12px 14px;border:1px solid var(--border,#293a5b);border-radius:12px}
.server-peer-switch{display:flex;align-items:flex-start;gap:13px;cursor:pointer;position:relative}
.server-peer-switch>input{position:absolute;opacity:0;width:42px;height:26px;top:0;left:0;cursor:pointer}
.server-peer-track{position:relative;display:inline-block;width:43px;height:25px;border-radius:18px;flex-shrink:0;background:#34405d;border:1px solid #52648c;transition:background .16s}
.server-peer-track::after{content:'';position:absolute;top:3px;left:3px;width:17px;height:17px;border-radius:50%;background:#d1ddf5;transition:transform .16s}
.server-peer-switch>input:checked+.server-peer-track{background:#6386f8;border-color:#8ca5ff}
.server-peer-switch>input:checked+.server-peer-track::after{transform:translateX(18px)}
.server-peer-switch>input:focus-visible+.server-peer-track{outline:2px solid #a8b9ff;outline-offset:3px}
.server-peer-label{display:flex;flex-direction:column;gap:5px;line-height:1.4}
.server-peer-label small{font-size:.83em;opacity:.78}

.toast.success{border-color:#34d399;background:#12372f;color:#d8fff2}.toast.error{border-color:#fb7185;background:#3b1d2a;color:#ffe0e5}.toast.info{border-color:#7196ef;background:#1a2947;color:#e7edff}.edge-visible.route-capable{stroke:#9672f5;stroke-width:3px}

/* v0.8.40.1: consistent controls and stable responsive dialogs. */
.modal{width:min(680px,calc(100vw - 32px));max-width:100%;min-width:0}
.modal header>div,.modal-body,.modal footer{min-width:0}
.modal footer{flex-wrap:wrap;align-items:center;gap:9px}
.modal footer button{white-space:normal;overflow-wrap:anywhere;max-width:100%;min-height:42px}
.modal .field,.modal .field select,.modal .field input,.modal .field textarea{min-width:0;max-width:100%;box-sizing:border-box}
.modal .field select{display:block;min-height:44px;padding:10px 36px 10px 12px;line-height:1.4;overflow:hidden;text-overflow:ellipsis;background-color:#20283a;color:#eaf0fc;border:1px solid #52637f;border-radius:10px}
.modal .field select option{color:#eef3ff;background:#20283a;font-size:14px}
.modal .field input,.modal .field textarea{font-size:14px;line-height:1.45}
.modal .kv{align-items:flex-start;min-width:0}
.modal .kv span{flex:0 1 40%;overflow-wrap:anywhere}
.modal .kv strong{flex:1 1 60%;min-width:0;overflow-wrap:anywhere;text-align:right}
@media(max-width:520px){.modal-backdrop{padding:9px}.modal header{padding:15px}.modal-body{padding:15px}.modal footer{padding:12px}.modal footer button{flex:1 1 auto}.modal .form-grid{grid-template-columns:minmax(0,1fr)}}

/* Shared visible 40px canvas dots and SHIFT snapping grid */
.map-stage{background-size:var(--grid-step,30px) var(--grid-step,30px)!important;background-position:center center;}

/* Policy destinations must match the dark form controls, not default textarea chrome. */
#polCIDR{width:100%;min-height:150px;resize:vertical;background:#131b2e;color:var(--text);border:1px solid #354565;border-radius:12px;padding:13px 14px;font:13px/1.65 ui-monospace,SFMono-Regular,Consolas,monospace;outline:none;box-sizing:border-box;}
#polCIDR:focus{border-color:var(--accent);box-shadow:0 0 0 2px rgba(99,134,251,.18);}
/* Per-interface live AWG status: keep saved/runtime divergence visible. */
.awg-drift{display:block;color:#ffc17b!important;font-size:11px!important;overflow-wrap:anywhere;line-height:1.4}
#liveAwgFields .field textarea{width:100%;min-height:72px;resize:vertical;background:#151e30;border:1px solid #354663;border-radius:9px;padding:10px;color:#e5efff;font:12px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace}
#liveAwgFields .awg-option{min-width:0}
#liveAwgFields .awg-option input{min-width:0;width:100%}
#liveAwgFields .awg-option select:disabled,#liveAwgFields .awg-option input:disabled,#liveAwgFields .awg-option textarea:disabled{opacity:.72;cursor:not-allowed}

/* v0.8.45.7: nested AWG editor and reliable modal tab state. */
#editDetailsPanel[hidden],#editAwgPanel[hidden],#modalActions[hidden]{display:none!important}
.edit-node-tabs{display:flex;gap:7px;margin-bottom:16px;border-bottom:1px solid var(--border);padding-bottom:10px}
.edit-node-tabs button.active{border-color:var(--accent);background:#304472;color:#fff}
.edit-awg-actions{margin:16px 0 0;justify-content:flex-end}
#diagCopy:disabled{opacity:.5;cursor:not-allowed}

/* Compact, readable notifications that never obscure multiple map labels. */
.toast{box-sizing:border-box;width:min(320px,calc(100vw - 32px));max-width:320px;right:16px;top:16px;padding:12px 15px;line-height:1.4;font-size:13px;font-weight:580;overflow-wrap:anywhere;white-space:normal;box-shadow:0 10px 26px #0007}
.map-card .card-head p{font-size:11px;line-height:1.35;margin:0}
.map-card .card-head{padding:11px 15px}
@media(max-width:700px){.toast{right:12px;top:12px;width:min(290px,calc(100vw - 24px))}}
