/* =========================================================================
   Hero network: canvas core with real DOM endpoint tiles around the ring.
   Positions here must match the SPOKES list in hero.js.
   ========================================================================= */

.netviz {
	position: relative;
	width: 100%;
	height: 100%;
	aspect-ratio: 1 / 1;
}

.netviz canvas {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	max-width: none;
}

.netviz__node {
	position: absolute;
	left: var(--x);
	top: var(--y);
	transform: translate(-50%, -50%);
	display: grid;
	justify-items: center;
	gap: 7px;
	width: max-content;
	z-index: 2;
}

.netviz__tile {
	--t: clamp(34px, 4.4vw, 54px);
	width: var(--t);
	height: var(--t);
	border-radius: var(--r-md);
	background: #FFFFFF;
	display: grid;
	place-items: center;
	box-shadow: 0 0 0 1px rgba(34, 211, 238, 0.4), 0 0 22px rgba(34, 211, 238, 0.22);
	transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.3, 1), box-shadow 0.25s ease;
}

.netviz__tile svg {
	width: 52%;
	height: 52%;
	display: block;
}

.netviz__node:hover .netviz__tile {
	transform: translateY(-3px);
	box-shadow: 0 0 0 1px var(--accent), 0 0 30px rgba(34, 211, 238, 0.42);
}

.netviz__label {
	font-family: var(--font-mono);
	font-size: clamp(0.72rem, 0.8vw, 0.82rem);
	letter-spacing: 0.11em;
	text-transform: uppercase;
	color: var(--muted);
	white-space: nowrap;
	text-align: center;
}

/* A slow breathing pulse on each tile, offset per node, so the ring feels
   alive alongside the canvas beneath it. */
@keyframes am-node-pulse {
	0%, 100% { transform: translateY(0); }
	50%      { transform: translateY(-4px); }
}

.js .netviz__tile {
	animation: am-node-pulse 6.5s ease-in-out infinite;
	animation-delay: var(--d, 0s);
}

.js .netviz__node:hover .netviz__tile {
	animation-play-state: paused;
}

@media (max-width: 1100px) {
	.netviz__label {
		display: none;
	}
}

@media (max-width: 860px) {
	.netviz__tile {
		--t: clamp(30px, 9vw, 44px);
	}
}

@media (prefers-reduced-motion: reduce) {
	.js .netviz__tile {
		animation: none;
	}
	.netviz__node:hover .netviz__tile {
		transform: none;
	}
}
