/* Clippe le débordement horizontal des slide-in. Sur #page (enfant non-scrollable) plutôt que html/body
   pour ne pas interférer avec le scroll natif iOS ni avec body.drawer-open { overflow:hidden } */
#page { overflow-x: clip; }

/* ── BASE ─────────────────────────────────────────────────────────────────── */
.ljp-animate {
    opacity: 0;
    transition: opacity 0.65s ease-out, transform 0.65s ease-out, filter 0.65s ease-out;
}
.ljp-animate.animated { opacity: 1; }

/* ── FADE IN : fondu simple, aucun déplacement ───────────────────────────── */
.ljp-animate.fade-in              { opacity: 0; }
.ljp-animate.fade-in.animated     { opacity: 1; }

/* ── SLIDE IN LEFT : arrive de la gauche ─────────────────────────────────── */
.ljp-animate.slide-in-left           { opacity: 0; transform: translateX(-90px); }
.ljp-animate.slide-in-left.animated  { opacity: 1; transform: translateX(0); }

/* ── SLIDE IN RIGHT : arrive de la droite ────────────────────────────────── */
.ljp-animate.slide-in-right           { opacity: 0; transform: translateX(90px); }
.ljp-animate.slide-in-right.animated  { opacity: 1; transform: translateX(0); }

/* ── SLIDE UP : arrive du bas, monte vers sa position ────────────────────── */
.ljp-animate.slide-up           { opacity: 0; transform: translateY(70px); }
.ljp-animate.slide-up.animated  { opacity: 1; transform: translateY(0); }

/* ── SLIDE DOWN : arrive du haut, descend vers sa position ──────────────── */
.ljp-animate.slide-down           { opacity: 0; transform: translateY(-70px); }
.ljp-animate.slide-down.animated  { opacity: 1; transform: translateY(0); }

/* ── SCALE UP : grossit légèrement depuis un peu plus petit ──────────────── */
.ljp-animate.scale-up           { opacity: 0; transform: scale(0.82); }
.ljp-animate.scale-up.animated  { opacity: 1; transform: scale(1); }

/* ── ZOOM IN : zoom plus dramatique depuis petit ─────────────────────────── */
.ljp-animate.zoom-in           { opacity: 0; transform: scale(0.65); }
.ljp-animate.zoom-in.animated  { opacity: 1; transform: scale(1); }

/* ── ROTATE IN : rotation + fade ─────────────────────────────────────────── */
.ljp-animate.rotate-in           { opacity: 0; transform: rotate(-12deg) scale(0.88); }
.ljp-animate.rotate-in.animated  { opacity: 1; transform: rotate(0deg) scale(1); }

/* ── BOUNCE IN : rebondit à l'arrivée (keyframe, pas de transition) ──────── */
@keyframes ljpBounceIn {
    0%   { opacity: 0; transform: scale(0.35); }
    55%  { opacity: 1; transform: scale(1.08); }
    78%  { transform: scale(0.95); }
    100% { opacity: 1; transform: scale(1); }
}
.ljp-animate.bounce-in           { opacity: 0; transform: scale(0.35); }
.ljp-animate.bounce-in.animated  {
    opacity: 1;
    transform: scale(1);
    animation: ljpBounceIn 0.7s cubic-bezier(0.215, 0.61, 0.355, 1) both;
    transition: none;
}

/* ── BLUR IN : flou → net ────────────────────────────────────────────────── */
.ljp-animate.blur-in           { opacity: 0; filter: blur(14px); transform: scale(1.03); }
.ljp-animate.blur-in.animated  { opacity: 1; filter: blur(0); transform: scale(1); }.ljp-stagger>*{opacity:0;transform:translateY(20px);transition:all 0.5s ease}.ljp-stagger.animated>*:nth-child(1){transition-delay:0.1s}.ljp-stagger.animated>*:nth-child(2){transition-delay:0.2s}.ljp-stagger.animated>*:nth-child(3){transition-delay:0.3s}.ljp-stagger.animated>*:nth-child(4){transition-delay:0.4s}.ljp-stagger.animated>*:nth-child(5){transition-delay:0.5s}.ljp-stagger.animated>*:nth-child(6){transition-delay:0.6s}.ljp-stagger.animated>*{opacity:1;transform:translateY(0)}.ljp-animate-delay-1{transition-delay:0.1s}.ljp-animate-delay-2{transition-delay:0.2s}.ljp-animate-delay-3{transition-delay:0.3s}.ljp-animate-delay-4{transition-delay:0.4s}.ljp-animate-delay-5{transition-delay:0.5s}.ljp-animate-fast{transition-duration:0.3s}.ljp-animate-normal{transition-duration:0.5s}.ljp-animate-slow{transition-duration:0.8s}.ljp-animate-slower{transition-duration:1.2s}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}@keyframes wiggle{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-3deg)}75%{transform:rotate(3deg)}}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-5px)}20%,40%,60%,80%{transform:translateX(5px)}}.ljp-float{animation:float 3s ease-in-out infinite}.ljp-pulse{animation:pulse 2s ease-in-out infinite}.ljp-wiggle{animation:wiggle 1s ease-in-out infinite}.ljp-shake:hover{animation:shake 0.5s ease-in-out}.ljp-hover-lift{transition:transform var(--ljp-transition-fast)}.ljp-hover-lift:hover{transform:translateY(-5px)}.ljp-hover-grow{transition:transform var(--ljp-transition-fast)}.ljp-hover-grow:hover{transform:scale(1.05)}.ljp-hover-shrink{transition:transform var(--ljp-transition-fast)}.ljp-hover-shrink:hover{transform:scale(0.95)}.ljp-hover-rotate{transition:transform var(--ljp-transition-fast)}.ljp-hover-rotate:hover{transform:rotate(5deg)}.ljp-hover-shadow{transition:box-shadow var(--ljp-transition-fast)}.ljp-hover-shadow:hover{box-shadow:0 10px 30px rgba(0,0,0,0.2)}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.ljp-spin{animation:spin 1s linear infinite}.ljp-parallax{background-attachment:fixed;background-position:center;background-repeat:no-repeat;background-size:cover}@media (prefers-reduced-motion:reduce){.ljp-animate,.ljp-animate *,.ljp-float,.ljp-pulse,.ljp-wiggle,.ljp-spin{animation:none !important;transition:none !important}}