sparkfx 1.1.5 → 1.2.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.
Files changed (61) hide show
  1. package/README.md +126 -35
  2. package/assets/logo.png +0 -0
  3. package/dist/chunk-FLYBCRQ3.cjs +3 -0
  4. package/dist/{chunk-TKPAWONZ.cjs.map → chunk-FLYBCRQ3.cjs.map} +1 -1
  5. package/dist/chunk-H7FVY7R6.cjs +778 -0
  6. package/dist/chunk-H7FVY7R6.cjs.map +1 -0
  7. package/dist/chunk-N3KVAA7Q.js +3 -0
  8. package/dist/{chunk-6QZMOVE5.js.map → chunk-N3KVAA7Q.js.map} +1 -1
  9. package/dist/chunk-RXGLQFPT.js +778 -0
  10. package/dist/chunk-RXGLQFPT.js.map +1 -0
  11. package/dist/headless.cjs +3 -0
  12. package/dist/headless.cjs.map +1 -0
  13. package/dist/headless.d.cts +111 -0
  14. package/dist/headless.d.ts +111 -0
  15. package/dist/headless.js +3 -0
  16. package/dist/headless.js.map +1 -0
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.d.cts +638 -5
  19. package/dist/index.d.ts +638 -5
  20. package/dist/index.js +1 -1
  21. package/dist/next.cjs +2 -2
  22. package/dist/next.d.cts +3 -3
  23. package/dist/next.d.ts +3 -3
  24. package/dist/next.js +1 -1
  25. package/dist/react.cjs +1 -1
  26. package/dist/react.d.cts +4 -4
  27. package/dist/react.d.ts +4 -4
  28. package/dist/react.js +1 -1
  29. package/dist/shadcn.cjs +3 -0
  30. package/dist/shadcn.cjs.map +1 -0
  31. package/dist/shadcn.d.cts +65 -0
  32. package/dist/shadcn.d.ts +65 -0
  33. package/dist/shadcn.js +3 -0
  34. package/dist/shadcn.js.map +1 -0
  35. package/dist/svelte.cjs +2 -2
  36. package/dist/svelte.cjs.map +1 -1
  37. package/dist/svelte.d.cts +1 -1
  38. package/dist/svelte.d.ts +1 -1
  39. package/dist/svelte.js +2 -2
  40. package/dist/svelte.js.map +1 -1
  41. package/dist/tailwind.cjs +3 -0
  42. package/dist/tailwind.cjs.map +1 -0
  43. package/dist/tailwind.d.cts +23 -0
  44. package/dist/tailwind.d.ts +23 -0
  45. package/dist/tailwind.js +3 -0
  46. package/dist/tailwind.js.map +1 -0
  47. package/dist/{types-CPIaNxrw.d.cts → types-DcIJCxh2.d.cts} +14 -10
  48. package/dist/{types-CPIaNxrw.d.ts → types-DcIJCxh2.d.ts} +14 -10
  49. package/dist/vue.cjs +2 -2
  50. package/dist/vue.cjs.map +1 -1
  51. package/dist/vue.d.cts +1 -1
  52. package/dist/vue.d.ts +1 -1
  53. package/dist/vue.js +2 -2
  54. package/dist/vue.js.map +1 -1
  55. package/package.json +32 -5
  56. package/dist/chunk-6QZMOVE5.js +0 -3
  57. package/dist/chunk-7SKPSZQL.js +0 -435
  58. package/dist/chunk-7SKPSZQL.js.map +0 -1
  59. package/dist/chunk-A3YNPPG6.cjs +0 -435
  60. package/dist/chunk-A3YNPPG6.cjs.map +0 -1
  61. package/dist/chunk-TKPAWONZ.cjs +0 -3
package/README.md CHANGED
@@ -1,79 +1,170 @@
1
1
  <p align="center">
2
- <img src="https://hizliresim.com/8scxm3d" alt="sparkfx" width="100" />
2
+ <img src="https://raw.githubusercontent.com/mrLynchs/sparkfx/main/assets/logo.png" alt="sparkfx logo" width="120" />
3
3
  </p>
4
4
 
5
- <h1 align="center">sparkfx</h1>
5
+ <h1 align="center">✨ sparkfx</h1>
6
6
 
7
7
  <p align="center">
