/* Hatchery — Motion utilities (brand animations)
   The spark is the brand's signature animated element. Keep motion restrained
   and continuous; respect reduced-motion. */

@keyframes hx-spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
@keyframes hx-spin-ccw {
  from { transform: rotate(0deg); }
  to   { transform: rotate(-360deg); }
}
/* Orbit: a mark travels around a circular path (rotate an offset child). */
@keyframes hx-orbit {
  from { transform: rotate(0deg) translateX(var(--hx-orbit-radius, 40px)) rotate(0deg); }
  to   { transform: rotate(360deg) translateX(var(--hx-orbit-radius, 40px)) rotate(-360deg); }
}
@keyframes hx-pulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50%      { transform: scale(1.12); opacity: 0.85; }
}
@keyframes hx-twinkle {
  0%, 100% { transform: rotate(0deg) scale(1); }
  50%      { transform: rotate(45deg) scale(0.82); }
}

/* Utility classes */
.hx-spin      { animation: hx-spin 8s linear infinite; }
.hx-spin-slow { animation: hx-spin 16s linear infinite; }
.hx-spin-ccw  { animation: hx-spin-ccw 8s linear infinite; }
.hx-pulse     { animation: hx-pulse 2.4s var(--ease-standard) infinite; }
.hx-twinkle   { animation: hx-twinkle 3.2s var(--ease-standard) infinite; }
/* Orbit needs a positioned parent; the orbiting element gets this class. */
.hx-orbit     { animation: hx-orbit 9s linear infinite; }

@media (prefers-reduced-motion: reduce) {
  .hx-spin, .hx-spin-slow, .hx-spin-ccw, .hx-pulse, .hx-twinkle, .hx-orbit {
    animation: none;
  }
}
