/* ==========================================================================
   Motion — CSS side. Ambient loops run in CSS (so they keep going even if JS
   fails); GSAP (assets/js) adds scroll, pointer and entrance choreography.
   "Always moving, never busy."
   ========================================================================== */

/* Ambient glows drift on long, unequal loops so the pattern never visibly repeats */
.glow-1 { animation: bll-drift-a 23s ease-in-out infinite; }
.glow-2 { animation: bll-drift-b 29s ease-in-out infinite; }
.glow-3 { animation: bll-drift-c 34s ease-in-out infinite; }
@keyframes bll-drift-a {
	0%, 100% { transform: translate3d(0, 0, 0) scale(1); opacity: .9; }
	33% { transform: translate3d(4%, -3%, 0) scale(1.08); opacity: 1; }
	66% { transform: translate3d(-2%, 4%, 0) scale(.96); opacity: .8; }
}
@keyframes bll-drift-b {
	0%, 100% { transform: translate3d(0, 0, 0) scale(1); opacity: 1; }
	40% { transform: translate3d(-5%, 4%, 0) scale(1.1); opacity: .82; }
	75% { transform: translate3d(3%, -2%, 0) scale(.95); opacity: .95; }
}
@keyframes bll-drift-c {
	0%, 100% { transform: translate3d(0, 0, 0) scale(1); opacity: .85; }
	50% { transform: translate3d(6%, -5%, 0) scale(1.12); opacity: 1; }
}

/* Contour lines flow very slowly */
.ambient__lines img { animation: bll-flow 38s ease-in-out infinite alternate; transform-origin: 50% 50%; }
@keyframes bll-flow {
	from { transform: translate3d(-2%, 0, 0) scale(1.05) rotate(0deg); }
	to { transform: translate3d(2%, -2%, 0) scale(1.12) rotate(1.2deg); }
}

/* "We're Available" radar ping */
.contact__dot::before { animation: bll-ping 3.2s var(--ease-soft) infinite; }
@keyframes bll-ping { 0% { transform: scale(1); opacity: .35; } 80%, 100% { transform: scale(2); opacity: 0; } }

/* Pre-reveal states are only applied when JS is running (content never hidden without JS) */
.js.motion-ready [data-reveal="fade"] { opacity: 0; transform: translateY(14px); }

/* --------------------------------------------------------------------------
   Reduced motion: everything calm and static.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
	.band::after, .contact__dot::before { display: none; }
	.js.motion-ready [data-reveal="fade"] { opacity: 1; transform: none; }
}
