sparkfx 1.2.0 → 1.2.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.
Files changed (41) hide show
  1. package/README.md +75 -100
  2. package/dist/{chunk-H7FVY7R6.cjs → chunk-3AVUTKJ5.cjs} +27 -22
  3. package/dist/{chunk-H7FVY7R6.cjs.map → chunk-3AVUTKJ5.cjs.map} +1 -1
  4. package/dist/chunk-FPJZKZGF.js +3 -0
  5. package/dist/chunk-FPJZKZGF.js.map +1 -0
  6. package/dist/{chunk-FLYBCRQ3.cjs → chunk-GHLFOSXQ.cjs} +3 -3
  7. package/dist/{chunk-FLYBCRQ3.cjs.map → chunk-GHLFOSXQ.cjs.map} +1 -1
  8. package/dist/chunk-HB6NE443.cjs +3 -0
  9. package/dist/chunk-HB6NE443.cjs.map +1 -0
  10. package/dist/{chunk-N3KVAA7Q.js → chunk-LPB7JTCR.js} +3 -3
  11. package/dist/{chunk-N3KVAA7Q.js.map → chunk-LPB7JTCR.js.map} +1 -1
  12. package/dist/{chunk-RXGLQFPT.js → chunk-SJKJ2GZW.js} +27 -22
  13. package/dist/{chunk-RXGLQFPT.js.map → chunk-SJKJ2GZW.js.map} +1 -1
  14. package/dist/event-bus-C4Rbf5un.d.cts +148 -0
  15. package/dist/event-bus-C4Rbf5un.d.ts +148 -0
  16. package/dist/headless.cjs +1 -1
  17. package/dist/headless.js +1 -1
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.d.cts +10 -2
  20. package/dist/index.d.ts +10 -2
  21. package/dist/index.js +1 -1
  22. package/dist/next.cjs +2 -2
  23. package/dist/next.js +1 -1
  24. package/dist/react.cjs +1 -1
  25. package/dist/react.js +1 -1
  26. package/dist/shadcn.cjs +2 -2
  27. package/dist/shadcn.js +1 -1
  28. package/dist/svelte.cjs +2 -2
  29. package/dist/svelte.js +1 -1
  30. package/dist/tailwind.cjs +1 -1
  31. package/dist/tailwind.js +1 -1
  32. package/dist/testing.cjs +3 -0
  33. package/dist/testing.cjs.map +1 -0
  34. package/dist/testing.d.cts +197 -0
  35. package/dist/testing.d.ts +197 -0
  36. package/dist/testing.js +3 -0
  37. package/dist/testing.js.map +1 -0
  38. package/dist/vue.cjs +2 -2
  39. package/dist/vue.js +1 -1
  40. package/package.json +24 -4
  41. package/scripts/postinstall.js +94 -29
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/styles.ts","../src/core/config.ts","../src/core/presets.ts","../src/core/utils.ts","../src/core/a11y.ts","../src/api/combine.ts","../src/api/sequence.ts","../src/api/stagger.ts","../src/core/engine.ts","../src/effects/basic/bounce.ts","../src/effects/basic/pulse.ts","../src/effects/basic/lift.ts","../src/effects/basic/scale.ts","../src/effects/basic/shake.ts","../src/effects/basic/fade.ts","../src/effects/basic/slide.ts","../src/effects/basic/rotate.ts","../src/effects/premium/glow.ts","../src/effects/premium/ripple.ts","../src/effects/premium/magnetic.ts","../src/effects/premium/tilt.ts","../src/effects/premium/elastic.ts","../src/effects/premium/jelly.ts","../src/effects/premium/rubber.ts","../src/effects/premium/morph.ts","../src/effects/visual/glitch.ts","../src/effects/visual/blur.ts","../src/effects/visual/neon.ts","../src/effects/visual/glass.ts","../src/effects/visual/shimmer.ts","../src/effects/visual/gradient.ts","../src/effects/visual/spotlight.ts","../src/effects/visual/hologram.ts","../src/effects/visual/aurora.ts","../src/effects/visual/matrix.ts","../src/effects/visual/rainbow.ts","../src/effects/motion/parallax.ts","../src/effects/motion/float.ts","../src/effects/motion/flip3d.ts","../src/effects/motion/swing.ts","../src/effects/motion/orbit.ts","../src/effects/scroll/reveal.ts","../src/effects/scroll/counter.ts","../src/effects/celebration/confetti.ts","../src/effects/celebration/sparkle.ts","../src/effects/celebration/firework.ts","../src/effects/celebration/celebrate.ts","../src/effects/text/typewriter.ts","../src/effects/text/scramble.ts","../src/effects/text/wave.ts","../src/effects/text/highlight.ts","../src/index.ts"],"names":["SPARK_STYLE_ID","stylesInjected","injectedAnimations","baseStyles","injectBaseStyles","style","injectAnimation","name","keyframes","styleEl","generateCSSVars","options","vars","getEasingValue","easing","prefersReducedMotion","DEFAULT_CONFIG","ConfigManager","oldConfig","key","listener","base","updates","merged","frozenConfig","error","prefix","styleId","existing","configManager","config","updateConfig","getConfig","setTheme","theme","onThemeChange","callback","mediaQuery","handler","presetConfigs","getPresetClasses","presetName","effect","getPresetNames","presets","isBrowser","safeQuerySelectorAll","selector","parent","animationCounter","generateAnimationId","id","clamp","value","min","max","mapRange","inMin","inMax","outMin","outMax","random","randomInt","easings","c4","throttle","func","limit","inThrottle","lastFunc","lastRan","args","cachedState","getA11yState","detectScreenReader","clearA11yCache","listeners","onA11yChange","setupMediaQueryListeners","motionQuery","contrastQuery","handleChange","state","shouldReduceMotion","getReducedMotionCSS","alternative","applyReducedMotion","element","css","announcer","getAnnouncer","announce","message","priority","announcerEl","getEffectAnnouncement","effectName","makeFocusable","addKeyboardSupport","keyHandler","event","createFocusTrap","container","previouslyFocused","focusableSelectors","handleKeyDown","focusableElements","firstElement","lastElement","applyA11yAttributes","wrapWithA11y","effectFn","result","isHighContrastMode","getHighContrastColor","color","fallback","combine","effects","classNames","e","mergedStyle","combinedOnMouseEnter","combinedOnMouseLeave","combinedOnMouseMove","combinedOnClick","combinedCleanup","hasMouseEnter","hasMouseLeave","hasMouseMove","hasClick","hasCleanup","sequence","steps","opts","currentStepIndex","playing","loopsCompleted","timeoutId","appliedClasses","cleanupCurrentStep","cls","c","applyStep","step","executeStep","index","play","pause","stagger","elements","timeoutIds","started","getElements","getDelay","total","baseDelay","applyEffect","els","completedCount","delay","defaults","mergeOptions","effectDefaults","shouldAnimate","createSimpleEffectResult","props","applyIntensity","intensity","idCounter","generateId","sanitizeColor","cleaned","validateNumber","randomItem","array","defaultOptions","bounce","bounceHeight","animationName","upPercent","currentHeight","cssVars","clsx","pulse","scaleValue","iterationCount","lift","distance","shadowValue","target","scale","shake","fade","targetOpacity","slide","getTransform","rotate","angle","directionMultiplier","glow","safeColor","safeSpread","spread","glowShadow","ripple","rect","size","rippleEl","magnetic","centerX","centerY","relX","relY","moveX","moveY","tilt","x","y","rotateY","rotateX","injectElasticStyles","elastic","trigger","injectJellyStyles","jelly","rubber","morph","glitch","blur","baseStyle","activate","deactivate","neon","glass","shimmer","injectGradientStyles","gradient","gradientValue","spotlight","injectHologramStyles","hologram","scanlineElement","AURORA_DEFAULTS","aurora","animationId","buildAuroraKeyframes","className","injectAuroraStyles","movement","effectStyles","MATRIX_DEFAULTS","CHARSETS","matrix","injectMatrixStyles","canvas","ctx","animationFrame","columns","initialized","getCharset","initCanvas","resizeCanvas","startAnimation","numColumns","draw","charset","i","char","speed","lastTime","animate","time","stopAnimation","RAINBOW_DEFAULTS","rainbow","buildRainbowKeyframes","injectRainbowStyles","saturation","lightness","type","colors","percent","getColorProperty","rainbowGradient","typeStyles","stylesheet","PARALLAX_DEFAULTS","parallax","stateMap","injectParallaxStyles","handleScroll","windowHeight","el","elementCenter","viewportCenter","progress","clampedProgress","direction","offset","animateParallax","handleMouseMove","clientX","clientY","windowWidth","normalizedX","normalizedY","offsetX","offsetY","ease","threshold","cleanup","FLOAT_DEFAULTS","float","buildFloatKeyframes","injectFloatStyles","rotateAngle","scaleAmount","transform0","transform50","transform100","scaleUp","FLIP3D_DEFAULTS","flip3d","injectFlip3DStyles","isFlipped","onClick","rotateAxis","shadowStyle","SWING_DEFAULTS","swing","buildSwingKeyframes","injectSwingStyles","damping","animationPlayState","ORBIT_DEFAULTS","orbit","buildOrbitKeyframes","injectOrbitStyles","radius","startAngle","ellipse","tiltAngle","scaleVariation","radiusY","dir","keyframesStr","transform","REVEAL_DEFAULTS","observedElements","reveal","injectRevealStyles","setup","observer","entries","entry","animation","duration","hiddenTransform","hiddenOpacity","COUNTER_DEFAULTS","counterStates","counter","reducedMotion","formatNumber","fixed","intPart","decPart","withSeparator","formatted","animateCounter","startTime","easingFn","currentTime","elapsed","easedProgress","currentValue","confetti","createParticles","count","particle","velocity","createSparkle","sparkle","injectSparkleStyles","triggerSparkles","createParticle","endX","endY","injectFireworkStyles","firework","triggerFirework","angleStep","celebrate","confettiResult","sparkleResult","injectTypewriterStyles","typewriter","isTyping","originalText","cursorEl","startTyping","CHARS","scramble","interval","startScramble","iteration","injectWaveStyles","wave","isAnimating","originalHTML","startWave","text","span","totalDuration","injectHighlightStyles","highlight","spark","src_default"],"mappings":"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","file":"chunk-H7FVY7R6.cjs","sourcesContent":["/**\r\n * sparkfx - Premium micro-interactions System\r\n * Handles dynamic CSS injection for effects\r\n */\r\n\r\nconst SPARK_STYLE_ID = 'sparkfx-styles'\r\n\r\nlet stylesInjected = false\r\nconst injectedAnimations = new Set<string>()\r\n\r\n/**\r\n * Base CSS that's always injected\r\n */\r\nconst baseStyles = `\r\n/* @lynch/spark base styles */\r\n.spark-effect {\r\n transition-property: transform, box-shadow, filter, opacity;\r\n transition-timing-function: var(--spark-easing, ease-out);\r\n transition-duration: var(--spark-duration, 300ms);\r\n will-change: transform;\r\n}\r\n\r\n.spark-reduced-motion {\r\n transition: none !important;\r\n animation: none !important;\r\n}\r\n\r\n/* Ripple container */\r\n.spark-ripple-container {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-ripple {\r\n position: absolute;\r\n border-radius: 50%;\r\n transform: scale(0);\r\n animation: spark-ripple-animation 0.6s linear;\r\n pointer-events: none;\r\n}\r\n\r\n@keyframes spark-ripple-animation {\r\n to {\r\n transform: scale(4);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* Confetti */\r\n.spark-confetti-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 9999;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-confetti-particle {\r\n position: absolute;\r\n width: 10px;\r\n height: 10px;\r\n animation: spark-confetti-fall var(--spark-duration, 3s) ease-out forwards;\r\n}\r\n\r\n@keyframes spark-confetti-fall {\r\n 0% {\r\n transform: translateY(0) rotate(0deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateY(100vh) rotate(720deg);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* Shimmer */\r\n.spark-shimmer {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-shimmer::after {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: -100%;\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(\r\n 90deg,\r\n transparent,\r\n rgba(255, 255, 255, 0.3),\r\n transparent\r\n );\r\n animation: spark-shimmer-move var(--spark-duration, 1.5s) infinite;\r\n}\r\n\r\n@keyframes spark-shimmer-move {\r\n to {\r\n left: 100%;\r\n }\r\n}\r\n\r\n/* Glitch */\r\n.spark-glitch {\r\n position: relative;\r\n}\r\n\r\n.spark-glitch::before,\r\n.spark-glitch::after {\r\n content: attr(data-text);\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n}\r\n\r\n.spark-glitch:hover::before,\r\n.spark-glitch:hover::after {\r\n opacity: 0.8;\r\n}\r\n\r\n.spark-glitch:hover::before {\r\n color: var(--spark-glitch-color1, #ff0000);\r\n animation: spark-glitch-1 0.3s infinite;\r\n}\r\n\r\n.spark-glitch:hover::after {\r\n color: var(--spark-glitch-color2, #00ffff);\r\n animation: spark-glitch-2 0.3s infinite;\r\n}\r\n\r\n@keyframes spark-glitch-1 {\r\n 0%, 100% { clip-path: inset(0 0 90% 0); transform: translateX(-2px); }\r\n 25% { clip-path: inset(10% 0 60% 0); transform: translateX(2px); }\r\n 50% { clip-path: inset(40% 0 30% 0); transform: translateX(-2px); }\r\n 75% { clip-path: inset(70% 0 10% 0); transform: translateX(2px); }\r\n}\r\n\r\n@keyframes spark-glitch-2 {\r\n 0%, 100% { clip-path: inset(80% 0 0 0); transform: translateX(2px); }\r\n 25% { clip-path: inset(50% 0 20% 0); transform: translateX(-2px); }\r\n 50% { clip-path: inset(20% 0 50% 0); transform: translateX(2px); }\r\n 75% { clip-path: inset(0 0 70% 0); transform: translateX(-2px); }\r\n}\r\n\r\n/* Neon glow */\r\n.spark-neon {\r\n text-shadow:\r\n 0 0 5px var(--spark-neon-color, #fff),\r\n 0 0 10px var(--spark-neon-color, #fff),\r\n 0 0 20px var(--spark-neon-color, #fff),\r\n 0 0 40px var(--spark-neon-color, #0ff),\r\n 0 0 80px var(--spark-neon-color, #0ff);\r\n}\r\n\r\n/* Hologram */\r\n.spark-hologram {\r\n background: linear-gradient(\r\n 45deg,\r\n rgba(255, 0, 128, 0.3),\r\n rgba(0, 255, 255, 0.3),\r\n rgba(255, 255, 0, 0.3)\r\n );\r\n background-size: 400% 400%;\r\n animation: spark-hologram-shift 3s ease infinite;\r\n -webkit-background-clip: text;\r\n background-clip: text;\r\n}\r\n\r\n@keyframes spark-hologram-shift {\r\n 0% { background-position: 0% 50%; }\r\n 50% { background-position: 100% 50%; }\r\n 100% { background-position: 0% 50%; }\r\n}\r\n\r\n/* Glass */\r\n.spark-glass {\r\n backdrop-filter: blur(10px);\r\n background: rgba(255, 255, 255, 0.1);\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n/* Typewriter cursor */\r\n.spark-typewriter-cursor {\r\n animation: spark-cursor-blink 0.7s infinite;\r\n}\r\n\r\n@keyframes spark-cursor-blink {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0; }\r\n}\r\n`\r\n\r\n/**\r\n * Inject base styles into the document\r\n */\r\nexport function injectBaseStyles(): void {\r\n if (typeof document === 'undefined' || stylesInjected) return\r\n\r\n const style = document.createElement('style')\r\n style.id = SPARK_STYLE_ID\r\n style.textContent = baseStyles\r\n document.head.appendChild(style)\r\n stylesInjected = true\r\n}\r\n\r\n/**\r\n * Inject a custom animation keyframes\r\n */\r\nexport function injectAnimation(name: string, keyframes: string): void {\r\n if (typeof document === 'undefined') return\r\n if (injectedAnimations.has(name)) return\r\n\r\n injectBaseStyles()\r\n\r\n const styleEl = document.getElementById(SPARK_STYLE_ID)\r\n if (styleEl) {\r\n styleEl.textContent += `\\n@keyframes ${name} { ${keyframes} }`\r\n injectedAnimations.add(name)\r\n }\r\n}\r\n\r\n/**\r\n * Generate CSS custom properties for an element\r\n */\r\nexport function generateCSSVars(options: {\r\n duration?: number\r\n easing?: string\r\n intensity?: number\r\n}): Record<string, string> {\r\n const vars: Record<string, string> = {}\r\n\r\n if (options.duration !== undefined) {\r\n vars['--spark-duration'] = `${options.duration}ms`\r\n }\r\n if (options.easing !== undefined) {\r\n vars['--spark-easing'] = getEasingValue(options.easing)\r\n }\r\n if (options.intensity !== undefined) {\r\n vars['--spark-intensity'] = String(options.intensity)\r\n }\r\n\r\n return vars\r\n}\r\n\r\n/**\r\n * Convert easing name to CSS value\r\n */\r\nexport function getEasingValue(easing: string): string {\r\n const easings: Record<string, string> = {\r\n linear: 'linear',\r\n ease: 'ease',\r\n 'ease-in': 'ease-in',\r\n 'ease-out': 'ease-out',\r\n 'ease-in-out': 'ease-in-out',\r\n spring: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\r\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n elastic: 'cubic-bezier(0.68, -0.6, 0.32, 1.6)',\r\n }\r\n return easings[easing] ?? easing\r\n}\r\n\r\n/**\r\n * Check if user prefers reduced motion\r\n */\r\nexport function prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n}\r\n","/**\r\n * sparkfx Configuration System\r\n * Global configuration management with type safety\r\n * \r\n * @module core/config\r\n * @version 1.2.0\r\n */\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkConfig {\r\n /** Enable GPU acceleration for animations (default: true) */\r\n gpuAcceleration: boolean\r\n \r\n /** Respect prefers-reduced-motion setting (default: true) */\r\n respectMotionPreference: boolean\r\n \r\n /** Enable lazy loading with Intersection Observer (default: true) */\r\n lazyLoad: boolean\r\n \r\n /** Automatically cleanup effects on element removal (default: true) */\r\n cleanupOnUnmount: boolean\r\n \r\n /** Default animation duration in ms (default: 300) */\r\n defaultDuration: number\r\n \r\n /** Default easing function (default: 'ease-out') */\r\n defaultEasing: string\r\n \r\n /** Enable debug logging (default: false) */\r\n debug: boolean\r\n \r\n /** Theme mode: 'auto' | 'light' | 'dark' (default: 'auto') */\r\n theme: 'auto' | 'light' | 'dark'\r\n \r\n /** Enable accessibility features (default: true) */\r\n a11y: boolean\r\n \r\n /** Custom CSS variable prefix (default: 'spark') */\r\n cssPrefix: string\r\n}\r\n\r\nexport type PartialSparkConfig = Partial<SparkConfig>\r\n\r\n// ============================================================================\r\n// DEFAULT CONFIGURATION\r\n// ============================================================================\r\n\r\nconst DEFAULT_CONFIG: SparkConfig = {\r\n gpuAcceleration: true,\r\n respectMotionPreference: true,\r\n lazyLoad: true,\r\n cleanupOnUnmount: true,\r\n defaultDuration: 300,\r\n defaultEasing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n debug: false,\r\n theme: 'auto',\r\n a11y: true,\r\n cssPrefix: 'spark',\r\n}\r\n\r\n// ============================================================================\r\n// CONFIGURATION MANAGER\r\n// ============================================================================\r\n\r\nclass ConfigManager {\r\n private config: SparkConfig\r\n private listeners: Set<(config: SparkConfig) => void> = new Set()\r\n private initialized = false\r\n\r\n constructor() {\r\n this.config = { ...DEFAULT_CONFIG }\r\n }\r\n\r\n /**\r\n * Initialize configuration with custom options\r\n */\r\n init(options: PartialSparkConfig = {}): void {\r\n if (this.initialized && this.config.debug) {\r\n console.warn('[sparkfx] Config already initialized. Use update() to modify.')\r\n }\r\n \r\n this.config = this.mergeConfig(DEFAULT_CONFIG, options)\r\n this.initialized = true\r\n this.injectCSSVariables()\r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config initialized:', this.config)\r\n }\r\n }\r\n\r\n /**\r\n * Update configuration (partial update supported)\r\n */\r\n update(options: PartialSparkConfig): void {\r\n const oldConfig = { ...this.config }\r\n this.config = this.mergeConfig(this.config, options)\r\n \r\n // Re-inject CSS variables if relevant options changed\r\n if (\r\n oldConfig.cssPrefix !== this.config.cssPrefix ||\r\n oldConfig.defaultDuration !== this.config.defaultDuration ||\r\n oldConfig.defaultEasing !== this.config.defaultEasing\r\n ) {\r\n this.injectCSSVariables()\r\n }\r\n \r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config updated:', this.config)\r\n }\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n get(): Readonly<SparkConfig> {\r\n return Object.freeze({ ...this.config })\r\n }\r\n\r\n /**\r\n * Get a specific config value\r\n */\r\n getValue<K extends keyof SparkConfig>(key: K): SparkConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * Reset configuration to defaults\r\n */\r\n reset(): void {\r\n this.config = { ...DEFAULT_CONFIG }\r\n this.injectCSSVariables()\r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config reset to defaults')\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to configuration changes\r\n */\r\n onChange(listener: (config: SparkConfig) => void): () => void {\r\n this.listeners.add(listener)\r\n return () => this.listeners.delete(listener)\r\n }\r\n\r\n /**\r\n * Check if user prefers reduced motion\r\n */\r\n prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n }\r\n\r\n /**\r\n * Get current theme based on config and system preference\r\n */\r\n getCurrentTheme(): 'light' | 'dark' {\r\n if (this.config.theme !== 'auto') {\r\n return this.config.theme\r\n }\r\n \r\n if (typeof window === 'undefined') return 'dark'\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\r\n }\r\n\r\n /**\r\n * Check if animations should run\r\n */\r\n shouldAnimate(): boolean {\r\n if (this.config.respectMotionPreference && this.prefersReducedMotion()) {\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n // ========================================================================\r\n // PRIVATE METHODS\r\n // ========================================================================\r\n\r\n private mergeConfig(base: SparkConfig, updates: PartialSparkConfig): SparkConfig {\r\n const merged = { ...base }\r\n \r\n for (const key of Object.keys(updates) as (keyof SparkConfig)[]) {\r\n if (updates[key] !== undefined) {\r\n (merged as Record<string, unknown>)[key] = updates[key]\r\n }\r\n }\r\n \r\n return merged\r\n }\r\n\r\n private notifyListeners(): void {\r\n const frozenConfig = this.get()\r\n this.listeners.forEach(listener => {\r\n try {\r\n listener(frozenConfig)\r\n } catch (error) {\r\n if (this.config.debug) {\r\n console.error('[sparkfx] Config listener error:', error)\r\n }\r\n }\r\n })\r\n }\r\n\r\n private injectCSSVariables(): void {\r\n if (typeof document === 'undefined') return\r\n\r\n const prefix = this.config.cssPrefix\r\n const styleId = `${prefix}-config-vars`\r\n \r\n // Remove existing style element\r\n const existing = document.getElementById(styleId)\r\n if (existing) {\r\n existing.remove()\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n:root {\r\n --${prefix}-primary: #00ffa3;\r\n --${prefix}-secondary: #00d4ff;\r\n --${prefix}-accent: #a855f7;\r\n --${prefix}-pink: #ff6b9d;\r\n \r\n --${prefix}-duration-fast: 150ms;\r\n --${prefix}-duration-base: ${this.config.defaultDuration}ms;\r\n --${prefix}-duration-slow: 500ms;\r\n \r\n --${prefix}-easing-smooth: ${this.config.defaultEasing};\r\n --${prefix}-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n --${prefix}-easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);\r\n --${prefix}-easing-spring: cubic-bezier(0.5, 1.5, 0.5, 1);\r\n}\r\n`\r\n document.head.appendChild(style)\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SINGLETON EXPORT\r\n// ============================================================================\r\n\r\nexport const configManager = new ConfigManager()\r\n\r\n/**\r\n * Configure sparkfx globally\r\n * \r\n * @example\r\n * import { config } from 'sparkfx'\r\n * \r\n * config({\r\n * defaultDuration: 400,\r\n * theme: 'dark',\r\n * debug: true\r\n * })\r\n */\r\nexport function config(options: PartialSparkConfig): void {\r\n configManager.init(options)\r\n}\r\n\r\n/**\r\n * Update sparkfx configuration\r\n */\r\nexport function updateConfig(options: PartialSparkConfig): void {\r\n configManager.update(options)\r\n}\r\n\r\n/**\r\n * Get current configuration\r\n */\r\nexport function getConfig(): Readonly<SparkConfig> {\r\n return configManager.get()\r\n}\r\n\r\n/**\r\n * Set theme mode\r\n */\r\nexport function setTheme(theme: 'auto' | 'light' | 'dark'): void {\r\n configManager.update({ theme })\r\n}\r\n\r\n/**\r\n * Subscribe to theme changes\r\n */\r\nexport function onThemeChange(callback: (theme: 'light' | 'dark') => void): () => void {\r\n if (typeof window === 'undefined') return () => {}\r\n \r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\r\n const handler = () => callback(configManager.getCurrentTheme())\r\n \r\n mediaQuery.addEventListener('change', handler)\r\n return () => mediaQuery.removeEventListener('change', handler)\r\n}\r\n","/**\r\n * sparkfx Presets\r\n * Pre-configured effect combinations for common use cases\r\n * \r\n * @module core/presets\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from './types'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface PresetConfig {\r\n name: string\r\n description: string\r\n effects: string[]\r\n defaultOptions?: Record<string, unknown>\r\n}\r\n\r\nexport interface Preset {\r\n /** Apply all preset effects to an element */\r\n apply: (element: HTMLElement) => void\r\n\r\n /** Get preset effects as an array */\r\n getEffects: () => string[]\r\n\r\n /** Get CSS classes for the preset */\r\n getClasses: () => string\r\n}\r\n\r\n// ============================================================================\r\n// PRESET DEFINITIONS\r\n// ============================================================================\r\n\r\nexport const presetConfigs: Record<string, PresetConfig> = {\r\n gaming: {\r\n name: 'Gaming',\r\n description: 'High-energy effects for gaming interfaces',\r\n effects: ['neon', 'glitch', 'glow', 'shake'],\r\n defaultOptions: {\r\n neon: { color: '#00ff00' },\r\n glow: { color: '#ff00ff', spread: 30 },\r\n },\r\n },\r\n\r\n minimal: {\r\n name: 'Minimal',\r\n description: 'Subtle, professional effects',\r\n effects: ['lift', 'fade', 'scale'],\r\n defaultOptions: {\r\n lift: { distance: 4 },\r\n scale: { factor: 1.02 },\r\n },\r\n },\r\n\r\n playful: {\r\n name: 'Playful',\r\n description: 'Fun and bouncy effects for engaging UIs',\r\n effects: ['bounce', 'jelly', 'elastic', 'confetti'],\r\n defaultOptions: {\r\n bounce: { height: 12 },\r\n jelly: { intensity: 0.8 },\r\n },\r\n },\r\n\r\n corporate: {\r\n name: 'Corporate',\r\n description: 'Professional and clean effects',\r\n effects: ['lift', 'glass', 'fade'],\r\n defaultOptions: {\r\n lift: { distance: 2, shadow: true },\r\n glass: { blur: 10 },\r\n },\r\n },\r\n\r\n retro: {\r\n name: 'Retro',\r\n description: 'Nostalgic 80s/90s style effects',\r\n effects: ['glitch', 'neon', 'shimmer'],\r\n defaultOptions: {\r\n neon: { color: '#ff0080' },\r\n glitch: { intensity: 0.5 },\r\n },\r\n },\r\n\r\n futuristic: {\r\n name: 'Futuristic',\r\n description: 'Sci-fi inspired holographic effects',\r\n effects: ['hologram', 'aurora', 'glass', 'glow'],\r\n defaultOptions: {\r\n hologram: { opacity: 0.8 },\r\n aurora: { colors: ['#00ffa3', '#00d4ff', '#a855f7'] },\r\n },\r\n },\r\n\r\n elegant: {\r\n name: 'Elegant',\r\n description: 'Sophisticated and luxurious effects',\r\n effects: ['shimmer', 'glow', 'lift', 'glass'],\r\n defaultOptions: {\r\n shimmer: { color: 'rgba(255, 215, 0, 0.3)' },\r\n glow: { color: '#ffd700', spread: 20 },\r\n },\r\n },\r\n\r\n dark: {\r\n name: 'Dark Mode',\r\n description: 'Effects optimized for dark themes',\r\n effects: ['glow', 'neon', 'glass', 'aurora'],\r\n defaultOptions: {\r\n glow: { color: '#00ffa3' },\r\n glass: { blur: 20, opacity: 0.1 },\r\n },\r\n },\r\n}\r\n\r\n// ============================================================================\r\n// PRESET CLASSES\r\n// ============================================================================\r\n\r\n/**\r\n * Generate CSS classes for a preset\r\n */\r\nexport function getPresetClasses(presetName: string): string {\r\n const config = presetConfigs[presetName]\r\n if (!config) return ''\r\n\r\n return config.effects.map(effect => `spark-${effect}`).join(' ')\r\n}\r\n\r\n/**\r\n * Get all available preset names\r\n */\r\nexport function getPresetNames(): string[] {\r\n return Object.keys(presetConfigs)\r\n}\r\n\r\n/**\r\n * Get preset configuration\r\n */\r\nexport function getPresetConfig(name: string): PresetConfig | undefined {\r\n return presetConfigs[name]\r\n}\r\n\r\n// ============================================================================\r\n// PRESET OBJECT\r\n// ============================================================================\r\n\r\nexport const presets = {\r\n gaming: {\r\n name: 'Gaming',\r\n classes: 'spark-neon spark-glitch spark-glow',\r\n },\r\n minimal: {\r\n name: 'Minimal',\r\n classes: 'spark-lift spark-fade spark-scale',\r\n },\r\n playful: {\r\n name: 'Playful',\r\n classes: 'spark-bounce spark-jelly spark-elastic',\r\n },\r\n corporate: {\r\n name: 'Corporate',\r\n classes: 'spark-lift spark-glass spark-fade',\r\n },\r\n retro: {\r\n name: 'Retro',\r\n classes: 'spark-glitch spark-neon spark-shimmer',\r\n },\r\n futuristic: {\r\n name: 'Futuristic',\r\n classes: 'spark-hologram spark-aurora spark-glass spark-glow',\r\n },\r\n elegant: {\r\n name: 'Elegant',\r\n classes: 'spark-shimmer spark-glow spark-lift spark-glass',\r\n },\r\n dark: {\r\n name: 'Dark',\r\n classes: 'spark-glow spark-neon spark-glass spark-aurora',\r\n },\r\n} as const\r\n\r\nexport type PresetName = keyof typeof presets\r\n\r\nexport default presets\r\n","/**\r\n * sparkfx Utility Functions\r\n * Helper functions for effects, animations, and DOM operations\r\n * \r\n * @module core/utils\r\n * @version 1.2.0\r\n */\r\n\r\nimport { configManager } from './config'\r\n\r\n// ============================================================================\r\n// TYPE DEFINITIONS\r\n// ============================================================================\r\n\r\nexport interface AnimationOptions {\r\n duration?: number\r\n easing?: string\r\n delay?: number\r\n fill?: FillMode\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport interface Rect {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n}\r\n\r\n// ============================================================================\r\n// DOM UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Check if code is running in browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined'\r\n}\r\n\r\n/**\r\n * Safely query DOM element\r\n */\r\nexport function safeQuerySelector<T extends Element = Element>(\r\n selector: string,\r\n parent: ParentNode = document\r\n): T | null {\r\n if (!isBrowser()) return null\r\n try {\r\n return parent.querySelector<T>(selector)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Safely query all DOM elements\r\n */\r\nexport function safeQuerySelectorAll<T extends Element = Element>(\r\n selector: string,\r\n parent: ParentNode = document\r\n): T[] {\r\n if (!isBrowser()) return []\r\n try {\r\n return Array.from(parent.querySelectorAll<T>(selector))\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Get element's bounding rect with scroll offset\r\n */\r\nexport function getElementRect(element: Element): Rect {\r\n const rect = element.getBoundingClientRect()\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\r\n\r\n return {\r\n top: rect.top + scrollTop,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n height: rect.height,\r\n }\r\n}\r\n\r\n/**\r\n * Get element center point\r\n */\r\nexport function getElementCenter(element: Element): Point {\r\n const rect = element.getBoundingClientRect()\r\n return {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n }\r\n}\r\n\r\n/**\r\n * Check if element is in viewport\r\n */\r\nexport function isInViewport(element: Element, threshold = 0): boolean {\r\n if (!isBrowser()) return false\r\n\r\n const rect = element.getBoundingClientRect()\r\n const windowHeight = window.innerHeight || document.documentElement.clientHeight\r\n const windowWidth = window.innerWidth || document.documentElement.clientWidth\r\n\r\n const vertInView = (rect.top <= windowHeight * (1 - threshold)) &&\r\n ((rect.top + rect.height) >= windowHeight * threshold)\r\n const horInView = (rect.left <= windowWidth * (1 - threshold)) &&\r\n ((rect.left + rect.width) >= windowWidth * threshold)\r\n\r\n return vertInView && horInView\r\n}\r\n\r\n// ============================================================================\r\n// ANIMATION UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Generate unique animation ID\r\n */\r\nlet animationCounter = 0\r\nexport function generateAnimationId(prefix = 'spark'): string {\r\n return `${prefix}-${Date.now().toString(36)}-${(animationCounter++).toString(36)}`\r\n}\r\n\r\n/**\r\n * Create CSS keyframes and inject into document\r\n */\r\nexport function injectKeyframes(name: string, keyframes: string): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-keyframes-${name}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `@keyframes ${name} { ${keyframes} }`\r\n document.head.appendChild(style)\r\n}\r\n\r\n/**\r\n * Remove injected keyframes\r\n */\r\nexport function removeKeyframes(name: string): void {\r\n if (!isBrowser()) return\r\n\r\n const style = document.getElementById(`spark-keyframes-${name}`)\r\n if (style) {\r\n style.remove()\r\n }\r\n}\r\n\r\n/**\r\n * Apply GPU-accelerated transform\r\n */\r\nexport function applyTransform(\r\n element: HTMLElement,\r\n transform: string,\r\n options: AnimationOptions = {}\r\n): void {\r\n const config = configManager.get()\r\n const duration = options.duration ?? config.defaultDuration\r\n const easing = options.easing ?? config.defaultEasing\r\n\r\n if (config.gpuAcceleration) {\r\n element.style.willChange = 'transform'\r\n }\r\n\r\n element.style.transition = `transform ${duration}ms ${easing}`\r\n element.style.transform = transform\r\n}\r\n\r\n/**\r\n * Reset transform\r\n */\r\nexport function resetTransform(element: HTMLElement): void {\r\n element.style.transform = ''\r\n element.style.willChange = ''\r\n element.style.transition = ''\r\n}\r\n\r\n/**\r\n * Request animation frame with fallback\r\n */\r\nexport const raf = isBrowser()\r\n ? window.requestAnimationFrame.bind(window)\r\n : (callback: FrameRequestCallback) => setTimeout(callback, 16)\r\n\r\n/**\r\n * Cancel animation frame with fallback\r\n */\r\nexport const cancelRaf = isBrowser()\r\n ? window.cancelAnimationFrame.bind(window)\r\n : (id: number) => clearTimeout(id)\r\n\r\n// ============================================================================\r\n// MATH UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Clamp number between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, factor: number): number {\r\n return start + (end - start) * factor\r\n}\r\n\r\n/**\r\n * Map value from one range to another\r\n */\r\nexport function mapRange(\r\n value: number,\r\n inMin: number,\r\n inMax: number,\r\n outMin: number,\r\n outMax: number\r\n): number {\r\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\r\n}\r\n\r\n/**\r\n * Calculate distance between two points\r\n */\r\nexport function distance(p1: Point, p2: Point): number {\r\n const dx = p2.x - p1.x\r\n const dy = p2.y - p1.y\r\n return Math.sqrt(dx * dx + dy * dy)\r\n}\r\n\r\n/**\r\n * Calculate angle between two points (in radians)\r\n */\r\nexport function angle(p1: Point, p2: Point): number {\r\n return Math.atan2(p2.y - p1.y, p2.x - p1.x)\r\n}\r\n\r\n/**\r\n * Convert degrees to radians\r\n */\r\nexport function degToRad(degrees: number): number {\r\n return degrees * (Math.PI / 180)\r\n}\r\n\r\n/**\r\n * Convert radians to degrees\r\n */\r\nexport function radToDeg(radians: number): number {\r\n return radians * (180 / Math.PI)\r\n}\r\n\r\n/**\r\n * Generate random number between min and max\r\n */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\n/**\r\n * Generate random integer between min and max (inclusive)\r\n */\r\nexport function randomInt(min: number, max: number): number {\r\n return Math.floor(random(min, max + 1))\r\n}\r\n\r\n// ============================================================================\r\n// COLOR UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Parse color string to RGB values\r\n */\r\nexport function parseColor(color: string): { r: number; g: number; b: number } | null {\r\n if (!isBrowser()) return null\r\n\r\n // Use canvas to parse color\r\n const canvas = document.createElement('canvas')\r\n canvas.width = canvas.height = 1\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n\r\n ctx.fillStyle = color\r\n ctx.fillRect(0, 0, 1, 1)\r\n const data = ctx.getImageData(0, 0, 1, 1).data\r\n\r\n return { r: data[0], g: data[1], b: data[2] }\r\n}\r\n\r\n/**\r\n * Convert RGB to hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (n: number) => {\r\n const hex = clamp(Math.round(n), 0, 255).toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\r\n}\r\n\r\n/**\r\n * Adjust color brightness\r\n */\r\nexport function adjustBrightness(color: string, amount: number): string {\r\n const rgb = parseColor(color)\r\n if (!rgb) return color\r\n\r\n return rgbToHex(\r\n rgb.r + amount,\r\n rgb.g + amount,\r\n rgb.b + amount\r\n )\r\n}\r\n\r\n/**\r\n * Create color with alpha\r\n */\r\nexport function colorWithAlpha(color: string, alpha: number): string {\r\n const rgb = parseColor(color)\r\n if (!rgb) return color\r\n\r\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clamp(alpha, 0, 1)})`\r\n}\r\n\r\n// ============================================================================\r\n// VALIDATION UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Validate and sanitize number\r\n */\r\nexport function validateNumber(\r\n value: unknown,\r\n min: number,\r\n max: number,\r\n fallback: number\r\n): number {\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n return fallback\r\n }\r\n return clamp(value, min, max)\r\n}\r\n\r\n/**\r\n * Validate and sanitize string\r\n */\r\nexport function validateString(value: unknown, fallback: string): string {\r\n if (typeof value !== 'string') {\r\n return fallback\r\n }\r\n return value.trim()\r\n}\r\n\r\n/**\r\n * Sanitize CSS color value (prevent XSS)\r\n */\r\nexport function sanitizeColor(color: unknown, fallback: string): string {\r\n if (typeof color !== 'string') return fallback\r\n\r\n // Allow hex, rgb, rgba, hsl, hsla, and named colors\r\n const sanitized = color.replace(/[^a-zA-Z0-9#(),.\\s%-]/g, '')\r\n\r\n // Validate format\r\n const validPatterns = [\r\n /^#[0-9a-fA-F]{3,8}$/, // Hex\r\n /^rgb\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)$/, // RGB\r\n /^rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*[\\d.]+\\s*\\)$/, // RGBA\r\n /^hsl\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%\\s*\\)$/, // HSL\r\n /^hsla\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+\\s*\\)$/, // HSLA\r\n /^[a-zA-Z]+$/, // Named colors\r\n ]\r\n\r\n const isValid = validPatterns.some(pattern => pattern.test(sanitized))\r\n return isValid ? sanitized : fallback\r\n}\r\n\r\n// ============================================================================\r\n// EASING FUNCTIONS\r\n// ============================================================================\r\n\r\nexport const easings = {\r\n linear: (t: number) => t,\r\n easeInQuad: (t: number) => t * t,\r\n easeOutQuad: (t: number) => t * (2 - t),\r\n easeInOutQuad: (t: number) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t,\r\n easeInCubic: (t: number) => t * t * t,\r\n easeOutCubic: (t: number) => (--t) * t * t + 1,\r\n easeInOutCubic: (t: number) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\r\n easeInQuart: (t: number) => t * t * t * t,\r\n easeOutQuart: (t: number) => 1 - (--t) * t * t * t,\r\n easeInOutQuart: (t: number) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t,\r\n easeInElastic: (t: number) => {\r\n const c4 = (2 * Math.PI) / 3\r\n return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4)\r\n },\r\n easeOutElastic: (t: number) => {\r\n const c4 = (2 * Math.PI) / 3\r\n return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\r\n },\r\n easeOutBounce: (t: number) => {\r\n const n1 = 7.5625\r\n const d1 = 2.75\r\n if (t < 1 / d1) return n1 * t * t\r\n if (t < 2 / d1) return n1 * (t -= 1.5 / d1) * t + 0.75\r\n if (t < 2.5 / d1) return n1 * (t -= 2.25 / d1) * t + 0.9375\r\n return n1 * (t -= 2.625 / d1) * t + 0.984375\r\n },\r\n} as const\r\n\r\nexport type EasingName = keyof typeof easings\r\n\r\n// ============================================================================\r\n// DEBOUNCE & THROTTLE\r\n// ============================================================================\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n timeoutId = setTimeout(() => func(...args), wait)\r\n }\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean\r\n let lastFunc: ReturnType<typeof setTimeout>\r\n let lastRan: number\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func(...args)\r\n lastRan = Date.now()\r\n inThrottle = true\r\n } else {\r\n clearTimeout(lastFunc)\r\n lastFunc = setTimeout(() => {\r\n if (Date.now() - lastRan >= limit) {\r\n func(...args)\r\n lastRan = Date.now()\r\n }\r\n }, limit - (Date.now() - lastRan))\r\n }\r\n }\r\n}\r\n","/**\r\n * sparkfx Accessibility Module\r\n * Comprehensive a11y support for animations and effects\r\n * \r\n * @module core/a11y\r\n * @version 1.2.0\r\n */\r\n\r\nimport { isBrowser } from './utils'\r\nimport { configManager } from './config'\r\n\r\n// ============================================================================\r\n// TYPE DEFINITIONS\r\n// ============================================================================\r\n\r\nexport interface A11yOptions {\r\n /** Announce effect to screen readers */\r\n announce?: boolean\r\n\r\n /** Custom announcement message */\r\n announceMessage?: string\r\n\r\n /** Role attribute for element */\r\n role?: string\r\n\r\n /** Label for the effect */\r\n label?: string\r\n\r\n /** Is element focusable */\r\n focusable?: boolean\r\n\r\n /** Reduced motion alternative */\r\n reducedMotionAlternative?: 'none' | 'fade' | 'simple'\r\n}\r\n\r\nexport interface A11yState {\r\n prefersReducedMotion: boolean\r\n prefersHighContrast: boolean\r\n screenReaderActive: boolean\r\n}\r\n\r\n// ============================================================================\r\n// MEDIA QUERY DETECTION\r\n// ============================================================================\r\n\r\nlet cachedState: A11yState | null = null\r\n\r\n/**\r\n * Get current accessibility state\r\n */\r\nexport function getA11yState(): A11yState {\r\n if (!isBrowser()) {\r\n return {\r\n prefersReducedMotion: false,\r\n prefersHighContrast: false,\r\n screenReaderActive: false,\r\n }\r\n }\r\n\r\n // Return cached state if available\r\n if (cachedState) return cachedState\r\n\r\n cachedState = {\r\n prefersReducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\r\n prefersHighContrast: window.matchMedia('(prefers-contrast: more)').matches,\r\n screenReaderActive: detectScreenReader(),\r\n }\r\n\r\n return cachedState\r\n}\r\n\r\n/**\r\n * Detect if screen reader is likely active\r\n */\r\nfunction detectScreenReader(): boolean {\r\n if (!isBrowser()) return false\r\n\r\n // Check for common screen reader indicators\r\n const indicators = [\r\n // NVDA\r\n document.querySelector('[data-nvda]'),\r\n // JAWS\r\n window.hasOwnProperty('JAWS'),\r\n // VoiceOver (iOS/macOS)\r\n document.querySelector('.voiceover-detected'),\r\n // Check for focus-visible polyfill (often used with screen readers)\r\n document.documentElement.classList.contains('js-focus-visible'),\r\n ]\r\n\r\n return indicators.some(Boolean)\r\n}\r\n\r\n/**\r\n * Clear cached accessibility state\r\n */\r\nexport function clearA11yCache(): void {\r\n cachedState = null\r\n}\r\n\r\n// ============================================================================\r\n// MEDIA QUERY LISTENERS\r\n// ============================================================================\r\n\r\ntype A11yChangeCallback = (state: A11yState) => void\r\nconst listeners = new Set<A11yChangeCallback>()\r\n\r\n/**\r\n * Subscribe to accessibility preference changes\r\n */\r\nexport function onA11yChange(callback: A11yChangeCallback): () => void {\r\n if (!isBrowser()) return () => { }\r\n\r\n listeners.add(callback)\r\n\r\n // Set up media query listeners on first subscriber\r\n if (listeners.size === 1) {\r\n setupMediaQueryListeners()\r\n }\r\n\r\n return () => {\r\n listeners.delete(callback)\r\n }\r\n}\r\n\r\nfunction setupMediaQueryListeners(): void {\r\n if (!isBrowser()) return\r\n\r\n const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\r\n const contrastQuery = window.matchMedia('(prefers-contrast: more)')\r\n\r\n const handleChange = () => {\r\n clearA11yCache()\r\n const state = getA11yState()\r\n listeners.forEach(callback => callback(state))\r\n }\r\n\r\n motionQuery.addEventListener('change', handleChange)\r\n contrastQuery.addEventListener('change', handleChange)\r\n}\r\n\r\n// ============================================================================\r\n// REDUCED MOTION HANDLING\r\n// ============================================================================\r\n\r\n/**\r\n * Check if animations should be reduced\r\n */\r\nexport function shouldReduceMotion(): boolean {\r\n const config = configManager.get()\r\n\r\n if (!config.respectMotionPreference) {\r\n return false\r\n }\r\n\r\n return getA11yState().prefersReducedMotion\r\n}\r\n\r\n/**\r\n * Get reduced motion CSS for an animation\r\n */\r\nexport function getReducedMotionCSS(alternative: 'none' | 'fade' | 'simple' = 'fade'): string {\r\n switch (alternative) {\r\n case 'none':\r\n return 'animation: none !important; transition: none !important;'\r\n case 'fade':\r\n return 'animation: none !important; transition: opacity 200ms ease !important;'\r\n case 'simple':\r\n return 'animation-duration: 0.01ms !important; animation-iteration-count: 1 !important;'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\n/**\r\n * Apply reduced motion styles to element\r\n */\r\nexport function applyReducedMotion(\r\n element: HTMLElement,\r\n alternative: 'none' | 'fade' | 'simple' = 'fade'\r\n): void {\r\n if (!shouldReduceMotion()) return\r\n\r\n const css = getReducedMotionCSS(alternative)\r\n element.style.cssText += css\r\n element.setAttribute('data-spark-reduced-motion', 'true')\r\n}\r\n\r\n// ============================================================================\r\n// SCREEN READER ANNOUNCEMENTS\r\n// ============================================================================\r\n\r\nlet announcer: HTMLElement | null = null\r\n\r\n/**\r\n * Create announcer element for screen readers\r\n */\r\nfunction getAnnouncer(): HTMLElement {\r\n if (!isBrowser()) {\r\n throw new Error('Cannot create announcer in non-browser environment')\r\n }\r\n\r\n if (announcer && document.body.contains(announcer)) {\r\n return announcer\r\n }\r\n\r\n announcer = document.createElement('div')\r\n announcer.setAttribute('aria-live', 'polite')\r\n announcer.setAttribute('aria-atomic', 'true')\r\n announcer.setAttribute('role', 'status')\r\n announcer.className = 'spark-a11y-announcer'\r\n\r\n // Visually hidden but accessible to screen readers\r\n Object.assign(announcer.style, {\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0',\r\n })\r\n\r\n document.body.appendChild(announcer)\r\n return announcer\r\n}\r\n\r\n/**\r\n * Announce message to screen readers\r\n */\r\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\r\n if (!isBrowser()) return\r\n\r\n const config = configManager.get()\r\n if (!config.a11y) return\r\n\r\n const announcerEl = getAnnouncer()\r\n announcerEl.setAttribute('aria-live', priority)\r\n\r\n // Clear and set message (triggers announcement)\r\n announcerEl.textContent = ''\r\n\r\n // Use setTimeout to ensure the DOM update is processed\r\n setTimeout(() => {\r\n announcerEl.textContent = message\r\n }, 100)\r\n}\r\n\r\n/**\r\n * Get default announcement for effect\r\n */\r\nexport function getEffectAnnouncement(effectName: string): string {\r\n const announcements: Record<string, string> = {\r\n bounce: 'Element bounced',\r\n glow: 'Element is glowing',\r\n pulse: 'Element is pulsing',\r\n shake: 'Element shook',\r\n confetti: 'Celebration animation played',\r\n sparkle: 'Sparkle effect activated',\r\n firework: 'Firework animation played',\r\n typewriter: 'Text typing animation',\r\n reveal: 'Content revealed',\r\n }\r\n\r\n return announcements[effectName] || `${effectName} effect activated`\r\n}\r\n\r\n// ============================================================================\r\n// FOCUS MANAGEMENT\r\n// ============================================================================\r\n\r\n/**\r\n * Make element focusable\r\n */\r\nexport function makeFocusable(element: HTMLElement): void {\r\n if (!element.hasAttribute('tabindex')) {\r\n element.setAttribute('tabindex', '0')\r\n }\r\n}\r\n\r\n/**\r\n * Add keyboard activation support\r\n */\r\nexport function addKeyboardSupport(\r\n element: HTMLElement,\r\n handler: (event: KeyboardEvent) => void\r\n): () => void {\r\n const keyHandler = (event: KeyboardEvent) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n handler(event)\r\n }\r\n }\r\n\r\n element.addEventListener('keydown', keyHandler)\r\n\r\n return () => {\r\n element.removeEventListener('keydown', keyHandler)\r\n }\r\n}\r\n\r\n/**\r\n * Create focus trap for modals/dialogs\r\n */\r\nexport function createFocusTrap(container: HTMLElement): {\r\n activate: () => void\r\n deactivate: () => void\r\n} {\r\n let previouslyFocused: HTMLElement | null = null\r\n\r\n const focusableSelectors = [\r\n 'button',\r\n '[href]',\r\n 'input',\r\n 'select',\r\n 'textarea',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(', ')\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Tab') return\r\n\r\n const focusableElements = container.querySelectorAll<HTMLElement>(focusableSelectors)\r\n const firstElement = focusableElements[0]\r\n const lastElement = focusableElements[focusableElements.length - 1]\r\n\r\n if (event.shiftKey && document.activeElement === firstElement) {\r\n event.preventDefault()\r\n lastElement?.focus()\r\n } else if (!event.shiftKey && document.activeElement === lastElement) {\r\n event.preventDefault()\r\n firstElement?.focus()\r\n }\r\n }\r\n\r\n return {\r\n activate() {\r\n previouslyFocused = document.activeElement as HTMLElement\r\n container.addEventListener('keydown', handleKeyDown)\r\n\r\n const firstFocusable = container.querySelector<HTMLElement>(focusableSelectors)\r\n firstFocusable?.focus()\r\n },\r\n deactivate() {\r\n container.removeEventListener('keydown', handleKeyDown)\r\n previouslyFocused?.focus()\r\n },\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ARIA ATTRIBUTES\r\n// ============================================================================\r\n\r\n/**\r\n * Apply accessibility attributes to element\r\n */\r\nexport function applyA11yAttributes(element: HTMLElement, options: A11yOptions): void {\r\n if (options.role) {\r\n element.setAttribute('role', options.role)\r\n }\r\n\r\n if (options.label) {\r\n element.setAttribute('aria-label', options.label)\r\n }\r\n\r\n if (options.focusable) {\r\n makeFocusable(element)\r\n }\r\n\r\n // Add data attribute for styling hooks\r\n element.setAttribute('data-spark-a11y', 'true')\r\n}\r\n\r\n/**\r\n * Apply effect with accessibility support\r\n */\r\nexport function wrapWithA11y<T>(\r\n effectFn: () => T,\r\n element: HTMLElement,\r\n effectName: string,\r\n options: A11yOptions = {}\r\n): T {\r\n const config = configManager.get()\r\n\r\n // Apply reduced motion if needed\r\n if (shouldReduceMotion()) {\r\n applyReducedMotion(element, options.reducedMotionAlternative)\r\n }\r\n\r\n // Apply ARIA attributes\r\n if (config.a11y) {\r\n applyA11yAttributes(element, options)\r\n }\r\n\r\n // Execute effect\r\n const result = effectFn()\r\n\r\n // Announce if configured\r\n if (options.announce && config.a11y) {\r\n const message = options.announceMessage || getEffectAnnouncement(effectName)\r\n announce(message)\r\n }\r\n\r\n return result\r\n}\r\n\r\n// ============================================================================\r\n// HIGH CONTRAST SUPPORT\r\n// ============================================================================\r\n\r\n/**\r\n * Check if high contrast mode is active\r\n */\r\nexport function isHighContrastMode(): boolean {\r\n return getA11yState().prefersHighContrast\r\n}\r\n\r\n/**\r\n * Get high contrast safe color\r\n */\r\nexport function getHighContrastColor(color: string, fallback: string): string {\r\n if (!isHighContrastMode()) return color\r\n\r\n // In high contrast mode, use system colors\r\n const highContrastColors: Record<string, string> = {\r\n primary: 'CanvasText',\r\n secondary: 'LinkText',\r\n background: 'Canvas',\r\n border: 'CanvasText',\r\n }\r\n\r\n return highContrastColors[color] || fallback\r\n}\r\n","/**\r\n * Combine API\r\n * Combine multiple effects on a single element\r\n * \r\n * @module api/combine\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\n\r\n/**\r\n * Combine multiple sparkfx effects into one\r\n * \r\n * @example\r\n * const fx = combine([\r\n * spark.glow({ color: '#00ffa3' }),\r\n * spark.bounce(),\r\n * spark.shimmer()\r\n * ])\r\n * element.classList.add(fx.className)\r\n */\r\nexport function combine(effects: SparkEffectResult[]): SparkEffectResult {\r\n if (effects.length === 0) {\r\n return {\r\n className: '',\r\n }\r\n }\r\n\r\n // Merge class names\r\n const classNames = effects\r\n .map(e => e.className)\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n // Merge styles\r\n const mergedStyle: Record<string, string> = {}\r\n effects.forEach(effect => {\r\n if (effect.style) {\r\n Object.assign(mergedStyle, effect.style)\r\n }\r\n })\r\n\r\n // Combine event handlers\r\n const combinedOnMouseEnter = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseEnter) {\r\n effect.onMouseEnter(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnMouseLeave = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseLeave) {\r\n effect.onMouseLeave(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnMouseMove = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseMove) {\r\n effect.onMouseMove(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnClick = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onClick) {\r\n effect.onClick(event)\r\n }\r\n })\r\n }\r\n\r\n // Combine cleanup functions\r\n const combinedCleanup = () => {\r\n effects.forEach(effect => {\r\n if (effect.cleanup) {\r\n effect.cleanup()\r\n }\r\n })\r\n }\r\n\r\n // Check if any effect has handlers\r\n const hasMouseEnter = effects.some(e => e.onMouseEnter)\r\n const hasMouseLeave = effects.some(e => e.onMouseLeave)\r\n const hasMouseMove = effects.some(e => e.onMouseMove)\r\n const hasClick = effects.some(e => e.onClick)\r\n const hasCleanup = effects.some(e => e.cleanup)\r\n\r\n return {\r\n className: classNames,\r\n style: Object.keys(mergedStyle).length > 0 ? mergedStyle : undefined,\r\n onMouseEnter: hasMouseEnter ? combinedOnMouseEnter : undefined,\r\n onMouseLeave: hasMouseLeave ? combinedOnMouseLeave : undefined,\r\n onMouseMove: hasMouseMove ? combinedOnMouseMove : undefined,\r\n onClick: hasClick ? combinedOnClick : undefined,\r\n cleanup: hasCleanup ? combinedCleanup : undefined,\r\n }\r\n}\r\n\r\nexport default combine\r\n","/**\r\n * Sequence API\r\n * Chain animations in sequence\r\n * \r\n * @module api/sequence\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\nimport { isBrowser } from '../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SequenceStep {\r\n /** Effect to apply */\r\n effect: SparkEffectResult\r\n\r\n /** Delay before this step in ms. Default: 0 */\r\n delay?: number\r\n\r\n /** Duration of this step in ms. Default: 300 */\r\n duration?: number\r\n\r\n /** Callback when step starts */\r\n onStart?: () => void\r\n\r\n /** Callback when step ends */\r\n onEnd?: () => void\r\n}\r\n\r\nexport interface SequenceOptions {\r\n /** Loop the sequence. Default: false */\r\n loop?: boolean\r\n\r\n /** Number of loops (-1 for infinite). Default: 1 */\r\n loopCount?: number\r\n\r\n /** Delay between loops in ms. Default: 0 */\r\n loopDelay?: number\r\n\r\n /** Callback when sequence completes */\r\n onComplete?: () => void\r\n}\r\n\r\nexport interface SequenceController {\r\n /** Start the sequence */\r\n play: () => void\r\n\r\n /** Pause the sequence */\r\n pause: () => void\r\n\r\n /** Stop and reset the sequence */\r\n stop: () => void\r\n\r\n /** Get current step index */\r\n getCurrentStep: () => number\r\n\r\n /** Check if sequence is playing */\r\n isPlaying: () => boolean\r\n}\r\n\r\n// ============================================================================\r\n// SEQUENCE\r\n// ============================================================================\r\n\r\n/**\r\n * Create an animation sequence\r\n * \r\n * @example\r\n * const seq = sequence([\r\n * { effect: spark.fade(), delay: 0, duration: 300 },\r\n * { effect: spark.bounce(), delay: 100, duration: 500 },\r\n * { effect: spark.glow(), delay: 200, duration: 400 }\r\n * ], { loop: true })\r\n * \r\n * // Apply to element and start\r\n * seq.play()\r\n */\r\nexport function sequence(\r\n element: HTMLElement | null,\r\n steps: SequenceStep[],\r\n options: SequenceOptions = {}\r\n): SequenceController {\r\n const opts = {\r\n loop: false,\r\n loopCount: 1,\r\n loopDelay: 0,\r\n ...options,\r\n }\r\n\r\n let currentStepIndex = 0\r\n let playing = false\r\n let loopsCompleted = 0\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n let appliedClasses: string[] = []\r\n\r\n const cleanupCurrentStep = () => {\r\n if (element && appliedClasses.length > 0) {\r\n appliedClasses.forEach(cls => {\r\n cls.split(' ').forEach(c => c && element.classList.remove(c))\r\n })\r\n appliedClasses = []\r\n }\r\n }\r\n\r\n const applyStep = (step: SequenceStep) => {\r\n if (!element || !isBrowser()) return\r\n\r\n // Apply effect\r\n if (step.effect.className) {\r\n step.effect.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\r\n appliedClasses.push(step.effect.className)\r\n }\r\n\r\n if (step.effect.style) {\r\n Object.entries(step.effect.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Trigger onStart callback\r\n if (step.onStart) {\r\n step.onStart()\r\n }\r\n }\r\n\r\n const executeStep = (index: number) => {\r\n if (!playing || index >= steps.length) {\r\n // Sequence complete\r\n if (opts.loop && (opts.loopCount === -1 || loopsCompleted < opts.loopCount - 1)) {\r\n // Loop\r\n loopsCompleted++\r\n timeoutId = setTimeout(() => {\r\n currentStepIndex = 0\r\n cleanupCurrentStep()\r\n executeStep(0)\r\n }, opts.loopDelay)\r\n } else {\r\n // Done\r\n playing = false\r\n if (options.onComplete) {\r\n options.onComplete()\r\n }\r\n }\r\n return\r\n }\r\n\r\n const step = steps[index]\r\n currentStepIndex = index\r\n\r\n // Wait for delay, then apply\r\n timeoutId = setTimeout(() => {\r\n applyStep(step)\r\n\r\n // Wait for duration, then next step\r\n timeoutId = setTimeout(() => {\r\n if (step.onEnd) {\r\n step.onEnd()\r\n }\r\n cleanupCurrentStep()\r\n executeStep(index + 1)\r\n }, step.duration || 300)\r\n }, step.delay || 0)\r\n }\r\n\r\n const play = () => {\r\n if (playing) return\r\n playing = true\r\n executeStep(currentStepIndex)\r\n }\r\n\r\n const pause = () => {\r\n playing = false\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n timeoutId = null\r\n }\r\n }\r\n\r\n const stop = () => {\r\n pause()\r\n currentStepIndex = 0\r\n loopsCompleted = 0\r\n cleanupCurrentStep()\r\n }\r\n\r\n const getCurrentStep = () => currentStepIndex\r\n const isPlaying = () => playing\r\n\r\n return {\r\n play,\r\n pause,\r\n stop,\r\n getCurrentStep,\r\n isPlaying,\r\n }\r\n}\r\n\r\nexport default sequence\r\n","/**\r\n * Stagger API\r\n * Apply effects with staggered delays\r\n * \r\n * @module api/stagger\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\nimport { isBrowser, safeQuerySelectorAll } from '../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface StaggerOptions {\r\n /** Delay between each element in ms. Default: 100 */\r\n delay?: number\r\n\r\n /** Starting delay in ms. Default: 0 */\r\n startDelay?: number\r\n\r\n /** Stagger direction: 'normal' | 'reverse' | 'random'. Default: 'normal' */\r\n direction?: 'normal' | 'reverse' | 'random'\r\n\r\n /** Easing for delay progression. Default: 'linear' */\r\n easing?: 'linear' | 'ease-in' | 'ease-out'\r\n\r\n /** Callback when all animations start */\r\n onStart?: () => void\r\n\r\n /** Callback for each element animation */\r\n onElementStart?: (element: HTMLElement, index: number) => void\r\n\r\n /** Callback when all animations complete */\r\n onComplete?: () => void\r\n}\r\n\r\nexport interface StaggerController {\r\n /** Start the stagger animation */\r\n play: () => void\r\n\r\n /** Cancel all pending animations */\r\n cancel: () => void\r\n\r\n /** Get elements being animated */\r\n getElements: () => HTMLElement[]\r\n}\r\n\r\n// ============================================================================\r\n// STAGGER\r\n// ============================================================================\r\n\r\n/**\r\n * Apply effect with staggered timing to multiple elements\r\n * \r\n * @example\r\n * const staggered = stagger('.card', spark.reveal(), { delay: 100 })\r\n * staggered.play()\r\n */\r\nexport function stagger(\r\n selector: string | HTMLElement[],\r\n effect: SparkEffectResult,\r\n options: StaggerOptions = {}\r\n): StaggerController {\r\n const opts = {\r\n delay: 100,\r\n startDelay: 0,\r\n direction: 'normal' as const,\r\n easing: 'linear' as const,\r\n ...options,\r\n }\r\n\r\n let elements: HTMLElement[] = []\r\n let timeoutIds: ReturnType<typeof setTimeout>[] = []\r\n let started = false\r\n\r\n // Get elements\r\n const getElements = (): HTMLElement[] => {\r\n if (!isBrowser()) return []\r\n\r\n if (Array.isArray(selector)) {\r\n elements = selector\r\n } else {\r\n elements = safeQuerySelectorAll<HTMLElement>(selector)\r\n }\r\n\r\n // Apply direction\r\n if (opts.direction === 'reverse') {\r\n elements = [...elements].reverse()\r\n } else if (opts.direction === 'random') {\r\n elements = [...elements].sort(() => Math.random() - 0.5)\r\n }\r\n\r\n return elements\r\n }\r\n\r\n // Calculate delay for each element\r\n const getDelay = (index: number, total: number): number => {\r\n const baseDelay = opts.startDelay + (index * opts.delay)\r\n\r\n switch (opts.easing) {\r\n case 'ease-in':\r\n // Delays get progressively longer\r\n return opts.startDelay + Math.pow(index / total, 2) * opts.delay * total\r\n case 'ease-out':\r\n // Delays get progressively shorter\r\n return opts.startDelay + (1 - Math.pow(1 - index / total, 2)) * opts.delay * total\r\n default:\r\n return baseDelay\r\n }\r\n }\r\n\r\n // Apply effect to element\r\n const applyEffect = (element: HTMLElement) => {\r\n if (effect.className) {\r\n effect.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\r\n }\r\n\r\n if (effect.style) {\r\n Object.entries(effect.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Attach event handlers if needed\r\n if (effect.onMouseEnter) {\r\n element.addEventListener('mouseenter', effect.onMouseEnter)\r\n }\r\n if (effect.onMouseLeave) {\r\n element.addEventListener('mouseleave', effect.onMouseLeave)\r\n }\r\n if (effect.onMouseMove) {\r\n element.addEventListener('mousemove', effect.onMouseMove)\r\n }\r\n if (effect.onClick) {\r\n element.addEventListener('click', effect.onClick)\r\n }\r\n }\r\n\r\n const play = () => {\r\n if (started) return\r\n started = true\r\n\r\n const els = getElements()\r\n if (els.length === 0) return\r\n\r\n if (opts.onStart) {\r\n opts.onStart()\r\n }\r\n\r\n let completedCount = 0\r\n\r\n els.forEach((element, index) => {\r\n const delay = getDelay(index, els.length)\r\n\r\n const timeoutId = setTimeout(() => {\r\n applyEffect(element)\r\n\r\n if (opts.onElementStart) {\r\n opts.onElementStart(element, index)\r\n }\r\n\r\n completedCount++\r\n\r\n // Check if all elements have started their animation\r\n if (completedCount === els.length && opts.onComplete) {\r\n opts.onComplete()\r\n }\r\n }, delay)\r\n\r\n timeoutIds.push(timeoutId)\r\n })\r\n }\r\n\r\n const cancel = () => {\r\n timeoutIds.forEach(id => clearTimeout(id))\r\n timeoutIds = []\r\n started = false\r\n }\r\n\r\n return {\r\n play,\r\n cancel,\r\n getElements: () => elements,\r\n }\r\n}\r\n\r\nexport default stagger\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Core engine that powers all effects\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from './types'\r\nimport {\r\n injectBaseStyles as _injectBaseStyles,\r\n generateCSSVars as _generateCSSVars,\r\n prefersReducedMotion as _prefersReducedMotion,\r\n} from './styles'\r\n\r\n// Re-export for effects\r\nexport const injectBaseStyles = _injectBaseStyles\r\nexport const generateCSSVars = _generateCSSVars\r\nexport const prefersReducedMotion = _prefersReducedMotion\r\n\r\n/** Default options */\r\nconst defaults: Required<SparkBaseOptions> = {\r\n duration: 300,\r\n intensity: 1,\r\n trigger: 'hover',\r\n easing: 'ease-out',\r\n delay: 0,\r\n reduceMotion: true,\r\n}\r\n\r\n/**\r\n * Merge user options with defaults\r\n */\r\nexport function mergeOptions<T extends SparkBaseOptions>(\r\n options?: T,\r\n effectDefaults?: Partial<T>\r\n): Required<SparkBaseOptions> & T {\r\n return { ...defaults, ...effectDefaults, ...options } as Required<SparkBaseOptions> & T\r\n}\r\n\r\n/**\r\n * Check if animations should be disabled\r\n */\r\nexport function shouldAnimate(options: SparkBaseOptions): boolean {\r\n if (options.reduceMotion !== false && prefersReducedMotion()) {\r\n return false\r\n }\r\n return true\r\n}\r\n\r\n/**\r\n * Create a basic effect result with common properties\r\n */\r\nexport function createEffectResult(\r\n options: SparkBaseOptions,\r\n additionalStyles?: Record<string, string | number>,\r\n additionalClasses?: string[]\r\n): SparkResult {\r\n injectBaseStyles()\r\n\r\n const cssVars = generateCSSVars({\r\n duration: options.duration,\r\n easing: options.easing,\r\n intensity: options.intensity,\r\n })\r\n\r\n const classes = ['sparkfx-effect']\r\n if (!shouldAnimate(options)) {\r\n classes.push('sparkfx-reduced-motion')\r\n }\r\n if (additionalClasses) {\r\n classes.push(...additionalClasses)\r\n }\r\n\r\n return {\r\n className: classes.join(' '),\r\n style: { ...cssVars, ...additionalStyles },\r\n }\r\n}\r\n\r\n/**\r\n * Create a simple effect result from direct properties\r\n * Used by new effects that manage their own styles\r\n */\r\nexport function createSimpleEffectResult(props: Partial<SparkResult> & { className: string }): SparkResult {\r\n injectBaseStyles()\r\n return {\r\n className: props.className || '',\r\n style: props.style,\r\n onMouseEnter: props.onMouseEnter,\r\n onMouseLeave: props.onMouseLeave,\r\n onMouseMove: props.onMouseMove,\r\n onClick: props.onClick,\r\n onFocus: props.onFocus,\r\n onBlur: props.onBlur,\r\n destroy: props.destroy,\r\n cleanup: props.cleanup,\r\n }\r\n}\r\n\r\n/**\r\n * Apply transform with intensity\r\n */\r\nexport function applyIntensity(value: number, intensity: number): number {\r\n return value * intensity\r\n}\r\n\r\n/**\r\n * Generate a unique ID for elements\r\n */\r\nlet idCounter = 0\r\nexport function generateId(): string {\r\n return `sparkfx-${++idCounter}-${Date.now()}`\r\n}\r\n\r\n/**\r\n * Clamp a value between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/**\r\n * Validate and sanitize a color input\r\n * Prevents XSS through color injection\r\n */\r\nexport function sanitizeColor(color: string | undefined, fallback: string = '#ffffff'): string {\r\n if (!color || typeof color !== 'string') return fallback\r\n\r\n // Remove any non-color characters (XSS prevention)\r\n const cleaned = color.replace(/[^a-zA-Z0-9#(),.\\s%]/g, '')\r\n\r\n // Validate hex color\r\n if (/^#[0-9A-Fa-f]{3,8}$/.test(cleaned)) return cleaned\r\n\r\n // Validate rgb/rgba\r\n if (/^rgba?\\([^)]+\\)$/.test(cleaned)) return cleaned\r\n\r\n // Validate named colors (common ones)\r\n const namedColors = ['red', 'blue', 'green', 'yellow', 'white', 'black', 'orange', 'purple', 'pink', 'cyan', 'magenta', 'currentColor', 'transparent']\r\n if (namedColors.includes(cleaned.toLowerCase())) return cleaned\r\n\r\n return fallback\r\n}\r\n\r\n/**\r\n * Validate numeric input with bounds\r\n */\r\nexport function validateNumber(value: number | undefined, min: number, max: number, fallback: number): number {\r\n if (value === undefined || typeof value !== 'number' || isNaN(value)) return fallback\r\n return clamp(value, min, max)\r\n}\r\n\r\n/**\r\n * Validate duration (prevent extremely long or negative durations)\r\n */\r\nexport function validateDuration(duration: number | undefined): number {\r\n return validateNumber(duration, 0, 30000, 300) // Max 30 seconds\r\n}\r\n\r\n/**\r\n * Validate intensity (prevent extreme values)\r\n */\r\nexport function validateIntensity(intensity: number | undefined): number {\r\n return validateNumber(intensity, 0.1, 5, 1)\r\n}\r\n\r\n/**\r\n * Safe element query - prevents errors on SSR\r\n */\r\nexport function safeQuerySelector(selector: string): Element | null {\r\n if (typeof document === 'undefined') return null\r\n try {\r\n return document.querySelector(selector)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Check if running in browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined'\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t\r\n}\r\n\r\n/**\r\n * Map a value from one range to another\r\n */\r\nexport function mapRange(\r\n value: number,\r\n inMin: number,\r\n inMax: number,\r\n outMin: number,\r\n outMax: number\r\n): number {\r\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\r\n}\r\n\r\n/**\r\n * Get element's center position\r\n */\r\nexport function getElementCenter(element: HTMLElement): { x: number; y: number } {\r\n const rect = element.getBoundingClientRect()\r\n return {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n }\r\n}\r\n\r\n/**\r\n * Get mouse position relative to element center\r\n */\r\nexport function getRelativeMousePosition(\r\n event: MouseEvent,\r\n element: HTMLElement\r\n): { x: number; y: number; percentX: number; percentY: number } {\r\n const rect = element.getBoundingClientRect()\r\n const x = event.clientX - rect.left\r\n const y = event.clientY - rect.top\r\n const percentX = (x / rect.width - 0.5) * 2 // -1 to 1\r\n const percentY = (y / rect.height - 0.5) * 2 // -1 to 1\r\n\r\n return { x, y, percentX, percentY }\r\n}\r\n\r\n/**\r\n * Create event handlers for trigger-based effects\r\n */\r\nexport function createTriggerHandlers(\r\n trigger: SparkBaseOptions['trigger'],\r\n onActivate: () => void,\r\n onDeactivate: () => void\r\n): Pick<SparkResult, 'onMouseEnter' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'> {\r\n switch (trigger) {\r\n case 'hover':\r\n return {\r\n onMouseEnter: onActivate,\r\n onMouseLeave: onDeactivate,\r\n }\r\n case 'click':\r\n return {\r\n onClick: onActivate,\r\n }\r\n case 'focus':\r\n return {\r\n onFocus: onActivate,\r\n onBlur: onDeactivate,\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Random number in range\r\n */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\n/**\r\n * Random item from array\r\n */\r\nexport function randomItem<T>(array: T[]): T {\r\n return array[Math.floor(Math.random() * array.length)] as T\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: any[]) => void>(\r\n fn: T,\r\n delay: number\r\n): T {\r\n let timeoutId: any\r\n return ((...args: any[]) => {\r\n clearTimeout(timeoutId)\r\n timeoutId = setTimeout(() => fn(...args), delay)\r\n }) as any\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: any[]) => void>(\r\n fn: T,\r\n limit: number\r\n): T {\r\n let inThrottle = false\r\n return ((...args: any[]) => {\r\n if (!inThrottle) {\r\n fn(...args)\r\n inThrottle = true\r\n setTimeout(() => (inThrottle = false), limit)\r\n }\r\n }) as any\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Bounce effect with customizable intensity and bounce count\r\n */\r\n\r\nimport type { SparkBounceOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBounceOptions> = {\r\n duration: 400,\r\n bounces: 1,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function bounce(options?: SparkBounceOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBounceOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const bounceHeight = applyIntensity(20, opts.intensity)\r\n const animationName = `sparkfx-bounce-${opts.bounces}-${Math.round(bounceHeight)}`\r\n\r\n // Generate keyframes based on bounces\r\n let keyframes = '0%, 100% { transform: translateY(0); }'\r\n const step = 100 / (opts.bounces * 2)\r\n\r\n for (let i = 0; i < opts.bounces; i++) {\r\n const upPercent = step * (i * 2 + 1)\r\n const currentHeight = bounceHeight * Math.pow(0.6, i)\r\n keyframes += ` ${upPercent}% { transform: translateY(-${currentHeight}px); }`\r\n }\r\n\r\n injectAnimation(animationName, keyframes)\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-bounce'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-animation-name': animationName,\r\n },\r\n onMouseEnter: opts.trigger === 'hover' ? undefined : undefined, // Handled via CSS if strictly hover\r\n // But for completeness and manual control:\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Pulse effect for loading states or highlighting\r\n */\r\n\r\nimport type { SparkPulseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkPulseOptions> = {\r\n duration: 1000,\r\n count: -1, // infinite\r\n scale: 1.05,\r\n trigger: 'always',\r\n intensity: 1,\r\n}\r\n\r\nexport function pulse(options?: SparkPulseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkPulseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const scaleValue = 1 + (opts.scale - 1) * opts.intensity\r\n const animationName = `sparkfx-pulse-${scaleValue.toString().replace('.', '_')}`\r\n\r\n injectAnimation(animationName, `\r\n 0%, 100% { transform: scale(1); opacity: 1; }\r\n 50% { transform: scale(${scaleValue}); opacity: 0.8; }\r\n `)\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const iterationCount = opts.count === -1 ? 'infinite' : opts.count\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-pulse'),\r\n style: {\r\n ...cssVars,\r\n animation: `${animationName} ${opts.duration}ms ${opts.easing} ${iterationCount}`,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Lift effect with optional shadow and depth\r\n */\r\n\r\nimport type { SparkLiftOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkLiftOptions> = {\r\n duration: 200,\r\n distance: 8,\r\n shadow: true,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function lift(options?: SparkLiftOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkLiftOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const shadowValue = opts.shadow\r\n ? `0 ${distance * 2}px ${distance * 3}px rgba(0, 0, 0, 0.15)`\r\n : 'none'\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-lift'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-lift-distance': `-${distance}px`,\r\n '--sparkfx-lift-shadow': shadowValue,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing), box-shadow var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n if (opts.trigger === 'hover') {\r\n target.style.transform = `translateY(-${distance}px)`\r\n if (opts.shadow) target.style.boxShadow = shadowValue\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n if (opts.trigger === 'hover') {\r\n target.style.transform = 'translateY(0)'\r\n target.style.boxShadow = 'none'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Scale effect for hovering and clicking\r\n */\r\n\r\nimport type { SparkScaleOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkScaleOptions> = {\r\n duration: 200,\r\n scale: 1.1,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function scale(options?: SparkScaleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkScaleOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const scaleValue = 1 + (opts.scale - 1) * opts.intensity\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-scale'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `scale(${scaleValue})`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'scale(1)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Shake effect for alerts and interactions\r\n */\r\n\r\nimport type { SparkShakeOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkShakeOptions> = {\r\n duration: 500,\r\n distance: 5,\r\n count: 3,\r\n trigger: 'click',\r\n intensity: 1,\r\n}\r\n\r\nexport function shake(options?: SparkShakeOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkShakeOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const animationName = `sparkfx-shake-${distance}`\r\n\r\n injectAnimation(animationName, `\r\n 0%, 100% { transform: translateX(0); }\r\n 10%, 30%, 50%, 70%, 90% { transform: translateX(-${distance}px); }\r\n 20%, 40%, 60%, 80% { transform: translateX(${distance}px); }\r\n `)\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-shake'),\r\n style: cssVars,\r\n onClick: (e: any) => {\r\n if (opts.trigger === 'click') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.animation = `${animationName} ${opts.duration}ms ${opts.easing}`\r\n setTimeout(() => {\r\n target.style.animation = ''\r\n }, opts.duration)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Fade effect for smooth transitions\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport interface SparkFadeOptions extends SparkBaseOptions {\r\n /** Target opacity (default: 0.6) */\r\n opacity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<SparkFadeOptions> = {\r\n duration: 200,\r\n opacity: 0.6,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function fade(options?: SparkFadeOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkFadeOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const targetOpacity = opts.opacity\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-fade'),\r\n style: {\r\n ...cssVars,\r\n transition: `opacity var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.opacity = String(targetOpacity)\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.opacity = '1'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Slide effect in four directions\r\n */\r\n\r\nimport type { SparkSlideOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkSlideOptions> = {\r\n duration: 200,\r\n direction: 'up',\r\n distance: 10,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function slide(options?: SparkSlideOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkSlideOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const getTransform = () => {\r\n switch (opts.direction) {\r\n case 'up': return `translateY(-${distance}px)`\r\n case 'down': return `translateY(${distance}px)`\r\n case 'left': return `translateX(-${distance}px)`\r\n case 'right': return `translateX(${distance}px)`\r\n default: return `translateY(-${distance}px)`\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-slide'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = getTransform()\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'translate(0)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Rotate effect for playful UI elements\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport interface SparkRotateOptions extends SparkBaseOptions {\r\n /** Rotation angle in degrees (default: 5) */\r\n angle?: number\r\n /** Rotation direction (default: 'clockwise') */\r\n direction?: 'clockwise' | 'counterclockwise'\r\n}\r\n\r\nconst defaultOptions: Partial<SparkRotateOptions> = {\r\n duration: 200,\r\n angle: 5,\r\n direction: 'clockwise',\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function rotate(options?: SparkRotateOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkRotateOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const angle = applyIntensity(opts.angle, opts.intensity)\r\n const directionMultiplier = opts.direction === 'counterclockwise' ? -1 : 1\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-rotate'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `rotate(${angle * directionMultiplier}deg)`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'rotate(0)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Neon glow effect for borders and depth\r\n */\r\n\r\nimport type { SparkGlowOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity, sanitizeColor, validateNumber } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlowOptions> = {\r\n duration: 300,\r\n color: '#00ffa3',\r\n spread: 20,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function glow(options?: SparkGlowOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlowOptions>\r\n\r\n // Sanitize inputs for security\r\n const safeColor = sanitizeColor(opts.color, '#00ffa3')\r\n const safeSpread = validateNumber(opts.spread, 1, 100, 20)\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const spread = applyIntensity(safeSpread, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const glowShadow = `\r\n 0 0 ${spread / 2}px ${safeColor},\r\n 0 0 ${spread}px ${safeColor},\r\n 0 0 ${spread * 1.5}px ${safeColor}\r\n `\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glow'),\r\n style: {\r\n ...cssVars,\r\n transition: `box-shadow var(--sparkfx-duration) var(--sparkfx-easing), filter var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.boxShadow = glowShadow\r\n target.style.filter = 'brightness(1.1)'\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.boxShadow = 'none'\r\n target.style.filter = 'brightness(1)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * Ripple Effect - Material Design ripple efekti\r\n */\r\n\r\nimport type { SparkRippleOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\n\r\nconst defaultOptions: Partial<SparkRippleOptions> = {\r\n duration: 600,\r\n color: 'rgba(255, 255, 255, 0.3)',\r\n trigger: 'click',\r\n}\r\n\r\nexport function ripple(options?: SparkRippleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions)\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'spark-effect spark-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n })\r\n\r\n const createRipple = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const size = Math.max(rect.width, rect.height) * 2\r\n\r\n const rippleEl = document.createElement('span')\r\n rippleEl.className = 'spark-ripple'\r\n rippleEl.style.cssText = `\r\n width: ${size}px;\r\n height: ${size}px;\r\n left: ${e.clientX - rect.left - size / 2}px;\r\n top: ${e.clientY - rect.top - size / 2}px;\r\n background: ${opts.color};\r\n `\r\n\r\n // Ensure positioned container\r\n if (getComputedStyle(target).position === 'static') {\r\n target.style.position = 'relative'\r\n }\r\n target.style.overflow = 'hidden'\r\n\r\n target.appendChild(rippleEl)\r\n\r\n setTimeout(() => {\r\n rippleEl.remove()\r\n }, opts.duration)\r\n }\r\n\r\n return {\r\n className: 'spark-effect spark-ripple-container',\r\n style: cssVars,\r\n onClick: createRipple,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Magnetic effect for cursor-following elements\r\n */\r\n\r\nimport type { SparkMagneticOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, injectBaseStyles } from '../../core/engine'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkMagneticOptions> = {\r\n strength: 0.5,\r\n distance: 100,\r\n trigger: 'move',\r\n}\r\n\r\nexport function magnetic(options?: SparkMagneticOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkMagneticOptions>\r\n\r\n injectBaseStyles()\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-magnetic'),\r\n onMouseMove: (e: any) => {\r\n if (opts.trigger === 'move') {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n const relX = e.clientX - centerX\r\n const relY = e.clientY - centerY\r\n const dist = Math.sqrt(relX * relX + relY * relY)\r\n\r\n if (dist < opts.distance) {\r\n const moveX = relX * opts.strength\r\n const moveY = relY * opts.strength\r\n target.style.transform = `translate(${moveX}px, ${moveY}px)`\r\n } else {\r\n target.style.transform = 'translate(0, 0)'\r\n }\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'translate(0, 0)'\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * 3D Tilt effect with optional glare\r\n */\r\n\r\nimport type { SparkTiltOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, injectBaseStyles } from '../../core/engine'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkTiltOptions> = {\r\n angle: 15,\r\n glare: true,\r\n perspective: 1000,\r\n trigger: 'move',\r\n}\r\n\r\nexport function tilt(options?: SparkTiltOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkTiltOptions>\r\n\r\n injectBaseStyles()\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-tilt'),\r\n onMouseMove: (e: any) => {\r\n if (opts.trigger === 'move') {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n\r\n const centerX = rect.width / 2\r\n const centerY = rect.height / 2\r\n\r\n const rotateY = ((x - centerX) / centerX) * opts.angle\r\n const rotateX = ((centerY - y) / centerY) * opts.angle\r\n\r\n target.style.transform = `perspective(${opts.perspective}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `perspective(${opts.perspective}px) rotateX(0deg) rotateY(0deg)`\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Elastic effect - Bouncy spring physics animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface ElasticOptions extends SparkBaseOptions {\r\n scale?: number\r\n bounces?: number\r\n}\r\n\r\nconst defaultOptions: Partial<ElasticOptions> = {\r\n trigger: 'hover',\r\n duration: 600,\r\n scale: 1.15,\r\n bounces: 3,\r\n}\r\n\r\nfunction injectElasticStyles() {\r\n if (document.getElementById('sparkfx-elastic-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-elastic-styles'\r\n style.textContent = `\r\n .sparkfx-elastic {\r\n transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n }\r\n \r\n .sparkfx-elastic-active {\r\n animation: sparkfx-elastic-bounce 0.6s ease-out;\r\n }\r\n \r\n @keyframes sparkfx-elastic-bounce {\r\n 0% { transform: scale(1); }\r\n 20% { transform: scale(var(--elastic-scale, 1.15)); }\r\n 40% { transform: scale(0.95); }\r\n 60% { transform: scale(1.05); }\r\n 80% { transform: scale(0.98); }\r\n 100% { transform: scale(1); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function elastic(options?: ElasticOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<ElasticOptions>\r\n\r\n injectBaseStyles()\r\n injectElasticStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const trigger = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.setProperty('--elastic-scale', String(opts.scale))\r\n target.classList.remove('sparkfx-elastic-active')\r\n void target.offsetWidth // Force reflow\r\n target.classList.add('sparkfx-elastic-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-elastic'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? trigger : undefined,\r\n onClick: opts.trigger === 'click' ? trigger : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Jelly effect - Soft wobble animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface JellyOptions extends SparkBaseOptions {\r\n intensity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<JellyOptions> = {\r\n trigger: 'hover',\r\n duration: 500,\r\n intensity: 1,\r\n}\r\n\r\nfunction injectJellyStyles() {\r\n if (document.getElementById('sparkfx-jelly-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-jelly-styles'\r\n style.textContent = `\r\n .sparkfx-jelly {\r\n transition: transform 0.1s ease-out;\r\n }\r\n \r\n .sparkfx-jelly-active {\r\n animation: sparkfx-jelly-wobble 0.5s ease-out;\r\n }\r\n \r\n @keyframes sparkfx-jelly-wobble {\r\n 0% { transform: scale(1, 1); }\r\n 15% { transform: scale(1.1, 0.9); }\r\n 30% { transform: scale(0.9, 1.1); }\r\n 45% { transform: scale(1.05, 0.95); }\r\n 60% { transform: scale(0.97, 1.03); }\r\n 75% { transform: scale(1.02, 0.98); }\r\n 100% { transform: scale(1, 1); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function jelly(options?: JellyOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<JellyOptions>\r\n\r\n injectBaseStyles()\r\n injectJellyStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const trigger = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-jelly-active')\r\n void target.offsetWidth\r\n target.classList.add('sparkfx-jelly-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-jelly'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? trigger : undefined,\r\n onClick: opts.trigger === 'click' ? trigger : undefined,\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function rubber(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'click' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-rubber'),\r\n style: generateCSSVars(opts)\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function morph(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-morph'),\r\n style: generateCSSVars(opts)\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Cyberpunk glitch effect with offset colors\r\n */\r\n\r\nimport type { SparkGlitchOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlitchOptions> = {\r\n duration: 300,\r\n color1: '#ff0055',\r\n color2: '#00d4ff',\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function glitch(options?: SparkGlitchOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlitchOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glitch'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-glitch-color1': opts.color1,\r\n '--sparkfx-glitch-color2': opts.color2,\r\n position: 'relative',\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Blur effect - Dynamic focus/blur transition\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface BlurOptions extends SparkBaseOptions {\r\n amount?: number\r\n scale?: number\r\n}\r\n\r\nconst defaultOptions: Partial<BlurOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n amount: 8,\r\n scale: 1.02,\r\n}\r\n\r\nexport function blur(options?: BlurOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<BlurOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const baseStyle = {\r\n ...generateCSSVars(opts),\r\n transition: `filter var(--sparkfx-duration) var(--sparkfx-easing), transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n filter: `blur(${opts.amount}px)`,\r\n transform: 'scale(0.98)',\r\n }\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.filter = 'blur(0)'\r\n target.style.transform = `scale(${opts.scale})`\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.filter = `blur(${opts.amount}px)`\r\n target.style.transform = 'scale(0.98)'\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-blur'),\r\n style: baseStyle,\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Neon glow effect for vibrant UI\r\n */\r\n\r\nimport type { SparkGlowOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlowOptions> = {\r\n duration: 300,\r\n color: '#00d4ff',\r\n spread: 20,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function neon(options?: SparkGlowOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlowOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const spread = applyIntensity(opts.spread, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-neon'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-neon-color': opts.color,\r\n '--sparkfx-neon-spread': `${spread}px`,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Glassmorphism effect with backdrop blur\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 300,\r\n trigger: 'always',\r\n}\r\n\r\nexport function glass(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glass'),\r\n style: {\r\n ...cssVars,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Subtle light sweep animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 1500,\r\n trigger: 'always',\r\n}\r\n\r\nexport function shimmer(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: 'linear',\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-shimmer'),\r\n style: {\r\n ...cssVars,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Gradient effect - Animated color gradient cycling\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface GradientOptions extends SparkBaseOptions {\r\n colors?: string[]\r\n speed?: number\r\n angle?: number\r\n}\r\n\r\nconst defaultOptions: Partial<GradientOptions> = {\r\n trigger: 'always',\r\n duration: 3000,\r\n colors: ['#ff0080', '#7928ca', '#0070f3', '#00d4ff'],\r\n speed: 3,\r\n angle: 45,\r\n}\r\n\r\nfunction injectGradientStyles() {\r\n if (document.getElementById('sparkfx-gradient-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-gradient-styles'\r\n style.textContent = `\r\n .sparkfx-gradient {\r\n background-size: 300% 300%;\r\n animation: sparkfx-gradient-shift var(--gradient-speed, 3s) ease infinite;\r\n }\r\n \r\n @keyframes sparkfx-gradient-shift {\r\n 0% { background-position: 0% 50%; }\r\n 50% { background-position: 100% 50%; }\r\n 100% { background-position: 0% 50%; }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function gradient(options?: GradientOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<GradientOptions>\r\n\r\n injectBaseStyles()\r\n injectGradientStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const gradientValue = `linear-gradient(${opts.angle}deg, ${opts.colors.join(', ')})`\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-gradient'),\r\n style: {\r\n ...generateCSSVars(opts),\r\n background: gradientValue,\r\n '--gradient-speed': `${opts.speed}s`,\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n backgroundClip: 'text',\r\n } as Record<string, string | number>,\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function spotlight(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-spotlight'),\r\n onMouseMove: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n target.style.setProperty('--sparkfx-spotlight-x', `${x}px`)\r\n target.style.setProperty('--sparkfx-spotlight-y', `${y}px`)\r\n }\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Hologram effect - Futuristic RGB shift and scanlines\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface HologramOptions extends SparkBaseOptions {\r\n intensity?: number\r\n scanlineOpacity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<HologramOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n intensity: 1,\r\n scanlineOpacity: 0.1,\r\n}\r\n\r\nfunction injectHologramStyles() {\r\n if (document.getElementById('sparkfx-hologram-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-hologram-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-hologram-flicker {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.95; }\r\n 25%, 75% { opacity: 0.98; }\r\n }\r\n \r\n @keyframes sparkfx-hologram-scanline {\r\n 0% { transform: translateY(-100%); }\r\n 100% { transform: translateY(100%); }\r\n }\r\n \r\n .sparkfx-hologram {\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n \r\n .sparkfx-hologram::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: repeating-linear-gradient(\r\n 0deg,\r\n transparent,\r\n transparent 2px,\r\n rgba(0, 255, 255, 0.03) 2px,\r\n rgba(0, 255, 255, 0.03) 4px\r\n );\r\n pointer-events: none;\r\n z-index: 10;\r\n }\r\n \r\n .sparkfx-hologram-active {\r\n animation: sparkfx-hologram-flicker 0.15s infinite;\r\n text-shadow: \r\n 2px 0 rgba(255, 0, 0, 0.5),\r\n -2px 0 rgba(0, 255, 255, 0.5);\r\n filter: brightness(1.1) contrast(1.05);\r\n }\r\n \r\n .sparkfx-hologram-scanline {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 8px;\r\n background: linear-gradient(\r\n 180deg,\r\n transparent,\r\n rgba(0, 255, 255, 0.15),\r\n transparent\r\n );\r\n pointer-events: none;\r\n z-index: 11;\r\n animation: sparkfx-hologram-scanline 2s linear infinite;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function hologram(options?: HologramOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<HologramOptions>\r\n\r\n injectBaseStyles()\r\n injectHologramStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let scanlineElement: HTMLElement | null = null\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.add('sparkfx-hologram-active')\r\n\r\n if (!scanlineElement) {\r\n scanlineElement = document.createElement('span')\r\n scanlineElement.className = 'sparkfx-hologram-scanline'\r\n target.appendChild(scanlineElement)\r\n }\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-hologram-active')\r\n\r\n if (scanlineElement) {\r\n scanlineElement.remove()\r\n scanlineElement = null\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-hologram'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * Aurora Effect\r\n * Northern lights style color wave animation\r\n * \r\n * @module effects/visual/aurora\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkAuroraOptions extends SparkBaseOptions {\r\n /** Aurora colors. Default: ['#00ffa3', '#00d4ff', '#a855f7'] */\r\n colors?: string[]\r\n\r\n /** Animation duration in ms. Default: 8000 */\r\n duration?: number\r\n\r\n /** Animation type: 'background' | 'border' | 'text'. Default: 'background' */\r\n type?: 'background' | 'border' | 'text'\r\n\r\n /** Blur intensity. Default: 40 */\r\n blur?: number\r\n\r\n /** Opacity of the aurora effect. Default: 0.6 */\r\n opacity?: number\r\n\r\n /** Movement style: 'wave' | 'pulse' | 'drift'. Default: 'wave' */\r\n movement?: 'wave' | 'pulse' | 'drift'\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst AURORA_DEFAULTS: Partial<SparkAuroraOptions> = {\r\n colors: ['#00ffa3', '#00d4ff', '#a855f7'],\r\n duration: 8000,\r\n type: 'background',\r\n blur: 40,\r\n opacity: 0.6,\r\n movement: 'wave',\r\n}\r\n\r\n// ============================================================================\r\n// AURORA EFFECT\r\n// ============================================================================\r\n\r\nexport function aurora(options?: SparkAuroraOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, AURORA_DEFAULTS) as Required<SparkAuroraOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-aurora-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('aurora')\r\n const keyframes = buildAuroraKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectAuroraStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n })\r\n}\r\n\r\nfunction buildAuroraKeyframes(options: Required<SparkAuroraOptions>): string {\r\n const { movement } = options\r\n\r\n switch (movement) {\r\n case 'wave':\r\n return `\r\n 0% { background-position: 0% 50%; }\r\n 25% { background-position: 50% 100%; }\r\n 50% { background-position: 100% 50%; }\r\n 75% { background-position: 50% 0%; }\r\n 100% { background-position: 0% 50%; }\r\n `\r\n case 'pulse':\r\n return `\r\n 0% { background-size: 200% 200%; opacity: 0.5; }\r\n 50% { background-size: 300% 300%; opacity: 0.8; }\r\n 100% { background-size: 200% 200%; opacity: 0.5; }\r\n `\r\n case 'drift':\r\n return `\r\n 0% { background-position: 0% 0%; filter: hue-rotate(0deg); }\r\n 33% { background-position: 100% 50%; filter: hue-rotate(60deg); }\r\n 66% { background-position: 50% 100%; filter: hue-rotate(-60deg); }\r\n 100% { background-position: 0% 0%; filter: hue-rotate(0deg); }\r\n `\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nfunction injectAuroraStyles(animationId: string, options: Required<SparkAuroraOptions>): string {\r\n if (!isBrowser()) return `spark-aurora-${animationId}`\r\n\r\n const className = `spark-aurora-${animationId}`\r\n const styleId = `spark-aurora-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const gradient = `linear-gradient(135deg, ${options.colors.join(', ')})`\r\n\r\n let effectStyles = ''\r\n\r\n switch (options.type) {\r\n case 'background':\r\n effectStyles = `\r\n background: ${gradient};\r\n background-size: 400% 400%;\r\n `\r\n break\r\n case 'border':\r\n effectStyles = `\r\n border: 3px solid transparent;\r\n background-image: linear-gradient(var(--spark-bg, #0a0a0c), var(--spark-bg, #0a0a0c)), ${gradient};\r\n background-origin: border-box;\r\n background-clip: padding-box, border-box;\r\n background-size: 100% 100%, 400% 400%;\r\n `\r\n break\r\n case 'text':\r\n effectStyles = `\r\n background: ${gradient};\r\n background-size: 400% 400%;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n `\r\n break\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n position: relative;\r\n ${effectStyles}\r\n animation: ${animationId} ${options.duration}ms ease infinite;\r\n}\r\n\r\n/* Aurora glow overlay for background type */\r\n${options.type === 'background' ? `\r\n.${className}::before {\r\n content: '';\r\n position: absolute;\r\n inset: -${options.blur}px;\r\n background: inherit;\r\n filter: blur(${options.blur}px);\r\n opacity: ${options.opacity};\r\n z-index: -1;\r\n animation: inherit;\r\n}\r\n` : ''}\r\n\r\n.spark-aurora-static {\r\n background: ${options.colors[0]};\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n .${className}::before {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default aurora\r\n","/**\r\n * Matrix Effect\r\n * Digital rain effect like The Matrix movie\r\n * \r\n * @module effects/visual/matrix\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId, random, randomInt } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkMatrixOptions extends SparkBaseOptions {\r\n /** Rain color. Default: '#00ff00' */\r\n color?: string\r\n\r\n /** Number of columns. Default: 'auto' (based on container width) */\r\n columns?: number | 'auto'\r\n\r\n /** Animation speed (1-10). Default: 5 */\r\n speed?: number\r\n\r\n /** Character set to use. Default: 'katakana' */\r\n charset?: 'katakana' | 'binary' | 'hex' | 'custom'\r\n\r\n /** Custom characters (when charset is 'custom'). Default: undefined */\r\n customChars?: string\r\n\r\n /** Opacity of falling characters. Default: 0.8 */\r\n opacity?: number\r\n\r\n /** Font size in pixels. Default: 14 */\r\n fontSize?: number\r\n\r\n /** Glow effect. Default: true */\r\n glow?: boolean\r\n\r\n /** Auto-start animation. Default: true */\r\n autoStart?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MATRIX_DEFAULTS: Partial<SparkMatrixOptions> = {\r\n color: '#00ff00',\r\n columns: 'auto',\r\n speed: 5,\r\n charset: 'katakana',\r\n opacity: 0.8,\r\n fontSize: 14,\r\n glow: true,\r\n autoStart: true,\r\n}\r\n\r\nconst CHARSETS = {\r\n katakana: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン',\r\n binary: '01',\r\n hex: '0123456789ABCDEF',\r\n}\r\n\r\n// ============================================================================\r\n// MATRIX EFFECT\r\n// ============================================================================\r\n\r\nexport function matrix(options?: SparkMatrixOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, MATRIX_DEFAULTS) as Required<SparkMatrixOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-matrix-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('matrix')\r\n const className = `spark-matrix-${animationId}`\r\n\r\n // Inject base styles\r\n injectMatrixStyles(className, merged)\r\n\r\n // Create and manage canvas\r\n let canvas: HTMLCanvasElement | null = null\r\n let ctx: CanvasRenderingContext2D | null = null\r\n let animationFrame: number | null = null\r\n let columns: number[] = []\r\n let initialized = false\r\n\r\n const getCharset = (): string => {\r\n if (merged.charset === 'custom' && merged.customChars) {\r\n return merged.customChars\r\n }\r\n return CHARSETS[merged.charset as keyof typeof CHARSETS] || CHARSETS.katakana\r\n }\r\n\r\n const initCanvas = (container: HTMLElement) => {\r\n if (initialized) return\r\n\r\n canvas = document.createElement('canvas')\r\n canvas.className = `${className}-canvas`\r\n canvas.style.cssText = `\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 0;\r\n `\r\n\r\n container.style.position = 'relative'\r\n container.insertBefore(canvas, container.firstChild)\r\n\r\n ctx = canvas.getContext('2d')\r\n\r\n resizeCanvas(container)\r\n initialized = true\r\n\r\n if (merged.autoStart) {\r\n startAnimation()\r\n }\r\n }\r\n\r\n const resizeCanvas = (container: HTMLElement) => {\r\n if (!canvas || !ctx) return\r\n\r\n const rect = container.getBoundingClientRect()\r\n canvas.width = rect.width\r\n canvas.height = rect.height\r\n\r\n // Initialize columns\r\n const numColumns = merged.columns === 'auto'\r\n ? Math.floor(canvas.width / merged.fontSize)\r\n : merged.columns\r\n\r\n columns = Array(numColumns).fill(1).map(() => randomInt(0, canvas!.height / merged.fontSize))\r\n }\r\n\r\n const draw = () => {\r\n if (!canvas || !ctx) return\r\n\r\n const charset = getCharset()\r\n\r\n // Fade effect\r\n ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Draw characters\r\n ctx.fillStyle = merged.color\r\n ctx.font = `${merged.fontSize}px monospace`\r\n\r\n if (merged.glow) {\r\n ctx.shadowBlur = 8\r\n ctx.shadowColor = merged.color\r\n }\r\n\r\n columns.forEach((y, i) => {\r\n const char = charset[randomInt(0, charset.length - 1)]\r\n const x = i * merged.fontSize\r\n\r\n // Random opacity for flickering effect\r\n ctx!.globalAlpha = random(0.5, merged.opacity)\r\n ctx!.fillText(char, x, y * merged.fontSize)\r\n\r\n // Reset column when it reaches bottom (with random chance)\r\n if (y * merged.fontSize > canvas!.height && Math.random() > 0.975) {\r\n columns[i] = 0\r\n }\r\n\r\n columns[i]++\r\n })\r\n\r\n ctx.globalAlpha = 1\r\n }\r\n\r\n const startAnimation = () => {\r\n const speed = 11 - merged.speed // Invert so higher = faster\r\n let lastTime = 0\r\n\r\n const animate = (time: number) => {\r\n if (time - lastTime > speed * 10) {\r\n draw()\r\n lastTime = time\r\n }\r\n animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n const stopAnimation = () => {\r\n if (animationFrame) {\r\n cancelAnimationFrame(animationFrame)\r\n animationFrame = null\r\n }\r\n }\r\n\r\n const cleanup = () => {\r\n stopAnimation()\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas)\r\n }\r\n canvas = null\r\n ctx = null\r\n initialized = false\r\n }\r\n\r\n // Mouse enter handler to initialize\r\n const onMouseEnter = (event: MouseEvent) => {\r\n const target = event.currentTarget as HTMLElement\r\n initCanvas(target)\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n onMouseEnter,\r\n cleanup,\r\n })\r\n}\r\n\r\nfunction injectMatrixStyles(className: string, options: Required<SparkMatrixOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-matrix-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.${className} > *:not(.${className}-canvas) {\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.spark-matrix-static {\r\n /* Fallback styles */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className}-canvas {\r\n display: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default matrix\r\n","/**\r\n * Rainbow Effect\r\n * Animated rainbow gradient cycling\r\n * \r\n * @module effects/visual/rainbow\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkRainbowOptions extends SparkBaseOptions {\r\n /** Animation duration in ms. Default: 3000 */\r\n duration?: number\r\n\r\n /** Apply to: 'background' | 'border' | 'text' | 'shadow'. Default: 'background' */\r\n type?: 'background' | 'border' | 'text' | 'shadow'\r\n\r\n /** Rotation style: 'smooth' | 'stepped'. Default: 'smooth' */\r\n style?: 'smooth' | 'stepped'\r\n\r\n /** Saturation (0-100). Default: 100 */\r\n saturation?: number\r\n\r\n /** Lightness (0-100). Default: 50 */\r\n lightness?: number\r\n\r\n /** Angle of gradient in degrees. Default: 90 */\r\n angle?: number\r\n\r\n /** Pause on hover. Default: false */\r\n pauseOnHover?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst RAINBOW_DEFAULTS: Partial<SparkRainbowOptions> = {\r\n duration: 3000,\r\n type: 'background',\r\n style: 'smooth',\r\n saturation: 100,\r\n lightness: 50,\r\n angle: 90,\r\n pauseOnHover: false,\r\n}\r\n\r\n// ============================================================================\r\n// RAINBOW EFFECT\r\n// ============================================================================\r\n\r\nexport function rainbow(options?: SparkRainbowOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, RAINBOW_DEFAULTS) as Required<SparkRainbowOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-rainbow-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('rainbow')\r\n const keyframes = buildRainbowKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectRainbowStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n })\r\n}\r\n\r\nfunction buildRainbowKeyframes(options: Required<SparkRainbowOptions>): string {\r\n const { style, saturation, lightness, type } = options\r\n\r\n if (style === 'stepped') {\r\n // Stepped through distinct colors\r\n const colors = [\r\n `hsl(0, ${saturation}%, ${lightness}%)`, // Red\r\n `hsl(30, ${saturation}%, ${lightness}%)`, // Orange\r\n `hsl(60, ${saturation}%, ${lightness}%)`, // Yellow\r\n `hsl(120, ${saturation}%, ${lightness}%)`, // Green\r\n `hsl(180, ${saturation}%, ${lightness}%)`, // Cyan\r\n `hsl(240, ${saturation}%, ${lightness}%)`, // Blue\r\n `hsl(300, ${saturation}%, ${lightness}%)`, // Magenta\r\n ]\r\n\r\n let keyframes = ''\r\n colors.forEach((color, i) => {\r\n const percent = (i / colors.length) * 100\r\n keyframes += `${percent}% { ${getColorProperty(type, color)} }\\n`\r\n })\r\n keyframes += `100% { ${getColorProperty(type, colors[0])} }`\r\n\r\n return keyframes\r\n }\r\n\r\n // Smooth hue rotation\r\n return `\r\n 0% { filter: hue-rotate(0deg); }\r\n 100% { filter: hue-rotate(360deg); }\r\n `\r\n}\r\n\r\nfunction getColorProperty(type: string, color: string): string {\r\n switch (type) {\r\n case 'background':\r\n return `background-color: ${color};`\r\n case 'border':\r\n return `border-color: ${color};`\r\n case 'text':\r\n return `color: ${color};`\r\n case 'shadow':\r\n return `box-shadow: 0 0 20px ${color}, 0 0 40px ${color};`\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nfunction injectRainbowStyles(animationId: string, options: Required<SparkRainbowOptions>): string {\r\n if (!isBrowser()) return `spark-rainbow-${animationId}`\r\n\r\n const className = `spark-rainbow-${animationId}`\r\n const styleId = `spark-rainbow-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const { type, angle, saturation, lightness, style } = options\r\n\r\n // Base gradient for smooth style\r\n const rainbowGradient = `linear-gradient(\r\n ${angle}deg,\r\n hsl(0, ${saturation}%, ${lightness}%),\r\n hsl(60, ${saturation}%, ${lightness}%),\r\n hsl(120, ${saturation}%, ${lightness}%),\r\n hsl(180, ${saturation}%, ${lightness}%),\r\n hsl(240, ${saturation}%, ${lightness}%),\r\n hsl(300, ${saturation}%, ${lightness}%),\r\n hsl(360, ${saturation}%, ${lightness}%)\r\n )`\r\n\r\n let typeStyles = ''\r\n\r\n if (style === 'smooth') {\r\n switch (type) {\r\n case 'background':\r\n typeStyles = `\r\n background: ${rainbowGradient};\r\n background-size: 200% 200%;\r\n `\r\n break\r\n case 'border':\r\n typeStyles = `\r\n border: 3px solid;\r\n border-image: ${rainbowGradient} 1;\r\n `\r\n break\r\n case 'text':\r\n typeStyles = `\r\n background: ${rainbowGradient};\r\n background-size: 200% 200%;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n `\r\n break\r\n case 'shadow':\r\n typeStyles = `\r\n box-shadow: 0 0 20px hsl(0, ${saturation}%, ${lightness}%);\r\n `\r\n break\r\n }\r\n }\r\n\r\n const stylesheet = document.createElement('style')\r\n stylesheet.id = styleId\r\n stylesheet.textContent = `\r\n.${className} {\r\n ${typeStyles}\r\n animation: ${animationId} ${options.duration}ms linear infinite;\r\n}\r\n\r\n${options.pauseOnHover ? `\r\n.${className}:hover {\r\n animation-play-state: paused;\r\n}\r\n` : ''}\r\n\r\n.spark-rainbow-static {\r\n background: linear-gradient(${angle}deg, red, orange, yellow, green, blue, indigo, violet);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n filter: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(stylesheet)\r\n\r\n return className\r\n}\r\n\r\nexport default rainbow\r\n","/**\r\n * Parallax Effect\r\n * Creates depth illusion based on scroll or mouse position\r\n * \r\n * @module effects/motion/parallax\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { configManager } from '../../core/config'\r\nimport { throttle, clamp, isBrowser, mapRange } from '../../core/utils'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkParallaxOptions extends SparkBaseOptions {\r\n /** Parallax depth/intensity (0-1). Higher = more movement. Default: 0.5 */\r\n depth?: number\r\n\r\n /** Direction of movement: 'vertical' | 'horizontal' | 'both'. Default: 'vertical' */\r\n direction?: 'vertical' | 'horizontal' | 'both'\r\n\r\n /** Trigger type: 'scroll' | 'mouse'. Default: 'scroll' */\r\n trigger?: 'scroll' | 'mouse'\r\n\r\n /** Reverse direction. Default: false */\r\n reverse?: boolean\r\n\r\n /** Smooth factor (higher = smoother). Default: 10 */\r\n smoothness?: number\r\n\r\n /** Maximum offset in pixels. Default: 100 */\r\n maxOffset?: number\r\n\r\n /** Use 3D transforms for GPU acceleration. Default: true */\r\n use3D?: boolean\r\n}\r\n\r\ninterface ParallaxState {\r\n currentX: number\r\n currentY: number\r\n targetX: number\r\n targetY: number\r\n animationFrame: number | null\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst PARALLAX_DEFAULTS: Partial<SparkParallaxOptions> = {\r\n depth: 0.5,\r\n direction: 'vertical',\r\n trigger: 'scroll',\r\n reverse: false,\r\n smoothness: 10,\r\n maxOffset: 100,\r\n use3D: true,\r\n}\r\n\r\n// ============================================================================\r\n// PARALLAX EFFECT\r\n// ============================================================================\r\n\r\nexport function parallax(options?: SparkParallaxOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, PARALLAX_DEFAULTS) as Required<SparkParallaxOptions>\r\n const config = configManager.get()\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-parallax-static',\r\n })\r\n }\r\n\r\n // State for each element\r\n const stateMap = new WeakMap<Element, ParallaxState>()\r\n\r\n // Generate unique class name\r\n const className = `spark-parallax-${Date.now().toString(36)}`\r\n\r\n // Inject base styles\r\n injectParallaxStyles(className, merged)\r\n\r\n // Scroll handler for scroll-based parallax\r\n const handleScroll = throttle(() => {\r\n if (!isBrowser()) return\r\n\r\n const elements = document.querySelectorAll(`.${className}`)\r\n const scrollY = window.scrollY\r\n const windowHeight = window.innerHeight\r\n\r\n elements.forEach((element) => {\r\n const el = element as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n const elementCenter = rect.top + rect.height / 2\r\n const viewportCenter = windowHeight / 2\r\n\r\n // Calculate progress (-1 to 1, 0 when centered)\r\n const progress = (elementCenter - viewportCenter) / windowHeight\r\n const clampedProgress = clamp(progress, -1, 1)\r\n\r\n // Calculate offset\r\n const direction = merged.reverse ? -1 : 1\r\n const offset = clampedProgress * merged.maxOffset * merged.depth * direction\r\n\r\n // Get or create state\r\n let state = stateMap.get(el)\r\n if (!state) {\r\n state = { currentX: 0, currentY: 0, targetX: 0, targetY: 0, animationFrame: null }\r\n stateMap.set(el, state)\r\n }\r\n\r\n // Set target based on direction\r\n if (merged.direction === 'vertical' || merged.direction === 'both') {\r\n state.targetY = offset\r\n }\r\n if (merged.direction === 'horizontal' || merged.direction === 'both') {\r\n state.targetX = offset * 0.5 // Less horizontal movement\r\n }\r\n\r\n // Start smooth animation\r\n animateParallax(el, state, merged)\r\n })\r\n }, 16) // ~60fps\r\n\r\n // Mouse handler for mouse-based parallax\r\n const handleMouseMove = throttle((event: MouseEvent) => {\r\n if (!isBrowser()) return\r\n\r\n const elements = document.querySelectorAll(`.${className}`)\r\n const { clientX, clientY } = event\r\n const windowWidth = window.innerWidth\r\n const windowHeight = window.innerHeight\r\n\r\n // Map mouse position to -1 to 1 range\r\n const normalizedX = mapRange(clientX, 0, windowWidth, -1, 1)\r\n const normalizedY = mapRange(clientY, 0, windowHeight, -1, 1)\r\n\r\n elements.forEach((element) => {\r\n const el = element as HTMLElement\r\n\r\n // Get or create state\r\n let state = stateMap.get(el)\r\n if (!state) {\r\n state = { currentX: 0, currentY: 0, targetX: 0, targetY: 0, animationFrame: null }\r\n stateMap.set(el, state)\r\n }\r\n\r\n const direction = merged.reverse ? -1 : 1\r\n const offsetX = normalizedX * merged.maxOffset * merged.depth * direction\r\n const offsetY = normalizedY * merged.maxOffset * merged.depth * direction\r\n\r\n // Set targets based on direction\r\n if (merged.direction === 'horizontal' || merged.direction === 'both') {\r\n state.targetX = offsetX\r\n }\r\n if (merged.direction === 'vertical' || merged.direction === 'both') {\r\n state.targetY = offsetY\r\n }\r\n\r\n // Start smooth animation\r\n animateParallax(el, state, merged)\r\n })\r\n }, 16)\r\n\r\n // Animation loop for smooth parallax\r\n function animateParallax(\r\n element: HTMLElement,\r\n state: ParallaxState,\r\n opts: Required<SparkParallaxOptions>\r\n ): void {\r\n // Cancel existing animation\r\n if (state.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n\r\n const animate = () => {\r\n // Smooth interpolation\r\n const ease = 1 / opts.smoothness\r\n state.currentX += (state.targetX - state.currentX) * ease\r\n state.currentY += (state.targetY - state.currentY) * ease\r\n\r\n // Apply transform\r\n const x = Math.round(state.currentX * 100) / 100\r\n const y = Math.round(state.currentY * 100) / 100\r\n\r\n if (opts.use3D) {\r\n element.style.transform = `translate3d(${x}px, ${y}px, 0)`\r\n } else {\r\n element.style.transform = `translate(${x}px, ${y}px)`\r\n }\r\n\r\n // Continue animation if not settled\r\n const threshold = 0.01\r\n if (\r\n Math.abs(state.targetX - state.currentX) > threshold ||\r\n Math.abs(state.targetY - state.currentY) > threshold\r\n ) {\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n }\r\n\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n // Setup event listeners based on trigger type\r\n if (isBrowser()) {\r\n if (merged.trigger === 'scroll') {\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n // Initial calculation\r\n requestAnimationFrame(() => handleScroll())\r\n } else if (merged.trigger === 'mouse') {\r\n window.addEventListener('mousemove', handleMouseMove, { passive: true })\r\n }\r\n }\r\n\r\n // Cleanup function\r\n const cleanup = () => {\r\n if (isBrowser()) {\r\n window.removeEventListener('scroll', handleScroll as EventListener)\r\n window.removeEventListener('mousemove', handleMouseMove as EventListener)\r\n }\r\n\r\n // Clean up animation frames\r\n const elements = document.querySelectorAll(`.${className}`)\r\n elements.forEach((element) => {\r\n const state = stateMap.get(element)\r\n if (state?.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: config.gpuAcceleration ? 'transform' : 'auto',\r\n },\r\n cleanup,\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectParallaxStyles(className: string, options: Required<SparkParallaxOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-parallax-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n transform-style: preserve-3d;\r\n}\r\n\r\n.spark-parallax-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n transform: none !important;\r\n will-change: auto;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default parallax\r\n","/**\r\n * Float Effect\r\n * Gentle floating animation like an object in water or air\r\n * \r\n * @module effects/motion/float\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkFloatOptions extends SparkBaseOptions {\r\n /** Float distance in pixels. Default: 10 */\r\n distance?: number\r\n\r\n /** Animation duration in ms. Default: 3000 */\r\n duration?: number\r\n\r\n /** Direction: 'vertical' | 'horizontal' | 'diagonal'. Default: 'vertical' */\r\n direction?: 'vertical' | 'horizontal' | 'diagonal'\r\n\r\n /** Add subtle rotation. Default: true */\r\n rotate?: boolean\r\n\r\n /** Rotation angle in degrees. Default: 3 */\r\n rotateAngle?: number\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Add subtle scale variation. Default: false */\r\n scale?: boolean\r\n\r\n /** Scale amount (0-1). Default: 0.02 */\r\n scaleAmount?: number\r\n\r\n /** Random delay offset for multiple elements. Default: false */\r\n randomDelay?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst FLOAT_DEFAULTS: Partial<SparkFloatOptions> = {\r\n distance: 10,\r\n duration: 3000,\r\n direction: 'vertical',\r\n rotate: true,\r\n rotateAngle: 3,\r\n easing: 'ease-in-out',\r\n scale: false,\r\n scaleAmount: 0.02,\r\n randomDelay: false,\r\n}\r\n\r\n// ============================================================================\r\n// FLOAT EFFECT\r\n// ============================================================================\r\n\r\nexport function float(options?: SparkFloatOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, FLOAT_DEFAULTS) as Required<SparkFloatOptions>\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-float-static',\r\n })\r\n }\r\n\r\n // Generate unique animation name\r\n const animationId = generateAnimationId('float')\r\n\r\n // Build keyframes based on options\r\n const keyframes = buildFloatKeyframes(merged)\r\n\r\n // Inject animation\r\n injectAnimation(animationId, keyframes)\r\n\r\n // Inject styles\r\n const className = injectFloatStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: 'transform',\r\n animationDelay: merged.randomDelay ? `${Math.random() * 1000}ms` : '0ms',\r\n },\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// KEYFRAME GENERATION\r\n// ============================================================================\r\n\r\nfunction buildFloatKeyframes(options: Required<SparkFloatOptions>): string {\r\n const { distance, direction, rotate, rotateAngle, scale, scaleAmount } = options\r\n\r\n // Calculate movement based on direction\r\n let transform0 = ''\r\n let transform50 = ''\r\n let transform100 = ''\r\n\r\n switch (direction) {\r\n case 'vertical':\r\n transform0 = `translateY(0)`\r\n transform50 = `translateY(-${distance}px)`\r\n transform100 = `translateY(0)`\r\n break\r\n case 'horizontal':\r\n transform0 = `translateX(0)`\r\n transform50 = `translateX(${distance}px)`\r\n transform100 = `translateX(0)`\r\n break\r\n case 'diagonal':\r\n transform0 = `translate(0, 0)`\r\n transform50 = `translate(${distance * 0.7}px, -${distance}px)`\r\n transform100 = `translate(0, 0)`\r\n break\r\n }\r\n\r\n // Add rotation if enabled\r\n if (rotate) {\r\n transform0 += ` rotate(0deg)`\r\n transform50 += ` rotate(${rotateAngle}deg)`\r\n transform100 += ` rotate(0deg)`\r\n }\r\n\r\n // Add scale if enabled\r\n if (scale) {\r\n const scaleUp = 1 + scaleAmount\r\n transform0 += ` scale(1)`\r\n transform50 += ` scale(${scaleUp})`\r\n transform100 += ` scale(1)`\r\n }\r\n\r\n return `\r\n 0% {\r\n transform: ${transform0};\r\n }\r\n 50% {\r\n transform: ${transform50};\r\n }\r\n 100% {\r\n transform: ${transform100};\r\n }\r\n `\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectFloatStyles(animationId: string, options: Required<SparkFloatOptions>): string {\r\n if (!isBrowser()) return `spark-float-${animationId}`\r\n\r\n const className = `spark-float-${animationId}`\r\n const styleId = `spark-float-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} infinite;\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n.spark-float-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default float\r\n","/**\r\n * Flip3D Effect\r\n * 3D card flip animation on hover or click\r\n * \r\n * @module effects/motion/flip3d\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkFlip3DOptions extends SparkBaseOptions {\r\n /** Flip direction: 'horizontal' | 'vertical'. Default: 'horizontal' */\r\n direction?: 'horizontal' | 'vertical'\r\n\r\n /** Animation duration in ms. Default: 600 */\r\n duration?: number\r\n\r\n /** Perspective distance in pixels. Default: 1000 */\r\n perspective?: number\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Trigger: 'hover' | 'click'. Default: 'hover' */\r\n trigger?: 'hover' | 'click'\r\n\r\n /** Flip angle in degrees. Default: 180 */\r\n angle?: number\r\n\r\n /** Add shadow during flip. Default: true */\r\n shadow?: boolean\r\n\r\n /** Scale during flip for 3D depth. Default: 1.05 */\r\n midScale?: number\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst FLIP3D_DEFAULTS: Partial<SparkFlip3DOptions> = {\r\n direction: 'horizontal',\r\n duration: 600,\r\n perspective: 1000,\r\n easing: 'ease-in-out',\r\n trigger: 'hover',\r\n angle: 180,\r\n shadow: true,\r\n midScale: 1.05,\r\n}\r\n\r\n// ============================================================================\r\n// FLIP3D EFFECT\r\n// ============================================================================\r\n\r\nexport function flip3d(options?: SparkFlip3DOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, FLIP3D_DEFAULTS) as Required<SparkFlip3DOptions>\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-flip3d-static',\r\n })\r\n }\r\n\r\n // Generate unique animation name\r\n const animationId = generateAnimationId('flip3d')\r\n const className = `spark-flip3d-${animationId}`\r\n\r\n // Inject styles\r\n injectFlip3DStyles(className, merged)\r\n\r\n // State for click trigger\r\n let isFlipped = false\r\n\r\n // Click handler\r\n const onClick = (event: MouseEvent) => {\r\n if (merged.trigger !== 'click') return\r\n\r\n const target = event.currentTarget as HTMLElement\r\n isFlipped = !isFlipped\r\n\r\n if (isFlipped) {\r\n target.classList.add(`${className}-flipped`)\r\n } else {\r\n target.classList.remove(`${className}-flipped`)\r\n }\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n onClick: merged.trigger === 'click' ? onClick : undefined,\r\n style: {\r\n perspective: `${merged.perspective}px`,\r\n transformStyle: 'preserve-3d',\r\n },\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectFlip3DStyles(className: string, options: Required<SparkFlip3DOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-flip3d-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const rotateAxis = options.direction === 'horizontal' ? 'Y' : 'X'\r\n const shadowStyle = options.shadow\r\n ? `box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);`\r\n : ''\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n perspective: ${options.perspective}px;\r\n transform-style: preserve-3d;\r\n transition: transform ${options.duration}ms ${options.easing};\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n/* Hover trigger */\r\n.${className}:hover {\r\n ${options.trigger === 'hover' ? `transform: rotate${rotateAxis}(${options.angle}deg);` : ''}\r\n}\r\n\r\n/* Click trigger - flipped state */\r\n.${className}-flipped {\r\n transform: rotate${rotateAxis}(${options.angle}deg);\r\n}\r\n\r\n/* Mid-flip enhancement */\r\n.${className}:hover,\r\n.${className}-flipped {\r\n ${shadowStyle}\r\n}\r\n\r\n/* For card with front and back faces */\r\n.${className} .spark-flip-front,\r\n.${className} .spark-flip-back {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n.${className} .spark-flip-back {\r\n transform: rotate${rotateAxis}(${options.angle}deg);\r\n}\r\n\r\n.spark-flip3d-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className},\r\n .${className}:hover,\r\n .${className}-flipped {\r\n transform: none !important;\r\n transition: opacity 200ms ease !important;\r\n }\r\n \r\n .${className}:hover,\r\n .${className}-flipped {\r\n opacity: 0.8;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default flip3d\r\n","/**\r\n * Swing Effect\r\n * Pendulum-like swinging animation\r\n * \r\n * @module effects/motion/swing\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkSwingOptions extends SparkBaseOptions {\r\n /** Maximum swing angle in degrees. Default: 15 */\r\n angle?: number\r\n\r\n /** Animation duration in ms. Default: 1000 */\r\n duration?: number\r\n\r\n /** Transform origin. Default: 'top center' */\r\n origin?: string\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Number of swings before stopping. -1 for infinite. Default: -1 */\r\n count?: number\r\n\r\n /** Damping effect (swings get smaller). Default: false */\r\n damping?: boolean\r\n\r\n /** Trigger: 'auto' | 'hover'. Default: 'auto' */\r\n trigger?: 'auto' | 'hover'\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst SWING_DEFAULTS: Partial<SparkSwingOptions> = {\r\n angle: 15,\r\n duration: 1000,\r\n origin: 'top center',\r\n easing: 'ease-in-out',\r\n count: -1,\r\n damping: false,\r\n trigger: 'auto',\r\n}\r\n\r\n// ============================================================================\r\n// SWING EFFECT\r\n// ============================================================================\r\n\r\nexport function swing(options?: SparkSwingOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, SWING_DEFAULTS) as Required<SparkSwingOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-swing-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('swing')\r\n const keyframes = buildSwingKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectSwingStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n transformOrigin: merged.origin,\r\n },\r\n })\r\n}\r\n\r\nfunction buildSwingKeyframes(options: Required<SparkSwingOptions>): string {\r\n const { angle, damping } = options\r\n\r\n if (damping) {\r\n // Damping: swings get smaller over time\r\n return `\r\n 0% { transform: rotate(0deg); }\r\n 10% { transform: rotate(${angle}deg); }\r\n 20% { transform: rotate(-${angle * 0.8}deg); }\r\n 30% { transform: rotate(${angle * 0.6}deg); }\r\n 40% { transform: rotate(-${angle * 0.4}deg); }\r\n 50% { transform: rotate(${angle * 0.2}deg); }\r\n 60% { transform: rotate(-${angle * 0.1}deg); }\r\n 100% { transform: rotate(0deg); }\r\n `\r\n }\r\n\r\n return `\r\n 0% { transform: rotate(0deg); }\r\n 25% { transform: rotate(${angle}deg); }\r\n 50% { transform: rotate(0deg); }\r\n 75% { transform: rotate(-${angle}deg); }\r\n 100% { transform: rotate(0deg); }\r\n `\r\n}\r\n\r\nfunction injectSwingStyles(animationId: string, options: Required<SparkSwingOptions>): string {\r\n if (!isBrowser()) return `spark-swing-${animationId}`\r\n\r\n const className = `spark-swing-${animationId}`\r\n const styleId = `spark-swing-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const iterationCount = options.count === -1 ? 'infinite' : options.count.toString()\r\n const animationPlayState = options.trigger === 'hover' ? 'paused' : 'running'\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} ${iterationCount};\r\n animation-play-state: ${animationPlayState};\r\n transform-origin: ${options.origin};\r\n will-change: transform;\r\n}\r\n\r\n${options.trigger === 'hover' ? `\r\n.${className}:hover {\r\n animation-play-state: running;\r\n}\r\n` : ''}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default swing\r\n","/**\r\n * Orbit Effect\r\n * Elements orbiting around a center point\r\n * \r\n * @module effects/motion/orbit\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkOrbitOptions extends SparkBaseOptions {\r\n /** Orbit radius in pixels. Default: 50 */\r\n radius?: number\r\n\r\n /** Animation duration in ms (one full rotation). Default: 4000 */\r\n duration?: number\r\n\r\n /** Direction: 'clockwise' | 'counterclockwise'. Default: 'clockwise' */\r\n direction?: 'clockwise' | 'counterclockwise'\r\n\r\n /** Easing function. Default: 'linear' */\r\n easing?: string\r\n\r\n /** Start angle in degrees. Default: 0 */\r\n startAngle?: number\r\n\r\n /** Elliptical orbit (x/y ratio). Default: 1 (circular) */\r\n ellipse?: number\r\n\r\n /** Add 3D tilt effect. Default: false */\r\n tilt?: boolean\r\n\r\n /** Tilt angle in degrees. Default: 20 */\r\n tiltAngle?: number\r\n\r\n /** Scale variation during orbit. Default: false */\r\n scaleVariation?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst ORBIT_DEFAULTS: Partial<SparkOrbitOptions> = {\r\n radius: 50,\r\n duration: 4000,\r\n direction: 'clockwise',\r\n easing: 'linear',\r\n startAngle: 0,\r\n ellipse: 1,\r\n tilt: false,\r\n tiltAngle: 20,\r\n scaleVariation: false,\r\n}\r\n\r\n// ============================================================================\r\n// ORBIT EFFECT\r\n// ============================================================================\r\n\r\nexport function orbit(options?: SparkOrbitOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, ORBIT_DEFAULTS) as Required<SparkOrbitOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-orbit-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('orbit')\r\n const keyframes = buildOrbitKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectOrbitStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: 'transform',\r\n },\r\n })\r\n}\r\n\r\nfunction buildOrbitKeyframes(options: Required<SparkOrbitOptions>): string {\r\n const { radius, direction, startAngle, ellipse, tilt, tiltAngle, scaleVariation } = options\r\n\r\n const radiusY = radius * ellipse\r\n const dir = direction === 'counterclockwise' ? -1 : 1\r\n\r\n // Generate keyframes for smooth circular/elliptical motion\r\n const steps = 8\r\n let keyframesStr = ''\r\n\r\n for (let i = 0; i <= steps; i++) {\r\n const percent = (i / steps) * 100\r\n const angle = (startAngle + (i / steps) * 360 * dir) * (Math.PI / 180)\r\n\r\n const x = Math.cos(angle) * radius\r\n const y = Math.sin(angle) * radiusY\r\n\r\n let transform = `translate(${x.toFixed(2)}px, ${y.toFixed(2)}px)`\r\n\r\n // Add tilt for 3D effect\r\n if (tilt) {\r\n const rotateX = Math.sin(angle) * tiltAngle\r\n transform += ` rotateX(${rotateX.toFixed(2)}deg)`\r\n }\r\n\r\n // Add scale variation (closer = bigger)\r\n if (scaleVariation) {\r\n const scale = 1 + Math.sin(angle) * 0.1\r\n transform += ` scale(${scale.toFixed(3)})`\r\n }\r\n\r\n keyframesStr += `\r\n ${percent}% {\r\n transform: ${transform};\r\n }\r\n `\r\n }\r\n\r\n return keyframesStr\r\n}\r\n\r\nfunction injectOrbitStyles(animationId: string, options: Required<SparkOrbitOptions>): string {\r\n if (!isBrowser()) return `spark-orbit-${animationId}`\r\n\r\n const className = `spark-orbit-${animationId}`\r\n const styleId = `spark-orbit-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} infinite;\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default orbit\r\n","/**\r\n * Reveal Effect\r\n * Animate elements when they enter the viewport\r\n * \r\n * @module effects/scroll/reveal\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkRevealOptions extends SparkBaseOptions {\r\n /** Animation type. Default: 'fade-up' */\r\n animation?: 'fade' | 'fade-up' | 'fade-down' | 'fade-left' | 'fade-right' | 'zoom' | 'flip'\r\n\r\n /** Animation duration in ms. Default: 600 */\r\n duration?: number\r\n\r\n /** Animation delay in ms. Default: 0 */\r\n delay?: number\r\n\r\n /** Viewport threshold (0-1). Default: 0.2 */\r\n threshold?: number\r\n\r\n /** Easing function. Default: 'ease-out' */\r\n easing?: string\r\n\r\n /** Distance for slide animations in px. Default: 40 */\r\n distance?: number\r\n\r\n /** Only animate once. Default: true */\r\n once?: boolean\r\n\r\n /** Reset animation when leaving viewport. Default: false */\r\n reset?: boolean\r\n\r\n /** Root margin for intersection observer. Default: '0px' */\r\n rootMargin?: string\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst REVEAL_DEFAULTS: Partial<SparkRevealOptions> = {\r\n animation: 'fade-up',\r\n duration: 600,\r\n delay: 0,\r\n threshold: 0.2,\r\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n distance: 40,\r\n once: true,\r\n reset: false,\r\n rootMargin: '0px',\r\n}\r\n\r\n// State tracking for observed elements\r\nconst observedElements = new WeakMap<Element, {\r\n observer: IntersectionObserver\r\n revealed: boolean\r\n}>()\r\n\r\n// ============================================================================\r\n// REVEAL EFFECT\r\n// ============================================================================\r\n\r\nexport function reveal(options?: SparkRevealOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, REVEAL_DEFAULTS) as Required<SparkRevealOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-reveal-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('reveal')\r\n const className = `spark-reveal-${animationId}`\r\n\r\n injectRevealStyles(className, merged)\r\n\r\n // Setup function called when element is added to DOM\r\n const setup = (element: HTMLElement) => {\r\n if (!isBrowser() || observedElements.has(element)) return\r\n\r\n // Set initial hidden state\r\n element.classList.add(`${className}-hidden`)\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n const state = observedElements.get(element)\r\n if (!state) return\r\n\r\n if (entry.isIntersecting) {\r\n // Element entered viewport - reveal\r\n setTimeout(() => {\r\n element.classList.remove(`${className}-hidden`)\r\n element.classList.add(`${className}-visible`)\r\n state.revealed = true\r\n\r\n // Disconnect if only animating once\r\n if (merged.once) {\r\n observer.disconnect()\r\n }\r\n }, merged.delay)\r\n } else if (!merged.once && state.revealed && merged.reset) {\r\n // Element left viewport - reset\r\n element.classList.remove(`${className}-visible`)\r\n element.classList.add(`${className}-hidden`)\r\n state.revealed = false\r\n }\r\n })\r\n },\r\n {\r\n threshold: merged.threshold,\r\n rootMargin: merged.rootMargin,\r\n }\r\n )\r\n\r\n observedElements.set(element, { observer, revealed: false })\r\n observer.observe(element)\r\n }\r\n\r\n const cleanup = (element?: HTMLElement) => {\r\n if (element) {\r\n const state = observedElements.get(element)\r\n if (state) {\r\n state.observer.disconnect()\r\n observedElements.delete(element)\r\n }\r\n }\r\n }\r\n\r\n // Use MutationObserver to detect when elements with this class are added\r\n if (isBrowser()) {\r\n requestAnimationFrame(() => {\r\n document.querySelectorAll(`.${className}`).forEach((el) => {\r\n setup(el as HTMLElement)\r\n })\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n cleanup,\r\n })\r\n}\r\n\r\nfunction injectRevealStyles(className: string, options: Required<SparkRevealOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-reveal-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const { animation, duration, easing, distance } = options\r\n\r\n // Define initial (hidden) and final (visible) states based on animation type\r\n let hiddenTransform = ''\r\n let hiddenOpacity = '0'\r\n\r\n switch (animation) {\r\n case 'fade':\r\n hiddenTransform = 'none'\r\n break\r\n case 'fade-up':\r\n hiddenTransform = `translateY(${distance}px)`\r\n break\r\n case 'fade-down':\r\n hiddenTransform = `translateY(-${distance}px)`\r\n break\r\n case 'fade-left':\r\n hiddenTransform = `translateX(${distance}px)`\r\n break\r\n case 'fade-right':\r\n hiddenTransform = `translateX(-${distance}px)`\r\n break\r\n case 'zoom':\r\n hiddenTransform = 'scale(0.8)'\r\n break\r\n case 'flip':\r\n hiddenTransform = 'perspective(1000px) rotateX(-90deg)'\r\n break\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n will-change: transform, opacity;\r\n}\r\n\r\n.${className}-hidden {\r\n opacity: ${hiddenOpacity};\r\n ${hiddenTransform !== 'none' ? `transform: ${hiddenTransform};` : ''}\r\n transition: none;\r\n}\r\n\r\n.${className}-visible {\r\n opacity: 1;\r\n transform: none;\r\n transition: opacity ${duration}ms ${easing}, transform ${duration}ms ${easing};\r\n}\r\n\r\n.spark-reveal-static {\r\n /* Already visible */\r\n opacity: 1;\r\n transform: none;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className}-hidden,\r\n .${className}-visible {\r\n transition: opacity 200ms ease !important;\r\n transform: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default reveal\r\n","/**\r\n * Counter Effect\r\n * Animating numbers counting up/down when in viewport\r\n * \r\n * @module effects/scroll/counter\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, easings, EasingName } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkCounterOptions extends SparkBaseOptions {\r\n /** Starting value. Default: 0 */\r\n from?: number\r\n\r\n /** Target value. Default: 100 */\r\n to?: number\r\n\r\n /** Animation duration in ms. Default: 2000 */\r\n duration?: number\r\n\r\n /** Easing function name. Default: 'easeOutQuart' */\r\n easing?: EasingName\r\n\r\n /** Decimal places to show. Default: 0 */\r\n decimals?: number\r\n\r\n /** Prefix to add (e.g., '$'). Default: '' */\r\n prefix?: string\r\n\r\n /** Suffix to add (e.g., '%'). Default: '' */\r\n suffix?: string\r\n\r\n /** Thousand separator. Default: ',' */\r\n separator?: string\r\n\r\n /** Viewport threshold (0-1). Default: 0.5 */\r\n threshold?: number\r\n\r\n /** Only animate once. Default: true */\r\n once?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst COUNTER_DEFAULTS: Partial<SparkCounterOptions> = {\r\n from: 0,\r\n to: 100,\r\n duration: 2000,\r\n easing: 'easeOutQuart',\r\n decimals: 0,\r\n prefix: '',\r\n suffix: '',\r\n separator: ',',\r\n threshold: 0.5,\r\n once: true,\r\n}\r\n\r\n// State tracking\r\nconst counterStates = new WeakMap<Element, {\r\n observer: IntersectionObserver\r\n animated: boolean\r\n animationFrame: number | null\r\n}>()\r\n\r\n// ============================================================================\r\n// COUNTER EFFECT\r\n// ============================================================================\r\n\r\nexport function counter(options?: SparkCounterOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, COUNTER_DEFAULTS) as Required<SparkCounterOptions>\r\n\r\n const reducedMotion = shouldReduceMotion()\r\n\r\n // Helper to format number\r\n const formatNumber = (value: number): string => {\r\n const fixed = value.toFixed(merged.decimals)\r\n const [intPart, decPart] = fixed.split('.')\r\n\r\n // Add thousand separators\r\n const withSeparator = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, merged.separator)\r\n\r\n const formatted = decPart ? `${withSeparator}.${decPart}` : withSeparator\r\n return `${merged.prefix}${formatted}${merged.suffix}`\r\n }\r\n\r\n // Animation function\r\n const animateCounter = (element: HTMLElement) => {\r\n const state = counterStates.get(element)\r\n if (!state || (state.animated && merged.once)) return\r\n\r\n // If reduced motion, just set final value\r\n if (reducedMotion || !shouldAnimate(merged)) {\r\n element.textContent = formatNumber(merged.to)\r\n if (state) state.animated = true\r\n return\r\n }\r\n\r\n const startTime = performance.now()\r\n const easingFn = easings[merged.easing] || easings.easeOutQuart\r\n\r\n const animate = (currentTime: number) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / merged.duration, 1)\r\n\r\n const easedProgress = easingFn(progress)\r\n const currentValue = merged.from + (merged.to - merged.from) * easedProgress\r\n\r\n element.textContent = formatNumber(currentValue)\r\n\r\n if (progress < 1) {\r\n state.animationFrame = requestAnimationFrame(animate)\r\n } else {\r\n state.animated = true\r\n state.animationFrame = null\r\n }\r\n }\r\n\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n // Setup function\r\n const setup = (element: HTMLElement) => {\r\n if (!isBrowser() || counterStates.has(element)) return\r\n\r\n // Set initial value\r\n element.textContent = formatNumber(merged.from)\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n animateCounter(element)\r\n\r\n if (merged.once) {\r\n observer.disconnect()\r\n }\r\n }\r\n })\r\n },\r\n { threshold: merged.threshold }\r\n )\r\n\r\n counterStates.set(element, {\r\n observer,\r\n animated: false,\r\n animationFrame: null,\r\n })\r\n\r\n observer.observe(element)\r\n }\r\n\r\n const cleanup = (element?: HTMLElement) => {\r\n if (element) {\r\n const state = counterStates.get(element)\r\n if (state) {\r\n state.observer.disconnect()\r\n if (state.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n counterStates.delete(element)\r\n }\r\n }\r\n }\r\n\r\n // Setup on mount\r\n const className = `spark-counter-${Date.now().toString(36)}`\r\n\r\n if (isBrowser()) {\r\n requestAnimationFrame(() => {\r\n document.querySelectorAll(`.${className}`).forEach((el) => {\r\n setup(el as HTMLElement)\r\n })\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n cleanup,\r\n })\r\n}\r\n\r\nexport default counter\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Confetti celebration effect\r\n */\r\n\r\nimport type { SparkConfettiOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, random, randomItem, generateId } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkConfettiOptions> = {\r\n duration: 2000,\r\n count: 30,\r\n colors: ['#ff0055', '#00d4ff', '#00ffa3', '#ffcc00', '#ff00ff'],\r\n spread: 60,\r\n trigger: 'click',\r\n intensity: 1,\r\n}\r\n\r\nexport function confetti(options?: SparkConfettiOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkConfettiOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const createParticles = (container: HTMLElement) => {\r\n const count = Math.floor(opts.count * opts.intensity)\r\n\r\n for (let i = 0; i < count; i++) {\r\n const particle = document.createElement('div')\r\n const size = random(5, 10)\r\n const color = randomItem(opts.colors)\r\n const id = generateId()\r\n\r\n particle.className = `sparkfx-confetti-particle ${id}`\r\n particle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n top: 50%;\r\n left: 50%;\r\n border-radius: ${random(0, 50)}%;\r\n pointer-events: none;\r\n z-index: 1000;\r\n `\r\n\r\n const angle = random(-opts.spread, opts.spread) - 90\r\n const velocity = random(10, 20)\r\n const animationName = `sparkfx-confetti-${id}`\r\n\r\n injectAnimation(animationName, `\r\n 0% { transform: translate(-50%, -50%) rotate(0deg); opacity: 1; }\r\n 100% { transform: translate(calc(-50% + ${Math.cos(angle * Math.PI / 180) * velocity * 10}px), calc(-50% + ${Math.sin(angle * Math.PI / 180) * velocity * 10}px)) rotate(${random(0, 360)}deg); opacity: 0; }\r\n `)\r\n\r\n particle.style.animation = `${animationName} ${opts.duration}ms ease-out forwards`\r\n container.appendChild(particle)\r\n\r\n setTimeout(() => particle.remove(), opts.duration)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-confetti'),\r\n onClick: (e: any) => {\r\n if (opts.trigger === 'click') {\r\n createParticles(e.currentTarget as HTMLElement)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Sparkle effect - Magic stars appearing on surface\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface SparkleOptions extends SparkBaseOptions {\r\n color?: string\r\n count?: number\r\n spread?: number\r\n}\r\n\r\nconst defaultOptions: Partial<SparkleOptions> = {\r\n trigger: 'hover',\r\n duration: 600,\r\n color: '#ffd700',\r\n count: 8,\r\n spread: 40,\r\n}\r\n\r\nfunction createSparkle(container: HTMLElement, color: string, spread: number) {\r\n const sparkle = document.createElement('span')\r\n sparkle.className = 'sparkfx-sparkle-particle'\r\n\r\n const size = Math.random() * 8 + 4\r\n const angle = Math.random() * 360\r\n const distance = Math.random() * spread + 10\r\n const x = Math.cos(angle * Math.PI / 180) * distance\r\n const y = Math.sin(angle * Math.PI / 180) * distance\r\n\r\n sparkle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n border-radius: 50%;\r\n pointer-events: none;\r\n left: 50%;\r\n top: 50%;\r\n transform: translate(-50%, -50%);\r\n box-shadow: 0 0 ${size}px ${color}, 0 0 ${size * 2}px ${color};\r\n animation: sparkfx-sparkle-fly 0.6s ease-out forwards;\r\n --sparkle-x: ${x}px;\r\n --sparkle-y: ${y}px;\r\n `\r\n\r\n container.appendChild(sparkle)\r\n setTimeout(() => sparkle.remove(), 600)\r\n}\r\n\r\nfunction injectSparkleStyles() {\r\n if (document.getElementById('sparkfx-sparkle-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-sparkle-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-sparkle-fly {\r\n 0% {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(0);\r\n }\r\n 50% {\r\n opacity: 1;\r\n transform: translate(calc(-50% + var(--sparkle-x)), calc(-50% + var(--sparkle-y))) scale(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translate(calc(-50% + var(--sparkle-x) * 1.5), calc(-50% + var(--sparkle-y) * 1.5)) scale(0.5);\r\n }\r\n }\r\n \r\n .sparkfx-sparkle {\r\n position: relative;\r\n overflow: visible !important;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function sparkle(options?: SparkleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkleOptions>\r\n\r\n injectBaseStyles()\r\n injectSparkleStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const triggerSparkles = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n for (let i = 0; i < opts.count; i++) {\r\n setTimeout(() => createSparkle(target, opts.color, opts.spread), i * 50)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-sparkle'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? triggerSparkles : undefined,\r\n onClick: opts.trigger === 'click' ? triggerSparkles : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Firework effect - Expressive celebration explosions\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface FireworkOptions extends SparkBaseOptions {\r\n colors?: string[]\r\n particleCount?: number\r\n spread?: number\r\n}\r\n\r\nconst defaultOptions: Partial<FireworkOptions> = {\r\n trigger: 'click',\r\n duration: 800,\r\n colors: ['#ff0000', '#ffd700', '#00ff00', '#00bfff', '#ff00ff', '#ff6600'],\r\n particleCount: 24,\r\n spread: 80,\r\n}\r\n\r\nfunction createParticle(container: HTMLElement, x: number, y: number, color: string, angle: number, distance: number) {\r\n const particle = document.createElement('span')\r\n particle.className = 'sparkfx-firework-particle'\r\n\r\n const size = Math.random() * 6 + 3\r\n const endX = Math.cos(angle * Math.PI / 180) * distance\r\n const endY = Math.sin(angle * Math.PI / 180) * distance\r\n\r\n particle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n border-radius: 50%;\r\n pointer-events: none;\r\n left: ${x}px;\r\n top: ${y}px;\r\n transform: translate(-50%, -50%);\r\n box-shadow: 0 0 ${size * 2}px ${color};\r\n animation: sparkfx-firework-explode 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;\r\n --fw-x: ${endX}px;\r\n --fw-y: ${endY}px;\r\n `\r\n\r\n container.appendChild(particle)\r\n setTimeout(() => particle.remove(), 800)\r\n}\r\n\r\nfunction injectFireworkStyles() {\r\n if (document.getElementById('sparkfx-firework-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-firework-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-firework-explode {\r\n 0% {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(0);\r\n }\r\n 30% {\r\n opacity: 1;\r\n transform: translate(calc(-50% + var(--fw-x) * 0.8), calc(-50% + var(--fw-y) * 0.8)) scale(1.2);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translate(calc(-50% + var(--fw-x)), calc(-50% + var(--fw-y) + 20px)) scale(0.3);\r\n }\r\n }\r\n \r\n .sparkfx-firework {\r\n position: relative;\r\n overflow: visible !important;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function firework(options?: FireworkOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<FireworkOptions>\r\n\r\n injectBaseStyles()\r\n injectFireworkStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const triggerFirework = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n\r\n const angleStep = 360 / opts.particleCount\r\n\r\n for (let i = 0; i < opts.particleCount; i++) {\r\n const angle = angleStep * i + (Math.random() * 20 - 10)\r\n const distance = opts.spread * (0.6 + Math.random() * 0.4)\r\n const color = opts.colors[Math.floor(Math.random() * opts.colors.length)]\r\n\r\n setTimeout(() => {\r\n createParticle(target, x, y, color, angle, distance)\r\n }, Math.random() * 100)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-firework'),\r\n style: generateCSSVars(opts),\r\n onClick: opts.trigger === 'click' ? triggerFirework : undefined,\r\n onMouseEnter: opts.trigger === 'hover' ? triggerFirework : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Combined celebration effects\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport { confetti } from './confetti'\r\nimport { sparkle } from './sparkle'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 3000,\r\n trigger: 'click',\r\n}\r\n\r\nexport function celebrate(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n })\r\n\r\n const confettiResult = confetti({ ...opts, trigger: 'click' })\r\n const sparkleResult = sparkle({ ...opts, trigger: 'hover' })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-celebrate'),\r\n style: cssVars,\r\n onClick: (e: any) => {\r\n confettiResult.onClick?.(e)\r\n },\r\n onMouseEnter: (e: any) => {\r\n sparkleResult.onMouseEnter?.(e)\r\n },\r\n onMouseLeave: (e: any) => {\r\n sparkleResult.onMouseLeave?.(e)\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Typewriter effect - Character by character reveal\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface TypewriterOptions extends SparkBaseOptions {\r\n speed?: number\r\n cursor?: boolean\r\n cursorChar?: string\r\n}\r\n\r\nconst defaultOptions: Partial<TypewriterOptions> = {\r\n trigger: 'click',\r\n duration: 50,\r\n speed: 50,\r\n cursor: true,\r\n cursorChar: '|',\r\n}\r\n\r\nfunction injectTypewriterStyles() {\r\n if (document.getElementById('sparkfx-typewriter-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-typewriter-styles'\r\n style.textContent = `\r\n .sparkfx-typewriter-cursor {\r\n animation: sparkfx-cursor-blink 0.8s infinite;\r\n margin-left: 2px;\r\n font-weight: 100;\r\n }\r\n \r\n @keyframes sparkfx-cursor-blink {\r\n 0%, 50% { opacity: 1; }\r\n 51%, 100% { opacity: 0; }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function typewriter(options?: TypewriterOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<TypewriterOptions>\r\n\r\n injectBaseStyles()\r\n injectTypewriterStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let isTyping = false\r\n let originalText = ''\r\n let cursorEl: HTMLElement | null = null\r\n\r\n const startTyping = (e: Event) => {\r\n if (isTyping) return\r\n isTyping = true\r\n\r\n const target = e.currentTarget as HTMLElement\r\n originalText = originalText || target.textContent || ''\r\n target.textContent = ''\r\n\r\n if (opts.cursor) {\r\n cursorEl = document.createElement('span')\r\n cursorEl.className = 'sparkfx-typewriter-cursor'\r\n cursorEl.textContent = opts.cursorChar\r\n target.appendChild(cursorEl)\r\n }\r\n\r\n let i = 0\r\n const type = () => {\r\n if (i < originalText.length) {\r\n if (cursorEl) target.insertBefore(document.createTextNode(originalText[i]), cursorEl)\r\n else target.textContent += originalText[i]\r\n i++\r\n setTimeout(type, opts.speed)\r\n } else {\r\n if (cursorEl) {\r\n setTimeout(() => {\r\n cursorEl?.remove()\r\n cursorEl = null\r\n }, 1500)\r\n }\r\n isTyping = false\r\n }\r\n }\r\n\r\n type()\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-typewriter'),\r\n onClick: opts.trigger === 'click' ? startTyping : undefined,\r\n onMouseEnter: opts.trigger === 'hover' ? startTyping : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Hacker-style text scramble decryption\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 1000,\r\n trigger: 'hover',\r\n}\r\n\r\nconst CHARS = 'ABCDEFGHIKLMNOPQRSTUVWXYZ0123456789@#$%&'\r\n\r\nexport function scramble(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n let interval: any = null\r\n\r\n const startScramble = (target: HTMLElement) => {\r\n const originalText = target.innerText\r\n let iteration = 0\r\n\r\n clearInterval(interval)\r\n\r\n interval = setInterval(() => {\r\n target.innerText = originalText\r\n .split('')\r\n .map((char, index) => {\r\n if (index < iteration) return originalText[index]\r\n return CHARS[Math.floor(Math.random() * CHARS.length)]\r\n })\r\n .join('')\r\n\r\n if (iteration >= originalText.length) {\r\n clearInterval(interval)\r\n }\r\n\r\n iteration += 1 / 3\r\n }, opts.duration / (originalText.length * 3))\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-scramble'),\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n startScramble(e.currentTarget as HTMLElement)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Wave effect - Letters moving in wave motion\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface WaveOptions extends SparkBaseOptions {\r\n amplitude?: number\r\n speed?: number\r\n}\r\n\r\nconst defaultOptions: Partial<WaveOptions> = {\r\n trigger: 'hover',\r\n duration: 400,\r\n amplitude: 8,\r\n speed: 100,\r\n}\r\n\r\nfunction injectWaveStyles() {\r\n if (document.getElementById('sparkfx-wave-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-wave-styles'\r\n style.textContent = `\r\n .sparkfx-wave {\r\n display: inline-block;\r\n }\r\n \r\n .sparkfx-wave-letter {\r\n display: inline-block;\r\n animation: sparkfx-wave-float 0.4s ease-in-out;\r\n animation-fill-mode: both;\r\n }\r\n \r\n @keyframes sparkfx-wave-float {\r\n 0%, 100% { transform: translateY(0); }\r\n 50% { transform: translateY(var(--wave-amplitude, -8px)); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function wave(options?: WaveOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<WaveOptions>\r\n\r\n injectBaseStyles()\r\n injectWaveStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let isAnimating = false\r\n let originalHTML = ''\r\n\r\n const startWave = (e: Event) => {\r\n if (isAnimating) return\r\n isAnimating = true\r\n\r\n const target = e.currentTarget as HTMLElement\r\n\r\n if (!originalHTML) {\r\n originalHTML = target.innerHTML\r\n }\r\n\r\n const text = target.textContent || ''\r\n target.innerHTML = ''\r\n\r\n text.split('').forEach((char, i) => {\r\n const span = document.createElement('span')\r\n span.className = 'sparkfx-wave-letter'\r\n span.textContent = char === ' ' ? '\\u00A0' : char\r\n span.style.setProperty('--wave-amplitude', `-${opts.amplitude}px`)\r\n span.style.animationDelay = `${i * opts.speed}ms`\r\n target.appendChild(span)\r\n })\r\n\r\n const totalDuration = text.length * opts.speed + opts.duration\r\n setTimeout(() => {\r\n target.innerHTML = originalHTML\r\n isAnimating = false\r\n }, totalDuration)\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-wave'),\r\n onMouseEnter: opts.trigger === 'hover' ? startWave : undefined,\r\n onClick: opts.trigger === 'click' ? startWave : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Highlight effect - Marker pen style text highlighting\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface HighlightOptions extends SparkBaseOptions {\r\n color?: string\r\n height?: string\r\n}\r\n\r\nconst defaultOptions: Partial<HighlightOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n color: 'rgba(0, 255, 163, 0.3)',\r\n height: '40%',\r\n}\r\n\r\nfunction injectHighlightStyles() {\r\n if (document.getElementById('sparkfx-highlight-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-highlight-styles'\r\n style.textContent = `\r\n .sparkfx-highlight {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n \r\n .sparkfx-highlight::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n width: 0%;\r\n height: var(--highlight-height, 40%);\r\n background: var(--highlight-color, rgba(0, 255, 163, 0.3));\r\n z-index: -1;\r\n transition: width var(--sparkfx-duration) var(--sparkfx-easing);\r\n }\r\n \r\n .sparkfx-highlight-active::after {\r\n width: 100%;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function highlight(options?: HighlightOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<HighlightOptions>\r\n\r\n injectBaseStyles()\r\n injectHighlightStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.add('sparkfx-highlight-active')\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-highlight-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-highlight'),\r\n style: {\r\n ...generateCSSVars(opts),\r\n '--highlight-color': opts.color,\r\n '--highlight-height': opts.height,\r\n } as Record<string, string | number>,\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx v1.2.0 - Micro-interactions for modern web applications\r\n * All effects are free and open source\r\n * \r\n * @version 1.2.0\r\n * @license MIT\r\n */\r\n\r\n// ============================================================================\r\n// CORE EXPORTS\r\n// ============================================================================\r\nexport * from './core/types'\r\nexport { injectBaseStyles, prefersReducedMotion } from './core/styles'\r\nexport { config, updateConfig, getConfig, setTheme, onThemeChange } from './core/config'\r\nexport { presets, getPresetClasses, getPresetNames, type PresetName } from './core/presets'\r\nexport * from './core/a11y'\r\n\r\n// ============================================================================\r\n// API EXPORTS\r\n// ============================================================================\r\nexport { combine } from './api/combine'\r\nexport { sequence, type SequenceStep, type SequenceOptions } from './api/sequence'\r\nexport { stagger, type StaggerOptions } from './api/stagger'\r\n\r\n// ============================================================================\r\n// BASIC EFFECTS\r\n// ============================================================================\r\nexport { bounce } from './effects/basic/bounce'\r\nexport { pulse } from './effects/basic/pulse'\r\nexport { lift } from './effects/basic/lift'\r\nexport { scale } from './effects/basic/scale'\r\nexport { shake } from './effects/basic/shake'\r\nexport { fade } from './effects/basic/fade'\r\nexport { slide } from './effects/basic/slide'\r\nexport { rotate } from './effects/basic/rotate'\r\n\r\n// ============================================================================\r\n// PREMIUM EFFECTS\r\n// ============================================================================\r\nexport { glow } from './effects/premium/glow'\r\nexport { ripple } from './effects/premium/ripple'\r\nexport { magnetic } from './effects/premium/magnetic'\r\nexport { tilt } from './effects/premium/tilt'\r\nexport { elastic } from './effects/premium/elastic'\r\nexport { jelly } from './effects/premium/jelly'\r\nexport { rubber } from './effects/premium/rubber'\r\nexport { morph } from './effects/premium/morph'\r\n\r\n// ============================================================================\r\n// VISUAL EFFECTS\r\n// ============================================================================\r\nexport { glitch } from './effects/visual/glitch'\r\nexport { blur } from './effects/visual/blur'\r\nexport { neon } from './effects/visual/neon'\r\nexport { glass } from './effects/visual/glass'\r\nexport { shimmer } from './effects/visual/shimmer'\r\nexport { gradient } from './effects/visual/gradient'\r\nexport { spotlight } from './effects/visual/spotlight'\r\nexport { hologram } from './effects/visual/hologram'\r\nexport { aurora } from './effects/visual/aurora'\r\nexport { matrix } from './effects/visual/matrix'\r\nexport { rainbow } from './effects/visual/rainbow'\r\n\r\n// ============================================================================\r\n// MOTION EFFECTS (NEW in v1.2.0)\r\n// ============================================================================\r\nexport { parallax } from './effects/motion/parallax'\r\nexport { float } from './effects/motion/float'\r\nexport { flip3d } from './effects/motion/flip3d'\r\nexport { swing } from './effects/motion/swing'\r\nexport { orbit } from './effects/motion/orbit'\r\n\r\n// ============================================================================\r\n// SCROLL EFFECTS (NEW in v1.2.0)\r\n// ============================================================================\r\nexport { reveal } from './effects/scroll/reveal'\r\nexport { counter } from './effects/scroll/counter'\r\n\r\n// ============================================================================\r\n// CELEBRATION EFFECTS\r\n// ============================================================================\r\nexport { confetti } from './effects/celebration/confetti'\r\nexport { sparkle } from './effects/celebration/sparkle'\r\nexport { firework } from './effects/celebration/firework'\r\nexport { celebrate } from './effects/celebration/celebrate'\r\n\r\n// ============================================================================\r\n// TEXT EFFECTS\r\n// ============================================================================\r\nexport { typewriter } from './effects/text/typewriter'\r\nexport { scramble } from './effects/text/scramble'\r\nexport { wave } from './effects/text/wave'\r\nexport { highlight } from './effects/text/highlight'\r\n\r\n// ============================================================================\r\n// IMPORTS FOR SPARK OBJECT\r\n// ============================================================================\r\nimport { bounce } from './effects/basic/bounce'\r\nimport { pulse } from './effects/basic/pulse'\r\nimport { lift } from './effects/basic/lift'\r\nimport { scale } from './effects/basic/scale'\r\nimport { shake } from './effects/basic/shake'\r\nimport { fade } from './effects/basic/fade'\r\nimport { slide } from './effects/basic/slide'\r\nimport { rotate } from './effects/basic/rotate'\r\nimport { glow } from './effects/premium/glow'\r\nimport { ripple } from './effects/premium/ripple'\r\nimport { magnetic } from './effects/premium/magnetic'\r\nimport { tilt } from './effects/premium/tilt'\r\nimport { elastic } from './effects/premium/elastic'\r\nimport { jelly } from './effects/premium/jelly'\r\nimport { rubber } from './effects/premium/rubber'\r\nimport { morph } from './effects/premium/morph'\r\nimport { glitch } from './effects/visual/glitch'\r\nimport { blur } from './effects/visual/blur'\r\nimport { neon } from './effects/visual/neon'\r\nimport { glass } from './effects/visual/glass'\r\nimport { shimmer } from './effects/visual/shimmer'\r\nimport { gradient } from './effects/visual/gradient'\r\nimport { spotlight } from './effects/visual/spotlight'\r\nimport { hologram } from './effects/visual/hologram'\r\nimport { aurora } from './effects/visual/aurora'\r\nimport { matrix } from './effects/visual/matrix'\r\nimport { rainbow } from './effects/visual/rainbow'\r\nimport { parallax } from './effects/motion/parallax'\r\nimport { float } from './effects/motion/float'\r\nimport { flip3d } from './effects/motion/flip3d'\r\nimport { swing } from './effects/motion/swing'\r\nimport { orbit } from './effects/motion/orbit'\r\nimport { reveal } from './effects/scroll/reveal'\r\nimport { counter } from './effects/scroll/counter'\r\nimport { confetti } from './effects/celebration/confetti'\r\nimport { sparkle } from './effects/celebration/sparkle'\r\nimport { firework } from './effects/celebration/firework'\r\nimport { celebrate } from './effects/celebration/celebrate'\r\nimport { typewriter } from './effects/text/typewriter'\r\nimport { scramble } from './effects/text/scramble'\r\nimport { wave } from './effects/text/wave'\r\nimport { highlight } from './effects/text/highlight'\r\nimport { combine } from './api/combine'\r\nimport { sequence } from './api/sequence'\r\nimport { stagger } from './api/stagger'\r\n\r\n// ============================================================================\r\n// MAIN SPARK OBJECT\r\n// ============================================================================\r\n\r\n/**\r\n * Main spark object with all effects\r\n * \r\n * @example\r\n * import { spark } from 'sparkfx'\r\n * \r\n * // Single effect\r\n * element.classList.add(spark.bounce().className)\r\n * \r\n * // Combined effects\r\n * const fx = spark.combine([spark.glow(), spark.bounce()])\r\n * element.classList.add(...fx.className.split(' '))\r\n */\r\nexport const spark = {\r\n // Basic Effects\r\n bounce,\r\n pulse,\r\n lift,\r\n scale,\r\n shake,\r\n fade,\r\n slide,\r\n rotate,\r\n\r\n // Premium Effects\r\n glow,\r\n ripple,\r\n magnetic,\r\n tilt,\r\n elastic,\r\n jelly,\r\n rubber,\r\n morph,\r\n\r\n // Visual Effects\r\n glitch,\r\n blur,\r\n neon,\r\n glass,\r\n shimmer,\r\n gradient,\r\n spotlight,\r\n hologram,\r\n aurora,\r\n matrix,\r\n rainbow,\r\n\r\n // Motion Effects (v1.2.0)\r\n parallax,\r\n float,\r\n flip3d,\r\n swing,\r\n orbit,\r\n\r\n // Scroll Effects (v1.2.0)\r\n reveal,\r\n counter,\r\n\r\n // Celebration Effects\r\n confetti,\r\n sparkle,\r\n firework,\r\n celebrate,\r\n\r\n // Text Effects\r\n typewriter,\r\n scramble,\r\n wave,\r\n highlight,\r\n} as const\r\n\r\nexport default spark\r\n"]}
1
+ {"version":3,"sources":["../src/core/styles.ts","../src/core/config.ts","../src/core/presets.ts","../src/core/utils.ts","../src/core/a11y.ts","../src/api/combine.ts","../src/api/sequence.ts","../src/api/stagger.ts","../src/core/engine.ts","../src/effects/basic/bounce.ts","../src/effects/basic/pulse.ts","../src/effects/basic/lift.ts","../src/effects/basic/scale.ts","../src/effects/basic/shake.ts","../src/effects/basic/fade.ts","../src/effects/basic/slide.ts","../src/effects/basic/rotate.ts","../src/effects/premium/glow.ts","../src/effects/premium/ripple.ts","../src/effects/premium/magnetic.ts","../src/effects/premium/tilt.ts","../src/effects/premium/elastic.ts","../src/effects/premium/jelly.ts","../src/effects/premium/rubber.ts","../src/effects/premium/morph.ts","../src/effects/visual/glitch.ts","../src/effects/visual/blur.ts","../src/effects/visual/neon.ts","../src/effects/visual/glass.ts","../src/effects/visual/shimmer.ts","../src/effects/visual/gradient.ts","../src/effects/visual/spotlight.ts","../src/effects/visual/hologram.ts","../src/effects/visual/aurora.ts","../src/effects/visual/matrix.ts","../src/effects/visual/rainbow.ts","../src/effects/motion/parallax.ts","../src/effects/motion/float.ts","../src/effects/motion/flip3d.ts","../src/effects/motion/swing.ts","../src/effects/motion/orbit.ts","../src/effects/scroll/reveal.ts","../src/effects/scroll/counter.ts","../src/effects/celebration/confetti.ts","../src/effects/celebration/sparkle.ts","../src/effects/celebration/firework.ts","../src/effects/celebration/celebrate.ts","../src/effects/text/typewriter.ts","../src/effects/text/scramble.ts","../src/effects/text/wave.ts","../src/effects/text/highlight.ts","../src/index.ts"],"names":["SPARK_STYLE_ID","stylesInjected","injectedAnimations","baseStyles","injectBaseStyles","style","injectAnimation","name","keyframes","styleEl","generateCSSVars","options","vars","getEasingValue","easing","prefersReducedMotion","DEFAULT_CONFIG","ConfigManager","oldConfig","key","listener","base","updates","merged","frozenConfig","error","prefix","styleId","existing","configManager","config","updateConfig","getConfig","setTheme","theme","onThemeChange","callback","mediaQuery","handler","presetConfigs","getPresetClasses","presetName","effect","getPresetNames","presets","isBrowser","safeQuerySelectorAll","selector","parent","animationCounter","generateAnimationId","id","clamp","value","min","max","mapRange","inMin","inMax","outMin","outMax","random","randomInt","easings","c4","throttle","func","limit","inThrottle","lastFunc","lastRan","args","cachedState","getA11yState","detectScreenReader","clearA11yCache","listeners","onA11yChange","setupMediaQueryListeners","motionQuery","contrastQuery","handleChange","state","shouldReduceMotion","getReducedMotionCSS","alternative","applyReducedMotion","element","css","announcer","getAnnouncer","announce","message","priority","announcerEl","getEffectAnnouncement","effectName","makeFocusable","addKeyboardSupport","keyHandler","event","createFocusTrap","container","previouslyFocused","focusableSelectors","handleKeyDown","focusableElements","firstElement","lastElement","applyA11yAttributes","wrapWithA11y","effectFn","result","isHighContrastMode","getHighContrastColor","color","fallback","combine","effects","classNames","e","mergedStyle","combinedOnMouseEnter","combinedOnMouseLeave","combinedOnMouseMove","combinedOnClick","combinedCleanup","hasMouseEnter","hasMouseLeave","hasMouseMove","hasClick","hasCleanup","sequence","steps","opts","currentStepIndex","playing","loopsCompleted","timeoutId","appliedClasses","cleanupCurrentStep","cls","c","applyStep","step","executeStep","index","play","pause","stagger","elements","timeoutIds","started","getElements","getDelay","total","baseDelay","applyEffect","els","completedCount","delay","defaults","mergeOptions","effectDefaults","shouldAnimate","createSimpleEffectResult","props","applyIntensity","intensity","idCounter","generateId","sanitizeColor","cleaned","validateNumber","randomItem","array","defaultOptions","bounce","bounceHeight","animationName","upPercent","currentHeight","cssVars","clsx","pulse","scaleValue","iterationCount","lift","distance","shadowValue","target","scale","shake","fade","targetOpacity","slide","getTransform","rotate","angle","directionMultiplier","glow","safeColor","safeSpread","spread","glowShadow","ripple","rect","size","rippleEl","magnetic","centerX","centerY","relX","relY","moveX","moveY","tilt","x","y","rotateY","rotateX","injectElasticStyles","elastic","trigger","injectJellyStyles","jelly","rubber","morph","glitch","blur","baseStyle","activate","deactivate","neon","glass","shimmer","injectGradientStyles","gradient","gradientValue","spotlight","injectHologramStyles","hologram","scanlineElement","AURORA_DEFAULTS","aurora","animationId","buildAuroraKeyframes","className","injectAuroraStyles","movement","effectStyles","MATRIX_DEFAULTS","CHARSETS","matrix","injectMatrixStyles","canvas","ctx","animationFrame","columns","initialized","getCharset","initCanvas","resizeCanvas","startAnimation","numColumns","draw","charset","i","char","speed","lastTime","animate","time","stopAnimation","RAINBOW_DEFAULTS","rainbow","buildRainbowKeyframes","injectRainbowStyles","saturation","lightness","type","colors","percent","getColorProperty","rainbowGradient","typeStyles","stylesheet","PARALLAX_DEFAULTS","parallax","stateMap","injectParallaxStyles","handleScroll","windowHeight","el","elementCenter","viewportCenter","progress","clampedProgress","direction","offset","animateParallax","handleMouseMove","clientX","clientY","windowWidth","normalizedX","normalizedY","offsetX","offsetY","ease","threshold","cleanup","FLOAT_DEFAULTS","float","buildFloatKeyframes","injectFloatStyles","rotateAngle","scaleAmount","transform0","transform50","transform100","scaleUp","FLIP3D_DEFAULTS","flip3d","injectFlip3DStyles","isFlipped","onClick","rotateAxis","shadowStyle","SWING_DEFAULTS","swing","buildSwingKeyframes","injectSwingStyles","damping","animationPlayState","ORBIT_DEFAULTS","orbit","buildOrbitKeyframes","injectOrbitStyles","radius","startAngle","ellipse","tiltAngle","scaleVariation","radiusY","dir","keyframesStr","transform","REVEAL_DEFAULTS","observedElements","reveal","injectRevealStyles","setup","observer","entries","entry","animation","duration","hiddenTransform","hiddenOpacity","COUNTER_DEFAULTS","counterStates","counter","reducedMotion","formatNumber","fixed","intPart","decPart","withSeparator","formatted","animateCounter","startTime","easingFn","currentTime","elapsed","easedProgress","currentValue","confetti","createParticles","count","particle","velocity","createSparkle","sparkle","injectSparkleStyles","triggerSparkles","createParticle","endX","endY","injectFireworkStyles","firework","triggerFirework","angleStep","celebrate","confettiResult","sparkleResult","injectTypewriterStyles","typewriter","isTyping","originalText","cursorEl","startTyping","CHARS","scramble","interval","startScramble","iteration","injectWaveStyles","wave","isAnimating","originalHTML","startWave","text","span","totalDuration","injectHighlightStyles","highlight","spark","src_default"],"mappings":"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","file":"chunk-3AVUTKJ5.cjs","sourcesContent":["/**\r\n * sparkfx - Premium micro-interactions System\r\n * Handles dynamic CSS injection for effects\r\n */\r\n\r\nconst SPARK_STYLE_ID = 'sparkfx-styles'\r\n\r\nlet stylesInjected = false\r\nconst injectedAnimations = new Set<string>()\r\n\r\n/**\r\n * Base CSS that's always injected\r\n */\r\nconst baseStyles = `\r\n/* @lynch/spark base styles */\r\n.spark-effect {\r\n transition-property: transform, box-shadow, filter, opacity;\r\n transition-timing-function: var(--spark-easing, ease-out);\r\n transition-duration: var(--spark-duration, 300ms);\r\n will-change: transform;\r\n}\r\n\r\n.spark-reduced-motion {\r\n transition: none !important;\r\n animation: none !important;\r\n}\r\n\r\n/* Ripple container */\r\n.spark-ripple-container {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-ripple {\r\n position: absolute;\r\n border-radius: 50%;\r\n transform: scale(0);\r\n animation: spark-ripple-animation 0.6s linear;\r\n pointer-events: none;\r\n}\r\n\r\n@keyframes spark-ripple-animation {\r\n to {\r\n transform: scale(4);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* Confetti */\r\n.spark-confetti-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 9999;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-confetti-particle {\r\n position: absolute;\r\n width: 10px;\r\n height: 10px;\r\n animation: spark-confetti-fall var(--spark-duration, 3s) ease-out forwards;\r\n}\r\n\r\n@keyframes spark-confetti-fall {\r\n 0% {\r\n transform: translateY(0) rotate(0deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateY(100vh) rotate(720deg);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* Shimmer */\r\n.spark-shimmer {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.spark-shimmer::after {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: -100%;\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(\r\n 90deg,\r\n transparent,\r\n rgba(255, 255, 255, 0.3),\r\n transparent\r\n );\r\n animation: spark-shimmer-move var(--spark-duration, 1.5s) infinite;\r\n}\r\n\r\n@keyframes spark-shimmer-move {\r\n to {\r\n left: 100%;\r\n }\r\n}\r\n\r\n/* Glitch */\r\n.spark-glitch {\r\n position: relative;\r\n}\r\n\r\n.spark-glitch::before,\r\n.spark-glitch::after {\r\n content: attr(data-text);\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n}\r\n\r\n.spark-glitch:hover::before,\r\n.spark-glitch:hover::after {\r\n opacity: 0.8;\r\n}\r\n\r\n.spark-glitch:hover::before {\r\n color: var(--spark-glitch-color1, #ff0000);\r\n animation: spark-glitch-1 0.3s infinite;\r\n}\r\n\r\n.spark-glitch:hover::after {\r\n color: var(--spark-glitch-color2, #00ffff);\r\n animation: spark-glitch-2 0.3s infinite;\r\n}\r\n\r\n@keyframes spark-glitch-1 {\r\n 0%, 100% { clip-path: inset(0 0 90% 0); transform: translateX(-2px); }\r\n 25% { clip-path: inset(10% 0 60% 0); transform: translateX(2px); }\r\n 50% { clip-path: inset(40% 0 30% 0); transform: translateX(-2px); }\r\n 75% { clip-path: inset(70% 0 10% 0); transform: translateX(2px); }\r\n}\r\n\r\n@keyframes spark-glitch-2 {\r\n 0%, 100% { clip-path: inset(80% 0 0 0); transform: translateX(2px); }\r\n 25% { clip-path: inset(50% 0 20% 0); transform: translateX(-2px); }\r\n 50% { clip-path: inset(20% 0 50% 0); transform: translateX(2px); }\r\n 75% { clip-path: inset(0 0 70% 0); transform: translateX(-2px); }\r\n}\r\n\r\n/* Neon glow */\r\n.spark-neon {\r\n text-shadow:\r\n 0 0 5px var(--spark-neon-color, #fff),\r\n 0 0 10px var(--spark-neon-color, #fff),\r\n 0 0 20px var(--spark-neon-color, #fff),\r\n 0 0 40px var(--spark-neon-color, #0ff),\r\n 0 0 80px var(--spark-neon-color, #0ff);\r\n}\r\n\r\n/* Hologram */\r\n.spark-hologram {\r\n background: linear-gradient(\r\n 45deg,\r\n rgba(255, 0, 128, 0.3),\r\n rgba(0, 255, 255, 0.3),\r\n rgba(255, 255, 0, 0.3)\r\n );\r\n background-size: 400% 400%;\r\n animation: spark-hologram-shift 3s ease infinite;\r\n -webkit-background-clip: text;\r\n background-clip: text;\r\n}\r\n\r\n@keyframes spark-hologram-shift {\r\n 0% { background-position: 0% 50%; }\r\n 50% { background-position: 100% 50%; }\r\n 100% { background-position: 0% 50%; }\r\n}\r\n\r\n/* Glass */\r\n.spark-glass {\r\n backdrop-filter: blur(10px);\r\n background: rgba(255, 255, 255, 0.1);\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n/* Typewriter cursor */\r\n.spark-typewriter-cursor {\r\n animation: spark-cursor-blink 0.7s infinite;\r\n}\r\n\r\n@keyframes spark-cursor-blink {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0; }\r\n}\r\n`\r\n\r\n/**\r\n * Inject base styles into the document\r\n */\r\nexport function injectBaseStyles(): void {\r\n if (typeof document === 'undefined' || stylesInjected) return\r\n\r\n const style = document.createElement('style')\r\n style.id = SPARK_STYLE_ID\r\n style.textContent = baseStyles\r\n document.head.appendChild(style)\r\n stylesInjected = true\r\n}\r\n\r\n/**\r\n * Inject a custom animation keyframes\r\n */\r\nexport function injectAnimation(name: string, keyframes: string): void {\r\n if (typeof document === 'undefined') return\r\n if (injectedAnimations.has(name)) return\r\n\r\n injectBaseStyles()\r\n\r\n const styleEl = document.getElementById(SPARK_STYLE_ID)\r\n if (styleEl) {\r\n styleEl.textContent += `\\n@keyframes ${name} { ${keyframes} }`\r\n injectedAnimations.add(name)\r\n }\r\n}\r\n\r\n/**\r\n * Generate CSS custom properties for an element\r\n */\r\nexport function generateCSSVars(options: {\r\n duration?: number\r\n easing?: string\r\n intensity?: number\r\n}): Record<string, string> {\r\n const vars: Record<string, string> = {}\r\n\r\n if (options.duration !== undefined) {\r\n vars['--spark-duration'] = `${options.duration}ms`\r\n }\r\n if (options.easing !== undefined) {\r\n vars['--spark-easing'] = getEasingValue(options.easing)\r\n }\r\n if (options.intensity !== undefined) {\r\n vars['--spark-intensity'] = String(options.intensity)\r\n }\r\n\r\n return vars\r\n}\r\n\r\n/**\r\n * Convert easing name to CSS value\r\n */\r\nexport function getEasingValue(easing: string): string {\r\n const easings: Record<string, string> = {\r\n linear: 'linear',\r\n ease: 'ease',\r\n 'ease-in': 'ease-in',\r\n 'ease-out': 'ease-out',\r\n 'ease-in-out': 'ease-in-out',\r\n spring: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\r\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n elastic: 'cubic-bezier(0.68, -0.6, 0.32, 1.6)',\r\n }\r\n return easings[easing] ?? easing\r\n}\r\n\r\n/**\r\n * Check if user prefers reduced motion\r\n */\r\nexport function prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n}\r\n","/**\r\n * sparkfx Configuration System\r\n * Global configuration management with type safety\r\n * \r\n * @module core/config\r\n * @version 1.2.0\r\n */\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkConfig {\r\n /** Enable GPU acceleration for animations (default: true) */\r\n gpuAcceleration: boolean\r\n \r\n /** Respect prefers-reduced-motion setting (default: true) */\r\n respectMotionPreference: boolean\r\n \r\n /** Enable lazy loading with Intersection Observer (default: true) */\r\n lazyLoad: boolean\r\n \r\n /** Automatically cleanup effects on element removal (default: true) */\r\n cleanupOnUnmount: boolean\r\n \r\n /** Default animation duration in ms (default: 300) */\r\n defaultDuration: number\r\n \r\n /** Default easing function (default: 'ease-out') */\r\n defaultEasing: string\r\n \r\n /** Enable debug logging (default: false) */\r\n debug: boolean\r\n \r\n /** Theme mode: 'auto' | 'light' | 'dark' (default: 'auto') */\r\n theme: 'auto' | 'light' | 'dark'\r\n \r\n /** Enable accessibility features (default: true) */\r\n a11y: boolean\r\n \r\n /** Custom CSS variable prefix (default: 'spark') */\r\n cssPrefix: string\r\n}\r\n\r\nexport type PartialSparkConfig = Partial<SparkConfig>\r\n\r\n// ============================================================================\r\n// DEFAULT CONFIGURATION\r\n// ============================================================================\r\n\r\nconst DEFAULT_CONFIG: SparkConfig = {\r\n gpuAcceleration: true,\r\n respectMotionPreference: true,\r\n lazyLoad: true,\r\n cleanupOnUnmount: true,\r\n defaultDuration: 300,\r\n defaultEasing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n debug: false,\r\n theme: 'auto',\r\n a11y: true,\r\n cssPrefix: 'spark',\r\n}\r\n\r\n// ============================================================================\r\n// CONFIGURATION MANAGER\r\n// ============================================================================\r\n\r\nclass ConfigManager {\r\n private config: SparkConfig\r\n private listeners: Set<(config: SparkConfig) => void> = new Set()\r\n private initialized = false\r\n\r\n constructor() {\r\n this.config = { ...DEFAULT_CONFIG }\r\n }\r\n\r\n /**\r\n * Initialize configuration with custom options\r\n */\r\n init(options: PartialSparkConfig = {}): void {\r\n if (this.initialized && this.config.debug) {\r\n console.warn('[sparkfx] Config already initialized. Use update() to modify.')\r\n }\r\n \r\n this.config = this.mergeConfig(DEFAULT_CONFIG, options)\r\n this.initialized = true\r\n this.injectCSSVariables()\r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config initialized:', this.config)\r\n }\r\n }\r\n\r\n /**\r\n * Update configuration (partial update supported)\r\n */\r\n update(options: PartialSparkConfig): void {\r\n const oldConfig = { ...this.config }\r\n this.config = this.mergeConfig(this.config, options)\r\n \r\n // Re-inject CSS variables if relevant options changed\r\n if (\r\n oldConfig.cssPrefix !== this.config.cssPrefix ||\r\n oldConfig.defaultDuration !== this.config.defaultDuration ||\r\n oldConfig.defaultEasing !== this.config.defaultEasing\r\n ) {\r\n this.injectCSSVariables()\r\n }\r\n \r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config updated:', this.config)\r\n }\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n get(): Readonly<SparkConfig> {\r\n return Object.freeze({ ...this.config })\r\n }\r\n\r\n /**\r\n * Get a specific config value\r\n */\r\n getValue<K extends keyof SparkConfig>(key: K): SparkConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * Reset configuration to defaults\r\n */\r\n reset(): void {\r\n this.config = { ...DEFAULT_CONFIG }\r\n this.injectCSSVariables()\r\n this.notifyListeners()\r\n \r\n if (this.config.debug) {\r\n console.log('[sparkfx] Config reset to defaults')\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to configuration changes\r\n */\r\n onChange(listener: (config: SparkConfig) => void): () => void {\r\n this.listeners.add(listener)\r\n return () => this.listeners.delete(listener)\r\n }\r\n\r\n /**\r\n * Check if user prefers reduced motion\r\n */\r\n prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n }\r\n\r\n /**\r\n * Get current theme based on config and system preference\r\n */\r\n getCurrentTheme(): 'light' | 'dark' {\r\n if (this.config.theme !== 'auto') {\r\n return this.config.theme\r\n }\r\n \r\n if (typeof window === 'undefined') return 'dark'\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\r\n }\r\n\r\n /**\r\n * Check if animations should run\r\n */\r\n shouldAnimate(): boolean {\r\n if (this.config.respectMotionPreference && this.prefersReducedMotion()) {\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n // ========================================================================\r\n // PRIVATE METHODS\r\n // ========================================================================\r\n\r\n private mergeConfig(base: SparkConfig, updates: PartialSparkConfig): SparkConfig {\r\n const merged = { ...base }\r\n \r\n for (const key of Object.keys(updates) as (keyof SparkConfig)[]) {\r\n if (updates[key] !== undefined) {\r\n (merged as Record<string, unknown>)[key] = updates[key]\r\n }\r\n }\r\n \r\n return merged\r\n }\r\n\r\n private notifyListeners(): void {\r\n const frozenConfig = this.get()\r\n this.listeners.forEach(listener => {\r\n try {\r\n listener(frozenConfig)\r\n } catch (error) {\r\n if (this.config.debug) {\r\n console.error('[sparkfx] Config listener error:', error)\r\n }\r\n }\r\n })\r\n }\r\n\r\n private injectCSSVariables(): void {\r\n if (typeof document === 'undefined') return\r\n\r\n const prefix = this.config.cssPrefix\r\n const styleId = `${prefix}-config-vars`\r\n \r\n // Remove existing style element\r\n const existing = document.getElementById(styleId)\r\n if (existing) {\r\n existing.remove()\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n:root {\r\n --${prefix}-primary: #00ffa3;\r\n --${prefix}-secondary: #00d4ff;\r\n --${prefix}-accent: #a855f7;\r\n --${prefix}-pink: #ff6b9d;\r\n \r\n --${prefix}-duration-fast: 150ms;\r\n --${prefix}-duration-base: ${this.config.defaultDuration}ms;\r\n --${prefix}-duration-slow: 500ms;\r\n \r\n --${prefix}-easing-smooth: ${this.config.defaultEasing};\r\n --${prefix}-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n --${prefix}-easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);\r\n --${prefix}-easing-spring: cubic-bezier(0.5, 1.5, 0.5, 1);\r\n}\r\n`\r\n document.head.appendChild(style)\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SINGLETON EXPORT\r\n// ============================================================================\r\n\r\nexport const configManager = new ConfigManager()\r\n\r\n/**\r\n * Configure sparkfx globally\r\n * \r\n * @example\r\n * import { config } from 'sparkfx'\r\n * \r\n * config({\r\n * defaultDuration: 400,\r\n * theme: 'dark',\r\n * debug: true\r\n * })\r\n */\r\nexport function config(options: PartialSparkConfig): void {\r\n configManager.init(options)\r\n}\r\n\r\n/**\r\n * Update sparkfx configuration\r\n */\r\nexport function updateConfig(options: PartialSparkConfig): void {\r\n configManager.update(options)\r\n}\r\n\r\n/**\r\n * Get current configuration\r\n */\r\nexport function getConfig(): Readonly<SparkConfig> {\r\n return configManager.get()\r\n}\r\n\r\n/**\r\n * Set theme mode\r\n */\r\nexport function setTheme(theme: 'auto' | 'light' | 'dark'): void {\r\n configManager.update({ theme })\r\n}\r\n\r\n/**\r\n * Subscribe to theme changes\r\n */\r\nexport function onThemeChange(callback: (theme: 'light' | 'dark') => void): () => void {\r\n if (typeof window === 'undefined') return () => {}\r\n \r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\r\n const handler = () => callback(configManager.getCurrentTheme())\r\n \r\n mediaQuery.addEventListener('change', handler)\r\n return () => mediaQuery.removeEventListener('change', handler)\r\n}\r\n","/**\r\n * sparkfx Presets\r\n * Pre-configured effect combinations for common use cases\r\n * \r\n * @module core/presets\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from './types'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface PresetConfig {\r\n name: string\r\n description: string\r\n effects: string[]\r\n defaultOptions?: Record<string, unknown>\r\n}\r\n\r\nexport interface Preset {\r\n /** Apply all preset effects to an element */\r\n apply: (element: HTMLElement) => void\r\n\r\n /** Get preset effects as an array */\r\n getEffects: () => string[]\r\n\r\n /** Get CSS classes for the preset */\r\n getClasses: () => string\r\n}\r\n\r\n// ============================================================================\r\n// PRESET DEFINITIONS\r\n// ============================================================================\r\n\r\nexport const presetConfigs: Record<string, PresetConfig> = {\r\n gaming: {\r\n name: 'Gaming',\r\n description: 'High-energy effects for gaming interfaces',\r\n effects: ['neon', 'glitch', 'glow', 'shake'],\r\n defaultOptions: {\r\n neon: { color: '#00ff00' },\r\n glow: { color: '#ff00ff', spread: 30 },\r\n },\r\n },\r\n\r\n minimal: {\r\n name: 'Minimal',\r\n description: 'Subtle, professional effects',\r\n effects: ['lift', 'fade', 'scale'],\r\n defaultOptions: {\r\n lift: { distance: 4 },\r\n scale: { factor: 1.02 },\r\n },\r\n },\r\n\r\n playful: {\r\n name: 'Playful',\r\n description: 'Fun and bouncy effects for engaging UIs',\r\n effects: ['bounce', 'jelly', 'elastic', 'confetti'],\r\n defaultOptions: {\r\n bounce: { height: 12 },\r\n jelly: { intensity: 0.8 },\r\n },\r\n },\r\n\r\n corporate: {\r\n name: 'Corporate',\r\n description: 'Professional and clean effects',\r\n effects: ['lift', 'glass', 'fade'],\r\n defaultOptions: {\r\n lift: { distance: 2, shadow: true },\r\n glass: { blur: 10 },\r\n },\r\n },\r\n\r\n retro: {\r\n name: 'Retro',\r\n description: 'Nostalgic 80s/90s style effects',\r\n effects: ['glitch', 'neon', 'shimmer'],\r\n defaultOptions: {\r\n neon: { color: '#ff0080' },\r\n glitch: { intensity: 0.5 },\r\n },\r\n },\r\n\r\n futuristic: {\r\n name: 'Futuristic',\r\n description: 'Sci-fi inspired holographic effects',\r\n effects: ['hologram', 'aurora', 'glass', 'glow'],\r\n defaultOptions: {\r\n hologram: { opacity: 0.8 },\r\n aurora: { colors: ['#00ffa3', '#00d4ff', '#a855f7'] },\r\n },\r\n },\r\n\r\n elegant: {\r\n name: 'Elegant',\r\n description: 'Sophisticated and luxurious effects',\r\n effects: ['shimmer', 'glow', 'lift', 'glass'],\r\n defaultOptions: {\r\n shimmer: { color: 'rgba(255, 215, 0, 0.3)' },\r\n glow: { color: '#ffd700', spread: 20 },\r\n },\r\n },\r\n\r\n dark: {\r\n name: 'Dark Mode',\r\n description: 'Effects optimized for dark themes',\r\n effects: ['glow', 'neon', 'glass', 'aurora'],\r\n defaultOptions: {\r\n glow: { color: '#00ffa3' },\r\n glass: { blur: 20, opacity: 0.1 },\r\n },\r\n },\r\n}\r\n\r\n// ============================================================================\r\n// PRESET CLASSES\r\n// ============================================================================\r\n\r\n/**\r\n * Generate CSS classes for a preset\r\n */\r\nexport function getPresetClasses(presetName: string): string {\r\n const config = presetConfigs[presetName]\r\n if (!config) return ''\r\n\r\n return config.effects.map(effect => `spark-${effect}`).join(' ')\r\n}\r\n\r\n/**\r\n * Get all available preset names\r\n */\r\nexport function getPresetNames(): string[] {\r\n return Object.keys(presetConfigs)\r\n}\r\n\r\n/**\r\n * Get preset configuration\r\n */\r\nexport function getPresetConfig(name: string): PresetConfig | undefined {\r\n return presetConfigs[name]\r\n}\r\n\r\n// ============================================================================\r\n// PRESET OBJECT\r\n// ============================================================================\r\n\r\nexport const presets = {\r\n gaming: {\r\n name: 'Gaming',\r\n classes: 'spark-neon spark-glitch spark-glow',\r\n },\r\n minimal: {\r\n name: 'Minimal',\r\n classes: 'spark-lift spark-fade spark-scale',\r\n },\r\n playful: {\r\n name: 'Playful',\r\n classes: 'spark-bounce spark-jelly spark-elastic',\r\n },\r\n corporate: {\r\n name: 'Corporate',\r\n classes: 'spark-lift spark-glass spark-fade',\r\n },\r\n retro: {\r\n name: 'Retro',\r\n classes: 'spark-glitch spark-neon spark-shimmer',\r\n },\r\n futuristic: {\r\n name: 'Futuristic',\r\n classes: 'spark-hologram spark-aurora spark-glass spark-glow',\r\n },\r\n elegant: {\r\n name: 'Elegant',\r\n classes: 'spark-shimmer spark-glow spark-lift spark-glass',\r\n },\r\n dark: {\r\n name: 'Dark',\r\n classes: 'spark-glow spark-neon spark-glass spark-aurora',\r\n },\r\n} as const\r\n\r\nexport type PresetName = keyof typeof presets\r\n\r\nexport default presets\r\n","/**\r\n * sparkfx Utility Functions\r\n * Helper functions for effects, animations, and DOM operations\r\n * \r\n * @module core/utils\r\n * @version 1.2.0\r\n */\r\n\r\nimport { configManager } from './config'\r\n\r\n// ============================================================================\r\n// TYPE DEFINITIONS\r\n// ============================================================================\r\n\r\nexport interface AnimationOptions {\r\n duration?: number\r\n easing?: string\r\n delay?: number\r\n fill?: FillMode\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport interface Rect {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n}\r\n\r\n// ============================================================================\r\n// DOM UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Check if code is running in browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined'\r\n}\r\n\r\n/**\r\n * Safely query DOM element\r\n */\r\nexport function safeQuerySelector<T extends Element = Element>(\r\n selector: string,\r\n parent: ParentNode = document\r\n): T | null {\r\n if (!isBrowser()) return null\r\n try {\r\n return parent.querySelector<T>(selector)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Safely query all DOM elements\r\n */\r\nexport function safeQuerySelectorAll<T extends Element = Element>(\r\n selector: string,\r\n parent: ParentNode = document\r\n): T[] {\r\n if (!isBrowser()) return []\r\n try {\r\n return Array.from(parent.querySelectorAll<T>(selector))\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Get element's bounding rect with scroll offset\r\n */\r\nexport function getElementRect(element: Element): Rect {\r\n const rect = element.getBoundingClientRect()\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\r\n\r\n return {\r\n top: rect.top + scrollTop,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n height: rect.height,\r\n }\r\n}\r\n\r\n/**\r\n * Get element center point\r\n */\r\nexport function getElementCenter(element: Element): Point {\r\n const rect = element.getBoundingClientRect()\r\n return {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n }\r\n}\r\n\r\n/**\r\n * Check if element is in viewport\r\n */\r\nexport function isInViewport(element: Element, threshold = 0): boolean {\r\n if (!isBrowser()) return false\r\n\r\n const rect = element.getBoundingClientRect()\r\n const windowHeight = window.innerHeight || document.documentElement.clientHeight\r\n const windowWidth = window.innerWidth || document.documentElement.clientWidth\r\n\r\n const vertInView = (rect.top <= windowHeight * (1 - threshold)) &&\r\n ((rect.top + rect.height) >= windowHeight * threshold)\r\n const horInView = (rect.left <= windowWidth * (1 - threshold)) &&\r\n ((rect.left + rect.width) >= windowWidth * threshold)\r\n\r\n return vertInView && horInView\r\n}\r\n\r\n// ============================================================================\r\n// ANIMATION UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Generate unique animation ID\r\n */\r\nlet animationCounter = 0\r\nexport function generateAnimationId(prefix = 'spark'): string {\r\n return `${prefix}-${Date.now().toString(36)}-${(animationCounter++).toString(36)}`\r\n}\r\n\r\n/**\r\n * Create CSS keyframes and inject into document\r\n */\r\nexport function injectKeyframes(name: string, keyframes: string): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-keyframes-${name}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `@keyframes ${name} { ${keyframes} }`\r\n document.head.appendChild(style)\r\n}\r\n\r\n/**\r\n * Remove injected keyframes\r\n */\r\nexport function removeKeyframes(name: string): void {\r\n if (!isBrowser()) return\r\n\r\n const style = document.getElementById(`spark-keyframes-${name}`)\r\n if (style) {\r\n style.remove()\r\n }\r\n}\r\n\r\n/**\r\n * Apply GPU-accelerated transform\r\n */\r\nexport function applyTransform(\r\n element: HTMLElement,\r\n transform: string,\r\n options: AnimationOptions = {}\r\n): void {\r\n const config = configManager.get()\r\n const duration = options.duration ?? config.defaultDuration\r\n const easing = options.easing ?? config.defaultEasing\r\n\r\n if (config.gpuAcceleration) {\r\n element.style.willChange = 'transform'\r\n }\r\n\r\n element.style.transition = `transform ${duration}ms ${easing}`\r\n element.style.transform = transform\r\n}\r\n\r\n/**\r\n * Reset transform\r\n */\r\nexport function resetTransform(element: HTMLElement): void {\r\n element.style.transform = ''\r\n element.style.willChange = ''\r\n element.style.transition = ''\r\n}\r\n\r\n/**\r\n * Request animation frame with fallback\r\n */\r\nexport const raf = isBrowser()\r\n ? window.requestAnimationFrame.bind(window)\r\n : (callback: FrameRequestCallback) => setTimeout(callback, 16)\r\n\r\n/**\r\n * Cancel animation frame with fallback\r\n */\r\nexport const cancelRaf = isBrowser()\r\n ? window.cancelAnimationFrame.bind(window)\r\n : (id: number) => clearTimeout(id)\r\n\r\n// ============================================================================\r\n// MATH UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Clamp number between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, factor: number): number {\r\n return start + (end - start) * factor\r\n}\r\n\r\n/**\r\n * Map value from one range to another\r\n */\r\nexport function mapRange(\r\n value: number,\r\n inMin: number,\r\n inMax: number,\r\n outMin: number,\r\n outMax: number\r\n): number {\r\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\r\n}\r\n\r\n/**\r\n * Calculate distance between two points\r\n */\r\nexport function distance(p1: Point, p2: Point): number {\r\n const dx = p2.x - p1.x\r\n const dy = p2.y - p1.y\r\n return Math.sqrt(dx * dx + dy * dy)\r\n}\r\n\r\n/**\r\n * Calculate angle between two points (in radians)\r\n */\r\nexport function angle(p1: Point, p2: Point): number {\r\n return Math.atan2(p2.y - p1.y, p2.x - p1.x)\r\n}\r\n\r\n/**\r\n * Convert degrees to radians\r\n */\r\nexport function degToRad(degrees: number): number {\r\n return degrees * (Math.PI / 180)\r\n}\r\n\r\n/**\r\n * Convert radians to degrees\r\n */\r\nexport function radToDeg(radians: number): number {\r\n return radians * (180 / Math.PI)\r\n}\r\n\r\n/**\r\n * Generate random number between min and max\r\n */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\n/**\r\n * Generate random integer between min and max (inclusive)\r\n */\r\nexport function randomInt(min: number, max: number): number {\r\n return Math.floor(random(min, max + 1))\r\n}\r\n\r\n// ============================================================================\r\n// COLOR UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Parse color string to RGB values\r\n */\r\nexport function parseColor(color: string): { r: number; g: number; b: number } | null {\r\n if (!isBrowser()) return null\r\n\r\n // Use canvas to parse color\r\n const canvas = document.createElement('canvas')\r\n canvas.width = canvas.height = 1\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n\r\n ctx.fillStyle = color\r\n ctx.fillRect(0, 0, 1, 1)\r\n const data = ctx.getImageData(0, 0, 1, 1).data\r\n\r\n return { r: data[0], g: data[1], b: data[2] }\r\n}\r\n\r\n/**\r\n * Convert RGB to hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (n: number) => {\r\n const hex = clamp(Math.round(n), 0, 255).toString(16)\r\n return hex.length === 1 ? '0' + hex : hex\r\n }\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\r\n}\r\n\r\n/**\r\n * Adjust color brightness\r\n */\r\nexport function adjustBrightness(color: string, amount: number): string {\r\n const rgb = parseColor(color)\r\n if (!rgb) return color\r\n\r\n return rgbToHex(\r\n rgb.r + amount,\r\n rgb.g + amount,\r\n rgb.b + amount\r\n )\r\n}\r\n\r\n/**\r\n * Create color with alpha\r\n */\r\nexport function colorWithAlpha(color: string, alpha: number): string {\r\n const rgb = parseColor(color)\r\n if (!rgb) return color\r\n\r\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clamp(alpha, 0, 1)})`\r\n}\r\n\r\n// ============================================================================\r\n// VALIDATION UTILITIES\r\n// ============================================================================\r\n\r\n/**\r\n * Validate and sanitize number\r\n */\r\nexport function validateNumber(\r\n value: unknown,\r\n min: number,\r\n max: number,\r\n fallback: number\r\n): number {\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n return fallback\r\n }\r\n return clamp(value, min, max)\r\n}\r\n\r\n/**\r\n * Validate and sanitize string\r\n */\r\nexport function validateString(value: unknown, fallback: string): string {\r\n if (typeof value !== 'string') {\r\n return fallback\r\n }\r\n return value.trim()\r\n}\r\n\r\n/**\r\n * Sanitize CSS color value (prevent XSS)\r\n */\r\nexport function sanitizeColor(color: unknown, fallback: string): string {\r\n if (typeof color !== 'string') return fallback\r\n\r\n // Allow hex, rgb, rgba, hsl, hsla, and named colors\r\n const sanitized = color.replace(/[^a-zA-Z0-9#(),.\\s%-]/g, '')\r\n\r\n // Validate format\r\n const validPatterns = [\r\n /^#[0-9a-fA-F]{3,8}$/, // Hex\r\n /^rgb\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\)$/, // RGB\r\n /^rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*[\\d.]+\\s*\\)$/, // RGBA\r\n /^hsl\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%\\s*\\)$/, // HSL\r\n /^hsla\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+\\s*\\)$/, // HSLA\r\n /^[a-zA-Z]+$/, // Named colors\r\n ]\r\n\r\n const isValid = validPatterns.some(pattern => pattern.test(sanitized))\r\n return isValid ? sanitized : fallback\r\n}\r\n\r\n// ============================================================================\r\n// EASING FUNCTIONS\r\n// ============================================================================\r\n\r\nexport const easings = {\r\n linear: (t: number) => t,\r\n easeInQuad: (t: number) => t * t,\r\n easeOutQuad: (t: number) => t * (2 - t),\r\n easeInOutQuad: (t: number) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t,\r\n easeInCubic: (t: number) => t * t * t,\r\n easeOutCubic: (t: number) => (--t) * t * t + 1,\r\n easeInOutCubic: (t: number) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\r\n easeInQuart: (t: number) => t * t * t * t,\r\n easeOutQuart: (t: number) => 1 - (--t) * t * t * t,\r\n easeInOutQuart: (t: number) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t,\r\n easeInElastic: (t: number) => {\r\n const c4 = (2 * Math.PI) / 3\r\n return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4)\r\n },\r\n easeOutElastic: (t: number) => {\r\n const c4 = (2 * Math.PI) / 3\r\n return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\r\n },\r\n easeOutBounce: (t: number) => {\r\n const n1 = 7.5625\r\n const d1 = 2.75\r\n if (t < 1 / d1) return n1 * t * t\r\n if (t < 2 / d1) return n1 * (t -= 1.5 / d1) * t + 0.75\r\n if (t < 2.5 / d1) return n1 * (t -= 2.25 / d1) * t + 0.9375\r\n return n1 * (t -= 2.625 / d1) * t + 0.984375\r\n },\r\n} as const\r\n\r\nexport type EasingName = keyof typeof easings\r\n\r\n// ============================================================================\r\n// DEBOUNCE & THROTTLE\r\n// ============================================================================\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n timeoutId = setTimeout(() => func(...args), wait)\r\n }\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean\r\n let lastFunc: ReturnType<typeof setTimeout>\r\n let lastRan: number\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func(...args)\r\n lastRan = Date.now()\r\n inThrottle = true\r\n } else {\r\n clearTimeout(lastFunc)\r\n lastFunc = setTimeout(() => {\r\n if (Date.now() - lastRan >= limit) {\r\n func(...args)\r\n lastRan = Date.now()\r\n }\r\n }, limit - (Date.now() - lastRan))\r\n }\r\n }\r\n}\r\n","/**\r\n * sparkfx Accessibility Module\r\n * Comprehensive a11y support for animations and effects\r\n * \r\n * @module core/a11y\r\n * @version 1.2.0\r\n */\r\n\r\nimport { isBrowser } from './utils'\r\nimport { configManager } from './config'\r\n\r\n// ============================================================================\r\n// TYPE DEFINITIONS\r\n// ============================================================================\r\n\r\nexport interface A11yOptions {\r\n /** Announce effect to screen readers */\r\n announce?: boolean\r\n\r\n /** Custom announcement message */\r\n announceMessage?: string\r\n\r\n /** Role attribute for element */\r\n role?: string\r\n\r\n /** Label for the effect */\r\n label?: string\r\n\r\n /** Is element focusable */\r\n focusable?: boolean\r\n\r\n /** Reduced motion alternative */\r\n reducedMotionAlternative?: 'none' | 'fade' | 'simple'\r\n}\r\n\r\nexport interface A11yState {\r\n prefersReducedMotion: boolean\r\n prefersHighContrast: boolean\r\n screenReaderActive: boolean\r\n}\r\n\r\n// ============================================================================\r\n// MEDIA QUERY DETECTION\r\n// ============================================================================\r\n\r\nlet cachedState: A11yState | null = null\r\n\r\n/**\r\n * Get current accessibility state\r\n */\r\nexport function getA11yState(): A11yState {\r\n if (!isBrowser()) {\r\n return {\r\n prefersReducedMotion: false,\r\n prefersHighContrast: false,\r\n screenReaderActive: false,\r\n }\r\n }\r\n\r\n // Return cached state if available\r\n if (cachedState) return cachedState\r\n\r\n cachedState = {\r\n prefersReducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\r\n prefersHighContrast: window.matchMedia('(prefers-contrast: more)').matches,\r\n screenReaderActive: detectScreenReader(),\r\n }\r\n\r\n return cachedState\r\n}\r\n\r\n/**\r\n * Detect if screen reader is likely active\r\n */\r\nfunction detectScreenReader(): boolean {\r\n if (!isBrowser()) return false\r\n\r\n // Check for common screen reader indicators\r\n const indicators = [\r\n // NVDA\r\n document.querySelector('[data-nvda]'),\r\n // JAWS\r\n window.hasOwnProperty('JAWS'),\r\n // VoiceOver (iOS/macOS)\r\n document.querySelector('.voiceover-detected'),\r\n // Check for focus-visible polyfill (often used with screen readers)\r\n document.documentElement.classList.contains('js-focus-visible'),\r\n ]\r\n\r\n return indicators.some(Boolean)\r\n}\r\n\r\n/**\r\n * Clear cached accessibility state\r\n */\r\nexport function clearA11yCache(): void {\r\n cachedState = null\r\n}\r\n\r\n// ============================================================================\r\n// MEDIA QUERY LISTENERS\r\n// ============================================================================\r\n\r\ntype A11yChangeCallback = (state: A11yState) => void\r\nconst listeners = new Set<A11yChangeCallback>()\r\n\r\n/**\r\n * Subscribe to accessibility preference changes\r\n */\r\nexport function onA11yChange(callback: A11yChangeCallback): () => void {\r\n if (!isBrowser()) return () => { }\r\n\r\n listeners.add(callback)\r\n\r\n // Set up media query listeners on first subscriber\r\n if (listeners.size === 1) {\r\n setupMediaQueryListeners()\r\n }\r\n\r\n return () => {\r\n listeners.delete(callback)\r\n }\r\n}\r\n\r\nfunction setupMediaQueryListeners(): void {\r\n if (!isBrowser()) return\r\n\r\n const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\r\n const contrastQuery = window.matchMedia('(prefers-contrast: more)')\r\n\r\n const handleChange = () => {\r\n clearA11yCache()\r\n const state = getA11yState()\r\n listeners.forEach(callback => callback(state))\r\n }\r\n\r\n motionQuery.addEventListener('change', handleChange)\r\n contrastQuery.addEventListener('change', handleChange)\r\n}\r\n\r\n// ============================================================================\r\n// REDUCED MOTION HANDLING\r\n// ============================================================================\r\n\r\n/**\r\n * Check if animations should be reduced\r\n */\r\nexport function shouldReduceMotion(): boolean {\r\n const config = configManager.get()\r\n\r\n if (!config.respectMotionPreference) {\r\n return false\r\n }\r\n\r\n return getA11yState().prefersReducedMotion\r\n}\r\n\r\n/**\r\n * Get reduced motion CSS for an animation\r\n */\r\nexport function getReducedMotionCSS(alternative: 'none' | 'fade' | 'simple' = 'fade'): string {\r\n switch (alternative) {\r\n case 'none':\r\n return 'animation: none !important; transition: none !important;'\r\n case 'fade':\r\n return 'animation: none !important; transition: opacity 200ms ease !important;'\r\n case 'simple':\r\n return 'animation-duration: 0.01ms !important; animation-iteration-count: 1 !important;'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\n/**\r\n * Apply reduced motion styles to element\r\n */\r\nexport function applyReducedMotion(\r\n element: HTMLElement,\r\n alternative: 'none' | 'fade' | 'simple' = 'fade'\r\n): void {\r\n if (!shouldReduceMotion()) return\r\n\r\n const css = getReducedMotionCSS(alternative)\r\n element.style.cssText += css\r\n element.setAttribute('data-spark-reduced-motion', 'true')\r\n}\r\n\r\n// ============================================================================\r\n// SCREEN READER ANNOUNCEMENTS\r\n// ============================================================================\r\n\r\nlet announcer: HTMLElement | null = null\r\n\r\n/**\r\n * Create announcer element for screen readers\r\n */\r\nfunction getAnnouncer(): HTMLElement {\r\n if (!isBrowser()) {\r\n throw new Error('Cannot create announcer in non-browser environment')\r\n }\r\n\r\n if (announcer && document.body.contains(announcer)) {\r\n return announcer\r\n }\r\n\r\n announcer = document.createElement('div')\r\n announcer.setAttribute('aria-live', 'polite')\r\n announcer.setAttribute('aria-atomic', 'true')\r\n announcer.setAttribute('role', 'status')\r\n announcer.className = 'spark-a11y-announcer'\r\n\r\n // Visually hidden but accessible to screen readers\r\n Object.assign(announcer.style, {\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0',\r\n })\r\n\r\n document.body.appendChild(announcer)\r\n return announcer\r\n}\r\n\r\n/**\r\n * Announce message to screen readers\r\n */\r\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\r\n if (!isBrowser()) return\r\n\r\n const config = configManager.get()\r\n if (!config.a11y) return\r\n\r\n const announcerEl = getAnnouncer()\r\n announcerEl.setAttribute('aria-live', priority)\r\n\r\n // Clear and set message (triggers announcement)\r\n announcerEl.textContent = ''\r\n\r\n // Use setTimeout to ensure the DOM update is processed\r\n setTimeout(() => {\r\n announcerEl.textContent = message\r\n }, 100)\r\n}\r\n\r\n/**\r\n * Get default announcement for effect\r\n */\r\nexport function getEffectAnnouncement(effectName: string): string {\r\n const announcements: Record<string, string> = {\r\n bounce: 'Element bounced',\r\n glow: 'Element is glowing',\r\n pulse: 'Element is pulsing',\r\n shake: 'Element shook',\r\n confetti: 'Celebration animation played',\r\n sparkle: 'Sparkle effect activated',\r\n firework: 'Firework animation played',\r\n typewriter: 'Text typing animation',\r\n reveal: 'Content revealed',\r\n }\r\n\r\n return announcements[effectName] || `${effectName} effect activated`\r\n}\r\n\r\n// ============================================================================\r\n// FOCUS MANAGEMENT\r\n// ============================================================================\r\n\r\n/**\r\n * Make element focusable\r\n */\r\nexport function makeFocusable(element: HTMLElement): void {\r\n if (!element.hasAttribute('tabindex')) {\r\n element.setAttribute('tabindex', '0')\r\n }\r\n}\r\n\r\n/**\r\n * Add keyboard activation support\r\n */\r\nexport function addKeyboardSupport(\r\n element: HTMLElement,\r\n handler: (event: KeyboardEvent) => void\r\n): () => void {\r\n const keyHandler = (event: KeyboardEvent) => {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n handler(event)\r\n }\r\n }\r\n\r\n element.addEventListener('keydown', keyHandler)\r\n\r\n return () => {\r\n element.removeEventListener('keydown', keyHandler)\r\n }\r\n}\r\n\r\n/**\r\n * Create focus trap for modals/dialogs\r\n */\r\nexport function createFocusTrap(container: HTMLElement): {\r\n activate: () => void\r\n deactivate: () => void\r\n} {\r\n let previouslyFocused: HTMLElement | null = null\r\n\r\n const focusableSelectors = [\r\n 'button',\r\n '[href]',\r\n 'input',\r\n 'select',\r\n 'textarea',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(', ')\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Tab') return\r\n\r\n const focusableElements = container.querySelectorAll<HTMLElement>(focusableSelectors)\r\n const firstElement = focusableElements[0]\r\n const lastElement = focusableElements[focusableElements.length - 1]\r\n\r\n if (event.shiftKey && document.activeElement === firstElement) {\r\n event.preventDefault()\r\n lastElement?.focus()\r\n } else if (!event.shiftKey && document.activeElement === lastElement) {\r\n event.preventDefault()\r\n firstElement?.focus()\r\n }\r\n }\r\n\r\n return {\r\n activate() {\r\n previouslyFocused = document.activeElement as HTMLElement\r\n container.addEventListener('keydown', handleKeyDown)\r\n\r\n const firstFocusable = container.querySelector<HTMLElement>(focusableSelectors)\r\n firstFocusable?.focus()\r\n },\r\n deactivate() {\r\n container.removeEventListener('keydown', handleKeyDown)\r\n previouslyFocused?.focus()\r\n },\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ARIA ATTRIBUTES\r\n// ============================================================================\r\n\r\n/**\r\n * Apply accessibility attributes to element\r\n */\r\nexport function applyA11yAttributes(element: HTMLElement, options: A11yOptions): void {\r\n if (options.role) {\r\n element.setAttribute('role', options.role)\r\n }\r\n\r\n if (options.label) {\r\n element.setAttribute('aria-label', options.label)\r\n }\r\n\r\n if (options.focusable) {\r\n makeFocusable(element)\r\n }\r\n\r\n // Add data attribute for styling hooks\r\n element.setAttribute('data-spark-a11y', 'true')\r\n}\r\n\r\n/**\r\n * Apply effect with accessibility support\r\n */\r\nexport function wrapWithA11y<T>(\r\n effectFn: () => T,\r\n element: HTMLElement,\r\n effectName: string,\r\n options: A11yOptions = {}\r\n): T {\r\n const config = configManager.get()\r\n\r\n // Apply reduced motion if needed\r\n if (shouldReduceMotion()) {\r\n applyReducedMotion(element, options.reducedMotionAlternative)\r\n }\r\n\r\n // Apply ARIA attributes\r\n if (config.a11y) {\r\n applyA11yAttributes(element, options)\r\n }\r\n\r\n // Execute effect\r\n const result = effectFn()\r\n\r\n // Announce if configured\r\n if (options.announce && config.a11y) {\r\n const message = options.announceMessage || getEffectAnnouncement(effectName)\r\n announce(message)\r\n }\r\n\r\n return result\r\n}\r\n\r\n// ============================================================================\r\n// HIGH CONTRAST SUPPORT\r\n// ============================================================================\r\n\r\n/**\r\n * Check if high contrast mode is active\r\n */\r\nexport function isHighContrastMode(): boolean {\r\n return getA11yState().prefersHighContrast\r\n}\r\n\r\n/**\r\n * Get high contrast safe color\r\n */\r\nexport function getHighContrastColor(color: string, fallback: string): string {\r\n if (!isHighContrastMode()) return color\r\n\r\n // In high contrast mode, use system colors\r\n const highContrastColors: Record<string, string> = {\r\n primary: 'CanvasText',\r\n secondary: 'LinkText',\r\n background: 'Canvas',\r\n border: 'CanvasText',\r\n }\r\n\r\n return highContrastColors[color] || fallback\r\n}\r\n","/**\r\n * Combine API\r\n * Combine multiple effects on a single element\r\n * \r\n * @module api/combine\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\n\r\n/**\r\n * Combine multiple sparkfx effects into one\r\n * \r\n * @example\r\n * const fx = combine([\r\n * spark.glow({ color: '#00ffa3' }),\r\n * spark.bounce(),\r\n * spark.shimmer()\r\n * ])\r\n * element.classList.add(fx.className)\r\n */\r\nexport function combine(effects: SparkEffectResult[]): SparkEffectResult {\r\n if (effects.length === 0) {\r\n return {\r\n className: '',\r\n }\r\n }\r\n\r\n // Merge class names\r\n const classNames = effects\r\n .map(e => e.className)\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n // Merge styles\r\n const mergedStyle: Record<string, string> = {}\r\n effects.forEach(effect => {\r\n if (effect.style) {\r\n Object.assign(mergedStyle, effect.style)\r\n }\r\n })\r\n\r\n // Combine event handlers\r\n const combinedOnMouseEnter = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseEnter) {\r\n effect.onMouseEnter(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnMouseLeave = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseLeave) {\r\n effect.onMouseLeave(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnMouseMove = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onMouseMove) {\r\n effect.onMouseMove(event)\r\n }\r\n })\r\n }\r\n\r\n const combinedOnClick = (event: MouseEvent) => {\r\n effects.forEach(effect => {\r\n if (effect.onClick) {\r\n effect.onClick(event)\r\n }\r\n })\r\n }\r\n\r\n // Combine cleanup functions\r\n const combinedCleanup = () => {\r\n effects.forEach(effect => {\r\n if (effect.cleanup) {\r\n effect.cleanup()\r\n }\r\n })\r\n }\r\n\r\n // Check if any effect has handlers\r\n const hasMouseEnter = effects.some(e => e.onMouseEnter)\r\n const hasMouseLeave = effects.some(e => e.onMouseLeave)\r\n const hasMouseMove = effects.some(e => e.onMouseMove)\r\n const hasClick = effects.some(e => e.onClick)\r\n const hasCleanup = effects.some(e => e.cleanup)\r\n\r\n return {\r\n className: classNames,\r\n style: Object.keys(mergedStyle).length > 0 ? mergedStyle : undefined,\r\n onMouseEnter: hasMouseEnter ? combinedOnMouseEnter : undefined,\r\n onMouseLeave: hasMouseLeave ? combinedOnMouseLeave : undefined,\r\n onMouseMove: hasMouseMove ? combinedOnMouseMove : undefined,\r\n onClick: hasClick ? combinedOnClick : undefined,\r\n cleanup: hasCleanup ? combinedCleanup : undefined,\r\n }\r\n}\r\n\r\nexport default combine\r\n","/**\r\n * Sequence API\r\n * Chain animations in sequence\r\n * \r\n * @module api/sequence\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\nimport { isBrowser } from '../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SequenceStep {\r\n /** Effect to apply */\r\n effect: SparkEffectResult\r\n\r\n /** Delay before this step in ms. Default: 0 */\r\n delay?: number\r\n\r\n /** Duration of this step in ms. Default: 300 */\r\n duration?: number\r\n\r\n /** Callback when step starts */\r\n onStart?: () => void\r\n\r\n /** Callback when step ends */\r\n onEnd?: () => void\r\n}\r\n\r\nexport interface SequenceOptions {\r\n /** Loop the sequence. Default: false */\r\n loop?: boolean\r\n\r\n /** Number of loops (-1 for infinite). Default: 1 */\r\n loopCount?: number\r\n\r\n /** Delay between loops in ms. Default: 0 */\r\n loopDelay?: number\r\n\r\n /** Callback when sequence completes */\r\n onComplete?: () => void\r\n}\r\n\r\nexport interface SequenceController {\r\n /** Start the sequence */\r\n play: () => void\r\n\r\n /** Pause the sequence */\r\n pause: () => void\r\n\r\n /** Stop and reset the sequence */\r\n stop: () => void\r\n\r\n /** Get current step index */\r\n getCurrentStep: () => number\r\n\r\n /** Check if sequence is playing */\r\n isPlaying: () => boolean\r\n}\r\n\r\n// ============================================================================\r\n// SEQUENCE\r\n// ============================================================================\r\n\r\n/**\r\n * Create an animation sequence\r\n * \r\n * @example\r\n * const seq = sequence([\r\n * { effect: spark.fade(), delay: 0, duration: 300 },\r\n * { effect: spark.bounce(), delay: 100, duration: 500 },\r\n * { effect: spark.glow(), delay: 200, duration: 400 }\r\n * ], { loop: true })\r\n * \r\n * // Apply to element and start\r\n * seq.play()\r\n */\r\nexport function sequence(\r\n element: HTMLElement | null,\r\n steps: SequenceStep[],\r\n options: SequenceOptions = {}\r\n): SequenceController {\r\n const opts = {\r\n loop: false,\r\n loopCount: 1,\r\n loopDelay: 0,\r\n ...options,\r\n }\r\n\r\n let currentStepIndex = 0\r\n let playing = false\r\n let loopsCompleted = 0\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n let appliedClasses: string[] = []\r\n\r\n const cleanupCurrentStep = () => {\r\n if (element && appliedClasses.length > 0) {\r\n appliedClasses.forEach(cls => {\r\n cls.split(' ').forEach(c => c && element.classList.remove(c))\r\n })\r\n appliedClasses = []\r\n }\r\n }\r\n\r\n const applyStep = (step: SequenceStep) => {\r\n if (!element || !isBrowser()) return\r\n\r\n // Apply effect\r\n if (step.effect.className) {\r\n step.effect.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\r\n appliedClasses.push(step.effect.className)\r\n }\r\n\r\n if (step.effect.style) {\r\n Object.entries(step.effect.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Trigger onStart callback\r\n if (step.onStart) {\r\n step.onStart()\r\n }\r\n }\r\n\r\n const executeStep = (index: number) => {\r\n if (!playing || index >= steps.length) {\r\n // Sequence complete\r\n if (opts.loop && (opts.loopCount === -1 || loopsCompleted < opts.loopCount - 1)) {\r\n // Loop\r\n loopsCompleted++\r\n timeoutId = setTimeout(() => {\r\n currentStepIndex = 0\r\n cleanupCurrentStep()\r\n executeStep(0)\r\n }, opts.loopDelay)\r\n } else {\r\n // Done\r\n playing = false\r\n if (options.onComplete) {\r\n options.onComplete()\r\n }\r\n }\r\n return\r\n }\r\n\r\n const step = steps[index]\r\n currentStepIndex = index\r\n\r\n // Wait for delay, then apply\r\n timeoutId = setTimeout(() => {\r\n applyStep(step)\r\n\r\n // Wait for duration, then next step\r\n timeoutId = setTimeout(() => {\r\n if (step.onEnd) {\r\n step.onEnd()\r\n }\r\n cleanupCurrentStep()\r\n executeStep(index + 1)\r\n }, step.duration || 300)\r\n }, step.delay || 0)\r\n }\r\n\r\n const play = () => {\r\n if (playing) return\r\n playing = true\r\n executeStep(currentStepIndex)\r\n }\r\n\r\n const pause = () => {\r\n playing = false\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n timeoutId = null\r\n }\r\n }\r\n\r\n const stop = () => {\r\n pause()\r\n currentStepIndex = 0\r\n loopsCompleted = 0\r\n cleanupCurrentStep()\r\n }\r\n\r\n const getCurrentStep = () => currentStepIndex\r\n const isPlaying = () => playing\r\n\r\n return {\r\n play,\r\n pause,\r\n stop,\r\n getCurrentStep,\r\n isPlaying,\r\n }\r\n}\r\n\r\nexport default sequence\r\n","/**\r\n * Stagger API\r\n * Apply effects with staggered delays\r\n * \r\n * @module api/stagger\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkEffectResult } from '../core/types'\r\nimport { isBrowser, safeQuerySelectorAll } from '../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface StaggerOptions {\r\n /** Delay between each element in ms. Default: 100 */\r\n delay?: number\r\n\r\n /** Starting delay in ms. Default: 0 */\r\n startDelay?: number\r\n\r\n /** Stagger direction: 'normal' | 'reverse' | 'random'. Default: 'normal' */\r\n direction?: 'normal' | 'reverse' | 'random'\r\n\r\n /** Easing for delay progression. Default: 'linear' */\r\n easing?: 'linear' | 'ease-in' | 'ease-out'\r\n\r\n /** Callback when all animations start */\r\n onStart?: () => void\r\n\r\n /** Callback for each element animation */\r\n onElementStart?: (element: HTMLElement, index: number) => void\r\n\r\n /** Callback when all animations complete */\r\n onComplete?: () => void\r\n}\r\n\r\nexport interface StaggerController {\r\n /** Start the stagger animation */\r\n play: () => void\r\n\r\n /** Cancel all pending animations */\r\n cancel: () => void\r\n\r\n /** Get elements being animated */\r\n getElements: () => HTMLElement[]\r\n}\r\n\r\n// ============================================================================\r\n// STAGGER\r\n// ============================================================================\r\n\r\n/**\r\n * Apply effect with staggered timing to multiple elements\r\n * \r\n * @example\r\n * const staggered = stagger('.card', spark.reveal(), { delay: 100 })\r\n * staggered.play()\r\n */\r\nexport function stagger(\r\n selector: string | HTMLElement[],\r\n effect: SparkEffectResult,\r\n options: StaggerOptions = {}\r\n): StaggerController {\r\n const opts = {\r\n delay: 100,\r\n startDelay: 0,\r\n direction: 'normal' as const,\r\n easing: 'linear' as const,\r\n ...options,\r\n }\r\n\r\n let elements: HTMLElement[] = []\r\n let timeoutIds: ReturnType<typeof setTimeout>[] = []\r\n let started = false\r\n\r\n // Get elements\r\n const getElements = (): HTMLElement[] => {\r\n if (!isBrowser()) return []\r\n\r\n if (Array.isArray(selector)) {\r\n elements = selector\r\n } else {\r\n elements = safeQuerySelectorAll<HTMLElement>(selector)\r\n }\r\n\r\n // Apply direction\r\n if (opts.direction === 'reverse') {\r\n elements = [...elements].reverse()\r\n } else if (opts.direction === 'random') {\r\n elements = [...elements].sort(() => Math.random() - 0.5)\r\n }\r\n\r\n return elements\r\n }\r\n\r\n // Calculate delay for each element\r\n const getDelay = (index: number, total: number): number => {\r\n const baseDelay = opts.startDelay + (index * opts.delay)\r\n\r\n switch (opts.easing) {\r\n case 'ease-in':\r\n // Delays get progressively longer\r\n return opts.startDelay + Math.pow(index / total, 2) * opts.delay * total\r\n case 'ease-out':\r\n // Delays get progressively shorter\r\n return opts.startDelay + (1 - Math.pow(1 - index / total, 2)) * opts.delay * total\r\n default:\r\n return baseDelay\r\n }\r\n }\r\n\r\n // Apply effect to element\r\n const applyEffect = (element: HTMLElement) => {\r\n if (effect.className) {\r\n effect.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\r\n }\r\n\r\n if (effect.style) {\r\n Object.entries(effect.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Attach event handlers if needed\r\n if (effect.onMouseEnter) {\r\n element.addEventListener('mouseenter', effect.onMouseEnter)\r\n }\r\n if (effect.onMouseLeave) {\r\n element.addEventListener('mouseleave', effect.onMouseLeave)\r\n }\r\n if (effect.onMouseMove) {\r\n element.addEventListener('mousemove', effect.onMouseMove)\r\n }\r\n if (effect.onClick) {\r\n element.addEventListener('click', effect.onClick)\r\n }\r\n }\r\n\r\n const play = () => {\r\n if (started) return\r\n started = true\r\n\r\n const els = getElements()\r\n if (els.length === 0) return\r\n\r\n if (opts.onStart) {\r\n opts.onStart()\r\n }\r\n\r\n let completedCount = 0\r\n\r\n els.forEach((element, index) => {\r\n const delay = getDelay(index, els.length)\r\n\r\n const timeoutId = setTimeout(() => {\r\n applyEffect(element)\r\n\r\n if (opts.onElementStart) {\r\n opts.onElementStart(element, index)\r\n }\r\n\r\n completedCount++\r\n\r\n // Check if all elements have started their animation\r\n if (completedCount === els.length && opts.onComplete) {\r\n opts.onComplete()\r\n }\r\n }, delay)\r\n\r\n timeoutIds.push(timeoutId)\r\n })\r\n }\r\n\r\n const cancel = () => {\r\n timeoutIds.forEach(id => clearTimeout(id))\r\n timeoutIds = []\r\n started = false\r\n }\r\n\r\n return {\r\n play,\r\n cancel,\r\n getElements: () => elements,\r\n }\r\n}\r\n\r\nexport default stagger\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Core engine that powers all effects\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from './types'\r\nimport {\r\n injectBaseStyles as _injectBaseStyles,\r\n generateCSSVars as _generateCSSVars,\r\n prefersReducedMotion as _prefersReducedMotion,\r\n} from './styles'\r\n\r\n// Re-export for effects\r\nexport const injectBaseStyles = _injectBaseStyles\r\nexport const generateCSSVars = _generateCSSVars\r\nexport const prefersReducedMotion = _prefersReducedMotion\r\n\r\n/** Default options */\r\nconst defaults: Required<SparkBaseOptions> = {\r\n duration: 300,\r\n intensity: 1,\r\n trigger: 'hover',\r\n easing: 'ease-out',\r\n delay: 0,\r\n reduceMotion: true,\r\n}\r\n\r\n/**\r\n * Merge user options with defaults\r\n */\r\nexport function mergeOptions<T extends SparkBaseOptions>(\r\n options?: T,\r\n effectDefaults?: Partial<T>\r\n): Required<SparkBaseOptions> & T {\r\n return { ...defaults, ...effectDefaults, ...options } as Required<SparkBaseOptions> & T\r\n}\r\n\r\n/**\r\n * Check if animations should be disabled\r\n */\r\nexport function shouldAnimate(options: SparkBaseOptions): boolean {\r\n if (options.reduceMotion !== false && prefersReducedMotion()) {\r\n return false\r\n }\r\n return true\r\n}\r\n\r\n/**\r\n * Create a basic effect result with common properties\r\n */\r\nexport function createEffectResult(\r\n options: SparkBaseOptions,\r\n additionalStyles?: Record<string, string | number>,\r\n additionalClasses?: string[]\r\n): SparkResult {\r\n injectBaseStyles()\r\n\r\n const cssVars = generateCSSVars({\r\n duration: options.duration,\r\n easing: options.easing,\r\n intensity: options.intensity,\r\n })\r\n\r\n const classes = ['sparkfx-effect']\r\n if (!shouldAnimate(options)) {\r\n classes.push('sparkfx-reduced-motion')\r\n }\r\n if (additionalClasses) {\r\n classes.push(...additionalClasses)\r\n }\r\n\r\n return {\r\n className: classes.join(' '),\r\n style: { ...cssVars, ...additionalStyles },\r\n }\r\n}\r\n\r\n/**\r\n * Create a simple effect result from direct properties\r\n * Used by new effects that manage their own styles\r\n */\r\nexport function createSimpleEffectResult(props: Partial<SparkResult> & { className: string }): SparkResult {\r\n injectBaseStyles()\r\n return {\r\n className: props.className || '',\r\n style: props.style,\r\n onMouseEnter: props.onMouseEnter,\r\n onMouseLeave: props.onMouseLeave,\r\n onMouseMove: props.onMouseMove,\r\n onClick: props.onClick,\r\n onFocus: props.onFocus,\r\n onBlur: props.onBlur,\r\n destroy: props.destroy,\r\n cleanup: props.cleanup,\r\n }\r\n}\r\n\r\n/**\r\n * Apply transform with intensity\r\n */\r\nexport function applyIntensity(value: number, intensity: number): number {\r\n return value * intensity\r\n}\r\n\r\n/**\r\n * Generate a unique ID for elements\r\n */\r\nlet idCounter = 0\r\nexport function generateId(): string {\r\n return `sparkfx-${++idCounter}-${Date.now()}`\r\n}\r\n\r\n/**\r\n * Clamp a value between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/**\r\n * Validate and sanitize a color input\r\n * Prevents XSS through color injection\r\n */\r\nexport function sanitizeColor(color: string | undefined, fallback: string = '#ffffff'): string {\r\n if (!color || typeof color !== 'string') return fallback\r\n\r\n // Remove any non-color characters (XSS prevention)\r\n const cleaned = color.replace(/[^a-zA-Z0-9#(),.\\s%]/g, '')\r\n\r\n // Validate hex color\r\n if (/^#[0-9A-Fa-f]{3,8}$/.test(cleaned)) return cleaned\r\n\r\n // Validate rgb/rgba\r\n if (/^rgba?\\([^)]+\\)$/.test(cleaned)) return cleaned\r\n\r\n // Validate named colors (common ones)\r\n const namedColors = ['red', 'blue', 'green', 'yellow', 'white', 'black', 'orange', 'purple', 'pink', 'cyan', 'magenta', 'currentColor', 'transparent']\r\n if (namedColors.includes(cleaned.toLowerCase())) return cleaned\r\n\r\n return fallback\r\n}\r\n\r\n/**\r\n * Validate numeric input with bounds\r\n */\r\nexport function validateNumber(value: number | undefined, min: number, max: number, fallback: number): number {\r\n if (value === undefined || typeof value !== 'number' || isNaN(value)) return fallback\r\n return clamp(value, min, max)\r\n}\r\n\r\n/**\r\n * Validate duration (prevent extremely long or negative durations)\r\n */\r\nexport function validateDuration(duration: number | undefined): number {\r\n return validateNumber(duration, 0, 30000, 300) // Max 30 seconds\r\n}\r\n\r\n/**\r\n * Validate intensity (prevent extreme values)\r\n */\r\nexport function validateIntensity(intensity: number | undefined): number {\r\n return validateNumber(intensity, 0.1, 5, 1)\r\n}\r\n\r\n/**\r\n * Safe element query - prevents errors on SSR\r\n */\r\nexport function safeQuerySelector(selector: string): Element | null {\r\n if (typeof document === 'undefined') return null\r\n try {\r\n return document.querySelector(selector)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Check if running in browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined'\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t\r\n}\r\n\r\n/**\r\n * Map a value from one range to another\r\n */\r\nexport function mapRange(\r\n value: number,\r\n inMin: number,\r\n inMax: number,\r\n outMin: number,\r\n outMax: number\r\n): number {\r\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\r\n}\r\n\r\n/**\r\n * Get element's center position\r\n */\r\nexport function getElementCenter(element: HTMLElement): { x: number; y: number } {\r\n const rect = element.getBoundingClientRect()\r\n return {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n }\r\n}\r\n\r\n/**\r\n * Get mouse position relative to element center\r\n */\r\nexport function getRelativeMousePosition(\r\n event: MouseEvent,\r\n element: HTMLElement\r\n): { x: number; y: number; percentX: number; percentY: number } {\r\n const rect = element.getBoundingClientRect()\r\n const x = event.clientX - rect.left\r\n const y = event.clientY - rect.top\r\n const percentX = (x / rect.width - 0.5) * 2 // -1 to 1\r\n const percentY = (y / rect.height - 0.5) * 2 // -1 to 1\r\n\r\n return { x, y, percentX, percentY }\r\n}\r\n\r\n/**\r\n * Create event handlers for trigger-based effects\r\n */\r\nexport function createTriggerHandlers(\r\n trigger: SparkBaseOptions['trigger'],\r\n onActivate: () => void,\r\n onDeactivate: () => void\r\n): Pick<SparkResult, 'onMouseEnter' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'> {\r\n switch (trigger) {\r\n case 'hover':\r\n return {\r\n onMouseEnter: onActivate,\r\n onMouseLeave: onDeactivate,\r\n }\r\n case 'click':\r\n return {\r\n onClick: onActivate,\r\n }\r\n case 'focus':\r\n return {\r\n onFocus: onActivate,\r\n onBlur: onDeactivate,\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Random number in range\r\n */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min\r\n}\r\n\r\n/**\r\n * Random item from array\r\n */\r\nexport function randomItem<T>(array: T[]): T {\r\n return array[Math.floor(Math.random() * array.length)] as T\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: any[]) => void>(\r\n fn: T,\r\n delay: number\r\n): T {\r\n let timeoutId: any\r\n return ((...args: any[]) => {\r\n clearTimeout(timeoutId)\r\n timeoutId = setTimeout(() => fn(...args), delay)\r\n }) as any\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: any[]) => void>(\r\n fn: T,\r\n limit: number\r\n): T {\r\n let inThrottle = false\r\n return ((...args: any[]) => {\r\n if (!inThrottle) {\r\n fn(...args)\r\n inThrottle = true\r\n setTimeout(() => (inThrottle = false), limit)\r\n }\r\n }) as any\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Bounce effect with customizable intensity and bounce count\r\n */\r\n\r\nimport type { SparkBounceOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBounceOptions> = {\r\n duration: 400,\r\n bounces: 1,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function bounce(options?: SparkBounceOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBounceOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const bounceHeight = applyIntensity(20, opts.intensity)\r\n const animationName = `sparkfx-bounce-${opts.bounces}-${Math.round(bounceHeight)}`\r\n\r\n // Generate keyframes based on bounces\r\n let keyframes = '0%, 100% { transform: translateY(0); }'\r\n const step = 100 / (opts.bounces * 2)\r\n\r\n for (let i = 0; i < opts.bounces; i++) {\r\n const upPercent = step * (i * 2 + 1)\r\n const currentHeight = bounceHeight * Math.pow(0.6, i)\r\n keyframes += ` ${upPercent}% { transform: translateY(-${currentHeight}px); }`\r\n }\r\n\r\n injectAnimation(animationName, keyframes)\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-bounce'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-animation-name': animationName,\r\n },\r\n onMouseEnter: opts.trigger === 'hover' ? undefined : undefined, // Handled via CSS if strictly hover\r\n // But for completeness and manual control:\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Pulse effect for loading states or highlighting\r\n */\r\n\r\nimport type { SparkPulseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkPulseOptions> = {\r\n duration: 1000,\r\n count: -1, // infinite\r\n scale: 1.05,\r\n trigger: 'always',\r\n intensity: 1,\r\n}\r\n\r\nexport function pulse(options?: SparkPulseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkPulseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const scaleValue = 1 + (opts.scale - 1) * opts.intensity\r\n const animationName = `sparkfx-pulse-${scaleValue.toString().replace('.', '_')}`\r\n\r\n injectAnimation(animationName, `\r\n 0%, 100% { transform: scale(1); opacity: 1; }\r\n 50% { transform: scale(${scaleValue}); opacity: 0.8; }\r\n `)\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const iterationCount = opts.count === -1 ? 'infinite' : opts.count\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-pulse'),\r\n style: {\r\n ...cssVars,\r\n animation: `${animationName} ${opts.duration}ms ${opts.easing} ${iterationCount}`,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Lift effect with optional shadow and depth\r\n */\r\n\r\nimport type { SparkLiftOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkLiftOptions> = {\r\n duration: 200,\r\n distance: 8,\r\n shadow: true,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function lift(options?: SparkLiftOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkLiftOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const shadowValue = opts.shadow\r\n ? `0 ${distance * 2}px ${distance * 3}px rgba(0, 0, 0, 0.15)`\r\n : 'none'\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-lift'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-lift-distance': `-${distance}px`,\r\n '--sparkfx-lift-shadow': shadowValue,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing), box-shadow var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n if (opts.trigger === 'hover') {\r\n target.style.transform = `translateY(-${distance}px)`\r\n if (opts.shadow) target.style.boxShadow = shadowValue\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n if (opts.trigger === 'hover') {\r\n target.style.transform = 'translateY(0)'\r\n target.style.boxShadow = 'none'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Scale effect for hovering and clicking\r\n */\r\n\r\nimport type { SparkScaleOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkScaleOptions> = {\r\n duration: 200,\r\n scale: 1.1,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function scale(options?: SparkScaleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkScaleOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const scaleValue = 1 + (opts.scale - 1) * opts.intensity\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-scale'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `scale(${scaleValue})`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'scale(1)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Shake effect for alerts and interactions\r\n */\r\n\r\nimport type { SparkShakeOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkShakeOptions> = {\r\n duration: 500,\r\n distance: 5,\r\n count: 3,\r\n trigger: 'click',\r\n intensity: 1,\r\n}\r\n\r\nexport function shake(options?: SparkShakeOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkShakeOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const animationName = `sparkfx-shake-${distance}`\r\n\r\n injectAnimation(animationName, `\r\n 0%, 100% { transform: translateX(0); }\r\n 10%, 30%, 50%, 70%, 90% { transform: translateX(-${distance}px); }\r\n 20%, 40%, 60%, 80% { transform: translateX(${distance}px); }\r\n `)\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-shake'),\r\n style: cssVars,\r\n onClick: (e: any) => {\r\n if (opts.trigger === 'click') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.animation = `${animationName} ${opts.duration}ms ${opts.easing}`\r\n setTimeout(() => {\r\n target.style.animation = ''\r\n }, opts.duration)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Fade effect for smooth transitions\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport interface SparkFadeOptions extends SparkBaseOptions {\r\n /** Target opacity (default: 0.6) */\r\n opacity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<SparkFadeOptions> = {\r\n duration: 200,\r\n opacity: 0.6,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function fade(options?: SparkFadeOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkFadeOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const targetOpacity = opts.opacity\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-fade'),\r\n style: {\r\n ...cssVars,\r\n transition: `opacity var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.opacity = String(targetOpacity)\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.opacity = '1'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Slide effect in four directions\r\n */\r\n\r\nimport type { SparkSlideOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkSlideOptions> = {\r\n duration: 200,\r\n direction: 'up',\r\n distance: 10,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function slide(options?: SparkSlideOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkSlideOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const distance = applyIntensity(opts.distance, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const getTransform = () => {\r\n switch (opts.direction) {\r\n case 'up': return `translateY(-${distance}px)`\r\n case 'down': return `translateY(${distance}px)`\r\n case 'left': return `translateX(-${distance}px)`\r\n case 'right': return `translateX(${distance}px)`\r\n default: return `translateY(-${distance}px)`\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-slide'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = getTransform()\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'translate(0)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Rotate effect for playful UI elements\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport interface SparkRotateOptions extends SparkBaseOptions {\r\n /** Rotation angle in degrees (default: 5) */\r\n angle?: number\r\n /** Rotation direction (default: 'clockwise') */\r\n direction?: 'clockwise' | 'counterclockwise'\r\n}\r\n\r\nconst defaultOptions: Partial<SparkRotateOptions> = {\r\n duration: 200,\r\n angle: 5,\r\n direction: 'clockwise',\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function rotate(options?: SparkRotateOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkRotateOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const angle = applyIntensity(opts.angle, opts.intensity)\r\n const directionMultiplier = opts.direction === 'counterclockwise' ? -1 : 1\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-rotate'),\r\n style: {\r\n ...cssVars,\r\n transition: `transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `rotate(${angle * directionMultiplier}deg)`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'rotate(0)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Neon glow effect for borders and depth\r\n */\r\n\r\nimport type { SparkGlowOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity, sanitizeColor, validateNumber } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlowOptions> = {\r\n duration: 300,\r\n color: '#00ffa3',\r\n spread: 20,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function glow(options?: SparkGlowOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlowOptions>\r\n\r\n // Sanitize inputs for security\r\n const safeColor = sanitizeColor(opts.color, '#00ffa3')\r\n const safeSpread = validateNumber(opts.spread, 1, 100, 20)\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const spread = applyIntensity(safeSpread, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n const glowShadow = `\r\n 0 0 ${spread / 2}px ${safeColor},\r\n 0 0 ${spread}px ${safeColor},\r\n 0 0 ${spread * 1.5}px ${safeColor}\r\n `\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glow'),\r\n style: {\r\n ...cssVars,\r\n transition: `box-shadow var(--sparkfx-duration) var(--sparkfx-easing), filter var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n },\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.boxShadow = glowShadow\r\n target.style.filter = 'brightness(1.1)'\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.boxShadow = 'none'\r\n target.style.filter = 'brightness(1)'\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * Ripple Effect - Material Design ripple efekti\r\n */\r\n\r\nimport type { SparkRippleOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\n\r\nconst defaultOptions: Partial<SparkRippleOptions> = {\r\n duration: 600,\r\n color: 'rgba(255, 255, 255, 0.3)',\r\n trigger: 'click',\r\n}\r\n\r\nexport function ripple(options?: SparkRippleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions)\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'spark-effect spark-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n })\r\n\r\n const createRipple = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const size = Math.max(rect.width, rect.height) * 2\r\n\r\n const rippleEl = document.createElement('span')\r\n rippleEl.className = 'spark-ripple'\r\n rippleEl.style.cssText = `\r\n width: ${size}px;\r\n height: ${size}px;\r\n left: ${e.clientX - rect.left - size / 2}px;\r\n top: ${e.clientY - rect.top - size / 2}px;\r\n background: ${opts.color};\r\n `\r\n\r\n // Ensure positioned container\r\n if (getComputedStyle(target).position === 'static') {\r\n target.style.position = 'relative'\r\n }\r\n target.style.overflow = 'hidden'\r\n\r\n target.appendChild(rippleEl)\r\n\r\n setTimeout(() => {\r\n rippleEl.remove()\r\n }, opts.duration)\r\n }\r\n\r\n return {\r\n className: 'spark-effect spark-ripple-container',\r\n style: cssVars,\r\n onClick: createRipple,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Magnetic effect for cursor-following elements\r\n */\r\n\r\nimport type { SparkMagneticOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, injectBaseStyles } from '../../core/engine'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkMagneticOptions> = {\r\n strength: 0.5,\r\n distance: 100,\r\n trigger: 'move',\r\n}\r\n\r\nexport function magnetic(options?: SparkMagneticOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkMagneticOptions>\r\n\r\n injectBaseStyles()\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-magnetic'),\r\n onMouseMove: (e: any) => {\r\n if (opts.trigger === 'move') {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n const relX = e.clientX - centerX\r\n const relY = e.clientY - centerY\r\n const dist = Math.sqrt(relX * relX + relY * relY)\r\n\r\n if (dist < opts.distance) {\r\n const moveX = relX * opts.strength\r\n const moveY = relY * opts.strength\r\n target.style.transform = `translate(${moveX}px, ${moveY}px)`\r\n } else {\r\n target.style.transform = 'translate(0, 0)'\r\n }\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = 'translate(0, 0)'\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * 3D Tilt effect with optional glare\r\n */\r\n\r\nimport type { SparkTiltOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, injectBaseStyles } from '../../core/engine'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkTiltOptions> = {\r\n angle: 15,\r\n glare: true,\r\n perspective: 1000,\r\n trigger: 'move',\r\n}\r\n\r\nexport function tilt(options?: SparkTiltOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkTiltOptions>\r\n\r\n injectBaseStyles()\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-tilt'),\r\n onMouseMove: (e: any) => {\r\n if (opts.trigger === 'move') {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n\r\n const centerX = rect.width / 2\r\n const centerY = rect.height / 2\r\n\r\n const rotateY = ((x - centerX) / centerX) * opts.angle\r\n const rotateX = ((centerY - y) / centerY) * opts.angle\r\n\r\n target.style.transform = `perspective(${opts.perspective}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`\r\n }\r\n },\r\n onMouseLeave: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.transform = `perspective(${opts.perspective}px) rotateX(0deg) rotateY(0deg)`\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Elastic effect - Bouncy spring physics animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface ElasticOptions extends SparkBaseOptions {\r\n scale?: number\r\n bounces?: number\r\n}\r\n\r\nconst defaultOptions: Partial<ElasticOptions> = {\r\n trigger: 'hover',\r\n duration: 600,\r\n scale: 1.15,\r\n bounces: 3,\r\n}\r\n\r\nfunction injectElasticStyles() {\r\n if (document.getElementById('sparkfx-elastic-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-elastic-styles'\r\n style.textContent = `\r\n .sparkfx-elastic {\r\n transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n }\r\n \r\n .sparkfx-elastic-active {\r\n animation: sparkfx-elastic-bounce 0.6s ease-out;\r\n }\r\n \r\n @keyframes sparkfx-elastic-bounce {\r\n 0% { transform: scale(1); }\r\n 20% { transform: scale(var(--elastic-scale, 1.15)); }\r\n 40% { transform: scale(0.95); }\r\n 60% { transform: scale(1.05); }\r\n 80% { transform: scale(0.98); }\r\n 100% { transform: scale(1); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function elastic(options?: ElasticOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<ElasticOptions>\r\n\r\n injectBaseStyles()\r\n injectElasticStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const trigger = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.setProperty('--elastic-scale', String(opts.scale))\r\n target.classList.remove('sparkfx-elastic-active')\r\n void target.offsetWidth // Force reflow\r\n target.classList.add('sparkfx-elastic-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-elastic'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? trigger : undefined,\r\n onClick: opts.trigger === 'click' ? trigger : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Jelly effect - Soft wobble animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface JellyOptions extends SparkBaseOptions {\r\n intensity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<JellyOptions> = {\r\n trigger: 'hover',\r\n duration: 500,\r\n intensity: 1,\r\n}\r\n\r\nfunction injectJellyStyles() {\r\n if (document.getElementById('sparkfx-jelly-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-jelly-styles'\r\n style.textContent = `\r\n .sparkfx-jelly {\r\n transition: transform 0.1s ease-out;\r\n }\r\n \r\n .sparkfx-jelly-active {\r\n animation: sparkfx-jelly-wobble 0.5s ease-out;\r\n }\r\n \r\n @keyframes sparkfx-jelly-wobble {\r\n 0% { transform: scale(1, 1); }\r\n 15% { transform: scale(1.1, 0.9); }\r\n 30% { transform: scale(0.9, 1.1); }\r\n 45% { transform: scale(1.05, 0.95); }\r\n 60% { transform: scale(0.97, 1.03); }\r\n 75% { transform: scale(1.02, 0.98); }\r\n 100% { transform: scale(1, 1); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function jelly(options?: JellyOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<JellyOptions>\r\n\r\n injectBaseStyles()\r\n injectJellyStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const trigger = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-jelly-active')\r\n void target.offsetWidth\r\n target.classList.add('sparkfx-jelly-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-jelly'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? trigger : undefined,\r\n onClick: opts.trigger === 'click' ? trigger : undefined,\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function rubber(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'click' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-rubber'),\r\n style: generateCSSVars(opts)\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function morph(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-morph'),\r\n style: generateCSSVars(opts)\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Cyberpunk glitch effect with offset colors\r\n */\r\n\r\nimport type { SparkGlitchOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlitchOptions> = {\r\n duration: 300,\r\n color1: '#ff0055',\r\n color2: '#00d4ff',\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function glitch(options?: SparkGlitchOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlitchOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glitch'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-glitch-color1': opts.color1,\r\n '--sparkfx-glitch-color2': opts.color2,\r\n position: 'relative',\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Blur effect - Dynamic focus/blur transition\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface BlurOptions extends SparkBaseOptions {\r\n amount?: number\r\n scale?: number\r\n}\r\n\r\nconst defaultOptions: Partial<BlurOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n amount: 8,\r\n scale: 1.02,\r\n}\r\n\r\nexport function blur(options?: BlurOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<BlurOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const baseStyle = {\r\n ...generateCSSVars(opts),\r\n transition: `filter var(--sparkfx-duration) var(--sparkfx-easing), transform var(--sparkfx-duration) var(--sparkfx-easing)`,\r\n filter: `blur(${opts.amount}px)`,\r\n transform: 'scale(0.98)',\r\n }\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.filter = 'blur(0)'\r\n target.style.transform = `scale(${opts.scale})`\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.style.filter = `blur(${opts.amount}px)`\r\n target.style.transform = 'scale(0.98)'\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-blur'),\r\n style: baseStyle,\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Neon glow effect for vibrant UI\r\n */\r\n\r\nimport type { SparkGlowOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, applyIntensity } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkGlowOptions> = {\r\n duration: 300,\r\n color: '#00d4ff',\r\n spread: 20,\r\n trigger: 'hover',\r\n intensity: 1,\r\n}\r\n\r\nexport function neon(options?: SparkGlowOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkGlowOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const spread = applyIntensity(opts.spread, opts.intensity)\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-neon'),\r\n style: {\r\n ...cssVars,\r\n '--sparkfx-neon-color': opts.color,\r\n '--sparkfx-neon-spread': `${spread}px`,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Glassmorphism effect with backdrop blur\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 300,\r\n trigger: 'always',\r\n}\r\n\r\nexport function glass(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: opts.easing,\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-glass'),\r\n style: {\r\n ...cssVars,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Subtle light sweep animation\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 1500,\r\n trigger: 'always',\r\n}\r\n\r\nexport function shimmer(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n easing: 'linear',\r\n })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-shimmer'),\r\n style: {\r\n ...cssVars,\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Gradient effect - Animated color gradient cycling\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface GradientOptions extends SparkBaseOptions {\r\n colors?: string[]\r\n speed?: number\r\n angle?: number\r\n}\r\n\r\nconst defaultOptions: Partial<GradientOptions> = {\r\n trigger: 'always',\r\n duration: 3000,\r\n colors: ['#ff0080', '#7928ca', '#0070f3', '#00d4ff'],\r\n speed: 3,\r\n angle: 45,\r\n}\r\n\r\nfunction injectGradientStyles() {\r\n if (document.getElementById('sparkfx-gradient-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-gradient-styles'\r\n style.textContent = `\r\n .sparkfx-gradient {\r\n background-size: 300% 300%;\r\n animation: sparkfx-gradient-shift var(--gradient-speed, 3s) ease infinite;\r\n }\r\n \r\n @keyframes sparkfx-gradient-shift {\r\n 0% { background-position: 0% 50%; }\r\n 50% { background-position: 100% 50%; }\r\n 100% { background-position: 0% 50%; }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function gradient(options?: GradientOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<GradientOptions>\r\n\r\n injectBaseStyles()\r\n injectGradientStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const gradientValue = `linear-gradient(${opts.angle}deg, ${opts.colors.join(', ')})`\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-gradient'),\r\n style: {\r\n ...generateCSSVars(opts),\r\n background: gradientValue,\r\n '--gradient-speed': `${opts.speed}s`,\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n backgroundClip: 'text',\r\n } as Record<string, string | number>,\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function spotlight(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n if (!shouldAnimate(opts)) return { className: 'sparkfx-effect' }\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-spotlight'),\r\n onMouseMove: (e: any) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n target.style.setProperty('--sparkfx-spotlight-x', `${x}px`)\r\n target.style.setProperty('--sparkfx-spotlight-y', `${y}px`)\r\n }\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Hologram effect - Futuristic RGB shift and scanlines\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface HologramOptions extends SparkBaseOptions {\r\n intensity?: number\r\n scanlineOpacity?: number\r\n}\r\n\r\nconst defaultOptions: Partial<HologramOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n intensity: 1,\r\n scanlineOpacity: 0.1,\r\n}\r\n\r\nfunction injectHologramStyles() {\r\n if (document.getElementById('sparkfx-hologram-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-hologram-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-hologram-flicker {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.95; }\r\n 25%, 75% { opacity: 0.98; }\r\n }\r\n \r\n @keyframes sparkfx-hologram-scanline {\r\n 0% { transform: translateY(-100%); }\r\n 100% { transform: translateY(100%); }\r\n }\r\n \r\n .sparkfx-hologram {\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n \r\n .sparkfx-hologram::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: repeating-linear-gradient(\r\n 0deg,\r\n transparent,\r\n transparent 2px,\r\n rgba(0, 255, 255, 0.03) 2px,\r\n rgba(0, 255, 255, 0.03) 4px\r\n );\r\n pointer-events: none;\r\n z-index: 10;\r\n }\r\n \r\n .sparkfx-hologram-active {\r\n animation: sparkfx-hologram-flicker 0.15s infinite;\r\n text-shadow: \r\n 2px 0 rgba(255, 0, 0, 0.5),\r\n -2px 0 rgba(0, 255, 255, 0.5);\r\n filter: brightness(1.1) contrast(1.05);\r\n }\r\n \r\n .sparkfx-hologram-scanline {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 8px;\r\n background: linear-gradient(\r\n 180deg,\r\n transparent,\r\n rgba(0, 255, 255, 0.15),\r\n transparent\r\n );\r\n pointer-events: none;\r\n z-index: 11;\r\n animation: sparkfx-hologram-scanline 2s linear infinite;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function hologram(options?: HologramOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<HologramOptions>\r\n\r\n injectBaseStyles()\r\n injectHologramStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let scanlineElement: HTMLElement | null = null\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.add('sparkfx-hologram-active')\r\n\r\n if (!scanlineElement) {\r\n scanlineElement = document.createElement('span')\r\n scanlineElement.className = 'sparkfx-hologram-scanline'\r\n target.appendChild(scanlineElement)\r\n }\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-hologram-active')\r\n\r\n if (scanlineElement) {\r\n scanlineElement.remove()\r\n scanlineElement = null\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-hologram'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * Aurora Effect\r\n * Northern lights style color wave animation\r\n * \r\n * @module effects/visual/aurora\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkAuroraOptions extends SparkBaseOptions {\r\n /** Aurora colors. Default: ['#00ffa3', '#00d4ff', '#a855f7'] */\r\n colors?: string[]\r\n\r\n /** Animation duration in ms. Default: 8000 */\r\n duration?: number\r\n\r\n /** Animation type: 'background' | 'border' | 'text'. Default: 'background' */\r\n type?: 'background' | 'border' | 'text'\r\n\r\n /** Blur intensity. Default: 40 */\r\n blur?: number\r\n\r\n /** Opacity of the aurora effect. Default: 0.6 */\r\n opacity?: number\r\n\r\n /** Movement style: 'wave' | 'pulse' | 'drift'. Default: 'wave' */\r\n movement?: 'wave' | 'pulse' | 'drift'\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst AURORA_DEFAULTS: Partial<SparkAuroraOptions> = {\r\n colors: ['#00ffa3', '#00d4ff', '#a855f7'],\r\n duration: 8000,\r\n type: 'background',\r\n blur: 40,\r\n opacity: 0.6,\r\n movement: 'wave',\r\n}\r\n\r\n// ============================================================================\r\n// AURORA EFFECT\r\n// ============================================================================\r\n\r\nexport function aurora(options?: SparkAuroraOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, AURORA_DEFAULTS) as Required<SparkAuroraOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-aurora-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('aurora')\r\n const keyframes = buildAuroraKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectAuroraStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n })\r\n}\r\n\r\nfunction buildAuroraKeyframes(options: Required<SparkAuroraOptions>): string {\r\n const { movement } = options\r\n\r\n switch (movement) {\r\n case 'wave':\r\n return `\r\n 0% { background-position: 0% 50%; }\r\n 25% { background-position: 50% 100%; }\r\n 50% { background-position: 100% 50%; }\r\n 75% { background-position: 50% 0%; }\r\n 100% { background-position: 0% 50%; }\r\n `\r\n case 'pulse':\r\n return `\r\n 0% { background-size: 200% 200%; opacity: 0.5; }\r\n 50% { background-size: 300% 300%; opacity: 0.8; }\r\n 100% { background-size: 200% 200%; opacity: 0.5; }\r\n `\r\n case 'drift':\r\n return `\r\n 0% { background-position: 0% 0%; filter: hue-rotate(0deg); }\r\n 33% { background-position: 100% 50%; filter: hue-rotate(60deg); }\r\n 66% { background-position: 50% 100%; filter: hue-rotate(-60deg); }\r\n 100% { background-position: 0% 0%; filter: hue-rotate(0deg); }\r\n `\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nfunction injectAuroraStyles(animationId: string, options: Required<SparkAuroraOptions>): string {\r\n if (!isBrowser()) return `spark-aurora-${animationId}`\r\n\r\n const className = `spark-aurora-${animationId}`\r\n const styleId = `spark-aurora-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const gradient = `linear-gradient(135deg, ${options.colors.join(', ')})`\r\n\r\n let effectStyles = ''\r\n\r\n switch (options.type) {\r\n case 'background':\r\n effectStyles = `\r\n background: ${gradient};\r\n background-size: 400% 400%;\r\n `\r\n break\r\n case 'border':\r\n effectStyles = `\r\n border: 3px solid transparent;\r\n background-image: linear-gradient(var(--spark-bg, #0a0a0c), var(--spark-bg, #0a0a0c)), ${gradient};\r\n background-origin: border-box;\r\n background-clip: padding-box, border-box;\r\n background-size: 100% 100%, 400% 400%;\r\n `\r\n break\r\n case 'text':\r\n effectStyles = `\r\n background: ${gradient};\r\n background-size: 400% 400%;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n `\r\n break\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n position: relative;\r\n ${effectStyles}\r\n animation: ${animationId} ${options.duration}ms ease infinite;\r\n}\r\n\r\n/* Aurora glow overlay for background type */\r\n${options.type === 'background' ? `\r\n.${className}::before {\r\n content: '';\r\n position: absolute;\r\n inset: -${options.blur}px;\r\n background: inherit;\r\n filter: blur(${options.blur}px);\r\n opacity: ${options.opacity};\r\n z-index: -1;\r\n animation: inherit;\r\n}\r\n` : ''}\r\n\r\n.spark-aurora-static {\r\n background: ${options.colors[0]};\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n .${className}::before {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default aurora\r\n","/**\r\n * Matrix Effect\r\n * Digital rain effect like The Matrix movie\r\n * \r\n * @module effects/visual/matrix\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId, random, randomInt } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkMatrixOptions extends SparkBaseOptions {\r\n /** Rain color. Default: '#00ff00' */\r\n color?: string\r\n\r\n /** Number of columns. Default: 'auto' (based on container width) */\r\n columns?: number | 'auto'\r\n\r\n /** Animation speed (1-10). Default: 5 */\r\n speed?: number\r\n\r\n /** Character set to use. Default: 'katakana' */\r\n charset?: 'katakana' | 'binary' | 'hex' | 'custom'\r\n\r\n /** Custom characters (when charset is 'custom'). Default: undefined */\r\n customChars?: string\r\n\r\n /** Opacity of falling characters. Default: 0.8 */\r\n opacity?: number\r\n\r\n /** Font size in pixels. Default: 14 */\r\n fontSize?: number\r\n\r\n /** Glow effect. Default: true */\r\n glow?: boolean\r\n\r\n /** Auto-start animation. Default: true */\r\n autoStart?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst MATRIX_DEFAULTS: Partial<SparkMatrixOptions> = {\r\n color: '#00ff00',\r\n columns: 'auto',\r\n speed: 5,\r\n charset: 'katakana',\r\n opacity: 0.8,\r\n fontSize: 14,\r\n glow: true,\r\n autoStart: true,\r\n}\r\n\r\nconst CHARSETS = {\r\n katakana: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン',\r\n binary: '01',\r\n hex: '0123456789ABCDEF',\r\n}\r\n\r\n// ============================================================================\r\n// MATRIX EFFECT\r\n// ============================================================================\r\n\r\nexport function matrix(options?: SparkMatrixOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, MATRIX_DEFAULTS) as Required<SparkMatrixOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-matrix-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('matrix')\r\n const className = `spark-matrix-${animationId}`\r\n\r\n // Inject base styles\r\n injectMatrixStyles(className, merged)\r\n\r\n // Create and manage canvas\r\n let canvas: HTMLCanvasElement | null = null\r\n let ctx: CanvasRenderingContext2D | null = null\r\n let animationFrame: number | null = null\r\n let columns: number[] = []\r\n let initialized = false\r\n\r\n const getCharset = (): string => {\r\n if (merged.charset === 'custom' && merged.customChars) {\r\n return merged.customChars\r\n }\r\n return CHARSETS[merged.charset as keyof typeof CHARSETS] || CHARSETS.katakana\r\n }\r\n\r\n const initCanvas = (container: HTMLElement) => {\r\n if (initialized) return\r\n\r\n canvas = document.createElement('canvas')\r\n canvas.className = `${className}-canvas`\r\n canvas.style.cssText = `\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 0;\r\n `\r\n\r\n container.style.position = 'relative'\r\n container.insertBefore(canvas, container.firstChild)\r\n\r\n ctx = canvas.getContext('2d')\r\n\r\n resizeCanvas(container)\r\n initialized = true\r\n\r\n if (merged.autoStart) {\r\n startAnimation()\r\n }\r\n }\r\n\r\n const resizeCanvas = (container: HTMLElement) => {\r\n if (!canvas || !ctx) return\r\n\r\n const rect = container.getBoundingClientRect()\r\n canvas.width = rect.width\r\n canvas.height = rect.height\r\n\r\n // Initialize columns\r\n const numColumns = merged.columns === 'auto'\r\n ? Math.floor(canvas.width / merged.fontSize)\r\n : merged.columns\r\n\r\n columns = Array(numColumns).fill(1).map(() => randomInt(0, canvas!.height / merged.fontSize))\r\n }\r\n\r\n const draw = () => {\r\n if (!canvas || !ctx) return\r\n\r\n const charset = getCharset()\r\n\r\n // Fade effect\r\n ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Draw characters\r\n ctx.fillStyle = merged.color\r\n ctx.font = `${merged.fontSize}px monospace`\r\n\r\n if (merged.glow) {\r\n ctx.shadowBlur = 8\r\n ctx.shadowColor = merged.color\r\n }\r\n\r\n columns.forEach((y, i) => {\r\n const char = charset[randomInt(0, charset.length - 1)]\r\n const x = i * merged.fontSize\r\n\r\n // Random opacity for flickering effect\r\n ctx!.globalAlpha = random(0.5, merged.opacity)\r\n ctx!.fillText(char, x, y * merged.fontSize)\r\n\r\n // Reset column when it reaches bottom (with random chance)\r\n if (y * merged.fontSize > canvas!.height && Math.random() > 0.975) {\r\n columns[i] = 0\r\n }\r\n\r\n columns[i]++\r\n })\r\n\r\n ctx.globalAlpha = 1\r\n }\r\n\r\n const startAnimation = () => {\r\n const speed = 11 - merged.speed // Invert so higher = faster\r\n let lastTime = 0\r\n\r\n const animate = (time: number) => {\r\n if (time - lastTime > speed * 10) {\r\n draw()\r\n lastTime = time\r\n }\r\n animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n const stopAnimation = () => {\r\n if (animationFrame) {\r\n cancelAnimationFrame(animationFrame)\r\n animationFrame = null\r\n }\r\n }\r\n\r\n const cleanup = () => {\r\n stopAnimation()\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas)\r\n }\r\n canvas = null\r\n ctx = null\r\n initialized = false\r\n }\r\n\r\n // Mouse enter handler to initialize\r\n const onMouseEnter = (event: MouseEvent) => {\r\n const target = event.currentTarget as HTMLElement\r\n initCanvas(target)\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n onMouseEnter,\r\n cleanup,\r\n })\r\n}\r\n\r\nfunction injectMatrixStyles(className: string, options: Required<SparkMatrixOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-matrix-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.${className} > *:not(.${className}-canvas) {\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.spark-matrix-static {\r\n /* Fallback styles */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className}-canvas {\r\n display: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default matrix\r\n","/**\r\n * Rainbow Effect\r\n * Animated rainbow gradient cycling\r\n * \r\n * @module effects/visual/rainbow\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkRainbowOptions extends SparkBaseOptions {\r\n /** Animation duration in ms. Default: 3000 */\r\n duration?: number\r\n\r\n /** Apply to: 'background' | 'border' | 'text' | 'shadow'. Default: 'background' */\r\n type?: 'background' | 'border' | 'text' | 'shadow'\r\n\r\n /** Rotation style: 'smooth' | 'stepped'. Default: 'smooth' */\r\n style?: 'smooth' | 'stepped'\r\n\r\n /** Saturation (0-100). Default: 100 */\r\n saturation?: number\r\n\r\n /** Lightness (0-100). Default: 50 */\r\n lightness?: number\r\n\r\n /** Angle of gradient in degrees. Default: 90 */\r\n angle?: number\r\n\r\n /** Pause on hover. Default: false */\r\n pauseOnHover?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst RAINBOW_DEFAULTS: Partial<SparkRainbowOptions> = {\r\n duration: 3000,\r\n type: 'background',\r\n style: 'smooth',\r\n saturation: 100,\r\n lightness: 50,\r\n angle: 90,\r\n pauseOnHover: false,\r\n}\r\n\r\n// ============================================================================\r\n// RAINBOW EFFECT\r\n// ============================================================================\r\n\r\nexport function rainbow(options?: SparkRainbowOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, RAINBOW_DEFAULTS) as Required<SparkRainbowOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-rainbow-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('rainbow')\r\n const keyframes = buildRainbowKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectRainbowStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n })\r\n}\r\n\r\nfunction buildRainbowKeyframes(options: Required<SparkRainbowOptions>): string {\r\n const { style, saturation, lightness, type } = options\r\n\r\n if (style === 'stepped') {\r\n // Stepped through distinct colors\r\n const colors = [\r\n `hsl(0, ${saturation}%, ${lightness}%)`, // Red\r\n `hsl(30, ${saturation}%, ${lightness}%)`, // Orange\r\n `hsl(60, ${saturation}%, ${lightness}%)`, // Yellow\r\n `hsl(120, ${saturation}%, ${lightness}%)`, // Green\r\n `hsl(180, ${saturation}%, ${lightness}%)`, // Cyan\r\n `hsl(240, ${saturation}%, ${lightness}%)`, // Blue\r\n `hsl(300, ${saturation}%, ${lightness}%)`, // Magenta\r\n ]\r\n\r\n let keyframes = ''\r\n colors.forEach((color, i) => {\r\n const percent = (i / colors.length) * 100\r\n keyframes += `${percent}% { ${getColorProperty(type, color)} }\\n`\r\n })\r\n keyframes += `100% { ${getColorProperty(type, colors[0])} }`\r\n\r\n return keyframes\r\n }\r\n\r\n // Smooth hue rotation\r\n return `\r\n 0% { filter: hue-rotate(0deg); }\r\n 100% { filter: hue-rotate(360deg); }\r\n `\r\n}\r\n\r\nfunction getColorProperty(type: string, color: string): string {\r\n switch (type) {\r\n case 'background':\r\n return `background-color: ${color};`\r\n case 'border':\r\n return `border-color: ${color};`\r\n case 'text':\r\n return `color: ${color};`\r\n case 'shadow':\r\n return `box-shadow: 0 0 20px ${color}, 0 0 40px ${color};`\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nfunction injectRainbowStyles(animationId: string, options: Required<SparkRainbowOptions>): string {\r\n if (!isBrowser()) return `spark-rainbow-${animationId}`\r\n\r\n const className = `spark-rainbow-${animationId}`\r\n const styleId = `spark-rainbow-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const { type, angle, saturation, lightness, style } = options\r\n\r\n // Base gradient for smooth style\r\n const rainbowGradient = `linear-gradient(\r\n ${angle}deg,\r\n hsl(0, ${saturation}%, ${lightness}%),\r\n hsl(60, ${saturation}%, ${lightness}%),\r\n hsl(120, ${saturation}%, ${lightness}%),\r\n hsl(180, ${saturation}%, ${lightness}%),\r\n hsl(240, ${saturation}%, ${lightness}%),\r\n hsl(300, ${saturation}%, ${lightness}%),\r\n hsl(360, ${saturation}%, ${lightness}%)\r\n )`\r\n\r\n let typeStyles = ''\r\n\r\n if (style === 'smooth') {\r\n switch (type) {\r\n case 'background':\r\n typeStyles = `\r\n background: ${rainbowGradient};\r\n background-size: 200% 200%;\r\n `\r\n break\r\n case 'border':\r\n typeStyles = `\r\n border: 3px solid;\r\n border-image: ${rainbowGradient} 1;\r\n `\r\n break\r\n case 'text':\r\n typeStyles = `\r\n background: ${rainbowGradient};\r\n background-size: 200% 200%;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n `\r\n break\r\n case 'shadow':\r\n typeStyles = `\r\n box-shadow: 0 0 20px hsl(0, ${saturation}%, ${lightness}%);\r\n `\r\n break\r\n }\r\n }\r\n\r\n const stylesheet = document.createElement('style')\r\n stylesheet.id = styleId\r\n stylesheet.textContent = `\r\n.${className} {\r\n ${typeStyles}\r\n animation: ${animationId} ${options.duration}ms linear infinite;\r\n}\r\n\r\n${options.pauseOnHover ? `\r\n.${className}:hover {\r\n animation-play-state: paused;\r\n}\r\n` : ''}\r\n\r\n.spark-rainbow-static {\r\n background: linear-gradient(${angle}deg, red, orange, yellow, green, blue, indigo, violet);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n filter: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(stylesheet)\r\n\r\n return className\r\n}\r\n\r\nexport default rainbow\r\n","/**\r\n * Parallax Effect\r\n * Creates depth illusion based on scroll or mouse position\r\n * \r\n * @module effects/motion/parallax\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { configManager } from '../../core/config'\r\nimport { throttle, clamp, isBrowser, mapRange } from '../../core/utils'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkParallaxOptions extends SparkBaseOptions {\r\n /** Parallax depth/intensity (0-1). Higher = more movement. Default: 0.5 */\r\n depth?: number\r\n\r\n /** Direction of movement: 'vertical' | 'horizontal' | 'both'. Default: 'vertical' */\r\n direction?: 'vertical' | 'horizontal' | 'both'\r\n\r\n /** Trigger type: 'scroll' | 'mouse'. Default: 'scroll' */\r\n trigger?: 'scroll' | 'mouse'\r\n\r\n /** Reverse direction. Default: false */\r\n reverse?: boolean\r\n\r\n /** Smooth factor (higher = smoother). Default: 10 */\r\n smoothness?: number\r\n\r\n /** Maximum offset in pixels. Default: 100 */\r\n maxOffset?: number\r\n\r\n /** Use 3D transforms for GPU acceleration. Default: true */\r\n use3D?: boolean\r\n}\r\n\r\ninterface ParallaxState {\r\n currentX: number\r\n currentY: number\r\n targetX: number\r\n targetY: number\r\n animationFrame: number | null\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst PARALLAX_DEFAULTS: Partial<SparkParallaxOptions> = {\r\n depth: 0.5,\r\n direction: 'vertical',\r\n trigger: 'scroll',\r\n reverse: false,\r\n smoothness: 10,\r\n maxOffset: 100,\r\n use3D: true,\r\n}\r\n\r\n// ============================================================================\r\n// PARALLAX EFFECT\r\n// ============================================================================\r\n\r\nexport function parallax(options?: SparkParallaxOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, PARALLAX_DEFAULTS) as Required<SparkParallaxOptions>\r\n const config = configManager.get()\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-parallax-static',\r\n })\r\n }\r\n\r\n // State for each element\r\n const stateMap = new WeakMap<Element, ParallaxState>()\r\n\r\n // Generate unique class name\r\n const className = `spark-parallax-${Date.now().toString(36)}`\r\n\r\n // Inject base styles\r\n injectParallaxStyles(className, merged)\r\n\r\n // Scroll handler for scroll-based parallax\r\n const handleScroll = throttle(() => {\r\n if (!isBrowser()) return\r\n\r\n const elements = document.querySelectorAll(`.${className}`)\r\n const scrollY = window.scrollY\r\n const windowHeight = window.innerHeight\r\n\r\n elements.forEach((element) => {\r\n const el = element as HTMLElement\r\n const rect = el.getBoundingClientRect()\r\n const elementCenter = rect.top + rect.height / 2\r\n const viewportCenter = windowHeight / 2\r\n\r\n // Calculate progress (-1 to 1, 0 when centered)\r\n const progress = (elementCenter - viewportCenter) / windowHeight\r\n const clampedProgress = clamp(progress, -1, 1)\r\n\r\n // Calculate offset\r\n const direction = merged.reverse ? -1 : 1\r\n const offset = clampedProgress * merged.maxOffset * merged.depth * direction\r\n\r\n // Get or create state\r\n let state = stateMap.get(el)\r\n if (!state) {\r\n state = { currentX: 0, currentY: 0, targetX: 0, targetY: 0, animationFrame: null }\r\n stateMap.set(el, state)\r\n }\r\n\r\n // Set target based on direction\r\n if (merged.direction === 'vertical' || merged.direction === 'both') {\r\n state.targetY = offset\r\n }\r\n if (merged.direction === 'horizontal' || merged.direction === 'both') {\r\n state.targetX = offset * 0.5 // Less horizontal movement\r\n }\r\n\r\n // Start smooth animation\r\n animateParallax(el, state, merged)\r\n })\r\n }, 16) // ~60fps\r\n\r\n // Mouse handler for mouse-based parallax\r\n const handleMouseMove = throttle((event: MouseEvent) => {\r\n if (!isBrowser()) return\r\n\r\n const elements = document.querySelectorAll(`.${className}`)\r\n const { clientX, clientY } = event\r\n const windowWidth = window.innerWidth\r\n const windowHeight = window.innerHeight\r\n\r\n // Map mouse position to -1 to 1 range\r\n const normalizedX = mapRange(clientX, 0, windowWidth, -1, 1)\r\n const normalizedY = mapRange(clientY, 0, windowHeight, -1, 1)\r\n\r\n elements.forEach((element) => {\r\n const el = element as HTMLElement\r\n\r\n // Get or create state\r\n let state = stateMap.get(el)\r\n if (!state) {\r\n state = { currentX: 0, currentY: 0, targetX: 0, targetY: 0, animationFrame: null }\r\n stateMap.set(el, state)\r\n }\r\n\r\n const direction = merged.reverse ? -1 : 1\r\n const offsetX = normalizedX * merged.maxOffset * merged.depth * direction\r\n const offsetY = normalizedY * merged.maxOffset * merged.depth * direction\r\n\r\n // Set targets based on direction\r\n if (merged.direction === 'horizontal' || merged.direction === 'both') {\r\n state.targetX = offsetX\r\n }\r\n if (merged.direction === 'vertical' || merged.direction === 'both') {\r\n state.targetY = offsetY\r\n }\r\n\r\n // Start smooth animation\r\n animateParallax(el, state, merged)\r\n })\r\n }, 16)\r\n\r\n // Animation loop for smooth parallax\r\n function animateParallax(\r\n element: HTMLElement,\r\n state: ParallaxState,\r\n opts: Required<SparkParallaxOptions>\r\n ): void {\r\n // Cancel existing animation\r\n if (state.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n\r\n const animate = () => {\r\n // Smooth interpolation\r\n const ease = 1 / opts.smoothness\r\n state.currentX += (state.targetX - state.currentX) * ease\r\n state.currentY += (state.targetY - state.currentY) * ease\r\n\r\n // Apply transform\r\n const x = Math.round(state.currentX * 100) / 100\r\n const y = Math.round(state.currentY * 100) / 100\r\n\r\n if (opts.use3D) {\r\n element.style.transform = `translate3d(${x}px, ${y}px, 0)`\r\n } else {\r\n element.style.transform = `translate(${x}px, ${y}px)`\r\n }\r\n\r\n // Continue animation if not settled\r\n const threshold = 0.01\r\n if (\r\n Math.abs(state.targetX - state.currentX) > threshold ||\r\n Math.abs(state.targetY - state.currentY) > threshold\r\n ) {\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n }\r\n\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n // Setup event listeners based on trigger type\r\n if (isBrowser()) {\r\n if (merged.trigger === 'scroll') {\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n // Initial calculation\r\n requestAnimationFrame(() => handleScroll())\r\n } else if (merged.trigger === 'mouse') {\r\n window.addEventListener('mousemove', handleMouseMove, { passive: true })\r\n }\r\n }\r\n\r\n // Cleanup function\r\n const cleanup = () => {\r\n if (isBrowser()) {\r\n window.removeEventListener('scroll', handleScroll as EventListener)\r\n window.removeEventListener('mousemove', handleMouseMove as EventListener)\r\n }\r\n\r\n // Clean up animation frames\r\n const elements = document.querySelectorAll(`.${className}`)\r\n elements.forEach((element) => {\r\n const state = stateMap.get(element)\r\n if (state?.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: config.gpuAcceleration ? 'transform' : 'auto',\r\n },\r\n cleanup,\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectParallaxStyles(className: string, options: Required<SparkParallaxOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-parallax-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n transform-style: preserve-3d;\r\n}\r\n\r\n.spark-parallax-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n transform: none !important;\r\n will-change: auto;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default parallax\r\n","/**\r\n * Float Effect\r\n * Gentle floating animation like an object in water or air\r\n * \r\n * @module effects/motion/float\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkFloatOptions extends SparkBaseOptions {\r\n /** Float distance in pixels. Default: 10 */\r\n distance?: number\r\n\r\n /** Animation duration in ms. Default: 3000 */\r\n duration?: number\r\n\r\n /** Direction: 'vertical' | 'horizontal' | 'diagonal'. Default: 'vertical' */\r\n direction?: 'vertical' | 'horizontal' | 'diagonal'\r\n\r\n /** Add subtle rotation. Default: true */\r\n rotate?: boolean\r\n\r\n /** Rotation angle in degrees. Default: 3 */\r\n rotateAngle?: number\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Add subtle scale variation. Default: false */\r\n scale?: boolean\r\n\r\n /** Scale amount (0-1). Default: 0.02 */\r\n scaleAmount?: number\r\n\r\n /** Random delay offset for multiple elements. Default: false */\r\n randomDelay?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst FLOAT_DEFAULTS: Partial<SparkFloatOptions> = {\r\n distance: 10,\r\n duration: 3000,\r\n direction: 'vertical',\r\n rotate: true,\r\n rotateAngle: 3,\r\n easing: 'ease-in-out',\r\n scale: false,\r\n scaleAmount: 0.02,\r\n randomDelay: false,\r\n}\r\n\r\n// ============================================================================\r\n// FLOAT EFFECT\r\n// ============================================================================\r\n\r\nexport function float(options?: SparkFloatOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, FLOAT_DEFAULTS) as Required<SparkFloatOptions>\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-float-static',\r\n })\r\n }\r\n\r\n // Generate unique animation name\r\n const animationId = generateAnimationId('float')\r\n\r\n // Build keyframes based on options\r\n const keyframes = buildFloatKeyframes(merged)\r\n\r\n // Inject animation\r\n injectAnimation(animationId, keyframes)\r\n\r\n // Inject styles\r\n const className = injectFloatStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: 'transform',\r\n animationDelay: merged.randomDelay ? `${Math.random() * 1000}ms` : '0ms',\r\n },\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// KEYFRAME GENERATION\r\n// ============================================================================\r\n\r\nfunction buildFloatKeyframes(options: Required<SparkFloatOptions>): string {\r\n const { distance, direction, rotate, rotateAngle, scale, scaleAmount } = options\r\n\r\n // Calculate movement based on direction\r\n let transform0 = ''\r\n let transform50 = ''\r\n let transform100 = ''\r\n\r\n switch (direction) {\r\n case 'vertical':\r\n transform0 = `translateY(0)`\r\n transform50 = `translateY(-${distance}px)`\r\n transform100 = `translateY(0)`\r\n break\r\n case 'horizontal':\r\n transform0 = `translateX(0)`\r\n transform50 = `translateX(${distance}px)`\r\n transform100 = `translateX(0)`\r\n break\r\n case 'diagonal':\r\n transform0 = `translate(0, 0)`\r\n transform50 = `translate(${distance * 0.7}px, -${distance}px)`\r\n transform100 = `translate(0, 0)`\r\n break\r\n }\r\n\r\n // Add rotation if enabled\r\n if (rotate) {\r\n transform0 += ` rotate(0deg)`\r\n transform50 += ` rotate(${rotateAngle}deg)`\r\n transform100 += ` rotate(0deg)`\r\n }\r\n\r\n // Add scale if enabled\r\n if (scale) {\r\n const scaleUp = 1 + scaleAmount\r\n transform0 += ` scale(1)`\r\n transform50 += ` scale(${scaleUp})`\r\n transform100 += ` scale(1)`\r\n }\r\n\r\n return `\r\n 0% {\r\n transform: ${transform0};\r\n }\r\n 50% {\r\n transform: ${transform50};\r\n }\r\n 100% {\r\n transform: ${transform100};\r\n }\r\n `\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectFloatStyles(animationId: string, options: Required<SparkFloatOptions>): string {\r\n if (!isBrowser()) return `spark-float-${animationId}`\r\n\r\n const className = `spark-float-${animationId}`\r\n const styleId = `spark-float-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} infinite;\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n.spark-float-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default float\r\n","/**\r\n * Flip3D Effect\r\n * 3D card flip animation on hover or click\r\n * \r\n * @module effects/motion/flip3d\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkFlip3DOptions extends SparkBaseOptions {\r\n /** Flip direction: 'horizontal' | 'vertical'. Default: 'horizontal' */\r\n direction?: 'horizontal' | 'vertical'\r\n\r\n /** Animation duration in ms. Default: 600 */\r\n duration?: number\r\n\r\n /** Perspective distance in pixels. Default: 1000 */\r\n perspective?: number\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Trigger: 'hover' | 'click'. Default: 'hover' */\r\n trigger?: 'hover' | 'click'\r\n\r\n /** Flip angle in degrees. Default: 180 */\r\n angle?: number\r\n\r\n /** Add shadow during flip. Default: true */\r\n shadow?: boolean\r\n\r\n /** Scale during flip for 3D depth. Default: 1.05 */\r\n midScale?: number\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst FLIP3D_DEFAULTS: Partial<SparkFlip3DOptions> = {\r\n direction: 'horizontal',\r\n duration: 600,\r\n perspective: 1000,\r\n easing: 'ease-in-out',\r\n trigger: 'hover',\r\n angle: 180,\r\n shadow: true,\r\n midScale: 1.05,\r\n}\r\n\r\n// ============================================================================\r\n// FLIP3D EFFECT\r\n// ============================================================================\r\n\r\nexport function flip3d(options?: SparkFlip3DOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, FLIP3D_DEFAULTS) as Required<SparkFlip3DOptions>\r\n\r\n // Check if we should animate\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-flip3d-static',\r\n })\r\n }\r\n\r\n // Generate unique animation name\r\n const animationId = generateAnimationId('flip3d')\r\n const className = `spark-flip3d-${animationId}`\r\n\r\n // Inject styles\r\n injectFlip3DStyles(className, merged)\r\n\r\n // State for click trigger\r\n let isFlipped = false\r\n\r\n // Click handler\r\n const onClick = (event: MouseEvent) => {\r\n if (merged.trigger !== 'click') return\r\n\r\n const target = event.currentTarget as HTMLElement\r\n isFlipped = !isFlipped\r\n\r\n if (isFlipped) {\r\n target.classList.add(`${className}-flipped`)\r\n } else {\r\n target.classList.remove(`${className}-flipped`)\r\n }\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n onClick: merged.trigger === 'click' ? onClick : undefined,\r\n style: {\r\n perspective: `${merged.perspective}px`,\r\n transformStyle: 'preserve-3d',\r\n },\r\n })\r\n}\r\n\r\n// ============================================================================\r\n// STYLE INJECTION\r\n// ============================================================================\r\n\r\nfunction injectFlip3DStyles(className: string, options: Required<SparkFlip3DOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-flip3d-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const rotateAxis = options.direction === 'horizontal' ? 'Y' : 'X'\r\n const shadowStyle = options.shadow\r\n ? `box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);`\r\n : ''\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n perspective: ${options.perspective}px;\r\n transform-style: preserve-3d;\r\n transition: transform ${options.duration}ms ${options.easing};\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n/* Hover trigger */\r\n.${className}:hover {\r\n ${options.trigger === 'hover' ? `transform: rotate${rotateAxis}(${options.angle}deg);` : ''}\r\n}\r\n\r\n/* Click trigger - flipped state */\r\n.${className}-flipped {\r\n transform: rotate${rotateAxis}(${options.angle}deg);\r\n}\r\n\r\n/* Mid-flip enhancement */\r\n.${className}:hover,\r\n.${className}-flipped {\r\n ${shadowStyle}\r\n}\r\n\r\n/* For card with front and back faces */\r\n.${className} .spark-flip-front,\r\n.${className} .spark-flip-back {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n backface-visibility: hidden;\r\n -webkit-backface-visibility: hidden;\r\n}\r\n\r\n.${className} .spark-flip-back {\r\n transform: rotate${rotateAxis}(${options.angle}deg);\r\n}\r\n\r\n.spark-flip3d-static {\r\n /* Fallback for reduced motion */\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className},\r\n .${className}:hover,\r\n .${className}-flipped {\r\n transform: none !important;\r\n transition: opacity 200ms ease !important;\r\n }\r\n \r\n .${className}:hover,\r\n .${className}-flipped {\r\n opacity: 0.8;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default flip3d\r\n","/**\r\n * Swing Effect\r\n * Pendulum-like swinging animation\r\n * \r\n * @module effects/motion/swing\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkSwingOptions extends SparkBaseOptions {\r\n /** Maximum swing angle in degrees. Default: 15 */\r\n angle?: number\r\n\r\n /** Animation duration in ms. Default: 1000 */\r\n duration?: number\r\n\r\n /** Transform origin. Default: 'top center' */\r\n origin?: string\r\n\r\n /** Easing function. Default: 'ease-in-out' */\r\n easing?: string\r\n\r\n /** Number of swings before stopping. -1 for infinite. Default: -1 */\r\n count?: number\r\n\r\n /** Damping effect (swings get smaller). Default: false */\r\n damping?: boolean\r\n\r\n /** Trigger: 'auto' | 'hover'. Default: 'auto' */\r\n trigger?: 'auto' | 'hover'\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst SWING_DEFAULTS: Partial<SparkSwingOptions> = {\r\n angle: 15,\r\n duration: 1000,\r\n origin: 'top center',\r\n easing: 'ease-in-out',\r\n count: -1,\r\n damping: false,\r\n trigger: 'auto',\r\n}\r\n\r\n// ============================================================================\r\n// SWING EFFECT\r\n// ============================================================================\r\n\r\nexport function swing(options?: SparkSwingOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, SWING_DEFAULTS) as Required<SparkSwingOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-swing-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('swing')\r\n const keyframes = buildSwingKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectSwingStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n transformOrigin: merged.origin,\r\n },\r\n })\r\n}\r\n\r\nfunction buildSwingKeyframes(options: Required<SparkSwingOptions>): string {\r\n const { angle, damping } = options\r\n\r\n if (damping) {\r\n // Damping: swings get smaller over time\r\n return `\r\n 0% { transform: rotate(0deg); }\r\n 10% { transform: rotate(${angle}deg); }\r\n 20% { transform: rotate(-${angle * 0.8}deg); }\r\n 30% { transform: rotate(${angle * 0.6}deg); }\r\n 40% { transform: rotate(-${angle * 0.4}deg); }\r\n 50% { transform: rotate(${angle * 0.2}deg); }\r\n 60% { transform: rotate(-${angle * 0.1}deg); }\r\n 100% { transform: rotate(0deg); }\r\n `\r\n }\r\n\r\n return `\r\n 0% { transform: rotate(0deg); }\r\n 25% { transform: rotate(${angle}deg); }\r\n 50% { transform: rotate(0deg); }\r\n 75% { transform: rotate(-${angle}deg); }\r\n 100% { transform: rotate(0deg); }\r\n `\r\n}\r\n\r\nfunction injectSwingStyles(animationId: string, options: Required<SparkSwingOptions>): string {\r\n if (!isBrowser()) return `spark-swing-${animationId}`\r\n\r\n const className = `spark-swing-${animationId}`\r\n const styleId = `spark-swing-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const iterationCount = options.count === -1 ? 'infinite' : options.count.toString()\r\n const animationPlayState = options.trigger === 'hover' ? 'paused' : 'running'\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} ${iterationCount};\r\n animation-play-state: ${animationPlayState};\r\n transform-origin: ${options.origin};\r\n will-change: transform;\r\n}\r\n\r\n${options.trigger === 'hover' ? `\r\n.${className}:hover {\r\n animation-play-state: running;\r\n}\r\n` : ''}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default swing\r\n","/**\r\n * Orbit Effect\r\n * Elements orbiting around a center point\r\n * \r\n * @module effects/motion/orbit\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { injectAnimation } from '../../core/styles'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkOrbitOptions extends SparkBaseOptions {\r\n /** Orbit radius in pixels. Default: 50 */\r\n radius?: number\r\n\r\n /** Animation duration in ms (one full rotation). Default: 4000 */\r\n duration?: number\r\n\r\n /** Direction: 'clockwise' | 'counterclockwise'. Default: 'clockwise' */\r\n direction?: 'clockwise' | 'counterclockwise'\r\n\r\n /** Easing function. Default: 'linear' */\r\n easing?: string\r\n\r\n /** Start angle in degrees. Default: 0 */\r\n startAngle?: number\r\n\r\n /** Elliptical orbit (x/y ratio). Default: 1 (circular) */\r\n ellipse?: number\r\n\r\n /** Add 3D tilt effect. Default: false */\r\n tilt?: boolean\r\n\r\n /** Tilt angle in degrees. Default: 20 */\r\n tiltAngle?: number\r\n\r\n /** Scale variation during orbit. Default: false */\r\n scaleVariation?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst ORBIT_DEFAULTS: Partial<SparkOrbitOptions> = {\r\n radius: 50,\r\n duration: 4000,\r\n direction: 'clockwise',\r\n easing: 'linear',\r\n startAngle: 0,\r\n ellipse: 1,\r\n tilt: false,\r\n tiltAngle: 20,\r\n scaleVariation: false,\r\n}\r\n\r\n// ============================================================================\r\n// ORBIT EFFECT\r\n// ============================================================================\r\n\r\nexport function orbit(options?: SparkOrbitOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, ORBIT_DEFAULTS) as Required<SparkOrbitOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-orbit-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('orbit')\r\n const keyframes = buildOrbitKeyframes(merged)\r\n\r\n injectAnimation(animationId, keyframes)\r\n\r\n const className = injectOrbitStyles(animationId, merged)\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n style: {\r\n willChange: 'transform',\r\n },\r\n })\r\n}\r\n\r\nfunction buildOrbitKeyframes(options: Required<SparkOrbitOptions>): string {\r\n const { radius, direction, startAngle, ellipse, tilt, tiltAngle, scaleVariation } = options\r\n\r\n const radiusY = radius * ellipse\r\n const dir = direction === 'counterclockwise' ? -1 : 1\r\n\r\n // Generate keyframes for smooth circular/elliptical motion\r\n const steps = 8\r\n let keyframesStr = ''\r\n\r\n for (let i = 0; i <= steps; i++) {\r\n const percent = (i / steps) * 100\r\n const angle = (startAngle + (i / steps) * 360 * dir) * (Math.PI / 180)\r\n\r\n const x = Math.cos(angle) * radius\r\n const y = Math.sin(angle) * radiusY\r\n\r\n let transform = `translate(${x.toFixed(2)}px, ${y.toFixed(2)}px)`\r\n\r\n // Add tilt for 3D effect\r\n if (tilt) {\r\n const rotateX = Math.sin(angle) * tiltAngle\r\n transform += ` rotateX(${rotateX.toFixed(2)}deg)`\r\n }\r\n\r\n // Add scale variation (closer = bigger)\r\n if (scaleVariation) {\r\n const scale = 1 + Math.sin(angle) * 0.1\r\n transform += ` scale(${scale.toFixed(3)})`\r\n }\r\n\r\n keyframesStr += `\r\n ${percent}% {\r\n transform: ${transform};\r\n }\r\n `\r\n }\r\n\r\n return keyframesStr\r\n}\r\n\r\nfunction injectOrbitStyles(animationId: string, options: Required<SparkOrbitOptions>): string {\r\n if (!isBrowser()) return `spark-orbit-${animationId}`\r\n\r\n const className = `spark-orbit-${animationId}`\r\n const styleId = `spark-orbit-style-${animationId}`\r\n\r\n if (document.getElementById(styleId)) return className\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n animation: ${animationId} ${options.duration}ms ${options.easing} infinite;\r\n will-change: transform;\r\n backface-visibility: hidden;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className} {\r\n animation: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n\r\n return className\r\n}\r\n\r\nexport default orbit\r\n","/**\r\n * Reveal Effect\r\n * Animate elements when they enter the viewport\r\n * \r\n * @module effects/scroll/reveal\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, generateAnimationId } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkRevealOptions extends SparkBaseOptions {\r\n /** Animation type. Default: 'fade-up' */\r\n animation?: 'fade' | 'fade-up' | 'fade-down' | 'fade-left' | 'fade-right' | 'zoom' | 'flip'\r\n\r\n /** Animation duration in ms. Default: 600 */\r\n duration?: number\r\n\r\n /** Animation delay in ms. Default: 0 */\r\n delay?: number\r\n\r\n /** Viewport threshold (0-1). Default: 0.2 */\r\n threshold?: number\r\n\r\n /** Easing function. Default: 'ease-out' */\r\n easing?: string\r\n\r\n /** Distance for slide animations in px. Default: 40 */\r\n distance?: number\r\n\r\n /** Only animate once. Default: true */\r\n once?: boolean\r\n\r\n /** Reset animation when leaving viewport. Default: false */\r\n reset?: boolean\r\n\r\n /** Root margin for intersection observer. Default: '0px' */\r\n rootMargin?: string\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst REVEAL_DEFAULTS: Partial<SparkRevealOptions> = {\r\n animation: 'fade-up',\r\n duration: 600,\r\n delay: 0,\r\n threshold: 0.2,\r\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n distance: 40,\r\n once: true,\r\n reset: false,\r\n rootMargin: '0px',\r\n}\r\n\r\n// State tracking for observed elements\r\nconst observedElements = new WeakMap<Element, {\r\n observer: IntersectionObserver\r\n revealed: boolean\r\n}>()\r\n\r\n// ============================================================================\r\n// REVEAL EFFECT\r\n// ============================================================================\r\n\r\nexport function reveal(options?: SparkRevealOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, REVEAL_DEFAULTS) as Required<SparkRevealOptions>\r\n\r\n if (!shouldAnimate(merged) || shouldReduceMotion()) {\r\n return createSimpleEffectResult({\r\n className: 'spark-reveal-static',\r\n })\r\n }\r\n\r\n const animationId = generateAnimationId('reveal')\r\n const className = `spark-reveal-${animationId}`\r\n\r\n injectRevealStyles(className, merged)\r\n\r\n // Setup function called when element is added to DOM\r\n const setup = (element: HTMLElement) => {\r\n if (!isBrowser() || observedElements.has(element)) return\r\n\r\n // Set initial hidden state\r\n element.classList.add(`${className}-hidden`)\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n const state = observedElements.get(element)\r\n if (!state) return\r\n\r\n if (entry.isIntersecting) {\r\n // Element entered viewport - reveal\r\n setTimeout(() => {\r\n element.classList.remove(`${className}-hidden`)\r\n element.classList.add(`${className}-visible`)\r\n state.revealed = true\r\n\r\n // Disconnect if only animating once\r\n if (merged.once) {\r\n observer.disconnect()\r\n }\r\n }, merged.delay)\r\n } else if (!merged.once && state.revealed && merged.reset) {\r\n // Element left viewport - reset\r\n element.classList.remove(`${className}-visible`)\r\n element.classList.add(`${className}-hidden`)\r\n state.revealed = false\r\n }\r\n })\r\n },\r\n {\r\n threshold: merged.threshold,\r\n rootMargin: merged.rootMargin,\r\n }\r\n )\r\n\r\n observedElements.set(element, { observer, revealed: false })\r\n observer.observe(element)\r\n }\r\n\r\n const cleanup = (element?: HTMLElement) => {\r\n if (element) {\r\n const state = observedElements.get(element)\r\n if (state) {\r\n state.observer.disconnect()\r\n observedElements.delete(element)\r\n }\r\n }\r\n }\r\n\r\n // Use MutationObserver to detect when elements with this class are added\r\n if (isBrowser()) {\r\n requestAnimationFrame(() => {\r\n document.querySelectorAll(`.${className}`).forEach((el) => {\r\n setup(el as HTMLElement)\r\n })\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n cleanup,\r\n })\r\n}\r\n\r\nfunction injectRevealStyles(className: string, options: Required<SparkRevealOptions>): void {\r\n if (!isBrowser()) return\r\n\r\n const styleId = `spark-reveal-style-${className}`\r\n if (document.getElementById(styleId)) return\r\n\r\n const { animation, duration, easing, distance } = options\r\n\r\n // Define initial (hidden) and final (visible) states based on animation type\r\n let hiddenTransform = ''\r\n let hiddenOpacity = '0'\r\n\r\n switch (animation) {\r\n case 'fade':\r\n hiddenTransform = 'none'\r\n break\r\n case 'fade-up':\r\n hiddenTransform = `translateY(${distance}px)`\r\n break\r\n case 'fade-down':\r\n hiddenTransform = `translateY(-${distance}px)`\r\n break\r\n case 'fade-left':\r\n hiddenTransform = `translateX(${distance}px)`\r\n break\r\n case 'fade-right':\r\n hiddenTransform = `translateX(-${distance}px)`\r\n break\r\n case 'zoom':\r\n hiddenTransform = 'scale(0.8)'\r\n break\r\n case 'flip':\r\n hiddenTransform = 'perspective(1000px) rotateX(-90deg)'\r\n break\r\n }\r\n\r\n const style = document.createElement('style')\r\n style.id = styleId\r\n style.textContent = `\r\n.${className} {\r\n will-change: transform, opacity;\r\n}\r\n\r\n.${className}-hidden {\r\n opacity: ${hiddenOpacity};\r\n ${hiddenTransform !== 'none' ? `transform: ${hiddenTransform};` : ''}\r\n transition: none;\r\n}\r\n\r\n.${className}-visible {\r\n opacity: 1;\r\n transform: none;\r\n transition: opacity ${duration}ms ${easing}, transform ${duration}ms ${easing};\r\n}\r\n\r\n.spark-reveal-static {\r\n /* Already visible */\r\n opacity: 1;\r\n transform: none;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .${className}-hidden,\r\n .${className}-visible {\r\n transition: opacity 200ms ease !important;\r\n transform: none !important;\r\n }\r\n}\r\n`\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport default reveal\r\n","/**\r\n * Counter Effect\r\n * Animating numbers counting up/down when in viewport\r\n * \r\n * @module effects/scroll/counter\r\n * @version 1.2.0\r\n */\r\n\r\nimport { SparkBaseOptions, SparkEffectResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, createSimpleEffectResult } from '../../core/engine'\r\nimport { shouldReduceMotion } from '../../core/a11y'\r\nimport { isBrowser, easings, EasingName } from '../../core/utils'\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface SparkCounterOptions extends SparkBaseOptions {\r\n /** Starting value. Default: 0 */\r\n from?: number\r\n\r\n /** Target value. Default: 100 */\r\n to?: number\r\n\r\n /** Animation duration in ms. Default: 2000 */\r\n duration?: number\r\n\r\n /** Easing function name. Default: 'easeOutQuart' */\r\n easing?: EasingName\r\n\r\n /** Decimal places to show. Default: 0 */\r\n decimals?: number\r\n\r\n /** Prefix to add (e.g., '$'). Default: '' */\r\n prefix?: string\r\n\r\n /** Suffix to add (e.g., '%'). Default: '' */\r\n suffix?: string\r\n\r\n /** Thousand separator. Default: ',' */\r\n separator?: string\r\n\r\n /** Viewport threshold (0-1). Default: 0.5 */\r\n threshold?: number\r\n\r\n /** Only animate once. Default: true */\r\n once?: boolean\r\n}\r\n\r\n// ============================================================================\r\n// CONSTANTS\r\n// ============================================================================\r\n\r\nconst COUNTER_DEFAULTS: Partial<SparkCounterOptions> = {\r\n from: 0,\r\n to: 100,\r\n duration: 2000,\r\n easing: 'easeOutQuart',\r\n decimals: 0,\r\n prefix: '',\r\n suffix: '',\r\n separator: ',',\r\n threshold: 0.5,\r\n once: true,\r\n}\r\n\r\n// State tracking\r\nconst counterStates = new WeakMap<Element, {\r\n observer: IntersectionObserver\r\n animated: boolean\r\n animationFrame: number | null\r\n}>()\r\n\r\n// ============================================================================\r\n// COUNTER EFFECT\r\n// ============================================================================\r\n\r\nexport function counter(options?: SparkCounterOptions): SparkEffectResult {\r\n const merged = mergeOptions(options, COUNTER_DEFAULTS) as Required<SparkCounterOptions>\r\n\r\n const reducedMotion = shouldReduceMotion()\r\n\r\n // Helper to format number\r\n const formatNumber = (value: number): string => {\r\n const fixed = value.toFixed(merged.decimals)\r\n const [intPart, decPart] = fixed.split('.')\r\n\r\n // Add thousand separators\r\n const withSeparator = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, merged.separator)\r\n\r\n const formatted = decPart ? `${withSeparator}.${decPart}` : withSeparator\r\n return `${merged.prefix}${formatted}${merged.suffix}`\r\n }\r\n\r\n // Animation function\r\n const animateCounter = (element: HTMLElement) => {\r\n const state = counterStates.get(element)\r\n if (!state || (state.animated && merged.once)) return\r\n\r\n // If reduced motion, just set final value\r\n if (reducedMotion || !shouldAnimate(merged)) {\r\n element.textContent = formatNumber(merged.to)\r\n if (state) state.animated = true\r\n return\r\n }\r\n\r\n const startTime = performance.now()\r\n const easingFn = easings[merged.easing] || easings.easeOutQuart\r\n\r\n const animate = (currentTime: number) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / merged.duration, 1)\r\n\r\n const easedProgress = easingFn(progress)\r\n const currentValue = merged.from + (merged.to - merged.from) * easedProgress\r\n\r\n element.textContent = formatNumber(currentValue)\r\n\r\n if (progress < 1) {\r\n state.animationFrame = requestAnimationFrame(animate)\r\n } else {\r\n state.animated = true\r\n state.animationFrame = null\r\n }\r\n }\r\n\r\n state.animationFrame = requestAnimationFrame(animate)\r\n }\r\n\r\n // Setup function\r\n const setup = (element: HTMLElement) => {\r\n if (!isBrowser() || counterStates.has(element)) return\r\n\r\n // Set initial value\r\n element.textContent = formatNumber(merged.from)\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n animateCounter(element)\r\n\r\n if (merged.once) {\r\n observer.disconnect()\r\n }\r\n }\r\n })\r\n },\r\n { threshold: merged.threshold }\r\n )\r\n\r\n counterStates.set(element, {\r\n observer,\r\n animated: false,\r\n animationFrame: null,\r\n })\r\n\r\n observer.observe(element)\r\n }\r\n\r\n const cleanup = (element?: HTMLElement) => {\r\n if (element) {\r\n const state = counterStates.get(element)\r\n if (state) {\r\n state.observer.disconnect()\r\n if (state.animationFrame) {\r\n cancelAnimationFrame(state.animationFrame)\r\n }\r\n counterStates.delete(element)\r\n }\r\n }\r\n }\r\n\r\n // Setup on mount\r\n const className = `spark-counter-${Date.now().toString(36)}`\r\n\r\n if (isBrowser()) {\r\n requestAnimationFrame(() => {\r\n document.querySelectorAll(`.${className}`).forEach((el) => {\r\n setup(el as HTMLElement)\r\n })\r\n })\r\n }\r\n\r\n return createSimpleEffectResult({\r\n className,\r\n cleanup,\r\n })\r\n}\r\n\r\nexport default counter\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Confetti celebration effect\r\n */\r\n\r\nimport type { SparkConfettiOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate, random, randomItem, generateId } from '../../core/engine'\r\nimport { injectBaseStyles, injectAnimation } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkConfettiOptions> = {\r\n duration: 2000,\r\n count: 30,\r\n colors: ['#ff0055', '#00d4ff', '#00ffa3', '#ffcc00', '#ff00ff'],\r\n spread: 60,\r\n trigger: 'click',\r\n intensity: 1,\r\n}\r\n\r\nexport function confetti(options?: SparkConfettiOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkConfettiOptions>\r\n\r\n injectBaseStyles()\r\n\r\n const createParticles = (container: HTMLElement) => {\r\n const count = Math.floor(opts.count * opts.intensity)\r\n\r\n for (let i = 0; i < count; i++) {\r\n const particle = document.createElement('div')\r\n const size = random(5, 10)\r\n const color = randomItem(opts.colors)\r\n const id = generateId()\r\n\r\n particle.className = `sparkfx-confetti-particle ${id}`\r\n particle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n top: 50%;\r\n left: 50%;\r\n border-radius: ${random(0, 50)}%;\r\n pointer-events: none;\r\n z-index: 1000;\r\n `\r\n\r\n const angle = random(-opts.spread, opts.spread) - 90\r\n const velocity = random(10, 20)\r\n const animationName = `sparkfx-confetti-${id}`\r\n\r\n injectAnimation(animationName, `\r\n 0% { transform: translate(-50%, -50%) rotate(0deg); opacity: 1; }\r\n 100% { transform: translate(calc(-50% + ${Math.cos(angle * Math.PI / 180) * velocity * 10}px), calc(-50% + ${Math.sin(angle * Math.PI / 180) * velocity * 10}px)) rotate(${random(0, 360)}deg); opacity: 0; }\r\n `)\r\n\r\n particle.style.animation = `${animationName} ${opts.duration}ms ease-out forwards`\r\n container.appendChild(particle)\r\n\r\n setTimeout(() => particle.remove(), opts.duration)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-confetti'),\r\n onClick: (e: any) => {\r\n if (opts.trigger === 'click') {\r\n createParticles(e.currentTarget as HTMLElement)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Sparkle effect - Magic stars appearing on surface\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface SparkleOptions extends SparkBaseOptions {\r\n color?: string\r\n count?: number\r\n spread?: number\r\n}\r\n\r\nconst defaultOptions: Partial<SparkleOptions> = {\r\n trigger: 'hover',\r\n duration: 600,\r\n color: '#ffd700',\r\n count: 8,\r\n spread: 40,\r\n}\r\n\r\nfunction createSparkle(container: HTMLElement, color: string, spread: number) {\r\n const sparkle = document.createElement('span')\r\n sparkle.className = 'sparkfx-sparkle-particle'\r\n\r\n const size = Math.random() * 8 + 4\r\n const angle = Math.random() * 360\r\n const distance = Math.random() * spread + 10\r\n const x = Math.cos(angle * Math.PI / 180) * distance\r\n const y = Math.sin(angle * Math.PI / 180) * distance\r\n\r\n sparkle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n border-radius: 50%;\r\n pointer-events: none;\r\n left: 50%;\r\n top: 50%;\r\n transform: translate(-50%, -50%);\r\n box-shadow: 0 0 ${size}px ${color}, 0 0 ${size * 2}px ${color};\r\n animation: sparkfx-sparkle-fly 0.6s ease-out forwards;\r\n --sparkle-x: ${x}px;\r\n --sparkle-y: ${y}px;\r\n `\r\n\r\n container.appendChild(sparkle)\r\n setTimeout(() => sparkle.remove(), 600)\r\n}\r\n\r\nfunction injectSparkleStyles() {\r\n if (document.getElementById('sparkfx-sparkle-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-sparkle-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-sparkle-fly {\r\n 0% {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(0);\r\n }\r\n 50% {\r\n opacity: 1;\r\n transform: translate(calc(-50% + var(--sparkle-x)), calc(-50% + var(--sparkle-y))) scale(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translate(calc(-50% + var(--sparkle-x) * 1.5), calc(-50% + var(--sparkle-y) * 1.5)) scale(0.5);\r\n }\r\n }\r\n \r\n .sparkfx-sparkle {\r\n position: relative;\r\n overflow: visible !important;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function sparkle(options?: SparkleOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkleOptions>\r\n\r\n injectBaseStyles()\r\n injectSparkleStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const triggerSparkles = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n for (let i = 0; i < opts.count; i++) {\r\n setTimeout(() => createSparkle(target, opts.color, opts.spread), i * 50)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-sparkle'),\r\n style: generateCSSVars(opts),\r\n onMouseEnter: opts.trigger === 'hover' ? triggerSparkles : undefined,\r\n onClick: opts.trigger === 'click' ? triggerSparkles : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Firework effect - Expressive celebration explosions\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface FireworkOptions extends SparkBaseOptions {\r\n colors?: string[]\r\n particleCount?: number\r\n spread?: number\r\n}\r\n\r\nconst defaultOptions: Partial<FireworkOptions> = {\r\n trigger: 'click',\r\n duration: 800,\r\n colors: ['#ff0000', '#ffd700', '#00ff00', '#00bfff', '#ff00ff', '#ff6600'],\r\n particleCount: 24,\r\n spread: 80,\r\n}\r\n\r\nfunction createParticle(container: HTMLElement, x: number, y: number, color: string, angle: number, distance: number) {\r\n const particle = document.createElement('span')\r\n particle.className = 'sparkfx-firework-particle'\r\n\r\n const size = Math.random() * 6 + 3\r\n const endX = Math.cos(angle * Math.PI / 180) * distance\r\n const endY = Math.sin(angle * Math.PI / 180) * distance\r\n\r\n particle.style.cssText = `\r\n position: absolute;\r\n width: ${size}px;\r\n height: ${size}px;\r\n background: ${color};\r\n border-radius: 50%;\r\n pointer-events: none;\r\n left: ${x}px;\r\n top: ${y}px;\r\n transform: translate(-50%, -50%);\r\n box-shadow: 0 0 ${size * 2}px ${color};\r\n animation: sparkfx-firework-explode 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;\r\n --fw-x: ${endX}px;\r\n --fw-y: ${endY}px;\r\n `\r\n\r\n container.appendChild(particle)\r\n setTimeout(() => particle.remove(), 800)\r\n}\r\n\r\nfunction injectFireworkStyles() {\r\n if (document.getElementById('sparkfx-firework-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-firework-styles'\r\n style.textContent = `\r\n @keyframes sparkfx-firework-explode {\r\n 0% {\r\n opacity: 1;\r\n transform: translate(-50%, -50%) scale(0);\r\n }\r\n 30% {\r\n opacity: 1;\r\n transform: translate(calc(-50% + var(--fw-x) * 0.8), calc(-50% + var(--fw-y) * 0.8)) scale(1.2);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translate(calc(-50% + var(--fw-x)), calc(-50% + var(--fw-y) + 20px)) scale(0.3);\r\n }\r\n }\r\n \r\n .sparkfx-firework {\r\n position: relative;\r\n overflow: visible !important;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function firework(options?: FireworkOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<FireworkOptions>\r\n\r\n injectBaseStyles()\r\n injectFireworkStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const triggerFirework = (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLElement\r\n const rect = target.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n\r\n const angleStep = 360 / opts.particleCount\r\n\r\n for (let i = 0; i < opts.particleCount; i++) {\r\n const angle = angleStep * i + (Math.random() * 20 - 10)\r\n const distance = opts.spread * (0.6 + Math.random() * 0.4)\r\n const color = opts.colors[Math.floor(Math.random() * opts.colors.length)]\r\n\r\n setTimeout(() => {\r\n createParticle(target, x, y, color, angle, distance)\r\n }, Math.random() * 100)\r\n }\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-firework'),\r\n style: generateCSSVars(opts),\r\n onClick: opts.trigger === 'click' ? triggerFirework : undefined,\r\n onMouseEnter: opts.trigger === 'hover' ? triggerFirework : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Combined celebration effects\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport { confetti } from './confetti'\r\nimport { sparkle } from './sparkle'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 3000,\r\n trigger: 'click',\r\n}\r\n\r\nexport function celebrate(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const cssVars = generateCSSVars({\r\n duration: opts.duration,\r\n })\r\n\r\n const confettiResult = confetti({ ...opts, trigger: 'click' })\r\n const sparkleResult = sparkle({ ...opts, trigger: 'hover' })\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-celebrate'),\r\n style: cssVars,\r\n onClick: (e: any) => {\r\n confettiResult.onClick?.(e)\r\n },\r\n onMouseEnter: (e: any) => {\r\n sparkleResult.onMouseEnter?.(e)\r\n },\r\n onMouseLeave: (e: any) => {\r\n sparkleResult.onMouseLeave?.(e)\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Typewriter effect - Character by character reveal\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface TypewriterOptions extends SparkBaseOptions {\r\n speed?: number\r\n cursor?: boolean\r\n cursorChar?: string\r\n}\r\n\r\nconst defaultOptions: Partial<TypewriterOptions> = {\r\n trigger: 'click',\r\n duration: 50,\r\n speed: 50,\r\n cursor: true,\r\n cursorChar: '|',\r\n}\r\n\r\nfunction injectTypewriterStyles() {\r\n if (document.getElementById('sparkfx-typewriter-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-typewriter-styles'\r\n style.textContent = `\r\n .sparkfx-typewriter-cursor {\r\n animation: sparkfx-cursor-blink 0.8s infinite;\r\n margin-left: 2px;\r\n font-weight: 100;\r\n }\r\n \r\n @keyframes sparkfx-cursor-blink {\r\n 0%, 50% { opacity: 1; }\r\n 51%, 100% { opacity: 0; }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function typewriter(options?: TypewriterOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<TypewriterOptions>\r\n\r\n injectBaseStyles()\r\n injectTypewriterStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let isTyping = false\r\n let originalText = ''\r\n let cursorEl: HTMLElement | null = null\r\n\r\n const startTyping = (e: Event) => {\r\n if (isTyping) return\r\n isTyping = true\r\n\r\n const target = e.currentTarget as HTMLElement\r\n originalText = originalText || target.textContent || ''\r\n target.textContent = ''\r\n\r\n if (opts.cursor) {\r\n cursorEl = document.createElement('span')\r\n cursorEl.className = 'sparkfx-typewriter-cursor'\r\n cursorEl.textContent = opts.cursorChar\r\n target.appendChild(cursorEl)\r\n }\r\n\r\n let i = 0\r\n const type = () => {\r\n if (i < originalText.length) {\r\n if (cursorEl) target.insertBefore(document.createTextNode(originalText[i]), cursorEl)\r\n else target.textContent += originalText[i]\r\n i++\r\n setTimeout(type, opts.speed)\r\n } else {\r\n if (cursorEl) {\r\n setTimeout(() => {\r\n cursorEl?.remove()\r\n cursorEl = null\r\n }, 1500)\r\n }\r\n isTyping = false\r\n }\r\n }\r\n\r\n type()\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-typewriter'),\r\n onClick: opts.trigger === 'click' ? startTyping : undefined,\r\n onMouseEnter: opts.trigger === 'hover' ? startTyping : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Hacker-style text scramble decryption\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nconst defaultOptions: Partial<SparkBaseOptions> = {\r\n duration: 1000,\r\n trigger: 'hover',\r\n}\r\n\r\nconst CHARS = 'ABCDEFGHIKLMNOPQRSTUVWXYZ0123456789@#$%&'\r\n\r\nexport function scramble(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<SparkBaseOptions>\r\n\r\n injectBaseStyles()\r\n\r\n let interval: any = null\r\n\r\n const startScramble = (target: HTMLElement) => {\r\n const originalText = target.innerText\r\n let iteration = 0\r\n\r\n clearInterval(interval)\r\n\r\n interval = setInterval(() => {\r\n target.innerText = originalText\r\n .split('')\r\n .map((char, index) => {\r\n if (index < iteration) return originalText[index]\r\n return CHARS[Math.floor(Math.random() * CHARS.length)]\r\n })\r\n .join('')\r\n\r\n if (iteration >= originalText.length) {\r\n clearInterval(interval)\r\n }\r\n\r\n iteration += 1 / 3\r\n }, opts.duration / (originalText.length * 3))\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-scramble'),\r\n onMouseEnter: (e: any) => {\r\n if (opts.trigger === 'hover') {\r\n startScramble(e.currentTarget as HTMLElement)\r\n }\r\n },\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Wave effect - Letters moving in wave motion\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface WaveOptions extends SparkBaseOptions {\r\n amplitude?: number\r\n speed?: number\r\n}\r\n\r\nconst defaultOptions: Partial<WaveOptions> = {\r\n trigger: 'hover',\r\n duration: 400,\r\n amplitude: 8,\r\n speed: 100,\r\n}\r\n\r\nfunction injectWaveStyles() {\r\n if (document.getElementById('sparkfx-wave-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-wave-styles'\r\n style.textContent = `\r\n .sparkfx-wave {\r\n display: inline-block;\r\n }\r\n \r\n .sparkfx-wave-letter {\r\n display: inline-block;\r\n animation: sparkfx-wave-float 0.4s ease-in-out;\r\n animation-fill-mode: both;\r\n }\r\n \r\n @keyframes sparkfx-wave-float {\r\n 0%, 100% { transform: translateY(0); }\r\n 50% { transform: translateY(var(--wave-amplitude, -8px)); }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function wave(options?: WaveOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<WaveOptions>\r\n\r\n injectBaseStyles()\r\n injectWaveStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n let isAnimating = false\r\n let originalHTML = ''\r\n\r\n const startWave = (e: Event) => {\r\n if (isAnimating) return\r\n isAnimating = true\r\n\r\n const target = e.currentTarget as HTMLElement\r\n\r\n if (!originalHTML) {\r\n originalHTML = target.innerHTML\r\n }\r\n\r\n const text = target.textContent || ''\r\n target.innerHTML = ''\r\n\r\n text.split('').forEach((char, i) => {\r\n const span = document.createElement('span')\r\n span.className = 'sparkfx-wave-letter'\r\n span.textContent = char === ' ' ? '\\u00A0' : char\r\n span.style.setProperty('--wave-amplitude', `-${opts.amplitude}px`)\r\n span.style.animationDelay = `${i * opts.speed}ms`\r\n target.appendChild(span)\r\n })\r\n\r\n const totalDuration = text.length * opts.speed + opts.duration\r\n setTimeout(() => {\r\n target.innerHTML = originalHTML\r\n isAnimating = false\r\n }, totalDuration)\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-wave'),\r\n onMouseEnter: opts.trigger === 'hover' ? startWave : undefined,\r\n onClick: opts.trigger === 'click' ? startWave : undefined,\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions\r\n * Highlight effect - Marker pen style text highlighting\r\n */\r\n\r\nimport type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions, shouldAnimate } from '../../core/engine'\r\nimport { injectBaseStyles, generateCSSVars } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\ninterface HighlightOptions extends SparkBaseOptions {\r\n color?: string\r\n height?: string\r\n}\r\n\r\nconst defaultOptions: Partial<HighlightOptions> = {\r\n trigger: 'hover',\r\n duration: 300,\r\n color: 'rgba(0, 255, 163, 0.3)',\r\n height: '40%',\r\n}\r\n\r\nfunction injectHighlightStyles() {\r\n if (document.getElementById('sparkfx-highlight-styles')) return\r\n\r\n const style = document.createElement('style')\r\n style.id = 'sparkfx-highlight-styles'\r\n style.textContent = `\r\n .sparkfx-highlight {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n \r\n .sparkfx-highlight::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n width: 0%;\r\n height: var(--highlight-height, 40%);\r\n background: var(--highlight-color, rgba(0, 255, 163, 0.3));\r\n z-index: -1;\r\n transition: width var(--sparkfx-duration) var(--sparkfx-easing);\r\n }\r\n \r\n .sparkfx-highlight-active::after {\r\n width: 100%;\r\n }\r\n `\r\n document.head.appendChild(style)\r\n}\r\n\r\nexport function highlight(options?: HighlightOptions): SparkResult {\r\n const opts = mergeOptions(options, defaultOptions) as Required<HighlightOptions>\r\n\r\n injectBaseStyles()\r\n injectHighlightStyles()\r\n\r\n if (!shouldAnimate(opts)) {\r\n return { className: 'sparkfx-effect sparkfx-reduced-motion' }\r\n }\r\n\r\n const activate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.add('sparkfx-highlight-active')\r\n }\r\n\r\n const deactivate = (e: Event) => {\r\n const target = e.currentTarget as HTMLElement\r\n target.classList.remove('sparkfx-highlight-active')\r\n }\r\n\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-highlight'),\r\n style: {\r\n ...generateCSSVars(opts),\r\n '--highlight-color': opts.color,\r\n '--highlight-height': opts.height,\r\n } as Record<string, string | number>,\r\n onMouseEnter: opts.trigger === 'hover' ? activate : undefined,\r\n onMouseLeave: opts.trigger === 'hover' ? deactivate : undefined,\r\n }\r\n}\r\n","/**\r\n * SparkFX v1.2.2 - Micro-interactions for modern web applications\r\n * All effects are free and open source\r\n * \r\n * Features:\r\n * - 45+ Effects: Motion, scroll, visual, text animations\r\n * - Event Bus: Animation communication system\r\n * - Testing Kit: Jest/Vitest animation testing utilities\r\n * \r\n * @version 1.2.2\r\n * @license MIT\r\n */\r\n\r\n// ============================================================================\r\n// CORE EXPORTS\r\n// ============================================================================\r\nexport * from './core/types'\r\nexport { injectBaseStyles, prefersReducedMotion } from './core/styles'\r\nexport { config, updateConfig, getConfig, setTheme, onThemeChange } from './core/config'\r\nexport { presets, getPresetClasses, getPresetNames, type PresetName } from './core/presets'\r\nexport * from './core/a11y'\r\n\r\n// ============================================================================\r\n// EVENT BUS\r\n// ============================================================================\r\nexport {\r\n eventBus,\r\n SparkEventBus,\r\n on,\r\n once,\r\n emit,\r\n when,\r\n type AnimationEventType,\r\n type SparkEventType,\r\n type SparkEventPayload,\r\n type SparkEventHandler,\r\n type SubscriptionOptions\r\n} from './core/event-bus'\r\n\r\n// ============================================================================\r\n// API EXPORTS\r\n// ============================================================================\r\nexport { combine } from './api/combine'\r\nexport { sequence, type SequenceStep, type SequenceOptions } from './api/sequence'\r\nexport { stagger, type StaggerOptions } from './api/stagger'\r\n\r\n// ============================================================================\r\n// BASIC EFFECTS\r\n// ============================================================================\r\nexport { bounce } from './effects/basic/bounce'\r\nexport { pulse } from './effects/basic/pulse'\r\nexport { lift } from './effects/basic/lift'\r\nexport { scale } from './effects/basic/scale'\r\nexport { shake } from './effects/basic/shake'\r\nexport { fade } from './effects/basic/fade'\r\nexport { slide } from './effects/basic/slide'\r\nexport { rotate } from './effects/basic/rotate'\r\n\r\n// ============================================================================\r\n// PREMIUM EFFECTS\r\n// ============================================================================\r\nexport { glow } from './effects/premium/glow'\r\nexport { ripple } from './effects/premium/ripple'\r\nexport { magnetic } from './effects/premium/magnetic'\r\nexport { tilt } from './effects/premium/tilt'\r\nexport { elastic } from './effects/premium/elastic'\r\nexport { jelly } from './effects/premium/jelly'\r\nexport { rubber } from './effects/premium/rubber'\r\nexport { morph } from './effects/premium/morph'\r\n\r\n// ============================================================================\r\n// VISUAL EFFECTS\r\n// ============================================================================\r\nexport { glitch } from './effects/visual/glitch'\r\nexport { blur } from './effects/visual/blur'\r\nexport { neon } from './effects/visual/neon'\r\nexport { glass } from './effects/visual/glass'\r\nexport { shimmer } from './effects/visual/shimmer'\r\nexport { gradient } from './effects/visual/gradient'\r\nexport { spotlight } from './effects/visual/spotlight'\r\nexport { hologram } from './effects/visual/hologram'\r\nexport { aurora } from './effects/visual/aurora'\r\nexport { matrix } from './effects/visual/matrix'\r\nexport { rainbow } from './effects/visual/rainbow'\r\n\r\n// ============================================================================\r\n// MOTION EFFECTS (NEW in v1.2.0)\r\n// ============================================================================\r\nexport { parallax } from './effects/motion/parallax'\r\nexport { float } from './effects/motion/float'\r\nexport { flip3d } from './effects/motion/flip3d'\r\nexport { swing } from './effects/motion/swing'\r\nexport { orbit } from './effects/motion/orbit'\r\n\r\n// ============================================================================\r\n// SCROLL EFFECTS (NEW in v1.2.0)\r\n// ============================================================================\r\nexport { reveal } from './effects/scroll/reveal'\r\nexport { counter } from './effects/scroll/counter'\r\n\r\n// ============================================================================\r\n// CELEBRATION EFFECTS\r\n// ============================================================================\r\nexport { confetti } from './effects/celebration/confetti'\r\nexport { sparkle } from './effects/celebration/sparkle'\r\nexport { firework } from './effects/celebration/firework'\r\nexport { celebrate } from './effects/celebration/celebrate'\r\n\r\n// ============================================================================\r\n// TEXT EFFECTS\r\n// ============================================================================\r\nexport { typewriter } from './effects/text/typewriter'\r\nexport { scramble } from './effects/text/scramble'\r\nexport { wave } from './effects/text/wave'\r\nexport { highlight } from './effects/text/highlight'\r\n\r\n// ============================================================================\r\n// IMPORTS FOR SPARK OBJECT\r\n// ============================================================================\r\nimport { bounce } from './effects/basic/bounce'\r\nimport { pulse } from './effects/basic/pulse'\r\nimport { lift } from './effects/basic/lift'\r\nimport { scale } from './effects/basic/scale'\r\nimport { shake } from './effects/basic/shake'\r\nimport { fade } from './effects/basic/fade'\r\nimport { slide } from './effects/basic/slide'\r\nimport { rotate } from './effects/basic/rotate'\r\nimport { glow } from './effects/premium/glow'\r\nimport { ripple } from './effects/premium/ripple'\r\nimport { magnetic } from './effects/premium/magnetic'\r\nimport { tilt } from './effects/premium/tilt'\r\nimport { elastic } from './effects/premium/elastic'\r\nimport { jelly } from './effects/premium/jelly'\r\nimport { rubber } from './effects/premium/rubber'\r\nimport { morph } from './effects/premium/morph'\r\nimport { glitch } from './effects/visual/glitch'\r\nimport { blur } from './effects/visual/blur'\r\nimport { neon } from './effects/visual/neon'\r\nimport { glass } from './effects/visual/glass'\r\nimport { shimmer } from './effects/visual/shimmer'\r\nimport { gradient } from './effects/visual/gradient'\r\nimport { spotlight } from './effects/visual/spotlight'\r\nimport { hologram } from './effects/visual/hologram'\r\nimport { aurora } from './effects/visual/aurora'\r\nimport { matrix } from './effects/visual/matrix'\r\nimport { rainbow } from './effects/visual/rainbow'\r\nimport { parallax } from './effects/motion/parallax'\r\nimport { float } from './effects/motion/float'\r\nimport { flip3d } from './effects/motion/flip3d'\r\nimport { swing } from './effects/motion/swing'\r\nimport { orbit } from './effects/motion/orbit'\r\nimport { reveal } from './effects/scroll/reveal'\r\nimport { counter } from './effects/scroll/counter'\r\nimport { confetti } from './effects/celebration/confetti'\r\nimport { sparkle } from './effects/celebration/sparkle'\r\nimport { firework } from './effects/celebration/firework'\r\nimport { celebrate } from './effects/celebration/celebrate'\r\nimport { typewriter } from './effects/text/typewriter'\r\nimport { scramble } from './effects/text/scramble'\r\nimport { wave } from './effects/text/wave'\r\nimport { highlight } from './effects/text/highlight'\r\n\r\n// ============================================================================\r\n// MAIN SPARK OBJECT\r\n// ============================================================================\r\n\r\n/**\r\n * Main spark object with all effects\r\n * \r\n * @example\r\n * ```typescript\r\n * import { spark } from 'sparkfx'\r\n * \r\n * // Single effect\r\n * element.classList.add(spark.bounce().className)\r\n * \r\n * // Combined effects\r\n * const fx = spark.combine([spark.glow(), spark.bounce()])\r\n * element.classList.add(...fx.className.split(' '))\r\n * ```\r\n */\r\nexport const spark = {\r\n // Basic Effects\r\n bounce,\r\n pulse,\r\n lift,\r\n scale,\r\n shake,\r\n fade,\r\n slide,\r\n rotate,\r\n\r\n // Premium Effects\r\n glow,\r\n ripple,\r\n magnetic,\r\n tilt,\r\n elastic,\r\n jelly,\r\n rubber,\r\n morph,\r\n\r\n // Visual Effects\r\n glitch,\r\n blur,\r\n neon,\r\n glass,\r\n shimmer,\r\n gradient,\r\n spotlight,\r\n hologram,\r\n aurora,\r\n matrix,\r\n rainbow,\r\n\r\n // Motion Effects (v1.2.0)\r\n parallax,\r\n float,\r\n flip3d,\r\n swing,\r\n orbit,\r\n\r\n // Scroll Effects (v1.2.0)\r\n reveal,\r\n counter,\r\n\r\n // Celebration Effects\r\n confetti,\r\n sparkle,\r\n firework,\r\n celebrate,\r\n\r\n // Text Effects\r\n typewriter,\r\n scramble,\r\n wave,\r\n highlight,\r\n} as const\r\n\r\nexport default spark\r\n"]}