/* Direct / relay network scene */ .network-visual { position: relative; width: 100%; min-height: 520px; overflow: hidden; border: 1px solid #302737; border-radius: 27px; background: radial-gradient(circle at center, rgba(168, 85, 247, 0.1), transparent 47%), #151117; } .network-grid { position: absolute; inset: 0; background-image: linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px); background-size: 30px 30px; mask-image: radial-gradient(circle at center, black, transparent 79%); } .network-device { position: absolute; z-index: 4; top: 178px; display: grid; width: 105px; height: 145px; place-items: center; border: 5px solid #3b3340; border-radius: 20px; background: linear-gradient(145deg, #29222d, #171419); box-shadow: 0 22px 60px rgba(0, 0, 0, 0.38); color: #d89bff; } .network-device-left { left: 30px; transform: rotate(-5deg); } .network-device-right { right: 30px; transform: rotate(5deg); } .network-device svg { width: 31px; } .network-device small { position: absolute; bottom: 14px; color: #756b79; font-family: var(--font-mono); font-size: 7px; font-weight: 800; letter-spacing: 0.09em; } .network-device-top { position: absolute; top: 8px; left: 50%; width: 35px; height: 5px; border-radius: 999px; background: #080609; transform: translateX(-50%); } .network-routes { position: absolute; z-index: 2; inset: 34px 0 auto; width: 100%; height: calc(100% - 40px); overflow: visible; } .network-direct-glow, .network-direct, .network-direct-pulse, .network-relay-base, .network-relay-line { fill: none; stroke-linecap: round; } .network-direct-glow { stroke: rgba(168, 85, 247, 0.26); stroke-width: 20; filter: url(#network-route-glow); } .network-direct { stroke: #3d3343; stroke-width: 8; } .network-direct-pulse { stroke: url(#network-route-gradient); stroke-width: 3; stroke-dasharray: 4 18; animation: network-dash 2.2s linear infinite; } .network-relay-base { stroke: #2e2732; stroke-width: 5; } .network-relay-line { stroke: #776681; stroke-width: 2; stroke-dasharray: 4 11; animation: network-dash 3.4s linear infinite reverse; } .network-direct-label { position: absolute; z-index: 5; top: 62px; left: 50%; display: flex; align-items: center; gap: 9px; padding: 7px 10px; border: 1px solid #372c3c; border-radius: 999px; background: rgba(25, 20, 28, 0.82); color: #9a8fa0; font-family: var(--font-mono); font-size: 7px; font-weight: 800; letter-spacing: 0.08em; transform: translateX(-50%); } .network-relay-node { position: absolute; z-index: 5; bottom: 39px; left: 50%; display: flex; align-items: center; flex-direction: column; transform: translateX(-50%); } .relay-core { position: relative; z-index: 2; display: grid; width: 66px; height: 66px; margin-bottom: 11px; place-items: center; border: 1px solid #5c426a; border-radius: 20px; background: linear-gradient(145deg, #312139, #1d1721); box-shadow: 0 0 45px rgba(168, 85, 247, 0.18); color: #d294fc; transform: rotate(45deg); } .relay-core svg { width: 24px; transform: rotate(-45deg); } .network-relay-node strong { color: #d9d1dc; font-size: 10px; } .network-relay-node small { color: #756b79; font-size: 7px; } .relay-ring { position: absolute; top: -18px; left: 50%; border: 1px solid rgba(168, 85, 247, 0.3); border-radius: 50%; transform: translateX(-50%); animation: relay-ring 3s ease-out infinite; } .relay-ring-one { width: 100px; height: 100px; } .relay-ring-two { width: 136px; height: 136px; animation-delay: 1.2s; } .network-packet { position: absolute; z-index: 3; display: grid; width: 26px; height: 32px; place-items: center; border: 1px solid #aa65d2; border-radius: 6px; background: #2c2231; color: #d69bfa; opacity: 0; } .network-packet svg { width: 13px; } .network-packet-one { animation: network-packet-top 6s ease-in-out infinite; } .network-packet-two { animation: network-packet-bottom 7s ease-in-out 2.2s infinite; }