*{box-sizing:border-box}
html,body{margin:0;height:100%;overflow:hidden}
body{background:radial-gradient(circle at 50% 35%,rgba(255,255,255,.07),transparent 62%),var(--bg);color:#fff;font-family:var(--fb);-webkit-font-smoothing:antialiased}
button,input{font-family:inherit}
#stage{position:absolute;inset:0;cursor:grab;touch-action:none;overflow:hidden}
#stage:active{cursor:grabbing}
#lines{position:absolute;inset:0;pointer-events:none}
#nodes{position:absolute;inset:0}
.err{padding:40px;text-align:center}

.node{position:absolute;left:0;top:0;width:132px;height:46px;padding:4px 8px;display:flex;align-items:center;justify-content:center;gap:6px;
  background:var(--c,var(--c-grey));border:1px solid rgba(255,255,255,.6);border-radius:6px;text-align:center;cursor:pointer;user-select:none;
  box-shadow:0 6px 14px rgba(0,0,0,.35);will-change:transform;transition:opacity .25s,box-shadow .2s}
.s-orange{--c:var(--c-orange)}.s-teal{--c:var(--c-teal)}.s-blue{--c:var(--c-blue)}.s-magenta{--c:var(--c-magenta)}.s-grey{--c:var(--c-grey)}
.node .tx{font-size:11px;font-weight:600;line-height:1.2;min-width:0}
.node .tx small{display:block;margin-top:2px;font-weight:400;font-size:9.5px;opacity:.85}
.node .av{width:30px;height:30px;border-radius:50%;object-fit:cover;border:1px solid rgba(255,255,255,.7);flex:none}
.node:hover{box-shadow:0 0 0 2px #fff,0 8px 20px rgba(0,0,0,.5)}
.node.dim{opacity:.16}
.node.match{box-shadow:0 0 0 3px #fff,0 0 18px #fff}
.node.sel{box-shadow:0 0 0 3px var(--accent),0 0 26px var(--accent)}
.node .tg{position:absolute;left:50%;bottom:-10px;transform:translateX(-50%);min-width:20px;height:20px;padding:0 5px;border-radius:10px;
  background:var(--accent);color:#1b1b1b;font:700 11px/20px var(--fb);text-align:center}
.node .tg:hover{background:#fff}

.ui{position:absolute;z-index:20000}
.top{top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 20px;pointer-events:none;
  background:linear-gradient(rgba(0,0,0,.45),transparent)}
.top>*{pointer-events:auto}
.brand{display:flex;align-items:center;gap:12px;min-width:0}
.brand img{max-height:44px;max-width:150px;object-fit:contain}
.brand h1{margin:0;font:700 20px/1.1 var(--fh);letter-spacing:.2px}
.brand p{margin:3px 0 0;font-size:12px;opacity:.7}
.search{position:relative}
.search input{width:250px;max-width:46vw;padding:9px 40px 9px 14px;border-radius:20px;border:1px solid rgba(255,255,255,.25);background:rgba(15,16,18,.7);color:#fff;font-size:13px;outline:none}
.search input:focus{border-color:var(--accent)}
#qc{position:absolute;right:14px;top:50%;transform:translateY(-50%);font-size:11px;opacity:.7}

.ctrl{left:50%;bottom:18px;transform:translateX(-50%);display:flex;gap:6px;flex-wrap:wrap;justify-content:center;padding:6px;border-radius:12px;background:rgba(15,16,18,.78);backdrop-filter:blur(8px);max-width:96vw}
.ctrl button{padding:8px 13px;border:0;border-radius:8px;background:transparent;color:#fff;font-size:12.5px;cursor:pointer}
.ctrl button:hover,.ctrl button.on{background:var(--accent);color:#1b1b1b}
.ctrl button:focus-visible,.panel button:focus-visible{outline:2px solid #fff;outline-offset:2px}

.legend{left:20px;bottom:18px;display:flex;flex-direction:column;gap:6px;font-size:12px;padding:10px 12px;border-radius:10px;background:rgba(15,16,18,.6)}
.legend span{display:flex;align-items:center;gap:8px}
.legend i{width:14px;height:14px;border-radius:3px;border:1px solid rgba(255,255,255,.6)}
.hint{right:20px;bottom:22px;font-size:11.5px;opacity:.6;max-width:260px;text-align:right}

.panel{top:84px;right:16px;width:340px;max-height:calc(100% - 170px);overflow:auto;padding:0 20px 20px;border-radius:12px;
  background:rgba(18,19,21,.94);backdrop-filter:blur(10px);box-shadow:0 18px 50px rgba(0,0,0,.55);transform:translateX(125%);transition:transform .3s ease}
.panel.open{transform:none}
.panel .bar{height:6px;margin:0 -20px 16px;background:var(--c);border-radius:12px 12px 0 0}
.panel .x{position:absolute;top:12px;right:10px;width:30px;height:30px;border:0;border-radius:50%;background:rgba(255,255,255,.1);color:#fff;font-size:18px;cursor:pointer}
.panel h2{margin:0 30px 4px 0;font:700 19px/1.25 var(--fh)}
.panel .ph{width:84px;height:84px;border-radius:50%;object-fit:cover;margin:0 0 12px;border:2px solid var(--c)}
.panel .pn{font-size:15px;opacity:.9;margin-bottom:8px}
.panel .ct{display:flex;flex-direction:column;gap:4px;margin:8px 0}
.panel .ct a{color:var(--accent);text-decoration:none;font-size:13.5px}
.panel .ds{font-size:13.5px;line-height:1.6;white-space:pre-wrap;opacity:.9}
.panel .muted{font-size:13px;opacity:.55}
.panel h4{margin:18px 0 8px;font:600 13px var(--fh);opacity:.7}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chips button{padding:6px 10px;border:1px solid rgba(255,255,255,.25);border-radius:14px;background:transparent;color:#fff;font-size:12px;cursor:pointer;text-align:left}
.chips button:hover{border-color:var(--accent);color:var(--accent)}

@media (max-width:720px){
  .brand h1{font-size:16px}.brand img{max-height:34px}.hint,.legend{display:none}
  .top{flex-direction:column;align-items:flex-start;gap:8px}.search input{width:100%;max-width:none}.search{width:100%}
  .panel{top:auto;left:8px;right:8px;bottom:70px;width:auto;max-height:46%}
}
@media (prefers-reduced-motion:reduce){.panel,.node{transition:none}}
