sparkfx 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # sparkfx
2
2
 
3
- Micro-interactions for modern web apps.
3
+ Micro-interactions for the modern web. 32+ effects, zero dependencies.
4
4
 
5
5
  ```bash
6
6
  npm install sparkfx
@@ -12,7 +12,7 @@ npm install sparkfx
12
12
  import { spark } from 'sparkfx'
13
13
 
14
14
  const fx = spark.bounce()
15
- element.className = fx.className
15
+ element.classList.add(fx.className)
16
16
  ```
17
17
 
18
18
  ### React
@@ -25,14 +25,34 @@ function Button() {
25
25
  const ref = useRef(null)
26
26
 
27
27
  useEffect(() => {
28
- const fx = spark.bounce()
28
+ const fx = spark.glow({ color: '#00ffa3' })
29
29
  ref.current.classList.add(fx.className)
30
30
  }, [])
31
31
 
32
- return <button ref={ref}>Click</button>
32
+ return <button ref={ref}>Click me</button>
33
33
  }
34
34
  ```
35
35
 
36
+ ### Vue
37
+
38
+ ```vue
39
+ <script setup>
40
+ import { onMounted, ref } from 'vue'
41
+ import { spark } from 'sparkfx'
42
+
43
+ const btn = ref(null)
44
+
45
+ onMounted(() => {
46
+ const fx = spark.elastic()
47
+ btn.value.classList.add(fx.className)
48
+ })
49
+ </script>
50
+
51
+ <template>
52
+ <button ref="btn">Click</button>
53
+ </template>
54
+ ```
55
+
36
56
  ## Effects
37
57
 
38
58
  **Basic:** bounce, pulse, lift, scale, shake, fade, slide, rotate
@@ -48,11 +68,26 @@ function Button() {
48
68
  ## Options
49
69
 
50
70
  ```js
51
- spark.glow({ color: '#00ffa3', spread: 20 })
71
+ spark.glow({ color: '#00ffa3', spread: 20, duration: 300 })
52
72
  spark.tilt({ angle: 15, glare: true })
