sparkfx 1.0.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/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/chunk-5QFFUSHL.js +326 -0
- package/dist/chunk-5QFFUSHL.js.map +1 -0
- package/dist/chunk-AMLWVX5A.cjs +326 -0
- package/dist/chunk-AMLWVX5A.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/next.cjs +3 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.js +3 -0
- package/dist/next.js.map +1 -0
- package/dist/react.cjs +3 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/svelte.cjs +3 -0
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.js +3 -0
- package/dist/svelte.js.map +1 -0
- package/dist/vue.cjs +3 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.js +3 -0
- package/dist/vue.js.map +1 -0
- package/package.json +93 -0
package/dist/vue.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vue.ts"],"names":["useSpark","effect","options","elementRef","ref","cleanup","onMounted","element","effectFn","spark","result","cls","key","value","handlers","handler","event","onUnmounted","vSpark","el","binding","config","_"],"mappings":"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","file":"vue.cjs","sourcesContent":["/**\r\n * @lynch/spark - Vue Adapter\r\n * Composables and directives for using spark effects in Vue components\r\n */\r\n\r\nimport { ref, onMounted, onUnmounted, type Ref } from 'vue'\r\nimport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\nimport { spark } from '../index'\r\n\r\ntype SparkEffects = typeof spark\r\n\r\n/**\r\n * Vue composable for applying spark effects\r\n * @param effect - Effect name\r\n * @param options - Effect options\r\n * @returns Ref to attach to the element\r\n * \r\n * @example\r\n * const buttonRef = useSpark('bounce')\r\n * <button ref=\"buttonRef\">Click me</button>\r\n */\r\nexport function useSpark<T extends HTMLElement = HTMLElement>(\r\n effect: SparkEffectName,\r\n options?: SparkBaseOptions\r\n): Ref<T | null> {\r\n const elementRef = ref<T | null>(null)\r\n let cleanup: (() => void) | null = null\r\n\r\n onMounted(() => {\r\n const element = elementRef.value\r\n if (!element) return\r\n\r\n const effectFn = spark[effect as keyof SparkEffects]\r\n if (typeof effectFn !== 'function') {\r\n console.warn(`@lynch/spark: Effect \"${effect}\" not found`)\r\n return\r\n }\r\n\r\n const result = (effectFn as (opts?: SparkBaseOptions) => SparkResult)(options)\r\n\r\n // Apply className\r\n if (result.className) {\r\n result.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\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, value)\r\n })\r\n }\r\n\r\n // Attach event handlers\r\n const handlers: Array<[string, (e: Event) => void]> = []\r\n\r\n if (result.onMouseEnter) {\r\n const handler = result.onMouseEnter as (e: Event) => void\r\n element.addEventListener('mouseenter', handler)\r\n handlers.push(['mouseenter', handler])\r\n }\r\n if (result.onMouseLeave) {\r\n const handler = result.onMouseLeave as (e: Event) => void\r\n element.addEventListener('mouseleave', handler)\r\n handlers.push(['mouseleave', handler])\r\n }\r\n if (result.onMouseMove) {\r\n const handler = result.onMouseMove as (e: Event) => void\r\n element.addEventListener('mousemove', handler)\r\n handlers.push(['mousemove', handler])\r\n }\r\n if (result.onClick) {\r\n const handler = result.onClick as (e: Event) => void\r\n element.addEventListener('click', handler)\r\n handlers.push(['click', handler])\r\n }\r\n\r\n cleanup = () => {\r\n handlers.forEach(([event, handler]) => {\r\n element.removeEventListener(event, handler)\r\n })\r\n if (result.destroy) result.destroy()\r\n }\r\n })\r\n\r\n onUnmounted(() => {\r\n if (cleanup) cleanup()\r\n })\r\n\r\n return elementRef\r\n}\r\n\r\n/**\r\n * Vue directive for spark effects\r\n * @example\r\n * <button v-spark=\"'bounce'\">Click me</button>\r\n * <button v-spark=\"{ effect: 'tilt', angle: 20 }\">Tilt me</button>\r\n */\r\nexport const vSpark = {\r\n mounted(\r\n el: HTMLElement,\r\n binding: { value: SparkEffectName | { effect: SparkEffectName;[key: string]: unknown } }\r\n ) {\r\n const config = typeof binding.value === 'string'\r\n ? { effect: binding.value }\r\n : binding.value\r\n\r\n const effectFn = spark[config.effect as keyof SparkEffects]\r\n if (typeof effectFn !== 'function') {\r\n console.warn(`@lynch/spark: Effect \"${config.effect}\" not found`)\r\n return\r\n }\r\n\r\n const { effect: _, ...options } = config\r\n const result = (effectFn as (opts?: SparkBaseOptions) => SparkResult)(options as SparkBaseOptions)\r\n\r\n // Store cleanup for unmount\r\n const handlers: Array<[string, (e: Event) => void]> = []\r\n\r\n // Apply className\r\n if (result.className) {\r\n result.className.split(' ').forEach(cls => {\r\n if (cls) el.classList.add(cls)\r\n })\r\n }\r\n\r\n // Apply styles\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n el.style.setProperty(key, value)\r\n })\r\n }\r\n\r\n // Attach handlers\r\n if (result.onMouseEnter) {\r\n const handler = result.onMouseEnter as (e: Event) => void\r\n el.addEventListener('mouseenter', handler)\r\n handlers.push(['mouseenter', handler])\r\n }\r\n if (result.onMouseLeave) {\r\n const handler = result.onMouseLeave as (e: Event) => void\r\n el.addEventListener('mouseleave', handler)\r\n handlers.push(['mouseleave', handler])\r\n }\r\n if (result.onMouseMove) {\r\n const handler = result.onMouseMove as (e: Event) => void\r\n el.addEventListener('mousemove', handler)\r\n handlers.push(['mousemove', handler])\r\n }\r\n if (result.onClick) {\r\n const handler = result.onClick as (e: Event) => void\r\n el.addEventListener('click', handler)\r\n handlers.push(['click', handler])\r\n }\r\n\r\n // Store for cleanup\r\n (el as HTMLElement & { _sparkCleanup?: () => void })._sparkCleanup = () => {\r\n handlers.forEach(([event, handler]) => {\r\n el.removeEventListener(event, handler)\r\n })\r\n if (result.destroy) result.destroy()\r\n }\r\n },\r\n\r\n unmounted(el: HTMLElement & { _sparkCleanup?: () => void }) {\r\n if (el._sparkCleanup) {\r\n el._sparkCleanup()\r\n delete el._sparkCleanup\r\n }\r\n }\r\n}\r\n\r\n// Re-export spark for convenience\r\nexport { spark } from '../index'\r\nexport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\n"]}
|
package/dist/vue.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {J}from'./chunk-5QFFUSHL.js';export{J as spark}from'./chunk-5QFFUSHL.js';import {ref,onMounted,onUnmounted}from'vue';// @lynch/spark - Premium Micro-Interactions
|
|
2
|
+
function E(s,p){let r=ref(null),f=null;return onMounted(()=>{let o=r.value;if(!o)return;let i=J[s];if(typeof i!="function"){console.warn(`@lynch/spark: Effect "${s}" not found`);return}let t=i(p);t.className&&t.className.split(" ").forEach(e=>{e&&o.classList.add(e);}),t.style&&Object.entries(t.style).forEach(([e,a])=>{o.style.setProperty(e,a);});let n=[];if(t.onMouseEnter){let e=t.onMouseEnter;o.addEventListener("mouseenter",e),n.push(["mouseenter",e]);}if(t.onMouseLeave){let e=t.onMouseLeave;o.addEventListener("mouseleave",e),n.push(["mouseleave",e]);}if(t.onMouseMove){let e=t.onMouseMove;o.addEventListener("mousemove",e),n.push(["mousemove",e]);}if(t.onClick){let e=t.onClick;o.addEventListener("click",e),n.push(["click",e]);}f=()=>{n.forEach(([e,a])=>{o.removeEventListener(e,a);}),t.destroy&&t.destroy();};}),onUnmounted(()=>{f&&f();}),r}var k={mounted(s,p){let r=typeof p.value=="string"?{effect:p.value}:p.value,f=J[r.effect];if(typeof f!="function"){console.warn(`@lynch/spark: Effect "${r.effect}" not found`);return}let{effect:o,...i}=r,t=f(i),n=[];if(t.className&&t.className.split(" ").forEach(e=>{e&&s.classList.add(e);}),t.style&&Object.entries(t.style).forEach(([e,a])=>{s.style.setProperty(e,a);}),t.onMouseEnter){let e=t.onMouseEnter;s.addEventListener("mouseenter",e),n.push(["mouseenter",e]);}if(t.onMouseLeave){let e=t.onMouseLeave;s.addEventListener("mouseleave",e),n.push(["mouseleave",e]);}if(t.onMouseMove){let e=t.onMouseMove;s.addEventListener("mousemove",e),n.push(["mousemove",e]);}if(t.onClick){let e=t.onClick;s.addEventListener("click",e),n.push(["click",e]);}s._sparkCleanup=()=>{n.forEach(([e,a])=>{s.removeEventListener(e,a);}),t.destroy&&t.destroy();};},unmounted(s){s._sparkCleanup&&(s._sparkCleanup(),delete s._sparkCleanup);}};export{E as useSpark,k as vSpark};//# sourceMappingURL=vue.js.map
|
|
3
|
+
//# sourceMappingURL=vue.js.map
|
package/dist/vue.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vue.ts"],"names":["useSpark","effect","options","elementRef","ref","cleanup","onMounted","element","effectFn","spark","result","cls","key","value","handlers","handler","event","onUnmounted","vSpark","el","binding","config","_"],"mappings":"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","file":"vue.js","sourcesContent":["/**\r\n * @lynch/spark - Vue Adapter\r\n * Composables and directives for using spark effects in Vue components\r\n */\r\n\r\nimport { ref, onMounted, onUnmounted, type Ref } from 'vue'\r\nimport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\nimport { spark } from '../index'\r\n\r\ntype SparkEffects = typeof spark\r\n\r\n/**\r\n * Vue composable for applying spark effects\r\n * @param effect - Effect name\r\n * @param options - Effect options\r\n * @returns Ref to attach to the element\r\n * \r\n * @example\r\n * const buttonRef = useSpark('bounce')\r\n * <button ref=\"buttonRef\">Click me</button>\r\n */\r\nexport function useSpark<T extends HTMLElement = HTMLElement>(\r\n effect: SparkEffectName,\r\n options?: SparkBaseOptions\r\n): Ref<T | null> {\r\n const elementRef = ref<T | null>(null)\r\n let cleanup: (() => void) | null = null\r\n\r\n onMounted(() => {\r\n const element = elementRef.value\r\n if (!element) return\r\n\r\n const effectFn = spark[effect as keyof SparkEffects]\r\n if (typeof effectFn !== 'function') {\r\n console.warn(`@lynch/spark: Effect \"${effect}\" not found`)\r\n return\r\n }\r\n\r\n const result = (effectFn as (opts?: SparkBaseOptions) => SparkResult)(options)\r\n\r\n // Apply className\r\n if (result.className) {\r\n result.className.split(' ').forEach(cls => {\r\n if (cls) element.classList.add(cls)\r\n })\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, value)\r\n })\r\n }\r\n\r\n // Attach event handlers\r\n const handlers: Array<[string, (e: Event) => void]> = []\r\n\r\n if (result.onMouseEnter) {\r\n const handler = result.onMouseEnter as (e: Event) => void\r\n element.addEventListener('mouseenter', handler)\r\n handlers.push(['mouseenter', handler])\r\n }\r\n if (result.onMouseLeave) {\r\n const handler = result.onMouseLeave as (e: Event) => void\r\n element.addEventListener('mouseleave', handler)\r\n handlers.push(['mouseleave', handler])\r\n }\r\n if (result.onMouseMove) {\r\n const handler = result.onMouseMove as (e: Event) => void\r\n element.addEventListener('mousemove', handler)\r\n handlers.push(['mousemove', handler])\r\n }\r\n if (result.onClick) {\r\n const handler = result.onClick as (e: Event) => void\r\n element.addEventListener('click', handler)\r\n handlers.push(['click', handler])\r\n }\r\n\r\n cleanup = () => {\r\n handlers.forEach(([event, handler]) => {\r\n element.removeEventListener(event, handler)\r\n })\r\n if (result.destroy) result.destroy()\r\n }\r\n })\r\n\r\n onUnmounted(() => {\r\n if (cleanup) cleanup()\r\n })\r\n\r\n return elementRef\r\n}\r\n\r\n/**\r\n * Vue directive for spark effects\r\n * @example\r\n * <button v-spark=\"'bounce'\">Click me</button>\r\n * <button v-spark=\"{ effect: 'tilt', angle: 20 }\">Tilt me</button>\r\n */\r\nexport const vSpark = {\r\n mounted(\r\n el: HTMLElement,\r\n binding: { value: SparkEffectName | { effect: SparkEffectName;[key: string]: unknown } }\r\n ) {\r\n const config = typeof binding.value === 'string'\r\n ? { effect: binding.value }\r\n : binding.value\r\n\r\n const effectFn = spark[config.effect as keyof SparkEffects]\r\n if (typeof effectFn !== 'function') {\r\n console.warn(`@lynch/spark: Effect \"${config.effect}\" not found`)\r\n return\r\n }\r\n\r\n const { effect: _, ...options } = config\r\n const result = (effectFn as (opts?: SparkBaseOptions) => SparkResult)(options as SparkBaseOptions)\r\n\r\n // Store cleanup for unmount\r\n const handlers: Array<[string, (e: Event) => void]> = []\r\n\r\n // Apply className\r\n if (result.className) {\r\n result.className.split(' ').forEach(cls => {\r\n if (cls) el.classList.add(cls)\r\n })\r\n }\r\n\r\n // Apply styles\r\n if (result.style) {\r\n Object.entries(result.style).forEach(([key, value]) => {\r\n el.style.setProperty(key, value)\r\n })\r\n }\r\n\r\n // Attach handlers\r\n if (result.onMouseEnter) {\r\n const handler = result.onMouseEnter as (e: Event) => void\r\n el.addEventListener('mouseenter', handler)\r\n handlers.push(['mouseenter', handler])\r\n }\r\n if (result.onMouseLeave) {\r\n const handler = result.onMouseLeave as (e: Event) => void\r\n el.addEventListener('mouseleave', handler)\r\n handlers.push(['mouseleave', handler])\r\n }\r\n if (result.onMouseMove) {\r\n const handler = result.onMouseMove as (e: Event) => void\r\n el.addEventListener('mousemove', handler)\r\n handlers.push(['mousemove', handler])\r\n }\r\n if (result.onClick) {\r\n const handler = result.onClick as (e: Event) => void\r\n el.addEventListener('click', handler)\r\n handlers.push(['click', handler])\r\n }\r\n\r\n // Store for cleanup\r\n (el as HTMLElement & { _sparkCleanup?: () => void })._sparkCleanup = () => {\r\n handlers.forEach(([event, handler]) => {\r\n el.removeEventListener(event, handler)\r\n })\r\n if (result.destroy) result.destroy()\r\n }\r\n },\r\n\r\n unmounted(el: HTMLElement & { _sparkCleanup?: () => void }) {\r\n if (el._sparkCleanup) {\r\n el._sparkCleanup()\r\n delete el._sparkCleanup\r\n }\r\n }\r\n}\r\n\r\n// Re-export spark for convenience\r\nexport { spark } from '../index'\r\nexport type { SparkEffectName, SparkBaseOptions, SparkResult } from '../core/types'\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sparkfx",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Premium micro-interactions for modern web applications. Zero dependencies, framework-agnostic.",
|
|
5
|
+
"author": "Lynch",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./react": {
|
|
18
|
+
"import": "./dist/react.js",
|
|
19
|
+
"require": "./dist/react.cjs",
|
|
20
|
+
"types": "./dist/react.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./vue": {
|
|
23
|
+
"import": "./dist/vue.js",
|
|
24
|
+
"require": "./dist/vue.cjs",
|
|
25
|
+
"types": "./dist/vue.d.ts"
|
|
26
|
+
},
|
|
27
|
+
"./svelte": {
|
|
28
|
+
"import": "./dist/svelte.js",
|
|
29
|
+
"require": "./dist/svelte.cjs",
|
|
30
|
+
"types": "./dist/svelte.d.ts"
|
|
31
|
+
},
|
|
32
|
+
"./next": {
|
|
33
|
+
"import": "./dist/next.js",
|
|
34
|
+
"require": "./dist/next.cjs",
|
|
35
|
+
"types": "./dist/next.d.ts"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"test": "vitest",
|
|
45
|
+
"test:coverage": "vitest --coverage",
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
48
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
49
|
+
"prepublishOnly": "npm run build"
|
|
50
|
+
},
|
|
51
|
+
"keywords": [
|
|
52
|
+
"micro-interactions",
|
|
53
|
+
"animations",
|
|
54
|
+
"effects",
|
|
55
|
+
"ui",
|
|
56
|
+
"react",
|
|
57
|
+
"vue",
|
|
58
|
+
"svelte",
|
|
59
|
+
"nextjs",
|
|
60
|
+
"typescript",
|
|
61
|
+
"hover",
|
|
62
|
+
"click",
|
|
63
|
+
"transitions"
|
|
64
|
+
],
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/node": "^20.10.0",
|
|
67
|
+
"eslint": "^8.55.0",
|
|
68
|
+
"prettier": "^3.1.0",
|
|
69
|
+
"tsup": "^8.0.1",
|
|
70
|
+
"typescript": "^5.3.0",
|
|
71
|
+
"vitest": "^1.0.0"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"react": ">=18.0.0",
|
|
75
|
+
"vue": ">=3.0.0",
|
|
76
|
+
"svelte": ">=4.0.0"
|
|
77
|
+
},
|
|
78
|
+
"peerDependenciesMeta": {
|
|
79
|
+
"react": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
82
|
+
"vue": {
|
|
83
|
+
"optional": true
|
|
84
|
+
},
|
|
85
|
+
"svelte": {
|
|
86
|
+
"optional": true
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"engines": {
|
|
90
|
+
"node": ">=20.0.0"
|
|
91
|
+
},
|
|
92
|
+
"sideEffects": false
|
|
93
|
+
}
|