/* Novus landing hero motion — Orbit & Snap once, then Deep Living Breath.
   Loaded only from templates/index.html (?v= bump on change).
   Geometry: traced wing paths from docs/mocks/novus-hero-logo-motion-prototype.html.
   Forbidden: inventing Bezier d= coordinates. */

.novus-hero-motion {
  --emblem-size: 160px;
  --breathe-duration: 4.2s;
  --orbit-snap-duration: 7.2s;
  --navy-mid: #0b2a66;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
  margin: 0 auto 24px;
}

.novus-hero-motion .novus-hero-stacked {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
}

.novus-hero-motion .emblem-frame {
  width: var(--emblem-size);
  height: var(--emblem-size);
  position: relative;
  filter: drop-shadow(0 4px 18px rgba(1, 36, 84, 0.08));
}

.novus-hero-motion .concentric-teal-aura {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 170px;
  height: 170px;
  border-radius: 50%;
  background: radial-gradient(
    circle at center,
    rgba(0, 229, 255, 0.42) 0%,
    rgba(1, 156, 152, 0.24) 42%,
    rgba(0, 229, 255, 0.08) 65%,
    transparent 78%
  );
  filter: blur(20px);
  pointer-events: none;
  z-index: 0;
  transform-origin: center center;
  opacity: 0.55;
}

.novus-hero-motion.anim-orbit-snap .concentric-teal-aura,
.novus-hero-motion.anim-living-breath .concentric-teal-aura {
  animation: concentricAuraBreathe var(--breathe-duration) ease-in-out infinite alternate;
}

@keyframes concentricAuraBreathe {
  0% {
    transform: translate(-50%, -50%) scale(0.88);
    opacity: 0.55;
    filter: blur(16px);
  }
  100% {
    transform: translate(-50%, -50%) scale(1.18);
    opacity: 0.95;
    filter: blur(26px);
  }
}

.novus-hero-motion .novus-svg-root {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  display: block;
  overflow: visible;
}

.novus-hero-motion .novus-rotor-assembly {
  transform-box: view-box;
  transform-origin: 497.18px 500.85px;
}

.novus-hero-motion .wing-unit {
  transform-box: view-box;
  transform-origin: 497.18px 500.85px;
}

.novus-hero-motion .core-unit {
  transform-box: view-box;
  transform-origin: 497.18px 500.85px;
}

.novus-hero-motion .shockwave-ring {
  transform-box: view-box;
  transform-origin: 497.18px 500.85px;
  opacity: 0;
  pointer-events: none;
}

.novus-hero-motion .stacked-typography {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.novus-hero-motion .wordmark-novus {
  font-family: "Plus Jakarta Sans", sans-serif;
  font-weight: 800;
  font-size: 34px;
  letter-spacing: 0.06em;
  color: var(--navy);
  line-height: 1;
  margin-bottom: 4px;
}

.novus-hero-motion .wordmark-endorse {
  font-family: "Plus Jakarta Sans", sans-serif;
  font-weight: 700;
  font-size: 15px;
  color: var(--teal);
  letter-spacing: 0.02em;
  line-height: 1;
  margin-bottom: 6px;
}

.novus-hero-motion .wordmark-tagline {
  font-family: "Plus Jakarta Sans", sans-serif;
  font-weight: 500;
  font-size: 13.5px;
  color: var(--muted);
  letter-spacing: 0.04em;
}

.novus-hero-motion .novus-hero-noscript {
  display: block;
  height: 220px;
  width: auto;
  max-width: min(280px, 92vw);
  margin: 0 auto;
}

/* Orbit & Snap — rigid 120° rotor, then magnetic snap */
.novus-hero-motion.anim-orbit-snap.orbit-snap-active .novus-rotor-assembly {
  animation: orbitSnapRotor var(--orbit-snap-duration) cubic-bezier(0.2, 0, 0.2, 1) forwards;
}
.novus-hero-motion.anim-orbit-snap.orbit-snap-active .wing-teal-unit {
  animation: orbitSnapWingTeal var(--orbit-snap-duration) cubic-bezier(0.2, 0, 0.2, 1) forwards;
}
.novus-hero-motion.anim-orbit-snap.orbit-snap-active .wing-navy-top-unit {
  animation: orbitSnapWingTop var(--orbit-snap-duration) cubic-bezier(0.2, 0, 0.2, 1) forwards;
}
.novus-hero-motion.anim-orbit-snap.orbit-snap-active .wing-navy-bottom-unit {
  animation: orbitSnapWingBottom var(--orbit-snap-duration) cubic-bezier(0.2, 0, 0.2, 1) forwards;
}
.novus-hero-motion.anim-orbit-snap.orbit-snap-active .core-unit circle#suta-core {
  animation: orbitSnapCore var(--orbit-snap-duration) ease-in-out forwards;
}
.novus-hero-motion.anim-orbit-snap.orbit-snap-active #snap-flash-shockwave {
  animation: snapShockwaveWave var(--orbit-snap-duration) ease-out forwards;
}

