/* ═══════════════════════════════════════════════════════════
   GestJur — Biblioteca de Animações Global
   ═══════════════════════════════════════════════════════════ */

/* ── Keyframes ─────────────────────────────────────────────── */

@keyframes fadeInUp {
  from { opacity:0; transform:translateY(32px) }
  to   { opacity:1; transform:translateY(0) }
}
@keyframes fadeInDown {
  from { opacity:0; transform:translateY(-22px) }
  to   { opacity:1; transform:translateY(0) }
}
@keyframes fadeInLeft {
  from { opacity:0; transform:translateX(-36px) }
  to   { opacity:1; transform:translateX(0) }
}
@keyframes fadeInRight {
  from { opacity:0; transform:translateX(36px) }
  to   { opacity:1; transform:translateX(0) }
}
@keyframes scaleIn {
  from { opacity:0; transform:scale(.84) }
  to   { opacity:1; transform:scale(1) }
}
@keyframes bounceIn {
  0%   { opacity:0; transform:scale(.3) }
  50%  { transform:scale(1.06) }
  72%  { transform:scale(.94) }
  100% { opacity:1; transform:scale(1) }
}
@keyframes float {
  0%,100% { transform:translateY(0) }
  50%     { transform:translateY(-8px) }
}
@keyframes floatSlow {
  0%,100% { transform:translateY(0) rotate(0deg) }
  50%     { transform:translateY(-14px) rotate(4deg) }
}
@keyframes pulseGlow {
  0%,100% { box-shadow:0 0 0 0 rgba(94,43,151,0) }
  50%     { box-shadow:0 0 22px 6px rgba(94,43,151,.45) }
}
@keyframes pulseGlowGold {
  0%,100% { box-shadow:0 0 0 0 rgba(251,191,36,0) }
  50%     { box-shadow:0 0 18px 5px rgba(251,191,36,.55) }
}
@keyframes shimmer {
  0%   { background-position:-200% center }
  100% { background-position: 200% center }
}
@keyframes gradientShift {
  0%   { background-position:0% 50% }
  50%  { background-position:100% 50% }
  100% { background-position:0% 50% }
}
@keyframes spinSlow {
  to { transform:rotate(360deg) }
}
@keyframes rippleOut {
  to { transform:scale(5); opacity:0 }
}
@keyframes typewriter {
  from { width:0 }
  to   { width:100% }
}
@keyframes blink {
  50% { border-color:transparent }
}
@keyframes orbFloat1 {
  0%,100% { transform:translate(0,0)   scale(1) }
  33%     { transform:translate(28px,-18px) scale(1.12) }
  66%     { transform:translate(-18px,14px) scale(.9) }
}
@keyframes orbFloat2 {
  0%,100% { transform:translate(0,0)   scale(1) }
  33%     { transform:translate(-22px,18px) scale(1.16) }
  66%     { transform:translate(18px,-12px) scale(.86) }
}
@keyframes orbFloat3 {
  0%,100% { transform:translate(0,0) }
  50%     { transform:translate(14px,-22px) }
}
@keyframes slideIn {
  from { transform:translateX(-100%); opacity:0 }
  to   { transform:translateX(0);     opacity:1 }
}
@keyframes numberCount {
  from { opacity:0; transform:translateY(12px) }
  to   { opacity:1; transform:translateY(0) }
}
@keyframes borderPulse {
  0%,100% { border-color:rgba(94,43,151,.3) }
  50%     { border-color:rgba(94,43,151,.9) }
}
@keyframes notificationPop {
  0%   { transform:scale(1) }
  30%  { transform:scale(1.3) }
  60%  { transform:scale(.85) }
  100% { transform:scale(1) }
}
@keyframes cardFlip {
  0%   { transform:rotateY(-8deg) scale(.97); opacity:0 }
  100% { transform:rotateY(0) scale(1);     opacity:1 }
}
@keyframes textGlow {
  0%,100% { text-shadow:0 0 0 rgba(94,43,151,0) }
  50%     { text-shadow:0 0 12px rgba(94,43,151,.7) }
}

/* ── Utility animation classes ──────────────────────────────── */