8
- <strong>Micro-interactions that make your UI feel alive</strong>
8
+ <strong>45+ micro-interactions that make your UI feel alive</strong>
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <a href="https://www.npmjs.com/package/sparkfx"><img src="https://img.shields.io/npm/v/sparkfx?color=00ffa3&style=flat-square" alt="npm" /></a>
12
+ <a href="https://www.npmjs.com/package/sparkfx"><img src="https://img.shields.io/npm/v/sparkfx?color=00ffa3&style=flat-square" alt="npm version" /></a>
13
13
  <a href="https://www.npmjs.com/package/sparkfx"><img src="https://img.shields.io/npm/dm/sparkfx?color=00d4ff&style=flat-square" alt="downloads" /></a>
14
14
  <img src="https://img.shields.io/badge/TypeScript-Ready-blue?style=flat-square" alt="typescript" />
15
+ <img src="https://img.shields.io/bundlephobia/minzip/sparkfx?style=flat-square&color=a855f7" alt="bundle size" />
15
16
  <img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license" />
16
17
  </p>
17
18
 
19
+ <p align="center">
20
+ <a href="#features">Features</a> •
21
+ <a href="#installation">Installation</a> •
22
+ <a href="#quick-start">Quick Start</a> •
23
+ <a href="#effects">Effects</a> •
24
+ <a href="#integrations">Integrations</a>
25
+ </p>
26
+
18
27
  ---
19
28
 
29
+ ## Installation
30
+
20
31
  ```bash
21
32
  npm install sparkfx
22
33
  ```
23
34
 
35
+ ## Features
36
+
37
+ | | |
38
+ |---|---|
39
+ | 🎯 **45+ Effects** | Motion, scroll, visual, text animations |
40
+ | 🌊 **Motion** | parallax, float, flip3d, swing, orbit |
41
+ | 📜 **Scroll** | reveal, counter with IntersectionObserver |
42
+ | 🎨 **Visual** | aurora, matrix, rainbow, hologram, neon |
43
+ | ⚡ **API** | combine, sequence, stagger |
44
+ | 🎭 **Presets** | gaming, minimal, playful, corporate |
45
+ | ♿ **A11y** | prefers-reduced-motion support |
46
+ | 📦 **Frameworks** | React, Vue, Svelte, Next.js |
47
+
24
48
  ## Quick Start
25
49
 
26
50
  ```js
27
51
  import { spark } from 'sparkfx'
28
52
 
29
- const fx = spark.bounce()
30
- element.classList.add(fx.className)
53
+ // Apply single effect
54
+ element.classList.add(spark.bounce().className)
55
+
56
+ // Combine multiple effects
57
+ import { combine } from 'sparkfx'
58
+ const fx = combine([spark.glow(), spark.bounce()])
31
59
  ```
32
60
 
33
- ## React
61
+ ## Effects
34
62
 
