/* ============================================================================
 * V15 · Aurora Noir — Animations (keyframes + reveal utilities)
 * ==========================================================================*/

@keyframes v15-aurora-1 {
    0%   { transform: translate3d(0,0,0) rotate(0deg) scale(1); }
    100% { transform: translate3d(8%,6%,0) rotate(40deg) scale(1.15); }
}
@keyframes v15-aurora-2 {
    0%   { transform: translate3d(0,0,0) rotate(0deg) scale(1.05); }
    100% { transform: translate3d(-10%,-8%,0) rotate(-30deg) scale(1.2); }
}
@keyframes v15-shimmer  { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
@keyframes v15-border-flow { 0% { background-position: 0% 50%; } 100% { background-position: 200% 50%; } }
@keyframes v15-pop { 0% { opacity: 0; transform: translateX(-50%) scale(0.6); } 100% { opacity: 1; transform: translateX(-50%) scale(1); } }
@keyframes v15-ripple { to { transform: scale(2.6); opacity: 0; } }
@keyframes v15-float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
@keyframes v15-spin { to { transform: rotate(360deg); } }
@keyframes v15-pulse { 0%,100% { box-shadow: 0 0 0 0 rgba(var(--v15-a1-rgb),0.5); } 50% { box-shadow: 0 0 0 10px rgba(var(--v15-a1-rgb),0); } }
@keyframes v15-burst { 0% { box-shadow: 0 0 0 0 rgba(var(--v15-a1-rgb),0.5); } 100% { box-shadow: 0 0 0 70px rgba(var(--v15-a1-rgb),0); } }
@keyframes v15-rise { from { opacity: 0; transform: translate3d(0,18px,0); } to { opacity: 1; transform: none; } }
@keyframes v15-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes v15-scale-in { from { opacity: 0; transform: scale(0.92); } to { opacity: 1; transform: scale(1); } }
@keyframes v15-glow-breathe { 0%,100% { filter: drop-shadow(0 0 6px rgba(var(--v15-a1-rgb),0.4)); } 50% { filter: drop-shadow(0 0 16px rgba(var(--v15-a1-rgb),0.8)); } }

/* page-enter (applied to .v15-app)
 * NOTE: opacity-only on purpose. A lingering transform on .v15-app (even an
 * identity matrix from `transform:none` + fill-mode:both) makes it the
 * containing block for position:fixed descendants, which breaks the fixed
 * radial nav / service FAB (they anchor to .v15-app's content box instead of
 * the viewport and get pushed to the bottom of the page). Do NOT add transform
 * here — per-section rise is handled by .v15-reveal instead. */
.v15-app { animation: v15-fade 0.5s var(--v15-ease) both; }

/* reveal-on-scroll: hidden until JS adds .in */
.v15-reveal { opacity: 0; transform: translateY(20px); transition: opacity var(--v15-t-slow) var(--v15-ease), transform var(--v15-t-slow) var(--v15-ease); }
.v15-reveal.in { opacity: 1; transform: none; }
/* stagger via inline --i (set by ui.js) */
.v15-reveal { transition-delay: calc(var(--i, 0) * 60ms); }

/* utility animations */
.v15-float { animation: v15-float 4s ease-in-out infinite; }
.v15-spin  { animation: v15-spin 1s linear infinite; }
.v15-breathe { animation: v15-glow-breathe 2.6s ease-in-out infinite; }

/* count-up helper keeps layout stable */
.v15-count { font-variant-numeric: tabular-nums; }

/* ============================================================================
 * Hover micro-interactions — desktop (pointer:fine) only so touch never gets
 * stuck-hover. `.v15-app ` prefix lifts specificity above per-page :hover rules.
 * Mobile keeps the existing :active press feedback.
 * ==========================================================================*/
/* base transitions for tiles that lack a transform transition (smooth grow + shrink) */
.v15-app .home-promo a, .v15-app .home-quick .qc, .v15-app .home-quick .ql,
.v15-app .lt-row, .v15-app .mb-item, .v15-app .fb-type-btn, .v15-app .ac-stat,
.v15-app .pg-legal-row, .v15-app .bg-card {
    transition: transform var(--v15-t-mid) var(--v15-ease), box-shadow var(--v15-t-mid), border-color var(--v15-t-fast), color var(--v15-t-fast);
}

@media (hover: hover) and (pointer: fine) {
    /* glass cards — lift + grow + aurora glow */
    .v15-app .v15-card.tap:hover { transform: translateY(-4px) scale(1.015); box-shadow: var(--v15-shadow-2), 0 0 32px rgba(var(--v15-a2-rgb),0.22); }
    /* card cover-image zoom (cards that hold a media image) */
    .v15-app .v15-card.tap:hover .prod-card-media img,
    .v15-app .v15-card.tap:hover .od-hero-media img { transform: scale(1.07); }

    /* buttons grow + lift */
    .v15-app .v15-btn:hover { transform: translateY(-2px) scale(1.03); }
    .v15-app .v15-btn.sm:hover { transform: scale(1.05); }

    /* round icon buttons / avatars / FABs */
    .v15-app .v15-iconbtn:hover { transform: scale(1.12) rotate(-4deg); border-color: rgba(var(--v15-a1-rgb),0.5); }
    .v15-app .v15-avatar:hover { transform: scale(1.06); }
    .v15-app .v15-fab-service:hover { transform: scale(1.12); }

    /* chips + tabs */
    .v15-app .v15-chip:hover { transform: translateY(-1px) scale(1.05); }
    .v15-app .v15-tabs .tab:hover { transform: scale(1.06); }
    .v15-app .v15-tabs .tab:hover:not(.active) { color: var(--v15-txt); border-color: var(--v15-line-2); }

    /* list rows: slide + brighter surface (icon pop already in components.css) */
    .v15-app .v15-row:hover { background: var(--v15-surface-2); transform: translateX(3px); }

    /* home quick-action circles — pop up + glow */
    .v15-app .home-quick a:hover .qc { transform: translateY(-4px) scale(1.12); box-shadow: 0 10px 22px rgba(var(--v15-a1-rgb),0.32); border-color: rgba(var(--v15-a1-rgb),0.6); }
    .v15-app .home-quick a:hover .ql { color: var(--v15-txt); }

    /* generic tiles across all pages — lift + subtle grow + edge highlight */
    .v15-app .home-promo a:hover, .v15-app .pg-action:hover, .v15-app .iv-team:hover,
    .v15-app .tm-tier:hover, .v15-app .vp-tier:hover, .v15-app .nt-item:hover,
    .v15-app .ml-item:hover, .v15-app .rec-card:hover, .v15-app .fund-sel-item:hover,
    .v15-app .tk-task:hover, .v15-app .ac-link:hover, .v15-app .lt-row:hover,
    .v15-app .mb-item:hover, .v15-app .fb-type-btn:hover, .v15-app .fb-ticket:hover,
    .v15-app .ac-stat:hover, .v15-app .bg-card:hover {
        transform: translateY(-3px) scale(1.012);
        border-color: var(--v15-line-2);
    }

    /* lottery wheel cells pop on hover */
    .v15-app .lt-cell:not(.center):hover { transform: scale(1.06); border-color: rgba(var(--v15-a1-rgb),0.6); }

    /* "more" links / arrows nudge */
    .v15-app .v15-more:hover, .v15-app .my-asset-more:hover { transform: translateX(3px); }

    /* opt-in helper class for any element */
    .v15-hover-grow { transition: transform var(--v15-t-fast) var(--v15-ease); }
    .v15-hover-grow:hover { transform: scale(1.06); }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; }
    .v15-reveal { opacity: 1 !important; transform: none !important; }
    .v15-aurora-bg::before, .v15-aurora-bg::after { animation: none !important; }
}
