react-animate-z 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/animation/durations.ts","../src/key-frames/attention.tsx","../src/key-frames/blur.tsx","../src/key-frames/bounce.tsx","../src/key-frames/fade.tsx","../src/key-frames/index.ts","../src/key-frames/textEffects.tsx","../src/key-frames/flash.tsx","../src/key-frames/float.tsx","../src/key-frames/glowing.tsx","../src/key-frames/jelly.tsx","../src/key-frames/motion.tsx","../src/key-frames/pulse.tsx","../src/key-frames/squeezeShake.tsx","../src/key-frames/slide.tsx","../src/key-frames/flip.tsx","../src/key-frames/fold.tsx","../src/key-frames/hangOn.tsx","../src/key-frames/zoom.tsx","../src/key-frames/rotate.tsx","../src/key-frames/funMap.tsx","../src/key-frames/pop.tsx","../src/core/injectKeyframe.ts","../src/core/createAnimate.ts","../src/animation/types.ts","../src/components/AnimateStyled.ts","../src/components/Animate.tsx","../src/components/AnimateGroup.tsx","../src/components/AnimateHost.tsx","../src/animation/sequence.ts","../src/hooks/useAnimate.ts","../src/components/AnimatePresence.tsx","../src/components/WrapperAnimate.tsx","../src/components/Typing.tsx","../src/hooks/useAttention.ts","../src/hooks/useTypingAnimate.ts","../src/hooks/useRecipe.ts","../src/index.ts","../src/components/AnimateOn.tsx","../src/components/TypingText.tsx","../src/hooks/useAnimateController.ts","../src/core/recipe.ts","../src/hooks/useAnimateSequence.ts","../src/hooks/useAutoAnimate.ts","../src/hooks/useFocusAnimate.ts","../src/hooks/useHoverAnimate.ts","../src/hooks/usePairedAnimate.ts","../src/hooks/useRandomAnimate.ts","../src/hooks/useRandomAnimateByIntensity.ts","../src/hooks/useRandomAnimateNoRepeat.ts","../src/hooks/useWeightedRandomAnimate.ts"],"sourcesContent":["export const defaultDurationMap = {\n bounce: '1s',\n bounceIn: '1s',\n bounceOut: '1s',\n bounceElastic: '1.2s',\n bounceSmall: '0.8s',\n bounceRotate: '1s',\n bounceJelly: '1.2s',\n jelly: '1s',\n jellyX: '1s',\n jellyY: '1s',\n jellyIn: '1s',\n jellyOut: '1s',\n shakeMix: '0.8s',\n shakeHorizontal: '0.8s',\n shakeVertical: '0.8s',\n shakeDiagonal: '0.8s',\n shakeQuick: '0.5s',\n pulse: '1s',\n pulseInOut: '1.2s',\n pulseFade: '1.2s',\n pulseFast: '0.6s',\n pulseColor: '1.2s',\n heartBeat: '1.3s',\n\n float: '2s',\n floatSway: '2.5s',\n floatHorizontal: '2.5s',\n floatCircular: '3s',\n floatWiggle: '2s',\n orbit: '3s',\n orbitEllipse: '3s',\n\n flash: '0.8s',\n flashIrregular: '1.2s',\n flashFast: '0.5s',\n flashSlow: '1.5s',\n flashPulse: '1s',\n glow: '1.5s',\n glowTextFlicker: '2s',\n glowRainbow: '3s',\n glowBreathing: '2.5s',\n glowGlitch: '1.2s',\n\n blurIn: '0.8s',\n blurOut: '0.8s',\n fadeIn: '0.8s',\n fadeOut: '0.8s',\n\n slideInFromLeft: '0.8s',\n slideInFromRight: '0.8s',\n slideOutToLeft: '0.8s',\n slideOutToRight: '0.8s',\n\n zoomIn: '1s',\n zoomOut: '1s',\n\n spin: '2s',\n spin3D: '2.5s',\n\n flip: '1s',\n flipIn: '1s',\n flipOut: '1s',\n\n typing: '2s',\n typingLoop: '2.5s',\n typeWriter: '3s',\n typeDelete: '1.5s',\n\n swing: '1s',\n tada: '1s',\n hinge: '2s',\n} as const;\n","const rubberBand = `\n from { transform: scale3d(1,1,1); }\n 30% { transform: scale3d(1.25,.75,1); }\n 40% { transform: scale3d(.75,1.25,1); }\n 50% { transform: scale3d(1.15,.85,1); }\n 65% { transform: scale3d(.95,1.05,1); }\n 75% { transform: scale3d(1.05,.95,1); }\n to { transform: scale3d(1,1,1); }\n`;\n\nconst jello = `\n from, 11.1%, to { transform: none; }\n 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg) scale3d(1,1,1); }\n 33.3% { transform: skewX(6.25deg) skewY(6.25deg) scale3d(1,1,1); }\n 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg) scale3d(1,1,1); }\n 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg) scale3d(1,1,1); }\n 66.6% { transform: skewX(-.78125deg) skewY(-.78125deg) scale3d(1,1,1); }\n 77.7% { transform: skewX(.390625deg) skewY(.390625deg) scale3d(1,1,1); }\n 88.8% { transform: skewX(-.1953125deg) skewY(-.1953125deg) scale3d(1,1,1); }\n`;\n\nconst wobble = `\n from { transform: translate3d(0,0,0) scale3d(1,1,1); }\n 15% { transform: translate3d(-25%,0,0) rotate(-5deg) scale3d(1,1,1); }\n 30% { transform: translate3d(20%,0,0) rotate(3deg) scale3d(1,1,1); }\n 45% { transform: translate3d(-15%,0,0) rotate(-3deg) scale3d(1,1,1); }\n 60% { transform: translate3d(10%,0,0) rotate(2deg) scale3d(1,1,1); }\n 75% { transform: translate3d(-5%,0,0) rotate(-1deg) scale3d(1,1,1); }\n to { transform: translate3d(0,0,0) scale3d(1,1,1); }\n`;\n\nconst rollIn = `\n from { opacity: 0; transform: translate3d(-100%,0,0) rotate(-120deg) scale3d(1,1,1); }\n to { opacity: 1; transform: translate3d(0,0,0) rotate(0deg) scale3d(1,1,1); }\n`;\n\nconst jackInTheBox = `\n from { opacity: 0; transform: scale3d(.1,.1,.1) rotate(30deg); transform-origin: center bottom; }\n 50% { transform: rotate(-10deg) scale3d(.5,.5,.5); }\n 70% { transform: rotate(3deg) scale3d(.8,.8,.8); }\n to { opacity: 1; transform: scale3d(1,1,1); }\n`;\n\nexport const attentionMap = {\n rubberBand,\n jello,\n wobble,\n rollIn,\n jackInTheBox,\n};\n","/* =====================\n BLUR IN (appear effects)\n===================== */\n\n// Basic – blurred → sharp\nconst blurIn = `\n from { filter: blur(5px); opacity: 0; }\n to { filter: blur(0); opacity: 1; }\n`;\n\n// Zoom In – scale up slightly while fading in\nconst blurInZoom = `\n from { opacity: 0; transform: scale(0.9); filter: blur(6px); }\n to { opacity: 1; transform: scale(1); filter: blur(0); }\n`;\n\n// Scale Down – starts larger, settles to normal\nconst blurInScale = `\n from { opacity: 0; transform: scale(1.1); filter: blur(6px); }\n to { opacity: 1; transform: scale(1); filter: blur(0); }\n`;\n\n// Move Up – slide from bottom + sharpen\nconst blurInUp = `\n from { opacity: 0; transform: translateY(40px); filter: blur(6px); }\n to { opacity: 1; transform: translateY(0); filter: blur(0); }\n`;\n\n// Rotate – rotate slightly while appearing\nconst blurInRotate = `\n from { opacity: 0; transform: rotate(-10deg) scale(0.95); filter: blur(6px); }\n to { opacity: 1; transform: rotate(0deg) scale(1); filter: blur(0); }\n`;\n\n/* =====================\n BLUR OUT (disappear effects)\n===================== */\n\n// Basic – sharp → blurred\nconst blurOut = `\n from { filter: blur(0); opacity: 1; }\n to { filter: blur(6px); opacity: 0; }\n`;\n\n// Zoom Out – scale down while fading out\nconst blurOutZoom = `\n from { opacity: 1; transform: scale(1); filter: blur(0); }\n to { opacity: 0; transform: scale(0.9); filter: blur(6px); }\n`;\n\n// Scale Up – grows slightly while vanishing\nconst blurOutScale = `\n from { opacity: 1; transform: scale(1); filter: blur(0); }\n to { opacity: 0; transform: scale(1.1); filter: blur(6px); }\n`;\n\n// Move Down – slide down + blur out\nconst blurOutDown = `\n from { opacity: 1; transform: translateY(0); filter: blur(0); }\n to { opacity: 0; transform: translateY(40px); filter: blur(6px); }\n`;\n\n// Rotate – rotate slightly while fading out\nconst blurOutRotate = `\n from { opacity: 1; transform: rotate(0deg) scale(1); filter: blur(0); }\n to { opacity: 0; transform: rotate(10deg) scale(0.95); filter: blur(6px); }\n`;\n\nexport const blurMap = {\n // In\n blurIn,\n blurInZoom,\n blurInScale,\n blurInUp,\n blurInRotate,\n\n // Out\n blurOut,\n blurOutZoom,\n blurOutScale,\n blurOutDown,\n blurOutRotate,\n};\n","// 1. Classic Bounce\nconst bounce = `\n 0%, 20%, 50%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-30px); }\n 60% { transform: translateY(-15px); }\n`;\n\nconst bounceIn = `\n 0% { opacity: 0; transform: scale(.3); }\n 50% { opacity: 1; transform: scale(1.05); }\n 70% { transform: scale(.9); }\n 100% { transform: scale(1); }\n`;\nconst bounceOut = `\n 20% { transform: scale(.9); }\n 50%, 55% { opacity: 1; transform: scale(1.1); }\n to { opacity: 0; transform: scale(.3); }\n`;\n\n// 2. Elastic Bounce\nconst bounceElastic = `\n 10% { transform: scaleY(0.9) translateY(5%); }\n 45% { transform: scaleY(1.2) translateY(-100%); }\n 65% { transform: scaleY(0.95) translateY(0); }\n 75% { transform: scaleY(1.05) translateY(-25%); }\n 85%, 100% { transform: scaleY(1) translateY(0); }\n`;\n\n// 3. Small Bounce\nconst bounceSmall = `\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-6px); }\n`;\n\n// 4. Rotate Bounce\nconst bounceRotate = `\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 40% { transform: translateY(-20px) rotate(-5deg); }\n 60% { transform: translateY(-10px) rotate(5deg); }\n`;\n\n// 5. Jelly Bounce\nconst bounceJelly = `\n 0%, 100% { transform: scale(1, 1); }\n 30% { transform: scale(1.25, 0.75); }\n 40% { transform: scale(0.75, 1.25); }\n 50% { transform: scale(1.15, 0.85); }\n 65% { transform: scale(0.95, 1.05); }\n 75% { transform: scale(1.05, 0.95); }\n`;\n\n// 6. Side Bounce\nconst bounceSide = `\n 0%, 100% { transform: translateX(0); }\n 30% { transform: translateX(-20px); }\n 60% { transform: translateX(15px); }\n`;\n\n// 7. Diagonal Bounce\nconst bounceDiagonal = `\n 0%, 100% { transform: translate(0,0); }\n 30% { transform: translate(-15px,-20px); }\n 60% { transform: translate(12px,15px); }\n`;\n\n// 8. Flip Bounce\nconst bounceFlip = `\n 0% { transform: translateY(0) rotateY(0deg); }\n 40% { transform: translateY(-25px) rotateY(180deg); }\n 70% { transform: translateY(-10px) rotateY(360deg); }\n 100% { transform: translateY(0) rotateY(360deg); }\n`;\n\n// 9. Bounce Fade\nconst bounceFade = `\n 0% { opacity: 0; transform: translateY(0); }\n 40% { opacity: 1; transform: translateY(-20px); }\n 70% { transform: translateY(-10px); }\n 100% { opacity: 0; transform: translateY(0); }\n`;\n\n// 10. Crazy Bounce\nconst bounceCrazy = `\n 0% { transform: translateY(0); }\n 20% { transform: translateY(-25px) rotate(-5deg); }\n 40% { transform: translateY(15px) rotate(5deg); }\n 60% { transform: translateY(-20px) rotate(-8deg); }\n 80% { transform: translateY(10px) rotate(6deg); }\n 100% { transform: translateY(0) rotate(0); }\n`;\n\n// 1. Bounce Glow\nconst bounceGlow = `\n 0%, 100% { transform: translateY(0); box-shadow: 0 0 0px rgba(255, 255, 0, 0); }\n 40% { transform: translateY(-20px); box-shadow: 0 0 20px rgba(255, 255, 0, 0.8); }\n 60% { transform: translateY(-10px); box-shadow: 0 0 10px rgba(255, 255, 0, 0.6); }\n`;\n\n// 2. Bounce Fade Scale\nconst bounceFadeScale = `\n 0% { opacity: 0; transform: scale(0.5) translateY(0); }\n 40% { opacity: 1; transform: scale(1.2) translateY(-25px); }\n 70% { opacity: 0.8; transform: scale(0.9) translateY(-10px); }\n 100% { opacity: 0; transform: scale(0.5) translateY(0); }\n`;\n\n// 3. Bounce Sparkle\nconst bounceSparkle = `\n 0% { transform: translateY(0) scale(1); filter: brightness(1); }\n 30% { transform: translateY(-20px) scale(1.2); filter: brightness(1.6); }\n 60% { transform: translateY(-10px) scale(0.9); filter: brightness(1.2); }\n 100% { transform: translateY(0) scale(1); filter: brightness(1); }\n`;\n\n// 4. Bounce Rainbow\nconst bounceRainbow = `\n 0% { transform: translateY(0); color: red; }\n 25% { transform: translateY(-20px); color: orange; }\n 50% { transform: translateY(-10px); color: yellow; }\n 75% { transform: translateY(-15px); color: green; }\n 100% { transform: translateY(0); color: blue; }\n`;\n\nexport const bounceMap = {\n bounce,\n bounceIn,\n bounceOut,\n bounceElastic,\n bounceSmall,\n bounceRotate,\n bounceJelly,\n bounceSide,\n bounceDiagonal,\n bounceFlip,\n bounceFade,\n bounceCrazy,\n bounceGlow,\n bounceFadeScale,\n bounceSparkle,\n bounceRainbow,\n};\n","// --- Basic ---\nconst fadeIn = `\n from { opacity: 0; }\n to { opacity: 1; }\n`;\nconst fadeOut = `\n from { opacity: 1; }\n to { opacity: 0; }\n`;\n\n// --- Directional ---\nconst fadeInFromLeft = `\n from { opacity: 0; transform: translateX(-100%); }\n to { opacity: 1; transform: translateX(0); }\n`;\nconst fadeInFromRight = `\n from { opacity: 0; transform: translateX(100%); }\n to { opacity: 1; transform: translateX(0); }\n`;\nconst fadeInFromTop = `\n from { opacity: 0; transform: translateY(-100%); }\n to { opacity: 1; transform: translateY(0); }\n`;\nconst fadeInFromBottom = `\n from { opacity: 0; transform: translateY(100%); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\nconst fadeOutToLeft = `\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(-100%); }\n`;\nconst fadeOutToRight = `\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(100%); }\n`;\nconst fadeOutToTop = `\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(-100%); }\n`;\nconst fadeOutToBottom = `\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(100%); }\n`;\n\n// --- Scale ---\nconst fadeInZoom = `\n from { opacity: 0; transform: scale(0.5); }\n to { opacity: 1; transform: scale(1); }\n`;\nconst fadeOutZoom = `\n from { opacity: 1; transform: scale(1); }\n to { opacity: 0; transform: scale(0.5); }\n`;\n\n// --- Rotate ---\nconst fadeInRotate = `\n from { opacity: 0; transform: rotate(-45deg); }\n to { opacity: 1; transform: rotate(0); }\n`;\nconst fadeOutRotate = `\n from { opacity: 1; transform: rotate(0); }\n to { opacity: 0; transform: rotate(45deg); }\n`;\n\n// --- Skew ---\nconst fadeInSkew = `\n from { opacity: 0; transform: skewX(-30deg); }\n to { opacity: 1; transform: skewX(0); }\n`;\nconst fadeOutSkew = `\n from { opacity: 1; transform: skewX(0); }\n to { opacity: 0; transform: skewX(30deg); }\n`;\n\n// --- Flip (3D) ---\nconst fadeInFlipX = `\n from { opacity: 0; transform: rotateX(90deg); }\n to { opacity: 1; transform: rotateX(0); }\n`;\n\nconst fadeOutFlipX = `\n from { opacity: 1; transform: rotateX(0); }\n to { opacity: 0; transform: rotateX(-90deg); }\n`;\nconst fadeInFlipY = `\n from { opacity: 0; transform: rotateY(90deg); }\n to { opacity: 1; transform: rotateY(0); }\n`;\nconst fadeOutFlipY = `\n from { opacity: 1; transform: rotateY(0); }\n to { opacity: 0; transform: rotateY(-90deg); }\n`;\n\n// --- Perspective (3D depth) ---\nconst fadeInPerspective = `\n from { opacity: 0; transform: perspective(400px) translateZ(-200px); }\n to { opacity: 1; transform: perspective(400px) translateZ(0); }\n`;\nconst fadeOutPerspective = `\n from { opacity: 1; transform: perspective(400px) translateZ(0); }\n to { opacity: 0; transform: perspective(400px) translateZ(-200px); }\n`;\n\n// --- Fade with Blur ---\nconst fadeInBlur = `\n from { opacity: 0; filter: blur(10px); }\n to { opacity: 1; filter: blur(0); }\n`;\nconst fadeOutBlur = `\n from { opacity: 1; filter: blur(0); }\n to { opacity: 0; filter: blur(10px); }\n`;\n\n// --- Fade with Color Shift ---\nconst fadeInColor = `\n from { opacity: 0; filter: hue-rotate(180deg); }\n to { opacity: 1; filter: hue-rotate(0); }\n`;\nconst fadeOutColor = `\n from { opacity: 1; filter: hue-rotate(0); }\n to { opacity: 0; filter: hue-rotate(180deg); }\n`;\n\n// --- Fade Pulse (loopable) ---\nconst fadePulse = `\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n`;\n\n// --- Fade Bounce ---\nconst fadeBounce = `\n 0% { opacity: 0; transform: translateY(20px); }\n 50% { opacity: 1; transform: translateY(-10px); }\n 70% { transform: translateY(5px); }\n 100% { transform: translateY(0); }\n`;\n\n// --- Fade Swing (like pendulum) ---\nconst fadeSwing = `\n 0% { opacity: 0; transform: rotate(15deg); }\n 50% { opacity: 1; transform: rotate(-15deg); }\n 100% { opacity: 1; transform: rotate(0deg); }\n`;\n\n// --- Fade Zoom Rotate ---\nconst fadeZoomRotate = `\n from { opacity: 0; transform: scale(0.5) rotate(-180deg); }\n to { opacity: 1; transform: scale(1) rotate(0); }\n`;\n\n// --- Fade Elastic ---\nconst fadeElastic = `\n 0% { opacity: 0; transform: scale(0.5); }\n 60% { opacity: 1; transform: scale(1.2); }\n 80% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n// --- Fade Shine (gradient wipe) ---\nconst fadeShine = `\n 0% { opacity: 0; background-position: -200%; }\n 100% { opacity: 1; background-position: 200%; }\n`;\n\n// ================== Map ==================\nexport const fadeMap = {\n // Basic\n fadeIn,\n fadeOut,\n\n // Direction\n fadeInFromLeft,\n fadeInFromRight,\n fadeInFromTop,\n fadeInFromBottom,\n fadeOutToLeft,\n fadeOutToRight,\n fadeOutToTop,\n fadeOutToBottom,\n\n // Aliases (DX)\n fadeInUp: fadeInFromBottom,\n fadeInDown: fadeInFromTop,\n fadeInLeft: fadeInFromRight,\n fadeInRight: fadeInFromLeft,\n\n // Scale\n fadeInZoom,\n fadeOutZoom,\n\n // Rotate\n fadeInRotate,\n fadeOutRotate,\n\n // Skew\n fadeInSkew,\n fadeOutSkew,\n\n // Flip\n fadeInFlipX,\n fadeOutFlipX,\n fadeInFlipY,\n fadeOutFlipY,\n\n // Perspective\n fadeInPerspective,\n fadeOutPerspective,\n\n // Blur\n fadeInBlur,\n fadeOutBlur,\n\n // Color\n fadeInColor,\n fadeOutColor,\n\n // Pulse & Bounce\n fadePulse,\n fadeBounce,\n\n // Swing\n fadeSwing,\n\n // Zoom + Rotate\n fadeZoomRotate,\n\n // Elastic\n fadeElastic,\n\n // Shine\n fadeShine,\n};\n","import { attentionMap } from './attention';\nimport { blurMap } from './blur';\nimport { bounceMap } from './bounce';\nimport { fadeMap } from './fade';\nimport { flashMap } from './flash';\nimport { flipMap } from './flip';\nimport { floatMap } from './float';\nimport { foldMap } from './fold';\nimport { funMap } from './funMap';\nimport { glowMap } from './glowing';\nimport { hangOnMap } from './hangOn';\nimport { jellyMap } from './jelly';\nimport { motionMap } from './motion';\nimport { popMap } from './pop';\nimport { pulseMap } from './pulse';\nimport { rotateMap } from './rotate';\nimport { slideMap } from './slide';\nimport { squeezeShakeMap } from './squeezeShake';\nimport { textEffectsMap } from './textEffects';\nimport { zoomMap } from './zoom';\n\n/* =========================\n Frames Map (internal)\n========================= */\nexport const animFramesMaps = {\n ...bounceMap,\n ...textEffectsMap,\n ...blurMap,\n ...flashMap,\n ...floatMap,\n ...glowMap,\n ...jellyMap,\n ...motionMap,\n ...pulseMap,\n ...fadeMap,\n ...squeezeShakeMap,\n ...slideMap,\n ...flipMap,\n ...foldMap,\n ...hangOnMap,\n ...zoomMap,\n ...rotateMap,\n ...funMap,\n ...popMap,\n ...attentionMap,\n} as const;\n\n/* =========================\n Public Types\n========================= */\nexport type AnimName = keyof typeof animFramesMaps;\n\n/* =========================\n Names\n========================= */\nexport const animNames = Object.keys(animFramesMaps) as AnimName[];\n\n/* =========================\n Timing\n========================= */\nexport const timingMap = {\n linear: 'linear',\n ease: 'ease',\n easeIn: 'ease-in',\n 'ease-in': 'ease-in',\n easeOut: 'ease-out',\n 'ease-out': 'ease-out',\n easeInOut: 'ease-in-out',\n 'ease-in-out': 'ease-in-out',\n} as const;\n\nexport type TypeTimingKey = keyof typeof timingMap;\n\n/* =========================\n Groups\n========================= */\nconst groupConfig = [\n { name: '🎾 Bounce', key: 'bounce', prefix: 'bounce' },\n { name: '✨ Text / Glow Effects', key: 'text', prefix: 'effect' },\n { name: '🌫 Blur', key: 'blur', prefix: 'blur' },\n { name: '⚡ Flash', key: 'flash', prefix: 'flash' },\n { name: '🎈 Float', key: 'float', prefix: 'float' },\n { name: '💡 Glow', key: 'glow', prefix: 'glow' },\n { name: '🍮 Jelly', key: 'jelly', prefix: 'jelly' },\n { name: '🌑 Shadow / Spin / Swing / Orbit', key: 'motion', prefix: '' },\n { name: '💓 Pulse', key: 'pulse', prefix: 'pulse' },\n { name: '🌫 Fade', key: 'fade', prefix: 'fade' },\n { name: '🤯 Squeeze / Shake', key: 'shake', prefix: 'shake' },\n { name: '📥 Slide', key: 'slide', prefix: 'slide' },\n { name: '🔄 Flip', key: 'flip', prefix: 'flip' },\n { name: '📂 Fold / Unfold', key: 'fold', prefix: 'fold' },\n { name: '🪝 Hang On', key: 'hangOn', prefix: 'hangOn' },\n { name: '🔍 Zoom', key: 'zoom', prefix: 'zoom' },\n { name: '🌀 Rotate', key: 'rotate', prefix: 'rotate' },\n { name: '🎉 Fun / Attention', key: 'fun', prefix: '' },\n] as const;\n\ntype GroupKey = (typeof groupConfig)[number]['key'];\n\nexport const animGroups: Record<GroupKey, AnimName[]> =\n Object.fromEntries(\n groupConfig.map(({ key, prefix }) => {\n const items = animNames.filter((name) =>\n prefix ? name.startsWith(prefix) : true\n );\n return [key, items];\n })\n ) as Record<GroupKey, AnimName[]>;\n","/** 1. 3D Depth (stacked shadow) */\nconst effect3D = `\n to {\n text-shadow:\n 0 1px 0 #ccc,\n 0 2px 0 #c9c9c9,\n 0 3px 0 #bbb,\n 0 4px 0 #b9b9b9,\n 0 5px 0 #aaa,\n 0 6px 1px rgba(0, 0, 0, .1),\n 0 0 5px rgba(0, 0, 0, .1),\n 0 1px 3px rgba(0, 0, 0, .3),\n 0 3px 5px rgba(0, 0, 0, .2),\n 0 5px 10px rgba(0, 0, 0, .25);\n }\n`;\n\n/** 2. Neon Glow */\nconst neonGlow = `\n from { text-shadow: none; }\n to {\n text-shadow:\n 0 0 5px #0ff,\n 0 0 10px #0ff,\n 0 0 20px #0ff,\n 0 0 40px #0ff,\n 0 0 80px #0ff;\n color: #fff;\n }\n`;\n\n/** 3. Retro 3D */\nconst retro3D = `\n to {\n text-shadow:\n 2px 2px 0 #ff0040,\n 4px 4px 0 #00ffd5,\n 6px 6px 0 #000;\n }\n`;\n\n/** 4. Emboss */\nconst emboss = `\n to {\n text-shadow:\n -1px -1px 1px #fff,\n 1px 1px 2px rgba(0,0,0,0.6);\n color: #555;\n }\n`;\n\n/** 5. Fire Glow */\nconst fireGlow = `\n 0%, 100% {\n text-shadow:\n 0 0 5px #ff6600,\n 0 0 10px #ff3300,\n 0 0 20px #ff0000;\n }\n 50% {\n text-shadow:\n 0 0 10px #ff9933,\n 0 0 20px #ff6600,\n 0 0 30px #ff3300;\n }\n`;\n\n/** 6. Ice Glow */\nconst iceGlow = `\n to {\n text-shadow:\n 0 0 5px #66ccff,\n 0 0 10px #33ccff,\n 0 0 20px #00aaff,\n 0 0 40px #0099ff;\n color: #e6f9ff;\n }\n`;\n\n/* 7. Shine */\nconst shine = `\n 0% { background-position: -200%; }\n 100% { background-position: 200%; }\n`;\n\nexport const textEffectsMap = {\n effect3D,\n neonGlow,\n retro3D,\n emboss,\n fireGlow,\n iceGlow,\n shine,\n};\n","// Classic flash - even blink\nconst flash = `\n 0%, 50%, 100% { opacity: 1; }\n 25%, 75% { opacity: 0; }\n`;\n\n// Irregular flash - uneven blink\nconst flashIrregular = `\n 0%, 40%, 80% { opacity: 1; }\n 20%, 60%, 100% { opacity: 0; }\n`;\n\n// Fast flash - quicker blink\nconst flashFast = `\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n`;\n\n// Slow flash - long fade in/out\nconst flashSlow = `\n 0% { opacity: 1; }\n 45% { opacity: 0; }\n 55% { opacity: 0; }\n 100% { opacity: 1; }\n`;\n\n// Pulse flash - smooth opacity transition\nconst flashPulse = `\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n`;\n\n// Glow flash - opacity + scale\nconst flashGlow = `\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.4; transform: scale(1.05); }\n`;\n\n// Color flash - opacity + hue\nconst flashColor = `\n 0%, 100% { opacity: 1; filter: hue-rotate(0deg); }\n 50% { opacity: 0.2; filter: hue-rotate(180deg); }\n`;\n\n// Strobe flash - rapid blinking\nconst flashStrobe = `\n 0%, 20%, 40%, 60%, 80%, 100% { opacity: 1; }\n 10%, 30%, 50%, 70%, 90% { opacity: 0; }\n`;\n\n// Soft flash - gentle fade in/out\nconst flashSoft = `\n 0% { opacity: 1; }\n 50% { opacity: 0.6; }\n 100% { opacity: 1; }\n`;\n\n// Reverse pulse - fade strong then dim\nconst flashReversePulse = `\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n`;\n\n// Export map for easy use\nexport const flashMap = {\n flash,\n flashIrregular,\n flashFast,\n flashSlow,\n flashPulse,\n\n // Extra\n flashGlow,\n flashColor,\n flashStrobe,\n flashSoft,\n flashReversePulse,\n};\n","// Gentle up-down float\nconst float = `\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n`;\n\n// Sway float with rotation\nconst floatSway = `\n 0% { transform: translate(2%, -10%) rotate(-1deg); }\n 100% { transform: translate(-2%, 5%) rotate(3deg); }\n`;\n\n// Horizontal float (side to side)\nconst floatHorizontal = `\n 0%, 100% { transform: translateX(0); }\n 50% { transform: translateX(12px); }\n`;\n\n// Circular float (orbit-like movement)\nconst floatCircular = `\n 0% { transform: translate(0, 0); }\n 25% { transform: translate(8px, -8px); }\n 50% { transform: translate(0, -12px); }\n 75% { transform: translate(-8px, -8px); }\n 100% { transform: translate(0, 0); }\n`;\n\n// Wiggle float (small tilt oscillation)\nconst floatWiggle = `\n 0%, 100% { transform: rotate(0deg); }\n 25% { transform: rotate(2deg); }\n 50% { transform: rotate(-2deg); }\n 75% { transform: rotate(1deg); }\n`;\n\n// Float with scale pulse\nconst floatPulse = `\n 0%, 100% { transform: translateY(0) scale(1); }\n 50% { transform: translateY(-8px) scale(1.05); }\n`;\n\n// Float diagonal (↗ ↙)\nconst floatDiagonal = `\n 0%, 100% { transform: translate(0, 0); }\n 50% { transform: translate(10px, -10px); }\n`;\n\n// Float swing (like pendulum)\nconst floatSwing = `\n 0%, 100% { transform: rotate(0deg) translateY(0); }\n 25% { transform: rotate(3deg) translateY(-5px); }\n 50% { transform: rotate(-3deg) translateY(-10px); }\n 75% { transform: rotate(2deg) translateY(-5px); }\n`;\n\n// Float wave (sinusoidal left-right + up-down)\nconst floatWave = `\n 0% { transform: translate(0, 0); }\n 25% { transform: translate(8px, -6px); }\n 50% { transform: translate(0, -12px); }\n 75% { transform: translate(-8px, -6px); }\n 100% { transform: translate(0, 0); }\n`;\n\n// Float drift (slow random drift feeling)\nconst floatDrift = `\n 0% { transform: translate(0, 0) rotate(0deg); }\n 25% { transform: translate(6px, -4px) rotate(1deg); }\n 50% { transform: translate(-4px, -8px) rotate(-1deg); }\n 75% { transform: translate(-6px, 6px) rotate(2deg); }\n 100% { transform: translate(0, 0) rotate(0deg); }\n`;\n\n// Export map for easy use\nexport const floatMap = {\n float,\n floatSway,\n floatHorizontal,\n floatCircular,\n floatWiggle,\n\n // Extra\n floatPulse,\n floatDiagonal,\n floatSwing,\n floatWave,\n floatDrift,\n};\n","// Simple glowing pulse (box-shadow expand/contract)\nconst glow = `\n 0% { box-shadow: 0 0 5px #ff00de; }\n 50% { box-shadow: 0 0 20px #ff00de; }\n 100% { box-shadow: 0 0 5px #ff00de; }\n`;\n\n// Neon text glow (flicker effect)\nconst glowTextFlicker = `\n 0% { color: inherit; text-shadow: none; }\n 2%, 59%, 64%, 79% { color: #fff; }\n 3%, 59%, 63%, 78% {\n text-shadow:\n 0px 0px 60px,\n 0 0 22px,\n 0 0 1em inherit,\n 0 0 0.5em inherit,\n 0 0 .1em inherit,\n 0 10px 3px #000;\n }\n 60%, 75% { color: inherit; text-shadow: none; }\n`;\n\n// Rainbow glowing (animated hue rotation)\nconst glowRainbow = `\n 0% { filter: hue-rotate(0deg); }\n 100% { filter: hue-rotate(360deg); }\n`;\n\n// Soft breathing glow\nconst glowBreathing = `\n 0%, 100% { text-shadow: 0 0 5px #00f, 0 0 10px #00f; }\n 50% { text-shadow: 0 0 20px #00f, 0 0 40px #00f; }\n`;\n\n// Glitch neon flicker (irregular intensity)\nconst glowGlitch = `\n 0%, 100% { text-shadow: 0 0 5px #0ff, 0 0 10px #0ff; }\n 10% { text-shadow: none; }\n 20% { text-shadow: 0 0 15px #f0f, 0 0 30px #f0f; }\n 30% { text-shadow: none; }\n 40% { text-shadow: 0 0 25px #ff0, 0 0 50px #ff0; }\n 60% { text-shadow: none; }\n 80% { text-shadow: 0 0 15px #0ff, 0 0 35px #0ff; }\n`;\n\n// Map for usage\nexport const glowMap = {\n glow,\n glowTextFlicker,\n glowRainbow,\n glowBreathing,\n glowGlitch,\n};\n","// === Jelly Animations ===\n\n// Default jelly wobble (scale X/Y alternating)\nconst jelly = `\n 0%, 100% { transform: scale(1, 1); }\n 25% { transform: scale(0.9, 1.1); }\n 50% { transform: scale(1.1, 0.9); }\n 75% { transform: scale(0.95, 1.05); }\n`;\n\n// Horizontal rubber stretch\nconst jellyX = `\n 0% { transform: scaleX(1); }\n 20% { transform: scaleX(0.9); }\n 50% { transform: scaleX(1.25); }\n 85% { transform: scaleX(0.8); }\n 100% { transform: scaleX(1); }\n`;\n\n// Vertical stretch\nconst jellyY = `\n 0% { transform: scaleY(1); }\n 20% { transform: scaleY(0.9); }\n 50% { transform: scaleY(1.25); }\n 85% { transform: scaleY(0.8); }\n 100% { transform: scaleY(1); }\n`;\n\n// Elastic bounce in (squash + overshoot)\nconst jellyIn = `\n 0% { transform: scale(0.5); opacity: 0; }\n 50% { transform: scale(1.2); opacity: 1; }\n 70% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n// Elastic bounce out\nconst jellyOut = `\n 0% { transform: scale(1); opacity: 1; }\n 20% { transform: scale(1.1); }\n 50% { transform: scale(0.5); opacity: 0.5; }\n 100% { transform: scale(0); opacity: 0; }\n`;\n\n// === Map ===\nexport const jellyMap = {\n jelly,\n jellyX,\n jellyY,\n jellyIn,\n jellyOut,\n};\n","/* ===== Shadow Animations ===== */\nconst shadow = `\n 0%, 100% { box-shadow: none; }\n 50% { box-shadow: 0 10px 20px rgba(0,0,0,0.2); }\n`;\n\nconst shadowText = `\n 0% { text-shadow: 1px 1px 0px #333; }\n 50% { text-shadow: 3px 3px 2px #333; }\n 100% { text-shadow: 9px 10px 6px #999; }\n`;\n\n// Soft pulsing shadow (breathing effect)\nconst shadowPulse = `\n 0%, 100% { box-shadow: 0 0 5px rgba(0,0,0,0.2); }\n 50% { box-shadow: 0 0 25px rgba(0,0,0,0.4); }\n`;\n\n// Neon glowing text shadow\nconst shadowNeon = `\n 0%, 100% { text-shadow: 0 0 5px #0ff, 0 0 10px #0ff; }\n 50% { text-shadow: 0 0 20px #0ff, 0 0 40px #0ff; }\n`;\n\n/* ===== Spin Animations ===== */\nconst spin = `\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst spin3D = `\n from { transform: rotateY(0deg); }\n to { transform: rotateY(-360deg); }\n`;\n\n// Spin on X axis\nconst spinX = `\n from { transform: rotateX(0deg); }\n to { transform: rotateX(360deg); }\n`;\n\n// Spin on Z axis but with bounce easing\nconst spinBounce = `\n 0% { transform: rotateZ(0deg) scale(1); }\n 50% { transform: rotateZ(180deg) scale(1.2); }\n 100% { transform: rotateZ(360deg) scale(1); }\n`;\n\n/* ===== Swing Animations ===== */\nconst swing = `\n 20% { transform: rotate(15deg); }\n 40% { transform: rotate(-10deg); }\n 60% { transform: rotate(5deg); }\n 80% { transform: rotate(-5deg); }\n 100% { transform: rotate(0deg); }\n`;\n\nconst swingPivot = `\n 0% { transform: rotateZ(0deg); transform-origin: center top; }\n 20% { transform: rotateZ(15deg); transform-origin: center top; }\n 40% { transform: rotateZ(-15deg); transform-origin: center top; }\n 60% { transform: rotateZ(7deg); transform-origin: center top; }\n 80% { transform: rotateZ(-7deg); transform-origin: center top; }\n 100% { transform: rotateZ(0deg); transform-origin: center top; }\n`;\n\n// Wobble horizontally\nconst swingX = `\n 15% { transform: translateX(-25%) rotate(-5deg); }\n 30% { transform: translateX(20%) rotate(3deg); }\n 45% { transform: translateX(-15%) rotate(-3deg); }\n 60% { transform: translateX(10%) rotate(2deg); }\n 75% { transform: translateX(-5%) rotate(-1deg); }\n 100% { transform: translateX(0); }\n`;\n\n// Wobble vertically\nconst swingY = `\n 15% { transform: translateY(-25%) rotate(-3deg); }\n 30% { transform: translateY(20%) rotate(2deg); }\n 45% { transform: translateY(-15%) rotate(-2deg); }\n 60% { transform: translateY(10%) rotate(1deg); }\n 75% { transform: translateY(-5%) rotate(-1deg); }\n 100% { transform: translateY(0); }\n`;\n\n// Small orbit (element moves around center)\nconst orbit = `\n from { transform: rotate(0deg) translateX(20px) rotate(0deg); }\n to { transform: rotate(360deg) translateX(20px) rotate(-360deg); }\n`;\n\n// Elliptical orbit\nconst orbitEllipse = `\n from { transform: rotate(0deg) translateX(30px) translateY(10px) rotate(0deg); }\n to { transform: rotate(360deg) translateX(30px) translateY(10px) rotate(-360deg); }\n`;\n\nexport const motionMap = {\n // Shadows\n shadow,\n shadowText,\n shadowPulse,\n shadowNeon,\n\n // Spins\n spin,\n spin3D,\n spinX,\n spinBounce,\n\n // Swings\n swing,\n swingPivot,\n swingX,\n swingY,\n\n // Orbit\n orbit,\n orbitEllipse,\n};\n","// Basic pulse (scale up)\nconst pulse = `\n from { transform: scale(1); }\n to { transform: scale(1.1); }\n`;\n\n// Pulse in & out (scale small -> big -> small)\nconst pulseInOut = `\n 0% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n 100% { transform: scale(1); }\n`;\n\n// Pulse with opacity (fade effect)\nconst pulseFade = `\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.2); opacity: 0.6; }\n`;\n\n// Pulse grow shrink faster\nconst pulseFast = `\n 0%, 100% { transform: scale(1); }\n 25% { transform: scale(1.2); }\n 75% { transform: scale(0.9); }\n`;\n\n// Pulse with color change\nconst pulseColor = `\n 0%, 100% { transform: scale(1); background-color: #ff69b4; }\n 50% { transform: scale(1.2); background-color: #ff1493; }\n`;\n\nexport const pulseMap = {\n pulse,\n pulseInOut,\n pulseFade,\n pulseFast,\n pulseColor,\n};\n","/* ================================================\n Squeeze & Shake Animations Map\n================================================= */\n\n// Squeeze Animations\nconst squeezeMix = `\n 0% { transform: scale3d(1, 1, 1); }\n 15% { transform: scale3d(0.95, 0.95, 1); }\n 30% { transform: scale3d(0.9, 0.9, 1); }\n 55% { transform: scale3d(0.75, 0.75, 1); }\n 70% { transform: scale3d(1.3, 1.3, 1); }\n 85% { transform: scale3d(0.95, 0.95, 1); }\n 100% { transform: scale3d(1, 1, 1); }\n`;\n\nconst squeezeHorizontal = `\n 0% { transform: scaleX(1); }\n 15% { transform: scaleX(0.95); }\n 30% { transform: scaleX(0.9); }\n 55% { transform: scaleX(0.75); }\n 70% { transform: scaleX(1.3); }\n 85% { transform: scaleX(0.95); }\n 100% { transform: scaleX(1); }\n`;\n\nconst squeezeVertical = `\n 0% { transform: scaleY(1); }\n 15% { transform: scaleY(0.95); }\n 30% { transform: scaleY(0.9); }\n 55% { transform: scaleY(0.75); }\n 70% { transform: scaleY(1.3); }\n 85% { transform: scaleY(0.95); }\n 100% { transform: scaleY(1); }\n`;\n\nconst squeezeDiagonal = `\n 0% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.8,1.2,1); }\n 50% { transform: scale3d(1.1,0.9,1); }\n 75% { transform: scale3d(0.9,1.1,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\nconst squeezePulse = `\n 0%,100% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.9,0.9,1); }\n 50% { transform: scale3d(1.1,1.1,1); }\n 75% { transform: scale3d(0.95,0.95,1); }\n`;\n\n// Squeeze Bounce\nconst squeezeBounce = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.7,0.7,1); }\n 50% { transform: scale3d(1.2,1.2,1); }\n 70% { transform: scale3d(0.9,0.9,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Squeeze Elastic\nconst squeezeElastic = `\n 0% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.8,1.2,1); }\n 50% { transform: scale3d(1.2,0.8,1); }\n 75% { transform: scale3d(0.9,1.1,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Squeeze Flash\nconst squeezeFlash = `\n 0%,100% { transform: scale3d(1,1,1); opacity: 1; }\n 25% { transform: scale3d(0.8,0.8,1); opacity: 0.6; }\n 50% { transform: scale3d(1.2,1.2,1); opacity: 1; }\n 75% { transform: scale3d(0.9,0.9,1); opacity: 0.8; }\n`;\n\n// Shake Animations\nconst shakeMix = `\n 0% { transform: translate3d(2px, 1px, 0) rotate(0deg); }\n 10% { transform: translate3d(-1px, -2px, 0) rotate(-1deg); }\n 20% { transform: translate3d(-3px, 0px, 0) rotate(1deg); }\n 30% { transform: translate3d(0px, 2px, 0) rotate(0deg); }\n 40% { transform: translate3d(1px, -1px, 0) rotate(1deg); }\n 50% { transform: translate3d(-1px, 2px, 0) rotate(-1deg); }\n 60% { transform: translate3d(-3px, 1px, 0) rotate(0deg); }\n 70% { transform: translate3d(2px, 1px, 0) rotate(-1deg); }\n 80% { transform: translate3d(-1px, -1px, 0) rotate(1deg); }\n 90% { transform: translate3d(2px, 2px, 0) rotate(0deg); }\n 100% { transform: translate3d(1px, -2px, 0) rotate(-1deg); }\n`;\n\nconst shakeHorizontal = `\n 0%, 100% { transform: translateX(0); }\n 10%, 30%, 50%, 70%, 90% { transform: translateX(6px); }\n 20%, 40%, 60%, 80% { transform: translateX(-4px); }\n`;\n\nconst shakeVertical = `\n 0%, 100% { transform: translateY(0); }\n 10%, 30%, 50%, 70%, 90% { transform: translateY(6px); }\n 20%, 40%, 60%, 80% { transform: translateY(-4px); }\n`;\n\nconst shakeDiagonal = `\n 0%,100% { transform: translate3d(0,0,0); }\n 20% { transform: translate3d(5px,5px,0); }\n 40% { transform: translate3d(-5px,-5px,0); }\n 60% { transform: translate3d(5px,-5px,0); }\n 80% { transform: translate3d(-5px,5px,0); }\n`;\n\nconst shakeQuick = `\n 0%,100% { transform: translate3d(0,0,0); }\n 10%,30%,50%,70%,90% { transform: translate3d(3px,0,0); }\n 20%,40%,60%,80% { transform: translate3d(-3px,0,0); }\n`;\n\n// Shake Rotate\nconst shakeRotate = `\n 0%,100% { transform: rotate(0deg); }\n 25% { transform: rotate(-5deg); }\n 50% { transform: rotate(5deg); }\n 75% { transform: rotate(-3deg); }\n`;\n\n// Shake Skew\nconst shakeSkew = `\n 0%,100% { transform: skew(0deg, 0deg); }\n 20% { transform: skew(-10deg, -5deg); }\n 40% { transform: skew(8deg, 3deg); }\n 60% { transform: skew(-6deg, -3deg); }\n 80% { transform: skew(4deg, 2deg); }\n`;\n\n// Shake Bounce\nconst shakeBounce = `\n 0%,100% { transform: translateY(0); }\n 20% { transform: translateY(-6px); }\n 40% { transform: translateY(4px); }\n 60% { transform: translateY(-4px); }\n 80% { transform: translateY(2px); }\n`;\n\n// Shake Crazy\nconst shakeCrazy = `\n 0% { transform: translate(0,0) rotate(0deg); }\n 20% { transform: translate(-4px,3px) rotate(-3deg); }\n 40% { transform: translate(5px,-2px) rotate(4deg); }\n 60% { transform: translate(-3px,2px) rotate(-4deg); }\n 80% { transform: translate(3px,-3px) rotate(2deg); }\n 100% { transform: translate(0,0) rotate(0deg); }\n`;\n\n// Combo 1\nconst squeezeThenShakeX = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.7,0.7,1); }\n 40% { transform: scale3d(1.2,1.2,1); }\n 60% { transform: scale3d(0.9,0.9,1); }\n 70% { transform: translateX(0); }\n 80% { transform: translateX(-6px); }\n 90% { transform: translateX(6px); }\n 100% { transform: translateX(0); }\n`;\n\n// Combo 2\nconst shakeYThenSqueeze = `\n 0% { transform: translateY(0); }\n 20% { transform: translateY(-6px); }\n 40% { transform: translateY(6px); }\n 60% { transform: translateY(-3px); }\n 70% { transform: scale3d(0.7,0.7,1); }\n 85% { transform: scale3d(1.2,1.2,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Combo 3\nconst squeezeShakeCrazy = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.8,1.2,1); }\n 40% { transform: scale3d(1.2,0.8,1); }\n 50% { transform: translate(-4px,3px) rotate(-3deg); }\n 70% { transform: translate(5px,-2px) rotate(4deg); }\n 90% { transform: translate(-3px,2px) rotate(-4deg); }\n 100% { transform: scale3d(1,1,1) translate(0,0) rotate(0); }\n`;\n\n\n// Map for lookup\nexport const squeezeShakeMap = {\n squeezeMix,\n squeezeHorizontal,\n squeezeVertical,\n squeezeDiagonal,\n squeezePulse,\n squeezeBounce,\n squeezeElastic,\n squeezeFlash,\n shakeMix,\n shakeHorizontal,\n shakeVertical,\n shakeDiagonal,\n shakeQuick,\n shakeRotate,\n shakeSkew,\n shakeBounce,\n shakeCrazy,\n squeezeThenShakeX,\n shakeYThenSqueeze,\n squeezeShakeCrazy,\n};\n\n","/* ===========================================================\n Slide In / Out - Linear\n=========================================================== */\nconst slideInFromLeft = `\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideInFromRight = `\n from { transform: translateX(100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutToLeft = `\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nconst slideOutToRight = `\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(100%); opacity: 0; }\n`;\n\nconst slideInFromTop = `\n from { transform: translateY(-100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideInFromBottom = `\n from { transform: translateY(100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideOutToTop = `\n from { transform: translateY(0); opacity: 1; }\n to { transform: translateY(-100%); opacity: 0; }\n`;\n\nconst slideOutToBottom = `\n from { transform: translateY(0); opacity: 1; }\n to { transform: translateY(100%); opacity: 0; }\n`;\n\n/* ===========================================================\n Slide In / Out - Overshoot (bouncy effect)\n=========================================================== */\nconst slideInFromLeftOvershoot = `\n 0% { transform: translateX(-100%); opacity: 0; }\n 60% { transform: translateX(20%); opacity: 1; }\n 100% { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideInFromRightOvershoot = `\n 0% { transform: translateX(100%); opacity: 0; }\n 60% { transform: translateX(-20%); opacity: 1; }\n 100% { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutToLeftOvershoot = `\n 0% { transform: translateX(0); opacity: 1; }\n 60% { transform: translateX(-120%); opacity: 0; }\n 100% { transform: translateX(-100%); opacity: 0; }\n`;\n\nconst slideOutToRightOvershoot = `\n 0% { transform: translateX(0); opacity: 1; }\n 60% { transform: translateX(120%); opacity: 0; }\n 100% { transform: translateX(100%); opacity: 0; }\n`;\n\nconst slideInFromTopOvershoot = `\n 0% { transform: translateY(-100%); opacity: 0; }\n 60% { transform: translateY(20%); opacity: 1; }\n 100% { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideInFromBottomOvershoot = `\n 0% { transform: translateY(100%); opacity: 0; }\n 60% { transform: translateY(-20%); opacity: 1; }\n 100% { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideOutToTopOvershoot = `\n 0% { transform: translateY(0); opacity: 1; }\n 60% { transform: translateY(-120%); opacity: 0; }\n 100% { transform: translateY(-100%); opacity: 0; }\n`;\n\nconst slideOutToBottomOvershoot = `\n 0% { transform: translateY(0); opacity: 1; }\n 60% { transform: translateY(120%); opacity: 0; }\n 100% { transform: translateY(100%); opacity: 0; }\n`;\n\n/* ===========================================================\n Map Export\n=========================================================== */\nexport const slideMap = {\n // Linear\n slideInFromLeft,\n slideInFromRight,\n slideOutToLeft,\n slideOutToRight,\n slideInFromTop,\n slideInFromBottom,\n slideOutToTop,\n slideOutToBottom,\n\n // Overshoot / Bouncy\n slideInFromLeftOvershoot,\n slideInFromRightOvershoot,\n slideOutToLeftOvershoot,\n slideOutToRightOvershoot,\n slideInFromTopOvershoot,\n slideInFromBottomOvershoot,\n slideOutToTopOvershoot,\n slideOutToBottomOvershoot,\n};\n","/* ===========================================================\n Flip / Rotate Animations\n=========================================================== */\n\n/* ---------- Basic Version ---------- */\nconst flip = `from{transform:rotateY(0)}to{transform:rotateY(180deg)}`;\n\nconst flipFromLeftToCenter = `\n from { transform: rotateY(-90deg); }\n to { transform: rotateY(0); }\n`;\nconst flipFromRightToCenter = `\n from { transform: rotateY(90deg); }\n to { transform: rotateY(0); }\n`;\nconst flipToLeft = `\n from { transform: rotateY(0); }\n to { transform: rotateY(-90deg); }\n`;\nconst flipToRight = `\n from { transform: rotateY(0); }\n to { transform: rotateY(90deg); }\n`;\n\nconst flipFromTop = `\n from { transform: rotateX(-90deg); }\n to { transform: rotateX(0); }\n`;\nconst flipToTop = `\n from { transform: rotateX(0); }\n to { transform: rotateX(-90deg); }\n`;\nconst flipFromBottom = `\n from { transform: rotateX(90deg); }\n to { transform: rotateX(0); }\n`;\nconst flipToBottom = `\n from { transform: rotateX(0); }\n to { transform: rotateX(90deg); }\n`;\n\n/* ---------- Rich Version ---------- */\nconst flipRich = `\n 0% { transform: perspective(1000px) rotateX(360deg); transform-origin: center; }\n 100% { transform: perspective(1000px) rotateX(0deg); transform-origin: center; }\n`;\n\nconst flipIn = `\n 0% { transform: rotateX(180deg); opacity: 0; }\n 35% { transform: rotateX(120deg); opacity: 0; }\n 65% { opacity: 0; }\n 100% { transform: rotateX(360deg); opacity: 1; }\n`;\n\nconst flipOut = `\n 0% { transform: rotateX(0deg); opacity: 1; }\n 35% { transform: rotateX(-40deg); opacity: 1; }\n 65% { opacity: 0; }\n 100% { transform: rotateX(180deg); opacity: 0; }\n`;\n\nconst flipSlowDown = `\n 0% { transform: rotateX(0deg); }\n 5% { transform: rotateX(1turn); }\n 10% { transform: rotateX(2turn); }\n 20% { transform: rotateX(3turn); }\n 40% { transform: rotateX(4turn); }\n 70%,100% { transform: rotateX(5turn); }\n`;\n\nconst flipToTopRich = `\n from { transform: rotateX(-90deg); transform-origin: center top; opacity: 1; }\n to { transform: rotateX(90deg); transform-origin: center top; opacity: 0; }\n`;\n\nconst flipToBottomRich = `\n from { opacity: 1; transform-origin: 0% 0%; transform: rotateX(0deg) translateY(0); }\n to { opacity: 0; transform-origin: 0% 0%; transform: rotateX(-90deg) translateY(50px); }\n`;\n\nconst flipToTopLeftRich = `\n from {\n opacity: 1;\n transform-origin: top left;\n transform: rotateX(0deg) rotateY(0deg);\n }\n to {\n opacity: 0;\n transform-origin: top left;\n transform: rotateX(-90deg) rotateY(-90deg);\n }\n`;\n\nconst flipToRightRich = `\n from {\n opacity: 1;\n transform-origin: center right;\n transform: rotateY(0deg);\n }\n to {\n opacity: 0;\n transform-origin: center right;\n transform: rotateY(90deg);\n }\n`;\n\nconst flipFromTopRich = `\n from { opacity: 0; transform-origin: 0% 0%; transform: rotateX(90deg); }\n to { opacity: 1; transform-origin: 0% 0%; transform: rotateX(0deg); }\n`;\n\nconst flipFromBottomRich = `\n from { transform: rotateX(-90deg); transform-origin: 50% 0; opacity: 0; }\n to { transform: rotateX(0deg); transform-origin: 50% 0; opacity: 1; }\n`;\n\nconst flipFromLeftToCenterRich = `\n 0% { transform: rotateY(-95deg) translateX(-200px); transform-origin: left; }\n 100% { transform: rotateY(0deg); transform-origin: left; }\n`;\n\nconst flipFromRightToCenterRich = `\n 0% { transform: rotateY(95deg) translateX(200px); transform-origin: right; }\n 100% { transform: rotateY(0deg); transform-origin: right; }\n`;\n\n/* ---------- Export Map ---------- */\nexport const flipMap = {\n flip,\n flipIn,\n flipOut,\n flipSlowDown,\n\n flipToLeft,\n flipToRight,\n flipFromTop,\n flipToTop,\n\n flipToBottom,\n flipFromBottom,\n flipFromLeftToCenter,\n flipFromRightToCenter,\n\n flipRich,\n flipToTopRich,\n flipToBottomRich,\n flipToTopLeftRich,\n flipToRightRich,\n\n flipFromTopRich,\n flipFromBottomRich,\n flipFromLeftToCenterRich,\n flipFromRightToCenterRich,\n};\n","/* -------------------------------\n Fold / Unfold Animations Map\n---------------------------------*/\n\n// Simple version (scaleY)\nconst fold = `from { transform: scaleY(1); } to { transform: scaleY(0); }`;\nconst unfold = `from { transform: scaleY(0); } to { transform: scaleY(1); }`;\n\n// Advanced version (3D + opacity + multi-step)\nconst foldDeep = `\n 0% { transform: scale3d(1, 1, 1); }\n 30% { transform: scale3d(1, 0.4, 1); }\n 60% { transform: scale3d(0.4, 0.4, 1); }\n 100% { opacity: 0; transform: scale3d(0.2, 0.2, 0.2); }\n`;\n\nconst unfoldDeep = `\n 0% { opacity: 0; transform: scale3d(0, 0, 0); }\n 30% { opacity: 1; transform: scale3d(0.4, 0.4, 1); }\n 60% { transform: scale3d(0.4, 1, 1); }\n 100% { transform: scale3d(1, 1, 1); }\n`;\n\n// Fold Left (rotate around Y)\nconst foldLeft = `\n from { transform: perspective(400px) rotateY(0); opacity: 1; }\n to { transform: perspective(400px) rotateY(-90deg); opacity: 0; }\n`;\n\n// Unfold Left\nconst unfoldLeft = `\n from { transform: perspective(400px) rotateY(-90deg); opacity: 0; }\n to { transform: perspective(400px) rotateY(0); opacity: 1; }\n`;\n\n// Fold Right (rotate around Y opposite)\nconst foldRight = `\n from { transform: perspective(400px) rotateY(0); opacity: 1; }\n to { transform: perspective(400px) rotateY(90deg); opacity: 0; }\n`;\n\n// Unfold Right\nconst unfoldRight = `\n from { transform: perspective(400px) rotateY(90deg); opacity: 0; }\n to { transform: perspective(400px) rotateY(0); opacity: 1; }\n`;\n\n// Fold Up (rotate around X)\nconst foldUp = `\n from { transform: perspective(400px) rotateX(0); opacity: 1; }\n to { transform: perspective(400px) rotateX(-90deg); opacity: 0; }\n`;\n\n// Unfold Up\nconst unfoldUp = `\n from { transform: perspective(400px) rotateX(-90deg); opacity: 0; }\n to { transform: perspective(400px) rotateX(0); opacity: 1; }\n`;\n\n// Fold Down\nconst foldDown = `\n from { transform: perspective(400px) rotateX(0); opacity: 1; }\n to { transform: perspective(400px) rotateX(90deg); opacity: 0; }\n`;\n\n// Unfold Down\nconst unfoldDown = `\n from { transform: perspective(400px) rotateX(90deg); opacity: 0; }\n to { transform: perspective(400px) rotateX(0); opacity: 1; }\n`;\n\n// Map for lookup\nexport const foldMap = {\n fold,\n unfold,\n foldDeep,\n unfoldDeep,\n\n // Extra\n foldLeft,\n unfoldLeft,\n foldRight,\n unfoldRight,\n foldUp,\n unfoldUp,\n foldDown,\n unfoldDown,\n};\n","/* ===========================================================\n Hang On Animations\n=========================================================== */\n\n/* --- Simple subtle swing --- */\nconst hangOnLeft = `\n from { transform: rotate(0deg); }\n to { transform: rotate(-20deg); }\n`;\n\nconst hangOnRight = `\n from { transform: rotate(0deg); }\n to { transform: rotate(20deg); }\n`;\n\n/* --- Simple Up/Down --- */\nconst hangOnTop = `\n from { transform: rotate(0deg); }\n to { transform: rotate(20deg); transform-origin: top; }\n`;\n\nconst hangOnBottom = `\n from { transform: rotate(0deg); }\n to { transform: rotate(-20deg); transform-origin: bottom; }\n`;\n\n/* --- Detailed swing --- */\nconst hangOnLeftSwing = `\n 0% { transform-origin: left; transform: rotate(0deg); }\n 30% { transform: rotate(110deg); }\n 50% { transform: rotate(75deg); }\n 65% { transform: rotate(100deg); }\n 78% { transform: rotate(80deg); }\n 88% { transform: rotate(95deg); }\n 95% { transform: rotate(86deg); }\n 100% { transform: rotate(90deg); }\n`;\n\nconst hangOnRightSwing = `\n 0% { transform-origin: right; transform: rotate(0deg); }\n 30% { transform: rotate(-110deg); }\n 50% { transform: rotate(-75deg); }\n 65% { transform: rotate(-100deg); }\n 78% { transform: rotate(-80deg); }\n 88% { transform: rotate(-95deg); }\n 95% { transform: rotate(-86deg); }\n 100% { transform: rotate(-90deg); }\n`;\n\n/* --- Detailed Top/Bottom Swing --- */\nconst hangOnTopSwing = `\n 0% { transform-origin: top; transform: rotate(0deg); }\n 30% { transform: rotate(-110deg); }\n 50% { transform: rotate(-75deg); }\n 65% { transform: rotate(-100deg); }\n 78% { transform: rotate(-80deg); }\n 88% { transform: rotate(-95deg); }\n 95% { transform: rotate(-86deg); }\n 100% { transform: rotate(-90deg); }\n`;\n\nconst hangOnBottomSwing = `\n 0% { transform-origin: bottom; transform: rotate(0deg); }\n 30% { transform: rotate(110deg); }\n 50% { transform: rotate(75deg); }\n 65% { transform: rotate(100deg); }\n 78% { transform: rotate(80deg); }\n 88% { transform: rotate(95deg); }\n 95% { transform: rotate(86deg); }\n 100% { transform: rotate(90deg); }\n`;\n\n/* --- Oscillating subtle swing (looping style) --- */\nconst hangOnOscillate = `\n 0% { transform: rotate(0deg); }\n 25% { transform: rotate(15deg); }\n 50% { transform: rotate(-15deg); }\n 75% { transform: rotate(10deg); }\n 100% { transform: rotate(0deg); }\n`;\n\n/* --- Drop after hang --- */\nconst hangOnDrop = `\n 0% { transform-origin: top; transform: rotate(0deg); opacity: 1; }\n 20% { transform: rotate(30deg); opacity: 1; }\n 40% { transform: rotate(-30deg); opacity: 1; }\n 60% { transform: rotate(15deg); opacity: 1; }\n 80% { transform: rotate(-15deg); opacity: 1; }\n 100% { transform: rotate(90deg) translateY(200%); opacity: 0; }\n`;\n\n/* --- HangOn Map --- */\nexport const hangOnMap = {\n // simple\n hangOnLeft,\n hangOnRight,\n hangOnTop,\n hangOnBottom,\n\n // detailed swings\n hangOnLeftSwing,\n hangOnRightSwing,\n hangOnTopSwing,\n hangOnBottomSwing,\n\n // extra\n hangOnOscillate,\n hangOnDrop,\n};\n","/* ===========================================================\n Zoom Animations\n=========================================================== */\n\n/** Simple zoom in (center) */\nconst zoomIn = `\n from { transform: scale(2); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n`;\n\n/** Simple zoom out (center) */\nconst zoomOut = `\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(2); opacity: 0; }\n`;\n\n/** Zoom in from left */\nconst zoomInFromLeft = `\n from { transform: scale(2) translateX(-100%); opacity: 0; }\n to { transform: scale(1) translateX(0); opacity: 1; }\n`;\n\n/** Zoom in from right */\nconst zoomInFromRight = `\n from { transform: scale(2) translateX(100%); opacity: 0; }\n to { transform: scale(1) translateX(0); opacity: 1; }\n`;\n\n/** Zoom in from top */\nconst zoomInFromTop = `\n from { transform: scale(2) translateY(-100%); opacity: 0; }\n to { transform: scale(1) translateY(0); opacity: 1; }\n`;\n\n/** Zoom in from bottom */\nconst zoomInFromBottom = `\n from { transform: scale(2) translateY(100%); opacity: 0; }\n to { transform: scale(1) translateY(0); opacity: 1; }\n`;\n\n/** Zoom out to left */\nconst zoomOutToLeft = `\n from { transform: scale(1) translateX(0); opacity: 1; }\n to { transform: scale(2) translateX(-100%); opacity: 0; }\n`;\n\n/** Zoom out to right */\nconst zoomOutToRight = `\n from { transform: scale(1) translateX(0); opacity: 1; }\n to { transform: scale(2) translateX(100%); opacity: 0; }\n`;\n\n/** Zoom out to top */\nconst zoomOutToTop = `\n from { transform: scale(1) translateY(0); opacity: 1; }\n to { transform: scale(2) translateY(-100%); opacity: 0; }\n`;\n\n/** Zoom out to bottom */\nconst zoomOutToBottom = `\n from { transform: scale(1) translateY(0); opacity: 1; }\n to { transform: scale(2) translateY(100%); opacity: 0; }\n`;\n\n/** Zoom in rotate */\nconst zoomInRotate = `\n from { transform: scale(0) rotate(-180deg); opacity: 0; }\n to { transform: scale(1) rotate(0deg); opacity: 1; }\n`;\n\n/** Zoom out rotate */\nconst zoomOutRotate = `\n from { transform: scale(1) rotate(0deg); opacity: 1; }\n to { transform: scale(0) rotate(180deg); opacity: 0; }\n`;\n\n/** Zoom in flip (3D X-axis) */\nconst zoomInFlipX = `\n from { transform: perspective(400px) scale(0.5) rotateX(90deg); opacity: 0; }\n to { transform: perspective(400px) scale(1) rotateX(0deg); opacity: 1; }\n`;\n\n/** Zoom out flip (3D X-axis) */\nconst zoomOutFlipX = `\n from { transform: perspective(400px) scale(1) rotateX(0deg); opacity: 1; }\n to { transform: perspective(400px) scale(0.5) rotateX(90deg); opacity: 0; }\n`;\n\n/** Zoom in flip (3D Y-axis) */\nconst zoomInFlipY = `\n from { transform: perspective(400px) scale(0.5) rotateY(90deg); opacity: 0; }\n to { transform: perspective(400px) scale(1) rotateY(0deg); opacity: 1; }\n`;\n\n/** Zoom out flip (3D Y-axis) */\nconst zoomOutFlipY = `\n from { transform: perspective(400px) scale(1) rotateY(0deg); opacity: 1; }\n to { transform: perspective(400px) scale(0.5) rotateY(90deg); opacity: 0; }\n`;\n\n/** Zoom pulse (in-out loop) */\nconst zoomPulse = `\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.1); }\n`;\n\n/** Zoom swing (elastic effect) */\nconst zoomSwing = `\n 0% { transform: scale(0.3); opacity: 0; }\n 50% { transform: scale(1.2); opacity: 1; }\n 70% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n/* ===========================================================\n * Zoom Animation Map\n=========================================================== */\nexport const zoomMap = {\n zoomIn,\n zoomOut,\n zoomInFromLeft,\n zoomInFromRight,\n zoomInFromTop,\n zoomInFromBottom,\n zoomOutToLeft,\n zoomOutToRight,\n zoomOutToTop,\n zoomOutToBottom,\n\n // Extra\n zoomInRotate,\n zoomOutRotate,\n zoomInFlipX,\n zoomOutFlipX,\n zoomInFlipY,\n zoomOutFlipY,\n zoomPulse,\n zoomSwing,\n};\n","/* =========================\n Rotate Animations\n========================= */\n\n// Rotate clockwise around Z-axis\nconst rotateCW = `\n from {\n transform: rotateZ(0deg);\n transform-origin: center center;\n }\n to {\n transform: rotateZ(360deg);\n transform-origin: center center;\n }\n`;\n\n// Rotate anti-clockwise around Z-axis\nconst rotateACW = `\n from {\n transform: rotateZ(0deg);\n transform-origin: center center;\n }\n to {\n transform: rotateZ(-360deg);\n transform-origin: center center;\n }\n`;\n\n// Rotate slowly with deceleration\nconst rotateSlowDown = `\n 0% { transform: rotateZ(0deg); transform-origin: center center; }\n 5% { transform: rotateZ(1turn); transform-origin: center center; }\n 10% { transform: rotateZ(2turn); transform-origin: center center; }\n 20% { transform: rotateZ(3turn); transform-origin: center center; }\n 40% { transform: rotateZ(4turn); transform-origin: center center; }\n 65%, 100% { transform: rotateZ(5turn); transform-origin: center center; }\n`;\n\n// Rotate around X-axis\nconst rotateX = `\n from { transform: rotateX(0deg); transform-origin: center center; }\n to { transform: rotateX(360deg); transform-origin: center center; }\n`;\n\n// Rotate around Y-axis\nconst rotateY = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(360deg); transform-origin: center center; }\n`;\n\n// Flip from left to center (Y-axis)\nconst rotateFromLeft = `\n from { transform: rotateY(-90deg); transform-origin: left center; }\n to { transform: rotateY(0deg); transform-origin: left center; }\n`;\n\n// Flip from right to center (Y-axis)\nconst rotateFromRight = `\n from { transform: rotateY(90deg); transform-origin: right center; }\n to { transform: rotateY(0deg); transform-origin: right center; }\n`;\n\n// Flip to left (Y-axis)\nconst rotateToLeft = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(-90deg); transform-origin: center center; }\n`;\n\n// Flip to right (Y-axis)\nconst rotateToRight = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(90deg); transform-origin: center center; }\n`;\n\n// Flip from top (X-axis)\nconst rotateFromTop = `\n from { transform: rotateX(-90deg); transform-origin: center top; }\n to { transform: rotateX(0deg); transform-origin: center top; }\n`;\n\n// Flip from bottom (X-axis)\nconst rotateFromBottom = `\n from { transform: rotateX(90deg); transform-origin: center bottom; }\n to { transform: rotateX(0deg); transform-origin: center bottom; }\n`;\n\n// Flip to top (X-axis)\nconst rotateToTop = `\n from { transform: rotateX(0deg); transform-origin: center top; }\n to { transform: rotateX(-90deg); transform-origin: center top; }\n`;\n\n// Flip to bottom (X-axis)\nconst rotateToBottom = `\n from { transform: rotateX(0deg); transform-origin: center bottom; }\n to { transform: rotateX(90deg); transform-origin: center bottom; }\n`;\n\n// =========================\n// Export as a map\n// =========================\nexport const rotateMap = {\n rotateCW,\n rotateACW,\n\n rotateSlowDown,\n rotateX,\n rotateY,\n\n rotateFromLeft,\n rotateFromRight,\n rotateToLeft,\n rotateToRight,\n\n rotateFromTop,\n rotateFromBottom,\n rotateToTop,\n rotateToBottom,\n};\n","/* ===========================================================\n 5. Fun / Attention Animations\n=========================================================== */\n\n/** Heartbeat animation */\nconst heartBeat = `\n 0%, 28%, 70%, 100% { transform: scale(1); }\n 14%, 42% { transform: scale(1.3); }\n`;\n\n/** Tada animation (shake + scale) */\nconst tada = `\n from { transform: scale3d(1, 1, 1); }\n 10%, 20% { transform: scale3d(.9, .9, .9) rotate(-3deg); }\n 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); }\n 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); }\n to { transform: scale3d(1, 1, 1); }\n`;\n\n/** Hinge animation (falls down like hinge) */\nconst hinge = `\n 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; }\n 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; }\n 40%, 80% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; }\n 100% { transform: translateY(700px); opacity: 0; }\n`;\n\n/** LightSpeedIn from left */\nconst lightSpeedInLeft = `\n from { transform: translateX(-100%) skewX(30deg); opacity: 0; }\n 60% { transform: skewX(-20deg); opacity: 1; }\n 80% { transform: skewX(5deg); }\n to { transform: none; }\n`;\n\n/** LightSpeedOut to right */\nconst lightSpeedOutRight = `\n from { opacity: 1; }\n to { transform: translateX(100%) skewX(-30deg); opacity: 0; }\n`;\n\n/** ===========================================================\n * Fun / Attention Map\n=========================================================== */\nexport const funMap = {\n heartBeat,\n tada,\n hinge,\n lightSpeedInLeft,\n lightSpeedOutRight,\n};\n","// Basic pop in/out\nconst popIn = `\n from { opacity: 0; transform: scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: scale3d(1,1,1); }\n`;\nconst popOut = `\n from { opacity: 1; transform: scale3d(1,1,1); }\n to { opacity: 0; transform: scale3d(0.5,0.5,0.5); }\n`;\n\n// Bounce effect\nconst bounceIn = `\n 0% { opacity: 0; transform: scale3d(0.3,0.3,0.3); }\n 50% { opacity: 1; transform: scale3d(1.05,1.05,1.05); }\n 70% { transform: scale3d(0.9,0.9,0.9); }\n 100% { transform: scale3d(1,1,1); }\n`;\nconst bounceOut = `\n 20% { transform: scale3d(0.9,0.9,0.9); }\n 50%,55% { opacity:1; transform: scale3d(1.1,1.1,1.1); }\n to { opacity:0; transform: scale3d(0.3,0.3,0.3); }\n`;\n\n// Directional pop (translate + scale)\nconst popUpIn = `\n from { opacity:0; transform: translateY(50%) scale3d(0.5,0.5,0.5); }\n to { opacity:1; transform: translateY(0) scale3d(1,1,1); }\n`;\nconst popUpOut = `\n from { opacity:1; transform: translateY(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateY(-50%) scale3d(0.5,0.5,0.5); }\n`;\n\nconst popRotateIn = `\n from { opacity:0; transform: scale3d(0.5,0.5,0.5) rotate(-45deg); }\n to { opacity:1; transform: scale3d(1,1,1) rotate(0deg); }\n`;\nconst popRotateOut = `\n from { opacity:1; transform: scale3d(1,1,1) rotate(0deg); }\n to { opacity:0; transform: scale3d(0.5,0.5,0.5) rotate(45deg); }\n`;\n\nconst popBlurIn = `\n from { opacity:0; transform: scale3d(0.5,0.5,0.5); filter: blur(5px); }\n to { opacity:1; transform: scale3d(1,1,1); filter: blur(0); }\n`;\nconst popBlurOut = `\n from { opacity:1; transform: scale3d(1,1,1); filter: blur(0); }\n to { opacity:0; transform: scale3d(0.5,0.5,0.5); filter: blur(5px); }\n`;\n\n// Pop from left\nconst popLeftIn = `\n from { opacity: 0; transform: translateX(-50%) scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: translateX(0) scale3d(1,1,1); }\n`;\nconst popLeftOut = `\n from { opacity:1; transform: translateX(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateX(-50%) scale3d(0.5,0.5,0.5); }\n`;\n\n// Pop from right\nconst popRightIn = `\n from { opacity: 0; transform: translateX(50%) scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: translateX(0) scale3d(1,1,1); }\n`;\nconst popRightOut = `\n from { opacity:1; transform: translateX(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateX(50%) scale3d(0.5,0.5,0.5); }\n`;\n\n// Export map\nexport const popMap = {\n popIn, // default popIn\n popOut,\n popBounceIn: bounceIn,\n popBounceOut: bounceOut,\n popUpIn,\n popUpOut,\n\n popRotateIn,\n popRotateOut,\n popBlurIn,\n popBlurOut,\n\n popLeftIn,\n popLeftOut,\n popRightIn,\n popRightOut,\n};\n","// core/injectKeyframe.ts\nconst injected = new Set<string>();\n\nexport function injectKeyframe(\n name: string,\n frames: string\n) {\n if (injected.has(name)) return;\n\n injected.add(name);\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-az-keyframe\", name);\n\n style.innerHTML = `\n@keyframes ${name} {\n${frames}\n}\n `.trim();\n\n document.head.appendChild(style);\n}\n","// core/createAnimate.ts\nimport type React from \"react\";\nimport { defaultDurationMap } from \"../animation/durations\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\nimport { animFramesMaps } from \"../key-frames\";\n\nimport { injectKeyframe } from \"./injectKeyframe\";\n\ntype Target =\n | HTMLElement\n | null\n | undefined\n | React.RefObject<HTMLElement>;\n\nfunction resolve(target?: Target): HTMLElement | null {\n if (!target) return null;\n if (typeof target === \"object\" && \"current\" in target) {\n return target.current;\n }\n return target;\n}\n\nexport function animate(target?: Target) {\n const el = resolve(target);\n let cleanup: (() => void) | null = null;\n\n function clear() {\n if (!el) return;\n el.style.animation = \"\";\n el.style.removeProperty(\"animation-name\");\n el.style.removeProperty(\"animation-duration\");\n el.style.removeProperty(\"animation-timing-function\");\n el.style.removeProperty(\"animation-iteration-count\");\n el.style.removeProperty(\"animation-fill-mode\");\n }\n\n function run(\n name: AnimName,\n opts: IFAnimateRecipeOptions = {}\n ) {\n if (!el) return;\n\n // cancel previous\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n\n const frames = animFramesMaps[name];\n if (frames) {\n injectKeyframe(`az-${name}`, frames);\n }\n\n const duration =\n opts.duration ??\n // @ts-ignore\n defaultDurationMap[name] ??\n \"1s\";\n\n // restart animation\n el.style.animation = \"none\";\n void el.offsetHeight;\n\n el.style.animationName = `az-${name}`;\n el.style.animationDuration =\n typeof duration === \"number\"\n ? `${duration}ms`\n : duration;\n\n el.style.animationTimingFunction =\n opts.timing ?? \"ease\";\n\n el.style.animationIterationCount =\n String(opts.iteration ?? 1);\n\n el.style.animationFillMode = \"both\";\n\n if (!opts.keep) {\n const onEnd = (e: AnimationEvent) => {\n if (e.target !== el) return;\n clear();\n el.removeEventListener(\"animationend\", onEnd);\n cleanup = null;\n };\n\n el.addEventListener(\"animationend\", onEnd);\n\n cleanup = () => {\n el.removeEventListener(\"animationend\", onEnd);\n clear();\n };\n }\n }\n\n function stop() {\n if (cleanup) cleanup();\n cleanup = null;\n clear();\n }\n\n return { run, stop };\n}\n","// animation/types.ts (MERGED)\nimport type { AnimName } from \"../key-frames\";\n\n/* =========================\n Timing Map\n========================= */\nexport const timingMap = {\n linear: \"linear\",\n ease: \"ease\",\n easeIn: \"ease-in\",\n easeOut: \"ease-out\",\n easeInOut: \"ease-in-out\",\n} as const;\n\nexport type TypeTimingKey = keyof typeof timingMap;\n\n/* =========================\n Base Styled Props\n========================= */\nexport interface IFBaseStyledElementProps {\n readonly type?: AnimName;\n readonly duration?: string | number;\n readonly timing?: TypeTimingKey;\n readonly delay?: string | number;\n readonly iteration?: number | \"infinite\";\n readonly direction?: \"normal\" | \"reverse\" | \"alternate\" | \"alternate-reverse\";\n readonly fillMode?: \"none\" | \"forwards\" | \"backwards\" | \"both\";\n}\n\n/* =========================\n Animate Props\n========================= */\nexport interface IFAnimateProps\n extends IFBaseStyledElementProps,\n React.HTMLAttributes<HTMLDivElement> {\n readonly tagName?: keyof JSX.IntrinsicElements | React.ElementType;\n readonly children: React.ReactNode | string;\n}\n\n/* =========================\n Unified Animate Options (MERGED)\n========================= */\nexport type TypeAnimationIntensity = \"soft\" | \"medium\" | \"hard\";\n\nexport interface IFAnimateOptions {\n intensity?: TypeAnimationIntensity;\n duration?: number | string;\n delay?: number;\n timing?: string;\n iteration?: number;\n keep?: boolean;\n}\n\nexport interface IFAnimateRecipeOptions extends IFAnimateOptions {\n // reserved for recipe / flow level\n}\n\nexport type TypeAnimateRecipeResolver =\n | AnimName\n | ((options?: IFAnimateRecipeOptions) => AnimName);\n","// AnimateStyled.tsx\nimport styled, { css, keyframes } from 'styled-components';\n\nimport { timingMap, IFBaseStyledElementProps } from '../animation/types';\nimport { animFramesMaps } from '../key-frames';\n\nconst blockedProps = [\n 'type',\n 'duration',\n 'timing',\n 'delay',\n 'iteration',\n 'direction',\n 'fillMode',\n 'tagName',\n];\n\nconst shouldForwardProp = (prop: string) => !blockedProps.includes(prop);\n\n/* =========================\n Styled Element\n========================= */\nexport const StyledElement = styled('div').withConfig({\n shouldForwardProp,\n})<IFBaseStyledElementProps>`\n margin: 0;\n padding: 0;\n\n ${({ type, duration, timing, delay, iteration, direction, fillMode }) => css`\n animation:\n ${type && `${css`${animFramesMaps[type]}`}`}\n ${typeof duration === 'number' ? `${duration}ms` : duration}\n ${timing ? timingMap[timing] : ''}\n ${typeof delay === 'number' ? `${delay}ms` : delay}\n ${iteration ?? ''}\n ${direction ?? ''}\n ${fillMode ?? ''};\n `}\n`;\n","import React, { forwardRef } from \"react\";\nimport { defaultDurationMap } from \"../animation/durations\";\nimport type { IFAnimateProps } from \"../animation/types\";\nimport { StyledElement } from \"./AnimateStyled\";\n\nexport const Animate = forwardRef<\n HTMLElement,\n IFAnimateProps\n>(function Animate(\n {\n tagName: Tag = \"div\",\n children,\n className,\n type = \"blurIn\",\n duration,\n timing = \"ease\",\n delay = \"0s\",\n direction = \"alternate\",\n fillMode = \"forwards\",\n ...props\n },\n ref\n) {\n const resolved =\n // @ts-ignore\n duration ?? defaultDurationMap[type] ?? \"1s\";\n\n const durationVal =\n typeof resolved === \"number\"\n ? `${resolved}ms`\n : resolved;\n\n return (\n <StyledElement\n as={Tag as any}\n ref={ref as any}\n className={className}\n type={type}\n duration={durationVal}\n timing={timing}\n delay={delay}\n iteration={props.iteration ?? 1}\n direction={direction}\n fillMode={fillMode}\n {...props}\n >\n {children}\n </StyledElement>\n );\n});\n\nexport default Animate;\n","import React, {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n useState,\n} from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport Animate from \"./Animate\";\n\nexport interface IFAnimateGroupProps {\n type: AnimName;\n stagger?: number;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const AnimateGroup: React.FC<IFAnimateGroupProps> = ({\n type,\n stagger = 80,\n children,\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(0);\n const items = Children.toArray(children);\n\n useEffect(() => {\n if (!stagger) {\n setVisibleCount(items.length);\n return;\n }\n\n let i = 0;\n const timer = setInterval(() => {\n i++;\n setVisibleCount(i);\n if (i >= items.length) clearInterval(timer);\n }, stagger);\n\n return () => clearInterval(timer);\n }, [stagger, items.length]);\n\n return (\n <div className={className}>\n {items.map((child, index) => {\n if (!isValidElement(child)) return child;\n if (index >= visibleCount) return null;\n\n return (\n <Animate key={index} type={type}>\n {cloneElement(child)}\n </Animate>\n );\n })}\n </div>\n );\n};\n","import React, {\n forwardRef,\n ElementType,\n} from \"react\";\nimport type { IFAnimateProps } from \"../animation/types\";\n\nimport Animate from \"./Animate\";\n\nexport interface IFAnimateHostProps<\n T extends ElementType = \"div\"\n> extends Omit<IFAnimateProps, \"children\"> {\n as?: T;\n children: React.ReactNode;\n}\n\nexport const AnimateHost = forwardRef<\n HTMLElement,\n IFAnimateHostProps\n>(function AnimateHost(\n { as, children, ...props },\n ref\n) {\n return (\n <Animate\n {...props}\n tagName={as}\n ref={ref as any}\n >\n {children}\n </Animate>\n );\n});\n\nexport default AnimateHost;\n","import { TypeRunFn } from \"../hooks\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"./types\";\n\nfunction wait(ms: number) {\n return new Promise<void>((r) => setTimeout(r, ms));\n}\n\nfunction nextFrame() {\n return new Promise<void>((r) =>\n requestAnimationFrame(() => r())\n );\n}\n\nexport class AnimateSequence {\n private run: TypeRunFn;\n private chain: Promise<void> = Promise.resolve();\n private currentVariant?: string;\n\n constructor(run: TypeRunFn) {\n this.run = run;\n }\n\n variant(name: string) {\n this.currentVariant = name;\n return this;\n }\n\n animate(name: AnimName, options?: IFAnimateRecipeOptions) {\n this.chain = this.chain\n .then(nextFrame)\n .then(() => {\n this.run(name, options);\n return wait(\n typeof options?.duration === 'number'\n ? options.duration\n : 300\n );\n });\n\n return this;\n }\n\n wait(ms: number) {\n this.chain = this.chain.then(() => wait(ms));\n return this;\n }\n\n parallel(\n steps: ((\n api: {\n animate: (\n name: AnimName,\n options?: IFAnimateRecipeOptions\n ) => void;\n }\n ) => void)[],\n waitAfter = 0\n ) {\n this.chain = this.chain\n .then(nextFrame)\n .then(() => {\n const tasks = steps.map(\n (fn) =>\n new Promise<void>((resolve) => {\n fn({\n animate: (name, options) => {\n this.run(\n name,\n options,\n this.currentVariant\n );\n setTimeout(\n resolve,\n // @ts-ignore\n options?.duration ?? 300\n );\n },\n });\n })\n );\n\n return Promise.all(tasks).then(() =>\n wait(waitAfter)\n );\n });\n\n return this;\n }\n}\n","// hooks/useAnimate.ts\nimport { useRef, useCallback } from \"react\";\nimport { animate } from \"../core/createAnimate\";\nimport type { AnimName } from \"../key-frames\";\nimport { AnimateSequence, IFAnimateRecipeOptions } from \"../animation\";\n\nexport function useAnimate<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n\n const run = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n if (!ref.current) return;\n animate(ref.current).run(name, opts);\n },\n []\n );\n\n const play = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n run(name, opts);\n },\n [run]\n );\n\n const reset = useCallback(() => {\n if (!ref.current) return;\n animate(ref.current).stop();\n }, []);\n\n const sequence = useCallback(() => {\n return new AnimateSequence(run);\n }, [run]);\n\n return {\n ref,\n run,\n play,\n reset,\n sequence,\n };\n}\n","import React, {\n useEffect,\n useRef,\n useState,\n ReactElement,\n cloneElement,\n} from \"react\";\n\nimport type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"../hooks/useAnimate\";\n\nexport interface IFAnimatePresenceProps {\n /** show / hide */\n show: boolean;\n enter: AnimName;\n exit: AnimName;\n duration?: number;\n children: ReactElement;\n}\n\nexport const AnimatePresence: React.FC<IFAnimatePresenceProps> = ({\n show,\n enter,\n exit,\n duration = 300,\n children,\n}) => {\n const anim = useAnimate<HTMLElement>();\n const [mounted, setMounted] = useState(show);\n const prev = useRef(show);\n\n useEffect(() => {\n // ---- ENTER ----\n if (show && !prev.current) {\n setMounted(true);\n }\n\n // ---- EXIT ----\n if (!show && prev.current) {\n anim.play(exit);\n\n const t = setTimeout(() => {\n setMounted(false);\n }, duration);\n\n return () => clearTimeout(t);\n }\n\n prev.current = show;\n }, [show, enter, exit, duration]);\n\n useEffect(() => {\n if (mounted && show) {\n anim.play(enter);\n }\n }, [mounted, show, enter]);\n\n if (!mounted) return null;\n\n return cloneElement(children, {\n ref: (node: any) => {\n anim.ref.current = node;\n\n const childRef = (children as any).ref;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef) {\n childRef.current = node;\n }\n },\n });\n}\n\nexport default AnimatePresence;\n","import React from 'react';\n\nimport { defaultDurationMap } from '../animation/durations';\nimport type { IFAnimateProps } from '../animation/types';\nimport { AnimName } from '../key-frames';\n\nimport { Animate } from './Animate';\n\nconst defaults = {\n delay: '0s',\n direction: 'normal',\n timing: 'ease',\n iteration: 1,\n fillMode: 'forwards',\n} as const;\n\nconst makeParams = (\n type?: AnimName,\n duration?: string | number,\n): Omit<IFAnimateProps, 'children'> => ({\n ...defaults,\n type,\n // @ts-ignore\n duration: duration ?? defaultDurationMap[type ?? 'blurIn'] ?? '1s',\n});\n\nexport const WrapperAnimate: React.FC<IFAnimateProps> = ({\n children,\n tagName,\n type,\n duration,\n ...props\n}) => (\n <Animate {...makeParams(type, duration)} tagName={tagName} {...props}>\n {children}\n </Animate>\n);\n","import React, {\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled, { keyframes } from 'styled-components';\n\nexport interface IFAnimateTypingProps {\n readonly heading?: string;\n readonly className?: string;\n\n /**\n * Text source (recommended)\n */\n readonly dataText?: string[] | string;\n\n /**\n * Fallback text source\n * Only string | string[] are supported\n */\n readonly children?: React.ReactNode | string | string[];\n\n readonly typingSpeed?: number;\n readonly deletingSpeed?: number;\n readonly pauseTime?: number;\n readonly cursorColor?: string | null;\n}\n\n/* =========================\n Cursor\n========================= */\nconst blink = keyframes`\n 50% { border-color: transparent; }\n`;\n\nconst Cursor = styled.span<{ cursorColor?: string | null }>`\n margin-left: 2px;\n border-left: 3px solid ${({ cursorColor }) => cursorColor || '#000'};\n animation: ${blink} 0.7s steps(1) infinite;\n`;\n\n/* =========================\n Component\n========================= */\nexport const AnimateTyping: React.FC<IFAnimateTypingProps> = ({\n heading,\n dataText,\n className,\n cursorColor = '#000',\n typingSpeed = 120,\n deletingSpeed = 40,\n pauseTime = 500,\n children,\n}) => {\n const [text, setText] = useState('');\n const [isDeleting, setIsDeleting] = useState(false);\n const [loopNum, setLoopNum] = useState(0);\n\n /* =========================\n Resolve text sources\n ========================= */\n const texts = useMemo<string[]>(() => {\n if (Array.isArray(dataText)) return dataText;\n if (typeof dataText === 'string') return [dataText];\n\n if (typeof children === 'string') return [children];\n\n if (\n Array.isArray(children) &&\n children.every(c => typeof c === 'string')\n ) {\n return children;\n }\n\n return [];\n }, [dataText, children]);\n\n const timerRef = useRef<number>();\n\n /* =========================\n Typing logic\n ========================= */\n useEffect(() => {\n if (!texts.length) return;\n\n const index = loopNum % texts.length;\n const fullText = texts[index];\n\n const nextText = isDeleting\n ? fullText.substring(0, text.length - 1)\n : fullText.substring(0, text.length + 1);\n\n const doneTyping = !isDeleting && nextText === fullText;\n const doneDeleting = isDeleting && nextText === '';\n\n timerRef.current = window.setTimeout(() => {\n setText(nextText);\n\n if (doneTyping) {\n setTimeout(() => setIsDeleting(true), pauseTime);\n }\n\n if (doneDeleting) {\n setIsDeleting(false);\n setLoopNum(v => v + 1);\n }\n }, isDeleting ? deletingSpeed : typingSpeed);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [\n text,\n isDeleting,\n loopNum,\n texts,\n typingSpeed,\n deletingSpeed,\n pauseTime,\n ]);\n\n /* =========================\n Render\n ========================= */\n return (\n <div className={className}>\n {heading && (\n <>\n <span>{heading}</span> \n </>\n )}\n\n <span>{text}</span>\n <Cursor cursorColor={cursorColor} />\n </div>\n );\n};\n\nexport default AnimateTyping;\n","import { useAnimate } from \"./useAnimate\";\n\nconst MAP = {\n success: \"pulse\",\n error: \"shakeMix\",\n loading: \"float\",\n warning: \"flash\",\n} as const;\n\nexport function useAttention<T extends HTMLElement>() {\n const anim = useAnimate<T>();\n\n return {\n ...anim,\n success: () => anim.play(MAP.success),\n error: () => anim.play(MAP.error),\n loading: () => anim.play(MAP.loading),\n warning: () => anim.play(MAP.warning),\n };\n}\n","import { useEffect, useState } from 'react';\n\ninterface IFUseTypingIFAnimateOptions {\n text: string;\n speed?: number;\n loop?: boolean;\n}\n\nexport function useTypingAnimate({\n text,\n speed = 50,\n loop = false,\n}: IFUseTypingIFAnimateOptions) {\n const [output, setOutput] = useState('');\n const [index, setIndex] = useState(0);\n const [done, setDone] = useState(false);\n\n useEffect(() => {\n if (index >= text.length) {\n setDone(true);\n\n if (!loop) return;\n\n const t = setTimeout(() => {\n setIndex(0);\n setOutput('');\n setDone(false);\n }, 800);\n\n return () => clearTimeout(t);\n }\n\n const t = setTimeout(() => {\n setOutput((s) => s + text[index]);\n setIndex((i) => i + 1);\n }, speed);\n\n return () => clearTimeout(t);\n }, [index, text, speed, loop]);\n\n return {\n output,\n isDone: done,\n reset: () => {\n setIndex(0);\n setOutput('');\n setDone(false);\n },\n };\n}\n","import { useRef, useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\n\nimport { useAnimate } from \"./useAnimate\";\n\nexport type RecipeState =\n | \"idle\"\n | \"loading\"\n | \"success\"\n | \"error\"\n | \"warning\";\n\nconst DEFAULT = {\n idle: \"fadeIn\",\n loading: \"float\",\n success: \"pulse\",\n error: \"shakeMix\",\n warning: \"flash\",\n} as const;\n\nexport function useRecipe(options?: {\n map?: Partial<Record<RecipeState, AnimName>>;\n autoReset?: boolean;\n resetDelay?: number;\n}) {\n const {\n map = DEFAULT,\n autoReset = true,\n resetDelay = 600,\n } = options || {};\n\n const anim = useAnimate<HTMLElement>();\n const timer = useRef<number | undefined>();\n\n const play = useCallback(\n (state: RecipeState) => {\n const name = map[state];\n if (!name) return;\n\n anim.play(name);\n\n if (autoReset && state !== \"loading\") {\n clearTimeout(timer.current);\n timer.current = window.setTimeout(\n anim.reset,\n resetDelay\n );\n }\n },\n [map, autoReset, resetDelay, anim]\n );\n\n return {\n ...anim,\n play,\n };\n}\n","/* =========================\n Core\n========================= */\nexport * from './core';\n\n/* =========================\n Components\n========================= */\nexport * from './components';\n\n/* =========================\n Hooks\n========================= */\nexport * from './hooks';\n\n/* =========================\n Animation Metadata\n========================= */\nexport {\n animNames,\n animGroups,\n timingMap,\n} from './key-frames';\n\nexport type {\n AnimName,\n TypeTimingKey,\n} from './key-frames';\n\n/* =========================\n Durations\n========================= */\nimport { defaultDurationMap } from './animation/durations';\nexport { defaultDurationMap };\n\n/* =========================\n Duration Presets\n========================= */\nexport const bounceDurations = {\n bounce: defaultDurationMap.bounce,\n bounceIn: defaultDurationMap.bounceIn,\n bounceOut: defaultDurationMap.bounceOut,\n bounceElastic: defaultDurationMap.bounceElastic,\n bounceJelly: defaultDurationMap.bounceJelly,\n} as const;\n\nexport const shakeDurations = {\n shakeMix: defaultDurationMap.shakeMix,\n shakeHorizontal: defaultDurationMap.shakeHorizontal,\n shakeVertical: defaultDurationMap.shakeVertical,\n shakeQuick: defaultDurationMap.shakeQuick,\n} as const;\n\nexport const fadeDurations = {\n fadeIn: defaultDurationMap.fadeIn,\n fadeOut: defaultDurationMap.fadeOut,\n blurIn: defaultDurationMap.blurIn,\n blurOut: defaultDurationMap.blurOut,\n} as const;\n\nexport const typingDurations = {\n typing: defaultDurationMap.typing,\n typingLoop: defaultDurationMap.typingLoop,\n typeWriter: defaultDurationMap.typeWriter,\n typeDelete: defaultDurationMap.typeDelete,\n} as const;\n\n/* =========================\n UX Defaults\n========================= */\nexport const defaultEnterDuration = defaultDurationMap.fadeIn;\nexport const defaultExitDuration = defaultDurationMap.fadeOut;\nexport const defaultAttentionDuration = defaultDurationMap.shakeMix;\nexport const defaultLoopDuration = defaultDurationMap.float;\n\nexport const UXDuration = {\n instant: '0.2s',\n fast: '0.5s',\n normal: '0.8s',\n slow: '1.2s',\n dramatic: '2s',\n} as const;\n\n/* =========================\n Default Export\n========================= */\nimport Animate from './components/Animate';\nexport default Animate;\n","// components/AnimateOn.tsx\nimport {\n useEffect,\n useRef,\n ReactElement,\n cloneElement,\n} from \"react\";\nimport { useAnimate } from \"../hooks/useAnimate\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nimport type { AnimName } from \"../key-frames\";\n\nexport interface IFAnimateOnProps<T = any> {\n when: T;\n value?: T;\n anim: AnimName | AnimName[];\n options?: IFAnimateRecipeOptions;\n children: ReactElement;\n}\n\nexport function AnimateOn<T>({\n when,\n value,\n anim,\n options,\n children,\n}: IFAnimateOnProps<T>) {\n const animApi = useAnimate<HTMLElement>();\n const prev = useRef<T>(when);\n\n useEffect(() => {\n let shouldPlay = false;\n\n if (value === undefined) {\n shouldPlay = when !== prev.current;\n } else {\n // trigger khi when chạm value\n shouldPlay =\n when === value && prev.current !== value;\n }\n\n if (shouldPlay) {\n if (Array.isArray(anim)) {\n const seq = animApi.sequence();\n anim.forEach((name) => {\n seq.animate(name, options);\n });\n } else {\n animApi.play(anim, options);\n }\n }\n\n prev.current = when;\n }, [when, value, anim, options, animApi]);\n\n return cloneElement(children, {\n ref: (node: HTMLElement | null) => {\n animApi.ref.current = node;\n\n const childRef = (children as any).ref;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef && \"current\" in childRef) {\n childRef.current = node;\n }\n },\n });\n}\n\nexport default AnimateOn;\n","import { useTypingAnimate } from \"../hooks\";\n\ninterface TypingTextProps {\n text: string;\n speed?: number;\n loop?: boolean;\n as?: keyof JSX.IntrinsicElements;\n}\n\nexport function TypingText({\n text,\n speed,\n loop,\n as: Tag = 'span',\n}: TypingTextProps) {\n const { output } = useTypingAnimate({ text, speed, loop });\n return <Tag>{output}</Tag>;\n}\n","import { useMemo, useCallback, useEffect } from 'react';\n\nimport type { AnimName } from '../key-frames';\nimport type { IFAnimateRecipeOptions } from '../animation/types';\nimport { createRecipe } from '../core/recipe';\n\nimport { useAnimate } from './useAnimate';\n\n/* =========================\n Types\n========================= */\n\nexport interface IFUseAnimateControllerOptions {\n initial?: AnimName;\n recipe?: Partial<\n Record<\n string,\n AnimName | ((o?: IFAnimateRecipeOptions) => AnimName)\n >\n >;\n}\n\n/* =========================\n Hook\n========================= */\n\nexport function useAnimateController<T extends HTMLElement>(\n options: IFUseAnimateControllerOptions = {}\n) {\n const anim = useAnimate<T>();\n\n /* ---------- play with fallback ---------- */\n const play = useCallback(\n (name?: AnimName, opts?: IFAnimateRecipeOptions) => {\n const animName = name ?? options.initial;\n if (!animName) return;\n anim.play(animName, opts);\n },\n [anim.play, options.initial]\n );\n\n /* ---------- auto initial ---------- */\n useEffect(() => {\n if (options.initial) {\n play(options.initial);\n }\n }, [options.initial, play]);\n\n /* ---------- recipe ---------- */\n const recipe = useMemo(() => {\n if (!options.recipe) return undefined;\n return createRecipe(anim.run, options.recipe);\n }, [anim.run, options.recipe]);\n\n return {\n ...anim,\n\n /* override / extend */\n play,\n recipe,\n };\n}\n\n","// core/recipe.ts\nimport type { AnimName } from \"../key-frames\";\nimport type {\n IFAnimateRecipeOptions,\n TypeAnimateRecipeResolver,\n} from \"../animation/types\";\n\nexport type TypeRecipeKey =\n | \"idle\"\n | \"enter\"\n | \"exit\"\n | \"loading\"\n | \"success\"\n | \"error\"\n | \"attention\";\n\nexport type TypeRecipeConfig = Partial<\n Record<TypeRecipeKey, TypeAnimateRecipeResolver>\n>;\n\nexport function createRecipe(\n run: (name: AnimName, options?: IFAnimateRecipeOptions) => void,\n config: TypeRecipeConfig\n) {\n const api: any = {};\n\n Object.keys(config).forEach((key) => {\n api[key] = (options?: IFAnimateRecipeOptions) => {\n const resolver = config[key as TypeRecipeKey];\n if (!resolver) return;\n\n const anim =\n typeof resolver === \"function\"\n ? resolver(options)\n : resolver;\n\n run(anim, options);\n };\n });\n\n api.run = (key: TypeRecipeKey, options?: IFAnimateRecipeOptions) => {\n const resolver = config[key];\n if (!resolver) return;\n\n const anim =\n typeof resolver === \"function\"\n ? resolver(options)\n : resolver;\n\n run(anim, options);\n };\n\n return api as Record<\n TypeRecipeKey,\n (options?: IFAnimateRecipeOptions) => void\n > & {\n run: (key: TypeRecipeKey, options?: IFAnimateRecipeOptions) => void;\n };\n}\n","// hooks/useAnimateSequence.ts\nimport { useCallback, useMemo } from \"react\";\nimport { animate } from \"../core/createAnimate\";\nimport { AnimateSequence, IFAnimateRecipeOptions } from \"../animation\";\nimport { AnimName } from \"../key-frames\";\n\nexport function useAnimateSequence<T extends HTMLElement>(\n ref: React.RefObject<T>\n) {\n const run = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n if (!ref.current) return;\n animate(ref.current).run(name, opts);\n },\n [ref]\n );\n\n return useMemo(\n () => new AnimateSequence(run),\n [run]\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useAutoAnimate<T extends HTMLElement>(\n value: any,\n options: { change: AnimName }\n) {\n const anim = useAnimate<T>();\n const prev = useRef(value);\n\n useEffect(() => {\n if (prev.current !== value) {\n anim.play(options.change);\n prev.current = value;\n }\n }, [value, options.change, anim]);\n\n return anim;\n}\n","import type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useFocusAnimate(options: {\n focus?: AnimName;\n blur?: AnimName;\n}) {\n const anim = useAnimate<HTMLElement>();\n\n return {\n ...anim,\n bind: {\n ref: anim.ref,\n onFocus: () => options.focus && anim.play(options.focus),\n onBlur: () => options.blur && anim.play(options.blur),\n }\n };\n}\n","import type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useHoverAnimate(options: {\n enter?: AnimName;\n leave?: AnimName;\n}) {\n const anim = useAnimate<HTMLElement>();\n\n return {\n ...anim,\n bind: {\n ref: anim.ref,\n onMouseEnter: () => options.enter && anim.play(options.enter),\n onMouseLeave: () => options.leave && anim.play(options.leave),\n },\n };\n}\n","import { useCallback } from \"react\";\nimport { useAnimate } from \"./useAnimate\";\nimport { AnimName } from \"../key-frames\";\n\nexport function usePairedAnimate<T extends HTMLElement>(options: {\n enter: AnimName;\n leave: AnimName;\n visibleDuration?: number;\n}) {\n const { ref, sequence, play } = useAnimate<T>();\n\n const show = useCallback(() => {\n sequence()\n .animate(options.enter)\n .wait(options.visibleDuration ?? 1000)\n .animate(options.leave);\n }, [sequence, options]);\n\n return { ref, show, play };\n}\n","import { useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nexport function useRandomAnimate(\n run: (name: AnimName, o?: IFAnimateRecipeOptions) => void,\n pool: readonly AnimName[]\n) {\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length) return;\n const name =\n pool[Math.floor(Math.random() * pool.length)];\n run(name, options);\n },\n [run, pool]\n );\n}\n","import { useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type {\n IFAnimateRecipeOptions,\n TypeAnimationIntensity,\n} from \"../animation/types\";\nimport { TypeRunFn } from \"./types\";\n\ntype TypeIntensityPool = Record<\n TypeAnimationIntensity,\n readonly AnimName[]\n>;\n\nexport function useRandomAnimateByIntensity(\n run: TypeRunFn,\n pool: TypeIntensityPool\n) {\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n const intensity = options?.intensity ?? \"medium\";\n const list = pool[intensity];\n if (!list?.length) return;\n\n const name = list[Math.floor(Math.random() * list.length)];\n run(name, options);\n },\n [run, pool]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nimport { TypeRunFn } from \"./types\";\n\nexport function useRandomAnimateNoRepeat(\n run: TypeRunFn,\n pool: readonly AnimName[]\n) {\n const lastRef = useRef<AnimName | null>(null);\n\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length) return;\n\n let next: AnimName;\n do {\n next = pool[Math.floor(Math.random() * pool.length)];\n } while (pool.length > 1 && next === lastRef.current);\n\n lastRef.current = next;\n run(next, options);\n },\n [run, pool]\n );\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\nimport type { TypeRunFn } from \"./types\";\n\ninterface IFWeightedAnim {\n name: AnimName;\n weight: number;\n}\n\nexport function useWeightedRandomAnimate(\n run: TypeRunFn,\n pool: readonly IFWeightedAnim[]\n) {\n const totalWeight = useMemo(\n () => pool.reduce((s, p) => s + Math.max(0, p.weight), 0),\n [pool]\n );\n\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length || totalWeight <= 0) return;\n\n let r = Math.random() * totalWeight;\n\n for (const item of pool) {\n const w = Math.max(0, item.weight);\n r -= w;\n if (r <= 0) {\n run(item.name, options);\n return;\n }\n }\n },\n [run, pool, totalWeight]\n );\n}\n"],"names":["defaultDurationMap","bounce","bounceIn","bounceOut","bounceElastic","bounceSmall","bounceRotate","bounceJelly","jelly","jellyX","jellyY","jellyIn","jellyOut","shakeMix","shakeHorizontal","shakeVertical","shakeDiagonal","shakeQuick","pulse","pulseInOut","pulseFade","pulseFast","pulseColor","heartBeat","float","floatSway","floatHorizontal","floatCircular","floatWiggle","orbit","orbitEllipse","flash","flashIrregular","flashFast","flashSlow","flashPulse","glow","glowTextFlicker","glowRainbow","glowBreathing","glowGlitch","blurIn","blurOut","fadeIn","fadeOut","slideInFromLeft","slideInFromRight","slideOutToLeft","slideOutToRight","zoomIn","zoomOut","spin","spin3D","flip","flipIn","flipOut","typing","typingLoop","typeWriter","typeDelete","swing","tada","hinge","attentionMap","rubberBand","jello","wobble","rollIn","jackInTheBox","blurMap","blurInZoom","blurInScale","blurInUp","blurInRotate","blurOutZoom","blurOutScale","blurOutDown","blurOutRotate","bounceMap","bounceSide","bounceDiagonal","bounceFlip","bounceFade","bounceCrazy","bounceGlow","bounceFadeScale","bounceSparkle","bounceRainbow","fadeInFromLeft","fadeInFromRight","fadeInFromTop","fadeInFromBottom","fadeMap","fadeOutToLeft","fadeOutToRight","fadeOutToTop","fadeOutToBottom","fadeInUp","fadeInDown","fadeInLeft","fadeInRight","fadeInZoom","fadeOutZoom","fadeInRotate","fadeOutRotate","fadeInSkew","fadeOutSkew","fadeInFlipX","fadeOutFlipX","fadeInFlipY","fadeOutFlipY","fadeInPerspective","fadeOutPerspective","fadeInBlur","fadeOutBlur","fadeInColor","fadeOutColor","fadePulse","fadeBounce","fadeSwing","fadeZoomRotate","fadeElastic","fadeShine","animFramesMaps","effect3D","neonGlow","retro3D","emboss","fireGlow","iceGlow","shine","flashGlow","flashColor","flashStrobe","flashSoft","flashReversePulse","floatPulse","floatDiagonal","floatSwing","floatWave","floatDrift","shadow","shadowText","shadowPulse","shadowNeon","spinX","spinBounce","swingPivot","swingX","swingY","squeezeMix","squeezeHorizontal","squeezeVertical","squeezeDiagonal","squeezePulse","squeezeBounce","squeezeElastic","squeezeFlash","shakeRotate","shakeSkew","shakeBounce","shakeCrazy","squeezeThenShakeX","shakeYThenSqueeze","squeezeShakeCrazy","slideInFromTop","slideInFromBottom","slideOutToTop","slideOutToBottom","slideInFromLeftOvershoot","slideInFromRightOvershoot","slideOutToLeftOvershoot","slideOutToRightOvershoot","slideInFromTopOvershoot","slideInFromBottomOvershoot","slideOutToTopOvershoot","slideOutToBottomOvershoot","flipSlowDown","flipToLeft","flipToRight","flipFromTop","flipToTop","flipToBottom","flipFromBottom","flipFromLeftToCenter","flipFromRightToCenter","flipRich","flipToTopRich","flipToBottomRich","flipToTopLeftRich","flipToRightRich","flipFromTopRich","flipFromBottomRich","flipFromLeftToCenterRich","flipFromRightToCenterRich","fold","unfold","foldDeep","unfoldDeep","foldLeft","unfoldLeft","foldRight","unfoldRight","foldUp","unfoldUp","foldDown","unfoldDown","hangOnLeft","hangOnRight","hangOnTop","hangOnBottom","hangOnLeftSwing","hangOnRightSwing","hangOnTopSwing","hangOnBottomSwing","hangOnOscillate","hangOnDrop","zoomInFromLeft","zoomInFromRight","zoomInFromTop","zoomInFromBottom","zoomOutToLeft","zoomOutToRight","zoomOutToTop","zoomOutToBottom","zoomInRotate","zoomOutRotate","zoomInFlipX","zoomOutFlipX","zoomInFlipY","zoomOutFlipY","zoomPulse","zoomSwing","rotateCW","rotateACW","rotateSlowDown","rotateX","rotateY","rotateFromLeft","rotateFromRight","rotateToLeft","rotateToRight","rotateFromTop","rotateFromBottom","rotateToTop","rotateToBottom","lightSpeedInLeft","lightSpeedOutRight","popIn","popOut","popBounceIn","popBounceOut","popUpIn","popUpOut","popRotateIn","popRotateOut","popBlurIn","popBlurOut","popLeftIn","popLeftOut","popRightIn","popRightOut","animNames","Object","keys","animGroups","fromEntries","name","key","prefix","map","filter","startsWith","injected","Set","animate","target","el","current","resolve","cleanup","clear","style","animation","removeProperty","run","opts","frames","has","add","document","createElement","setAttribute","innerHTML","trim","head","appendChild","injectKeyframe","duration","offsetHeight","animationName","animationDuration","animationTimingFunction","timing","animationIterationCount","String","iteration","animationFillMode","keep","onEnd","e","removeEventListener","addEventListener","stop","timingMap","linear","ease","easeIn","easeOut","easeInOut","blockedProps","StyledElement","styled","withConfig","shouldForwardProp","prop","includes","type","delay","direction","fillMode","css","Animate","forwardRef","tagName","Tag","children","className","props","ref","resolved","durationVal","_jsx","jsx","as","Animate$1","AnimateHost","wait","ms","Promise","r","setTimeout","nextFrame","requestAnimationFrame","AnimateSequence","constructor","this","chain","variant","currentVariant","options","then","parallel","steps","waitAfter","tasks","fn","all","useAnimate","useRef","useCallback","play","reset","sequence","defaults","makeParams","blink","keyframes","Cursor","span","cursorColor","MAP","useTypingAnimate","text","speed","loop","output","setOutput","useState","index","setIndex","done","setDone","useEffect","length","t","clearTimeout","s","i","isDone","DEFAULT","idle","loading","success","error","warning","bounceDurations","shakeDurations","fadeDurations","typingDurations","defaultEnterDuration","defaultExitDuration","defaultAttentionDuration","defaultLoopDuration","stagger","visibleCount","setVisibleCount","items","Children","toArray","timer","setInterval","clearInterval","child","isValidElement","cloneElement","when","value","anim","animApi","prev","shouldPlay","undefined","Array","isArray","seq","forEach","node","childRef","show","enter","exit","mounted","setMounted","heading","dataText","typingSpeed","deletingSpeed","pauseTime","setText","isDeleting","setIsDeleting","loopNum","setLoopNum","texts","useMemo","every","c","timerRef","fullText","nextText","substring","doneTyping","doneDeleting","window","v","_jsxs","jsxs","_Fragment","Fragment","instant","fast","normal","slow","dramatic","animName","initial","recipe","config","api","resolver","createRecipe","change","bind","onFocus","focus","onBlur","blur","onMouseEnter","onMouseLeave","leave","visibleDuration","pool","Math","floor","random","list","intensity","lastRef","next","autoReset","resetDelay","state","totalWeight","reduce","p","max","weight","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/animation/durations.ts","../src/key-frames/attention.tsx","../src/key-frames/blur.tsx","../src/key-frames/bounce.tsx","../src/key-frames/fade.tsx","../src/key-frames/index.ts","../src/key-frames/textEffects.tsx","../src/key-frames/flash.tsx","../src/key-frames/float.tsx","../src/key-frames/glowing.tsx","../src/key-frames/jelly.tsx","../src/key-frames/motion.tsx","../src/key-frames/pulse.tsx","../src/key-frames/squeezeShake.tsx","../src/key-frames/slide.tsx","../src/key-frames/flip.tsx","../src/key-frames/fold.tsx","../src/key-frames/hangOn.tsx","../src/key-frames/zoom.tsx","../src/key-frames/rotate.tsx","../src/key-frames/funMap.tsx","../src/key-frames/pop.tsx","../src/core/injectKeyframe.ts","../src/core/createAnimate.ts","../src/animation/types.ts","../src/components/AnimateStyled.ts","../src/components/Animate.tsx","../src/components/AnimateGroup.tsx","../src/components/AnimateHost.tsx","../src/animation/sequence.ts","../src/hooks/useAnimate.ts","../src/components/AnimatePresence.tsx","../src/components/WrapperAnimate.tsx","../src/components/Typing.tsx","../src/hooks/useAttention.ts","../src/hooks/useTypingAnimate.ts","../src/hooks/useRecipe.ts","../src/index.ts","../src/components/AnimateOn.tsx","../src/components/TypingText.tsx","../src/hooks/useAnimateController.ts","../src/core/recipe.ts","../src/hooks/useAnimateSequence.ts","../src/hooks/useAutoAnimate.ts","../src/hooks/useFocusAnimate.ts","../src/hooks/useHoverAnimate.ts","../src/hooks/usePairedAnimate.ts","../src/hooks/useRandomAnimate.ts","../src/hooks/useRandomAnimateByIntensity.ts","../src/hooks/useRandomAnimateNoRepeat.ts","../src/hooks/useWeightedRandomAnimate.ts"],"sourcesContent":["export const defaultDurationMap = {\n bounce: '1s',\n bounceIn: '1s',\n bounceOut: '1s',\n bounceElastic: '1.2s',\n bounceSmall: '0.8s',\n bounceRotate: '1s',\n bounceJelly: '1.2s',\n jelly: '1s',\n jellyX: '1s',\n jellyY: '1s',\n jellyIn: '1s',\n jellyOut: '1s',\n shakeMix: '0.8s',\n shakeHorizontal: '0.8s',\n shakeVertical: '0.8s',\n shakeDiagonal: '0.8s',\n shakeQuick: '0.5s',\n pulse: '1s',\n pulseInOut: '1.2s',\n pulseFade: '1.2s',\n pulseFast: '0.6s',\n pulseColor: '1.2s',\n heartBeat: '1.3s',\n\n float: '2s',\n floatSway: '2.5s',\n floatHorizontal: '2.5s',\n floatCircular: '3s',\n floatWiggle: '2s',\n orbit: '3s',\n orbitEllipse: '3s',\n\n flash: '0.8s',\n flashIrregular: '1.2s',\n flashFast: '0.5s',\n flashSlow: '1.5s',\n flashPulse: '1s',\n glow: '1.5s',\n glowTextFlicker: '2s',\n glowRainbow: '3s',\n glowBreathing: '2.5s',\n glowGlitch: '1.2s',\n\n blurIn: '0.8s',\n blurOut: '0.8s',\n fadeIn: '0.8s',\n fadeOut: '0.8s',\n\n slideInFromLeft: '0.8s',\n slideInFromRight: '0.8s',\n slideOutToLeft: '0.8s',\n slideOutToRight: '0.8s',\n\n zoomIn: '1s',\n zoomOut: '1s',\n\n spin: '2s',\n spin3D: '2.5s',\n\n flip: '1s',\n flipIn: '1s',\n flipOut: '1s',\n\n typing: '2s',\n typingLoop: '2.5s',\n typeWriter: '3s',\n typeDelete: '1.5s',\n\n swing: '1s',\n tada: '1s',\n hinge: '2s',\n} as const;\n","const rubberBand = `\n from { transform: scale3d(1,1,1); }\n 30% { transform: scale3d(1.25,.75,1); }\n 40% { transform: scale3d(.75,1.25,1); }\n 50% { transform: scale3d(1.15,.85,1); }\n 65% { transform: scale3d(.95,1.05,1); }\n 75% { transform: scale3d(1.05,.95,1); }\n to { transform: scale3d(1,1,1); }\n`;\n\nconst jello = `\n from, 11.1%, to { transform: none; }\n 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg) scale3d(1,1,1); }\n 33.3% { transform: skewX(6.25deg) skewY(6.25deg) scale3d(1,1,1); }\n 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg) scale3d(1,1,1); }\n 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg) scale3d(1,1,1); }\n 66.6% { transform: skewX(-.78125deg) skewY(-.78125deg) scale3d(1,1,1); }\n 77.7% { transform: skewX(.390625deg) skewY(.390625deg) scale3d(1,1,1); }\n 88.8% { transform: skewX(-.1953125deg) skewY(-.1953125deg) scale3d(1,1,1); }\n`;\n\nconst wobble = `\n from { transform: translate3d(0,0,0) scale3d(1,1,1); }\n 15% { transform: translate3d(-25%,0,0) rotate(-5deg) scale3d(1,1,1); }\n 30% { transform: translate3d(20%,0,0) rotate(3deg) scale3d(1,1,1); }\n 45% { transform: translate3d(-15%,0,0) rotate(-3deg) scale3d(1,1,1); }\n 60% { transform: translate3d(10%,0,0) rotate(2deg) scale3d(1,1,1); }\n 75% { transform: translate3d(-5%,0,0) rotate(-1deg) scale3d(1,1,1); }\n to { transform: translate3d(0,0,0) scale3d(1,1,1); }\n`;\n\nconst rollIn = `\n from { opacity: 0; transform: translate3d(-100%,0,0) rotate(-120deg) scale3d(1,1,1); }\n to { opacity: 1; transform: translate3d(0,0,0) rotate(0deg) scale3d(1,1,1); }\n`;\n\nconst jackInTheBox = `\n from { opacity: 0; transform: scale3d(.1,.1,.1) rotate(30deg); transform-origin: center bottom; }\n 50% { transform: rotate(-10deg) scale3d(.5,.5,.5); }\n 70% { transform: rotate(3deg) scale3d(.8,.8,.8); }\n to { opacity: 1; transform: scale3d(1,1,1); }\n`;\n\nexport const attentionMap = {\n rubberBand,\n jello,\n wobble,\n rollIn,\n jackInTheBox,\n};\n","/* =====================\n BLUR IN (appear effects)\n===================== */\n\n// Basic – blurred → sharp\nconst blurIn = `\n from { filter: blur(5px); opacity: 0; }\n to { filter: blur(0); opacity: 1; }\n`;\n\n// Zoom In – scale up slightly while fading in\nconst blurInZoom = `\n from { opacity: 0; transform: scale(0.9); filter: blur(6px); }\n to { opacity: 1; transform: scale(1); filter: blur(0); }\n`;\n\n// Scale Down – starts larger, settles to normal\nconst blurInScale = `\n from { opacity: 0; transform: scale(1.1); filter: blur(6px); }\n to { opacity: 1; transform: scale(1); filter: blur(0); }\n`;\n\n// Move Up – slide from bottom + sharpen\nconst blurInUp = `\n from { opacity: 0; transform: translateY(40px); filter: blur(6px); }\n to { opacity: 1; transform: translateY(0); filter: blur(0); }\n`;\n\n// Rotate – rotate slightly while appearing\nconst blurInRotate = `\n from { opacity: 0; transform: rotate(-10deg) scale(0.95); filter: blur(6px); }\n to { opacity: 1; transform: rotate(0deg) scale(1); filter: blur(0); }\n`;\n\n/* =====================\n BLUR OUT (disappear effects)\n===================== */\n\n// Basic – sharp → blurred\nconst blurOut = `\n from { filter: blur(0); opacity: 1; }\n to { filter: blur(6px); opacity: 0; }\n`;\n\n// Zoom Out – scale down while fading out\nconst blurOutZoom = `\n from { opacity: 1; transform: scale(1); filter: blur(0); }\n to { opacity: 0; transform: scale(0.9); filter: blur(6px); }\n`;\n\n// Scale Up – grows slightly while vanishing\nconst blurOutScale = `\n from { opacity: 1; transform: scale(1); filter: blur(0); }\n to { opacity: 0; transform: scale(1.1); filter: blur(6px); }\n`;\n\n// Move Down – slide down + blur out\nconst blurOutDown = `\n from { opacity: 1; transform: translateY(0); filter: blur(0); }\n to { opacity: 0; transform: translateY(40px); filter: blur(6px); }\n`;\n\n// Rotate – rotate slightly while fading out\nconst blurOutRotate = `\n from { opacity: 1; transform: rotate(0deg) scale(1); filter: blur(0); }\n to { opacity: 0; transform: rotate(10deg) scale(0.95); filter: blur(6px); }\n`;\n\nexport const blurMap = {\n // In\n blurIn,\n blurInZoom,\n blurInScale,\n blurInUp,\n blurInRotate,\n\n // Out\n blurOut,\n blurOutZoom,\n blurOutScale,\n blurOutDown,\n blurOutRotate,\n};\n","// 1. Classic Bounce\nconst bounce = `\n 0%, 20%, 50%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-30px); }\n 60% { transform: translateY(-15px); }\n`;\n\nconst bounceIn = `\n 0% { opacity: 0; transform: scale(.3); }\n 50% { opacity: 1; transform: scale(1.05); }\n 70% { transform: scale(.9); }\n 100% { transform: scale(1); }\n`;\nconst bounceOut = `\n 20% { transform: scale(.9); }\n 50%, 55% { opacity: 1; transform: scale(1.1); }\n to { opacity: 0; transform: scale(.3); }\n`;\n\n// 2. Elastic Bounce\nconst bounceElastic = `\n 10% { transform: scaleY(0.9) translateY(5%); }\n 45% { transform: scaleY(1.2) translateY(-100%); }\n 65% { transform: scaleY(0.95) translateY(0); }\n 75% { transform: scaleY(1.05) translateY(-25%); }\n 85%, 100% { transform: scaleY(1) translateY(0); }\n`;\n\n// 3. Small Bounce\nconst bounceSmall = `\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-6px); }\n`;\n\n// 4. Rotate Bounce\nconst bounceRotate = `\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 40% { transform: translateY(-20px) rotate(-5deg); }\n 60% { transform: translateY(-10px) rotate(5deg); }\n`;\n\n// 5. Jelly Bounce\nconst bounceJelly = `\n 0%, 100% { transform: scale(1, 1); }\n 30% { transform: scale(1.25, 0.75); }\n 40% { transform: scale(0.75, 1.25); }\n 50% { transform: scale(1.15, 0.85); }\n 65% { transform: scale(0.95, 1.05); }\n 75% { transform: scale(1.05, 0.95); }\n`;\n\n// 6. Side Bounce\nconst bounceSide = `\n 0%, 100% { transform: translateX(0); }\n 30% { transform: translateX(-20px); }\n 60% { transform: translateX(15px); }\n`;\n\n// 7. Diagonal Bounce\nconst bounceDiagonal = `\n 0%, 100% { transform: translate(0,0); }\n 30% { transform: translate(-15px,-20px); }\n 60% { transform: translate(12px,15px); }\n`;\n\n// 8. Flip Bounce\nconst bounceFlip = `\n 0% { transform: translateY(0) rotateY(0deg); }\n 40% { transform: translateY(-25px) rotateY(180deg); }\n 70% { transform: translateY(-10px) rotateY(360deg); }\n 100% { transform: translateY(0) rotateY(360deg); }\n`;\n\n// 9. Bounce Fade\nconst bounceFade = `\n 0% { opacity: 0; transform: translateY(0); }\n 40% { opacity: 1; transform: translateY(-20px); }\n 70% { transform: translateY(-10px); }\n 100% { opacity: 0; transform: translateY(0); }\n`;\n\n// 10. Crazy Bounce\nconst bounceCrazy = `\n 0% { transform: translateY(0); }\n 20% { transform: translateY(-25px) rotate(-5deg); }\n 40% { transform: translateY(15px) rotate(5deg); }\n 60% { transform: translateY(-20px) rotate(-8deg); }\n 80% { transform: translateY(10px) rotate(6deg); }\n 100% { transform: translateY(0) rotate(0); }\n`;\n\n// 1. Bounce Glow\nconst bounceGlow = `\n 0%, 100% { transform: translateY(0); box-shadow: 0 0 0px rgba(255, 255, 0, 0); }\n 40% { transform: translateY(-20px); box-shadow: 0 0 20px rgba(255, 255, 0, 0.8); }\n 60% { transform: translateY(-10px); box-shadow: 0 0 10px rgba(255, 255, 0, 0.6); }\n`;\n\n// 2. Bounce Fade Scale\nconst bounceFadeScale = `\n 0% { opacity: 0; transform: scale(0.5) translateY(0); }\n 40% { opacity: 1; transform: scale(1.2) translateY(-25px); }\n 70% { opacity: 0.8; transform: scale(0.9) translateY(-10px); }\n 100% { opacity: 0; transform: scale(0.5) translateY(0); }\n`;\n\n// 3. Bounce Sparkle\nconst bounceSparkle = `\n 0% { transform: translateY(0) scale(1); filter: brightness(1); }\n 30% { transform: translateY(-20px) scale(1.2); filter: brightness(1.6); }\n 60% { transform: translateY(-10px) scale(0.9); filter: brightness(1.2); }\n 100% { transform: translateY(0) scale(1); filter: brightness(1); }\n`;\n\n// 4. Bounce Rainbow\nconst bounceRainbow = `\n 0% { transform: translateY(0); color: red; }\n 25% { transform: translateY(-20px); color: orange; }\n 50% { transform: translateY(-10px); color: yellow; }\n 75% { transform: translateY(-15px); color: green; }\n 100% { transform: translateY(0); color: blue; }\n`;\n\nexport const bounceMap = {\n bounce,\n bounceIn,\n bounceOut,\n bounceElastic,\n bounceSmall,\n bounceRotate,\n bounceJelly,\n bounceSide,\n bounceDiagonal,\n bounceFlip,\n bounceFade,\n bounceCrazy,\n bounceGlow,\n bounceFadeScale,\n bounceSparkle,\n bounceRainbow,\n};\n","// --- Basic ---\nconst fadeIn = `\n from { opacity: 0; }\n to { opacity: 1; }\n`;\nconst fadeOut = `\n from { opacity: 1; }\n to { opacity: 0; }\n`;\n\n// --- Directional ---\nconst fadeInFromLeft = `\n from { opacity: 0; transform: translateX(-100%); }\n to { opacity: 1; transform: translateX(0); }\n`;\nconst fadeInFromRight = `\n from { opacity: 0; transform: translateX(100%); }\n to { opacity: 1; transform: translateX(0); }\n`;\nconst fadeInFromTop = `\n from { opacity: 0; transform: translateY(-100%); }\n to { opacity: 1; transform: translateY(0); }\n`;\nconst fadeInFromBottom = `\n from { opacity: 0; transform: translateY(100%); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\nconst fadeOutToLeft = `\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(-100%); }\n`;\nconst fadeOutToRight = `\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(100%); }\n`;\nconst fadeOutToTop = `\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(-100%); }\n`;\nconst fadeOutToBottom = `\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(100%); }\n`;\n\n// --- Scale ---\nconst fadeInZoom = `\n from { opacity: 0; transform: scale(0.5); }\n to { opacity: 1; transform: scale(1); }\n`;\nconst fadeOutZoom = `\n from { opacity: 1; transform: scale(1); }\n to { opacity: 0; transform: scale(0.5); }\n`;\n\n// --- Rotate ---\nconst fadeInRotate = `\n from { opacity: 0; transform: rotate(-45deg); }\n to { opacity: 1; transform: rotate(0); }\n`;\nconst fadeOutRotate = `\n from { opacity: 1; transform: rotate(0); }\n to { opacity: 0; transform: rotate(45deg); }\n`;\n\n// --- Skew ---\nconst fadeInSkew = `\n from { opacity: 0; transform: skewX(-30deg); }\n to { opacity: 1; transform: skewX(0); }\n`;\nconst fadeOutSkew = `\n from { opacity: 1; transform: skewX(0); }\n to { opacity: 0; transform: skewX(30deg); }\n`;\n\n// --- Flip (3D) ---\nconst fadeInFlipX = `\n from { opacity: 0; transform: rotateX(90deg); }\n to { opacity: 1; transform: rotateX(0); }\n`;\n\nconst fadeOutFlipX = `\n from { opacity: 1; transform: rotateX(0); }\n to { opacity: 0; transform: rotateX(-90deg); }\n`;\nconst fadeInFlipY = `\n from { opacity: 0; transform: rotateY(90deg); }\n to { opacity: 1; transform: rotateY(0); }\n`;\nconst fadeOutFlipY = `\n from { opacity: 1; transform: rotateY(0); }\n to { opacity: 0; transform: rotateY(-90deg); }\n`;\n\n// --- Perspective (3D depth) ---\nconst fadeInPerspective = `\n from { opacity: 0; transform: perspective(400px) translateZ(-200px); }\n to { opacity: 1; transform: perspective(400px) translateZ(0); }\n`;\nconst fadeOutPerspective = `\n from { opacity: 1; transform: perspective(400px) translateZ(0); }\n to { opacity: 0; transform: perspective(400px) translateZ(-200px); }\n`;\n\n// --- Fade with Blur ---\nconst fadeInBlur = `\n from { opacity: 0; filter: blur(10px); }\n to { opacity: 1; filter: blur(0); }\n`;\nconst fadeOutBlur = `\n from { opacity: 1; filter: blur(0); }\n to { opacity: 0; filter: blur(10px); }\n`;\n\n// --- Fade with Color Shift ---\nconst fadeInColor = `\n from { opacity: 0; filter: hue-rotate(180deg); }\n to { opacity: 1; filter: hue-rotate(0); }\n`;\nconst fadeOutColor = `\n from { opacity: 1; filter: hue-rotate(0); }\n to { opacity: 0; filter: hue-rotate(180deg); }\n`;\n\n// --- Fade Pulse (loopable) ---\nconst fadePulse = `\n 0%, 100% { opacity: 0.4; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n`;\n\n// --- Fade Bounce ---\nconst fadeBounce = `\n 0% { opacity: 0; transform: translateY(20px); }\n 50% { opacity: 1; transform: translateY(-10px); }\n 70% { transform: translateY(5px); }\n 100% { transform: translateY(0); }\n`;\n\n// --- Fade Swing (like pendulum) ---\nconst fadeSwing = `\n 0% { opacity: 0; transform: rotate(15deg); }\n 50% { opacity: 1; transform: rotate(-15deg); }\n 100% { opacity: 1; transform: rotate(0deg); }\n`;\n\n// --- Fade Zoom Rotate ---\nconst fadeZoomRotate = `\n from { opacity: 0; transform: scale(0.5) rotate(-180deg); }\n to { opacity: 1; transform: scale(1) rotate(0); }\n`;\n\n// --- Fade Elastic ---\nconst fadeElastic = `\n 0% { opacity: 0; transform: scale(0.5); }\n 60% { opacity: 1; transform: scale(1.2); }\n 80% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n// --- Fade Shine (gradient wipe) ---\nconst fadeShine = `\n 0% { opacity: 0; background-position: -200%; }\n 100% { opacity: 1; background-position: 200%; }\n`;\n\n// ================== Map ==================\nexport const fadeMap = {\n // Basic\n fadeIn,\n fadeOut,\n\n // Direction\n fadeInFromLeft,\n fadeInFromRight,\n fadeInFromTop,\n fadeInFromBottom,\n fadeOutToLeft,\n fadeOutToRight,\n fadeOutToTop,\n fadeOutToBottom,\n\n // Aliases (DX)\n fadeInUp: fadeInFromBottom,\n fadeInDown: fadeInFromTop,\n fadeInLeft: fadeInFromRight,\n fadeInRight: fadeInFromLeft,\n\n // Scale\n fadeInZoom,\n fadeOutZoom,\n\n // Rotate\n fadeInRotate,\n fadeOutRotate,\n\n // Skew\n fadeInSkew,\n fadeOutSkew,\n\n // Flip\n fadeInFlipX,\n fadeOutFlipX,\n fadeInFlipY,\n fadeOutFlipY,\n\n // Perspective\n fadeInPerspective,\n fadeOutPerspective,\n\n // Blur\n fadeInBlur,\n fadeOutBlur,\n\n // Color\n fadeInColor,\n fadeOutColor,\n\n // Pulse & Bounce\n fadePulse,\n fadeBounce,\n\n // Swing\n fadeSwing,\n\n // Zoom + Rotate\n fadeZoomRotate,\n\n // Elastic\n fadeElastic,\n\n // Shine\n fadeShine,\n};\n","import { attentionMap } from './attention';\nimport { blurMap } from './blur';\nimport { bounceMap } from './bounce';\nimport { fadeMap } from './fade';\nimport { flashMap } from './flash';\nimport { flipMap } from './flip';\nimport { floatMap } from './float';\nimport { foldMap } from './fold';\nimport { funMap } from './funMap';\nimport { glowMap } from './glowing';\nimport { hangOnMap } from './hangOn';\nimport { jellyMap } from './jelly';\nimport { motionMap } from './motion';\nimport { popMap } from './pop';\nimport { pulseMap } from './pulse';\nimport { rotateMap } from './rotate';\nimport { slideMap } from './slide';\nimport { squeezeShakeMap } from './squeezeShake';\nimport { textEffectsMap } from './textEffects';\nimport { zoomMap } from './zoom';\n\n/* =========================\n Frames Map (internal)\n========================= */\nexport const animFramesMaps = {\n ...bounceMap,\n ...textEffectsMap,\n ...blurMap,\n ...flashMap,\n ...floatMap,\n ...glowMap,\n ...jellyMap,\n ...motionMap,\n ...pulseMap,\n ...fadeMap,\n ...squeezeShakeMap,\n ...slideMap,\n ...flipMap,\n ...foldMap,\n ...hangOnMap,\n ...zoomMap,\n ...rotateMap,\n ...funMap,\n ...popMap,\n ...attentionMap,\n} as const;\n\n/* =========================\n Public Types\n========================= */\nexport type AnimName = keyof typeof animFramesMaps;\n\n/* =========================\n Names\n========================= */\nexport const animNames = Object.keys(animFramesMaps) as AnimName[];\n\n/* =========================\n Timing\n========================= */\nexport const timingMap = {\n linear: 'linear',\n ease: 'ease',\n easeIn: 'ease-in',\n 'ease-in': 'ease-in',\n easeOut: 'ease-out',\n 'ease-out': 'ease-out',\n easeInOut: 'ease-in-out',\n 'ease-in-out': 'ease-in-out',\n} as const;\n\nexport type TypeTimingKey = keyof typeof timingMap;\n\n/* =========================\n Groups\n========================= */\nconst groupConfig = [\n { name: '🎾 Bounce', key: 'bounce', prefix: 'bounce' },\n { name: '✨ Text / Glow Effects', key: 'text', prefix: 'effect' },\n { name: '🌫 Blur', key: 'blur', prefix: 'blur' },\n { name: '⚡ Flash', key: 'flash', prefix: 'flash' },\n { name: '🎈 Float', key: 'float', prefix: 'float' },\n { name: '💡 Glow', key: 'glow', prefix: 'glow' },\n { name: '🍮 Jelly', key: 'jelly', prefix: 'jelly' },\n { name: '🌑 Shadow / Spin / Swing / Orbit', key: 'motion', prefix: '' },\n { name: '💓 Pulse', key: 'pulse', prefix: 'pulse' },\n { name: '🌫 Fade', key: 'fade', prefix: 'fade' },\n { name: '🤯 Squeeze / Shake', key: 'shake', prefix: 'shake' },\n { name: '📥 Slide', key: 'slide', prefix: 'slide' },\n { name: '🔄 Flip', key: 'flip', prefix: 'flip' },\n { name: '📂 Fold / Unfold', key: 'fold', prefix: 'fold' },\n { name: '🪝 Hang On', key: 'hangOn', prefix: 'hangOn' },\n { name: '🔍 Zoom', key: 'zoom', prefix: 'zoom' },\n { name: '🌀 Rotate', key: 'rotate', prefix: 'rotate' },\n { name: '🎉 Fun / Attention', key: 'fun', prefix: '' },\n] as const;\n\ntype GroupKey = (typeof groupConfig)[number]['key'];\n\nexport const animGroups: Record<GroupKey, AnimName[]> =\n Object.fromEntries(\n groupConfig.map(({ key, prefix }) => {\n const items = animNames.filter((name) =>\n prefix ? name.startsWith(prefix) : true\n );\n return [key, items];\n })\n ) as Record<GroupKey, AnimName[]>;\n","/** 1. 3D Depth (stacked shadow) */\nconst effect3D = `\n to {\n text-shadow:\n 0 1px 0 #ccc,\n 0 2px 0 #c9c9c9,\n 0 3px 0 #bbb,\n 0 4px 0 #b9b9b9,\n 0 5px 0 #aaa,\n 0 6px 1px rgba(0, 0, 0, .1),\n 0 0 5px rgba(0, 0, 0, .1),\n 0 1px 3px rgba(0, 0, 0, .3),\n 0 3px 5px rgba(0, 0, 0, .2),\n 0 5px 10px rgba(0, 0, 0, .25);\n }\n`;\n\n/** 2. Neon Glow */\nconst neonGlow = `\n from { text-shadow: none; }\n to {\n text-shadow:\n 0 0 5px #0ff,\n 0 0 10px #0ff,\n 0 0 20px #0ff,\n 0 0 40px #0ff,\n 0 0 80px #0ff;\n color: #fff;\n }\n`;\n\n/** 3. Retro 3D */\nconst retro3D = `\n to {\n text-shadow:\n 2px 2px 0 #ff0040,\n 4px 4px 0 #00ffd5,\n 6px 6px 0 #000;\n }\n`;\n\n/** 4. Emboss */\nconst emboss = `\n to {\n text-shadow:\n -1px -1px 1px #fff,\n 1px 1px 2px rgba(0,0,0,0.6);\n color: #555;\n }\n`;\n\n/** 5. Fire Glow */\nconst fireGlow = `\n 0%, 100% {\n text-shadow:\n 0 0 5px #ff6600,\n 0 0 10px #ff3300,\n 0 0 20px #ff0000;\n }\n 50% {\n text-shadow:\n 0 0 10px #ff9933,\n 0 0 20px #ff6600,\n 0 0 30px #ff3300;\n }\n`;\n\n/** 6. Ice Glow */\nconst iceGlow = `\n to {\n text-shadow:\n 0 0 5px #66ccff,\n 0 0 10px #33ccff,\n 0 0 20px #00aaff,\n 0 0 40px #0099ff;\n color: #e6f9ff;\n }\n`;\n\n/* 7. Shine */\nconst shine = `\n 0% { background-position: -200%; }\n 100% { background-position: 200%; }\n`;\n\nexport const textEffectsMap = {\n effect3D,\n neonGlow,\n retro3D,\n emboss,\n fireGlow,\n iceGlow,\n shine,\n};\n","// Classic flash - even blink\nconst flash = `\n 0%, 50%, 100% { opacity: 1; }\n 25%, 75% { opacity: 0; }\n`;\n\n// Irregular flash - uneven blink\nconst flashIrregular = `\n 0%, 40%, 80% { opacity: 1; }\n 20%, 60%, 100% { opacity: 0; }\n`;\n\n// Fast flash - quicker blink\nconst flashFast = `\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n`;\n\n// Slow flash - long fade in/out\nconst flashSlow = `\n 0% { opacity: 1; }\n 45% { opacity: 0; }\n 55% { opacity: 0; }\n 100% { opacity: 1; }\n`;\n\n// Pulse flash - smooth opacity transition\nconst flashPulse = `\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n`;\n\n// Glow flash - opacity + scale\nconst flashGlow = `\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.4; transform: scale(1.05); }\n`;\n\n// Color flash - opacity + hue\nconst flashColor = `\n 0%, 100% { opacity: 1; filter: hue-rotate(0deg); }\n 50% { opacity: 0.2; filter: hue-rotate(180deg); }\n`;\n\n// Strobe flash - rapid blinking\nconst flashStrobe = `\n 0%, 20%, 40%, 60%, 80%, 100% { opacity: 1; }\n 10%, 30%, 50%, 70%, 90% { opacity: 0; }\n`;\n\n// Soft flash - gentle fade in/out\nconst flashSoft = `\n 0% { opacity: 1; }\n 50% { opacity: 0.6; }\n 100% { opacity: 1; }\n`;\n\n// Reverse pulse - fade strong then dim\nconst flashReversePulse = `\n 0%, 100% { opacity: 0.3; }\n 50% { opacity: 1; }\n`;\n\n// Export map for easy use\nexport const flashMap = {\n flash,\n flashIrregular,\n flashFast,\n flashSlow,\n flashPulse,\n\n // Extra\n flashGlow,\n flashColor,\n flashStrobe,\n flashSoft,\n flashReversePulse,\n};\n","// Gentle up-down float\nconst float = `\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n`;\n\n// Sway float with rotation\nconst floatSway = `\n 0% { transform: translate(2%, -10%) rotate(-1deg); }\n 100% { transform: translate(-2%, 5%) rotate(3deg); }\n`;\n\n// Horizontal float (side to side)\nconst floatHorizontal = `\n 0%, 100% { transform: translateX(0); }\n 50% { transform: translateX(12px); }\n`;\n\n// Circular float (orbit-like movement)\nconst floatCircular = `\n 0% { transform: translate(0, 0); }\n 25% { transform: translate(8px, -8px); }\n 50% { transform: translate(0, -12px); }\n 75% { transform: translate(-8px, -8px); }\n 100% { transform: translate(0, 0); }\n`;\n\n// Wiggle float (small tilt oscillation)\nconst floatWiggle = `\n 0%, 100% { transform: rotate(0deg); }\n 25% { transform: rotate(2deg); }\n 50% { transform: rotate(-2deg); }\n 75% { transform: rotate(1deg); }\n`;\n\n// Float with scale pulse\nconst floatPulse = `\n 0%, 100% { transform: translateY(0) scale(1); }\n 50% { transform: translateY(-8px) scale(1.05); }\n`;\n\n// Float diagonal (↗ ↙)\nconst floatDiagonal = `\n 0%, 100% { transform: translate(0, 0); }\n 50% { transform: translate(10px, -10px); }\n`;\n\n// Float swing (like pendulum)\nconst floatSwing = `\n 0%, 100% { transform: rotate(0deg) translateY(0); }\n 25% { transform: rotate(3deg) translateY(-5px); }\n 50% { transform: rotate(-3deg) translateY(-10px); }\n 75% { transform: rotate(2deg) translateY(-5px); }\n`;\n\n// Float wave (sinusoidal left-right + up-down)\nconst floatWave = `\n 0% { transform: translate(0, 0); }\n 25% { transform: translate(8px, -6px); }\n 50% { transform: translate(0, -12px); }\n 75% { transform: translate(-8px, -6px); }\n 100% { transform: translate(0, 0); }\n`;\n\n// Float drift (slow random drift feeling)\nconst floatDrift = `\n 0% { transform: translate(0, 0) rotate(0deg); }\n 25% { transform: translate(6px, -4px) rotate(1deg); }\n 50% { transform: translate(-4px, -8px) rotate(-1deg); }\n 75% { transform: translate(-6px, 6px) rotate(2deg); }\n 100% { transform: translate(0, 0) rotate(0deg); }\n`;\n\n// Export map for easy use\nexport const floatMap = {\n float,\n floatSway,\n floatHorizontal,\n floatCircular,\n floatWiggle,\n\n // Extra\n floatPulse,\n floatDiagonal,\n floatSwing,\n floatWave,\n floatDrift,\n};\n","// Simple glowing pulse (box-shadow expand/contract)\nconst glow = `\n 0% { box-shadow: 0 0 5px #ff00de; }\n 50% { box-shadow: 0 0 20px #ff00de; }\n 100% { box-shadow: 0 0 5px #ff00de; }\n`;\n\n// Neon text glow (flicker effect)\nconst glowTextFlicker = `\n 0% { color: inherit; text-shadow: none; }\n 2%, 59%, 64%, 79% { color: #fff; }\n 3%, 59%, 63%, 78% {\n text-shadow:\n 0px 0px 60px,\n 0 0 22px,\n 0 0 1em inherit,\n 0 0 0.5em inherit,\n 0 0 .1em inherit,\n 0 10px 3px #000;\n }\n 60%, 75% { color: inherit; text-shadow: none; }\n`;\n\n// Rainbow glowing (animated hue rotation)\nconst glowRainbow = `\n 0% { filter: hue-rotate(0deg); }\n 100% { filter: hue-rotate(360deg); }\n`;\n\n// Soft breathing glow\nconst glowBreathing = `\n 0%, 100% { text-shadow: 0 0 5px #00f, 0 0 10px #00f; }\n 50% { text-shadow: 0 0 20px #00f, 0 0 40px #00f; }\n`;\n\n// Glitch neon flicker (irregular intensity)\nconst glowGlitch = `\n 0%, 100% { text-shadow: 0 0 5px #0ff, 0 0 10px #0ff; }\n 10% { text-shadow: none; }\n 20% { text-shadow: 0 0 15px #f0f, 0 0 30px #f0f; }\n 30% { text-shadow: none; }\n 40% { text-shadow: 0 0 25px #ff0, 0 0 50px #ff0; }\n 60% { text-shadow: none; }\n 80% { text-shadow: 0 0 15px #0ff, 0 0 35px #0ff; }\n`;\n\n// Map for usage\nexport const glowMap = {\n glow,\n glowTextFlicker,\n glowRainbow,\n glowBreathing,\n glowGlitch,\n};\n","// === Jelly Animations ===\n\n// Default jelly wobble (scale X/Y alternating)\nconst jelly = `\n 0%, 100% { transform: scale(1, 1); }\n 25% { transform: scale(0.9, 1.1); }\n 50% { transform: scale(1.1, 0.9); }\n 75% { transform: scale(0.95, 1.05); }\n`;\n\n// Horizontal rubber stretch\nconst jellyX = `\n 0% { transform: scaleX(1); }\n 20% { transform: scaleX(0.9); }\n 50% { transform: scaleX(1.25); }\n 85% { transform: scaleX(0.8); }\n 100% { transform: scaleX(1); }\n`;\n\n// Vertical stretch\nconst jellyY = `\n 0% { transform: scaleY(1); }\n 20% { transform: scaleY(0.9); }\n 50% { transform: scaleY(1.25); }\n 85% { transform: scaleY(0.8); }\n 100% { transform: scaleY(1); }\n`;\n\n// Elastic bounce in (squash + overshoot)\nconst jellyIn = `\n 0% { transform: scale(0.5); opacity: 0; }\n 50% { transform: scale(1.2); opacity: 1; }\n 70% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n// Elastic bounce out\nconst jellyOut = `\n 0% { transform: scale(1); opacity: 1; }\n 20% { transform: scale(1.1); }\n 50% { transform: scale(0.5); opacity: 0.5; }\n 100% { transform: scale(0); opacity: 0; }\n`;\n\n// === Map ===\nexport const jellyMap = {\n jelly,\n jellyX,\n jellyY,\n jellyIn,\n jellyOut,\n};\n","/* ===== Shadow Animations ===== */\nconst shadow = `\n 0%, 100% { box-shadow: none; }\n 50% { box-shadow: 0 10px 20px rgba(0,0,0,0.2); }\n`;\n\nconst shadowText = `\n 0% { text-shadow: 1px 1px 0px #333; }\n 50% { text-shadow: 3px 3px 2px #333; }\n 100% { text-shadow: 9px 10px 6px #999; }\n`;\n\n// Soft pulsing shadow (breathing effect)\nconst shadowPulse = `\n 0%, 100% { box-shadow: 0 0 5px rgba(0,0,0,0.2); }\n 50% { box-shadow: 0 0 25px rgba(0,0,0,0.4); }\n`;\n\n// Neon glowing text shadow\nconst shadowNeon = `\n 0%, 100% { text-shadow: 0 0 5px #0ff, 0 0 10px #0ff; }\n 50% { text-shadow: 0 0 20px #0ff, 0 0 40px #0ff; }\n`;\n\n/* ===== Spin Animations ===== */\nconst spin = `\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst spin3D = `\n from { transform: rotateY(0deg); }\n to { transform: rotateY(-360deg); }\n`;\n\n// Spin on X axis\nconst spinX = `\n from { transform: rotateX(0deg); }\n to { transform: rotateX(360deg); }\n`;\n\n// Spin on Z axis but with bounce easing\nconst spinBounce = `\n 0% { transform: rotateZ(0deg) scale(1); }\n 50% { transform: rotateZ(180deg) scale(1.2); }\n 100% { transform: rotateZ(360deg) scale(1); }\n`;\n\n/* ===== Swing Animations ===== */\nconst swing = `\n 20% { transform: rotate(15deg); }\n 40% { transform: rotate(-10deg); }\n 60% { transform: rotate(5deg); }\n 80% { transform: rotate(-5deg); }\n 100% { transform: rotate(0deg); }\n`;\n\nconst swingPivot = `\n 0% { transform: rotateZ(0deg); transform-origin: center top; }\n 20% { transform: rotateZ(15deg); transform-origin: center top; }\n 40% { transform: rotateZ(-15deg); transform-origin: center top; }\n 60% { transform: rotateZ(7deg); transform-origin: center top; }\n 80% { transform: rotateZ(-7deg); transform-origin: center top; }\n 100% { transform: rotateZ(0deg); transform-origin: center top; }\n`;\n\n// Wobble horizontally\nconst swingX = `\n 15% { transform: translateX(-25%) rotate(-5deg); }\n 30% { transform: translateX(20%) rotate(3deg); }\n 45% { transform: translateX(-15%) rotate(-3deg); }\n 60% { transform: translateX(10%) rotate(2deg); }\n 75% { transform: translateX(-5%) rotate(-1deg); }\n 100% { transform: translateX(0); }\n`;\n\n// Wobble vertically\nconst swingY = `\n 15% { transform: translateY(-25%) rotate(-3deg); }\n 30% { transform: translateY(20%) rotate(2deg); }\n 45% { transform: translateY(-15%) rotate(-2deg); }\n 60% { transform: translateY(10%) rotate(1deg); }\n 75% { transform: translateY(-5%) rotate(-1deg); }\n 100% { transform: translateY(0); }\n`;\n\n// Small orbit (element moves around center)\nconst orbit = `\n from { transform: rotate(0deg) translateX(20px) rotate(0deg); }\n to { transform: rotate(360deg) translateX(20px) rotate(-360deg); }\n`;\n\n// Elliptical orbit\nconst orbitEllipse = `\n from { transform: rotate(0deg) translateX(30px) translateY(10px) rotate(0deg); }\n to { transform: rotate(360deg) translateX(30px) translateY(10px) rotate(-360deg); }\n`;\n\nexport const motionMap = {\n // Shadows\n shadow,\n shadowText,\n shadowPulse,\n shadowNeon,\n\n // Spins\n spin,\n spin3D,\n spinX,\n spinBounce,\n\n // Swings\n swing,\n swingPivot,\n swingX,\n swingY,\n\n // Orbit\n orbit,\n orbitEllipse,\n};\n","// Basic pulse (scale up)\nconst pulse = `\n from { transform: scale(1); }\n to { transform: scale(1.1); }\n`;\n\n// Pulse in & out (scale small -> big -> small)\nconst pulseInOut = `\n 0% { transform: scale(1); }\n 50% { transform: scale(1.15); }\n 100% { transform: scale(1); }\n`;\n\n// Pulse with opacity (fade effect)\nconst pulseFade = `\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.2); opacity: 0.6; }\n`;\n\n// Pulse grow shrink faster\nconst pulseFast = `\n 0%, 100% { transform: scale(1); }\n 25% { transform: scale(1.2); }\n 75% { transform: scale(0.9); }\n`;\n\n// Pulse with color change\nconst pulseColor = `\n 0%, 100% { transform: scale(1); background-color: #ff69b4; }\n 50% { transform: scale(1.2); background-color: #ff1493; }\n`;\n\nexport const pulseMap = {\n pulse,\n pulseInOut,\n pulseFade,\n pulseFast,\n pulseColor,\n};\n","/* ================================================\n Squeeze & Shake Animations Map\n================================================= */\n\n// Squeeze Animations\nconst squeezeMix = `\n 0% { transform: scale3d(1, 1, 1); }\n 15% { transform: scale3d(0.95, 0.95, 1); }\n 30% { transform: scale3d(0.9, 0.9, 1); }\n 55% { transform: scale3d(0.75, 0.75, 1); }\n 70% { transform: scale3d(1.3, 1.3, 1); }\n 85% { transform: scale3d(0.95, 0.95, 1); }\n 100% { transform: scale3d(1, 1, 1); }\n`;\n\nconst squeezeHorizontal = `\n 0% { transform: scaleX(1); }\n 15% { transform: scaleX(0.95); }\n 30% { transform: scaleX(0.9); }\n 55% { transform: scaleX(0.75); }\n 70% { transform: scaleX(1.3); }\n 85% { transform: scaleX(0.95); }\n 100% { transform: scaleX(1); }\n`;\n\nconst squeezeVertical = `\n 0% { transform: scaleY(1); }\n 15% { transform: scaleY(0.95); }\n 30% { transform: scaleY(0.9); }\n 55% { transform: scaleY(0.75); }\n 70% { transform: scaleY(1.3); }\n 85% { transform: scaleY(0.95); }\n 100% { transform: scaleY(1); }\n`;\n\nconst squeezeDiagonal = `\n 0% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.8,1.2,1); }\n 50% { transform: scale3d(1.1,0.9,1); }\n 75% { transform: scale3d(0.9,1.1,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\nconst squeezePulse = `\n 0%,100% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.9,0.9,1); }\n 50% { transform: scale3d(1.1,1.1,1); }\n 75% { transform: scale3d(0.95,0.95,1); }\n`;\n\n// Squeeze Bounce\nconst squeezeBounce = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.7,0.7,1); }\n 50% { transform: scale3d(1.2,1.2,1); }\n 70% { transform: scale3d(0.9,0.9,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Squeeze Elastic\nconst squeezeElastic = `\n 0% { transform: scale3d(1,1,1); }\n 25% { transform: scale3d(0.8,1.2,1); }\n 50% { transform: scale3d(1.2,0.8,1); }\n 75% { transform: scale3d(0.9,1.1,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Squeeze Flash\nconst squeezeFlash = `\n 0%,100% { transform: scale3d(1,1,1); opacity: 1; }\n 25% { transform: scale3d(0.8,0.8,1); opacity: 0.6; }\n 50% { transform: scale3d(1.2,1.2,1); opacity: 1; }\n 75% { transform: scale3d(0.9,0.9,1); opacity: 0.8; }\n`;\n\n// Shake Animations\nconst shakeMix = `\n 0% { transform: translate3d(2px, 1px, 0) rotate(0deg); }\n 10% { transform: translate3d(-1px, -2px, 0) rotate(-1deg); }\n 20% { transform: translate3d(-3px, 0px, 0) rotate(1deg); }\n 30% { transform: translate3d(0px, 2px, 0) rotate(0deg); }\n 40% { transform: translate3d(1px, -1px, 0) rotate(1deg); }\n 50% { transform: translate3d(-1px, 2px, 0) rotate(-1deg); }\n 60% { transform: translate3d(-3px, 1px, 0) rotate(0deg); }\n 70% { transform: translate3d(2px, 1px, 0) rotate(-1deg); }\n 80% { transform: translate3d(-1px, -1px, 0) rotate(1deg); }\n 90% { transform: translate3d(2px, 2px, 0) rotate(0deg); }\n 100% { transform: translate3d(1px, -2px, 0) rotate(-1deg); }\n`;\n\nconst shakeHorizontal = `\n 0%, 100% { transform: translateX(0); }\n 10%, 30%, 50%, 70%, 90% { transform: translateX(6px); }\n 20%, 40%, 60%, 80% { transform: translateX(-4px); }\n`;\n\nconst shakeVertical = `\n 0%, 100% { transform: translateY(0); }\n 10%, 30%, 50%, 70%, 90% { transform: translateY(6px); }\n 20%, 40%, 60%, 80% { transform: translateY(-4px); }\n`;\n\nconst shakeDiagonal = `\n 0%,100% { transform: translate3d(0,0,0); }\n 20% { transform: translate3d(5px,5px,0); }\n 40% { transform: translate3d(-5px,-5px,0); }\n 60% { transform: translate3d(5px,-5px,0); }\n 80% { transform: translate3d(-5px,5px,0); }\n`;\n\nconst shakeQuick = `\n 0%,100% { transform: translate3d(0,0,0); }\n 10%,30%,50%,70%,90% { transform: translate3d(3px,0,0); }\n 20%,40%,60%,80% { transform: translate3d(-3px,0,0); }\n`;\n\n// Shake Rotate\nconst shakeRotate = `\n 0%,100% { transform: rotate(0deg); }\n 25% { transform: rotate(-5deg); }\n 50% { transform: rotate(5deg); }\n 75% { transform: rotate(-3deg); }\n`;\n\n// Shake Skew\nconst shakeSkew = `\n 0%,100% { transform: skew(0deg, 0deg); }\n 20% { transform: skew(-10deg, -5deg); }\n 40% { transform: skew(8deg, 3deg); }\n 60% { transform: skew(-6deg, -3deg); }\n 80% { transform: skew(4deg, 2deg); }\n`;\n\n// Shake Bounce\nconst shakeBounce = `\n 0%,100% { transform: translateY(0); }\n 20% { transform: translateY(-6px); }\n 40% { transform: translateY(4px); }\n 60% { transform: translateY(-4px); }\n 80% { transform: translateY(2px); }\n`;\n\n// Shake Crazy\nconst shakeCrazy = `\n 0% { transform: translate(0,0) rotate(0deg); }\n 20% { transform: translate(-4px,3px) rotate(-3deg); }\n 40% { transform: translate(5px,-2px) rotate(4deg); }\n 60% { transform: translate(-3px,2px) rotate(-4deg); }\n 80% { transform: translate(3px,-3px) rotate(2deg); }\n 100% { transform: translate(0,0) rotate(0deg); }\n`;\n\n// Combo 1\nconst squeezeThenShakeX = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.7,0.7,1); }\n 40% { transform: scale3d(1.2,1.2,1); }\n 60% { transform: scale3d(0.9,0.9,1); }\n 70% { transform: translateX(0); }\n 80% { transform: translateX(-6px); }\n 90% { transform: translateX(6px); }\n 100% { transform: translateX(0); }\n`;\n\n// Combo 2\nconst shakeYThenSqueeze = `\n 0% { transform: translateY(0); }\n 20% { transform: translateY(-6px); }\n 40% { transform: translateY(6px); }\n 60% { transform: translateY(-3px); }\n 70% { transform: scale3d(0.7,0.7,1); }\n 85% { transform: scale3d(1.2,1.2,1); }\n 100% { transform: scale3d(1,1,1); }\n`;\n\n// Combo 3\nconst squeezeShakeCrazy = `\n 0% { transform: scale3d(1,1,1); }\n 20% { transform: scale3d(0.8,1.2,1); }\n 40% { transform: scale3d(1.2,0.8,1); }\n 50% { transform: translate(-4px,3px) rotate(-3deg); }\n 70% { transform: translate(5px,-2px) rotate(4deg); }\n 90% { transform: translate(-3px,2px) rotate(-4deg); }\n 100% { transform: scale3d(1,1,1) translate(0,0) rotate(0); }\n`;\n\n\n// Map for lookup\nexport const squeezeShakeMap = {\n squeezeMix,\n squeezeHorizontal,\n squeezeVertical,\n squeezeDiagonal,\n squeezePulse,\n squeezeBounce,\n squeezeElastic,\n squeezeFlash,\n shakeMix,\n shakeHorizontal,\n shakeVertical,\n shakeDiagonal,\n shakeQuick,\n shakeRotate,\n shakeSkew,\n shakeBounce,\n shakeCrazy,\n squeezeThenShakeX,\n shakeYThenSqueeze,\n squeezeShakeCrazy,\n};\n\n","/* ===========================================================\n Slide In / Out - Linear\n=========================================================== */\nconst slideInFromLeft = `\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideInFromRight = `\n from { transform: translateX(100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutToLeft = `\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nconst slideOutToRight = `\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(100%); opacity: 0; }\n`;\n\nconst slideInFromTop = `\n from { transform: translateY(-100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideInFromBottom = `\n from { transform: translateY(100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideOutToTop = `\n from { transform: translateY(0); opacity: 1; }\n to { transform: translateY(-100%); opacity: 0; }\n`;\n\nconst slideOutToBottom = `\n from { transform: translateY(0); opacity: 1; }\n to { transform: translateY(100%); opacity: 0; }\n`;\n\n/* ===========================================================\n Slide In / Out - Overshoot (bouncy effect)\n=========================================================== */\nconst slideInFromLeftOvershoot = `\n 0% { transform: translateX(-100%); opacity: 0; }\n 60% { transform: translateX(20%); opacity: 1; }\n 100% { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideInFromRightOvershoot = `\n 0% { transform: translateX(100%); opacity: 0; }\n 60% { transform: translateX(-20%); opacity: 1; }\n 100% { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutToLeftOvershoot = `\n 0% { transform: translateX(0); opacity: 1; }\n 60% { transform: translateX(-120%); opacity: 0; }\n 100% { transform: translateX(-100%); opacity: 0; }\n`;\n\nconst slideOutToRightOvershoot = `\n 0% { transform: translateX(0); opacity: 1; }\n 60% { transform: translateX(120%); opacity: 0; }\n 100% { transform: translateX(100%); opacity: 0; }\n`;\n\nconst slideInFromTopOvershoot = `\n 0% { transform: translateY(-100%); opacity: 0; }\n 60% { transform: translateY(20%); opacity: 1; }\n 100% { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideInFromBottomOvershoot = `\n 0% { transform: translateY(100%); opacity: 0; }\n 60% { transform: translateY(-20%); opacity: 1; }\n 100% { transform: translateY(0); opacity: 1; }\n`;\n\nconst slideOutToTopOvershoot = `\n 0% { transform: translateY(0); opacity: 1; }\n 60% { transform: translateY(-120%); opacity: 0; }\n 100% { transform: translateY(-100%); opacity: 0; }\n`;\n\nconst slideOutToBottomOvershoot = `\n 0% { transform: translateY(0); opacity: 1; }\n 60% { transform: translateY(120%); opacity: 0; }\n 100% { transform: translateY(100%); opacity: 0; }\n`;\n\n/* ===========================================================\n Map Export\n=========================================================== */\nexport const slideMap = {\n // Linear\n slideInFromLeft,\n slideInFromRight,\n slideOutToLeft,\n slideOutToRight,\n slideInFromTop,\n slideInFromBottom,\n slideOutToTop,\n slideOutToBottom,\n\n // Overshoot / Bouncy\n slideInFromLeftOvershoot,\n slideInFromRightOvershoot,\n slideOutToLeftOvershoot,\n slideOutToRightOvershoot,\n slideInFromTopOvershoot,\n slideInFromBottomOvershoot,\n slideOutToTopOvershoot,\n slideOutToBottomOvershoot,\n};\n","/* ===========================================================\n Flip / Rotate Animations\n=========================================================== */\n\n/* ---------- Basic Version ---------- */\nconst flip = `from{transform:rotateY(0)}to{transform:rotateY(180deg)}`;\n\nconst flipFromLeftToCenter = `\n from { transform: rotateY(-90deg); }\n to { transform: rotateY(0); }\n`;\nconst flipFromRightToCenter = `\n from { transform: rotateY(90deg); }\n to { transform: rotateY(0); }\n`;\nconst flipToLeft = `\n from { transform: rotateY(0); }\n to { transform: rotateY(-90deg); }\n`;\nconst flipToRight = `\n from { transform: rotateY(0); }\n to { transform: rotateY(90deg); }\n`;\n\nconst flipFromTop = `\n from { transform: rotateX(-90deg); }\n to { transform: rotateX(0); }\n`;\nconst flipToTop = `\n from { transform: rotateX(0); }\n to { transform: rotateX(-90deg); }\n`;\nconst flipFromBottom = `\n from { transform: rotateX(90deg); }\n to { transform: rotateX(0); }\n`;\nconst flipToBottom = `\n from { transform: rotateX(0); }\n to { transform: rotateX(90deg); }\n`;\n\n/* ---------- Rich Version ---------- */\nconst flipRich = `\n 0% { transform: perspective(1000px) rotateX(360deg); transform-origin: center; }\n 100% { transform: perspective(1000px) rotateX(0deg); transform-origin: center; }\n`;\n\nconst flipIn = `\n 0% { transform: rotateX(180deg); opacity: 0; }\n 35% { transform: rotateX(120deg); opacity: 0; }\n 65% { opacity: 0; }\n 100% { transform: rotateX(360deg); opacity: 1; }\n`;\n\nconst flipOut = `\n 0% { transform: rotateX(0deg); opacity: 1; }\n 35% { transform: rotateX(-40deg); opacity: 1; }\n 65% { opacity: 0; }\n 100% { transform: rotateX(180deg); opacity: 0; }\n`;\n\nconst flipSlowDown = `\n 0% { transform: rotateX(0deg); }\n 5% { transform: rotateX(1turn); }\n 10% { transform: rotateX(2turn); }\n 20% { transform: rotateX(3turn); }\n 40% { transform: rotateX(4turn); }\n 70%,100% { transform: rotateX(5turn); }\n`;\n\nconst flipToTopRich = `\n from { transform: rotateX(-90deg); transform-origin: center top; opacity: 1; }\n to { transform: rotateX(90deg); transform-origin: center top; opacity: 0; }\n`;\n\nconst flipToBottomRich = `\n from { opacity: 1; transform-origin: 0% 0%; transform: rotateX(0deg) translateY(0); }\n to { opacity: 0; transform-origin: 0% 0%; transform: rotateX(-90deg) translateY(50px); }\n`;\n\nconst flipToTopLeftRich = `\n from {\n opacity: 1;\n transform-origin: top left;\n transform: rotateX(0deg) rotateY(0deg);\n }\n to {\n opacity: 0;\n transform-origin: top left;\n transform: rotateX(-90deg) rotateY(-90deg);\n }\n`;\n\nconst flipToRightRich = `\n from {\n opacity: 1;\n transform-origin: center right;\n transform: rotateY(0deg);\n }\n to {\n opacity: 0;\n transform-origin: center right;\n transform: rotateY(90deg);\n }\n`;\n\nconst flipFromTopRich = `\n from { opacity: 0; transform-origin: 0% 0%; transform: rotateX(90deg); }\n to { opacity: 1; transform-origin: 0% 0%; transform: rotateX(0deg); }\n`;\n\nconst flipFromBottomRich = `\n from { transform: rotateX(-90deg); transform-origin: 50% 0; opacity: 0; }\n to { transform: rotateX(0deg); transform-origin: 50% 0; opacity: 1; }\n`;\n\nconst flipFromLeftToCenterRich = `\n 0% { transform: rotateY(-95deg) translateX(-200px); transform-origin: left; }\n 100% { transform: rotateY(0deg); transform-origin: left; }\n`;\n\nconst flipFromRightToCenterRich = `\n 0% { transform: rotateY(95deg) translateX(200px); transform-origin: right; }\n 100% { transform: rotateY(0deg); transform-origin: right; }\n`;\n\n/* ---------- Export Map ---------- */\nexport const flipMap = {\n flip,\n flipIn,\n flipOut,\n flipSlowDown,\n\n flipToLeft,\n flipToRight,\n flipFromTop,\n flipToTop,\n\n flipToBottom,\n flipFromBottom,\n flipFromLeftToCenter,\n flipFromRightToCenter,\n\n flipRich,\n flipToTopRich,\n flipToBottomRich,\n flipToTopLeftRich,\n flipToRightRich,\n\n flipFromTopRich,\n flipFromBottomRich,\n flipFromLeftToCenterRich,\n flipFromRightToCenterRich,\n};\n","/* -------------------------------\n Fold / Unfold Animations Map\n---------------------------------*/\n\n// Simple version (scaleY)\nconst fold = `from { transform: scaleY(1); } to { transform: scaleY(0); }`;\nconst unfold = `from { transform: scaleY(0); } to { transform: scaleY(1); }`;\n\n// Advanced version (3D + opacity + multi-step)\nconst foldDeep = `\n 0% { transform: scale3d(1, 1, 1); }\n 30% { transform: scale3d(1, 0.4, 1); }\n 60% { transform: scale3d(0.4, 0.4, 1); }\n 100% { opacity: 0; transform: scale3d(0.2, 0.2, 0.2); }\n`;\n\nconst unfoldDeep = `\n 0% { opacity: 0; transform: scale3d(0, 0, 0); }\n 30% { opacity: 1; transform: scale3d(0.4, 0.4, 1); }\n 60% { transform: scale3d(0.4, 1, 1); }\n 100% { transform: scale3d(1, 1, 1); }\n`;\n\n// Fold Left (rotate around Y)\nconst foldLeft = `\n from { transform: perspective(400px) rotateY(0); opacity: 1; }\n to { transform: perspective(400px) rotateY(-90deg); opacity: 0; }\n`;\n\n// Unfold Left\nconst unfoldLeft = `\n from { transform: perspective(400px) rotateY(-90deg); opacity: 0; }\n to { transform: perspective(400px) rotateY(0); opacity: 1; }\n`;\n\n// Fold Right (rotate around Y opposite)\nconst foldRight = `\n from { transform: perspective(400px) rotateY(0); opacity: 1; }\n to { transform: perspective(400px) rotateY(90deg); opacity: 0; }\n`;\n\n// Unfold Right\nconst unfoldRight = `\n from { transform: perspective(400px) rotateY(90deg); opacity: 0; }\n to { transform: perspective(400px) rotateY(0); opacity: 1; }\n`;\n\n// Fold Up (rotate around X)\nconst foldUp = `\n from { transform: perspective(400px) rotateX(0); opacity: 1; }\n to { transform: perspective(400px) rotateX(-90deg); opacity: 0; }\n`;\n\n// Unfold Up\nconst unfoldUp = `\n from { transform: perspective(400px) rotateX(-90deg); opacity: 0; }\n to { transform: perspective(400px) rotateX(0); opacity: 1; }\n`;\n\n// Fold Down\nconst foldDown = `\n from { transform: perspective(400px) rotateX(0); opacity: 1; }\n to { transform: perspective(400px) rotateX(90deg); opacity: 0; }\n`;\n\n// Unfold Down\nconst unfoldDown = `\n from { transform: perspective(400px) rotateX(90deg); opacity: 0; }\n to { transform: perspective(400px) rotateX(0); opacity: 1; }\n`;\n\n// Map for lookup\nexport const foldMap = {\n fold,\n unfold,\n foldDeep,\n unfoldDeep,\n\n // Extra\n foldLeft,\n unfoldLeft,\n foldRight,\n unfoldRight,\n foldUp,\n unfoldUp,\n foldDown,\n unfoldDown,\n};\n","/* ===========================================================\n Hang On Animations\n=========================================================== */\n\n/* --- Simple subtle swing --- */\nconst hangOnLeft = `\n from { transform: rotate(0deg); }\n to { transform: rotate(-20deg); }\n`;\n\nconst hangOnRight = `\n from { transform: rotate(0deg); }\n to { transform: rotate(20deg); }\n`;\n\n/* --- Simple Up/Down --- */\nconst hangOnTop = `\n from { transform: rotate(0deg); }\n to { transform: rotate(20deg); transform-origin: top; }\n`;\n\nconst hangOnBottom = `\n from { transform: rotate(0deg); }\n to { transform: rotate(-20deg); transform-origin: bottom; }\n`;\n\n/* --- Detailed swing --- */\nconst hangOnLeftSwing = `\n 0% { transform-origin: left; transform: rotate(0deg); }\n 30% { transform: rotate(110deg); }\n 50% { transform: rotate(75deg); }\n 65% { transform: rotate(100deg); }\n 78% { transform: rotate(80deg); }\n 88% { transform: rotate(95deg); }\n 95% { transform: rotate(86deg); }\n 100% { transform: rotate(90deg); }\n`;\n\nconst hangOnRightSwing = `\n 0% { transform-origin: right; transform: rotate(0deg); }\n 30% { transform: rotate(-110deg); }\n 50% { transform: rotate(-75deg); }\n 65% { transform: rotate(-100deg); }\n 78% { transform: rotate(-80deg); }\n 88% { transform: rotate(-95deg); }\n 95% { transform: rotate(-86deg); }\n 100% { transform: rotate(-90deg); }\n`;\n\n/* --- Detailed Top/Bottom Swing --- */\nconst hangOnTopSwing = `\n 0% { transform-origin: top; transform: rotate(0deg); }\n 30% { transform: rotate(-110deg); }\n 50% { transform: rotate(-75deg); }\n 65% { transform: rotate(-100deg); }\n 78% { transform: rotate(-80deg); }\n 88% { transform: rotate(-95deg); }\n 95% { transform: rotate(-86deg); }\n 100% { transform: rotate(-90deg); }\n`;\n\nconst hangOnBottomSwing = `\n 0% { transform-origin: bottom; transform: rotate(0deg); }\n 30% { transform: rotate(110deg); }\n 50% { transform: rotate(75deg); }\n 65% { transform: rotate(100deg); }\n 78% { transform: rotate(80deg); }\n 88% { transform: rotate(95deg); }\n 95% { transform: rotate(86deg); }\n 100% { transform: rotate(90deg); }\n`;\n\n/* --- Oscillating subtle swing (looping style) --- */\nconst hangOnOscillate = `\n 0% { transform: rotate(0deg); }\n 25% { transform: rotate(15deg); }\n 50% { transform: rotate(-15deg); }\n 75% { transform: rotate(10deg); }\n 100% { transform: rotate(0deg); }\n`;\n\n/* --- Drop after hang --- */\nconst hangOnDrop = `\n 0% { transform-origin: top; transform: rotate(0deg); opacity: 1; }\n 20% { transform: rotate(30deg); opacity: 1; }\n 40% { transform: rotate(-30deg); opacity: 1; }\n 60% { transform: rotate(15deg); opacity: 1; }\n 80% { transform: rotate(-15deg); opacity: 1; }\n 100% { transform: rotate(90deg) translateY(200%); opacity: 0; }\n`;\n\n/* --- HangOn Map --- */\nexport const hangOnMap = {\n // simple\n hangOnLeft,\n hangOnRight,\n hangOnTop,\n hangOnBottom,\n\n // detailed swings\n hangOnLeftSwing,\n hangOnRightSwing,\n hangOnTopSwing,\n hangOnBottomSwing,\n\n // extra\n hangOnOscillate,\n hangOnDrop,\n};\n","/* ===========================================================\n Zoom Animations\n=========================================================== */\n\n/** Simple zoom in (center) */\nconst zoomIn = `\n from { transform: scale(2); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n`;\n\n/** Simple zoom out (center) */\nconst zoomOut = `\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(2); opacity: 0; }\n`;\n\n/** Zoom in from left */\nconst zoomInFromLeft = `\n from { transform: scale(2) translateX(-100%); opacity: 0; }\n to { transform: scale(1) translateX(0); opacity: 1; }\n`;\n\n/** Zoom in from right */\nconst zoomInFromRight = `\n from { transform: scale(2) translateX(100%); opacity: 0; }\n to { transform: scale(1) translateX(0); opacity: 1; }\n`;\n\n/** Zoom in from top */\nconst zoomInFromTop = `\n from { transform: scale(2) translateY(-100%); opacity: 0; }\n to { transform: scale(1) translateY(0); opacity: 1; }\n`;\n\n/** Zoom in from bottom */\nconst zoomInFromBottom = `\n from { transform: scale(2) translateY(100%); opacity: 0; }\n to { transform: scale(1) translateY(0); opacity: 1; }\n`;\n\n/** Zoom out to left */\nconst zoomOutToLeft = `\n from { transform: scale(1) translateX(0); opacity: 1; }\n to { transform: scale(2) translateX(-100%); opacity: 0; }\n`;\n\n/** Zoom out to right */\nconst zoomOutToRight = `\n from { transform: scale(1) translateX(0); opacity: 1; }\n to { transform: scale(2) translateX(100%); opacity: 0; }\n`;\n\n/** Zoom out to top */\nconst zoomOutToTop = `\n from { transform: scale(1) translateY(0); opacity: 1; }\n to { transform: scale(2) translateY(-100%); opacity: 0; }\n`;\n\n/** Zoom out to bottom */\nconst zoomOutToBottom = `\n from { transform: scale(1) translateY(0); opacity: 1; }\n to { transform: scale(2) translateY(100%); opacity: 0; }\n`;\n\n/** Zoom in rotate */\nconst zoomInRotate = `\n from { transform: scale(0) rotate(-180deg); opacity: 0; }\n to { transform: scale(1) rotate(0deg); opacity: 1; }\n`;\n\n/** Zoom out rotate */\nconst zoomOutRotate = `\n from { transform: scale(1) rotate(0deg); opacity: 1; }\n to { transform: scale(0) rotate(180deg); opacity: 0; }\n`;\n\n/** Zoom in flip (3D X-axis) */\nconst zoomInFlipX = `\n from { transform: perspective(400px) scale(0.5) rotateX(90deg); opacity: 0; }\n to { transform: perspective(400px) scale(1) rotateX(0deg); opacity: 1; }\n`;\n\n/** Zoom out flip (3D X-axis) */\nconst zoomOutFlipX = `\n from { transform: perspective(400px) scale(1) rotateX(0deg); opacity: 1; }\n to { transform: perspective(400px) scale(0.5) rotateX(90deg); opacity: 0; }\n`;\n\n/** Zoom in flip (3D Y-axis) */\nconst zoomInFlipY = `\n from { transform: perspective(400px) scale(0.5) rotateY(90deg); opacity: 0; }\n to { transform: perspective(400px) scale(1) rotateY(0deg); opacity: 1; }\n`;\n\n/** Zoom out flip (3D Y-axis) */\nconst zoomOutFlipY = `\n from { transform: perspective(400px) scale(1) rotateY(0deg); opacity: 1; }\n to { transform: perspective(400px) scale(0.5) rotateY(90deg); opacity: 0; }\n`;\n\n/** Zoom pulse (in-out loop) */\nconst zoomPulse = `\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.1); }\n`;\n\n/** Zoom swing (elastic effect) */\nconst zoomSwing = `\n 0% { transform: scale(0.3); opacity: 0; }\n 50% { transform: scale(1.2); opacity: 1; }\n 70% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n`;\n\n/* ===========================================================\n * Zoom Animation Map\n=========================================================== */\nexport const zoomMap = {\n zoomIn,\n zoomOut,\n zoomInFromLeft,\n zoomInFromRight,\n zoomInFromTop,\n zoomInFromBottom,\n zoomOutToLeft,\n zoomOutToRight,\n zoomOutToTop,\n zoomOutToBottom,\n\n // Extra\n zoomInRotate,\n zoomOutRotate,\n zoomInFlipX,\n zoomOutFlipX,\n zoomInFlipY,\n zoomOutFlipY,\n zoomPulse,\n zoomSwing,\n};\n","/* =========================\n Rotate Animations\n========================= */\n\n// Rotate clockwise around Z-axis\nconst rotateCW = `\n from {\n transform: rotateZ(0deg);\n transform-origin: center center;\n }\n to {\n transform: rotateZ(360deg);\n transform-origin: center center;\n }\n`;\n\n// Rotate anti-clockwise around Z-axis\nconst rotateACW = `\n from {\n transform: rotateZ(0deg);\n transform-origin: center center;\n }\n to {\n transform: rotateZ(-360deg);\n transform-origin: center center;\n }\n`;\n\n// Rotate slowly with deceleration\nconst rotateSlowDown = `\n 0% { transform: rotateZ(0deg); transform-origin: center center; }\n 5% { transform: rotateZ(1turn); transform-origin: center center; }\n 10% { transform: rotateZ(2turn); transform-origin: center center; }\n 20% { transform: rotateZ(3turn); transform-origin: center center; }\n 40% { transform: rotateZ(4turn); transform-origin: center center; }\n 65%, 100% { transform: rotateZ(5turn); transform-origin: center center; }\n`;\n\n// Rotate around X-axis\nconst rotateX = `\n from { transform: rotateX(0deg); transform-origin: center center; }\n to { transform: rotateX(360deg); transform-origin: center center; }\n`;\n\n// Rotate around Y-axis\nconst rotateY = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(360deg); transform-origin: center center; }\n`;\n\n// Flip from left to center (Y-axis)\nconst rotateFromLeft = `\n from { transform: rotateY(-90deg); transform-origin: left center; }\n to { transform: rotateY(0deg); transform-origin: left center; }\n`;\n\n// Flip from right to center (Y-axis)\nconst rotateFromRight = `\n from { transform: rotateY(90deg); transform-origin: right center; }\n to { transform: rotateY(0deg); transform-origin: right center; }\n`;\n\n// Flip to left (Y-axis)\nconst rotateToLeft = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(-90deg); transform-origin: center center; }\n`;\n\n// Flip to right (Y-axis)\nconst rotateToRight = `\n from { transform: rotateY(0deg); transform-origin: center center; }\n to { transform: rotateY(90deg); transform-origin: center center; }\n`;\n\n// Flip from top (X-axis)\nconst rotateFromTop = `\n from { transform: rotateX(-90deg); transform-origin: center top; }\n to { transform: rotateX(0deg); transform-origin: center top; }\n`;\n\n// Flip from bottom (X-axis)\nconst rotateFromBottom = `\n from { transform: rotateX(90deg); transform-origin: center bottom; }\n to { transform: rotateX(0deg); transform-origin: center bottom; }\n`;\n\n// Flip to top (X-axis)\nconst rotateToTop = `\n from { transform: rotateX(0deg); transform-origin: center top; }\n to { transform: rotateX(-90deg); transform-origin: center top; }\n`;\n\n// Flip to bottom (X-axis)\nconst rotateToBottom = `\n from { transform: rotateX(0deg); transform-origin: center bottom; }\n to { transform: rotateX(90deg); transform-origin: center bottom; }\n`;\n\n// =========================\n// Export as a map\n// =========================\nexport const rotateMap = {\n rotateCW,\n rotateACW,\n\n rotateSlowDown,\n rotateX,\n rotateY,\n\n rotateFromLeft,\n rotateFromRight,\n rotateToLeft,\n rotateToRight,\n\n rotateFromTop,\n rotateFromBottom,\n rotateToTop,\n rotateToBottom,\n};\n","/* ===========================================================\n 5. Fun / Attention Animations\n=========================================================== */\n\n/** Heartbeat animation */\nconst heartBeat = `\n 0%, 28%, 70%, 100% { transform: scale(1); }\n 14%, 42% { transform: scale(1.3); }\n`;\n\n/** Tada animation (shake + scale) */\nconst tada = `\n from { transform: scale3d(1, 1, 1); }\n 10%, 20% { transform: scale3d(.9, .9, .9) rotate(-3deg); }\n 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); }\n 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); }\n to { transform: scale3d(1, 1, 1); }\n`;\n\n/** Hinge animation (falls down like hinge) */\nconst hinge = `\n 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; }\n 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; }\n 40%, 80% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; }\n 100% { transform: translateY(700px); opacity: 0; }\n`;\n\n/** LightSpeedIn from left */\nconst lightSpeedInLeft = `\n from { transform: translateX(-100%) skewX(30deg); opacity: 0; }\n 60% { transform: skewX(-20deg); opacity: 1; }\n 80% { transform: skewX(5deg); }\n to { transform: none; }\n`;\n\n/** LightSpeedOut to right */\nconst lightSpeedOutRight = `\n from { opacity: 1; }\n to { transform: translateX(100%) skewX(-30deg); opacity: 0; }\n`;\n\n/** ===========================================================\n * Fun / Attention Map\n=========================================================== */\nexport const funMap = {\n heartBeat,\n tada,\n hinge,\n lightSpeedInLeft,\n lightSpeedOutRight,\n};\n","// Basic pop in/out\nconst popIn = `\n from { opacity: 0; transform: scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: scale3d(1,1,1); }\n`;\nconst popOut = `\n from { opacity: 1; transform: scale3d(1,1,1); }\n to { opacity: 0; transform: scale3d(0.5,0.5,0.5); }\n`;\n\n// Bounce effect\nconst bounceIn = `\n 0% { opacity: 0; transform: scale3d(0.3,0.3,0.3); }\n 50% { opacity: 1; transform: scale3d(1.05,1.05,1.05); }\n 70% { transform: scale3d(0.9,0.9,0.9); }\n 100% { transform: scale3d(1,1,1); }\n`;\nconst bounceOut = `\n 20% { transform: scale3d(0.9,0.9,0.9); }\n 50%,55% { opacity:1; transform: scale3d(1.1,1.1,1.1); }\n to { opacity:0; transform: scale3d(0.3,0.3,0.3); }\n`;\n\n// Directional pop (translate + scale)\nconst popUpIn = `\n from { opacity:0; transform: translateY(50%) scale3d(0.5,0.5,0.5); }\n to { opacity:1; transform: translateY(0) scale3d(1,1,1); }\n`;\nconst popUpOut = `\n from { opacity:1; transform: translateY(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateY(-50%) scale3d(0.5,0.5,0.5); }\n`;\n\nconst popRotateIn = `\n from { opacity:0; transform: scale3d(0.5,0.5,0.5) rotate(-45deg); }\n to { opacity:1; transform: scale3d(1,1,1) rotate(0deg); }\n`;\nconst popRotateOut = `\n from { opacity:1; transform: scale3d(1,1,1) rotate(0deg); }\n to { opacity:0; transform: scale3d(0.5,0.5,0.5) rotate(45deg); }\n`;\n\nconst popBlurIn = `\n from { opacity:0; transform: scale3d(0.5,0.5,0.5); filter: blur(5px); }\n to { opacity:1; transform: scale3d(1,1,1); filter: blur(0); }\n`;\nconst popBlurOut = `\n from { opacity:1; transform: scale3d(1,1,1); filter: blur(0); }\n to { opacity:0; transform: scale3d(0.5,0.5,0.5); filter: blur(5px); }\n`;\n\n// Pop from left\nconst popLeftIn = `\n from { opacity: 0; transform: translateX(-50%) scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: translateX(0) scale3d(1,1,1); }\n`;\nconst popLeftOut = `\n from { opacity:1; transform: translateX(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateX(-50%) scale3d(0.5,0.5,0.5); }\n`;\n\n// Pop from right\nconst popRightIn = `\n from { opacity: 0; transform: translateX(50%) scale3d(0.5,0.5,0.5); }\n to { opacity: 1; transform: translateX(0) scale3d(1,1,1); }\n`;\nconst popRightOut = `\n from { opacity:1; transform: translateX(0) scale3d(1,1,1); }\n to { opacity:0; transform: translateX(50%) scale3d(0.5,0.5,0.5); }\n`;\n\n// Export map\nexport const popMap = {\n popIn, // default popIn\n popOut,\n popBounceIn: bounceIn,\n popBounceOut: bounceOut,\n popUpIn,\n popUpOut,\n\n popRotateIn,\n popRotateOut,\n popBlurIn,\n popBlurOut,\n\n popLeftIn,\n popLeftOut,\n popRightIn,\n popRightOut,\n};\n","// core/injectKeyframe.ts\nconst injected = new Set<string>();\n\nexport function injectKeyframe(\n name: string,\n frames: string\n) {\n if (injected.has(name)) return;\n\n injected.add(name);\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-az-keyframe\", name);\n\n style.innerHTML = `\n@keyframes ${name} {\n${frames}\n}\n `.trim();\n\n document.head.appendChild(style);\n}\n","// core/createAnimate.ts\nimport type React from \"react\";\nimport { defaultDurationMap } from \"../animation/durations\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\nimport { animFramesMaps } from \"../key-frames\";\n\nimport { injectKeyframe } from \"./injectKeyframe\";\n\ntype Target =\n | HTMLElement\n | null\n | undefined\n | React.RefObject<HTMLElement>;\n\nfunction resolve(target?: Target): HTMLElement | null {\n if (!target) return null;\n if (typeof target === \"object\" && \"current\" in target) {\n return target.current;\n }\n return target;\n}\n\nexport function animate(target?: Target) {\n const el = resolve(target);\n let cleanup: (() => void) | null = null;\n\n function clear() {\n if (!el) return;\n el.style.animation = \"\";\n el.style.removeProperty(\"animation-name\");\n el.style.removeProperty(\"animation-duration\");\n el.style.removeProperty(\"animation-timing-function\");\n el.style.removeProperty(\"animation-iteration-count\");\n el.style.removeProperty(\"animation-fill-mode\");\n }\n\n function run(\n name: AnimName,\n opts: IFAnimateRecipeOptions = {}\n ) {\n if (!el) return;\n\n // cancel previous\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n\n const frames = animFramesMaps[name];\n if (frames) {\n injectKeyframe(`az-${name}`, frames);\n }\n\n const duration =\n opts.duration ??\n // @ts-ignore\n defaultDurationMap[name] ??\n \"1s\";\n\n // restart animation\n el.style.animation = \"none\";\n void el.offsetHeight;\n\n el.style.animationName = `az-${name}`;\n el.style.animationDuration =\n typeof duration === \"number\"\n ? `${duration}ms`\n : duration;\n\n el.style.animationTimingFunction =\n opts.timing ?? \"ease\";\n\n el.style.animationIterationCount =\n String(opts.iteration ?? 1);\n\n el.style.animationFillMode = \"both\";\n\n if (!opts.keep) {\n const onEnd = (e: AnimationEvent) => {\n if (e.target !== el) return;\n clear();\n el.removeEventListener(\"animationend\", onEnd);\n cleanup = null;\n };\n\n el.addEventListener(\"animationend\", onEnd);\n\n cleanup = () => {\n el.removeEventListener(\"animationend\", onEnd);\n clear();\n };\n }\n }\n\n function stop() {\n if (cleanup) cleanup();\n cleanup = null;\n clear();\n }\n\n return { run, stop };\n}\n","// animation/types.ts (MERGED)\nimport type { AnimName } from \"../key-frames\";\n\n/* =========================\n Timing Map\n========================= */\nexport const timingMap = {\n linear: \"linear\",\n ease: \"ease\",\n easeIn: \"ease-in\",\n easeOut: \"ease-out\",\n easeInOut: \"ease-in-out\",\n} as const;\n\nexport type TypeTimingKey = keyof typeof timingMap;\n\n/* =========================\n Base Styled Props\n========================= */\nexport interface IFBaseStyledElementProps {\n readonly type?: AnimName;\n readonly duration?: string | number;\n readonly timing?: TypeTimingKey;\n readonly delay?: string | number;\n readonly iteration?: number | \"infinite\";\n readonly direction?: \"normal\" | \"reverse\" | \"alternate\" | \"alternate-reverse\";\n readonly fillMode?: \"none\" | \"forwards\" | \"backwards\" | \"both\";\n}\n\n/* =========================\n Animate Props\n========================= */\nexport interface IFAnimateProps\n extends IFBaseStyledElementProps,\n React.HTMLAttributes<HTMLDivElement> {\n readonly tagName?: keyof JSX.IntrinsicElements | React.ElementType;\n readonly children: React.ReactNode | string;\n}\n\n/* =========================\n Unified Animate Options (MERGED)\n========================= */\nexport type TypeAnimationIntensity = \"soft\" | \"medium\" | \"hard\";\n\nexport interface IFAnimateOptions {\n intensity?: TypeAnimationIntensity;\n duration?: number | string;\n delay?: number;\n timing?: string;\n iteration?: number;\n keep?: boolean;\n}\n\nexport interface IFAnimateRecipeOptions extends IFAnimateOptions {\n // reserved for recipe / flow level\n}\n\nexport type TypeAnimateRecipeResolver =\n | AnimName\n | ((options?: IFAnimateRecipeOptions) => AnimName);\n","// AnimateStyled.tsx\nimport styled, { css, keyframes } from 'styled-components';\nimport { timingMap, IFBaseStyledElementProps } from '../animation/types';\nimport { animFramesMaps } from '../key-frames';\n\nconst blockedProps = [\n 'type',\n 'duration',\n 'timing',\n 'delay',\n 'iteration',\n 'direction',\n 'fillMode',\n 'tagName',\n];\n\nconst shouldForwardProp = (prop: string) => !blockedProps.includes(prop);\n\n/* =========================\n Keyframes cache (IMPORTANT)\n========================= */\nconst keyframesCache: Record<string, ReturnType<typeof keyframes>> = {};\n\nfunction getKeyframes(type?: string) {\n if (!type) return undefined;\n if (!keyframesCache[type]) {\n // @ts-ignore\n keyframesCache[type] = keyframes`${animFramesMaps[type]}`;\n }\n return keyframesCache[type];\n}\n\n/* =========================\n Styled Element\n========================= */\nexport const StyledElement = styled('div').withConfig({\n shouldForwardProp,\n})<IFBaseStyledElementProps>`\n margin: 0;\n padding: 0;\n\n ${({ type, duration = 1000, timing, delay, iteration, direction, fillMode }) => {\n const frames = getKeyframes(type);\n\n if (!frames) return '';\n\n return css`\n animation-name: ${frames};\n animation-duration: ${typeof duration === 'number' ? `${duration}ms` : duration};\n animation-timing-function: ${timing ? timingMap[timing] : 'ease'};\n animation-delay: ${typeof delay === 'number' ? `${delay}ms` : delay || '0ms'};\n animation-iteration-count: ${iteration ?? 1};\n animation-direction: ${direction ?? 'normal'};\n animation-fill-mode: ${fillMode ?? 'both'};\n `;\n }}\n`;\n","import React, { forwardRef } from \"react\";\nimport { defaultDurationMap } from \"../animation/durations\";\nimport type { IFAnimateProps } from \"../animation/types\";\nimport { StyledElement } from \"./AnimateStyled\";\n\nexport const Animate = forwardRef<\n HTMLElement,\n IFAnimateProps\n>(function Animate(\n {\n tagName: Tag = \"div\",\n children,\n className,\n type = \"blurIn\",\n duration,\n timing = \"ease\",\n delay = \"0s\",\n direction = \"alternate\",\n fillMode = \"forwards\",\n iteration,\n ...props\n },\n ref\n) {\n const resolved =\n // @ts-ignore\n duration ?? defaultDurationMap[type] ?? \"1s\";\n\n const durationVal =\n typeof resolved === \"number\"\n ? `${resolved}ms`\n : resolved;\n\n return (\n <StyledElement\n as={Tag as any}\n ref={ref as any}\n className={className}\n type={type}\n duration={durationVal}\n timing={timing}\n delay={delay}\n iteration={iteration ?? 1}\n direction={direction}\n fillMode={fillMode}\n {...props}\n >\n {children}\n </StyledElement>\n );\n});\n\nexport default Animate;\n","import React, {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n useState,\n} from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport Animate from \"./Animate\";\n\nexport interface IFAnimateGroupProps {\n type: AnimName;\n stagger?: number;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const AnimateGroup: React.FC<IFAnimateGroupProps> = ({\n type,\n stagger = 80,\n children,\n className,\n}) => {\n const [visibleCount, setVisibleCount] = useState(0);\n const items = Children.toArray(children);\n\n useEffect(() => {\n if (!stagger) {\n setVisibleCount(items.length);\n return;\n }\n\n let i = 0;\n const timer = setInterval(() => {\n i++;\n setVisibleCount(i);\n if (i >= items.length) clearInterval(timer);\n }, stagger);\n\n return () => clearInterval(timer);\n }, [stagger, items.length]);\n\n return (\n <div className={className}>\n {items.map((child, index) => {\n if (!isValidElement(child)) return child;\n if (index >= visibleCount) return null;\n\n return (\n <Animate key={index} type={type}>\n {cloneElement(child)}\n </Animate>\n );\n })}\n </div>\n );\n};\n","import React, {\n forwardRef,\n ElementType,\n} from \"react\";\nimport type { IFAnimateProps } from \"../animation/types\";\n\nimport Animate from \"./Animate\";\n\nexport interface IFAnimateHostProps<\n T extends ElementType = \"div\"\n> extends Omit<IFAnimateProps, \"children\"> {\n as?: T;\n children: React.ReactNode;\n}\n\nexport const AnimateHost = forwardRef<\n HTMLElement,\n IFAnimateHostProps\n>(function AnimateHost(\n { as, children, ...props },\n ref\n) {\n return (\n <Animate\n {...props}\n tagName={as}\n ref={ref as any}\n >\n {children}\n </Animate>\n );\n});\n\nexport default AnimateHost;\n","import { TypeRunFn } from \"../hooks\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"./types\";\n\nfunction wait(ms: number) {\n return new Promise<void>((r) => setTimeout(r, ms));\n}\n\nfunction nextFrame() {\n return new Promise<void>((r) =>\n requestAnimationFrame(() => r())\n );\n}\n\nexport class AnimateSequence {\n private run: TypeRunFn;\n private chain: Promise<void> = Promise.resolve();\n private currentVariant?: string;\n\n constructor(run: TypeRunFn) {\n this.run = run;\n }\n\n variant(name: string) {\n this.currentVariant = name;\n return this;\n }\n\n animate(name: AnimName, options?: IFAnimateRecipeOptions) {\n this.chain = this.chain\n .then(nextFrame)\n .then(() => {\n this.run(name, options);\n return wait(\n typeof options?.duration === 'number'\n ? options.duration\n : 300\n );\n });\n\n return this;\n }\n\n wait(ms: number) {\n this.chain = this.chain.then(() => wait(ms));\n return this;\n }\n\n parallel(\n steps: ((\n api: {\n animate: (\n name: AnimName,\n options?: IFAnimateRecipeOptions\n ) => void;\n }\n ) => void)[],\n waitAfter = 0\n ) {\n this.chain = this.chain\n .then(nextFrame)\n .then(() => {\n const tasks = steps.map(\n (fn) =>\n new Promise<void>((resolve) => {\n fn({\n animate: (name, options) => {\n this.run(\n name,\n options,\n this.currentVariant\n );\n setTimeout(\n resolve,\n // @ts-ignore\n options?.duration ?? 300\n );\n },\n });\n })\n );\n\n return Promise.all(tasks).then(() =>\n wait(waitAfter)\n );\n });\n\n return this;\n }\n}\n","// hooks/useAnimate.ts\nimport { useRef, useCallback } from \"react\";\nimport { animate } from \"../core/createAnimate\";\nimport type { AnimName } from \"../key-frames\";\nimport { AnimateSequence, IFAnimateRecipeOptions } from \"../animation\";\n\nexport function useAnimate<T extends HTMLElement>() {\n const ref = useRef<T | null>(null);\n\n const run = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n if (!ref.current) return;\n animate(ref.current).run(name, opts);\n },\n []\n );\n\n const play = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n run(name, opts);\n },\n [run]\n );\n\n const reset = useCallback(() => {\n if (!ref.current) return;\n animate(ref.current).stop();\n }, []);\n\n const sequence = useCallback(() => {\n return new AnimateSequence(run);\n }, [run]);\n\n return {\n ref,\n run,\n play,\n reset,\n sequence,\n };\n}\n","import React, { useEffect, useRef, useState, ReactElement, cloneElement } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"../hooks/useAnimate\";\n\nexport interface IFAnimatePresenceProps {\n show: boolean;\n enter: AnimName;\n exit: AnimName;\n duration?: number;\n children: ReactElement;\n}\n\nexport const AnimatePresence: React.FC<IFAnimatePresenceProps> = ({\n show,\n enter,\n exit,\n duration = 300,\n children,\n}) => {\n const anim = useAnimate<HTMLElement>();\n const [mounted, setMounted] = useState(show);\n const prev = useRef(show);\n\n useEffect(() => {\n // ---- ENTER ----\n if (show && !prev.current) {\n setMounted(true);\n }\n\n // ---- EXIT ----\n if (!show && prev.current) {\n const node = anim.ref.current;\n if (!node) return;\n\n const exitDuration = anim.play(exit) ?? duration;\n\n const t = setTimeout(() => {\n setMounted(false);\n }, exitDuration);\n\n return () => clearTimeout(t);\n }\n\n prev.current = show;\n }, [show, enter, exit, duration]);\n\n useEffect(() => {\n if (mounted && show) {\n anim.play(enter);\n }\n }, [mounted, show, enter]);\n\n if (!mounted) return null;\n\n return cloneElement(children, {\n ref: (node: any) => {\n anim.ref.current = node;\n\n const childRef = (children as any).ref;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef) {\n childRef.current = node;\n }\n },\n });\n};\n\nexport default AnimatePresence;\n","import React from 'react';\n\nimport { defaultDurationMap } from '../animation/durations';\nimport type { IFAnimateProps } from '../animation/types';\nimport { AnimName } from '../key-frames';\n\nimport { Animate } from './Animate';\n\nconst defaults = {\n delay: '0s',\n direction: 'normal',\n timing: 'ease',\n iteration: 1,\n fillMode: 'forwards',\n} as const;\n\nconst makeParams = (\n type?: AnimName,\n duration?: string | number,\n): Omit<IFAnimateProps, 'children'> => ({\n ...defaults,\n type,\n // @ts-ignore\n duration: duration ?? defaultDurationMap[type ?? 'blurIn'] ?? '1s',\n});\n\nexport const WrapperAnimate: React.FC<IFAnimateProps> = ({\n children,\n tagName,\n type,\n duration,\n ...props\n}) => (\n <Animate {...makeParams(type, duration)} tagName={tagName} {...props}>\n {children}\n </Animate>\n);\n","import React, {\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled, { keyframes } from 'styled-components';\n\nexport interface IFAnimateTypingProps {\n readonly heading?: string;\n readonly className?: string;\n\n /**\n * Text source (recommended)\n */\n readonly dataText?: string[] | string;\n\n /**\n * Fallback text source\n * Only string | string[] are supported\n */\n readonly children?: React.ReactNode | string | string[];\n\n readonly typingSpeed?: number;\n readonly deletingSpeed?: number;\n readonly pauseTime?: number;\n readonly cursorColor?: string | null;\n}\n\n/* =========================\n Cursor\n========================= */\nconst blink = keyframes`\n 50% { border-color: transparent; }\n`;\n\nconst Cursor = styled.span<{ cursorColor?: string | null }>`\n margin-left: 2px;\n border-left: 3px solid ${({ cursorColor }) => cursorColor || '#000'};\n animation: ${blink} 0.7s steps(1) infinite;\n`;\n\n/* =========================\n Component\n========================= */\nexport const AnimateTyping: React.FC<IFAnimateTypingProps> = ({\n heading,\n dataText,\n className,\n cursorColor = '#000',\n typingSpeed = 120,\n deletingSpeed = 40,\n pauseTime = 500,\n children,\n}) => {\n const [text, setText] = useState('');\n const [isDeleting, setIsDeleting] = useState(false);\n const [loopNum, setLoopNum] = useState(0);\n\n /* =========================\n Resolve text sources\n ========================= */\n const texts = useMemo<string[]>(() => {\n if (Array.isArray(dataText)) return dataText;\n if (typeof dataText === 'string') return [dataText];\n\n if (typeof children === 'string') return [children];\n\n if (\n Array.isArray(children) &&\n children.every(c => typeof c === 'string')\n ) {\n return children;\n }\n\n return [];\n }, [dataText, children]);\n\n const timerRef = useRef<number>();\n\n /* =========================\n Typing logic\n ========================= */\n useEffect(() => {\n if (!texts.length) return;\n\n const index = loopNum % texts.length;\n const fullText = texts[index];\n\n const nextText = isDeleting\n ? fullText.substring(0, text.length - 1)\n : fullText.substring(0, text.length + 1);\n\n const doneTyping = !isDeleting && nextText === fullText;\n const doneDeleting = isDeleting && nextText === '';\n\n timerRef.current = window.setTimeout(() => {\n setText(nextText);\n\n if (doneTyping) {\n setTimeout(() => setIsDeleting(true), pauseTime);\n }\n\n if (doneDeleting) {\n setIsDeleting(false);\n setLoopNum(v => v + 1);\n }\n }, isDeleting ? deletingSpeed : typingSpeed);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [\n text,\n isDeleting,\n loopNum,\n texts,\n typingSpeed,\n deletingSpeed,\n pauseTime,\n ]);\n\n /* =========================\n Render\n ========================= */\n return (\n <div className={className}>\n {heading && (\n <>\n <span>{heading}</span> \n </>\n )}\n\n <span>{text}</span>\n <Cursor cursorColor={cursorColor} />\n </div>\n );\n};\n\nexport default AnimateTyping;\n","import { useAnimate } from \"./useAnimate\";\n\nconst MAP = {\n success: \"pulse\",\n error: \"shakeMix\",\n loading: \"float\",\n warning: \"flash\",\n} as const;\n\nexport function useAttention<T extends HTMLElement>() {\n const anim = useAnimate<T>();\n\n return {\n ...anim,\n success: () => anim.play(MAP.success),\n error: () => anim.play(MAP.error),\n loading: () => anim.play(MAP.loading),\n warning: () => anim.play(MAP.warning),\n };\n}\n","import { useEffect, useState } from 'react';\n\ninterface IFUseTypingIFAnimateOptions {\n text: string;\n speed?: number;\n loop?: boolean;\n}\n\nexport function useTypingAnimate({\n text,\n speed = 50,\n loop = false,\n}: IFUseTypingIFAnimateOptions) {\n const [output, setOutput] = useState('');\n const [index, setIndex] = useState(0);\n const [done, setDone] = useState(false);\n\n useEffect(() => {\n if (index >= text.length) {\n setDone(true);\n\n if (!loop) return;\n\n const t = setTimeout(() => {\n setIndex(0);\n setOutput('');\n setDone(false);\n }, 800);\n\n return () => clearTimeout(t);\n }\n\n const t = setTimeout(() => {\n setOutput((s) => s + text[index]);\n setIndex((i) => i + 1);\n }, speed);\n\n return () => clearTimeout(t);\n }, [index, text, speed, loop]);\n\n return {\n output,\n isDone: done,\n reset: () => {\n setIndex(0);\n setOutput('');\n setDone(false);\n },\n };\n}\n","import { useRef, useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\n\nimport { useAnimate } from \"./useAnimate\";\n\nexport type RecipeState =\n | \"idle\"\n | \"loading\"\n | \"success\"\n | \"error\"\n | \"warning\";\n\nconst DEFAULT = {\n idle: \"fadeIn\",\n loading: \"float\",\n success: \"pulse\",\n error: \"shakeMix\",\n warning: \"flash\",\n} as const;\n\nexport function useRecipe(options?: {\n map?: Partial<Record<RecipeState, AnimName>>;\n autoReset?: boolean;\n resetDelay?: number;\n}) {\n const {\n map = DEFAULT,\n autoReset = true,\n resetDelay = 600,\n } = options || {};\n\n const anim = useAnimate<HTMLElement>();\n const timer = useRef<number | undefined>();\n\n const play = useCallback(\n (state: RecipeState) => {\n const name = map[state];\n if (!name) return;\n\n anim.play(name);\n\n if (autoReset && state !== \"loading\") {\n clearTimeout(timer.current);\n timer.current = window.setTimeout(\n anim.reset,\n resetDelay\n );\n }\n },\n [map, autoReset, resetDelay, anim]\n );\n\n return {\n ...anim,\n play,\n };\n}\n","/* =========================\n Core\n========================= */\nexport * from './core';\n\n/* =========================\n Components\n========================= */\nexport * from './components';\n\n/* =========================\n Hooks\n========================= */\nexport * from './hooks';\n\n/* =========================\n Animation Metadata\n========================= */\nexport * from './key-frames';\n\n/* =========================\n Durations\n========================= */\nimport { defaultDurationMap } from './animation/durations';\nexport { defaultDurationMap };\n\n/* =========================\n Duration Presets\n========================= */\nexport const bounceDurations = {\n bounce: defaultDurationMap.bounce,\n bounceIn: defaultDurationMap.bounceIn,\n bounceOut: defaultDurationMap.bounceOut,\n bounceElastic: defaultDurationMap.bounceElastic,\n bounceJelly: defaultDurationMap.bounceJelly,\n} as const;\n\nexport const shakeDurations = {\n shakeMix: defaultDurationMap.shakeMix,\n shakeHorizontal: defaultDurationMap.shakeHorizontal,\n shakeVertical: defaultDurationMap.shakeVertical,\n shakeQuick: defaultDurationMap.shakeQuick,\n} as const;\n\nexport const fadeDurations = {\n fadeIn: defaultDurationMap.fadeIn,\n fadeOut: defaultDurationMap.fadeOut,\n blurIn: defaultDurationMap.blurIn,\n blurOut: defaultDurationMap.blurOut,\n} as const;\n\nexport const typingDurations = {\n typing: defaultDurationMap.typing,\n typingLoop: defaultDurationMap.typingLoop,\n typeWriter: defaultDurationMap.typeWriter,\n typeDelete: defaultDurationMap.typeDelete,\n} as const;\n\n/* =========================\n UX Defaults\n========================= */\nexport const defaultEnterDuration = defaultDurationMap.fadeIn;\nexport const defaultExitDuration = defaultDurationMap.fadeOut;\nexport const defaultAttentionDuration = defaultDurationMap.shakeMix;\nexport const defaultLoopDuration = defaultDurationMap.float;\n\nexport const UXDuration = {\n instant: '0.2s',\n fast: '0.5s',\n normal: '0.8s',\n slow: '1.2s',\n dramatic: '2s',\n} as const;\n\n/* =========================\n Default Export\n========================= */\nimport Animate from './components/Animate';\nexport default Animate;\n","// components/AnimateOn.tsx\nimport React, {\n useEffect,\n useRef,\n ReactElement,\n cloneElement,\n} from \"react\";\nimport { useAnimate } from \"../hooks/useAnimate\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nimport type { AnimName } from \"../key-frames\";\n\nexport interface IFAnimateOnProps<T = any> {\n when: T;\n value?: T;\n anim: AnimName | AnimName[];\n options?: IFAnimateRecipeOptions;\n children: ReactElement;\n}\n\nexport function AnimateOn<T>({\n when,\n value,\n anim,\n options,\n children,\n}: IFAnimateOnProps<T>) {\n const animApi = useAnimate<HTMLElement>();\n const prev = useRef<T>(when);\n\n useEffect(() => {\n let shouldPlay = false;\n\n if (value === undefined) {\n shouldPlay = when !== prev.current;\n } else {\n // trigger khi when chạm value\n shouldPlay =\n when === value && prev.current !== value;\n }\n\n if (shouldPlay) {\n if (Array.isArray(anim)) {\n const seq = animApi.sequence();\n anim.forEach((name) => {\n seq.animate(name, options);\n });\n } else {\n animApi.play(anim, options);\n }\n }\n\n prev.current = when;\n }, [when, value, anim, options, animApi]);\n\n return cloneElement(children, {\n ref: (node: HTMLElement | null) => {\n animApi.ref.current = node;\n\n const childRef = (children as any).ref;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef && \"current\" in childRef) {\n childRef.current = node;\n }\n },\n });\n}\n\nexport default AnimateOn;\n","import { useTypingAnimate } from \"../hooks\";\n\ninterface TypingTextProps {\n text: string;\n speed?: number;\n loop?: boolean;\n as?: keyof JSX.IntrinsicElements;\n}\n\nexport function TypingText({\n text,\n speed,\n loop,\n as: Tag = 'span',\n}: TypingTextProps) {\n const { output } = useTypingAnimate({ text, speed, loop });\n return <Tag>{output}</Tag>;\n}\n","import { useMemo, useCallback, useEffect } from 'react';\n\nimport type { AnimName } from '../key-frames';\nimport type { IFAnimateRecipeOptions } from '../animation/types';\nimport { createRecipe } from '../core/recipe';\n\nimport { useAnimate } from './useAnimate';\n\n/* =========================\n Types\n========================= */\n\nexport interface IFUseAnimateControllerOptions {\n initial?: AnimName;\n recipe?: Partial<\n Record<\n string,\n AnimName | ((o?: IFAnimateRecipeOptions) => AnimName)\n >\n >;\n}\n\n/* =========================\n Hook\n========================= */\n\nexport function useAnimateController<T extends HTMLElement>(\n options: IFUseAnimateControllerOptions = {}\n) {\n const anim = useAnimate<T>();\n\n /* ---------- play with fallback ---------- */\n const play = useCallback(\n (name?: AnimName, opts?: IFAnimateRecipeOptions) => {\n const animName = name ?? options.initial;\n if (!animName) return;\n anim.play(animName, opts);\n },\n [anim.play, options.initial]\n );\n\n /* ---------- auto initial ---------- */\n useEffect(() => {\n if (options.initial) {\n play(options.initial);\n }\n }, [options.initial, play]);\n\n /* ---------- recipe ---------- */\n const recipe = useMemo(() => {\n if (!options.recipe) return undefined;\n return createRecipe(anim.run, options.recipe);\n }, [anim.run, options.recipe]);\n\n return {\n ...anim,\n\n /* override / extend */\n play,\n recipe,\n };\n}\n\n","// core/recipe.ts\nimport type { AnimName } from \"../key-frames\";\nimport type {\n IFAnimateRecipeOptions,\n TypeAnimateRecipeResolver,\n} from \"../animation/types\";\n\nexport type TypeRecipeKey =\n | \"idle\"\n | \"enter\"\n | \"exit\"\n | \"loading\"\n | \"success\"\n | \"error\"\n | \"attention\";\n\nexport type TypeRecipeConfig = Partial<\n Record<TypeRecipeKey, TypeAnimateRecipeResolver>\n>;\n\nexport function createRecipe(\n run: (name: AnimName, options?: IFAnimateRecipeOptions) => void,\n config: TypeRecipeConfig\n) {\n const api: any = {};\n\n Object.keys(config).forEach((key) => {\n api[key] = (options?: IFAnimateRecipeOptions) => {\n const resolver = config[key as TypeRecipeKey];\n if (!resolver) return;\n\n const anim =\n typeof resolver === \"function\"\n ? resolver(options)\n : resolver;\n\n run(anim, options);\n };\n });\n\n api.run = (key: TypeRecipeKey, options?: IFAnimateRecipeOptions) => {\n const resolver = config[key];\n if (!resolver) return;\n\n const anim =\n typeof resolver === \"function\"\n ? resolver(options)\n : resolver;\n\n run(anim, options);\n };\n\n return api as Record<\n TypeRecipeKey,\n (options?: IFAnimateRecipeOptions) => void\n > & {\n run: (key: TypeRecipeKey, options?: IFAnimateRecipeOptions) => void;\n };\n}\n","// hooks/useAnimateSequence.ts\nimport { useCallback, useMemo } from \"react\";\nimport { animate } from \"../core/createAnimate\";\nimport { AnimateSequence, IFAnimateRecipeOptions } from \"../animation\";\nimport { AnimName } from \"../key-frames\";\n\nexport function useAnimateSequence<T extends HTMLElement>(\n ref: React.RefObject<T>\n) {\n const run = useCallback(\n (name: AnimName, opts?: IFAnimateRecipeOptions) => {\n if (!ref.current) return;\n animate(ref.current).run(name, opts);\n },\n [ref]\n );\n\n return useMemo(\n () => new AnimateSequence(run),\n [run]\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useAutoAnimate<T extends HTMLElement>(\n value: any,\n options: { change: AnimName }\n) {\n const anim = useAnimate<T>();\n const prev = useRef(value);\n\n useEffect(() => {\n if (prev.current !== value) {\n anim.play(options.change);\n prev.current = value;\n }\n }, [value, options.change, anim]);\n\n return anim;\n}\n","import type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useFocusAnimate(options: {\n focus?: AnimName;\n blur?: AnimName;\n}) {\n const anim = useAnimate<HTMLElement>();\n\n return {\n ...anim,\n bind: {\n ref: anim.ref,\n onFocus: () => options.focus && anim.play(options.focus),\n onBlur: () => options.blur && anim.play(options.blur),\n }\n };\n}\n","import type { AnimName } from \"../key-frames\";\nimport { useAnimate } from \"./useAnimate\";\n\nexport function useHoverAnimate(options: {\n enter?: AnimName;\n leave?: AnimName;\n}) {\n const anim = useAnimate<HTMLElement>();\n\n return {\n ...anim,\n bind: {\n ref: anim.ref,\n onMouseEnter: () => options.enter && anim.play(options.enter),\n onMouseLeave: () => options.leave && anim.play(options.leave),\n },\n };\n}\n","import { useCallback } from \"react\";\nimport { useAnimate } from \"./useAnimate\";\nimport { AnimName } from \"../key-frames\";\n\nexport function usePairedAnimate<T extends HTMLElement>(options: {\n enter: AnimName;\n leave: AnimName;\n visibleDuration?: number;\n}) {\n const { ref, sequence, play } = useAnimate<T>();\n\n const show = useCallback(() => {\n sequence()\n .animate(options.enter)\n .wait(options.visibleDuration ?? 1000)\n .animate(options.leave);\n }, [sequence, options]);\n\n return { ref, show, play };\n}\n","import { useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nexport function useRandomAnimate(\n run: (name: AnimName, o?: IFAnimateRecipeOptions) => void,\n pool: readonly AnimName[]\n) {\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length) return;\n const name =\n pool[Math.floor(Math.random() * pool.length)];\n run(name, options);\n },\n [run, pool]\n );\n}\n","import { useCallback } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type {\n IFAnimateRecipeOptions,\n TypeAnimationIntensity,\n} from \"../animation/types\";\nimport { TypeRunFn } from \"./types\";\n\ntype TypeIntensityPool = Record<\n TypeAnimationIntensity,\n readonly AnimName[]\n>;\n\nexport function useRandomAnimateByIntensity(\n run: TypeRunFn,\n pool: TypeIntensityPool\n) {\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n const intensity = options?.intensity ?? \"medium\";\n const list = pool[intensity];\n if (!list?.length) return;\n\n const name = list[Math.floor(Math.random() * list.length)];\n run(name, options);\n },\n [run, pool]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\n\nimport { TypeRunFn } from \"./types\";\n\nexport function useRandomAnimateNoRepeat(\n run: TypeRunFn,\n pool: readonly AnimName[]\n) {\n const lastRef = useRef<AnimName | null>(null);\n\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length) return;\n\n let next: AnimName;\n do {\n next = pool[Math.floor(Math.random() * pool.length)];\n } while (pool.length > 1 && next === lastRef.current);\n\n lastRef.current = next;\n run(next, options);\n },\n [run, pool]\n );\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport type { AnimName } from \"../key-frames\";\nimport type { IFAnimateRecipeOptions } from \"../animation/types\";\nimport type { TypeRunFn } from \"./types\";\n\ninterface IFWeightedAnim {\n name: AnimName;\n weight: number;\n}\n\nexport function useWeightedRandomAnimate(\n run: TypeRunFn,\n pool: readonly IFWeightedAnim[]\n) {\n const totalWeight = useMemo(\n () => pool.reduce((s, p) => s + Math.max(0, p.weight), 0),\n [pool]\n );\n\n return useCallback(\n (options?: IFAnimateRecipeOptions) => {\n if (!pool.length || totalWeight <= 0) return;\n\n let r = Math.random() * totalWeight;\n\n for (const item of pool) {\n const w = Math.max(0, item.weight);\n r -= w;\n if (r <= 0) {\n run(item.name, options);\n return;\n }\n }\n },\n [run, pool, totalWeight]\n );\n}\n"],"names":["defaultDurationMap","bounce","bounceIn","bounceOut","bounceElastic","bounceSmall","bounceRotate","bounceJelly","jelly","jellyX","jellyY","jellyIn","jellyOut","shakeMix","shakeHorizontal","shakeVertical","shakeDiagonal","shakeQuick","pulse","pulseInOut","pulseFade","pulseFast","pulseColor","heartBeat","float","floatSway","floatHorizontal","floatCircular","floatWiggle","orbit","orbitEllipse","flash","flashIrregular","flashFast","flashSlow","flashPulse","glow","glowTextFlicker","glowRainbow","glowBreathing","glowGlitch","blurIn","blurOut","fadeIn","fadeOut","slideInFromLeft","slideInFromRight","slideOutToLeft","slideOutToRight","zoomIn","zoomOut","spin","spin3D","flip","flipIn","flipOut","typing","typingLoop","typeWriter","typeDelete","swing","tada","hinge","attentionMap","rubberBand","jello","wobble","rollIn","jackInTheBox","blurMap","blurInZoom","blurInScale","blurInUp","blurInRotate","blurOutZoom","blurOutScale","blurOutDown","blurOutRotate","bounceMap","bounceSide","bounceDiagonal","bounceFlip","bounceFade","bounceCrazy","bounceGlow","bounceFadeScale","bounceSparkle","bounceRainbow","fadeInFromLeft","fadeInFromRight","fadeInFromTop","fadeInFromBottom","fadeMap","fadeOutToLeft","fadeOutToRight","fadeOutToTop","fadeOutToBottom","fadeInUp","fadeInDown","fadeInLeft","fadeInRight","fadeInZoom","fadeOutZoom","fadeInRotate","fadeOutRotate","fadeInSkew","fadeOutSkew","fadeInFlipX","fadeOutFlipX","fadeInFlipY","fadeOutFlipY","fadeInPerspective","fadeOutPerspective","fadeInBlur","fadeOutBlur","fadeInColor","fadeOutColor","fadePulse","fadeBounce","fadeSwing","fadeZoomRotate","fadeElastic","fadeShine","animFramesMaps","effect3D","neonGlow","retro3D","emboss","fireGlow","iceGlow","shine","flashGlow","flashColor","flashStrobe","flashSoft","flashReversePulse","floatPulse","floatDiagonal","floatSwing","floatWave","floatDrift","shadow","shadowText","shadowPulse","shadowNeon","spinX","spinBounce","swingPivot","swingX","swingY","squeezeMix","squeezeHorizontal","squeezeVertical","squeezeDiagonal","squeezePulse","squeezeBounce","squeezeElastic","squeezeFlash","shakeRotate","shakeSkew","shakeBounce","shakeCrazy","squeezeThenShakeX","shakeYThenSqueeze","squeezeShakeCrazy","slideInFromTop","slideInFromBottom","slideOutToTop","slideOutToBottom","slideInFromLeftOvershoot","slideInFromRightOvershoot","slideOutToLeftOvershoot","slideOutToRightOvershoot","slideInFromTopOvershoot","slideInFromBottomOvershoot","slideOutToTopOvershoot","slideOutToBottomOvershoot","flipSlowDown","flipToLeft","flipToRight","flipFromTop","flipToTop","flipToBottom","flipFromBottom","flipFromLeftToCenter","flipFromRightToCenter","flipRich","flipToTopRich","flipToBottomRich","flipToTopLeftRich","flipToRightRich","flipFromTopRich","flipFromBottomRich","flipFromLeftToCenterRich","flipFromRightToCenterRich","fold","unfold","foldDeep","unfoldDeep","foldLeft","unfoldLeft","foldRight","unfoldRight","foldUp","unfoldUp","foldDown","unfoldDown","hangOnLeft","hangOnRight","hangOnTop","hangOnBottom","hangOnLeftSwing","hangOnRightSwing","hangOnTopSwing","hangOnBottomSwing","hangOnOscillate","hangOnDrop","zoomInFromLeft","zoomInFromRight","zoomInFromTop","zoomInFromBottom","zoomOutToLeft","zoomOutToRight","zoomOutToTop","zoomOutToBottom","zoomInRotate","zoomOutRotate","zoomInFlipX","zoomOutFlipX","zoomInFlipY","zoomOutFlipY","zoomPulse","zoomSwing","rotateCW","rotateACW","rotateSlowDown","rotateX","rotateY","rotateFromLeft","rotateFromRight","rotateToLeft","rotateToRight","rotateFromTop","rotateFromBottom","rotateToTop","rotateToBottom","lightSpeedInLeft","lightSpeedOutRight","popIn","popOut","popBounceIn","popBounceOut","popUpIn","popUpOut","popRotateIn","popRotateOut","popBlurIn","popBlurOut","popLeftIn","popLeftOut","popRightIn","popRightOut","animNames","Object","keys","animGroups","fromEntries","name","key","prefix","map","filter","startsWith","injected","Set","animate","target","el","current","resolve","cleanup","clear","style","animation","removeProperty","run","opts","frames","has","add","document","createElement","setAttribute","innerHTML","trim","head","appendChild","injectKeyframe","duration","offsetHeight","animationName","animationDuration","animationTimingFunction","timing","animationIterationCount","String","iteration","animationFillMode","keep","onEnd","e","removeEventListener","addEventListener","stop","timingMap","linear","ease","easeIn","easeOut","easeInOut","blockedProps","keyframesCache","StyledElement","styled","withConfig","shouldForwardProp","prop","includes","type","delay","direction","fillMode","keyframes","getKeyframes","css","Animate","forwardRef","tagName","Tag","children","className","props","ref","resolved","durationVal","_jsx","as","Animate$1","AnimateHost","wait","ms","Promise","r","setTimeout","nextFrame","requestAnimationFrame","AnimateSequence","constructor","this","chain","variant","currentVariant","options","then","parallel","steps","waitAfter","tasks","fn","all","useAnimate","useRef","useCallback","play","reset","sequence","defaults","makeParams","blink","Cursor","span","cursorColor","MAP","useTypingAnimate","text","speed","loop","output","setOutput","useState","index","setIndex","done","setDone","useEffect","length","t","clearTimeout","s","i","isDone","DEFAULT","idle","loading","success","error","warning","bounceDurations","shakeDurations","fadeDurations","typingDurations","defaultEnterDuration","defaultExitDuration","defaultAttentionDuration","defaultLoopDuration","stagger","visibleCount","setVisibleCount","items","Children","toArray","timer","setInterval","clearInterval","child","isValidElement","cloneElement","when","value","anim","animApi","prev","shouldPlay","undefined","Array","isArray","seq","forEach","node","childRef","show","enter","exit","mounted","setMounted","exitDuration","heading","dataText","typingSpeed","deletingSpeed","pauseTime","setText","isDeleting","setIsDeleting","loopNum","setLoopNum","texts","useMemo","every","c","timerRef","fullText","nextText","substring","doneTyping","doneDeleting","window","v","_jsxs","jsxs","_Fragment","Fragment","jsx","instant","fast","normal","slow","dramatic","animName","initial","recipe","config","api","resolver","createRecipe","change","bind","onFocus","focus","onBlur","blur","onMouseEnter","onMouseLeave","leave","visibleDuration","pool","Math","floor","random","list","intensity","lastRef","next","autoReset","resetDelay","state","totalWeight","reduce","p","max","weight","item"],"mappings":"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"}
|