sparkfx 1.0.0 → 1.1.0

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,39 +1,32 @@
1
- # lynch-spark
1
+ # sparkfx
2
2
 
3
3
  Micro-interactions for modern web apps.
4
4
 
5
5
  ```bash
6
- npm install lynch-spark
6
+ npm install sparkfx
7
7
  ```
8
8
 
9
9
  ## Usage
10
10
 
11
11
  ```js
12
- import { spark } from 'lynch-spark'
12
+ import { spark } from 'sparkfx'
13
13
 
14
- // Get effect props
15
- const effect = spark.bounce()
16
-
17
- // Apply to element
18
- element.className = effect.className
19
- element.addEventListener('mouseenter', effect.onMouseEnter)
14
+ const fx = spark.bounce()
15
+ element.className = fx.className
20
16
  ```
21
17
 
22
18
  ### React
23
19
 
24
20
  ```jsx
25
21
  import { useRef, useEffect } from 'react'
26
- import { spark } from 'lynch-spark'
22
+ import { spark } from 'sparkfx'
27
23
 
28
24
  function Button() {
29
25
  const ref = useRef(null)
30
26
 
31
27
  useEffect(() => {
32
- const el = ref.current
33
28
  const fx = spark.bounce()
34
- el.classList.add(...fx.className.split(' '))
35
- el.addEventListener('mouseenter', fx.onMouseEnter)
36
- el.addEventListener('mouseleave', fx.onMouseLeave)
29
+ ref.current.classList.add(fx.className)
37
30
  }, [])
38
31
 
39
32
  return <button ref={ref}>Click</button>
@@ -55,20 +48,9 @@ function Button() {
55
48
  ## Options
56
49
 
57
50
  ```js
