/**
 * Booknetic for Theme V4 — Design System motion canonical.
 *
 * Keyframes are global (so prefix with --ds- in tokens, the actual @keyframes
 * names use the ds- prefix). Components reference them via utility classes
 * like .ds-anim-fade-up.
 *
 * Easings + durations live in ds-tokens-v4.css (--ds-ease-*, --ds-dur-*).
 *
 * Stagger:
 *   <li class="ds-anim-fade-up" style="--ds-i:3">…</li>
 *   → animation-delay = 3 × 60ms = 180ms
 */

/* ============================================================ */
/* KEYFRAMES                                                     */
/* ============================================================ */

@keyframes ds-fade-in        { from { opacity: 0; }                                   to { opacity: 1; } }
@keyframes ds-fade-out       { from { opacity: 1; }                                   to { opacity: 0; } }
@keyframes ds-fade-up        { from { opacity: 0; transform: translate3d(0, 12px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
@keyframes ds-fade-down      { from { opacity: 0; transform: translate3d(0, -12px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
@keyframes ds-fade-left      { from { opacity: 0; transform: translate3d(16px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
@keyframes ds-fade-right     { from { opacity: 0; transform: translate3d(-16px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
@keyframes ds-scale-in       { from { opacity: 0; transform: scale(0.96); }            to { opacity: 1; transform: scale(1); } }
@keyframes ds-scale-out      { from { opacity: 1; transform: scale(1); }               to { opacity: 0; transform: scale(0.96); } }
@keyframes ds-slide-up       { from { transform: translateY(100%); }                  to { transform: translateY(0); } }
@keyframes ds-slide-down     { from { transform: translateY(-100%); }                 to { transform: translateY(0); } }
@keyframes ds-shake          { 0%, 100% { transform: translate3d(0,0,0); } 20% { transform: translate3d(-4px,0,0); } 40% { transform: translate3d(4px,0,0); } 60% { transform: translate3d(-3px,0,0); } 80% { transform: translate3d(3px,0,0); } }
@keyframes ds-glow-pulse     { 0%, 100% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0.4); } 50% { box-shadow: 0 0 0 14px rgba(139, 92, 246, 0); } }
@keyframes ds-shimmer        { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
@keyframes ds-spin           { to { transform: rotate(360deg); } }
@keyframes ds-float          { 0%, 100% { transform: translate3d(0, 0, 0); } 50% { transform: translate3d(0, -8px, 0); } }
@keyframes ds-mesh-drift     { 0%, 100% { transform: translate3d(0, 0, 0); } 33% { transform: translate3d(2%, -1%, 0); } 66% { transform: translate3d(-1%, 2%, 0); } }
@keyframes ds-checkmark      { 0% { stroke-dashoffset: 24; opacity: 0; } 60% { opacity: 1; } 100% { stroke-dashoffset: 0; opacity: 1; } }
@keyframes ds-confetti-fall  { 0% { opacity: 0; transform: translate3d(0, -20px, 0) rotate(0deg); } 10% { opacity: 1; } 90% { opacity: 1; } 100% { opacity: 0; transform: translate3d(var(--ds-x, 0), 100vh, 0) rotate(720deg); } }

/* ============================================================ */
/* UTILITIES                                                     */
/* ============================================================ */

.ds-anim-fade-in       { animation: ds-fade-in     var(--ds-dur-base) var(--ds-ease-out) both; }
.ds-anim-fade-up       { animation: ds-fade-up     var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-fade-down     { animation: ds-fade-down   var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-fade-left     { animation: ds-fade-left   var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-fade-right    { animation: ds-fade-right  var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-scale-in      { animation: ds-scale-in    var(--ds-dur-base) var(--ds-ease-out) both; }
.ds-anim-slide-up      { animation: ds-slide-up    var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-slide-down    { animation: ds-slide-down  var(--ds-dur-slow) var(--ds-ease-out) both; }
.ds-anim-shake         { animation: ds-shake       var(--ds-dur-slow) ease-in-out; }
.ds-anim-glow-pulse    { animation: ds-glow-pulse  1.6s ease-out 1; }
.ds-anim-glow-loop     { animation: ds-glow-pulse  2.4s ease-out infinite; }
.ds-anim-float         { animation: ds-float       4.8s ease-in-out infinite; }
.ds-anim-mesh-drift    { animation: ds-mesh-drift  22s  ease-in-out infinite; }

/* Stagger via --ds-i (count from 0). Each step = 60ms. */
[style*="--ds-i"] { animation-delay: calc(var(--ds-i, 0) * 60ms); }

/* Common transitions (reusable in any component) */
.ds-tr-color     { transition: var(--ds-transition-color); }
.ds-tr-bg        { transition: var(--ds-transition-bg); }
.ds-tr-border    { transition: var(--ds-transition-border); }
.ds-tr-shadow    { transition: var(--ds-transition-shadow); }
.ds-tr-transform { transition: var(--ds-transition-transform); }
.ds-tr-all       { transition: var(--ds-transition-all); }

/* Spinner */
.ds-spinner {
	display: inline-block;
	width: 16px;
	height: 16px;
	border: 2px solid currentColor;
	border-right-color: transparent;
	border-radius: 50%;
	animation: ds-spin 720ms linear infinite;
}
.ds-spinner--sm { width: 12px; height: 12px; border-width: 1.5px; }
.ds-spinner--lg { width: 24px; height: 24px; border-width: 2.5px; }

/* Shimmer skeleton */
.ds-shimmer {
	background:
		linear-gradient(90deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.08) 50%, rgba(255, 255, 255, 0.03) 100%);
	background-size: 200% 100%;
	animation: ds-shimmer 1.6s linear infinite;
	border-radius: var(--ds-radius-md);
}

/* Animated checkmark (used in success states) */
.ds-check-stroke {
	stroke-dasharray: 24;
	stroke-dashoffset: 24;
	animation: ds-checkmark 600ms var(--ds-ease-out) 120ms forwards;
}

/* Hover micro-interactions (apply to any element) */
.ds-hover-lift     { transition: var(--ds-transition-transform), var(--ds-transition-shadow); }
.ds-hover-lift:hover { transform: translate3d(0, -2px, 0); box-shadow: var(--ds-shadow-lg); }

.ds-press          { transition: var(--ds-transition-transform); }
.ds-press:active   { transform: scale(0.97); }

/* ============================================================ */
/* REDUCED MOTION                                                */
/* ============================================================ */

@media (prefers-reduced-motion: reduce) {
	.ds-anim-fade-in,
	.ds-anim-fade-up,
	.ds-anim-fade-down,
	.ds-anim-fade-left,
	.ds-anim-fade-right,
	.ds-anim-scale-in,
	.ds-anim-slide-up,
	.ds-anim-slide-down,
	.ds-anim-shake,
	.ds-anim-glow-pulse,
	.ds-anim-glow-loop,
	.ds-anim-float,
	.ds-anim-mesh-drift,
	.ds-shimmer,
	.ds-spinner,
	.ds-check-stroke {
		animation: none !important;
	}
	.ds-tr-color, .ds-tr-bg, .ds-tr-border, .ds-tr-shadow, .ds-tr-transform, .ds-tr-all { transition: none !important; }
	.ds-hover-lift:hover { transform: none !important; }
}
