:root{--bg:#0f172a;--fg:#e2e8f0;--muted:#94a3b8;--green:#10b981;--yellow:#f59e0b;--red:#ef4444;--blue:#3b82f6;--purple:#8b5cf6;--panel:#111827}
.codemap{display:flex;gap:16px}
.codemap .sidebar{width:320px;background:var(--panel);color:var(--fg);padding:12px;border-radius:8px;overflow:auto;max-height:80vh}
.codemap .canvas{flex:1;min-height:70vh;background:linear-gradient(180deg,#0b1020,#101826);border-radius:8px;position:relative}
.legend{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.legend .item{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:12px}
.legend .dot{width:10px;height:10px;border-radius:50%}
.module-summary{margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid #1f2937}
.module-summary h4{margin:0;font-size:14px;color:var(--fg)}
.badge{display:inline-block;padding:2px 6px;border-radius:999px;font-size:11px;margin-right:6px}
.badge.green{background:rgba(16,185,129,.15);color:var(--green)}
.badge.yellow{background:rgba(245,158,11,.15);color:var(--yellow)}
.badge.red{background:rgba(239,68,68,.15);color:var(--red)}
.badge.blue{background:rgba(59,130,246,.15);color:var(--blue)}
.badge.purple{background:rgba(139,92,246,.15);color:var(--purple)}
.exploit{font-size:12px;color:var(--muted);margin:4px 0}
.exploit .consensus{font-weight:bold}
.tooltip{position:absolute;pointer-events:none;background:#0b1220;color:var(--fg);border:1px solid #1f2937;border-radius:8px;padding:8px 10px;font-size:12px;filter:drop-shadow(0 6px 18px rgba(0,0,0,.4));}
.contract{font-size:12px;color:var(--fg);margin:8px 0;padding:6px 8px;border:1px solid #1f2937;border-radius:6px;background:rgba(59,130,246,.05)}
.contract .title{font-weight:600}
.contract .reqs{margin-top:4px}
.contract .reqs .badge{margin:2px 4px 0 0}
.edge-label{font-size:11px;fill:var(--muted);user-select:none}