.anim-fade-up    { animation:fadeInUp    .55s cubic-bezier(.16,1,.3,1) both }
.anim-fade-down  { animation:fadeInDown  .45s cubic-bezier(.16,1,.3,1) both }
.anim-fade-left  { animation:fadeInLeft  .5s  cubic-bezier(.16,1,.3,1) both }
.anim-fade-right { animation:fadeInRight .5s  cubic-bezier(.16,1,.3,1) both }
.anim-scale-in   { animation:scaleIn     .4s  cubic-bezier(.16,1,.3,1) both }
.anim-bounce-in  { animation:bounceIn    .65s cubic-bezier(.16,1,.3,1) both }
.anim-float      { animation:float       3s   ease-in-out infinite }
.anim-float-slow { animation:floatSlow   5s   ease-in-out infinite }
.anim-spin-slow  { animation:spinSlow    10s  linear infinite }
.anim-pulse-glow { animation:pulseGlow   2.5s ease-in-out infinite }
.anim-pulse-gold { animation:pulseGlowGold 2.2s ease-in-out infinite }
.anim-card-flip  { animation:cardFlip    .5s  cubic-bezier(.16,1,.3,1) both }

/* Stagger delays */
.anim-d1  { animation-delay:.05s }
.anim-d2  { animation-delay:.1s  }
.anim-d3  { animation-delay:.15s }
.anim-d4  { animation-delay:.2s  }
.anim-d5  { animation-delay:.25s }
.anim-d6  { animation-delay:.3s  }
.anim-d7  { animation-delay:.35s }
.anim-d8  { animation-delay:.4s  }
.anim-d9  { animation-delay:.45s }
.anim-d10 { animation-delay:.5s  }
.anim-d11 { animation-delay:.55s }
.anim-d12 { animation-delay:.6s  }

/* ── Shimmer button ─────────────────────────────────────────── */

.btn-shimmer {
    position:relative;
    overflow:hidden;
}
.btn-shimmer::after {
    content:'';
    position:absolute;
    inset:0;
    background:linear-gradient(105deg,transparent 38%,rgba(255,255,255,.3) 50%,transparent 62%);
    background-size:200% auto;
    opacity:0;
    transition:opacity .2s;
    pointer-events:none;
}
.btn-shimmer:hover::after {
    opacity:1;
    animation:shimmer .65s linear;
}

/* ── Ripple click effect ─────────────────────────────────────── */

.btn-ripple {
    position:relative;
    overflow:hidden;
}
.btn-ripple .ripple-wave {
    position:absolute;
    border-radius:50%;
    background:rgba(255,255,255,.32);
    width:8px; height:8px;
    margin:-4px 0 0 -4px;
    animation:rippleOut .55s linear;
    pointer-events:none;
}

/* ── Card hover lift ─────────────────────────────────────────── */

.card-lift {
    transition:transform .25s cubic-bezier(.16,1,.3,1), box-shadow .25s !important;
    will-change:transform;
}
.card-lift:hover {
    transform:translateY(-5px) scale(1.015) !important;
    box-shadow:0 18px 42px rgba(0,0,0,.18) !important;
}

/* ── Gradient animated text ──────────────────────────────────── */

.text-gradient-anim {
    background:linear-gradient(270deg,#5e2b97,#fbbf24,#7d3bd3,#a78bfa,#5e2b97);
    background-size:300% 300%;
    -webkit-background-clip:text;
    -webkit-text-fill-color:transparent;
    background-clip:text;
    animation:gradientShift 4s ease infinite;
}

/* ── Animated gradient border ────────────────────────────────── */

.border-glow {
    border:2px solid transparent;
    background-clip:padding-box;
    animation:borderPulse 2.5s ease-in-out infinite;
}

/* ── Sidebar menu item transitions ───────────────────────────── */

.sidebar ul li { opacity:0; }
.sidebar ul li.sidebar-ready { animation:fadeInLeft .4s cubic-bezier(.16,1,.3,1) both; opacity:1; }

/* ── Orb decoration ──────────────────────────────────────────── */

.orb {
    position:absolute;
    border-radius:50%;
    filter:blur(55px);
    pointer-events:none;
    opacity:.6;
}
.orb-1 { animation:orbFloat1 9s ease-in-out infinite }
.orb-2 { animation:orbFloat2 11s ease-in-out infinite }
.orb-3 { animation:orbFloat3 7s ease-in-out infinite }

/* ── Number counter ──────────────────────────────────────────── */

.counter-val { animation:numberCount .6s cubic-bezier(.16,1,.3,1) both }

/* ── Page transition wrapper ─────────────────────────────────── */

.page-enter {
    animation:fadeInUp .5s cubic-bezier(.16,1,.3,1) both;
}
