.ops-shell { display: grid; gap: 1rem; } .ops-header { display: flex; justify-content: space-between; align-items: center; gap: 0.8rem; flex-wrap: wrap; } .ops-header h1 { margin: 0; } .ops-subtitle { color: #93a4b8; margin: 0.25rem 0 0; } .ops-kpis { display: grid; gap: 0.75rem; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); } .ops-kpi { border: 1px solid rgba(120, 170, 255, 0.25); border-radius: 12px; padding: 0.8rem; background: linear-gradient(150deg, rgba(15, 23, 42, 0.95), rgba(17, 30, 53, 0.7)); box-shadow: inset 0 0 20px rgba(36, 99, 235, 0.08), 0 0 20px rgba(30, 64, 175, 0.12); } .ops-kpi .label { color: #8ba3c4; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; } .ops-kpi .value { font-size: 1.3rem; font-weight: 700; margin-top: 0.2rem; } .topology-card { position: relative; border-radius: 14px; border: 1px solid rgba(56, 189, 248, 0.3); background: radial-gradient(circle at top, rgba(21, 43, 77, 0.35), rgba(8, 15, 29, 0.92)); overflow: hidden; } .topology-canvas { width: 100%; min-height: 520px; } .topology-lines line { stroke: rgba(59, 130, 246, 0.42); stroke-width: 2; } .pulse-line { stroke: rgba(56, 189, 248, 0.95); stroke-width: 2.6; stroke-dasharray: 10 14; animation: ops-line-pulse 1.8s linear infinite; filter: drop-shadow(0 0 6px rgba(56, 189, 248, 0.85)); } .ops-node circle { fill: #0f172a; stroke-width: 2.2; } .ops-node text { fill: #d9e8ff; font-size: 12px; font-weight: 600; } .ops-node .sub { fill: #8ea7ca; font-size: 11px; font-weight: 500; } .node-proxmox circle { stroke: #f59e0b; filter: drop-shadow(0 0 11px rgba(245, 158, 11, 0.6)); } .node-vm circle { stroke: #38bdf8; filter: drop-shadow(0 0 9px rgba(56, 189, 248, 0.5)); } .node-service circle { stroke: #22c55e; filter: drop-shadow(0 0 8px rgba(34, 197, 94, 0.45)); } .status-offline circle { stroke: #ef4444; filter: drop-shadow(0 0 10px rgba(239, 68, 68, 0.6)); } .status-degraded circle, .status-unknown circle { stroke: #f59e0b; } .ops-meta { color: #8ba3c4; font-size: 0.85rem; } @keyframes ops-line-pulse { from { stroke-dashoffset: 26; } to { stroke-dashoffset: 0; } }