35
- ```jsx
36
- import { useRef, useEffect } from 'react'
37
- import { spark } from 'sparkfx'
63
+ ### Basic
64
+ ```js
65
+ spark.bounce() spark.pulse() spark.lift()
66
+ spark.scale() spark.shake() spark.fade()
67
+ spark.slide() spark.rotate()
68
+ ```
38
69
 
39
- function Button() {
40
- const ref = useRef(null)
41
-
42
- useEffect(() => {
43
- const fx = spark.glow({ color: '#00ffa3' })
44
- ref.current.classList.add(fx.className)
45
- ref.current.addEventListener('mouseenter', fx.onMouseEnter)
46
- ref.current.addEventListener('mouseleave', fx.onMouseLeave)
47
- }, [])
48
-
49
- return <button ref={ref}>Hover me</button>
50
- }
70
+ ### Motion (v1.2.0) 🆕
71
+ ```js
72
+ spark.parallax({ depth: 0.5, trigger: 'scroll' })
73
+ spark.float({ distance: 10, rotate: true })
74
+ spark.flip3d({ direction: 'horizontal' })
75
+ spark.swing({ angle: 15, damping: true })
76
+ spark.orbit({ radius: 50, tilt: true })
51
77
  ```
52
78
 
53
- ## All 32+ Effects
79
+ ### Scroll (v1.2.0) 🆕
80
+ ```js
81
+ spark.reveal({ animation: 'fade-up', threshold: 0.2 })
82
+ spark.counter({ from: 0, to: 1000, duration: 2000 })
83
+ ```
54
84
 
55
- **Basic:** bounce, pulse, lift, scale, shake, fade, slide, rotate
85
+ ### Visual
86
+ ```js
87
+ spark.aurora({ colors: ['#00ffa3', '#00d4ff'] })
88
+ spark.matrix({ color: '#00ff00', speed: 5 })
89
+ spark.rainbow({ type: 'text' })
90
+ spark.neon() spark.glass() spark.glitch()
91
+ ```
56
92
 
57
- **Advanced:** glow, ripple, magnetic, tilt, elastic, jelly, rubber, morph
93
+ ### Celebration
94
+ ```js
95
+ spark.confetti() spark.sparkle()
96
+ spark.firework() spark.celebrate()
97
+ ```
58
98
 
59
- **Visual:** glitch, blur, neon, glass, shimmer, gradient, spotlight, hologram
99
+ ### Text
100
+ ```js
101
+ spark.typewriter({ speed: 50 })
102
+ spark.scramble() spark.wave()
103
+ spark.highlight()
104
+ ```
105
+
106
+ ## API Utilities
107
+
108
+ ```js
109
+ import { combine, sequence, stagger } from 'sparkfx'
110
+
111
+ // Combine effects
112
+ combine([spark.glow(), spark.bounce()])
113
+
114
+ // Sequence animations
115
+ sequence(element, [
116
+ { effect: spark.fade(), delay: 0 },
117
+ { effect: spark.bounce(), delay: 200 }
118
+ ])
119
+
120
+ // Stagger elements
121
+ stagger('.cards', spark.reveal(), { delay: 100 })
122
+ ```
123
+
124
+ ## Integrations
60
125
 
61
- **Celebration:** confetti, sparkle, firework, celebrate
126
+ | Framework | Import |
127
+ |-----------|--------|
128
+ | Tailwind CSS | `sparkfx/tailwind` |
129
+ | Shadcn/ui | `sparkfx/shadcn` |
130
+ | Headless UI | `sparkfx/headless` |
131
+ | React | `sparkfx/react` |
132
+ | Vue | `sparkfx/vue` |
133
+ | Svelte | `sparkfx/svelte` |
134
+ | Next.js | `sparkfx/next` |
62
135
 
63
- **Text:** typewriter, scramble, wave, highlight
136
+ ### Tailwind Plugin
137
+ ```js
138
+ // tailwind.config.js
139
+ plugins: [require('sparkfx/tailwind')]
140
+ ```
141
+ ```html
142
+ <button class="spark-bounce hover:spark-glow">Click</button>
143
+ ```
64
144
 
65
- ## Customization
145
+ ## Configuration
66
146
 
67
147
  ```js
68
- spark.glow({ color: '#ff0', spread: 30, duration: 500 })
69
- spark.tilt({ angle: 20, glare: true })
70
- spark.confetti({ colors: ['#ff0', '#0ff'], particleCount: 50 })
148
+ import { config } from 'sparkfx'
149
+
150
+ config({
151
+ defaultDuration: 400,
152
+ theme: 'dark',
153
+ gpuAcceleration: true,
154
+ respectMotionPreference: true
155
+ })
71
156
  ```
72
157
 
73
- ## Frameworks
158
+ ## Presets
159
+
160
+ ```js
161
+ import { presets } from 'sparkfx'
74
162
 
