*{box-sizing:border-box}
body{margin:0;font:15px/1.4 system-ui,sans-serif;color:#1d2733;background:#f3f5f8}
header#top{display:flex;gap:8px;align-items:center;padding:8px 12px;background:#12304d;color:#fff;flex-wrap:wrap}
header .grow{flex:1}
nav#tabs{display:flex;overflow-x:auto;background:#fff;border-bottom:1px solid #d5dbe3}
nav#tabs button{border:0;background:none;padding:12px 16px;font-size:15px;cursor:pointer;border-bottom:3px solid transparent;white-space:nowrap}
nav#tabs button.on{border-bottom-color:#1a73c8;color:#1a73c8;font-weight:600}
main{padding:12px;max-width:1300px;margin:0 auto}
button,.btn{font:inherit;padding:8px 14px;border:1px solid #b8c2cf;background:#fff;border-radius:6px;cursor:pointer}
button.sm{padding:4px 10px;font-size:13px}
button.pri{background:#1a73c8;border-color:#1a73c8;color:#fff}
button.dng{color:#b3261e;border-color:#e0b4b0}
button.on{background:#ffe9a8;border-color:#d9b44a}
input,select,textarea{font:inherit;padding:7px 8px;border:1px solid #b8c2cf;border-radius:6px;width:100%;background:#fff}
textarea{min-height:60px}
label{display:block;font-size:12px;color:#52606f;margin:8px 0 2px}
.card{background:#fff;border:1px solid #d5dbe3;border-radius:8px;padding:12px;margin-bottom:12px}
.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.row>*{width:auto}
table{border-collapse:collapse;width:100%;background:#fff}
th,td{border-bottom:1px solid #e4e8ee;padding:6px 8px;text-align:left;font-size:14px}
th{background:#eef2f6;font-size:12px;text-transform:uppercase;color:#52606f}
.tw{overflow-x:auto}
h2{margin:4px 0 10px;font-size:18px}h3{margin:14px 0 6px;font-size:15px}
.netwrap{overflow:auto;height:60vh;border:1px solid #c5ccd6;border-radius:8px;background:#fff;
  background-image:radial-gradient(#d5dbe3 1px,transparent 1px);background-size:20px 20px}
svg .node{cursor:grab;touch-action:none}
svg .node rect{fill:#fff;stroke:#456;stroke-width:2;rx:8}
svg .node.sel rect{stroke:#1a73c8;stroke-width:4}
svg .node.from rect{stroke:#e08a00;stroke-width:4}
svg .link{stroke:#456;stroke-width:3;fill:none}
svg .hit{stroke:transparent;stroke-width:16;fill:none;cursor:pointer}
svg .link.sel{stroke:#1a73c8;stroke-width:5}
svg text{font-size:12px;fill:#1d2733;pointer-events:none}
svg text.sub{fill:#667;font-size:11px}
svg .st-built{stroke:#2e8b3d !important}svg .st-modified{stroke:#d98b00 !important}svg .st-not_built{stroke-dasharray:6 4}
.pill{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;background:#e4e8ee}
.pass,.built{background:#d6f0da;color:#1c6b2a}.fail{background:#fadcd9;color:#a1261c}.modified{background:#ffecc2;color:#8a5a00}
.tcard{border:1px solid #d5dbe3;border-left:6px solid #b8c2cf;border-radius:8px;background:#fff;padding:10px;margin-bottom:10px}
.tcard.pass{border-left-color:#2e8b3d}.tcard.fail{border-left-color:#c62d22}
.tcard .g{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.thumbs{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.thumbs img{height:64px;border-radius:4px;border:1px solid #ccd}
.muted{color:#667;font-size:13px}
dialog{border:0;border-radius:10px;padding:16px;width:min(520px,94vw);box-shadow:0 10px 40px #0005}
dialog::backdrop{background:#0006}
#toast{position:fixed;bottom:14px;left:50%;transform:translateX(-50%);background:#222;color:#fff;padding:8px 16px;border-radius:20px;display:none;z-index:9}
#toast.err{background:#b3261e}
.login{max-width:340px;margin:60px auto}
@media(max-width:600px){.tcard .g{grid-template-columns:1fr}}
