@thednp/tween 0.0.4 → 0.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/AGENTS.md +112 -0
- package/CHANGELOG.md +96 -0
- package/README.md +3 -1
- package/dist/preact/preact.d.mts +1 -1
- package/dist/preact/preact.mjs +3 -5
- package/dist/preact/preact.mjs.map +1 -1
- package/dist/react/react.d.mts +1 -1
- package/dist/react/react.mjs +3 -5
- package/dist/react/react.mjs.map +1 -1
- package/dist/solid/solid.d.mts +1 -1
- package/dist/solid/solid.mjs +2 -4
- package/dist/solid/solid.mjs.map +1 -1
- package/dist/svelte/svelte.mjs.map +1 -1
- package/dist/svelte/tween.svelte.d.ts +1 -1
- package/dist/svelte/tween.svelte.js +2 -4
- package/dist/tween/index.d.mts +4 -18
- package/dist/tween/index.d.mts.map +1 -1
- package/dist/tween/index.mjs +22 -68
- package/dist/tween/index.mjs.map +1 -1
- package/dist/tween.min.js +4 -4
- package/dist/tween.min.js.map +1 -1
- package/dist/vanjs/vanjs.d.mts +56 -0
- package/dist/vanjs/vanjs.d.mts.map +1 -0
- package/dist/vanjs/vanjs.mjs +234 -0
- package/dist/vanjs/vanjs.mjs.map +1 -0
- package/dist/vue/vue.d.mts +1 -1
- package/dist/vue/vue.mjs +2 -4
- package/dist/vue/vue.mjs.map +1 -1
- package/package.json +25 -16
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @thednp/tween primitives for VanJS v0.1.0 (https://github.com/thednp/tween)
|
|
3
|
+
* Copyright 2026 © thednp
|
|
4
|
+
* Licensed under MIT (https://github.com/thednp/tween/blob/master/LICENSE)
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
import { Timeline, Tween, TweenProps } from "@thednp/tween";
|
|
9
|
+
|
|
10
|
+
//#region src/vanjs/miniStore.d.ts
|
|
11
|
+
declare function miniStore<T extends TweenProps>(init: T): T;
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/vanjs/index.d.ts
|
|
14
|
+
/**
|
|
15
|
+
* VanJS primitive for updating values with Tween.
|
|
16
|
+
*
|
|
17
|
+
* Automatically stops the tween when all bound DOM nodes are removed
|
|
18
|
+
* (leveraging a global MutationObserver that monitors state bindings).
|
|
19
|
+
*
|
|
20
|
+
* @param initialValues - Initial tween values
|
|
21
|
+
* @returns [store, tween] Tuple of reactive store and Tween instance
|
|
22
|
+
* @example
|
|
23
|
+
* const App = () => {
|
|
24
|
+
* const [state, tween] = createTween({ x: 0 })
|
|
25
|
+
* tween.to({ x: 100 }).duration(1)
|
|
26
|
+
*
|
|
27
|
+
* return div(
|
|
28
|
+
* { style: () => `translate: ${state.x}px` },
|
|
29
|
+
* "Animated"
|
|
30
|
+
* )
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
declare function createTween<T extends TweenProps>(initialValues: T): readonly [T, Tween<T>];
|
|
34
|
+
/**
|
|
35
|
+
* VanJS primitive for sequencing values update with Timeline.
|
|
36
|
+
*
|
|
37
|
+
* Automatically stops the timeline when all bound DOM nodes are removed
|
|
38
|
+
* (leveraging a global MutationObserver that monitors state bindings).
|
|
39
|
+
*
|
|
40
|
+
* @param initialValues - Initial tween values
|
|
41
|
+
* @returns [store, timeline] Tuple of reactive store and Timeline instance
|
|
42
|
+
* @example
|
|
43
|
+
* const App = () => {
|
|
44
|
+
* const [state, timeline] = createTimeline({ x: 0, y: 0 })
|
|
45
|
+
* timeline.to({ x: 100, y: 100 }).duration(2)
|
|
46
|
+
*
|
|
47
|
+
* return div(
|
|
48
|
+
* { style: () => `translate: ${state.x}px ${state.y}px` },
|
|
49
|
+
* "Animated"
|
|
50
|
+
* )
|
|
51
|
+
* }
|
|
52
|
+
*/
|
|
53
|
+
declare function createTimeline<T extends TweenProps>(initialValues: T): readonly [T, Timeline<T>];
|
|
54
|
+
//#endregion
|
|
55
|
+
export { Timeline, Tween, createTimeline, createTween, miniStore };
|
|
56
|
+
//# sourceMappingURL=vanjs.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vanjs.d.mts","names":[],"sources":["../../src/vanjs/miniStore.ts","../../src/vanjs/index.ts"],"mappings":";;;;;;;;;;iBA2IgB,SAAA,WAAoB,UAAA,CAAA,CAAY,IAAA,EAAM,CAAA,GAChB,CAAA;;;AADtC;;;;;;;;;;;;;;;;;;AC5GA;AD4GA,iBC5GgB,WAAA,WAAsB,UAAA,CAAA,CAAY,aAAA,EAAe,CAAA,aAAC,CAAA,EAAA,KAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;AAgClE;;iBAAgB,cAAA,WAAyB,UAAA,CAAA,CAAY,aAAA,EAAe,CAAA,aAAC,CAAA,EAAA,QAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @thednp/tween primitives for VanJS v0.1.0 (https://github.com/thednp/tween)
|
|
3
|
+
* Copyright 2026 © thednp
|
|
4
|
+
* Licensed under MIT (https://github.com/thednp/tween/blob/master/LICENSE)
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
import { Timeline, Tween, dummyInstance, isArray, isPlainObject, isServer, objectHasProp } from "@thednp/tween";
|
|
9
|
+
import van from "vanjs-core";
|
|
10
|
+
//#region src/vanjs/lifecycle.ts
|
|
11
|
+
const instances = /* @__PURE__ */ new Set();
|
|
12
|
+
let observer = null;
|
|
13
|
+
let sessionId = 0;
|
|
14
|
+
const sessionStates = /* @__PURE__ */ new Map();
|
|
15
|
+
function vanState(initial) {
|
|
16
|
+
const stateObj = van.state(initial);
|
|
17
|
+
sessionStates.get(sessionId)?.push(stateObj);
|
|
18
|
+
return stateObj;
|
|
19
|
+
}
|
|
20
|
+
function checkRemovedBindings() {
|
|
21
|
+
for (const instance of instances) {
|
|
22
|
+
if (!instance.isPlaying) {
|
|
23
|
+
instances.delete(instance);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
let hasActiveBinding = false;
|
|
27
|
+
for (const state of instance.states) {
|
|
28
|
+
const bindings = state._bindings;
|
|
29
|
+
if (bindings?.length) {
|
|
30
|
+
for (const b of bindings) if (b._dom?.isConnected) {
|
|
31
|
+
hasActiveBinding = true;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (hasActiveBinding) break;
|
|
36
|
+
}
|
|
37
|
+
if (!hasActiveBinding) {
|
|
38
|
+
instance.stop();
|
|
39
|
+
instances.delete(instance);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function initObserver() {
|
|
44
|
+
if (observer) return;
|
|
45
|
+
observer = new MutationObserver((mutations) => {
|
|
46
|
+
for (const m of mutations) if (m.removedNodes.length) checkRemovedBindings();
|
|
47
|
+
});
|
|
48
|
+
observer.observe(document.body, {
|
|
49
|
+
childList: true,
|
|
50
|
+
subtree: true
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function nextId() {
|
|
54
|
+
sessionId++;
|
|
55
|
+
sessionStates.set(sessionId, []);
|
|
56
|
+
return sessionId;
|
|
57
|
+
}
|
|
58
|
+
function mount(twObject, id) {
|
|
59
|
+
const states = sessionStates.get(id);
|
|
60
|
+
sessionStates.delete(id);
|
|
61
|
+
const instance = {
|
|
62
|
+
states,
|
|
63
|
+
stop: () => {
|
|
64
|
+
twObject.stop();
|
|
65
|
+
},
|
|
66
|
+
get isPlaying() {
|
|
67
|
+
return twObject.isPlaying;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const origStop = twObject.stop.bind(twObject);
|
|
71
|
+
twObject.stop = function() {
|
|
72
|
+
unmount(instance);
|
|
73
|
+
return origStop();
|
|
74
|
+
};
|
|
75
|
+
instances.add(instance);
|
|
76
|
+
initObserver();
|
|
77
|
+
}
|
|
78
|
+
function unmount(instance) {
|
|
79
|
+
instances.delete(instance);
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/vanjs/miniStore.ts
|
|
83
|
+
const STATE_PROXY = "_proxy";
|
|
84
|
+
const proxyProps = {
|
|
85
|
+
value: 1,
|
|
86
|
+
enumerable: false,
|
|
87
|
+
configurable: false,
|
|
88
|
+
writable: false
|
|
89
|
+
};
|
|
90
|
+
const STATES_KEY = "_states";
|
|
91
|
+
function defineArrayProxy(index, value, target, sourceLen, notifyListeners) {
|
|
92
|
+
const itemIsLast = index === sourceLen - 1;
|
|
93
|
+
if (isArray(value)) {
|
|
94
|
+
const subArray = [];
|
|
95
|
+
const valueLen = value.length;
|
|
96
|
+
value.forEach((itm, idx) => {
|
|
97
|
+
const subItemIsLast = itemIsLast && idx === valueLen - 1;
|
|
98
|
+
let currentItem = itm;
|
|
99
|
+
Object.defineProperty(subArray, idx, {
|
|
100
|
+
get: () => currentItem,
|
|
101
|
+
set: (newValue) => {
|
|
102
|
+
currentItem = newValue;
|
|
103
|
+
if (subItemIsLast) notifyListeners();
|
|
104
|
+
},
|
|
105
|
+
enumerable: true
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
target[index] = subArray;
|
|
109
|
+
} else {
|
|
110
|
+
let currentValue = value;
|
|
111
|
+
const getter = () => currentValue;
|
|
112
|
+
const setter = (newVal) => {
|
|
113
|
+
currentValue = newVal;
|
|
114
|
+
if (itemIsLast) notifyListeners();
|
|
115
|
+
};
|
|
116
|
+
Object.defineProperties(target, { [index]: {
|
|
117
|
+
get: getter,
|
|
118
|
+
set: setter,
|
|
119
|
+
enumerable: true
|
|
120
|
+
} });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function defineStateProxy(key, value, target) {
|
|
124
|
+
const stateObj = vanState(value);
|
|
125
|
+
let getter;
|
|
126
|
+
let setter;
|
|
127
|
+
if (isArray(value)) {
|
|
128
|
+
const arrayProxy = [];
|
|
129
|
+
const valLength = value.length;
|
|
130
|
+
const version = vanState(0);
|
|
131
|
+
for (let i = 0; i < valLength; i++) defineArrayProxy(i, value[i], arrayProxy, valLength, () => {
|
|
132
|
+
version.val = 1 - version.val;
|
|
133
|
+
});
|
|
134
|
+
getter = () => {
|
|
135
|
+
version.val;
|
|
136
|
+
return stateObj.val;
|
|
137
|
+
};
|
|
138
|
+
stateObj.val = arrayProxy;
|
|
139
|
+
} else {
|
|
140
|
+
getter = () => stateObj.val;
|
|
141
|
+
setter = (newVal) => {
|
|
142
|
+
stateObj.val = newVal;
|
|
143
|
+
};
|
|
144
|
+
stateObj.val = value;
|
|
145
|
+
}
|
|
146
|
+
Object.defineProperties(target, {
|
|
147
|
+
[STATE_PROXY]: proxyProps,
|
|
148
|
+
[key]: {
|
|
149
|
+
get: getter,
|
|
150
|
+
set: setter,
|
|
151
|
+
enumerable: true
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return stateObj;
|
|
155
|
+
}
|
|
156
|
+
function createMiniState(obj, parentReceiver) {
|
|
157
|
+
if (objectHasProp(obj, STATE_PROXY)) return obj;
|
|
158
|
+
const states = [];
|
|
159
|
+
for (const [key, value] of Object.entries(obj)) if (isPlainObject(value)) parentReceiver[key] = createMiniState(value, {});
|
|
160
|
+
else {
|
|
161
|
+
const stateObj = defineStateProxy(key, value, parentReceiver);
|
|
162
|
+
states.push(stateObj);
|
|
163
|
+
}
|
|
164
|
+
Object.defineProperty(parentReceiver, STATES_KEY, {
|
|
165
|
+
value: states,
|
|
166
|
+
enumerable: false,
|
|
167
|
+
configurable: false,
|
|
168
|
+
writable: false
|
|
169
|
+
});
|
|
170
|
+
return parentReceiver;
|
|
171
|
+
}
|
|
172
|
+
function miniStore(init) {
|
|
173
|
+
return createMiniState(init, {});
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/vanjs/index.ts
|
|
177
|
+
/**
|
|
178
|
+
* VanJS primitive for updating values with Tween.
|
|
179
|
+
*
|
|
180
|
+
* Automatically stops the tween when all bound DOM nodes are removed
|
|
181
|
+
* (leveraging a global MutationObserver that monitors state bindings).
|
|
182
|
+
*
|
|
183
|
+
* @param initialValues - Initial tween values
|
|
184
|
+
* @returns [store, tween] Tuple of reactive store and Tween instance
|
|
185
|
+
* @example
|
|
186
|
+
* const App = () => {
|
|
187
|
+
* const [state, tween] = createTween({ x: 0 })
|
|
188
|
+
* tween.to({ x: 100 }).duration(1)
|
|
189
|
+
*
|
|
190
|
+
* return div(
|
|
191
|
+
* { style: () => `translate: ${state.x}px` },
|
|
192
|
+
* "Animated"
|
|
193
|
+
* )
|
|
194
|
+
* }
|
|
195
|
+
*/
|
|
196
|
+
function createTween(initialValues) {
|
|
197
|
+
if (isServer) return [initialValues, dummyInstance];
|
|
198
|
+
const id = nextId();
|
|
199
|
+
const store = miniStore(initialValues);
|
|
200
|
+
const tween = new Tween(store);
|
|
201
|
+
mount(tween, id);
|
|
202
|
+
return [store, tween];
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* VanJS primitive for sequencing values update with Timeline.
|
|
206
|
+
*
|
|
207
|
+
* Automatically stops the timeline when all bound DOM nodes are removed
|
|
208
|
+
* (leveraging a global MutationObserver that monitors state bindings).
|
|
209
|
+
*
|
|
210
|
+
* @param initialValues - Initial tween values
|
|
211
|
+
* @returns [store, timeline] Tuple of reactive store and Timeline instance
|
|
212
|
+
* @example
|
|
213
|
+
* const App = () => {
|
|
214
|
+
* const [state, timeline] = createTimeline({ x: 0, y: 0 })
|
|
215
|
+
* timeline.to({ x: 100, y: 100 }).duration(2)
|
|
216
|
+
*
|
|
217
|
+
* return div(
|
|
218
|
+
* { style: () => `translate: ${state.x}px ${state.y}px` },
|
|
219
|
+
* "Animated"
|
|
220
|
+
* )
|
|
221
|
+
* }
|
|
222
|
+
*/
|
|
223
|
+
function createTimeline(initialValues) {
|
|
224
|
+
if (isServer) return [initialValues, dummyInstance];
|
|
225
|
+
const id = nextId();
|
|
226
|
+
const store = miniStore(initialValues);
|
|
227
|
+
const timeline = new Timeline(store);
|
|
228
|
+
mount(timeline, id);
|
|
229
|
+
return [store, timeline];
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
export { Timeline, Tween, createTimeline, createTween, miniStore };
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=vanjs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vanjs.mjs","names":[],"sources":["../../src/vanjs/lifecycle.ts","../../src/vanjs/miniStore.ts","../../src/vanjs/index.ts"],"sourcesContent":["import type { TweenProps } from \"../types.ts\";\nimport van from \"vanjs-core\";\nimport type { State } from \"vanjs-core\";\n\ninterface VanState<T> extends State<T> {\n _bindings?: { _dom?: Node }[];\n}\n\ninterface TweenInstance {\n states: VanState<unknown>[];\n stop: () => void;\n isPlaying: boolean;\n}\n\nconst instances = new Set<TweenInstance>();\nlet observer: MutationObserver | null = null;\n\nlet sessionId = 0;\nconst sessionStates = new Map<number, VanState<unknown>[]>();\n\nexport function vanState<T>(initial: T): State<T> {\n const stateObj = van.state(initial);\n sessionStates.get(sessionId)?.push(stateObj);\n return stateObj;\n}\n\nfunction checkRemovedBindings() {\n for (const instance of instances) {\n if (!instance.isPlaying) {\n instances.delete(instance);\n continue;\n }\n\n let hasActiveBinding = false;\n for (const state of instance.states) {\n const bindings = state._bindings;\n // istanbul ignore else\n if (bindings?.length) {\n for (const b of bindings) {\n if (b._dom?.isConnected) {\n hasActiveBinding = true;\n break;\n }\n }\n }\n if (hasActiveBinding) break;\n }\n\n if (!hasActiveBinding) {\n instance.stop();\n instances.delete(instance);\n }\n }\n}\n\nfunction initObserver() {\n if (observer) return;\n observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.removedNodes.length) {\n checkRemovedBindings();\n }\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport interface TweenLike {\n state: TweenProps;\n stop(): TweenLike;\n readonly isPlaying: boolean;\n}\n\nexport function nextId(): number {\n sessionId++;\n sessionStates.set(sessionId, []);\n return sessionId;\n}\n\nexport function mount(twObject: TweenLike, id: number) {\n const states = sessionStates.get(id)!;\n sessionStates.delete(id);\n\n const instance: TweenInstance = {\n states,\n stop: () => {\n twObject.stop();\n },\n get isPlaying() {\n return twObject.isPlaying;\n },\n };\n\n const origStop = twObject.stop.bind(twObject);\n twObject.stop = function () {\n unmount(instance);\n return origStop();\n };\n instances.add(instance);\n initObserver();\n}\n\nexport function unmount(instance: TweenInstance) {\n instances.delete(instance);\n}\n\nexport function getInstances() {\n return instances;\n}\n","import {\n type ArrayVal,\n isArray,\n isPlainObject,\n objectHasProp,\n type TweenProps,\n} from \"@thednp/tween\";\n\nimport { vanState } from \"./lifecycle.ts\";\n\nconst STATE_PROXY = \"_proxy\";\nconst proxyProps = {\n value: 1,\n enumerable: false,\n configurable: false,\n writable: false,\n};\n\nconst STATES_KEY = \"_states\";\n\nfunction defineArrayProxy<T extends ArrayVal>(\n index: number,\n value: T[number] | ArrayVal,\n target: T | ArrayVal | ArrayVal[],\n sourceLen: number,\n notifyListeners: () => void,\n) {\n const itemIsLast = index === sourceLen - 1;\n\n if (isArray(value)) {\n const subArray: typeof value = [];\n const valueLen = value.length;\n\n value.forEach((itm, idx) => {\n const subItemIsLast = itemIsLast && idx === valueLen - 1;\n\n let currentItem = itm;\n Object.defineProperty(subArray, idx, {\n get: () => currentItem,\n set: (newValue: typeof itm) => {\n currentItem = newValue;\n\n if (subItemIsLast) {\n notifyListeners();\n }\n },\n enumerable: true,\n });\n });\n target[index] = subArray;\n } else {\n let currentValue = value;\n const getter = () => currentValue;\n const setter = (newVal: typeof value) => {\n currentValue = newVal;\n if (itemIsLast) {\n notifyListeners();\n }\n };\n Object.defineProperties(target, {\n [index]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n }\n}\n\nfunction defineStateProxy<T extends Omit<TweenProps, \"_proxy\">>(\n key: number | keyof T,\n value: T[keyof T] | ArrayVal,\n target: T | ArrayVal,\n) {\n const stateObj = vanState(value);\n let getter: () => typeof value;\n let setter;\n\n if (isArray(value)) {\n const arrayProxy: typeof value = [];\n const valLength = value.length;\n const version = vanState(0);\n for (let i = 0; i < valLength; i++) {\n defineArrayProxy(i, (value as ArrayVal)[i], arrayProxy, valLength, () => {\n version.val = 1 - version.val;\n });\n }\n getter = () => {\n version.val;\n return stateObj.val;\n };\n stateObj.val = arrayProxy;\n } else {\n getter = () => stateObj.val;\n setter = (newVal: typeof value) => {\n stateObj.val = newVal;\n };\n stateObj.val = value as never;\n }\n\n Object.defineProperties(target, {\n [STATE_PROXY]: proxyProps,\n [key]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n\n return stateObj;\n}\n\nfunction createMiniState<T extends TweenProps>(\n obj: T,\n parentReceiver: TweenProps | number[] | [string, ...number[]][],\n) {\n if (objectHasProp(obj, STATE_PROXY)) return obj;\n\n const states: unknown[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n if (isPlainObject(value)) {\n (parentReceiver as TweenProps)[key] = createMiniState(value, {});\n } else {\n const stateObj = defineStateProxy(key, value, parentReceiver);\n states.push(stateObj);\n }\n }\n\n Object.defineProperty(parentReceiver, STATES_KEY, {\n value: states,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n\n return parentReceiver as T;\n}\n\nexport function miniStore<T extends TweenProps>(init: T) {\n return createMiniState(init, {}) as T;\n}\n","import {\n dummyInstance,\n isServer,\n Timeline,\n Tween,\n type TweenProps,\n} from \"@thednp/tween\";\nimport { miniStore } from \"./miniStore.ts\";\nimport { mount, nextId } from \"./lifecycle.ts\";\n\nexport { miniStore, Timeline, Tween };\n\n/**\n * VanJS primitive for updating values with Tween.\n *\n * Automatically stops the tween when all bound DOM nodes are removed\n * (leveraging a global MutationObserver that monitors state bindings).\n *\n * @param initialValues - Initial tween values\n * @returns [store, tween] Tuple of reactive store and Tween instance\n * @example\n * const App = () => {\n * const [state, tween] = createTween({ x: 0 })\n * tween.to({ x: 100 }).duration(1)\n *\n * return div(\n * { style: () => `translate: ${state.x}px` },\n * \"Animated\"\n * )\n * }\n */\nexport function createTween<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Tween<T>] as const;\n }\n const id = nextId();\n const store = miniStore(initialValues);\n const tween = new Tween(store);\n\n mount(tween, id);\n\n return [store, tween] as [T, Tween<T>];\n}\n\n/**\n * VanJS primitive for sequencing values update with Timeline.\n *\n * Automatically stops the timeline when all bound DOM nodes are removed\n * (leveraging a global MutationObserver that monitors state bindings).\n *\n * @param initialValues - Initial tween values\n * @returns [store, timeline] Tuple of reactive store and Timeline instance\n * @example\n * const App = () => {\n * const [state, timeline] = createTimeline({ x: 0, y: 0 })\n * timeline.to({ x: 100, y: 100 }).duration(2)\n *\n * return div(\n * { style: () => `translate: ${state.x}px ${state.y}px` },\n * \"Animated\"\n * )\n * }\n */\nexport function createTimeline<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Timeline<T>] as const;\n }\n const id = nextId();\n const store = miniStore(initialValues);\n const timeline = new Timeline(store);\n\n mount(timeline, id);\n\n return [store, timeline] as [T, Timeline<T>];\n}\n"],"mappings":"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"}
|
package/dist/vue/vue.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @thednp/tween composables for Vue v0.0
|
|
2
|
+
* @thednp/tween composables for Vue v0.1.0 (https://github.com/thednp/tween)
|
|
3
3
|
* Copyright 2026 © thednp
|
|
4
4
|
* Licensed under MIT (https://github.com/thednp/tween/blob/master/LICENSE)
|
|
5
5
|
*/
|
package/dist/vue/vue.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @thednp/tween composables for Vue v0.0
|
|
2
|
+
* @thednp/tween composables for Vue v0.1.0 (https://github.com/thednp/tween)
|
|
3
3
|
* Copyright 2026 © thednp
|
|
4
4
|
* Licensed under MIT (https://github.com/thednp/tween/blob/master/LICENSE)
|
|
5
5
|
*/
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
import { Timeline, Tween, dummyInstance, isArray, isPlainObject, isServer, objectHasProp } from "@thednp/tween";
|
|
9
9
|
import { onUnmounted, ref } from "vue";
|
|
10
|
-
|
|
11
10
|
//#region src/vue/miniStore.ts
|
|
12
11
|
const STATE_PROXY = "_proxy";
|
|
13
12
|
const proxyProps = {
|
|
@@ -85,7 +84,6 @@ function createMiniState(obj, parentReceiver) {
|
|
|
85
84
|
function miniStore(init) {
|
|
86
85
|
return createMiniState(init, {});
|
|
87
86
|
}
|
|
88
|
-
|
|
89
87
|
//#endregion
|
|
90
88
|
//#region src/vue/index.ts
|
|
91
89
|
/**
|
|
@@ -151,7 +149,7 @@ function useTimeline(initialValues) {
|
|
|
151
149
|
});
|
|
152
150
|
return [store, timeline];
|
|
153
151
|
}
|
|
154
|
-
|
|
155
152
|
//#endregion
|
|
156
153
|
export { Timeline, Tween, miniStore, useTimeline, useTween };
|
|
154
|
+
|
|
157
155
|
//# sourceMappingURL=vue.mjs.map
|
package/dist/vue/vue.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue.mjs","names":[],"sources":["../../src/vue/miniStore.ts","../../src/vue/index.ts"],"sourcesContent":["import { ref } from \"vue\";\nimport {\n type ArrayVal,\n isArray,\n isPlainObject,\n objectHasProp,\n type TweenProps,\n} from \"@thednp/tween\";\n\nconst STATE_PROXY = \"_proxy\";\nconst proxyProps = {\n value: 1,\n enumerable: false,\n configurable: false,\n writable: false,\n};\n\nfunction defineArrayProxy<T extends ArrayVal>(\n index: number,\n value: T[number] | ArrayVal,\n target: T | ArrayVal | ArrayVal[],\n sourceLen: number,\n notifyListeners: () => void,\n) {\n const itemIsLast = index === sourceLen - 1;\n\n if (isArray(value)) {\n const subArray: typeof value = [];\n const valueLen = value.length;\n\n value.forEach((itm, idx) => {\n const subItemIsLast = itemIsLast && idx === valueLen - 1;\n\n let currentItem = itm;\n Object.defineProperty(subArray, idx, {\n get: () => currentItem,\n set: (newValue: typeof itm) => {\n currentItem = newValue;\n\n // Only notify on last element to batch updates\n if (subItemIsLast) {\n notifyListeners();\n }\n },\n enumerable: true,\n });\n });\n target[index] = subArray;\n } else {\n let currentValue = value;\n const getter = () => currentValue;\n const setter = (newVal: typeof value) => {\n currentValue = newVal;\n if (itemIsLast) {\n notifyListeners();\n }\n };\n Object.defineProperties(target, {\n [index]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n }\n}\n\nfunction defineStateProxy<T extends Omit<TweenProps, \"_proxy\">>(\n key: number | keyof T,\n value: T[keyof T] | ArrayVal,\n target: T | ArrayVal,\n) {\n const state = ref(value);\n let getter = () => state.value;\n let setter;\n\n if (isArray(value)) {\n const arrayProxy: typeof value = [];\n const valLength = value.length;\n const version = ref(0);\n for (let i = 0; i < valLength; i++) {\n defineArrayProxy(i, (value as ArrayVal)[i], arrayProxy, valLength, () => {\n version.value = 1 - version.value;\n });\n }\n getter = () => {\n version.value;\n return state.value;\n };\n\n state.value = arrayProxy;\n } else {\n setter = (newVal: typeof value) => {\n state.value = newVal;\n };\n }\n\n Object.defineProperties(target, {\n [STATE_PROXY]: proxyProps,\n [key]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n}\n\nfunction createMiniState<T extends TweenProps>(\n obj: T,\n parentReceiver: TweenProps | number[] | [string, ...number[]][],\n) {\n if (objectHasProp(obj, STATE_PROXY)) return obj;\n\n for (const [key, value] of Object.entries(obj)) {\n if (isPlainObject(value)) {\n (parentReceiver as TweenProps)[key] = createMiniState(value, {});\n } else {\n defineStateProxy(key, value, parentReceiver);\n }\n }\n\n return parentReceiver as T;\n}\n\nexport function miniStore<T extends TweenProps>(init: T) {\n return createMiniState(init, {}) as T;\n}\n","import {\n dummyInstance,\n isServer,\n Timeline,\n Tween,\n type TweenProps,\n} from \"@thednp/tween\";\nimport { onUnmounted } from \"vue\";\nimport { miniStore } from \"./miniStore.ts\";\n\nexport { miniStore, Timeline, Tween };\n\n/**\n * Vue composable for updating values with Tween.\n *\n * @param initialValues - Initial tween values\n * @returns [store, tween] Tuple of reactive store and Tween instance\n *\n * @example\n * <script setup lang=\"ts\">\n * const [state, tween] = useTween({ x: 0, y: 0 })\n *\n * // configuration is free-form, no re-render ever happens\n * tween.to({ x: 100, y: 100 })\n *\n * onMounted(() => {\n * tween.start()\n * })\n * </script>\n * <template>\n * <div :style=\"{ translate: `${state.x}px ${state.y}px` }\" />\n * </template>\n */\nexport function useTween<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Tween<T>] as const;\n }\n const store = miniStore(initialValues);\n const tween = new Tween(store);\n\n onUnmounted(() => {\n tween.stop();\n tween.clear();\n });\n\n return [store, tween] as [T, Tween<T>];\n}\n\n/**\n * Vue composable for sequencing values update with Timeline.\n *\n * @param initialValues - Initial tween values\n * @returns [store, timeline] Tuple of reactive store and Timeline instance\n *\n * @example\n * <script setup lang=\"ts\">\n * const [state, timeline] = useTimeline({ x: 0, y: 0 })\n *\n * // configuration is free-form\n * timeline.to({ x: 100, y: 100 })\n *\n * onMounted(() => {\n * timeline.play()\n * })\n * </script>\n *\n * <template>\n * <div :style=\"{ translate: `${state.x}px ${state.y}px` }\" />\n * </template>\n */\nexport function useTimeline<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Timeline<T>] as const;\n }\n const store = miniStore(initialValues);\n const timeline = new Timeline(store);\n\n onUnmounted(() => {\n timeline.stop();\n timeline.clear();\n });\n\n return [store, timeline] as [T, Timeline<T>];\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"vue.mjs","names":[],"sources":["../../src/vue/miniStore.ts","../../src/vue/index.ts"],"sourcesContent":["import { ref } from \"vue\";\nimport {\n type ArrayVal,\n isArray,\n isPlainObject,\n objectHasProp,\n type TweenProps,\n} from \"@thednp/tween\";\n\nconst STATE_PROXY = \"_proxy\";\nconst proxyProps = {\n value: 1,\n enumerable: false,\n configurable: false,\n writable: false,\n};\n\nfunction defineArrayProxy<T extends ArrayVal>(\n index: number,\n value: T[number] | ArrayVal,\n target: T | ArrayVal | ArrayVal[],\n sourceLen: number,\n notifyListeners: () => void,\n) {\n const itemIsLast = index === sourceLen - 1;\n\n if (isArray(value)) {\n const subArray: typeof value = [];\n const valueLen = value.length;\n\n value.forEach((itm, idx) => {\n const subItemIsLast = itemIsLast && idx === valueLen - 1;\n\n let currentItem = itm;\n Object.defineProperty(subArray, idx, {\n get: () => currentItem,\n set: (newValue: typeof itm) => {\n currentItem = newValue;\n\n // Only notify on last element to batch updates\n if (subItemIsLast) {\n notifyListeners();\n }\n },\n enumerable: true,\n });\n });\n target[index] = subArray;\n } else {\n let currentValue = value;\n const getter = () => currentValue;\n const setter = (newVal: typeof value) => {\n currentValue = newVal;\n if (itemIsLast) {\n notifyListeners();\n }\n };\n Object.defineProperties(target, {\n [index]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n }\n}\n\nfunction defineStateProxy<T extends Omit<TweenProps, \"_proxy\">>(\n key: number | keyof T,\n value: T[keyof T] | ArrayVal,\n target: T | ArrayVal,\n) {\n const state = ref(value);\n let getter = () => state.value;\n let setter;\n\n if (isArray(value)) {\n const arrayProxy: typeof value = [];\n const valLength = value.length;\n const version = ref(0);\n for (let i = 0; i < valLength; i++) {\n defineArrayProxy(i, (value as ArrayVal)[i], arrayProxy, valLength, () => {\n version.value = 1 - version.value;\n });\n }\n getter = () => {\n version.value;\n return state.value;\n };\n\n state.value = arrayProxy;\n } else {\n setter = (newVal: typeof value) => {\n state.value = newVal;\n };\n }\n\n Object.defineProperties(target, {\n [STATE_PROXY]: proxyProps,\n [key]: {\n get: getter,\n set: setter,\n enumerable: true,\n },\n });\n}\n\nfunction createMiniState<T extends TweenProps>(\n obj: T,\n parentReceiver: TweenProps | number[] | [string, ...number[]][],\n) {\n if (objectHasProp(obj, STATE_PROXY)) return obj;\n\n for (const [key, value] of Object.entries(obj)) {\n if (isPlainObject(value)) {\n (parentReceiver as TweenProps)[key] = createMiniState(value, {});\n } else {\n defineStateProxy(key, value, parentReceiver);\n }\n }\n\n return parentReceiver as T;\n}\n\nexport function miniStore<T extends TweenProps>(init: T) {\n return createMiniState(init, {}) as T;\n}\n","import {\n dummyInstance,\n isServer,\n Timeline,\n Tween,\n type TweenProps,\n} from \"@thednp/tween\";\nimport { onUnmounted } from \"vue\";\nimport { miniStore } from \"./miniStore.ts\";\n\nexport { miniStore, Timeline, Tween };\n\n/**\n * Vue composable for updating values with Tween.\n *\n * @param initialValues - Initial tween values\n * @returns [store, tween] Tuple of reactive store and Tween instance\n *\n * @example\n * <script setup lang=\"ts\">\n * const [state, tween] = useTween({ x: 0, y: 0 })\n *\n * // configuration is free-form, no re-render ever happens\n * tween.to({ x: 100, y: 100 })\n *\n * onMounted(() => {\n * tween.start()\n * })\n * </script>\n * <template>\n * <div :style=\"{ translate: `${state.x}px ${state.y}px` }\" />\n * </template>\n */\nexport function useTween<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Tween<T>] as const;\n }\n const store = miniStore(initialValues);\n const tween = new Tween(store);\n\n onUnmounted(() => {\n tween.stop();\n tween.clear();\n });\n\n return [store, tween] as [T, Tween<T>];\n}\n\n/**\n * Vue composable for sequencing values update with Timeline.\n *\n * @param initialValues - Initial tween values\n * @returns [store, timeline] Tuple of reactive store and Timeline instance\n *\n * @example\n * <script setup lang=\"ts\">\n * const [state, timeline] = useTimeline({ x: 0, y: 0 })\n *\n * // configuration is free-form\n * timeline.to({ x: 100, y: 100 })\n *\n * onMounted(() => {\n * timeline.play()\n * })\n * </script>\n *\n * <template>\n * <div :style=\"{ translate: `${state.x}px ${state.y}px` }\" />\n * </template>\n */\nexport function useTimeline<T extends TweenProps>(initialValues: T) {\n if (isServer) {\n return [initialValues, dummyInstance as unknown as Timeline<T>] as const;\n }\n const store = miniStore(initialValues);\n const timeline = new Timeline(store);\n\n onUnmounted(() => {\n timeline.stop();\n timeline.clear();\n });\n\n return [store, timeline] as [T, Timeline<T>];\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,cAAc;AACpB,MAAM,aAAa;CACjB,OAAO;CACP,YAAY;CACZ,cAAc;CACd,UAAU;CACX;AAED,SAAS,iBACP,OACA,OACA,QACA,WACA,iBACA;CACA,MAAM,aAAa,UAAU,YAAY;AAEzC,KAAI,QAAQ,MAAM,EAAE;EAClB,MAAM,WAAyB,EAAE;EACjC,MAAM,WAAW,MAAM;AAEvB,QAAM,SAAS,KAAK,QAAQ;GAC1B,MAAM,gBAAgB,cAAc,QAAQ,WAAW;GAEvD,IAAI,cAAc;AAClB,UAAO,eAAe,UAAU,KAAK;IACnC,WAAW;IACX,MAAM,aAAyB;AAC7B,mBAAc;AAGd,SAAI,cACF,kBAAiB;;IAGrB,YAAY;IACb,CAAC;IACF;AACF,SAAO,SAAS;QACX;EACL,IAAI,eAAe;EACnB,MAAM,eAAe;EACrB,MAAM,UAAU,WAAyB;AACvC,kBAAe;AACf,OAAI,WACF,kBAAiB;;AAGrB,SAAO,iBAAiB,QAAQ,GAC7B,QAAQ;GACP,KAAK;GACL,KAAK;GACL,YAAY;GACb,EACF,CAAC;;;AAIN,SAAS,iBACP,KACA,OACA,QACA;CACA,MAAM,QAAQ,IAAI,MAAM;CACxB,IAAI,eAAe,MAAM;CACzB,IAAI;AAEJ,KAAI,QAAQ,MAAM,EAAE;EAClB,MAAM,aAA2B,EAAE;EACnC,MAAM,YAAY,MAAM;EACxB,MAAM,UAAU,IAAI,EAAE;AACtB,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAC7B,kBAAiB,GAAI,MAAmB,IAAI,YAAY,iBAAiB;AACvE,WAAQ,QAAQ,IAAI,QAAQ;IAC5B;AAEJ,iBAAe;AACb,WAAQ;AACR,UAAO,MAAM;;AAGf,QAAM,QAAQ;OAEd,WAAU,WAAyB;AACjC,QAAM,QAAQ;;AAIlB,QAAO,iBAAiB,QAAQ;GAC7B,cAAc;GACd,MAAM;GACL,KAAK;GACL,KAAK;GACL,YAAY;GACb;EACF,CAAC;;AAGJ,SAAS,gBACP,KACA,gBACA;AACA,KAAI,cAAc,KAAK,YAAY,CAAE,QAAO;AAE5C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,CAC5C,KAAI,cAAc,MAAM,CACrB,gBAA8B,OAAO,gBAAgB,OAAO,EAAE,CAAC;KAEhE,kBAAiB,KAAK,OAAO,eAAe;AAIhD,QAAO;;AAGT,SAAgB,UAAgC,MAAS;AACvD,QAAO,gBAAgB,MAAM,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AC5FlC,SAAgB,SAA+B,eAAkB;AAC/D,KAAI,SACF,QAAO,CAAC,eAAe,cAAqC;CAE9D,MAAM,QAAQ,UAAU,cAAc;CACtC,MAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,mBAAkB;AAChB,QAAM,MAAM;AACZ,QAAM,OAAO;GACb;AAEF,QAAO,CAAC,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;AAyBvB,SAAgB,YAAkC,eAAkB;AAClE,KAAI,SACF,QAAO,CAAC,eAAe,cAAwC;CAEjE,MAAM,QAAQ,UAAU,cAAc;CACtC,MAAM,WAAW,IAAI,SAAS,MAAM;AAEpC,mBAAkB;AAChB,WAAS,MAAM;AACf,WAAS,OAAO;GAChB;AAEF,QAAO,CAAC,OAAO,SAAS"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thednp/tween",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "🌸 A Typescript sourced tweening engine with Tween and Timeline",
|
|
5
5
|
"homepage": "https://github.com/thednp/tween",
|
|
6
6
|
"author": "thednp",
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
14
14
|
"package.json",
|
|
15
|
+
"AGENTS.md",
|
|
16
|
+
"CHANGELOG.md",
|
|
15
17
|
"README.md",
|
|
16
18
|
"LICENSE"
|
|
17
19
|
],
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
"./react": "./dist/react/react.mjs",
|
|
22
24
|
"./solid": "./dist/solid/solid.mjs",
|
|
23
25
|
"./svelte": "./dist/svelte/tween.svelte.js",
|
|
26
|
+
"./vanjs": "./dist/vanjs/vanjs.mjs",
|
|
24
27
|
"./vue": "./dist/vue/vue.mjs",
|
|
25
28
|
"./package.json": "./package.json"
|
|
26
29
|
},
|
|
@@ -43,6 +46,7 @@
|
|
|
43
46
|
"svelte",
|
|
44
47
|
"preact",
|
|
45
48
|
"vue",
|
|
49
|
+
"vanjs",
|
|
46
50
|
"cubic-bezier",
|
|
47
51
|
"cubic-tween",
|
|
48
52
|
"easing",
|
|
@@ -51,39 +55,44 @@
|
|
|
51
55
|
"animation engine",
|
|
52
56
|
"animation",
|
|
53
57
|
"animations",
|
|
58
|
+
"svg-morphing",
|
|
54
59
|
"SSR",
|
|
55
60
|
"server-side rendering",
|
|
56
61
|
"typescript"
|
|
57
62
|
],
|
|
58
63
|
"devDependencies": {
|
|
59
|
-
"@sveltejs/vite-plugin-svelte": "^
|
|
60
|
-
"@types/node": "^25.2
|
|
64
|
+
"@sveltejs/vite-plugin-svelte": "^7.0.0",
|
|
65
|
+
"@types/node": "^25.5.2",
|
|
61
66
|
"@types/react": "^19.2.14",
|
|
62
67
|
"@types/react-dom": "^19.2.3",
|
|
63
|
-
"@vitest/coverage-istanbul": "^4.
|
|
64
|
-
"@vitest/ui": "^4.
|
|
65
|
-
"happy-dom": "^20.
|
|
68
|
+
"@vitest/coverage-istanbul": "^4.1.2",
|
|
69
|
+
"@vitest/ui": "^4.1.2",
|
|
70
|
+
"happy-dom": "^20.8.9",
|
|
66
71
|
"react-dom": "^19.2.4",
|
|
67
72
|
"rollup-plugin-svelte": "^7.2.3",
|
|
68
73
|
"svelte-preprocess": "^6.0.3",
|
|
69
|
-
"tsdown": "^0.
|
|
70
|
-
"typescript": "^
|
|
71
|
-
"vite-plugin-strip-comments": "^0.0.
|
|
72
|
-
"vitest": "^4.
|
|
74
|
+
"tsdown": "^0.21.7",
|
|
75
|
+
"typescript": "^6.0.2",
|
|
76
|
+
"vite-plugin-strip-comments": "^0.0.10",
|
|
77
|
+
"vitest": "^4.1.2"
|
|
73
78
|
},
|
|
74
79
|
"dependencies": {
|
|
75
|
-
"@thednp/dommatrix": "^3.0.
|
|
76
|
-
"preact": "^10.
|
|
80
|
+
"@thednp/dommatrix": "^3.0.4",
|
|
81
|
+
"preact": "^10.29.1",
|
|
77
82
|
"react": "^19.2.4",
|
|
78
|
-
"solid-js": "^1.9.
|
|
79
|
-
"svelte": "^5.
|
|
80
|
-
"
|
|
83
|
+
"solid-js": "^1.9.12",
|
|
84
|
+
"svelte": "^5.55.1",
|
|
85
|
+
"svg-path-commander": "^2.2.1",
|
|
86
|
+
"vanjs-core": "^1.6.0",
|
|
87
|
+
"vue": "^3.5.32"
|
|
81
88
|
},
|
|
82
|
-
"packageManager": "pnpm@8.6.12",
|
|
83
89
|
"engines": {
|
|
84
90
|
"node": ">=20",
|
|
85
91
|
"pnpm": ">=8.6.0"
|
|
86
92
|
},
|
|
93
|
+
"inlinedDependencies": {
|
|
94
|
+
"svg-path-commander": "2.2.1"
|
|
95
|
+
},
|
|
87
96
|
"scripts": {
|
|
88
97
|
"pre-test": "pnpm clean-coverage",
|
|
89
98
|
"clean-coverage": "rm -rf coverage .nyc_output",
|