53
- spark.bounce({ duration: 300, intensity: 1.2 })
73
+ spark.confetti({ colors: ['#ff0', '#0ff', '#f0f'], particleCount: 50 })
74
+ ```
75
+
76
+ ## Framework Support
77
+
78
+ Works with React, Vue, Svelte, Next.js, or plain JavaScript.
79
+
80
+ ```js
81
+ // React
82
+ import { useSpark } from 'sparkfx/react'
83
+
84
+ // Vue
85
+ import { useSpark } from 'sparkfx/vue'
86
+
87
+ // Next.js
88
+ import { useSpark } from 'sparkfx/next'
54
89
  ```
55
90
 
56
91
  ## License
57
92
 
58
- MIT
93
+ MIT - [mrLynchs](https://github.com/mrLynchs)
@@ -1,3 +1,3 @@
1
- 'use strict';var chunkNQYL46S7_cjs=require('./chunk-NQYL46S7.cjs'),react=require('react');/* sparkfx - Premium micro-interactions */
2
- function k(l,c){let n=react.useRef(null);return react.useEffect(()=>{if(!n.current)return;let i=chunkNQYL46S7_cjs.J[l];if(typeof i!="function")return;let s=i(c),a=n.current;if(s.className){let t=s.className.split(" ");a.classList.add(...t);}s.style&&Object.entries(s.style).forEach(([t,r])=>{a.style.setProperty(t,String(r));});let u=[],e=(t,r)=>{if(!r)return;let o=t.replace(/^on/,"").toLowerCase();a.addEventListener(o,r),u.push(()=>a.removeEventListener(o,r));};return e("mouseenter",s.onMouseEnter),e("mouseleave",s.onMouseLeave),e("mousemove",s.onMouseMove),e("click",s.onClick),e("focus",s.onFocus),e("blur",s.onBlur),()=>{u.forEach(t=>t()),s.destroy&&s.destroy(),s.className&&a.classList.remove(...s.className.split(" "));}},[l,JSON.stringify(c)]),n}function L(l){let c=react.useRef(null);return react.useEffect(()=>{if(!c.current)return;let n=c.current,i=[];return l.forEach(({name:s,options:a})=>{let u=chunkNQYL46S7_cjs.J[s];if(typeof u!="function")return;let e=u(a);e.className&&n.classList.add(...e.className.split(" ")),e.style&&Object.entries(e.style).forEach(([r,o])=>{n.style.setProperty(r,String(o));});let t=(r,o)=>{if(!o)return;let m=r.replace(/^on/,"").toLowerCase();n.addEventListener(m,o),i.push(()=>n.removeEventListener(m,o));};t("mouseenter",e.onMouseEnter),t("mouseleave",e.onMouseLeave),t("mousemove",e.onMouseMove),t("click",e.onClick),i.push(()=>{e.destroy&&e.destroy(),e.className&&n.classList.remove(...e.className.split(" "));});}),()=>i.forEach(s=>s())},[JSON.stringify(l)]),c}exports.a=k;exports.b=L;//# sourceMappingURL=chunk-C4LYGYFT.cjs.map
3
- //# sourceMappingURL=chunk-C4LYGYFT.cjs.map
1
+ 'use strict';var chunkDHAA5SS3_cjs=require('./chunk-DHAA5SS3.cjs'),react=require('react');/* sparkfx - Premium micro-interactions */
2
+ function k(l,c){let n=react.useRef(null);return react.useEffect(()=>{if(!n.current)return;let i=chunkDHAA5SS3_cjs.I[l];if(typeof i!="function")return;let s=i(c),a=n.current;if(s.className){let t=s.className.split(" ");a.classList.add(...t);}s.style&&Object.entries(s.style).forEach(([t,r])=>{a.style.setProperty(t,String(r));});let u=[],e=(t,r)=>{if(!r)return;let o=t.replace(/^on/,"").toLowerCase();a.addEventListener(o,r),u.push(()=>a.removeEventListener(o,r));};return e("mouseenter",s.onMouseEnter),e("mouseleave",s.onMouseLeave),e("mousemove",s.onMouseMove),e("click",s.onClick),e("focus",s.onFocus),e("blur",s.onBlur),()=>{u.forEach(t=>t()),s.destroy&&s.destroy(),s.className&&a.classList.remove(...s.className.split(" "));}},[l,JSON.stringify(c)]),n}function L(l){let c=react.useRef(null);return react.useEffect(()=>{if(!c.current)return;let n=c.current,i=[];return l.forEach(({name:s,options:a})=>{let u=chunkDHAA5SS3_cjs.I[s];if(typeof u!="function")return;let e=u(a);e.className&&n.classList.add(...e.className.split(" ")),e.style&&Object.entries(e.style).forEach(([r,o])=>{n.style.setProperty(r,String(o));});let t=(r,o)=>{if(!o)return;let m=r.replace(/^on/,"").toLowerCase();n.addEventListener(m,o),i.push(()=>n.removeEventListener(m,o));};t("mouseenter",e.onMouseEnter),t("mouseleave",e.onMouseLeave),t("mousemove",e.onMouseMove),t("click",e.onClick),i.push(()=>{e.destroy&&e.destroy(),e.className&&n.classList.remove(...e.className.split(" "));});}),()=>i.forEach(s=>s())},[JSON.stringify(l)]),c}exports.a=k;exports.b=L;//# sourceMappingURL=chunk-5ZKFIK7W.cjs.map
3
+ //# sourceMappingURL=chunk-5ZKFIK7W.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":["useSpark","effectName","options","ref","useRef","useEffect","effectFn","spark","result","element","classes","key","value","cleanups","addEvent","name","handler","eventName","c","useSparkMultiple","effects","allCleanups","n","h","ev"],"mappings":"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","file":"chunk-C4LYGYFT.cjs","sourcesContent":["/**\r\n * sparkfx - React Adapter\r\n * Hooks and components for React integration\r\n */\r\n\r\nimport { useEffect, useRef, useMemo } from 'react'\r\nimport { spark } from '../index'\r\nimport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\nimport clsx from 'clsx'\r\n\r\n/**\r\n * Hook to apply a single spark effect to a ref\r\n * @param effectName Name of the effect to apply\r\n * @param options Effect options\r\n * @returns React ref to attach to the target element\r\n */\r\nexport function useSpark<T extends HTMLElement = HTMLElement>(\r\n effectName: SparkEffectName,\r\n options?: SparkBaseOptions\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n\r\n // Apply the effect\r\n const effectFn = (spark as any)[effectName]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n const element = ref.current\r\n\r\n // Apply class\r\n if (result.className) {\r\n const classes = result.className.split(' ')\r\n element.classList.add(...classes)\r\n }\r\n\r\n // Apply styles\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Apply events\r\n const cleanups: (() => void)[] = []\r\n\r\n const addEvent = (name: string, handler?: (e: any) => void) => {\r\n if (!handler) return\r\n const eventName = name.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(eventName, handler)\r\n cleanups.push(() => element.removeEventListener(eventName, handler))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n addEvent('focus', result.onFocus)\r\n addEvent('blur', result.onBlur)\r\n\r\n return () => {\r\n cleanups.forEach(c => c())\r\n if (result.destroy) result.destroy()\r\n if (result.className) {\r\n element.classList.remove(...result.className.split(' '))\r\n }\r\n }\r\n }, [effectName, JSON.stringify(options)])\r\n\r\n return ref\r\n}\r\n\r\n/**\r\n * Hook for multiple effects\r\n */\r\nexport function useSparkMultiple<T extends HTMLElement = HTMLElement>(\r\n effects: { name: SparkEffectName; options?: SparkBaseOptions }[]\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n const element = ref.current\r\n const allCleanups: (() => void)[] = []\r\n\r\n effects.forEach(({ name, options }) => {\r\n const effectFn = (spark as any)[name]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n\r\n if (result.className) {\r\n element.classList.add(...result.className.split(' '))\r\n }\r\n\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n const addEvent = (n: string, h?: (e: any) => void) => {\r\n if (!h) return\r\n const ev = n.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(ev, h)\r\n allCleanups.push(() => element.removeEventListener(ev, h))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n\r\n allCleanups.push(() => {\r\n if (result.destroy) result.destroy()\r\n if (result.className) element.classList.remove(...result.className.split(' '))\r\n })\r\n })\r\n\r\n return () => allCleanups.forEach(c => c())\r\n }, [JSON.stringify(effects)])\r\n\r\n return ref\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":["useSpark","effectName","options","ref","useRef","useEffect","effectFn","spark","result","element","classes","key","value","cleanups","addEvent","name","handler","eventName","c","useSparkMultiple","effects","allCleanups","n","h","ev"],"mappings":"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","file":"chunk-5ZKFIK7W.cjs","sourcesContent":["/**\r\n * sparkfx - React Adapter\r\n * Hooks and components for React integration\r\n */\r\n\r\nimport { useEffect, useRef, useMemo } from 'react'\r\nimport { spark } from '../index'\r\nimport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\nimport clsx from 'clsx'\r\n\r\n/**\r\n * Hook to apply a single spark effect to a ref\r\n * @param effectName Name of the effect to apply\r\n * @param options Effect options\r\n * @returns React ref to attach to the target element\r\n */\r\nexport function useSpark<T extends HTMLElement = HTMLElement>(\r\n effectName: SparkEffectName,\r\n options?: SparkBaseOptions\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n\r\n // Apply the effect\r\n const effectFn = (spark as any)[effectName]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n const element = ref.current\r\n\r\n // Apply class\r\n if (result.className) {\r\n const classes = result.className.split(' ')\r\n element.classList.add(...classes)\r\n }\r\n\r\n // Apply styles\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Apply events\r\n const cleanups: (() => void)[] = []\r\n\r\n const addEvent = (name: string, handler?: (e: any) => void) => {\r\n if (!handler) return\r\n const eventName = name.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(eventName, handler)\r\n cleanups.push(() => element.removeEventListener(eventName, handler))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n addEvent('focus', result.onFocus)\r\n addEvent('blur', result.onBlur)\r\n\r\n return () => {\r\n cleanups.forEach(c => c())\r\n if (result.destroy) result.destroy()\r\n if (result.className) {\r\n element.classList.remove(...result.className.split(' '))\r\n }\r\n }\r\n }, [effectName, JSON.stringify(options)])\r\n\r\n return ref\r\n}\r\n\r\n/**\r\n * Hook for multiple effects\r\n */\r\nexport function useSparkMultiple<T extends HTMLElement = HTMLElement>(\r\n effects: { name: SparkEffectName; options?: SparkBaseOptions }[]\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n const element = ref.current\r\n const allCleanups: (() => void)[] = []\r\n\r\n effects.forEach(({ name, options }) => {\r\n const effectFn = (spark as any)[name]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n\r\n if (result.className) {\r\n element.classList.add(...result.className.split(' '))\r\n }\r\n\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n const addEvent = (n: string, h?: (e: any) => void) => {\r\n if (!h) return\r\n const ev = n.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(ev, h)\r\n allCleanups.push(() => element.removeEventListener(ev, h))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n\r\n allCleanups.push(() => {\r\n if (result.destroy) result.destroy()\r\n if (result.className) element.classList.remove(...result.className.split(' '))\r\n })\r\n })\r\n\r\n return () => allCleanups.forEach(c => c())\r\n }, [JSON.stringify(effects)])\r\n\r\n return ref\r\n}\r\n"]}
@@ -0,0 +1,435 @@
1
+ import fe from'clsx';/* sparkfx - Premium micro-interactions */
2
+ var re="sparkfx-styles",ee=false,te=new Set,oe=`
3
+ /* @lynch/spark base styles */
4
+ .spark-effect {
5
+ transition-property: transform, box-shadow, filter, opacity;
6
+ transition-timing-function: var(--spark-easing, ease-out);
7
+ transition-duration: var(--spark-duration, 300ms);
8
+ will-change: transform;
9
+ }
10
+
11
+ .spark-reduced-motion {
12
+ transition: none !important;
13
+ animation: none !important;
14
+ }
15
+
16
+ /* Ripple container */
17
+ .spark-ripple-container {
18
+ position: relative;
19
+ overflow: hidden;
20
+ }
21
+
22
+ .spark-ripple {
23
+ position: absolute;
24
+ border-radius: 50%;
25
+ transform: scale(0);
26
+ animation: spark-ripple-animation 0.6s linear;
27
+ pointer-events: none;
28
+ }
29
+
30
+ @keyframes spark-ripple-animation {
31
+ to {
32
+ transform: scale(4);
33
+ opacity: 0;
34
+ }
35
+ }
36
+
37
+ /* Confetti */
38
+ .spark-confetti-container {
39
+ position: fixed;
40
+ top: 0;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ pointer-events: none;
45
+ z-index: 9999;
46
+ overflow: hidden;
47
+ }
48
+
49
+ .spark-confetti-particle {
50
+ position: absolute;
51
+ width: 10px;
52
+ height: 10px;
53
+ animation: spark-confetti-fall var(--spark-duration, 3s) ease-out forwards;
54
+ }
55
+
56
+ @keyframes spark-confetti-fall {
57
+ 0% {
58
+ transform: translateY(0) rotate(0deg);
59
+ opacity: 1;
60
+ }
61
+ 100% {
62
+ transform: translateY(100vh) rotate(720deg);
63
+ opacity: 0;
64
+ }
65
+ }
66
+
67
+ /* Shimmer */
68
+ .spark-shimmer {
69
+ position: relative;
70
+ overflow: hidden;
71
+ }
72
+
73
+ .spark-shimmer::after {
74
+ content: '';
75
+ position: absolute;
76
+ top: 0;
77
+ left: -100%;
78
+ width: 100%;
79
+ height: 100%;
80
+ background: linear-gradient(
81
+ 90deg,
82
+ transparent,
83
+ rgba(255, 255, 255, 0.3),
84
+ transparent
85
+ );
86
+ animation: spark-shimmer-move var(--spark-duration, 1.5s) infinite;
87
+ }
88
+
89
+ @keyframes spark-shimmer-move {
90
+ to {
91
+ left: 100%;
92
+ }
93
+ }
94
+
95
+ /* Glitch */
96
+ .spark-glitch {
97
+ position: relative;
98
+ }
99
+
100
+ .spark-glitch::before,
101
+ .spark-glitch::after {
102
+ content: attr(data-text);
103
+ position: absolute;
104
+ top: 0;
105
+ left: 0;
106
+ width: 100%;
107
+ height: 100%;
108
+ opacity: 0;
109
+ }
110
+
111
+ .spark-glitch:hover::before,
112
+ .spark-glitch:hover::after {
113
+ opacity: 0.8;
114
+ }
115
+
116
+ .spark-glitch:hover::before {
117
+ color: var(--spark-glitch-color1, #ff0000);
118
+ animation: spark-glitch-1 0.3s infinite;
119
+ }
120
+
121
+ .spark-glitch:hover::after {
122
+ color: var(--spark-glitch-color2, #00ffff);
123
+ animation: spark-glitch-2 0.3s infinite;
124
+ }
125
+
126
+ @keyframes spark-glitch-1 {
127
+ 0%, 100% { clip-path: inset(0 0 90% 0); transform: translateX(-2px); }
128
+ 25% { clip-path: inset(10% 0 60% 0); transform: translateX(2px); }
129
+ 50% { clip-path: inset(40% 0 30% 0); transform: translateX(-2px); }
130
+ 75% { clip-path: inset(70% 0 10% 0); transform: translateX(2px); }
131
+ }
132
+
133
+ @keyframes spark-glitch-2 {
134
+ 0%, 100% { clip-path: inset(80% 0 0 0); transform: translateX(2px); }
135
+ 25% { clip-path: inset(50% 0 20% 0); transform: translateX(-2px); }
136
+ 50% { clip-path: inset(20% 0 50% 0); transform: translateX(2px); }
137
+ 75% { clip-path: inset(0 0 70% 0); transform: translateX(-2px); }
138
+ }
139
+
140
+ /* Neon glow */
141
+ .spark-neon {
142
+ text-shadow:
143
+ 0 0 5px var(--spark-neon-color, #fff),
144
+ 0 0 10px var(--spark-neon-color, #fff),
145
+ 0 0 20px var(--spark-neon-color, #fff),
146
+ 0 0 40px var(--spark-neon-color, #0ff),
147
+ 0 0 80px var(--spark-neon-color, #0ff);
148
+ }
149
+
150
+ /* Hologram */
151
+ .spark-hologram {
152
+ background: linear-gradient(
153
+ 45deg,
154
+ rgba(255, 0, 128, 0.3),
155
+ rgba(0, 255, 255, 0.3),
156
+ rgba(255, 255, 0, 0.3)
157
+ );
158
+ background-size: 400% 400%;
159
+ animation: spark-hologram-shift 3s ease infinite;
160
+ -webkit-background-clip: text;
161
+ background-clip: text;
162
+ }
163
+
164
+ @keyframes spark-hologram-shift {
165
+ 0% { background-position: 0% 50%; }
166
+ 50% { background-position: 100% 50%; }
167
+ 100% { background-position: 0% 50%; }
168
+ }
169
+
170
+ /* Glass */
171
+ .spark-glass {
172
+ backdrop-filter: blur(10px);
173
+ background: rgba(255, 255, 255, 0.1);
174
+ border: 1px solid rgba(255, 255, 255, 0.2);
175
+ }
176
+
177
+ /* Typewriter cursor */
178
+ .spark-typewriter-cursor {
179
+ animation: spark-cursor-blink 0.7s infinite;
180
+ }
181
+
182
+ @keyframes spark-cursor-blink {
183
+ 0%, 100% { opacity: 1; }
184
+ 50% { opacity: 0; }
185
+ }
186
+ `;function i(){if(typeof document>"u"||ee)return;let t=document.createElement("style");t.id=re,t.textContent=oe,document.head.appendChild(t),ee=true;}function x(t,e){if(typeof document>"u"||te.has(t))return;i();let r=document.getElementById(re);r&&(r.textContent+=`
187
+ @keyframes ${t} { ${e} }`,te.add(t));}function l(t){let e={};return t.duration!==void 0&&(e["--spark-duration"]=`${t.duration}ms`),t.easing!==void 0&&(e["--spark-easing"]=ie(t.easing)),t.intensity!==void 0&&(e["--spark-intensity"]=String(t.intensity)),e}function ie(t){return {linear:"linear",ease:"ease","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out",spring:"cubic-bezier(0.175, 0.885, 0.32, 1.275)",bounce:"cubic-bezier(0.68, -0.55, 0.265, 1.55)",elastic:"cubic-bezier(0.68, -0.6, 0.32, 1.6)"}[t]??t}function b(){return typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches}var O=i;var pe=b,ce={duration:300,intensity:1,trigger:"hover",easing:"ease-out",delay:0,reduceMotion:true};function p(t,e){return {...ce,...e,...t}}function c(t){return !(t.reduceMotion!==false&&pe())}function d(t,e){return t*e}var le=0;function se(){return `sparkfx-${++le}-${Date.now()}`}function y(t,e){return Math.random()*(e-t)+t}function ae(t){return t[Math.floor(Math.random()*t.length)]}var me={duration:400,bounces:1,trigger:"hover",intensity:1};function M(t){let e=p(t,me);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(20,e.intensity),n=`sparkfx-bounce-${e.bounces}-${Math.round(r)}`,s="0%, 100% { transform: translateY(0); }",a=100/(e.bounces*2);for(let f=0;f<e.bounces;f++){let m=a*(f*2+1),u=r*Math.pow(.6,f);s+=` ${m}% { transform: translateY(-${u}px); }`;}x(n,s);let o=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-bounce"),style:{...o,"--sparkfx-animation-name":n},onMouseEnter:(void 0)}}var de={duration:1e3,count:-1,scale:1.05,trigger:"always",intensity:1};function R(t){let e=p(t,de);i();let r=1+(e.scale-1)*e.intensity,n=`sparkfx-pulse-${r.toString().replace(".","_")}`;if(x(n,`
188
+ 0%, 100% { transform: scale(1); opacity: 1; }
189
+ 50% { transform: scale(${r}); opacity: 0.8; }
190
+ `),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let s=l({duration:e.duration,easing:e.easing}),a=e.count===-1?"infinite":e.count;return {className:fe("sparkfx-effect","sparkfx-pulse"),style:{...s,animation:`${n} ${e.duration}ms ${e.easing} ${a}`}}}var ke={duration:200,distance:8,shadow:true,trigger:"hover",intensity:1};function T(t){let e=p(t,ke);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(e.distance,e.intensity),n=l({duration:e.duration,easing:e.easing}),s=e.shadow?`0 ${r*2}px ${r*3}px rgba(0, 0, 0, 0.15)`:"none";return {className:fe("sparkfx-effect","sparkfx-lift"),style:{...n,"--sparkfx-lift-distance":`-${r}px`,"--sparkfx-lift-shadow":s,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing), box-shadow var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{let o=a.currentTarget;e.trigger==="hover"&&(o.style.transform=`translateY(-${r}px)`,e.shadow&&(o.style.boxShadow=s));},onMouseLeave:a=>{let o=a.currentTarget;e.trigger==="hover"&&(o.style.transform="translateY(0)",o.style.boxShadow="none");}}}var ye={duration:200,scale:1.1,trigger:"hover",intensity:1};function w(t){let e=p(t,ye);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=1+(e.scale-1)*e.intensity,n=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-scale"),style:{...n,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:s=>{if(e.trigger==="hover"){let a=s.currentTarget;a.style.transform=`scale(${r})`;}},onMouseLeave:s=>{if(e.trigger==="hover"){let a=s.currentTarget;a.style.transform="scale(1)";}}}}var Se={duration:500,distance:5,count:3,trigger:"click",intensity:1};function B(t){let e=p(t,Se);i();let r=d(e.distance,e.intensity),n=`sparkfx-shake-${r}`;if(x(n,`
191
+ 0%, 100% { transform: translateX(0); }
192
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-${r}px); }
193
+ 20%, 40%, 60%, 80% { transform: translateX(${r}px); }
194
+ `),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let s=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-shake"),style:s,onClick:a=>{if(e.trigger==="click"){let o=a.currentTarget;o.style.animation=`${n} ${e.duration}ms ${e.easing}`,setTimeout(()=>{o.style.animation="";},e.duration);}}}}var Oe={duration:200,opacity:.6,trigger:"hover",intensity:1};function E(t){let e=p(t,Oe);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=e.opacity,n=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-fade"),style:{...n,transition:"opacity var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:s=>{if(e.trigger==="hover"){let a=s.currentTarget;a.style.opacity=String(r);}},onMouseLeave:s=>{if(e.trigger==="hover"){let a=s.currentTarget;a.style.opacity="1";}}}}var Me={duration:200,direction:"up",distance:10,trigger:"hover",intensity:1};function C(t){let e=p(t,Me);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(e.distance,e.intensity),n=l({duration:e.duration,easing:e.easing}),s=()=>{switch(e.direction){case "up":return `translateY(-${r}px)`;case "down":return `translateY(${r}px)`;case "left":return `translateX(-${r}px)`;case "right":return `translateX(${r}px)`;default:return `translateY(-${r}px)`}};return {className:fe("sparkfx-effect","sparkfx-slide"),style:{...n,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.transform=s();}},onMouseLeave:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.transform="translate(0)";}}}}var Te={duration:200,angle:5,direction:"clockwise",trigger:"hover",intensity:1};function $(t){let e=p(t,Te);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(e.angle,e.intensity),n=e.direction==="counterclockwise"?-1:1,s=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-rotate"),style:{...s,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.transform=`rotate(${r*n}deg)`;}},onMouseLeave:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.transform="rotate(0)";}}}}var Be={duration:300,color:"#00ffa3",spread:20,trigger:"hover",intensity:1};function N(t){let e=p(t,Be);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(e.spread,e.intensity),n=l({duration:e.duration,easing:e.easing}),s=`
195
+ 0 0 ${r/2}px ${e.color},
196
+ 0 0 ${r}px ${e.color},
197
+ 0 0 ${r*1.5}px ${e.color}
198
+ `;return {className:fe("sparkfx-effect","sparkfx-glow"),style:{...n,transition:"box-shadow var(--sparkfx-duration) var(--sparkfx-easing), filter var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.boxShadow=s,o.style.filter="brightness(1.1)";}},onMouseLeave:a=>{if(e.trigger==="hover"){let o=a.currentTarget;o.style.boxShadow="none",o.style.filter="brightness(1)";}}}}var Ee={duration:600,color:"rgba(255, 255, 255, 0.3)",trigger:"click"};function L(t){let e=p(t,Ee);return i(),c(e)?{className:"spark-effect spark-ripple-container",style:l({duration:e.duration}),onClick:s=>{let a=s.currentTarget,o=a.getBoundingClientRect(),f=Math.max(o.width,o.height)*2,m=document.createElement("span");m.className="spark-ripple",m.style.cssText=`
199
+ width: ${f}px;
200
+ height: ${f}px;
201
+ left: ${s.clientX-o.left-f/2}px;
202
+ top: ${s.clientY-o.top-f/2}px;
203
+ background: ${e.color};
204
+ `,getComputedStyle(a).position==="static"&&(a.style.position="relative"),a.style.overflow="hidden",a.appendChild(m),setTimeout(()=>{m.remove();},e.duration);}}:{className:"spark-effect spark-reduced-motion"}}var $e={strength:.5,distance:100,trigger:"move"};function j(t){let e=p(t,$e);return O(),{className:fe("sparkfx-effect","sparkfx-magnetic"),onMouseMove:r=>{if(e.trigger==="move"){let n=r.currentTarget,s=n.getBoundingClientRect(),a=s.left+s.width/2,o=s.top+s.height/2,f=r.clientX-a,m=r.clientY-o;if(Math.sqrt(f*f+m*m)<e.distance){let k=f*e.strength,g=m*e.strength;n.style.transform=`translate(${k}px, ${g}px)`;}else n.style.transform="translate(0, 0)";}},onMouseLeave:r=>{let n=r.currentTarget;n.style.transform="translate(0, 0)";}}}var Le={angle:15,glare:true,perspective:1e3,trigger:"move"};function H(t){let e=p(t,Le);return O(),{className:fe("sparkfx-effect","sparkfx-tilt"),onMouseMove:r=>{if(e.trigger==="move"){let n=r.currentTarget,s=n.getBoundingClientRect(),a=r.clientX-s.left,o=r.clientY-s.top,f=s.width/2,m=s.height/2,u=(a-f)/f*e.angle,k=(m-o)/m*e.angle;n.style.transform=`perspective(${e.perspective}px) rotateX(${k}deg) rotateY(${u}deg)`;}},onMouseLeave:r=>{let n=r.currentTarget;n.style.transform=`perspective(${e.perspective}px) rotateX(0deg) rotateY(0deg)`;}}}var He={trigger:"hover",duration:600,scale:1.15,bounces:3};function Ve(){if(document.getElementById("sparkfx-elastic-styles"))return;let t=document.createElement("style");t.id="sparkfx-elastic-styles",t.textContent=`
205
+ .sparkfx-elastic {
206
+ transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
207
+ }
208
+
209
+ .sparkfx-elastic-active {
210
+ animation: sparkfx-elastic-bounce 0.6s ease-out;
211
+ }
212
+
213
+ @keyframes sparkfx-elastic-bounce {
214
+ 0% { transform: scale(1); }
215
+ 20% { transform: scale(var(--elastic-scale, 1.15)); }
216
+ 40% { transform: scale(0.95); }
217
+ 60% { transform: scale(1.05); }
218
+ 80% { transform: scale(0.98); }
219
+ 100% { transform: scale(1); }
220
+ }
221
+ `,document.head.appendChild(t);}function V(t){let e=p(t,He);if(i(),Ve(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=n=>{let s=n.currentTarget;s.style.setProperty("--elastic-scale",String(e.scale)),s.classList.remove("sparkfx-elastic-active"),s.offsetWidth,s.classList.add("sparkfx-elastic-active");};return {className:fe("sparkfx-effect","sparkfx-elastic"),style:l(e),onMouseEnter:e.trigger==="hover"?r:void 0,onClick:e.trigger==="click"?r:void 0}}var Ae={trigger:"hover",duration:500,intensity:1};function qe(){if(document.getElementById("sparkfx-jelly-styles"))return;let t=document.createElement("style");t.id="sparkfx-jelly-styles",t.textContent=`
222
+ .sparkfx-jelly {
223
+ transition: transform 0.1s ease-out;
224
+ }
225
+
226
+ .sparkfx-jelly-active {
227
+ animation: sparkfx-jelly-wobble 0.5s ease-out;
228
+ }
229
+
230
+ @keyframes sparkfx-jelly-wobble {
231
+ 0% { transform: scale(1, 1); }
232
+ 15% { transform: scale(1.1, 0.9); }
233
+ 30% { transform: scale(0.9, 1.1); }
234
+ 45% { transform: scale(1.05, 0.95); }
235
+ 60% { transform: scale(0.97, 1.03); }
236
+ 75% { transform: scale(1.02, 0.98); }
237
+ 100% { transform: scale(1, 1); }
238
+ }
239
+ `,document.head.appendChild(t);}function P(t){let e=p(t,Ae);if(i(),qe(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=n=>{let s=n.currentTarget;s.classList.remove("sparkfx-jelly-active"),s.offsetWidth,s.classList.add("sparkfx-jelly-active");};return {className:fe("sparkfx-effect","sparkfx-jelly"),style:l(e),onMouseEnter:e.trigger==="hover"?r:void 0,onClick:e.trigger==="click"?r:void 0}}function A(t){let e=p(t,{trigger:"click"});return i(),c(e)?{className:fe("sparkfx-effect","sparkfx-rubber"),style:l(e)}:{className:"sparkfx-effect"}}function q(t){let e=p(t,{trigger:"hover"});return i(),c(e)?{className:fe("sparkfx-effect","sparkfx-morph"),style:l(e)}:{className:"sparkfx-effect"}}var Ge={duration:300,color1:"#ff0055",color2:"#00d4ff",trigger:"hover",intensity:1};function I(t){let e=p(t,Ge);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-glitch"),style:{...r,"--sparkfx-glitch-color1":e.color1,"--sparkfx-glitch-color2":e.color2,position:"relative"}}}var Fe={trigger:"hover",duration:300,amount:8,scale:1.02};function Y(t){let e=p(t,Fe);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r={...l(e),transition:"filter var(--sparkfx-duration) var(--sparkfx-easing), transform var(--sparkfx-duration) var(--sparkfx-easing)",filter:`blur(${e.amount}px)`,transform:"scale(0.98)"},n=a=>{let o=a.currentTarget;o.style.filter="blur(0)",o.style.transform=`scale(${e.scale})`;},s=a=>{let o=a.currentTarget;o.style.filter=`blur(${e.amount}px)`,o.style.transform="scale(0.98)";};return {className:fe("sparkfx-effect","sparkfx-blur"),style:r,onMouseEnter:e.trigger==="hover"?n:void 0,onMouseLeave:e.trigger==="hover"?s:void 0}}var _e={duration:300,color:"#00d4ff",spread:20,trigger:"hover",intensity:1};function X(t){let e=p(t,_e);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=d(e.spread,e.intensity),n=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-neon"),style:{...n,"--sparkfx-neon-color":e.color,"--sparkfx-neon-spread":`${r}px`}}}var De={duration:300,trigger:"always"};function G(t){let e=p(t,De);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=l({duration:e.duration,easing:e.easing});return {className:fe("sparkfx-effect","sparkfx-glass"),style:{...r}}}var Qe={duration:1500,trigger:"always"};function z(t){let e=p(t,Qe);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=l({duration:e.duration,easing:"linear"});return {className:fe("sparkfx-effect","sparkfx-shimmer"),style:{...r}}}var Ze={trigger:"always",duration:3e3,colors:["#ff0080","#7928ca","#0070f3","#00d4ff"],speed:3,angle:45};function et(){if(document.getElementById("sparkfx-gradient-styles"))return;let t=document.createElement("style");t.id="sparkfx-gradient-styles",t.textContent=`
240
+ .sparkfx-gradient {
241
+ background-size: 300% 300%;
242
+ animation: sparkfx-gradient-shift var(--gradient-speed, 3s) ease infinite;
243
+ }
244
+
245
+ @keyframes sparkfx-gradient-shift {
246
+ 0% { background-position: 0% 50%; }
247
+ 50% { background-position: 100% 50%; }
248
+ 100% { background-position: 0% 50%; }
249
+ }
250
+ `,document.head.appendChild(t);}function F(t){let e=p(t,Ze);if(i(),et(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=`linear-gradient(${e.angle}deg, ${e.colors.join(", ")})`;return {className:fe("sparkfx-effect","sparkfx-gradient"),style:{...l(e),background:r,"--gradient-speed":`${e.speed}s`,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text"}}}function W(t){let e=p(t,{trigger:"hover"});return i(),c(e)?{className:fe("sparkfx-effect","sparkfx-spotlight"),onMouseMove:r=>{let n=r.currentTarget,s=n.getBoundingClientRect(),a=r.clientX-s.left,o=r.clientY-s.top;n.style.setProperty("--sparkfx-spotlight-x",`${a}px`),n.style.setProperty("--sparkfx-spotlight-y",`${o}px`);}}:{className:"sparkfx-effect"}}var st={trigger:"hover",duration:300,intensity:1,scanlineOpacity:.1};function at(){if(document.getElementById("sparkfx-hologram-styles"))return;let t=document.createElement("style");t.id="sparkfx-hologram-styles",t.textContent=`
251
+ @keyframes sparkfx-hologram-flicker {
252
+ 0%, 100% { opacity: 1; }
253
+ 50% { opacity: 0.95; }
254
+ 25%, 75% { opacity: 0.98; }
255
+ }
256
+
257
+ @keyframes sparkfx-hologram-scanline {
258
+ 0% { transform: translateY(-100%); }
259
+ 100% { transform: translateY(100%); }
260
+ }
261
+
262
+ .sparkfx-hologram {
263
+ position: relative;
264
+ overflow: hidden;
265
+ }
266
+
267
+ .sparkfx-hologram::before {
268
+ content: '';
269
+ position: absolute;
270
+ inset: 0;
271
+ background: repeating-linear-gradient(
272
+ 0deg,
273
+ transparent,
274
+ transparent 2px,
275
+ rgba(0, 255, 255, 0.03) 2px,
276
+ rgba(0, 255, 255, 0.03) 4px
277
+ );
278
+ pointer-events: none;
279
+ z-index: 10;
280
+ }
281
+
282
+ .sparkfx-hologram-active {
283
+ animation: sparkfx-hologram-flicker 0.15s infinite;
284
+ text-shadow:
285
+ 2px 0 rgba(255, 0, 0, 0.5),
286
+ -2px 0 rgba(0, 255, 255, 0.5);
287
+ filter: brightness(1.1) contrast(1.05);
288
+ }
289
+
290
+ .sparkfx-hologram-scanline {
291
+ position: absolute;
292
+ top: 0;
293
+ left: 0;
294
+ right: 0;
295
+ height: 8px;
296
+ background: linear-gradient(
297
+ 180deg,
298
+ transparent,
299
+ rgba(0, 255, 255, 0.15),
300
+ transparent
301
+ );
302
+ pointer-events: none;
303
+ z-index: 11;
304
+ animation: sparkfx-hologram-scanline 2s linear infinite;
305
+ }
306
+ `,document.head.appendChild(t);}function _(t){let e=p(t,st);if(i(),at(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=null,n=a=>{let o=a.currentTarget;o.classList.add("sparkfx-hologram-active"),r||(r=document.createElement("span"),r.className="sparkfx-hologram-scanline",o.appendChild(r));},s=a=>{a.currentTarget.classList.remove("sparkfx-hologram-active"),r&&(r.remove(),r=null);};return {className:fe("sparkfx-effect","sparkfx-hologram"),style:l(e),onMouseEnter:e.trigger==="hover"?n:void 0,onMouseLeave:e.trigger==="hover"?s:void 0}}var ot={duration:2e3,count:30,colors:["#ff0055","#00d4ff","#00ffa3","#ffcc00","#ff00ff"],spread:60,trigger:"click",intensity:1};function h(t){let e=p(t,ot);i();let r=n=>{let s=Math.floor(e.count*e.intensity);for(let a=0;a<s;a++){let o=document.createElement("div"),f=y(5,10),m=ae(e.colors),u=se();o.className=`sparkfx-confetti-particle ${u}`,o.style.cssText=`
307
+ position: absolute;
308
+ width: ${f}px;
309
+ height: ${f}px;
310
+ background: ${m};
311
+ top: 50%;
312
+ left: 50%;
313
+ border-radius: ${y(0,50)}%;
314
+ pointer-events: none;
315
+ z-index: 1000;
316
+ `;let k=y(-e.spread,e.spread)-90,g=y(10,20),v=`sparkfx-confetti-${u}`;x(v,`
317
+ 0% { transform: translate(-50%, -50%) rotate(0deg); opacity: 1; }
318
+ 100% { transform: translate(calc(-50% + ${Math.cos(k*Math.PI/180)*g*10}px), calc(-50% + ${Math.sin(k*Math.PI/180)*g*10}px)) rotate(${y(0,360)}deg); opacity: 0; }
319
+ `),o.style.animation=`${v} ${e.duration}ms ease-out forwards`,n.appendChild(o),setTimeout(()=>o.remove(),e.duration);}};return {className:fe("sparkfx-effect","sparkfx-confetti"),onClick:n=>{e.trigger==="click"&&r(n.currentTarget);}}}var pt={trigger:"hover",duration:600,color:"#ffd700",count:8,spread:40};function ct(t,e,r){let n=document.createElement("span");n.className="sparkfx-sparkle-particle";let s=Math.random()*8+4,a=Math.random()*360,o=Math.random()*r+10,f=Math.cos(a*Math.PI/180)*o,m=Math.sin(a*Math.PI/180)*o;n.style.cssText=`
320
+ position: absolute;
321
+ width: ${s}px;
322
+ height: ${s}px;
323
+ background: ${e};
324
+ border-radius: 50%;
325
+ pointer-events: none;
326
+ left: 50%;
327
+ top: 50%;
328
+ transform: translate(-50%, -50%);
329
+ box-shadow: 0 0 ${s}px ${e}, 0 0 ${s*2}px ${e};
330
+ animation: sparkfx-sparkle-fly 0.6s ease-out forwards;
331
+ --sparkle-x: ${f}px;
332
+ --sparkle-y: ${m}px;
333
+ `,t.appendChild(n),setTimeout(()=>n.remove(),600);}function lt(){if(document.getElementById("sparkfx-sparkle-styles"))return;let t=document.createElement("style");t.id="sparkfx-sparkle-styles",t.textContent=`
334
+ @keyframes sparkfx-sparkle-fly {
335
+ 0% {
336
+ opacity: 1;
337
+ transform: translate(-50%, -50%) scale(0);
338
+ }
339
+ 50% {
340
+ opacity: 1;
341
+ transform: translate(calc(-50% + var(--sparkle-x)), calc(-50% + var(--sparkle-y))) scale(1);
342
+ }
343
+ 100% {
344
+ opacity: 0;
345
+ transform: translate(calc(-50% + var(--sparkle-x) * 1.5), calc(-50% + var(--sparkle-y) * 1.5)) scale(0.5);
346
+ }
347
+ }
348
+
349
+ .sparkfx-sparkle {
350
+ position: relative;
351
+ overflow: visible !important;
352
+ }
353
+ `,document.head.appendChild(t);}function S(t){let e=p(t,pt);if(i(),lt(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=n=>{let s=n.currentTarget;for(let a=0;a<e.count;a++)setTimeout(()=>ct(s,e.color,e.spread),a*50);};return {className:fe("sparkfx-effect","sparkfx-sparkle"),style:l(e),onMouseEnter:e.trigger==="hover"?r:void 0,onClick:e.trigger==="click"?r:void 0}}var mt={trigger:"click",duration:800,colors:["#ff0000","#ffd700","#00ff00","#00bfff","#ff00ff","#ff6600"],particleCount:24,spread:80};function ut(t,e,r,n,s,a){let o=document.createElement("span");o.className="sparkfx-firework-particle";let f=Math.random()*6+3,m=Math.cos(s*Math.PI/180)*a,u=Math.sin(s*Math.PI/180)*a;o.style.cssText=`
354
+ position: absolute;
355
+ width: ${f}px;
356
+ height: ${f}px;
357
+ background: ${n};
358
+ border-radius: 50%;
359
+ pointer-events: none;
360
+ left: ${e}px;
361
+ top: ${r}px;
362
+ transform: translate(-50%, -50%);
363
+ box-shadow: 0 0 ${f*2}px ${n};
364
+ animation: sparkfx-firework-explode 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
365
+ --fw-x: ${m}px;
366
+ --fw-y: ${u}px;
367
+ `,t.appendChild(o),setTimeout(()=>o.remove(),800);}function dt(){if(document.getElementById("sparkfx-firework-styles"))return;let t=document.createElement("style");t.id="sparkfx-firework-styles",t.textContent=`
368
+ @keyframes sparkfx-firework-explode {
369
+ 0% {
370
+ opacity: 1;
371
+ transform: translate(-50%, -50%) scale(0);
372
+ }
373
+ 30% {
374
+ opacity: 1;
375
+ transform: translate(calc(-50% + var(--fw-x) * 0.8), calc(-50% + var(--fw-y) * 0.8)) scale(1.2);
376
+ }
377
+ 100% {
378
+ opacity: 0;
379
+ transform: translate(calc(-50% + var(--fw-x)), calc(-50% + var(--fw-y) + 20px)) scale(0.3);
380
+ }
381
+ }
382
+
383
+ .sparkfx-firework {
384
+ position: relative;
385
+ overflow: visible !important;
386
+ }
387
+ `,document.head.appendChild(t);}function J(t){let e=p(t,mt);if(i(),dt(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=n=>{let s=n.currentTarget,a=s.getBoundingClientRect(),o=n.clientX-a.left,f=n.clientY-a.top,m=360/e.particleCount;for(let u=0;u<e.particleCount;u++){let k=m*u+(Math.random()*20-10),g=e.spread*(.6+Math.random()*.4),v=e.colors[Math.floor(Math.random()*e.colors.length)];setTimeout(()=>{ut(s,o,f,v,k,g);},Math.random()*100);}};return {className:fe("sparkfx-effect","sparkfx-firework"),style:l(e),onClick:e.trigger==="click"?r:void 0,onMouseEnter:e.trigger==="hover"?r:void 0}}var kt={duration:3e3,trigger:"click"};function D(t){let e=p(t,kt);if(i(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=l({duration:e.duration}),n=h({...e,trigger:"click"}),s=S({...e,trigger:"hover"});return {className:fe("sparkfx-effect","sparkfx-celebrate"),style:r,onClick:a=>{n.onClick?.(a);},onMouseEnter:a=>{s.onMouseEnter?.(a);},onMouseLeave:a=>{s.onMouseLeave?.(a);}}}var yt={trigger:"click",duration:50,speed:50,cursor:true,cursorChar:"|"};function ht(){if(document.getElementById("sparkfx-typewriter-styles"))return;let t=document.createElement("style");t.id="sparkfx-typewriter-styles",t.textContent=`
388
+ .sparkfx-typewriter-cursor {
389
+ animation: sparkfx-cursor-blink 0.8s infinite;
390
+ margin-left: 2px;
391
+ font-weight: 100;
392
+ }
393
+
394
+ @keyframes sparkfx-cursor-blink {
395
+ 0%, 50% { opacity: 1; }
396
+ 51%, 100% { opacity: 0; }
397
+ }
398
+ `,document.head.appendChild(t);}function K(t){let e=p(t,yt);if(i(),ht(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=false,n="",s=null,a=o=>{if(r)return;r=true;let f=o.currentTarget;n=n||f.textContent||"",f.textContent="",e.cursor&&(s=document.createElement("span"),s.className="sparkfx-typewriter-cursor",s.textContent=e.cursorChar,f.appendChild(s));let m=0,u=()=>{m<n.length?(s?f.insertBefore(document.createTextNode(n[m]),s):f.textContent+=n[m],m++,setTimeout(u,e.speed)):(s&&setTimeout(()=>{s?.remove(),s=null;},1500),r=false);};u();};return {className:fe("sparkfx-effect","sparkfx-typewriter"),onClick:e.trigger==="click"?a:void 0,onMouseEnter:e.trigger==="hover"?a:void 0}}var vt={duration:1e3,trigger:"hover"},ne="ABCDEFGHIKLMNOPQRSTUVWXYZ0123456789@#$%&";function Q(t){let e=p(t,vt);i();let r=null,n=s=>{let a=s.innerText,o=0;clearInterval(r),r=setInterval(()=>{s.innerText=a.split("").map((f,m)=>m<o?a[m]:ne[Math.floor(Math.random()*ne.length)]).join(""),o>=a.length&&clearInterval(r),o+=1/3;},e.duration/(a.length*3));};return {className:fe("sparkfx-effect","sparkfx-scramble"),onMouseEnter:s=>{e.trigger==="hover"&&n(s.currentTarget);}}}var bt={trigger:"hover",duration:400,amplitude:8,speed:100};function Mt(){if(document.getElementById("sparkfx-wave-styles"))return;let t=document.createElement("style");t.id="sparkfx-wave-styles",t.textContent=`
399
+ .sparkfx-wave {
400
+ display: inline-block;
401
+ }
402
+
403
+ .sparkfx-wave-letter {
404
+ display: inline-block;
405
+ animation: sparkfx-wave-float 0.4s ease-in-out;
406
+ animation-fill-mode: both;
407
+ }
408
+
409
+ @keyframes sparkfx-wave-float {
410
+ 0%, 100% { transform: translateY(0); }
411
+ 50% { transform: translateY(var(--wave-amplitude, -8px)); }
412
+ }
413
+ `,document.head.appendChild(t);}function U(t){let e=p(t,bt);if(i(),Mt(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=false,n="",s=a=>{if(r)return;r=true;let o=a.currentTarget;n||(n=o.innerHTML);let f=o.textContent||"";o.innerHTML="",f.split("").forEach((u,k)=>{let g=document.createElement("span");g.className="sparkfx-wave-letter",g.textContent=u===" "?"\xA0":u,g.style.setProperty("--wave-amplitude",`-${e.amplitude}px`),g.style.animationDelay=`${k*e.speed}ms`,o.appendChild(g);});let m=f.length*e.speed+e.duration;setTimeout(()=>{o.innerHTML=n,r=false;},m);};return {className:fe("sparkfx-effect","sparkfx-wave"),onMouseEnter:e.trigger==="hover"?s:void 0,onClick:e.trigger==="click"?s:void 0}}var Tt={trigger:"hover",duration:300,color:"rgba(0, 255, 163, 0.3)",height:"40%"};function wt(){if(document.getElementById("sparkfx-highlight-styles"))return;let t=document.createElement("style");t.id="sparkfx-highlight-styles",t.textContent=`
414
+ .sparkfx-highlight {
415
+ position: relative;
416
+ display: inline-block;
417
+ }
418
+
419
+ .sparkfx-highlight::after {
420
+ content: '';
421
+ position: absolute;
422
+ bottom: 0;
423
+ left: 0;
424
+ width: 0%;
425
+ height: var(--highlight-height, 40%);
426
+ background: var(--highlight-color, rgba(0, 255, 163, 0.3));
427
+ z-index: -1;
428
+ transition: width var(--sparkfx-duration) var(--sparkfx-easing);
429
+ }
430
+
431
+ .sparkfx-highlight-active::after {
432
+ width: 100%;
433
+ }
434
+ `,document.head.appendChild(t);}function Z(t){let e=p(t,Tt);if(i(),wt(),!c(e))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=s=>{s.currentTarget.classList.add("sparkfx-highlight-active");},n=s=>{s.currentTarget.classList.remove("sparkfx-highlight-active");};return {className:fe("sparkfx-effect","sparkfx-highlight"),style:{...l(e),"--highlight-color":e.color,"--highlight-height":e.height},onMouseEnter:e.trigger==="hover"?r:void 0,onMouseLeave:e.trigger==="hover"?n:void 0}}var Bt={bounce:M,pulse:R,lift:T,scale:w,shake:B,fade:E,slide:C,rotate:$,glow:N,ripple:L,magnetic:j,tilt:H,elastic:V,jelly:P,rubber:A,morph:q,glitch:I,blur:Y,neon:X,glass:G,shimmer:z,gradient:F,spotlight:W,hologram:_,confetti:h,sparkle:S,firework:J,celebrate:D,typewriter:K,scramble:Q,wave:U,highlight:Z},Na=Bt;export{h as A,S as B,J as C,D,K as E,Q as F,U as G,Z as H,Bt as I,Na as J,i as a,b,M as c,R as d,T as e,w as f,B as g,E as h,C as i,$ as j,N as k,L as l,j as m,H as n,V as o,P as p,A as q,q as r,I as s,Y as t,X as u,G as v,z as w,F as x,W as y,_ as z};//# sourceMappingURL=chunk-B7KCJZ6I.js.map
435
+ //# sourceMappingURL=chunk-B7KCJZ6I.js.map