/* Bubblemap visuals (popup, overlay, website) */
.tb-svg { display: block; width: 100%; height: 100%; overflow: visible; }
.tb-node { cursor: pointer; outline: none; }
.tb-pop { transform-box: fill-box; transform-origin: center; transform: scale(0); opacity: 0; }
.tb-svg.is-in .tb-pop { animation: tb-pop .8s cubic-bezier(.18,.9,.24,1.15) var(--d, 0ms) forwards; }
@keyframes tb-pop { 0% { transform: scale(0); opacity: 0; } 70% { opacity: 1; } 100% { transform: scale(1); opacity: 1; } }
.tb-inner { transform-box: fill-box; transform-origin: center; transition: transform .28s cubic-bezier(.2,.8,.2,1), opacity .3s ease, filter .3s ease; }
.tb-ball { stroke: rgba(235, 238, 248, .32); stroke-width: 1; filter: drop-shadow(0 5px 12px rgba(0, 0, 0, .55)); }
.tb-clustered .tb-ball { stroke: rgba(255, 190, 196, .7); }
.tb-lp .tb-ball, .tb-cex .tb-ball { stroke: rgba(200, 205, 220, .45); stroke-dasharray: 3 3; filter: none; }
.tb-shine { fill: rgba(255,255,255,.34); pointer-events: none; }
.tb-halo { opacity: .2; animation: tb-breathe 3.6s ease-in-out infinite; transform-box: fill-box; transform-origin: center; }
@keyframes tb-breathe { 0%,100% { opacity: .12; transform: scale(.96); } 50% { opacity: .3; transform: scale(1.06); } }
.tb-label { fill: #f6f7fb; font-family: "Space Grotesk", "Inter", system-ui, sans-serif; font-weight: 600; pointer-events: none; letter-spacing: -.02em; paint-order: stroke; stroke: rgba(9, 10, 12, .55); stroke-width: 2px; }
.tb-lp .tb-label, .tb-cex .tb-label { fill: #aab0bf; stroke: none; }
.tb-hex { stroke-width: 1.4; filter: drop-shadow(0 0 10px hsl(352 90% 55% / .55)); }
.tb-hub-halo { animation: tb-breathe 2.8s ease-in-out infinite; transform-box: fill-box; transform-origin: center; }
.tb-hub-glyph { fill: #fff; font-family: "JetBrains Mono", ui-monospace, monospace; font-weight: 700; pointer-events: none; }
.tb-ghost { fill: hsl(352 80% 55% / .08); stroke: hsl(352 90% 70% / .85); stroke-width: 1.3; stroke-dasharray: 4 3; }
.tb-ghost-label { fill: #ffc7cd; stroke: none; }
.tb-node:hover .tb-inner, .tb-node:focus-visible .tb-inner { filter: brightness(1.15) drop-shadow(0 0 10px rgba(200, 189, 255, .45)); }
.tb-node:hover .tb-inner { transform: scale(1.1); }
.tb-node.is-selected .tb-ball { stroke: #fff; stroke-width: 2; }
.tb-node.is-selected .tb-inner { transform: scale(1.14); }
.tb-node.is-dim .tb-inner { opacity: .22; }
.tb-link { stroke-width: 1.2; stroke-linecap: round; stroke-dasharray: 3 4; opacity: .6; animation: tb-flow 1.6s linear infinite; transition: opacity .3s, stroke-width .3s; }
.tb-spoke { stroke-dasharray: none; opacity: .5; animation: none; }
.tb-ghostlink { stroke-dasharray: 2 3; }
.tb-link.is-hot { opacity: 1; stroke-width: 2; }
@keyframes tb-flow { to { stroke-dashoffset: -14; } }
@media (prefers-reduced-motion: reduce) {
  .tb-pop, .tb-svg.is-in .tb-pop { animation: none; transform: none; opacity: 1; }
  .tb-link, .tb-halo, .tb-hub-halo { animation: none; }
}