58
- spark.bounce({
59
- duration: 300,
60
- intensity: 1.2
61
- })
62
-
63
- spark.glow({
64
- color: '#00ffcc',
65
- spread: 20
66
- })
67
-
68
- spark.tilt({
69
- angle: 15,
70
- glare: true
71
- })
51
+ spark.glow({ color: '#00ffa3', spread: 20 })
52
+ spark.tilt({ angle: 15, glare: true })
53
+ spark.bounce({ duration: 300, intensity: 1.2 })
72
54
  ```
73
55
 
74
56
  ## License
@@ -0,0 +1,3 @@
1
+ import {J}from'./chunk-PGUBHRHH.js';import {useRef,useEffect}from'react';/* sparkfx - Premium micro-interactions */
2
+ function k(l,c){let n=useRef(null);return useEffect(()=>{if(!n.current)return;let i=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=useRef(null);return useEffect(()=>{if(!c.current)return;let n=c.current,i=[];return l.forEach(({name:s,options:a})=>{let u=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}export{k as a,L as b};//# sourceMappingURL=chunk-AXCTRL2D.js.map
3
+ //# sourceMappingURL=chunk-AXCTRL2D.js.map
@@ -0,0 +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-AXCTRL2D.js","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,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
@@ -0,0 +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"]}
@@ -0,0 +1,218 @@
1
+ 'use strict';var lt=require('clsx');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var lt__default=/*#__PURE__*/_interopDefault(lt);/* sparkfx - Premium micro-interactions */
2
+ var rt="sparkfx-styles",tt=false,et=new Set,nt=`
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 s(){if(typeof document>"u"||tt)return;let e=document.createElement("style");e.id=rt,e.textContent=nt,document.head.appendChild(e),tt=true;}function k(e,t){if(typeof document>"u"||et.has(e))return;s();let r=document.getElementById(rt);r&&(r.textContent+=`
187
+ @keyframes ${e} { ${t} }`,et.add(e));}function f(e){let t={};return e.duration!==void 0&&(t["--spark-duration"]=`${e.duration}ms`),e.easing!==void 0&&(t["--spark-easing"]=it(e.easing)),e.intensity!==void 0&&(t["--spark-intensity"]=String(e.intensity)),t}function it(e){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)"}[e]??e}function R(){return typeof window>"u"?false:window.matchMedia("(prefers-reduced-motion: reduce)").matches}var O=s;var pt=R,ct={duration:300,intensity:1,trigger:"hover",easing:"ease-out",delay:0,reduceMotion:true};function o(e,t){return {...ct,...t,...e}}function p(e){return !(e.reduceMotion!==false&&pt())}function u(e,t){return e*t}var ft=0;function st(){return `sparkfx-${++ft}-${Date.now()}`}function x(e,t){return Math.random()*(t-e)+e}function ot(e){return e[Math.floor(Math.random()*e.length)]}var mt={duration:400,bounces:1,trigger:"hover",intensity:1};function v(e){let t=o(e,mt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(20,t.intensity),i=`sparkfx-bounce-${t.bounces}-${Math.round(r)}`,n="0%, 100% { transform: translateY(0); }",a=100/(t.bounces*2);for(let l=0;l<t.bounces;l++){let m=a*(l*2+1),g=r*Math.pow(.6,l);n+=` ${m}% { transform: translateY(-${g}px); }`;}k(i,n);let c=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-bounce"),style:{...c,"--sparkfx-animation-name":i},onMouseEnter:(void 0)}}var kt={duration:1e3,count:-1,scale:1.05,trigger:"always",intensity:1};function b(e){let t=o(e,kt);s();let r=1+(t.scale-1)*t.intensity,i=`sparkfx-pulse-${r.toString().replace(".","_")}`;if(k(i,`
188
+ 0%, 100% { transform: scale(1); opacity: 1; }
189
+ 50% { transform: scale(${r}); opacity: 0.8; }
190
+ `),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let n=f({duration:t.duration,easing:t.easing}),a=t.count===-1?"infinite":t.count;return {className:lt__default.default("sparkfx-effect","sparkfx-pulse"),style:{...n,animation:`${i} ${t.duration}ms ${t.easing} ${a}`}}}var dt={duration:200,distance:8,shadow:true,trigger:"hover",intensity:1};function B(e){let t=o(e,dt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(t.distance,t.intensity),i=f({duration:t.duration,easing:t.easing}),n=t.shadow?`0 ${r*2}px ${r*3}px rgba(0, 0, 0, 0.15)`:"none";return {className:lt__default.default("sparkfx-effect","sparkfx-lift"),style:{...i,"--sparkfx-lift-distance":`-${r}px`,"--sparkfx-lift-shadow":n,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing), box-shadow var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{let c=a.currentTarget;t.trigger==="hover"&&(c.style.transform=`translateY(-${r}px)`,t.shadow&&(c.style.boxShadow=n));},onMouseLeave:a=>{let c=a.currentTarget;t.trigger==="hover"&&(c.style.transform="translateY(0)",c.style.boxShadow="none");}}}var St={duration:200,scale:1.1,trigger:"hover",intensity:1};function M(e){let t=o(e,St);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=1+(t.scale-1)*t.intensity,i=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-scale"),style:{...i,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:n=>{if(t.trigger==="hover"){let a=n.currentTarget;a.style.transform=`scale(${r})`;}},onMouseLeave:n=>{if(t.trigger==="hover"){let a=n.currentTarget;a.style.transform="scale(1)";}}}}var ht={duration:500,distance:5,count:3,trigger:"click",intensity:1};function T(e){let t=o(e,ht);s();let r=u(t.distance,t.intensity),i=`sparkfx-shake-${r}`;if(k(i,`
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
+ `),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let n=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-shake"),style:n,onClick:a=>{if(t.trigger==="click"){let c=a.currentTarget;c.style.animation=`${i} ${t.duration}ms ${t.easing}`,setTimeout(()=>{c.style.animation="";},t.duration);}}}}var Rt={duration:200,opacity:.6,trigger:"hover",intensity:1};function w(e){let t=o(e,Rt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=t.opacity,i=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-fade"),style:{...i,transition:"opacity var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:n=>{if(t.trigger==="hover"){let a=n.currentTarget;a.style.opacity=String(r);}},onMouseLeave:n=>{if(t.trigger==="hover"){let a=n.currentTarget;a.style.opacity="1";}}}}var bt={duration:200,direction:"up",distance:10,trigger:"hover",intensity:1};function N(e){let t=o(e,bt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(t.distance,t.intensity),i=f({duration:t.duration,easing:t.easing}),n=()=>{switch(t.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:lt__default.default("sparkfx-effect","sparkfx-slide"),style:{...i,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.transform=n();}},onMouseLeave:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.transform="translate(0)";}}}}var Mt={duration:200,angle:5,direction:"clockwise",trigger:"hover",intensity:1};function $(e){let t=o(e,Mt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(t.angle,t.intensity),i=t.direction==="counterclockwise"?-1:1,n=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-rotate"),style:{...n,transition:"transform var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.transform=`rotate(${r*i}deg)`;}},onMouseLeave:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.transform="rotate(0)";}}}}var wt={duration:300,color:"#00ffa3",spread:20,trigger:"hover",intensity:1};function C(e){let t=o(e,wt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(t.spread,t.intensity),i=f({duration:t.duration,easing:t.easing}),n=`
195
+ 0 0 ${r/2}px ${t.color},
196
+ 0 0 ${r}px ${t.color},
197
+ 0 0 ${r*1.5}px ${t.color}
198
+ `;return {className:lt__default.default("sparkfx-effect","sparkfx-glow"),style:{...i,transition:"box-shadow var(--sparkfx-duration) var(--sparkfx-easing), filter var(--sparkfx-duration) var(--sparkfx-easing)"},onMouseEnter:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.boxShadow=n,c.style.filter="brightness(1.1)";}},onMouseLeave:a=>{if(t.trigger==="hover"){let c=a.currentTarget;c.style.boxShadow="none",c.style.filter="brightness(1)";}}}}var Nt={duration:600,color:"rgba(255, 255, 255, 0.3)",trigger:"click"};function j(e){let t=o(e,Nt);return s(),p(t)?{className:"spark-effect spark-ripple-container",style:f({duration:t.duration}),onClick:n=>{let a=n.currentTarget,c=a.getBoundingClientRect(),l=Math.max(c.width,c.height)*2,m=document.createElement("span");m.className="spark-ripple",m.style.cssText=`
199
+ width: ${l}px;
200
+ height: ${l}px;
201
+ left: ${n.clientX-c.left-l/2}px;
202
+ top: ${n.clientY-c.top-l/2}px;
203
+ background: ${t.color};
204
+ `,getComputedStyle(a).position==="static"&&(a.style.position="relative"),a.style.overflow="hidden",a.appendChild(m),setTimeout(()=>{m.remove();},t.duration);}}:{className:"spark-effect spark-reduced-motion"}}var Ct={strength:.5,distance:100,trigger:"move"};function E(e){let t=o(e,Ct);return O(),{className:lt__default.default("sparkfx-effect","sparkfx-magnetic"),onMouseMove:r=>{if(t.trigger==="move"){let i=r.currentTarget,n=i.getBoundingClientRect(),a=n.left+n.width/2,c=n.top+n.height/2,l=r.clientX-a,m=r.clientY-c;if(Math.sqrt(l*l+m*m)<t.distance){let d=l*t.strength,h=m*t.strength;i.style.transform=`translate(${d}px, ${h}px)`;}else i.style.transform="translate(0, 0)";}},onMouseLeave:r=>{let i=r.currentTarget;i.style.transform="translate(0, 0)";}}}var Et={angle:15,glare:true,perspective:1e3,trigger:"move"};function V(e){let t=o(e,Et);return O(),{className:lt__default.default("sparkfx-effect","sparkfx-tilt"),onMouseMove:r=>{if(t.trigger==="move"){let i=r.currentTarget,n=i.getBoundingClientRect(),a=r.clientX-n.left,c=r.clientY-n.top,l=n.width/2,m=n.height/2,g=(a-l)/l*t.angle,d=(m-c)/m*t.angle;i.style.transform=`perspective(${t.perspective}px) rotateX(${d}deg) rotateY(${g}deg)`;}},onMouseLeave:r=>{let i=r.currentTarget;i.style.transform=`perspective(${t.perspective}px) rotateX(0deg) rotateY(0deg)`;}}}function L(e){let t=o(e,{trigger:"hover"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-elastic"),style:f(t)}:{className:"sparkfx-effect"}}function q(e){let t=o(e,{trigger:"hover"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-jelly"),style:f(t)}:{className:"sparkfx-effect"}}function P(e){let t=o(e,{trigger:"click"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-rubber"),style:f(t)}:{className:"sparkfx-effect"}}function A(e){let t=o(e,{trigger:"hover"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-morph"),style:f(t)}:{className:"sparkfx-effect"}}var Ht={duration:300,color1:"#ff0055",color2:"#00d4ff",trigger:"hover",intensity:1};function H(e){let t=o(e,Ht);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-glitch"),style:{...r,"--sparkfx-glitch-color1":t.color1,"--sparkfx-glitch-color2":t.color2,position:"relative"}}}function X(e){let t=o(e,{trigger:"hover"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-blur"),style:f(t)}:{className:"sparkfx-effect"}}var It={duration:300,color:"#00d4ff",spread:20,trigger:"hover",intensity:1};function Y(e){let t=o(e,It);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=u(t.spread,t.intensity),i=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-neon"),style:{...i,"--sparkfx-neon-color":t.color,"--sparkfx-neon-spread":`${r}px`}}}var zt={duration:300,trigger:"always"};function I(e){let t=o(e,zt);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=f({duration:t.duration,easing:t.easing});return {className:lt__default.default("sparkfx-effect","sparkfx-glass"),style:{...r}}}var _t={duration:1500,trigger:"always"};function G(e){let t=o(e,_t);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=f({duration:t.duration,easing:"linear"});return {className:lt__default.default("sparkfx-effect","sparkfx-shimmer"),style:{...r}}}function z(e){let t=o(e,{trigger:"always"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-gradient"),style:f(t)}:{className:"sparkfx-effect"}}function F(e){let t=o(e,{trigger:"hover"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-spotlight"),onMouseMove:r=>{let i=r.currentTarget,n=i.getBoundingClientRect(),a=r.clientX-n.left,c=r.clientY-n.top;i.style.setProperty("--sparkfx-spotlight-x",`${a}px`),i.style.setProperty("--sparkfx-spotlight-y",`${c}px`);}}:{className:"sparkfx-effect"}}function _(e){let t=o(e,{trigger:"always"});return s(),p(t)?{className:lt__default.default("sparkfx-effect","sparkfx-hologram"),style:f(t)}:{className:"sparkfx-effect"}}var Wt={duration:2e3,count:30,colors:["#ff0055","#00d4ff","#00ffa3","#ffcc00","#ff00ff"],spread:60,trigger:"click",intensity:1};function S(e){let t=o(e,Wt);s();let r=i=>{let n=Math.floor(t.count*t.intensity);for(let a=0;a<n;a++){let c=document.createElement("div"),l=x(5,10),m=ot(t.colors),g=st();c.className=`sparkfx-confetti-particle ${g}`,c.style.cssText=`
205
+ position: absolute;
206
+ width: ${l}px;
207
+ height: ${l}px;
208
+ background: ${m};
209
+ top: 50%;
210
+ left: 50%;
211
+ border-radius: ${x(0,50)}%;
212
+ pointer-events: none;
213
+ z-index: 1000;
214
+ `;let d=x(-t.spread,t.spread)-90,h=x(10,20),J=`sparkfx-confetti-${g}`;k(J,`
215
+ 0% { transform: translate(-50%, -50%) rotate(0deg); opacity: 1; }
216
+ 100% { transform: translate(calc(-50% + ${Math.cos(d*Math.PI/180)*h*10}px), calc(-50% + ${Math.sin(d*Math.PI/180)*h*10}px)) rotate(${x(0,360)}deg); opacity: 0; }
217
+ `),c.style.animation=`${J} ${t.duration}ms ease-out forwards`,i.appendChild(c),setTimeout(()=>c.remove(),t.duration);}};return {className:lt__default.default("sparkfx-effect","sparkfx-confetti"),onClick:i=>{t.trigger==="click"&&r(i.currentTarget);}}}function y(e){o(e,{trigger:"hover"});return s(),{className:lt__default.default("sparkfx-effect","sparkfx-sparkle")}}function D(e){o(e,{trigger:"click"});return s(),{className:lt__default.default("sparkfx-effect","sparkfx-firework")}}var ee={duration:3e3,trigger:"click"};function K(e){let t=o(e,ee);if(s(),!p(t))return {className:"sparkfx-effect sparkfx-reduced-motion"};let r=f({duration:t.duration}),i=S({...t,trigger:"click"}),n=y({...t,trigger:"hover"});return {className:lt__default.default("sparkfx-effect","sparkfx-celebrate"),style:r,onClick:a=>{i.onClick?.(a);},onMouseEnter:a=>{n.onMouseEnter?.(a);},onMouseLeave:a=>{n.onMouseLeave?.(a);}}}function Q(e){o(e,{trigger:"always"});return s(),{className:lt__default.default("sparkfx-effect","sparkfx-typewriter")}}var se=()=>{};var ae={duration:1e3,trigger:"hover"},at="ABCDEFGHIKLMNOPQRSTUVWXYZ0123456789@#$%&";function U(e){let t=o(e,ae);s();let r=null,i=n=>{let a=n.innerText,c=0;clearInterval(r),r=setInterval(()=>{n.innerText=a.split("").map((l,m)=>m<c?a[m]:at[Math.floor(Math.random()*at.length)]).join(""),c>=a.length&&clearInterval(r),c+=1/3;},t.duration/(a.length*3));};return {className:lt__default.default("sparkfx-effect","sparkfx-scramble"),onMouseEnter:n=>{t.trigger==="hover"&&i(n.currentTarget);}}}function W(e){o(e,{trigger:"hover"});return s(),{className:lt__default.default("sparkfx-effect","sparkfx-wave")}}function Z(e){o(e,{trigger:"hover"});return s(),{className:lt__default.default("sparkfx-effect","sparkfx-highlight")}}var pe={bounce:v,pulse:b,lift:B,scale:M,shake:T,fade:w,slide:N,rotate:$,glow:C,ripple:j,magnetic:E,tilt:V,elastic:L,jelly:q,rubber:P,morph:A,glitch:H,blur:X,neon:Y,glass:I,shimmer:G,gradient:z,spotlight:F,hologram:_,confetti:S,sparkle:y,firework:D,celebrate:K,typewriter:Q,scramble:U,wave:W,highlight:Z},mo=pe;exports.A=S;exports.B=y;exports.C=D;exports.D=K;exports.E=Q;exports.F=se;exports.G=U;exports.H=W;exports.I=Z;exports.J=pe;exports.K=mo;exports.a=s;exports.b=R;exports.c=v;exports.d=b;exports.e=B;exports.f=M;exports.g=T;exports.h=w;exports.i=N;exports.j=$;exports.k=C;exports.l=j;exports.m=E;exports.n=V;exports.o=L;exports.p=q;exports.q=P;exports.r=A;exports.s=H;exports.t=X;exports.u=Y;exports.v=I;exports.w=G;exports.x=z;exports.y=F;exports.z=_;//# sourceMappingURL=chunk-NQYL46S7.cjs.map
218
+ //# sourceMappingURL=chunk-NQYL46S7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/styles.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/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","defaults","mergeOptions","effectDefaults","shouldAnimate","applyIntensity","value","intensity","idCounter","generateId","random","min","max","randomItem","array","defaultOptions","bounce","opts","bounceHeight","animationName","step","i","upPercent","currentHeight","cssVars","clsx","pulse","scaleValue","iterationCount","lift","distance","shadowValue","e","target","scale","shake","fade","targetOpacity","slide","getTransform","rotate","angle","directionMultiplier","glow","spread","glowShadow","ripple","rect","size","rippleEl","magnetic","centerX","centerY","relX","relY","moveX","moveY","tilt","x","y","rotateY","rotateX","elastic","jelly","rubber","morph","glitch","blur","neon","glass","shimmer","gradient","spotlight","hologram","confetti","createParticles","container","count","particle","color","id","velocity","sparkle","firework","celebrate","confettiResult","sparkleResult","typewriter","initTypewriter","CHARS","scramble","interval","startScramble","originalText","iteration","char","index","wave","highlight","spark","src_default"],"mappings":";AAKA,IAAMA,GAAiB,gBAAA,CAEnBC,EAAAA,CAAiB,MACfC,EAAAA,CAAqB,IAAI,IAKzBC,EAAAA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CA6LZ,SAASC,CAAAA,EAAyB,CACrC,GAAI,OAAO,SAAa,GAAA,EAAeH,EAAAA,CAAgB,OAEvD,IAAMI,CAAAA,CAAQ,QAAA,CAAS,cAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,EAAA,CAAKL,EAAAA,CACXK,CAAAA,CAAM,YAAcF,EAAAA,CACpB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYE,CAAK,CAAA,CAC/BJ,GAAiB,KACrB,CAKO,SAASK,CAAAA,CAAgBC,CAAAA,CAAcC,CAAAA,CAAyB,CAEnE,GADI,OAAO,QAAA,CAAa,GAAA,EACpBN,EAAAA,CAAmB,GAAA,CAAIK,CAAI,CAAA,CAAG,OAElCH,CAAAA,EAAiB,CAEjB,IAAMK,CAAAA,CAAU,QAAA,CAAS,cAAA,CAAeT,EAAc,CAAA,CAClDS,CAAAA,GACAA,CAAAA,CAAQ,WAAA,EAAe;AAAA,WAAA,EAAgBF,CAAI,CAAA,GAAA,EAAMC,CAAS,KAC1DN,EAAAA,CAAmB,GAAA,CAAIK,CAAI,CAAA,EAEnC,CAKO,SAASG,CAAAA,CAAgBC,CAAAA,CAIL,CACvB,IAAMC,CAAAA,CAA+B,EAAC,CAEtC,OAAID,EAAQ,QAAA,GAAa,MAAA,GACrBC,CAAAA,CAAK,kBAAkB,EAAI,CAAA,EAAGD,CAAAA,CAAQ,QAAQ,CAAA,EAAA,CAAA,CAAA,CAE9CA,CAAAA,CAAQ,SAAW,MAAA,GACnBC,CAAAA,CAAK,gBAAgB,CAAA,CAAIC,EAAAA,CAAeF,EAAQ,MAAM,CAAA,CAAA,CAEtDA,EAAQ,SAAA,GAAc,MAAA,GACtBC,EAAK,mBAAmB,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAQ,SAAS,CAAA,CAAA,CAGjDC,CACX,CAKO,SAASC,EAAAA,CAAeC,EAAwB,CAWnD,OAVwC,CACpC,MAAA,CAAQ,QAAA,CACR,KAAM,MAAA,CACN,SAAA,CAAW,UACX,UAAA,CAAY,UAAA,CACZ,cAAe,aAAA,CACf,MAAA,CAAQ,0CACR,MAAA,CAAQ,wCAAA,CACR,QAAS,qCACb,CAAA,CACeA,CAAM,CAAA,EAAKA,CAC9B,CAKO,SAASC,CAAAA,EAAgC,CAC5C,OAAI,OAAO,OAAW,GAAA,CAAoB,KAAA,CACnC,OAAO,UAAA,CAAW,kCAAkC,EAAE,OACjE,CCrQO,IAAMX,CAAAA,CAAmBA,EAEzB,IAAMW,EAAAA,CAAuBA,EAG9BC,EAAAA,CAAuC,CACzC,SAAU,GAAA,CACV,SAAA,CAAW,EACX,OAAA,CAAS,OAAA,CACT,OAAQ,UAAA,CACR,KAAA,CAAO,EACP,YAAA,CAAc,IAClB,EAKO,SAASC,CAAAA,CACZN,CAAAA,CACAO,CAAAA,CAC8B,CAC9B,OAAO,CAAE,GAAGF,EAAAA,CAAU,GAAGE,EAAgB,GAAGP,CAAQ,CACxD,CAKO,SAASQ,EAAcR,CAAAA,CAAoC,CAC9D,OAAI,EAAAA,CAAAA,CAAQ,eAAiB,KAAA,EAASI,EAAAA,EAAqB,CAI/D,CAmCO,SAASK,CAAAA,CAAeC,CAAAA,CAAeC,EAA2B,CACrE,OAAOD,EAAQC,CACnB,CAKA,IAAIC,EAAAA,CAAY,CAAA,CACT,SAASC,EAAAA,EAAqB,CACjC,OAAO,CAAA,QAAA,EAAW,EAAED,EAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAC/C,CAuFO,SAASE,CAAAA,CAAOC,EAAaC,CAAAA,CAAqB,CACrD,OAAO,IAAA,CAAK,MAAA,IAAYA,CAAAA,CAAMD,CAAAA,CAAAA,CAAOA,CACzC,CAKO,SAASE,GAAcC,CAAAA,CAAe,CACzC,OAAOA,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAO,CAAIA,CAAAA,CAAM,MAAM,CAAC,CACzD,CChLA,IAAMC,EAAAA,CAA8C,CAChD,QAAA,CAAU,GAAA,CACV,QAAS,CAAA,CACT,OAAA,CAAS,QACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASC,EAAOpB,CAAAA,CAA2C,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,EAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,EACnB,OAAO,CAAE,UAAW,uCAAwC,CAAA,CAGhE,IAAMC,CAAAA,CAAeb,EAAe,EAAA,CAAIY,CAAAA,CAAK,SAAS,CAAA,CAChDE,CAAAA,CAAgB,kBAAkBF,CAAAA,CAAK,OAAO,IAAI,IAAA,CAAK,KAAA,CAAMC,CAAY,CAAC,CAAA,CAAA,CAG5EzB,EAAY,wCAAA,CACV2B,CAAAA,CAAO,KAAOH,CAAAA,CAAK,OAAA,CAAU,GAEnC,IAAA,IAASI,CAAAA,CAAI,EAAGA,CAAAA,CAAIJ,CAAAA,CAAK,QAASI,CAAAA,EAAAA,CAAK,CACnC,IAAMC,CAAAA,CAAYF,CAAAA,EAAQC,EAAI,CAAA,CAAI,CAAA,CAAA,CAC5BE,EAAgBL,CAAAA,CAAe,IAAA,CAAK,IAAI,EAAA,CAAKG,CAAC,EACpD5B,CAAAA,EAAa,CAAA,CAAA,EAAI6B,CAAS,CAAA,2BAAA,EAA8BC,CAAa,CAAA,MAAA,EACzE,CAEAhC,EAAgB4B,CAAAA,CAAe1B,CAAS,EAExC,IAAM+B,CAAAA,CAAU7B,EAAgB,CAC5B,QAAA,CAAUsB,EAAK,QAAA,CACf,MAAA,CAAQA,EAAK,MACjB,CAAC,EAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,iBAAkB,gBAAgB,CAAA,CAClD,MAAO,CACH,GAAGD,EACH,0BAAA,CAA4BL,CAChC,EACA,YAAA,EAAyC,MAAA,CAE7C,CACJ,CC7CA,IAAMJ,EAAAA,CAA6C,CAC/C,SAAU,GAAA,CACV,KAAA,CAAO,GACP,KAAA,CAAO,IAAA,CACP,QAAS,QAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASW,EAAM9B,CAAAA,CAA0C,CAC5D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,EAASmB,EAAc,CAAA,CAEjD1B,GAAiB,CAEjB,IAAMsC,EAAa,CAAA,CAAA,CAAKV,CAAAA,CAAK,MAAQ,CAAA,EAAKA,CAAAA,CAAK,UACzCE,CAAAA,CAAgB,CAAA,cAAA,EAAiBQ,EAAW,QAAA,EAAS,CAAE,QAAQ,GAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAO9E,GALApC,EAAgB4B,CAAAA,CAAe;AAAA;AAAA,2BAAA,EAENQ,CAAU,CAAA;AAAA,EAAA,CACpC,EAEK,CAACvB,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,SACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,EAEKW,CAAAA,CAAiBX,CAAAA,CAAK,QAAU,EAAA,CAAK,UAAA,CAAaA,EAAK,KAAA,CAE7D,OAAO,CACH,SAAA,CAAWQ,oBAAK,gBAAA,CAAkB,eAAe,EACjD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,SAAA,CAAW,CAAA,EAAGL,CAAa,IAAIF,CAAAA,CAAK,QAAQ,CAAA,GAAA,EAAMA,CAAAA,CAAK,MAAM,CAAA,CAAA,EAAIW,CAAc,CAAA,CACnF,CACJ,CACJ,CCvCA,IAAMb,GAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,QAAA,CAAU,EACV,MAAA,CAAQ,IAAA,CACR,QAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASc,CAAAA,CAAKjC,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,EAAaN,CAAAA,CAASmB,EAAc,EAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,EAAca,CAAI,CAAA,CACnB,OAAO,CAAE,UAAW,uCAAwC,CAAA,CAGhE,IAAMa,CAAAA,CAAWzB,EAAeY,CAAAA,CAAK,QAAA,CAAUA,EAAK,SAAS,CAAA,CACvDO,EAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,SACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAEKc,EAAcd,CAAAA,CAAK,MAAA,CACnB,CAAA,EAAA,EAAKa,CAAAA,CAAW,CAAC,CAAA,GAAA,EAAMA,CAAAA,CAAW,CAAC,CAAA,sBAAA,CAAA,CACnC,MAAA,CAEN,OAAO,CACH,SAAA,CAAWL,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,KAAA,CAAO,CACH,GAAGD,EACH,yBAAA,CAA2B,CAAA,CAAA,EAAIM,CAAQ,CAAA,EAAA,CAAA,CACvC,wBAAyBC,CAAAA,CACzB,UAAA,CAAY,mHAChB,CAAA,CACA,YAAA,CAAeC,GAAW,CACtB,IAAMC,CAAAA,CAASD,CAAAA,CAAE,cACbf,CAAAA,CAAK,OAAA,GAAY,UACjBgB,CAAAA,CAAO,KAAA,CAAM,UAAY,CAAA,YAAA,EAAeH,CAAQ,CAAA,GAAA,CAAA,CAC5Cb,CAAAA,CAAK,SAAQgB,CAAAA,CAAO,KAAA,CAAM,UAAYF,CAAAA,CAAAA,EAElD,CAAA,CACA,aAAeC,CAAAA,EAAW,CACtB,IAAMC,CAAAA,CAASD,EAAE,aAAA,CACbf,CAAAA,CAAK,OAAA,GAAY,OAAA,GACjBgB,EAAO,KAAA,CAAM,SAAA,CAAY,eAAA,CACzBA,CAAAA,CAAO,MAAM,SAAA,CAAY,MAAA,EAEjC,CACJ,CACJ,CClDA,IAAMlB,EAAAA,CAA6C,CAC/C,QAAA,CAAU,GAAA,CACV,MAAO,GAAA,CACP,OAAA,CAAS,QACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASmB,EAAMtC,CAAAA,CAA0C,CAC5D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,EAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,GAEI,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMU,CAAAA,CAAa,CAAA,CAAA,CAAKV,EAAK,KAAA,CAAQ,CAAA,EAAKA,EAAK,SAAA,CACzCO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,SAAUsB,CAAAA,CAAK,QAAA,CACf,OAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,oBAAK,gBAAA,CAAkB,eAAe,EACjD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,UAAA,CAAY,yDAChB,CAAA,CACA,aAAeQ,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,UAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,EAAE,aAAA,CACjBC,CAAAA,CAAO,MAAM,SAAA,CAAY,CAAA,MAAA,EAASN,CAAU,CAAA,CAAA,EAChD,CACJ,CAAA,CACA,YAAA,CAAeK,GAAW,CACtB,GAAIf,EAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,EAAO,KAAA,CAAM,SAAA,CAAY,WAC7B,CACJ,CACJ,CACJ,CCzCA,IAAMlB,EAAAA,CAA6C,CAC/C,SAAU,GAAA,CACV,QAAA,CAAU,EACV,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,OAAA,CACT,UAAW,CACf,CAAA,CAEO,SAASoB,CAAAA,CAAMvC,CAAAA,CAA0C,CAC5D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAEjD1B,CAAAA,GAEA,IAAMyC,CAAAA,CAAWzB,EAAeY,CAAAA,CAAK,QAAA,CAAUA,CAAAA,CAAK,SAAS,EACvDE,CAAAA,CAAgB,CAAA,cAAA,EAAiBW,CAAQ,CAAA,CAAA,CAQ/C,GANAvC,EAAgB4B,CAAAA,CAAe;AAAA;AAAA,qDAAA,EAEoBW,CAAQ,CAAA;AAAA,+CAAA,EACdA,CAAQ,CAAA;AAAA,EAAA,CACtD,CAAA,CAEK,CAAC1B,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,eAAe,CAAA,CACjD,KAAA,CAAOD,CAAAA,CACP,OAAA,CAAUQ,CAAAA,EAAW,CACjB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,CAAA,EAAGd,CAAa,CAAA,CAAA,EAAIF,CAAAA,CAAK,QAAQ,CAAA,GAAA,EAAMA,CAAAA,CAAK,MAAM,CAAA,CAAA,CAC3E,UAAA,CAAW,IAAM,CACbgB,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,GAC7B,CAAA,CAAGhB,CAAAA,CAAK,QAAQ,EACpB,CACJ,CACJ,CACJ,CCvCA,IAAMF,EAAAA,CAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,OAAA,CAAS,EAAA,CACT,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASqB,CAAAA,CAAKxC,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMoB,CAAAA,CAAgBpB,CAAAA,CAAK,OAAA,CACrBO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,UAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,UAAA,CAAY,uDAChB,CAAA,CACA,YAAA,CAAeQ,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,OAAA,CAAU,MAAA,CAAOI,CAAa,EAC/C,CACJ,CAAA,CACA,YAAA,CAAeL,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,OAAA,CAAU,IAC3B,CACJ,CACJ,CACJ,CC9CA,IAAMlB,EAAAA,CAA6C,CAC/C,QAAA,CAAU,GAAA,CACV,SAAA,CAAW,IAAA,CACX,QAAA,CAAU,EAAA,CACV,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASuB,CAAAA,CAAM1C,CAAAA,CAA0C,CAC5D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMa,CAAAA,CAAWzB,CAAAA,CAAeY,CAAAA,CAAK,QAAA,CAAUA,CAAAA,CAAK,SAAS,CAAA,CACvDO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAEKsB,CAAAA,CAAe,IAAM,CACvB,OAAQtB,CAAAA,CAAK,SAAA,EACT,KAAK,IAAA,CAAM,OAAO,CAAA,YAAA,EAAea,CAAQ,CAAA,GAAA,CAAA,CACzC,KAAK,MAAA,CAAQ,OAAO,CAAA,WAAA,EAAcA,CAAQ,CAAA,GAAA,CAAA,CAC1C,KAAK,MAAA,CAAQ,OAAO,CAAA,YAAA,EAAeA,CAAQ,CAAA,GAAA,CAAA,CAC3C,KAAK,OAAA,CAAS,OAAO,CAAA,WAAA,EAAcA,CAAQ,CAAA,GAAA,CAAA,CAC3C,QAAS,OAAO,CAAA,YAAA,EAAeA,CAAQ,CAAA,GAAA,CAC3C,CACJ,CAAA,CAEA,OAAO,CACH,SAAA,CAAWL,mBAAAA,CAAK,gBAAA,CAAkB,eAAe,CAAA,CACjD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,UAAA,CAAY,yDAChB,CAAA,CACA,YAAA,CAAeQ,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAYM,CAAAA,GAC7B,CACJ,CAAA,CACA,YAAA,CAAeP,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,EAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,eAC7B,CACJ,CACJ,CACJ,CC7CA,IAAMlB,EAAAA,CAA8C,CAChD,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,CAAA,CACP,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASyB,CAAAA,CAAO5C,CAAAA,CAA2C,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMwB,CAAAA,CAAQpC,CAAAA,CAAeY,CAAAA,CAAK,KAAA,CAAOA,CAAAA,CAAK,SAAS,CAAA,CACjDyB,CAAAA,CAAsBzB,CAAAA,CAAK,SAAA,GAAc,kBAAA,CAAqB,EAAA,CAAK,EACnEO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,gBAAgB,CAAA,CAClD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,UAAA,CAAY,yDAChB,CAAA,CACA,YAAA,CAAeQ,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,CAAA,OAAA,EAAUQ,CAAAA,CAAQC,CAAmB,CAAA,IAAA,EAClE,CACJ,CAAA,CACA,YAAA,CAAeV,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,YAC7B,CACJ,CACJ,CACJ,CClDA,IAAMlB,EAAAA,CAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,SAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAAS4B,CAAAA,CAAK/C,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAM2B,CAAAA,CAASvC,CAAAA,CAAeY,CAAAA,CAAK,MAAA,CAAQA,CAAAA,CAAK,SAAS,CAAA,CACnDO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAEK4B,CAAAA,CAAa;AAAA,QAAA,EACbD,CAAAA,CAAS,CAAC,CAAA,GAAA,EAAM3B,CAAAA,CAAK,KAAK,CAAA;AAAA,QAAA,EAC1B2B,CAAM,CAAA,GAAA,EAAM3B,CAAAA,CAAK,KAAK,CAAA;AAAA,QAAA,EACtB2B,CAAAA,CAAS,GAAG,CAAA,GAAA,EAAM3B,CAAAA,CAAK,KAAK;AAAA,EAAA,CAAA,CAGlC,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,UAAA,CAAY,gHAChB,CAAA,CACA,YAAA,CAAeQ,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAYY,CAAAA,CACzBZ,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,kBAC1B,CACJ,CAAA,CACA,YAAA,CAAeD,CAAAA,EAAW,CACtB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAA,CAAS,CAC1B,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,MAAA,CACzBA,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,gBAC1B,CACJ,CACJ,CACJ,CCpDA,IAAMlB,EAAAA,CAA8C,CAChD,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,0BAAA,CACP,OAAA,CAAS,OACb,CAAA,CAEO,SAAS+B,CAAAA,CAAOlD,CAAAA,CAA2C,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,OAFA1B,CAAAA,EAAiB,CAEZe,CAAAA,CAAca,CAAI,CAAA,CAoChB,CACH,SAAA,CAAW,qCAAA,CACX,KAAA,CAlCYtB,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,EAAK,QACnB,CAAC,CAAA,CAiCG,OAAA,CA/BkBe,CAAAA,EAAkB,CACpC,IAAMC,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACXe,CAAAA,CAAOd,CAAAA,CAAO,qBAAA,EAAsB,CACpCe,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,KAAA,CAAOA,CAAAA,CAAK,MAAM,CAAA,CAAI,CAAA,CAE3CE,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAC9CA,CAAAA,CAAS,SAAA,CAAY,cAAA,CACrBA,CAAAA,CAAS,MAAM,OAAA,CAAU;AAAA,aAAA,EAClBD,CAAI,CAAA;AAAA,cAAA,EACHA,CAAI,CAAA;AAAA,YAAA,EACNhB,CAAAA,CAAE,OAAA,CAAUe,CAAAA,CAAK,IAAA,CAAOC,EAAO,CAAC,CAAA;AAAA,WAAA,EACjChB,CAAAA,CAAE,OAAA,CAAUe,CAAAA,CAAK,GAAA,CAAMC,EAAO,CAAC,CAAA;AAAA,kBAAA,EACxB/B,EAAK,KAAK,CAAA;AAAA,IAAA,CAAA,CAIlB,gBAAA,CAAiBgB,CAAM,CAAA,CAAE,QAAA,GAAa,QAAA,GACtCA,EAAO,KAAA,CAAM,QAAA,CAAW,UAAA,CAAA,CAE5BA,CAAAA,CAAO,KAAA,CAAM,QAAA,CAAW,SAExBA,CAAAA,CAAO,WAAA,CAAYgB,CAAQ,CAAA,CAE3B,UAAA,CAAW,IAAM,CACbA,CAAAA,CAAS,MAAA,GACb,CAAA,CAAGhC,CAAAA,CAAK,QAAQ,EACpB,CAMA,CAAA,CAvCW,CAAE,SAAA,CAAW,mCAAoC,CAwChE,CCnDA,IAAMF,EAAAA,CAAgD,CAClD,QAAA,CAAU,EAAA,CACV,SAAU,GAAA,CACV,OAAA,CAAS,MACb,CAAA,CAEO,SAASmC,CAAAA,CAAStD,CAAAA,CAA6C,CAClE,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAEjD,OAAA1B,CAAAA,EAAiB,CAEV,CACH,SAAA,CAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,CAAA,CACpD,WAAA,CAAcO,CAAAA,EAAW,CACrB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAQ,CACzB,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACXe,CAAAA,CAAOd,CAAAA,CAAO,qBAAA,EAAsB,CACpCkB,CAAAA,CAAUJ,CAAAA,CAAK,IAAA,CAAOA,CAAAA,CAAK,KAAA,CAAQ,EACnCK,CAAAA,CAAUL,CAAAA,CAAK,GAAA,CAAMA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAEnCM,CAAAA,CAAOrB,CAAAA,CAAE,OAAA,CAAUmB,CAAAA,CACnBG,CAAAA,CAAOtB,CAAAA,CAAE,OAAA,CAAUoB,CAAAA,CAGzB,GAFa,IAAA,CAAK,IAAA,CAAKC,CAAAA,CAAOA,CAAAA,CAAOC,CAAAA,CAAOA,CAAI,CAAA,CAErCrC,CAAAA,CAAK,QAAA,CAAU,CACtB,IAAMsC,CAAAA,CAAQF,CAAAA,CAAOpC,CAAAA,CAAK,SACpBuC,CAAAA,CAAQF,CAAAA,CAAOrC,CAAAA,CAAK,QAAA,CAC1BgB,CAAAA,CAAO,KAAA,CAAM,UAAY,CAAA,UAAA,EAAasB,CAAK,CAAA,IAAA,EAAOC,CAAK,CAAA,GAAA,EAC3D,CAAA,KACIvB,EAAO,KAAA,CAAM,SAAA,CAAY,kBAEjC,CACJ,CAAA,CACA,YAAA,CAAeD,CAAAA,EAAW,CACtB,IAAMC,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACjBC,CAAAA,CAAO,KAAA,CAAM,UAAY,kBAC7B,CACJ,CACJ,CCtCA,IAAMlB,EAAAA,CAA4C,CAC9C,KAAA,CAAO,EAAA,CACP,KAAA,CAAO,IAAA,CACP,YAAa,GAAA,CACb,OAAA,CAAS,MACb,CAAA,CAEO,SAAS0C,CAAAA,CAAK7D,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAEjD,OAAA1B,CAAAA,EAAiB,CAEV,CACH,SAAA,CAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,WAAA,CAAcO,CAAAA,EAAW,CACrB,GAAIf,CAAAA,CAAK,OAAA,GAAY,OAAQ,CACzB,IAAMgB,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACXe,CAAAA,CAAOd,CAAAA,CAAO,qBAAA,EAAsB,CACpCyB,CAAAA,CAAI1B,CAAAA,CAAE,OAAA,CAAUe,CAAAA,CAAK,IAAA,CACrBY,EAAI3B,CAAAA,CAAE,OAAA,CAAUe,CAAAA,CAAK,GAAA,CAErBI,CAAAA,CAAUJ,CAAAA,CAAK,KAAA,CAAQ,CAAA,CACvBK,CAAAA,CAAUL,CAAAA,CAAK,MAAA,CAAS,CAAA,CAExBa,CAAAA,CAAAA,CAAYF,CAAAA,CAAIP,GAAWA,CAAAA,CAAWlC,CAAAA,CAAK,KAAA,CAC3C4C,CAAAA,CAAAA,CAAYT,CAAAA,CAAUO,CAAAA,EAAKP,CAAAA,CAAWnC,CAAAA,CAAK,KAAA,CAEjDgB,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,CAAA,YAAA,EAAehB,CAAAA,CAAK,WAAW,CAAA,YAAA,EAAe4C,CAAO,CAAA,aAAA,EAAgBD,CAAO,CAAA,IAAA,EACzG,CACJ,EACA,YAAA,CAAe5B,CAAAA,EAAW,CACtB,IAAMC,CAAAA,CAASD,CAAAA,CAAE,cACjBC,CAAAA,CAAO,KAAA,CAAM,SAAA,CAAY,CAAA,YAAA,EAAehB,CAAAA,CAAK,WAAW,CAAA,+BAAA,EAC5D,CACJ,CACJ,CCvCO,SAAS6C,EAAQlE,CAAAA,CAAyC,CAC7D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,CAAA,CAEvD,OADAP,CAAAA,EAAiB,CACZe,EAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,iBAAiB,CAAA,CACnD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,UAAW,gBAAiB,CAKnE,CCRO,SAAS8C,CAAAA,CAAMnE,CAAAA,CAAyC,CAC3D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,CAAA,CAEvD,OADAP,CAAAA,EAAiB,CACZe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,eAAe,CAAA,CACjD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCRO,SAAS+C,CAAAA,CAAOpE,CAAAA,CAAyC,CAC5D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,CAAA,CAEvD,OADAP,CAAAA,GACKe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,gBAAgB,CAAA,CAClD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCRO,SAASgD,CAAAA,CAAMrE,CAAAA,CAAyC,CAC3D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,EAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,CAAA,CAEvD,OADAP,CAAAA,EAAiB,CACZe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,iBAAkB,eAAe,CAAA,CACjD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCHA,IAAMF,EAAAA,CAA8C,CAChD,QAAA,CAAU,GAAA,CACV,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASmD,CAAAA,CAAOtE,CAAAA,CAA2C,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,EAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,gBAAgB,CAAA,CAClD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,0BAA2BP,CAAAA,CAAK,MAAA,CAChC,yBAAA,CAA2BA,CAAAA,CAAK,MAAA,CAChC,QAAA,CAAU,UACd,CACJ,CACJ,CCpCO,SAASkD,CAAAA,CAAKvE,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,CAAA,CAEvD,OADAP,CAAAA,GACKe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCHA,IAAMF,EAAAA,CAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,SAAA,CACP,OAAQ,EAAA,CACR,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAASqD,CAAAA,CAAKxE,CAAAA,CAAyC,CAC1D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAM2B,EAASvC,CAAAA,CAAeY,CAAAA,CAAK,MAAA,CAAQA,CAAAA,CAAK,SAAS,CAAA,CACnDO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,cAAc,CAAA,CAChD,KAAA,CAAO,CACH,GAAGD,CAAAA,CACH,sBAAA,CAAwBP,EAAK,KAAA,CAC7B,uBAAA,CAAyB,CAAA,EAAG2B,CAAM,CAAA,EAAA,CACtC,CACJ,CACJ,CC/BA,IAAM7B,EAAAA,CAA4C,CAC9C,SAAU,GAAA,CACV,OAAA,CAAS,QACb,CAAA,CAEO,SAASsD,CAAAA,CAAMzE,CAAAA,CAAyC,CAC3D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,CAAAA,EAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQA,CAAAA,CAAK,MACjB,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,eAAe,EACjD,KAAA,CAAO,CACH,GAAGD,CACP,CACJ,CACJ,CCzBA,IAAMT,EAAAA,CAA4C,CAC9C,QAAA,CAAU,KACV,OAAA,CAAS,QACb,CAAA,CAEO,SAASuD,CAAAA,CAAQ1E,CAAAA,CAAyC,CAC7D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,GAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,SAAUsB,CAAAA,CAAK,QAAA,CACf,MAAA,CAAQ,QACZ,CAAC,CAAA,CAED,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,iBAAiB,CAAA,CACnD,KAAA,CAAO,CACH,GAAGD,CACP,CACJ,CACJ,CC9BO,SAAS+C,CAAAA,CAAS3E,CAAAA,CAAyC,CAC9D,IAAMqB,EAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,QAAS,CAAC,CAAA,CAExD,OADAP,CAAAA,EAAiB,CACZe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,UAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,CAAA,CACpD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCRO,SAASuD,CAAAA,CAAU5E,CAAAA,CAAyC,CAC/D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,EAEvD,OADAP,CAAAA,EAAiB,CACZe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,mBAAmB,CAAA,CACrD,WAAA,CAAcO,CAAAA,EAAW,CACrB,IAAMC,CAAAA,CAASD,CAAAA,CAAE,aAAA,CACXe,CAAAA,CAAOd,CAAAA,CAAO,qBAAA,EAAsB,CACpCyB,CAAAA,CAAI1B,CAAAA,CAAE,OAAA,CAAUe,CAAAA,CAAK,IAAA,CACrBY,CAAAA,CAAI3B,EAAE,OAAA,CAAUe,CAAAA,CAAK,GAAA,CAC3Bd,CAAAA,CAAO,KAAA,CAAM,WAAA,CAAY,uBAAA,CAAyB,CAAA,EAAGyB,CAAC,CAAA,EAAA,CAAI,CAAA,CAC1DzB,CAAAA,CAAO,KAAA,CAAM,WAAA,CAAY,wBAAyB,CAAA,EAAG0B,CAAC,CAAA,EAAA,CAAI,EAC9D,CACJ,CAAA,CAXiC,CAAE,SAAA,CAAW,gBAAiB,CAYnE,CCfO,SAASc,CAAAA,CAAS7E,CAAAA,CAAyC,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,QAAS,CAAC,CAAA,CAExD,OADAP,CAAAA,GACKe,CAAAA,CAAca,CAAI,CAAA,CAChB,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,CAAA,CACpD,KAAA,CAAO9B,CAAAA,CAAgBsB,CAAI,CAC/B,CAAA,CAJiC,CAAE,SAAA,CAAW,gBAAiB,CAKnE,CCHA,IAAMF,EAAAA,CAAgD,CAClD,QAAA,CAAU,GAAA,CACV,KAAA,CAAO,EAAA,CACP,OAAQ,CAAC,SAAA,CAAW,SAAA,CAAW,SAAA,CAAW,SAAA,CAAW,SAAS,CAAA,CAC9D,MAAA,CAAQ,EAAA,CACR,OAAA,CAAS,OAAA,CACT,SAAA,CAAW,CACf,CAAA,CAEO,SAAS2D,CAAAA,CAAS9E,CAAAA,CAA6C,CAClE,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAEjD1B,CAAAA,EAAiB,CAEjB,IAAMsF,CAAAA,CAAmBC,CAAAA,EAA2B,CAChD,IAAMC,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM5D,CAAAA,CAAK,KAAA,CAAQA,CAAAA,CAAK,SAAS,CAAA,CAEpD,IAAA,IAASI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIwD,CAAAA,CAAOxD,IAAK,CAC5B,IAAMyD,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACvC9B,CAAAA,CAAOtC,CAAAA,CAAO,CAAA,CAAG,EAAE,CAAA,CACnBqE,CAAAA,CAAQlE,EAAAA,CAAWI,EAAK,MAAM,CAAA,CAC9B+D,CAAAA,CAAKvE,EAAAA,EAAW,CAEtBqE,CAAAA,CAAS,SAAA,CAAY,CAAA,0BAAA,EAA6BE,CAAE,CAAA,CAAA,CACpDF,CAAAA,CAAS,KAAA,CAAM,OAAA,CAAU;AAAA;AAAA,uBAAA,EAEZ9B,CAAI,CAAA;AAAA,wBAAA,EACHA,CAAI,CAAA;AAAA,4BAAA,EACA+B,CAAK,CAAA;AAAA;AAAA;AAAA,+BAAA,EAGFrE,CAAAA,CAAO,CAAA,CAAG,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA,YAAA,CAAA,CAKlC,IAAM+B,EAAQ/B,CAAAA,CAAO,CAACO,EAAK,MAAA,CAAQA,CAAAA,CAAK,MAAM,CAAA,CAAI,EAAA,CAC5CgE,EAAWvE,CAAAA,CAAO,EAAA,CAAI,EAAE,CAAA,CACxBS,CAAAA,CAAgB,oBAAoB6D,CAAE,CAAA,CAAA,CAE5CzF,EAAgB4B,CAAAA,CAAe;AAAA;AAAA,wDAAA,EAEe,IAAA,CAAK,IAAIsB,CAAAA,CAAQ,IAAA,CAAK,GAAK,GAAG,CAAA,CAAIwC,CAAAA,CAAW,EAAE,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAIxC,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,GAAG,CAAA,CAAIwC,CAAAA,CAAW,EAAE,CAAA,YAAA,EAAevE,CAAAA,CAAO,CAAA,CAAG,GAAG,CAAC,CAAA;AAAA,YAAA,CAC5L,CAAA,CAEDoE,CAAAA,CAAS,KAAA,CAAM,SAAA,CAAY,CAAA,EAAG3D,CAAa,CAAA,CAAA,EAAIF,CAAAA,CAAK,QAAQ,CAAA,oBAAA,CAAA,CAC5D2D,CAAAA,CAAU,WAAA,CAAYE,CAAQ,CAAA,CAE9B,UAAA,CAAW,IAAMA,CAAAA,CAAS,MAAA,EAAO,CAAG7D,EAAK,QAAQ,EACrD,CACJ,CAAA,CAEA,OAAO,CACH,UAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,CAAA,CACpD,OAAA,CAAUO,CAAAA,EAAW,CACbf,CAAAA,CAAK,OAAA,GAAY,OAAA,EACjB0D,CAAAA,CAAgB3C,CAAAA,CAAE,aAA4B,EAEtD,CACJ,CACJ,CCjEO,SAASkD,CAAAA,CAAQtF,CAAAA,CAAyC,CAChDM,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,EACvD,OAAAP,CAAAA,GACO,CACH,SAAA,CAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,iBAAiB,CACvD,CACJ,CCNO,SAAS0D,CAAAA,CAASvF,CAAAA,CAAyC,CACjDM,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,EACvD,OAAAP,CAAAA,EAAiB,CACV,CACH,UAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,CACxD,CACJ,CCCA,IAAMV,EAAAA,CAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,OAAA,CAAS,OACb,CAAA,CAEO,SAASqE,CAAAA,CAAUxF,CAAAA,CAAyC,CAC/D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAIjD,GAFA1B,GAAiB,CAEb,CAACe,CAAAA,CAAca,CAAI,CAAA,CACnB,OAAO,CAAE,SAAA,CAAW,uCAAwC,CAAA,CAGhE,IAAMO,CAAAA,CAAU7B,CAAAA,CAAgB,CAC5B,QAAA,CAAUsB,CAAAA,CAAK,QACnB,CAAC,CAAA,CAEKoE,CAAAA,CAAiBX,EAAS,CAAE,GAAGzD,CAAAA,CAAM,OAAA,CAAS,OAAQ,CAAC,EACvDqE,CAAAA,CAAgBJ,CAAAA,CAAQ,CAAE,GAAGjE,CAAAA,CAAM,OAAA,CAAS,OAAQ,CAAC,CAAA,CAE3D,OAAO,CACH,SAAA,CAAWQ,mBAAAA,CAAK,gBAAA,CAAkB,mBAAmB,CAAA,CACrD,KAAA,CAAOD,CAAAA,CACP,OAAA,CAAUQ,CAAAA,EAAW,CACjBqD,EAAe,OAAA,GAAUrD,CAAC,EAC9B,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAW,CACtBsD,CAAAA,CAAc,YAAA,GAAetD,CAAC,EAClC,CAAA,CACA,YAAA,CAAeA,GAAW,CACtBsD,CAAAA,CAAc,YAAA,GAAetD,CAAC,EAClC,CACJ,CACJ,CCzCO,SAASuD,CAAAA,CAAW3F,CAAAA,CAAyC,CACnDM,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,QAAS,CAAC,EACxD,OAAAP,CAAAA,EAAiB,CACV,CACH,UAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,oBAAoB,CAC1D,CACJ,CAGO,IAAM+D,EAAAA,CAAiB,IAAM,CAAE,ECJtC,IAAMzE,EAAAA,CAA4C,CAC9C,QAAA,CAAU,GAAA,CACV,OAAA,CAAS,OACb,EAEM0E,EAAAA,CAAQ,0CAAA,CAEP,SAASC,CAAAA,CAAS9F,CAAAA,CAAyC,CAC9D,IAAMqB,CAAAA,CAAOf,CAAAA,CAAaN,CAAAA,CAASmB,EAAc,CAAA,CAEjD1B,CAAAA,GAEA,IAAIsG,CAAAA,CAAgB,IAAA,CAEdC,CAAAA,CAAiB3D,CAAAA,EAAwB,CAC3C,IAAM4D,CAAAA,CAAe5D,CAAAA,CAAO,SAAA,CACxB6D,CAAAA,CAAY,CAAA,CAEhB,aAAA,CAAcH,CAAQ,CAAA,CAEtBA,CAAAA,CAAW,WAAA,CAAY,IAAM,CACzB1D,CAAAA,CAAO,UAAY4D,CAAAA,CACd,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAACE,CAAAA,CAAMC,CAAAA,GACJA,CAAAA,CAAQF,CAAAA,CAAkBD,CAAAA,CAAaG,CAAK,CAAA,CACzCP,EAAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAIA,EAAAA,CAAM,MAAM,CAAC,CACxD,CAAA,CACA,IAAA,CAAK,EAAE,CAAA,CAERK,CAAAA,EAAaD,EAAa,MAAA,EAC1B,aAAA,CAAcF,CAAQ,CAAA,CAG1BG,CAAAA,EAAa,CAAA,CAAI,EACrB,CAAA,CAAG7E,CAAAA,CAAK,QAAA,EAAY4E,CAAAA,CAAa,MAAA,CAAS,CAAA,CAAE,EAChD,EAEA,OAAO,CACH,SAAA,CAAWpE,mBAAAA,CAAK,gBAAA,CAAkB,kBAAkB,EACpD,YAAA,CAAeO,CAAAA,EAAW,CAClBf,CAAAA,CAAK,OAAA,GAAY,OAAA,EACjB2E,EAAc5D,CAAAA,CAAE,aAA4B,EAEpD,CACJ,CACJ,CClDO,SAASiE,CAAAA,CAAKrG,CAAAA,CAAyC,CAC7CM,CAAAA,CAAaN,CAAAA,CAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,EACvD,OAAAP,CAAAA,EAAiB,CACV,CACH,SAAA,CAAWoC,mBAAAA,CAAK,iBAAkB,cAAc,CACpD,CACJ,CCNO,SAASyE,CAAAA,CAAUtG,CAAAA,CAAyC,CAClDM,CAAAA,CAAaN,EAAS,CAAE,OAAA,CAAS,OAAQ,CAAC,EACvD,OAAAP,GAAiB,CACV,CACH,SAAA,CAAWoC,mBAAAA,CAAK,gBAAA,CAAkB,mBAAmB,CACzD,CACJ,CC+EO,IAAM0E,EAAAA,CAAQ,CAEjB,MAAA,CAAAnF,CAAAA,CACA,KAAA,CAAAU,CAAAA,CACA,IAAA,CAAAG,CAAAA,CACA,KAAA,CAAAK,CAAAA,CACA,KAAA,CAAAC,EACA,IAAA,CAAAC,CAAAA,CACA,KAAA,CAAAE,CAAAA,CACA,MAAA,CAAAE,CAAAA,CAEA,KAAAG,CAAAA,CACA,MAAA,CAAAG,CAAAA,CACA,QAAA,CAAAI,CAAAA,CACA,IAAA,CAAAO,EACA,OAAA,CAAAK,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAEA,MAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,MAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CAEA,QAAA,CAAAC,CAAAA,CACA,OAAA,CAAAQ,CAAAA,CACA,SAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAEA,UAAA,CAAAG,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,IAAA,CAAAO,CAAAA,CACA,SAAA,CAAAC,CACJ,CAAA,CAEOE,EAAAA,CAAQD","file":"chunk-NQYL46S7.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 - 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 * 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 * 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 } 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 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 const glowShadow = `\r\n 0 0 ${spread / 2}px ${opts.color},\r\n 0 0 ${spread}px ${opts.color},\r\n 0 0 ${spread * 1.5}px ${opts.color}\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","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 elastic(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-elastic'),\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 jelly(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-jelly'),\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 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","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 blur(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-blur'),\r\n style: generateCSSVars(opts)\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","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 gradient(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'always' }) 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-gradient'),\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 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","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 hologram(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'always' }) 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-hologram'),\r\n style: generateCSSVars(opts)\r\n }\r\n}\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","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function sparkle(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-sparkle'),\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function firework(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'click' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-firework'),\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","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function typewriter(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'always' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-typewriter'),\r\n }\r\n}\r\n\r\n/** Legacy support */\r\nexport const initTypewriter = () => { }\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","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function wave(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-wave'),\r\n }\r\n}\r\n","import type { SparkBaseOptions, SparkResult } from '../../core/types'\r\nimport { mergeOptions } from '../../core/engine'\r\nimport { injectBaseStyles } from '../../core/styles'\r\nimport clsx from 'clsx'\r\n\r\nexport function highlight(options?: SparkBaseOptions): SparkResult {\r\n const opts = mergeOptions(options, { trigger: 'hover' }) as Required<SparkBaseOptions>\r\n injectBaseStyles()\r\n return {\r\n className: clsx('sparkfx-effect', 'sparkfx-highlight'),\r\n }\r\n}\r\n","/**\r\n * sparkfx - Premium micro-interactions for modern web applications\r\n */\r\n\r\n// Core exports\r\nexport * from './core/types'\r\nexport { injectBaseStyles, prefersReducedMotion } from './core/styles'\r\n\r\n// Basic effects\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// Premium effects\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// Visual effects\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\n\r\n// Celebration effects\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// Text effects\r\nexport { typewriter, initTypewriter } 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// Convenience object with all effects\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 { 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 with all effects\r\n * @example\r\n * import { spark } from '@lynch/spark'\r\n * <button {...spark.bounce()}>Click me</button>\r\n */\r\nexport const spark = {\r\n // Basic\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 // Premium\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 // Visual\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 // Celebration\r\n confetti,\r\n sparkle,\r\n firework,\r\n celebrate,\r\n // Text\r\n typewriter,\r\n scramble,\r\n wave,\r\n highlight,\r\n} as const\r\n\r\nexport default spark\r\n"]}