/**
 * Luxe Pro — Animation Engine
 *
 * Scroll-reveal animations are applied via [data-anim] attributes,
 * triggered by IntersectionObserver in main.js (adds .is-visible).
 * Animation type, speed, and distance are controlled by CSS variables
 * the Customizer sets (--anim-speed, --anim-ease, --anim-distance).
 *
 * All animations respect prefers-reduced-motion.
 */

:root {
    --anim-distance: 30px;
    --anim-stagger: 0.08s;
}

/* ─── Base reveal state ───
   IMPORTANT: elements are ONLY hidden once JS confirms it's running by
   adding .luxe-js to <html>. If JS fails to load/run (cache, plugin
   conflict, error), the hide rule never applies and content stays
   visible. This prevents sections (stats, about, etc.) from vanishing
   on the live site. */
[data-anim] {
    transition:
        opacity var(--anim-speed) var(--anim-ease),
        transform var(--anim-speed) var(--anim-ease);
    will-change: opacity, transform;
}
.luxe-js [data-anim] {
    opacity: 0;
}
[data-anim].is-visible,
.luxe-js [data-anim].is-visible { opacity: 1; transform: none; }

/* Safety: if JS is present but the observer hasn't fired within a few
   seconds (edge cases), a failsafe class reveals everything. */
.luxe-anim-failsafe [data-anim] { opacity: 1 !important; transform: none !important; filter: none !important; }

/* ─── Reveal types ─── */
.luxe-js [data-anim="fade"]        { transform: none; }
.luxe-js [data-anim="fade-up"]     { transform: translateY(var(--anim-distance)); }
.luxe-js [data-anim="fade-down"]   { transform: translateY(calc(var(--anim-distance) * -1)); }
.luxe-js [data-anim="fade-left"]   { transform: translateX(var(--anim-distance)); }
.luxe-js [data-anim="fade-right"]  { transform: translateX(calc(var(--anim-distance) * -1)); }
.luxe-js [data-anim="zoom-in"]     { transform: scale(0.92); }
.luxe-js [data-anim="zoom-out"]    { transform: scale(1.08); }
.luxe-js [data-anim="blur-in"]     { filter: blur(12px); }
[data-anim="blur-in"].is-visible { filter: blur(0); }
[data-anim="rotate-in"]   { transform: rotate(-4deg) scale(0.96); }
[data-anim="flip-up"]     { transform: perspective(800px) rotateX(20deg); transform-origin: bottom; }

/* ─── Stagger children ─── */
[data-anim-stagger] > * {
    transition: opacity var(--anim-speed) var(--anim-ease), transform var(--anim-speed) var(--anim-ease);
}
.luxe-js [data-anim-stagger] > * {
    opacity: 0;
    transform: translateY(var(--anim-distance));
}
[data-anim-stagger].is-visible > * { opacity: 1; transform: none; }
[data-anim-stagger].is-visible > *:nth-child(1) { transition-delay: calc(var(--anim-stagger) * 1); }
[data-anim-stagger].is-visible > *:nth-child(2) { transition-delay: calc(var(--anim-stagger) * 2); }
[data-anim-stagger].is-visible > *:nth-child(3) { transition-delay: calc(var(--anim-stagger) * 3); }
[data-anim-stagger].is-visible > *:nth-child(4) { transition-delay: calc(var(--anim-stagger) * 4); }
[data-anim-stagger].is-visible > *:nth-child(5) { transition-delay: calc(var(--anim-stagger) * 5); }
[data-anim-stagger].is-visible > *:nth-child(6) { transition-delay: calc(var(--anim-stagger) * 6); }
[data-anim-stagger].is-visible > *:nth-child(7) { transition-delay: calc(var(--anim-stagger) * 7); }
[data-anim-stagger].is-visible > *:nth-child(8) { transition-delay: calc(var(--anim-stagger) * 8); }
[data-anim-stagger].is-visible > *:nth-child(9) { transition-delay: calc(var(--anim-stagger) * 9); }

/* ─── Continuous keyframe animations ─── */
@keyframes luxe-float {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-12px); }
}
@keyframes luxe-pulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: 0.55; }
}
@keyframes luxe-shimmer {
    0%   { background-position: -200% center; }
    100% { background-position: 200% center; }
}
@keyframes luxe-spin-slow {
    from { transform: rotate(0); }
    to   { transform: rotate(360deg); }
}
@keyframes luxe-bob {
    0%,100% { transform: translateY(0); }
    50%     { transform: translateY(6px); }
}

.luxe-float  { animation: luxe-float 5s ease-in-out infinite; }
.luxe-pulse  { animation: luxe-pulse 2.5s ease-in-out infinite; }

/* Gold shimmer text */
.luxe-shimmer-text {
    background: linear-gradient(90deg, var(--gold) 20%, var(--gold-light) 50%, var(--gold) 80%);
    background-size: 200% auto;
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    animation: luxe-shimmer 4s linear infinite;
}

/* ─── Hover lift / glow utility ─── */
.luxe-hover-lift { transition: transform var(--transition), box-shadow var(--transition); }
.luxe-hover-lift:hover { transform: translateY(-6px); box-shadow: 0 18px 40px rgba(0,0,0,0.4); }
.luxe-hover-glow { transition: box-shadow var(--transition); }
.luxe-hover-glow:hover { box-shadow: 0 0 30px rgba(201,169,110,0.3); }

/* ─── Scroll-down hint ─── */
.luxe-scroll-hint {
    position: absolute; bottom: 2rem; left: 50%; transform: translateX(-50%);
    width: 26px; height: 42px; border: 1px solid rgba(201,169,110,0.5);
    border-radius: 14px; display: flex; justify-content: center; padding-top: 8px;
}
.luxe-scroll-hint::before {
    content: ""; width: 3px; height: 8px; background: var(--gold);
    border-radius: 2px; animation: luxe-bob 1.6s ease-in-out infinite;
}

/* ─── Animated underline links ─── */
.luxe-underline { position: relative; }
.luxe-underline::after {
    content: ""; position: absolute; left: 0; bottom: -2px; width: 0; height: 1px;
    background: var(--gold); transition: width var(--transition);
}
.luxe-underline:hover::after { width: 100%; }

/* ─── Page-load fade (whole main) ─── */
.luxe-page-enter { animation: luxe-page-fade 0.8s var(--anim-ease) both; }
@keyframes luxe-page-fade {
    from { opacity: 0; transform: translateY(10px); }
    to   { opacity: 1; transform: none; }
}

/* ─── Reduced motion: disable everything ─── */
@media (prefers-reduced-motion: reduce) {
    [data-anim], [data-anim-stagger] > * { opacity: 1 !important; transform: none !important; filter: none !important; transition: none !important; }
    .luxe-float, .luxe-pulse, .luxe-shimmer-text, .luxe-page-enter { animation: none !important; }
    .luxe-scroll-hint::before { animation: none !important; }
}

/* ─── Animations OFF (Customizer global toggle adds body.luxe-anim-off) ─── */
body.luxe-anim-off [data-anim],
body.luxe-anim-off [data-anim-stagger] > * { opacity: 1 !important; transform: none !important; filter: none !important; transition: none !important; }
body.luxe-anim-off .luxe-float,
body.luxe-anim-off .luxe-pulse,
body.luxe-anim-off .luxe-shimmer-text { animation: none !important; }
