sparkfx 1.1.6 → 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 (47) hide show
  1. package/README.md +119 -49
  2. package/assets/logo.png +0 -0
  3. package/dist/chunk-FLYBCRQ3.cjs +3 -0
  4. package/dist/{chunk-E3WZRDLT.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-45SWBQ32.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/index.cjs +1 -1
  12. package/dist/index.d.cts +638 -5
  13. package/dist/index.d.ts +638 -5
  14. package/dist/index.js +1 -1
  15. package/dist/next.cjs +2 -2
  16. package/dist/next.d.cts +1 -1
  17. package/dist/next.d.ts +1 -1
  18. package/dist/next.js +1 -1
  19. package/dist/react.cjs +1 -1
  20. package/dist/react.d.cts +1 -1
  21. package/dist/react.d.ts +1 -1
  22. package/dist/react.js +1 -1
  23. package/dist/shadcn.cjs +2 -2
  24. package/dist/shadcn.cjs.map +1 -1
  25. package/dist/shadcn.js +2 -2
  26. package/dist/shadcn.js.map +1 -1
  27. package/dist/svelte.cjs +2 -2
  28. package/dist/svelte.cjs.map +1 -1
  29. package/dist/svelte.d.cts +1 -1
  30. package/dist/svelte.d.ts +1 -1
  31. package/dist/svelte.js +2 -2
  32. package/dist/svelte.js.map +1 -1
  33. package/dist/{types-CPIaNxrw.d.cts → types-DcIJCxh2.d.cts} +14 -10
  34. package/dist/{types-CPIaNxrw.d.ts → types-DcIJCxh2.d.ts} +14 -10
  35. package/dist/vue.cjs +2 -2
  36. package/dist/vue.cjs.map +1 -1
  37. package/dist/vue.d.cts +1 -1
  38. package/dist/vue.d.ts +1 -1
  39. package/dist/vue.js +2 -2
  40. package/dist/vue.js.map +1 -1
  41. package/package.json +3 -2
  42. package/dist/chunk-45SWBQ32.js +0 -3
  43. package/dist/chunk-7YE6KXPQ.cjs +0 -435
  44. package/dist/chunk-7YE6KXPQ.cjs.map +0 -1
  45. package/dist/chunk-E3WZRDLT.cjs +0 -3
  46. package/dist/chunk-VO7RLQIA.js +0 -435
  47. package/dist/chunk-VO7RLQIA.js.map +0 -1
package/README.md CHANGED
@@ -1,100 +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
- ## Tailwind CSS Plugin
61
+ ## Effects
34
62
 
63
+ ### Basic
35
64
  ```js
36
- // tailwind.config.js
37
- module.exports = {
38
- plugins: [require('sparkfx/tailwind')]
39
- }
65
+ spark.bounce() spark.pulse() spark.lift()
66
+ spark.scale() spark.shake() spark.fade()
67
+ spark.slide() spark.rotate()
40
68
  ```
41
69
 
42
- ```html
43
- <button class="spark-bounce hover:spark-glow">Click me</button>
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 })
44
77
  ```
45
78
 
46
- ## Shadcn/ui Components
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
+ ```
84
+
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
+ ```
47
92
 
48
- ```tsx
49
- import { SparkButton, SparkCard } from 'sparkfx/shadcn'
93
+ ### Celebration
94
+ ```js
95
+ spark.confetti() spark.sparkle()
96
+ spark.firework() spark.celebrate()
97
+ ```
50
98
 
51
- <SparkButton effect="glow">Click me</SparkButton>
52
- <SparkCard effect="tilt">Card content</SparkCard>
99
+ ### Text
100
+ ```js
101
+ spark.typewriter({ speed: 50 })
102
+ spark.scramble() spark.wave()
103
+ spark.highlight()
53
104
  ```
54
105
 
55
- ## Headless UI Integration
106
+ ## API Utilities
107
+
108
+ ```js
109
+ import { combine, sequence, stagger } from 'sparkfx'
56
110
 
57
- ```tsx
58
- import { Transition } from '@headlessui/react'
59
- import { useSparkTransition } from 'sparkfx/headless'
111
+ // Combine effects
112
+ combine([spark.glow(), spark.bounce()])
60
113
 
61
- const transition = useSparkTransition('slide-up')
114
+ // Sequence animations
115
+ sequence(element, [
116
+ { effect: spark.fade(), delay: 0 },
117
+ { effect: spark.bounce(), delay: 200 }
118
+ ])
62
119
 
63
- <Transition show={isOpen} {...transition}>
64
- <Dialog.Panel>Content</Dialog.Panel>
65
- </Transition>
120
+ // Stagger elements
121
+ stagger('.cards', spark.reveal(), { delay: 100 })
66
122
  ```
67
123
 
68
- ## All 32+ Effects
124
+ ## Integrations
69
125
 
70
- | Category | Effects |
71
- |----------|---------|
72
- | **Basic** | bounce, pulse, lift, scale, shake, fade, slide, rotate |
73
- | **Advanced** | glow, ripple, magnetic, tilt, elastic, jelly, rubber, morph |
74
- | **Visual** | glitch, blur, neon, glass, shimmer, gradient, spotlight, hologram |
75
- | **Celebration** | confetti, sparkle, firework, celebrate |
76
- | **Text** | typewriter, scramble, wave, highlight |
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` |
135
+
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
+ ```
77
144
 
78
- ## Integrations
145
+ ## Configuration
79
146
 
80
- | Integration | Status | Usage |
81
- |-------------|--------|-------|
82
- | **Tailwind CSS** | ✅ | `sparkfx/tailwind` |
83
- | **Shadcn/ui** | ✅ | `sparkfx/shadcn` |
84
- | **Headless UI** | ✅ | `sparkfx/headless` |
85
- | **React** | ✅ | `sparkfx/react` |
86
- | **Vue** | ✅ | `sparkfx/vue` |
87
- | **Svelte** | ✅ | `sparkfx/svelte` |
88
- | **Next.js** | ✅ | `sparkfx/next` |
147
+ ```js
148
+ import { config } from 'sparkfx'
149
+
150
+ config({
151
+ defaultDuration: 400,
152
+ theme: 'dark',
153
+ gpuAcceleration: true,
154
+ respectMotionPreference: true
155
+ })
156
+ ```
89
157
 
90
- ## Customization
158
+ ## Presets
91
159
 
92
160
  ```js
93
- spark.glow({ color: '#ff0', spread: 30, duration: 500 })
94
- spark.tilt({ angle: 20, glare: true })
95
- spark.confetti({ colors: ['#ff0', '#0ff'], particleCount: 50 })
161
+ import { presets } from 'sparkfx'
162
+
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'
96
166
  ```
97
167
 
98
168
  ---
99
169
 
100
- 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-E3WZRDLT.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"]}