75
- Works with React, Vue, Svelte, Next.js, or plain JS.
163
+ presets.gaming.classes // 'spark-neon spark-glitch spark-glow'
164
+ presets.minimal.classes // 'spark-lift spark-fade spark-scale'
165
+ presets.playful.classes // 'spark-bounce spark-jelly spark-elastic'
166
+ ```
76
167
 
77
168
  ---
78
169
 
79
- MIT · [mrLynchs](https://github.com/mrLynchs)
170
+ <p align="center">MIT © <a href="https://github.com/mrLynchs">mrLynchs</a></p>
Binary file
@@ -0,0 +1,3 @@
1
+ 'use strict';var chunkH7FVY7R6_cjs=require('./chunk-H7FVY7R6.cjs'),react=require('react');/* sparkfx - Micro-interactions for modern web apps */
2
+ function k(l,c){let n=react.useRef(null);return react.useEffect(()=>{if(!n.current)return;let i=chunkH7FVY7R6_cjs.qa[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=chunkH7FVY7R6_cjs.qa[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-FLYBCRQ3.cjs.map
3
+ //# sourceMappingURL=chunk-FLYBCRQ3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":["useSpark","effectName","options","ref","useRef","useEffect","effectFn","spark","result","element","classes","key","value","cleanups","addEvent","name","handler","eventName","c","useSparkMultiple","effects","allCleanups","n","h","ev"],"mappings":"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","file":"chunk-TKPAWONZ.cjs","sourcesContent":["/**\r\n * sparkfx - React Adapter\r\n * Hooks and components for React integration\r\n */\r\n\r\nimport { useEffect, useRef, useMemo } from 'react'\r\nimport { spark } from '../index'\r\nimport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\nimport clsx from 'clsx'\r\n\r\n/**\r\n * Hook to apply a single spark effect to a ref\r\n * @param effectName Name of the effect to apply\r\n * @param options Effect options\r\n * @returns React ref to attach to the target element\r\n */\r\nexport function useSpark<T extends HTMLElement = HTMLElement>(\r\n effectName: SparkEffectName,\r\n options?: SparkBaseOptions\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n\r\n // Apply the effect\r\n const effectFn = (spark as any)[effectName]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n const element = ref.current\r\n\r\n // Apply class\r\n if (result.className) {\r\n const classes = result.className.split(' ')\r\n element.classList.add(...classes)\r\n }\r\n\r\n // Apply styles\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n // Apply events\r\n const cleanups: (() => void)[] = []\r\n\r\n const addEvent = (name: string, handler?: (e: any) => void) => {\r\n if (!handler) return\r\n const eventName = name.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(eventName, handler)\r\n cleanups.push(() => element.removeEventListener(eventName, handler))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n addEvent('focus', result.onFocus)\r\n addEvent('blur', result.onBlur)\r\n\r\n return () => {\r\n cleanups.forEach(c => c())\r\n if (result.destroy) result.destroy()\r\n if (result.className) {\r\n element.classList.remove(...result.className.split(' '))\r\n }\r\n }\r\n }, [effectName, JSON.stringify(options)])\r\n\r\n return ref\r\n}\r\n\r\n/**\r\n * Hook for multiple effects\r\n */\r\nexport function useSparkMultiple<T extends HTMLElement = HTMLElement>(\r\n effects: { name: SparkEffectName; options?: SparkBaseOptions }[]\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n if (!ref.current) return\r\n const element = ref.current\r\n const allCleanups: (() => void)[] = []\r\n\r\n effects.forEach(({ name, options }) => {\r\n const effectFn = (spark as any)[name]\r\n if (typeof effectFn !== 'function') return\r\n\r\n const result = effectFn(options) as SparkResult\r\n\r\n if (result.className) {\r\n element.classList.add(...result.className.split(' '))\r\n }\r\n\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n element.style.setProperty(key, String(value))\r\n })\r\n }\r\n\r\n const addEvent = (n: string, h?: (e: any) => void) => {\r\n if (!h) return\r\n const ev = n.replace(/^on/, '').toLowerCase()\r\n element.addEventListener(ev, h)\r\n allCleanups.push(() => element.removeEventListener(ev, h))\r\n }\r\n\r\n addEvent('mouseenter', result.onMouseEnter)\r\n addEvent('mouseleave', result.onMouseLeave)\r\n addEvent('mousemove', result.onMouseMove)\r\n addEvent('click', result.onClick)\r\n\r\n allCleanups.push(() => {\r\n if (result.destroy) result.destroy()\r\n if (result.className) element.classList.remove(...result.className.split(' '))\r\n })\r\n })\r\n\r\n return () => allCleanups.forEach(c => c())\r\n }, [JSON.stringify(effects)])\r\n\r\n return ref\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":["useSpark","effectName","options","ref","useRef","useEffect","effectFn","spark","result","element","classes","key","value","cleanups","addEvent","name","handler","eventName","c","useSparkMultiple","effects","allCleanups","n","h","ev"],"mappings":"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","file":"chunk-FLYBCRQ3.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"]}