.mesh-wrap { position: relative; border-radius: 14px; border: 1px solid rgba(148, 163, 184, 0.16); background: radial-gradient(circle at 50% 40%, rgba(255, 215, 0, 0.08), rgba(0, 0, 0, 0.35)); overflow: hidden; } .mesh-svg { width: 100%; min-height: 520px; display: block; } .mesh-edge { stroke: rgba(0, 229, 255, 0.42); stroke-width: 1.6; fill: none; stroke-linecap: round; } .mesh-pulse { stroke: rgba(0, 229, 255, 0.9); stroke-width: 3; stroke-linecap: round; stroke-dasharray: 3 140; animation: mesh-pulse 2.4s linear infinite; } @keyframes mesh-pulse { from { stroke-dashoffset: 0; } to { stroke-dashoffset: -286; } } .mesh-node { cursor: pointer; } .mesh-node text { font-size: 12px; fill: #e2e8f0; font-weight: 600; text-anchor: middle; } .mesh-node circle { fill: #0f172a; stroke: rgba(148, 163, 184, 0.65); stroke-width: 2; } .mesh-node.healthy circle { stroke: #22c55e; } .mesh-node.warn circle { stroke: #f59e0b; } .mesh-node.idle circle { stroke: #38bdf8; } .mesh-node.offline circle { stroke: #64748b; } .mesh-herman circle.main { fill: #111827; stroke: #ffd700; stroke-width: 4; filter: drop-shadow(0 0 12px rgba(255, 215, 0, 0.6)); } .mesh-herman circle.ring { fill: none; stroke: rgba(255, 215, 0, 0.35); stroke-width: 2; stroke-dasharray: 8 4; animation: mesh-herman-ring 7s linear infinite; transform-origin: center; } @keyframes mesh-herman-ring { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .mesh-legend { display: flex; gap: 0.8rem; flex-wrap: wrap; margin-top: 0.75rem; color: #94a3b8; font-size: 0.82rem; }