/* ============================================================
   Keyframes & motion primitives
   ============================================================ */

/* ─── Entrance ─── */
@keyframes fade-up   { from { opacity: 0; transform: translateY(20px); }
                       to   { opacity: 1; transform: translateY(0); } }
@keyframes slide-up  { from { opacity: 0; transform: translateY(110%); }
                       to   { opacity: 1; transform: translateY(0); } }
@keyframes fade-in   { from { opacity: 0; }
                       to   { opacity: 1; } }
@keyframes scale-in  { from { opacity: 0; transform: translateY(40px) scale(0.98); }
                       to   { opacity: 1; transform: translateY(0) scale(1); } }

/* ─── Hero ambient gold drift ─── */
@keyframes drift {
  0%, 100% { transform: translateX(-50%) translateY(0) scale(1);     opacity: 0.55; }
  50%      { transform: translateX(-50%) translateY(-10px) scale(1.05); opacity: 0.75; }
}

/* ─── Trust strip marquee ─── */
@keyframes marquee {
  0%   { transform: translateX(0%); }
  100% { transform: translateX(-50%); }
}

/* ─── Floating button revolving text ─── */
@keyframes spin-slow {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* ─── Floating button pulse halo ─── */
@keyframes pulse-halo {
  0%, 100% { box-shadow: 0 0 0 0 rgba(221,171,87,0.45); }
  50%      { box-shadow: 0 0 0 14px rgba(221,171,87,0); }
}

/* ─── Gradient blob movements (Final CTA bg) ─── */
@keyframes move-vertical {
  0%   { transform: translateY(-50%); }
  50%  { transform: translateY(50%); }
  100% { transform: translateY(-50%); }
}
@keyframes move-horizontal {
  0%   { transform: translateX(-50%) translateY(-10%); }
  50%  { transform: translateX(50%) translateY(10%); }
  100% { transform: translateX(-50%) translateY(-10%); }
}
@keyframes move-circle {
  0%   { transform: rotate(0deg); }
  50%  { transform: rotate(180deg); }
  100% { transform: rotate(360deg); }
}

/* ─── Modal ─── */
@keyframes dialog-in {
  from { opacity: 0; transform: translateY(40px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0)    scale(1); }
}

/* ─── Preview pill blink (dev only) ─── */
@keyframes blink {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.3; }
}

/* ─── Reusable animation classes ─── */
.anim-fade-up   { animation: fade-up 0.8s var(--ease-out) forwards; }
.anim-marquee   { animation: marquee 40s linear infinite; }
.anim-drift     { animation: drift 14s ease-in-out infinite; }
.anim-spin-slow { animation: spin-slow var(--spin-duration, 10s) linear infinite; }
.anim-pulse     { animation: pulse-halo 2.4s ease-out infinite; }

/* Stagger helpers — for hero entrance */
[data-anim-delay="0"]    { animation-delay: 0s; }
[data-anim-delay="100"]  { animation-delay: 0.10s; }
[data-anim-delay="200"]  { animation-delay: 0.20s; }
[data-anim-delay="350"]  { animation-delay: 0.35s; }
[data-anim-delay="550"]  { animation-delay: 0.55s; }
[data-anim-delay="1100"] { animation-delay: 1.10s; }
[data-anim-delay="1300"] { animation-delay: 1.30s; }
[data-anim-delay="1500"] { animation-delay: 1.50s; }
[data-anim-delay="1800"] { animation-delay: 1.80s; }
