
        .mlp-anim-fw-hero-pulse {
          animation: mlpFwHeroPulse 1.6s ease-in-out infinite;
        }
        @keyframes mlpFwHeroPulse {
          0%, 100% { transform: scale(1); opacity: 1; }
          50% { transform: scale(1.45); opacity: 0.45; }
        }
        .mlp-anim-fw-hero-stream {
          animation: mlpFwHeroStream 1.1s linear infinite;
        }
        @keyframes mlpFwHeroStream {
          0% { background-position: 120% 0; }
          100% { background-position: -120% 0; }
        }
        .mlp-anim-fw-hero-gate {
          animation: mlpFwHeroGate 1.3s ease-in-out infinite;
          will-change: transform, opacity;
        }
        @keyframes mlpFwHeroGate {
          0%, 100% { transform: scale(1); opacity: 0.7; }
          50% { transform: scale(1.12); opacity: 0.15; }
        }
        /* Hover life — node cards lift like on the real canvas. */
        .mlp-fw-hp-node:hover {
          transform: translateY(-2px);
        }
        @media (prefers-reduced-motion: reduce) {
          .mlp-anim-fw-hero-pulse,
          .mlp-anim-fw-hero-stream,
          .mlp-anim-fw-hero-gate {
            animation: none !important;
          }
          .mlp-fw-hp-node:hover {
            transform: none;
          }
        }
        /* Narrow phones — keep every chip inside its cell. */
        @media (max-width: 420px) {
          .mlp-fw-hp-modeltxt {
            display: none;
          }
          .mlp-fw-hp-runchip {
            display: none;
          }
        }
      