@keyframes orbitSnapRotor {
  0% { transform: rotate(0deg); }
  16% { transform: rotate(0deg); }
  66% { transform: rotate(360deg); }
  100% { transform: rotate(360deg); }
}
@keyframes orbitSnapWingTeal {
  0% { transform: translate(0, 0); }
  16% { transform: translate(-24px, 0); }
  66% { transform: translate(-24px, 0); }
  78% { transform: translate(-6px, 0); }
  83% { transform: translate(0, 0); }
  100% { transform: translate(0, 0); }
}
@keyframes orbitSnapWingTop {
  0% { transform: translate(0, 0); }
  16% { transform: translate(12px, -20.8px); }
  66% { transform: translate(12px, -20.8px); }
  78% { transform: translate(3px, -5.2px); }
  83% { transform: translate(0, 0); }
  100% { transform: translate(0, 0); }
}
@keyframes orbitSnapWingBottom {
  0% { transform: translate(0, 0); }
  16% { transform: translate(12px, 20.8px); }
  66% { transform: translate(12px, 20.8px); }
  78% { transform: translate(3px, 5.2px); }
  83% { transform: translate(0, 0); }
  100% { transform: translate(0, 0); }
}
@keyframes orbitSnapCore {
  0% {
    transform: scale(1);
    opacity: 0.8;
  }
  16%,
  66% {
    transform: scale(1.22);
    opacity: 1;
    filter: drop-shadow(0 0 28px rgba(0, 229, 255, 0.9));
  }
  78% { transform: scale(1.05); }
  83% {
    transform: scale(1.3);
    filter: drop-shadow(0 0 45px rgba(0, 229, 255, 1)) brightness(1.8);
  }
  90% {
    transform: scale(1);
    filter: drop-shadow(0 0 20px rgba(0, 229, 255, 0.6));
  }
  100% {
    transform: scale(1);
    filter: drop-shadow(0 0 16px rgba(0, 229, 255, 0.4));
  }
}
@keyframes snapShockwaveWave {
  0%,
  82% {
    transform: scale(0.4);
    opacity: 0;
  }
  83% {
    transform: scale(0.6);
    opacity: 1;
    stroke: #00e5ff;
    stroke-width: 14;
  }
  92% {
    transform: scale(1.3);
    opacity: 0;
    stroke-width: 2;
  }
  100% {
    transform: scale(1.35);
    opacity: 0;
  }
}

/* Deep Living Breath — rest loop after snap */
.novus-hero-motion.anim-living-breath .core-unit circle#suta-core {
  animation: coreCyanBreathe var(--breathe-duration) ease-in-out infinite alternate;
}
.novus-hero-motion.anim-living-breath .wing-teal-unit {
  animation: deepBreatheTeal var(--breathe-duration) ease-in-out infinite alternate;
}
.novus-hero-motion.anim-living-breath .wing-navy-top-unit {
  animation: deepBreatheTop var(--breathe-duration) ease-in-out infinite alternate;
}
.novus-hero-motion.anim-living-breath .wing-navy-bottom-unit {
  animation: deepBreatheBottom var(--breathe-duration) ease-in-out infinite alternate;
}
.novus-hero-motion.anim-living-breath .node-pulse-halo {
  animation: nodeHaloPulse var(--breathe-duration) ease-in-out infinite alternate;
}

@keyframes coreCyanBreathe {
  0% {
    transform: scale(0.9);
    opacity: 0.8;
    filter: drop-shadow(0 0 14px rgba(0, 229, 255, 0.75));
  }
  100% {
    transform: scale(1.15);
    opacity: 1;
    filter: drop-shadow(0 0 28px rgba(0, 229, 255, 0.95)) drop-shadow(0 0 10px rgba(1, 156, 152, 0.8));
  }
}
@keyframes deepBreatheTeal {
  0% { transform: translate(0, 0); }
  100% { transform: translate(-20px, 0); }
}
@keyframes deepBreatheTop {
  0% { transform: translate(0, 0); }
  100% { transform: translate(10px, -17.3px); }
}
@keyframes deepBreatheBottom {
  0% { transform: translate(0, 0); }
  100% { transform: translate(10px, 17.3px); }
}
@keyframes nodeHaloPulse {
  0% {
    r: 70px;
    opacity: 0.3;
  }
  100% {
    r: 90px;
    opacity: 0.7;
  }
}

@media (max-width: 1279px) {
  .novus-hero-motion {
    --emblem-size: 160px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .novus-hero-motion .novus-rotor-assembly,
  .novus-hero-motion .wing-unit,
  .novus-hero-motion .core-unit circle,
  .novus-hero-motion .shockwave-ring,
  .novus-hero-motion .node-pulse-halo,
  .novus-hero-motion .concentric-teal-aura {
    animation: none !important;
  }
  .novus-hero-motion .concentric-teal-aura {
    opacity: 0.4;
    transform: translate(-50%, -50%) scale(1);
    filter: blur(18px);
  }
}
