/* ============================================================
   DARIX CRM — ANIMATIONS
   Classes utilitaires pour GSAP.
   Ces classes définissent l'ÉTAT INITIAL (hidden).
   GSAP se chargera de les animer vers leur état final.
   Ne PAS utiliser de transition CSS sur ces éléments
   (GSAP gère tout).
   ============================================================ */

/* ── État initial : fade + montée ─────────────────────────── */
.reveal-up {
  opacity: 0;
  transform: translateY(40px);
  /* GSAP animera vers opacity:1, translateY(0) */
}

/* ── État initial : fade simple ───────────────────────────── */
.reveal-in {
  opacity: 0;
  /* GSAP animera vers opacity:1 */
}

/* ── Wrapper pour SplitText par lignes ────────────────────── */
.split-line {
  overflow: hidden;
  /* Chaque ligne générée par SplitText sera cachée derrière */
}

/* ── Parallax ─────────────────────────────────────────────── */
.parallax {
  will-change: transform;
  /* GSAP gère la valeur via ScrollTrigger scrub */
}

/* ── Sélecteur générique data-attribute ───────────────────── */
[data-animate] {
  opacity: 0;
}

/* ── Magnetic button (reset transform pour quickTo) ───────── */
.magnetic {
  display: inline-block; /* nécessaire pour transform */
  will-change: transform;
}

/* ── Carte avec hover géré par GSAP (pas CSS) ─────────────── */
[data-hover-card] {
  will-change: transform;
}

/* ── Stagger target (enfants d'un container) ──────────────── */
[data-stagger] > * {
  opacity: 0;
  transform: translateY(24px);
}

/* ── Prefers-reduced-motion override ──────────────────────── */
/* GSAP matchMedia() gère la logique JS,
   mais on garde ce CSS en filet de sécurité */
@media (prefers-reduced-motion: reduce) {
  .reveal-up,
  .reveal-in,
  [data-animate],
  [data-stagger] > * {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }

  .parallax {
    will-change: auto;
  }
}
