/* =====================================================================
   GTA VI Community Forum — animations.css
   Keyframes, ambient motion, neon borders, particles
   ===================================================================== */

/* Respect reduced-motion / anim toggle */
@media (prefers-reduced-motion:reduce){*{animation:none !important;transition:none !important}}
:root[data-anim="off"] *{animation:none !important}
:root[data-anim="off"] .btn:hover,
:root[data-anim="off"] .forum-row:hover,
:root[data-anim="off"] .float-btn:hover{transform:none !important}

/* ---------- Ambient gradient drift on page background ---------- */
@keyframes bgDrift{
  0%,100%{transform:translate(0,0) scale(1)}
  50%{transform:translate(-2%,1.5%) scale(1.04)}
}
body::before{animation:bgDrift 22s ease-in-out infinite}

/* ---------- Hero sun pulse ---------- */
@keyframes sunPulse{0%,100%{opacity:.85;transform:translate(-50%,-50%) scale(1)}
  50%{opacity:1;transform:translate(-50%,-50%) scale(1.06)}}
.hero-sun{animation:sunPulse 7s ease-in-out infinite}

/* ---------- Floating hero particles ---------- */
@keyframes floatUp{
  0%{transform:translateY(0) translateX(0);opacity:0}
  10%{opacity:.9}
  90%{opacity:.6}
  100%{transform:translateY(-120px) translateX(14px);opacity:0}
}
.particle{position:absolute;bottom:-8px;width:4px;height:4px;border-radius:50%;
  background:rgba(255,200,150,.9);box-shadow:0 0 8px rgba(255,180,120,.9);
  animation:floatUp linear infinite}

/* ---------- Animated neon border (forum group + cards on hover) ---------- */
@keyframes neonSweep{
  0%{background-position:0% 50%}
  100%{background-position:200% 50%}
}
.neon-border{position:relative}
.neon-border::before{
  content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;
  background:linear-gradient(120deg,transparent,rgba(var(--accent-rgb),.7),rgba(168,85,247,.7),transparent);
  background-size:200% 100%;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  opacity:0;transition:opacity .35s;animation:neonSweep 3s linear infinite;pointer-events:none;
}
.neon-border:hover::before{opacity:1}

/* ---------- Announcement icon glow pulse ---------- */
@keyframes glowPulse{0%,100%{box-shadow:0 0 20px rgba(var(--accent-rgb),.35)}
  50%{box-shadow:0 0 34px rgba(var(--accent-rgb),.65)}}
.announce .ico{animation:glowPulse 3.5s ease-in-out infinite}

/* ---------- Entrance reveals on scroll ---------- */
@keyframes rise{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:none}}
.reveal{opacity:0}
.reveal.in{animation:rise .7s cubic-bezier(.2,.7,.2,1) forwards}

/* stagger utility */
.reveal.d1{animation-delay:.06s}
.reveal.d2{animation-delay:.12s}
.reveal.d3{animation-delay:.18s}
.reveal.d4{animation-delay:.24s}

/* ---------- Logo shimmer ---------- */
@keyframes shimmer{0%,100%{filter:drop-shadow(0 0 0 rgba(var(--accent-rgb),0))}
  50%{filter:drop-shadow(0 0 10px rgba(var(--accent-rgb),.5))}}
.logo-main b{animation:shimmer 4s ease-in-out infinite}

/* ---------- Online pulse dot ---------- */
@keyframes ping{0%{box-shadow:0 0 0 0 rgba(61,220,132,.6)}70%{box-shadow:0 0 0 7px rgba(61,220,132,0)}
  100%{box-shadow:0 0 0 0 rgba(61,220,132,0)}}
.online-dot{width:8px;height:8px;border-radius:50%;background:#3ddc84;display:inline-block;
  animation:ping 2s infinite}

/* ---------- Button sheen ---------- */
.btn-primary,.qa .primary,.cz-save{position:relative;overflow:hidden}
.btn-primary::after,.qa .primary::after,.cz-save::after{
  content:"";position:absolute;top:0;left:-60%;width:40%;height:100%;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.35),transparent);
  transform:skewX(-20deg);transition:left .6s}
.btn-primary:hover::after,.qa .primary:hover::after,.cz-save:hover::after{left:130%}

/* ---------- Contributor row hover slide ---------- */
.contrib{transition:transform .2s,background .2s;border-radius:10px;padding-left:6px;padding-right:6px}
.contrib:hover{transform:translateX(4px);background:rgba(255,255,255,.03)}
