motion-script 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/dist/attributes/bounds/bounds.d.ts +10 -0
- package/dist/attributes/bounds/bounds.d.ts.map +1 -0
- package/dist/attributes/bounds/bounds.js +2 -0
- package/dist/attributes/bounds/bounds.js.map +1 -0
- package/dist/attributes/fill/blend.d.ts +4 -0
- package/dist/attributes/fill/blend.d.ts.map +1 -0
- package/dist/attributes/fill/blend.js +14 -0
- package/dist/attributes/fill/blend.js.map +1 -0
- package/dist/attributes/fill/fill.d.ts +28 -0
- package/dist/attributes/fill/fill.d.ts.map +1 -0
- package/dist/attributes/fill/fill.js +23 -0
- package/dist/attributes/fill/fill.js.map +1 -0
- package/dist/attributes/fill/registry.d.ts +23 -0
- package/dist/attributes/fill/registry.d.ts.map +1 -0
- package/dist/attributes/fill/registry.js +106 -0
- package/dist/attributes/fill/registry.js.map +1 -0
- package/dist/attributes/index.d.ts +9 -0
- package/dist/attributes/index.d.ts.map +1 -0
- package/dist/attributes/index.js +9 -0
- package/dist/attributes/index.js.map +1 -0
- package/dist/attributes/insets/inset.d.ts +7 -0
- package/dist/attributes/insets/inset.d.ts.map +1 -0
- package/dist/attributes/insets/inset.js +2 -0
- package/dist/attributes/insets/inset.js.map +1 -0
- package/dist/attributes/position/vector2.d.ts +5 -0
- package/dist/attributes/position/vector2.d.ts.map +1 -0
- package/dist/attributes/position/vector2.js +2 -0
- package/dist/attributes/position/vector2.js.map +1 -0
- package/dist/attributes/size/constraints.d.ts +5 -0
- package/dist/attributes/size/constraints.d.ts.map +1 -0
- package/dist/attributes/size/constraints.js +2 -0
- package/dist/attributes/size/constraints.js.map +1 -0
- package/dist/attributes/size/size.d.ts +6 -0
- package/dist/attributes/size/size.d.ts.map +1 -0
- package/dist/attributes/size/size.js +2 -0
- package/dist/attributes/size/size.js.map +1 -0
- package/dist/attributes/stroke/stroke.d.ts +6 -0
- package/dist/attributes/stroke/stroke.d.ts.map +1 -0
- package/dist/attributes/stroke/stroke.js +2 -0
- package/dist/attributes/stroke/stroke.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx/jsx-dev-runtime.d.ts +4 -0
- package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx/jsx-dev-runtime.js +16 -0
- package/dist/jsx/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx/jsx-runtime.d.ts +4 -0
- package/dist/jsx/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx/jsx-runtime.js +16 -0
- package/dist/jsx/jsx-runtime.js.map +1 -0
- package/dist/nodes/base/node.d.ts +37 -0
- package/dist/nodes/base/node.d.ts.map +1 -0
- package/dist/nodes/base/node.js +107 -0
- package/dist/nodes/base/node.js.map +1 -0
- package/dist/nodes/flex/node.d.ts +35 -0
- package/dist/nodes/flex/node.d.ts.map +1 -0
- package/dist/nodes/flex/node.js +318 -0
- package/dist/nodes/flex/node.js.map +1 -0
- package/dist/nodes/flex/props.d.ts +27 -0
- package/dist/nodes/flex/props.d.ts.map +1 -0
- package/dist/nodes/flex/props.js +2 -0
- package/dist/nodes/flex/props.js.map +1 -0
- package/dist/nodes/index.d.ts +13 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +13 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/rect/node.d.ts +14 -0
- package/dist/nodes/rect/node.d.ts.map +1 -0
- package/dist/nodes/rect/node.js +55 -0
- package/dist/nodes/rect/node.js.map +1 -0
- package/dist/nodes/rect/props.d.ts +10 -0
- package/dist/nodes/rect/props.d.ts.map +1 -0
- package/dist/nodes/rect/props.js +2 -0
- package/dist/nodes/rect/props.js.map +1 -0
- package/dist/nodes/registry.d.ts +3 -0
- package/dist/nodes/registry.d.ts.map +1 -0
- package/dist/nodes/registry.js +31 -0
- package/dist/nodes/registry.js.map +1 -0
- package/dist/nodes/shape/node.d.ts +15 -0
- package/dist/nodes/shape/node.d.ts.map +1 -0
- package/dist/nodes/shape/node.js +32 -0
- package/dist/nodes/shape/node.js.map +1 -0
- package/dist/nodes/shape/props.d.ts +8 -0
- package/dist/nodes/shape/props.d.ts.map +1 -0
- package/dist/nodes/shape/props.js +2 -0
- package/dist/nodes/shape/props.js.map +1 -0
- package/dist/nodes/text/node.d.ts +18 -0
- package/dist/nodes/text/node.d.ts.map +1 -0
- package/dist/nodes/text/node.js +76 -0
- package/dist/nodes/text/node.js.map +1 -0
- package/dist/nodes/text/props.d.ts +11 -0
- package/dist/nodes/text/props.d.ts.map +1 -0
- package/dist/nodes/text/props.js +2 -0
- package/dist/nodes/text/props.js.map +1 -0
- package/dist/nodes/transform/node.d.ts +39 -0
- package/dist/nodes/transform/node.d.ts.map +1 -0
- package/dist/nodes/transform/node.js +160 -0
- package/dist/nodes/transform/node.js.map +1 -0
- package/dist/nodes/transform/props.d.ts +11 -0
- package/dist/nodes/transform/props.d.ts.map +1 -0
- package/dist/nodes/transform/props.js +2 -0
- package/dist/nodes/transform/props.js.map +1 -0
- package/dist/project/generator.d.ts +2 -0
- package/dist/project/generator.d.ts.map +1 -0
- package/dist/project/generator.js +2 -0
- package/dist/project/generator.js.map +1 -0
- package/dist/project/index.d.ts +4 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +4 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/project.d.ts +14 -0
- package/dist/project/project.d.ts.map +1 -0
- package/dist/project/project.js +2 -0
- package/dist/project/project.js.map +1 -0
- package/dist/project/scene.d.ts +49 -0
- package/dist/project/scene.d.ts.map +1 -0
- package/dist/project/scene.js +2 -0
- package/dist/project/scene.js.map +1 -0
- package/dist/rendering/contexts/draw-context.d.ts +17 -0
- package/dist/rendering/contexts/draw-context.d.ts.map +1 -0
- package/dist/rendering/contexts/draw-context.js +12 -0
- package/dist/rendering/contexts/draw-context.js.map +1 -0
- package/dist/rendering/contexts/pixi-context.d.ts +29 -0
- package/dist/rendering/contexts/pixi-context.d.ts.map +1 -0
- package/dist/rendering/contexts/pixi-context.js +117 -0
- package/dist/rendering/contexts/pixi-context.js.map +1 -0
- package/dist/rendering/index.d.ts +11 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/index.js +11 -0
- package/dist/rendering/index.js.map +1 -0
- package/dist/rendering/painters/base/painter.d.ts +9 -0
- package/dist/rendering/painters/base/painter.d.ts.map +1 -0
- package/dist/rendering/painters/base/painter.js +12 -0
- package/dist/rendering/painters/base/painter.js.map +1 -0
- package/dist/rendering/painters/ellipse/ellipse.d.ts +9 -0
- package/dist/rendering/painters/ellipse/ellipse.d.ts.map +1 -0
- package/dist/rendering/painters/ellipse/ellipse.js +2 -0
- package/dist/rendering/painters/ellipse/ellipse.js.map +1 -0
- package/dist/rendering/painters/latex/state.d.ts +6 -0
- package/dist/rendering/painters/latex/state.d.ts.map +1 -0
- package/dist/rendering/painters/latex/state.js +2 -0
- package/dist/rendering/painters/latex/state.js.map +1 -0
- package/dist/rendering/painters/rect/cache.d.ts +22 -0
- package/dist/rendering/painters/rect/cache.d.ts.map +1 -0
- package/dist/rendering/painters/rect/cache.js +106 -0
- package/dist/rendering/painters/rect/cache.js.map +1 -0
- package/dist/rendering/painters/rect/painter.d.ts +13 -0
- package/dist/rendering/painters/rect/painter.d.ts.map +1 -0
- package/dist/rendering/painters/rect/painter.js +66 -0
- package/dist/rendering/painters/rect/painter.js.map +1 -0
- package/dist/rendering/painters/rect/state.d.ts +11 -0
- package/dist/rendering/painters/rect/state.d.ts.map +1 -0
- package/dist/rendering/painters/rect/state.js +21 -0
- package/dist/rendering/painters/rect/state.js.map +1 -0
- package/dist/rendering/painters/shape/state.d.ts +9 -0
- package/dist/rendering/painters/shape/state.d.ts.map +1 -0
- package/dist/rendering/painters/shape/state.js +2 -0
- package/dist/rendering/painters/shape/state.js.map +1 -0
- package/dist/rendering/painters/text/cache.d.ts +30 -0
- package/dist/rendering/painters/text/cache.d.ts.map +1 -0
- package/dist/rendering/painters/text/cache.js +525 -0
- package/dist/rendering/painters/text/cache.js.map +1 -0
- package/dist/rendering/painters/text/geometry/font/cache.d.ts +9 -0
- package/dist/rendering/painters/text/geometry/font/cache.d.ts.map +1 -0
- package/dist/rendering/painters/text/geometry/font/cache.js +20 -0
- package/dist/rendering/painters/text/geometry/font/cache.js.map +1 -0
- package/dist/rendering/painters/text/geometry/font/fonts.json +3844 -0
- package/dist/rendering/painters/text/geometry/font/loader.d.ts +4 -0
- package/dist/rendering/painters/text/geometry/font/loader.d.ts.map +1 -0
- package/dist/rendering/painters/text/geometry/font/loader.js +33 -0
- package/dist/rendering/painters/text/geometry/font/loader.js.map +1 -0
- package/dist/rendering/painters/text/geometry/font/ttf.d.ts +27 -0
- package/dist/rendering/painters/text/geometry/font/ttf.d.ts.map +1 -0
- package/dist/rendering/painters/text/geometry/font/ttf.js +26 -0
- package/dist/rendering/painters/text/geometry/font/ttf.js.map +1 -0
- package/dist/rendering/painters/text/geometry/path.d.ts +16 -0
- package/dist/rendering/painters/text/geometry/path.d.ts.map +1 -0
- package/dist/rendering/painters/text/geometry/path.js +40 -0
- package/dist/rendering/painters/text/geometry/path.js.map +1 -0
- package/dist/rendering/painters/text/painter.d.ts +13 -0
- package/dist/rendering/painters/text/painter.d.ts.map +1 -0
- package/dist/rendering/painters/text/painter.js +69 -0
- package/dist/rendering/painters/text/painter.js.map +1 -0
- package/dist/rendering/painters/text/state.d.ts +12 -0
- package/dist/rendering/painters/text/state.d.ts.map +1 -0
- package/dist/rendering/painters/text/state.js +22 -0
- package/dist/rendering/painters/text/state.js.map +1 -0
- package/dist/rendering/painters/transform/painter.d.ts +9 -0
- package/dist/rendering/painters/transform/painter.d.ts.map +1 -0
- package/dist/rendering/painters/transform/painter.js +18 -0
- package/dist/rendering/painters/transform/painter.js.map +1 -0
- package/dist/rendering/painters/transform/state.d.ts +9 -0
- package/dist/rendering/painters/transform/state.d.ts.map +1 -0
- package/dist/rendering/painters/transform/state.js +2 -0
- package/dist/rendering/painters/transform/state.js.map +1 -0
- package/dist/rendering/textures/multi-fill.d.ts +1 -0
- package/dist/rendering/textures/multi-fill.d.ts.map +1 -0
- package/dist/rendering/textures/multi-fill.js +18 -0
- package/dist/rendering/textures/multi-fill.js.map +1 -0
- package/dist/signal/collector.d.ts +6 -0
- package/dist/signal/collector.d.ts.map +1 -0
- package/dist/signal/collector.js +18 -0
- package/dist/signal/collector.js.map +1 -0
- package/dist/signal/index.d.ts +3 -0
- package/dist/signal/index.d.ts.map +1 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/index.js.map +1 -0
- package/dist/signal/signal.d.ts +7 -0
- package/dist/signal/signal.d.ts.map +1 -0
- package/dist/signal/signal.js +217 -0
- package/dist/signal/signal.js.map +1 -0
- package/dist/signal/type.d.ts +40 -0
- package/dist/signal/type.d.ts.map +1 -0
- package/dist/signal/type.js +2 -0
- package/dist/signal/type.js.map +1 -0
- package/dist/tween/ease.d.ts +13 -0
- package/dist/tween/ease.d.ts.map +1 -0
- package/dist/tween/ease.js +40 -0
- package/dist/tween/ease.js.map +1 -0
- package/dist/tween/eases.d.ts +12 -0
- package/dist/tween/eases.d.ts.map +1 -0
- package/dist/tween/eases.js +69 -0
- package/dist/tween/eases.js.map +1 -0
- package/dist/tween/index.d.ts +7 -0
- package/dist/tween/index.d.ts.map +1 -0
- package/dist/tween/index.js +7 -0
- package/dist/tween/index.js.map +1 -0
- package/dist/tween/parallel.d.ts +3 -0
- package/dist/tween/parallel.d.ts.map +1 -0
- package/dist/tween/parallel.js +24 -0
- package/dist/tween/parallel.js.map +1 -0
- package/dist/tween/sequence.d.ts +3 -0
- package/dist/tween/sequence.d.ts.map +1 -0
- package/dist/tween/sequence.js +7 -0
- package/dist/tween/sequence.js.map +1 -0
- package/dist/tween/tests/realtime.test.d.ts +2 -0
- package/dist/tween/tests/realtime.test.d.ts.map +1 -0
- package/dist/tween/tests/realtime.test.js +76 -0
- package/dist/tween/tests/realtime.test.js.map +1 -0
- package/dist/tween/tween.d.ts +3 -0
- package/dist/tween/tween.d.ts.map +1 -0
- package/dist/tween/tween.js +14 -0
- package/dist/tween/tween.js.map +1 -0
- package/dist/tween/wait.d.ts +3 -0
- package/dist/tween/wait.d.ts.map +1 -0
- package/dist/tween/wait.js +10 -0
- package/dist/tween/wait.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { linear } from "@/tween/eases";
|
|
2
|
+
import { tween } from "../tween/tween";
|
|
3
|
+
import { collect, track } from "./collector";
|
|
4
|
+
// ── Update batching ───────────────────────────────────────────────────
|
|
5
|
+
// Prevents layout thrashing: multiple signal.set() calls within a single
|
|
6
|
+
// generator step queue their notifications and flush once at step end.
|
|
7
|
+
let batchDepth = 0;
|
|
8
|
+
const pendingFlushes = [];
|
|
9
|
+
const queuedSignals = new Set();
|
|
10
|
+
export function batch(fn) {
|
|
11
|
+
batchDepth++;
|
|
12
|
+
try {
|
|
13
|
+
fn();
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
batchDepth--;
|
|
17
|
+
if (batchDepth === 0) {
|
|
18
|
+
flushBatch();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function flushBatch() {
|
|
23
|
+
// Copy+clear before iterating so re-entrant sets land in the next flush.
|
|
24
|
+
const fns = pendingFlushes.splice(0);
|
|
25
|
+
queuedSignals.clear();
|
|
26
|
+
for (let i = 0; i < fns.length; i++) {
|
|
27
|
+
fns[i]();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Fast duck-typing to check if something is a Signal
|
|
31
|
+
function isSignal(value) {
|
|
32
|
+
return (typeof value === "function" &&
|
|
33
|
+
"get" in value &&
|
|
34
|
+
"set" in value &&
|
|
35
|
+
"subscribe" in value);
|
|
36
|
+
}
|
|
37
|
+
// Efficient default lerp for numbers/nullables
|
|
38
|
+
function lerpNullable(from, next, t) {
|
|
39
|
+
if (from === null && next === null)
|
|
40
|
+
return null;
|
|
41
|
+
const f = from ?? next ?? 0; // Fallback to 0 if both null/undefined logic fails
|
|
42
|
+
const n = next ?? from ?? 0;
|
|
43
|
+
return f + (n - f) * t;
|
|
44
|
+
}
|
|
45
|
+
export function createSignal(initial, defaultLerp) {
|
|
46
|
+
// 1. Direct Pass-through: If it's already a signal, return it immediately.
|
|
47
|
+
if (isSignal(initial)) {
|
|
48
|
+
return initial;
|
|
49
|
+
}
|
|
50
|
+
let value;
|
|
51
|
+
let getter = null;
|
|
52
|
+
let dirty = false;
|
|
53
|
+
// Reuse this array to avoid garbage collection churn on every update
|
|
54
|
+
const cleanup = [];
|
|
55
|
+
const subscribers = new Set();
|
|
56
|
+
// 2. Input Analysis
|
|
57
|
+
if (typeof initial === "function") {
|
|
58
|
+
getter = initial;
|
|
59
|
+
dirty = true;
|
|
60
|
+
// value is undefined until first pull
|
|
61
|
+
value = undefined;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
value = initial;
|
|
65
|
+
}
|
|
66
|
+
const compute = () => {
|
|
67
|
+
// Optimization: Release old dependencies without creating new Array
|
|
68
|
+
for (let i = 0; i < cleanup.length; i++) {
|
|
69
|
+
cleanup[i]();
|
|
70
|
+
}
|
|
71
|
+
cleanup.length = 0;
|
|
72
|
+
// Re-run the getter and track dependencies
|
|
73
|
+
const newValue = collect(getter, (dep) => {
|
|
74
|
+
cleanup.push(dep.subscribe(() => {
|
|
75
|
+
if (!dirty) {
|
|
76
|
+
dirty = true;
|
|
77
|
+
notify();
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
});
|
|
81
|
+
dirty = false;
|
|
82
|
+
value = newValue;
|
|
83
|
+
return value;
|
|
84
|
+
};
|
|
85
|
+
const notifyNow = () => {
|
|
86
|
+
if (subscribers.size === 0) {
|
|
87
|
+
// If no one is listening, just mark dirty so next .get() updates
|
|
88
|
+
if (getter)
|
|
89
|
+
dirty = true;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Calculate fresh value if computed
|
|
93
|
+
if (getter) {
|
|
94
|
+
compute();
|
|
95
|
+
}
|
|
96
|
+
// Snapshot subscribers to prevent infinite loops if a subscriber
|
|
97
|
+
// triggers a dependency change.
|
|
98
|
+
const snapshot = [...subscribers];
|
|
99
|
+
for (let i = 0; i < snapshot.length; i++) {
|
|
100
|
+
snapshot[i](value);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const notify = () => {
|
|
104
|
+
if (batchDepth > 0) {
|
|
105
|
+
// Computed signals: mark dirty immediately so the queued flush
|
|
106
|
+
// will call compute() with the fully-settled dependency values.
|
|
107
|
+
if (getter)
|
|
108
|
+
dirty = true;
|
|
109
|
+
// Dedup: only enqueue once per signal per batch.
|
|
110
|
+
if (!queuedSignals.has(signal)) {
|
|
111
|
+
queuedSignals.add(signal);
|
|
112
|
+
pendingFlushes.push(notifyNow);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
notifyNow();
|
|
117
|
+
};
|
|
118
|
+
// The core Signal functor
|
|
119
|
+
const signal = function (arg, duration, easing, lerp) {
|
|
120
|
+
// Getter: signal()
|
|
121
|
+
if (arguments.length === 0)
|
|
122
|
+
return signal.get();
|
|
123
|
+
// Tween: signal(to, duration, ...)
|
|
124
|
+
if (arguments.length >= 2 && typeof duration === "number") {
|
|
125
|
+
return signal.tween(arg, duration, easing, lerp);
|
|
126
|
+
}
|
|
127
|
+
// Setter: signal(value)
|
|
128
|
+
return signal.set(arg);
|
|
129
|
+
};
|
|
130
|
+
signal.get = () => {
|
|
131
|
+
track(signal);
|
|
132
|
+
// If it's a computed signal and needs update
|
|
133
|
+
if (getter && dirty) {
|
|
134
|
+
return compute();
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
};
|
|
138
|
+
signal.set = (next) => {
|
|
139
|
+
// If we are currently computed (getter exists), we switch to state mode
|
|
140
|
+
// This overwrites the computation with a hard value (common in animation overrides)
|
|
141
|
+
if (getter) {
|
|
142
|
+
getter = null;
|
|
143
|
+
// Clean up dependencies as we no longer track them
|
|
144
|
+
for (let i = 0; i < cleanup.length; i++)
|
|
145
|
+
cleanup[i]();
|
|
146
|
+
cleanup.length = 0;
|
|
147
|
+
}
|
|
148
|
+
let newValue;
|
|
149
|
+
// Handle functional updates: signal.set(prev => prev + 1)
|
|
150
|
+
if (typeof next === "function") {
|
|
151
|
+
// Note: We use 'value' directly here. If logic relies on recursive
|
|
152
|
+
// computed dependencies for the *previous* value, ensure `signal.get()`
|
|
153
|
+
// is called, but usually raw `value` is safe for setters.
|
|
154
|
+
newValue = next(value);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
newValue = next;
|
|
158
|
+
}
|
|
159
|
+
// Equality check to prevent unnecessary notifies
|
|
160
|
+
if (Object.is(value, newValue))
|
|
161
|
+
return;
|
|
162
|
+
value = newValue;
|
|
163
|
+
notify();
|
|
164
|
+
};
|
|
165
|
+
signal.subscribe = (fn) => {
|
|
166
|
+
subscribers.add(fn);
|
|
167
|
+
// Eager evaluation: if this is the first subscriber and we are dirty,
|
|
168
|
+
// compute now to ensure the graph is live.
|
|
169
|
+
if (getter && dirty && subscribers.size === 1) {
|
|
170
|
+
compute();
|
|
171
|
+
}
|
|
172
|
+
return () => {
|
|
173
|
+
subscribers.delete(fn);
|
|
174
|
+
// If last subscriber leaves, we can go lazy again
|
|
175
|
+
if (subscribers.size === 0 && getter) {
|
|
176
|
+
for (let i = 0; i < cleanup.length; i++)
|
|
177
|
+
cleanup[i]();
|
|
178
|
+
cleanup.length = 0;
|
|
179
|
+
dirty = true;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
// --- Tweening Logic ---
|
|
184
|
+
// Extracted runner to keep the closure somewhat cleaner,
|
|
185
|
+
// though it still needs access to 'signal' instance.
|
|
186
|
+
function* tweenRunner(next, duration, easing, lerpFn) {
|
|
187
|
+
const from = signal.get();
|
|
188
|
+
const gen = tween(duration, (t) => {
|
|
189
|
+
const eased = easing(t);
|
|
190
|
+
let v;
|
|
191
|
+
if (lerpFn) {
|
|
192
|
+
v = lerpFn(from, next, eased);
|
|
193
|
+
}
|
|
194
|
+
else if (typeof from === "number" || typeof next === "number") {
|
|
195
|
+
v = lerpNullable(from, next, eased);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Discrete step for non-interpolatable types
|
|
199
|
+
v = eased === 1 ? next : from;
|
|
200
|
+
}
|
|
201
|
+
signal.set(v);
|
|
202
|
+
});
|
|
203
|
+
let res = gen.next();
|
|
204
|
+
if (res.done)
|
|
205
|
+
return;
|
|
206
|
+
while (!res.done) {
|
|
207
|
+
const dt = yield; // Receive delta time
|
|
208
|
+
res = gen.next(dt);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
signal.tween = (next, duration, easing, lerp) => {
|
|
212
|
+
return tweenRunner(next, duration, easing ?? linear, lerp ?? defaultLerp);
|
|
213
|
+
};
|
|
214
|
+
return signal;
|
|
215
|
+
}
|
|
216
|
+
export default createSignal;
|
|
217
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/signal/signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { FrameGenerator } from "@/project/generator";
|
|
2
|
+
import { EaseFunction } from "@/tween/ease";
|
|
3
|
+
export type Subscriber<T> = (value: T) => void;
|
|
4
|
+
export type Unsubscribe = () => void;
|
|
5
|
+
export interface Subscribable<T> {
|
|
6
|
+
subscribe(subscriber: Subscriber<T>): Unsubscribe;
|
|
7
|
+
}
|
|
8
|
+
export interface ReadSignal<T> {
|
|
9
|
+
(): T;
|
|
10
|
+
get(): T;
|
|
11
|
+
}
|
|
12
|
+
export interface PrimativeWriteSignal<T> {
|
|
13
|
+
(next: T | ((prev: T) => T)): void;
|
|
14
|
+
set(next: T | ((prev: T) => T)): void;
|
|
15
|
+
}
|
|
16
|
+
export interface ComputeWriteSignal<T> {
|
|
17
|
+
(fn: (() => T)): void;
|
|
18
|
+
set(fn: (() => T)): void;
|
|
19
|
+
}
|
|
20
|
+
export interface WriteSignal<T> {
|
|
21
|
+
(next: T | ((prev: T) => T) | (() => T)): void;
|
|
22
|
+
set(next: T | ((prev: T) => T) | (() => T)): void;
|
|
23
|
+
}
|
|
24
|
+
export interface TweenSignal<T> {
|
|
25
|
+
(next: T, duration: number, easing?: EaseFunction, lerp?: (from: T, to: T, t: number) => T): FrameGenerator;
|
|
26
|
+
tween(next: T, duration: number, easing?: EaseFunction, lerp?: (from: T, to: T, t: number) => T): FrameGenerator;
|
|
27
|
+
}
|
|
28
|
+
export interface PrimativeSignal<T> extends ReadSignal<T>, PrimativeWriteSignal<T>, Subscribable<T>, TweenSignal<T> {
|
|
29
|
+
}
|
|
30
|
+
export interface Signal<T> extends Subscribable<T>, TweenSignal<T>, ReadSignal<T>, WriteSignal<T> {
|
|
31
|
+
}
|
|
32
|
+
export interface ComputeSignal<T> extends ReadSignal<T>, ComputeWriteSignal<T>, Subscribable<T> {
|
|
33
|
+
}
|
|
34
|
+
export interface MappedSignal<Prop, Internal> extends Signal<Internal> {
|
|
35
|
+
(next: Prop): void;
|
|
36
|
+
(next: Prop, duration: number, easing?: EaseFunction, lerp?: (from: Internal, to: Internal, t: number) => Internal): FrameGenerator;
|
|
37
|
+
set(next: Internal | Prop | ((prev: Internal) => Internal)): void;
|
|
38
|
+
setProp(next: Prop): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/signal/type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/signal/type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type EaseFunction = (t: number) => number;
|
|
2
|
+
interface SpringOptions {
|
|
3
|
+
mass: number;
|
|
4
|
+
stiffness: number;
|
|
5
|
+
}
|
|
6
|
+
declare const easeFactories: {
|
|
7
|
+
spring: (options: Partial<SpringOptions>) => EaseFunction;
|
|
8
|
+
};
|
|
9
|
+
declare const simpleEases: Record<string, EaseFunction>;
|
|
10
|
+
export type EaseType = keyof typeof simpleEases | `${keyof typeof easeFactories}${string}`;
|
|
11
|
+
export declare function getEase(easeStr: string): EaseFunction;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ease.d.ts","sourceRoot":"","sources":["../../src/tween/ease.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAGjD,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,QAAA,MAAM,aAAa;sBACG,OAAO,CAAC,aAAa,CAAC,KAAG,YAAY;CAQ1D,CAAC;AAEF,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAK7C,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,WAAW,GAAG,GAAG,MAAM,OAAO,aAAa,GAAG,MAAM,EAAE,CAAC;AAG3F,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA4BrD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const easeFactories = {
|
|
2
|
+
spring: (options) => {
|
|
3
|
+
// Default values merged with user overrides
|
|
4
|
+
const { mass, stiffness } = { mass: 1, stiffness: 100, ...options };
|
|
5
|
+
return (t) => {
|
|
6
|
+
return Math.sin(stiffness * t) * Math.exp(-mass * t) + 1;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const simpleEases = {
|
|
11
|
+
linear: (t) => t,
|
|
12
|
+
easeIn: (t) => t * t,
|
|
13
|
+
easeOut: (t) => t * (2 - t),
|
|
14
|
+
easeInOut: (t) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t,
|
|
15
|
+
};
|
|
16
|
+
export function getEase(easeStr) {
|
|
17
|
+
// 1. Match "name(args)" or just "name"
|
|
18
|
+
const funcMatch = easeStr.match(/^(\w+)(?:\((.*)\))?$/);
|
|
19
|
+
if (!funcMatch)
|
|
20
|
+
return simpleEases.linear;
|
|
21
|
+
const [, name, argString] = funcMatch;
|
|
22
|
+
// 2. Handle Factory Functions (like spring)
|
|
23
|
+
if (name in easeFactories) {
|
|
24
|
+
const options = {};
|
|
25
|
+
if (argString) {
|
|
26
|
+
// Split by comma and parse "key=value"
|
|
27
|
+
argString.split(',').forEach(pair => {
|
|
28
|
+
const [key, val] = pair.split('=').map(s => s.trim());
|
|
29
|
+
if (key && val) {
|
|
30
|
+
options[key] = parseFloat(val);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const factory = easeFactories[name];
|
|
35
|
+
return factory(options);
|
|
36
|
+
}
|
|
37
|
+
// 3. Fallback to Simple Lookups
|
|
38
|
+
return simpleEases[name] ?? simpleEases.linear;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ease.js","sourceRoot":"","sources":["../../src/tween/ease.ts"],"names":[],"mappings":"AAQA,MAAM,aAAa,GAAG;IAClB,MAAM,EAAE,CAAC,OAA+B,EAAgB,EAAE;QACtD,4CAA4C;QAC5C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAEpE,OAAO,CAAC,CAAS,EAAE,EAAE;YACjB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC,CAAC;IACN,CAAC;CACJ,CAAC;AAEF,MAAM,WAAW,GAAiC;IAC9C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;CAC/D,CAAC;AAIF,MAAM,UAAU,OAAO,CAAC,OAAe;IACnC,uCAAuC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAExD,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC;IAE1C,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;IAEtC,4CAA4C;IAC5C,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;QACxB,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,SAAS,EAAE,CAAC;YACZ,uCAAuC;YACvC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAChC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAkC,CAAC,CAAC;QAClE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,gCAAgC;IAChC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EaseFunction } from "./ease";
|
|
2
|
+
export declare const linear: EaseFunction;
|
|
3
|
+
export declare const easeInQuad: EaseFunction;
|
|
4
|
+
export declare const easeOutQuad: EaseFunction;
|
|
5
|
+
export declare const easeInOutQuad: EaseFunction;
|
|
6
|
+
export declare const easeOutBack: (overshoot?: number) => EaseFunction;
|
|
7
|
+
export declare const easeInBack: (overshoot?: number) => EaseFunction;
|
|
8
|
+
export declare const easeInOutBack: (overshoot?: number) => EaseFunction;
|
|
9
|
+
export declare const easeOutElastic: (amplitude?: number, period?: number) => EaseFunction;
|
|
10
|
+
export declare const easeInElastic: (amplitude?: number, period?: number) => EaseFunction;
|
|
11
|
+
export declare const easeInOutElastic: (amplitude?: number, period?: number) => EaseFunction;
|
|
12
|
+
//# sourceMappingURL=eases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eases.d.ts","sourceRoot":"","sources":["../../src/tween/eases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,eAAO,MAAM,MAAM,EAAE,YAAwC,CAAC;AAE9D,eAAO,MAAM,UAAU,EAAE,YAExB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YAEzB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAG3B,CAAC;AAEF,eAAO,MAAM,WAAW,GACpB,kBAAmB,KACpB,YAGF,CAAC;AAEF,eAAO,MAAM,UAAU,GACnB,kBAAmB,KACpB,YAGF,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,kBAAmB,KACpB,YAQF,CAAC;AAGF,eAAO,MAAM,cAAc,GACvB,kBAAa,EACb,eAAY,KACb,YAWF,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,kBAAa,EACb,eAAY,KACb,YAUF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GACzB,kBAAa,EACb,eAAa,KACd,YAqBF,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const linear = (t) => clamp01(t);
|
|
2
|
+
export const easeInQuad = (t) => {
|
|
3
|
+
t = clamp01(t);
|
|
4
|
+
return t * t;
|
|
5
|
+
};
|
|
6
|
+
export const easeOutQuad = (t) => {
|
|
7
|
+
t = clamp01(t);
|
|
8
|
+
return t * (2 - t);
|
|
9
|
+
};
|
|
10
|
+
export const easeInOutQuad = (t) => {
|
|
11
|
+
t = clamp01(t);
|
|
12
|
+
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
|
|
13
|
+
};
|
|
14
|
+
export const easeOutBack = (overshoot = 1.70158) => (t) => {
|
|
15
|
+
t = clamp01(t) - 1;
|
|
16
|
+
return 1 + t * t * ((overshoot + 1) * t + overshoot);
|
|
17
|
+
};
|
|
18
|
+
export const easeInBack = (overshoot = 1.70158) => (t) => {
|
|
19
|
+
t = clamp01(t);
|
|
20
|
+
return t * t * ((overshoot + 1) * t - overshoot);
|
|
21
|
+
};
|
|
22
|
+
export const easeInOutBack = (overshoot = 1.70158) => (t) => {
|
|
23
|
+
t = clamp01(t) * 2;
|
|
24
|
+
const s = overshoot * 1.525;
|
|
25
|
+
if (t < 1) {
|
|
26
|
+
return 0.5 * (t * t * ((s + 1) * t - s));
|
|
27
|
+
}
|
|
28
|
+
t -= 2;
|
|
29
|
+
return 0.5 * (t * t * ((s + 1) * t + s) + 2);
|
|
30
|
+
};
|
|
31
|
+
export const easeOutElastic = (amplitude = 1, period = 0.3) => (t) => {
|
|
32
|
+
t = clamp01(t);
|
|
33
|
+
if (t === 0 || t === 1)
|
|
34
|
+
return t;
|
|
35
|
+
const s = period / (2 * Math.PI) * Math.asin(1 / amplitude);
|
|
36
|
+
return (amplitude *
|
|
37
|
+
Math.pow(2, -10 * t) *
|
|
38
|
+
Math.sin((t - s) * (2 * Math.PI) / period) +
|
|
39
|
+
1);
|
|
40
|
+
};
|
|
41
|
+
export const easeInElastic = (amplitude = 1, period = 0.3) => (t) => {
|
|
42
|
+
t = clamp01(t);
|
|
43
|
+
if (t === 0 || t === 1)
|
|
44
|
+
return t;
|
|
45
|
+
const s = period / (2 * Math.PI) * Math.asin(1 / amplitude);
|
|
46
|
+
return -(amplitude *
|
|
47
|
+
Math.pow(2, 10 * (t - 1)) *
|
|
48
|
+
Math.sin((t - 1 - s) * (2 * Math.PI) / period));
|
|
49
|
+
};
|
|
50
|
+
export const easeInOutElastic = (amplitude = 1, period = 0.45) => (t) => {
|
|
51
|
+
t = clamp01(t) * 2;
|
|
52
|
+
if (t === 0 || t === 2)
|
|
53
|
+
return t / 2;
|
|
54
|
+
const s = period / (2 * Math.PI) * Math.asin(1 / amplitude);
|
|
55
|
+
if (t < 1) {
|
|
56
|
+
return -0.5 * (amplitude *
|
|
57
|
+
Math.pow(2, 10 * (t - 1)) *
|
|
58
|
+
Math.sin((t - 1 - s) * (2 * Math.PI) / period));
|
|
59
|
+
}
|
|
60
|
+
return (amplitude *
|
|
61
|
+
Math.pow(2, -10 * (t - 1)) *
|
|
62
|
+
Math.sin((t - 1 - s) * (2 * Math.PI) / period) *
|
|
63
|
+
0.5 +
|
|
64
|
+
1);
|
|
65
|
+
};
|
|
66
|
+
function clamp01(t) {
|
|
67
|
+
return Math.min(Math.max(t, 0), 1);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=eases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eases.js","sourceRoot":"","sources":["../../src/tween/eases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tween/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AAExB,cAAc,SAAS,CAAC;AAExB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tween/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AAExB,cAAc,SAAS,CAAC;AAExB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../src/tween/parallel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAiB,QAAQ,CACrB,GAAG,UAAU,EAAE,cAAc,EAAE,GAChC,cAAc,CAuBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function* parallel(...animations) {
|
|
2
|
+
if (animations.length === 0)
|
|
3
|
+
return;
|
|
4
|
+
const active = animations.slice();
|
|
5
|
+
let dt = undefined;
|
|
6
|
+
while (active.length > 0) {
|
|
7
|
+
let i = 0;
|
|
8
|
+
while (i < active.length) {
|
|
9
|
+
const result = active[i].next(dt);
|
|
10
|
+
if (result.done) {
|
|
11
|
+
// Swap-and-pop: O(1) removal, keeps array compact for cache-friendly iteration
|
|
12
|
+
active[i] = active[active.length - 1];
|
|
13
|
+
active.pop();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
i++;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (active.length > 0) {
|
|
20
|
+
dt = yield;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=parallel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/tween/parallel.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,CAAC,CAAC,QAAQ,CACrB,GAAG,UAA4B;IAE/B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IAClC,IAAI,EAAE,GAAuB,SAAS,CAAC;IAEvC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAS,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACd,+EAA+E;gBAC/E,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtC,MAAM,CAAC,GAAG,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACJ,CAAC,EAAE,CAAC;YACR,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,EAAE,GAAG,KAAK,CAAC;QACf,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/tween/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAiB,QAAQ,CACrB,GAAG,UAAU,EAAE,cAAc,EAAE,GAChC,cAAc,CAKhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/tween/sequence.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,CAAC,CAAC,QAAQ,CACrB,GAAG,UAA4B;IAE/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,6DAA6D;QAC7D,KAAK,CAAC,CAAC,SAAS,CAAC;IACrB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.test.d.ts","sourceRoot":"","sources":["../../../src/tween/tests/realtime.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { sequence } from '../sequence';
|
|
3
|
+
import { parallel } from '../parallel';
|
|
4
|
+
describe('realtime generators', () => {
|
|
5
|
+
// it('tween calls callback across frames and finishes at 1', () => {
|
|
6
|
+
// const calls: number[] = [];
|
|
7
|
+
// const duration = 0.1; // seconds -> gives several frames at 60 FPS
|
|
8
|
+
// const gen = tween(duration, (t) => calls.push(t));
|
|
9
|
+
// // Drive the generator to completion
|
|
10
|
+
// while (!gen.next().done) { }
|
|
11
|
+
// // There should be at least two calls (start..final)
|
|
12
|
+
// expect(calls.length).toBeGreaterThanOrEqual(2);
|
|
13
|
+
// // First call should be 0 (frame 0)
|
|
14
|
+
// expect(calls[0]).toBe(0);
|
|
15
|
+
// // Final call should be 1
|
|
16
|
+
// expect(calls[calls.length - 1]).toBe(1);
|
|
17
|
+
// // Values should be non-decreasing
|
|
18
|
+
// for (let i = 1; i < calls.length; i++) {
|
|
19
|
+
// expect(calls[i]).toBeGreaterThanOrEqual(calls[i - 1]);
|
|
20
|
+
// }
|
|
21
|
+
// });
|
|
22
|
+
it('sequence runs animations in order', () => {
|
|
23
|
+
const calls = [];
|
|
24
|
+
const a = (function* () {
|
|
25
|
+
calls.push('a0');
|
|
26
|
+
yield;
|
|
27
|
+
calls.push('a1');
|
|
28
|
+
yield;
|
|
29
|
+
})();
|
|
30
|
+
const b = (function* () {
|
|
31
|
+
calls.push('b0');
|
|
32
|
+
yield;
|
|
33
|
+
})();
|
|
34
|
+
const seq = sequence(a, b);
|
|
35
|
+
while (!seq.next().done) { }
|
|
36
|
+
expect(calls).toEqual(['a0', 'a1', 'b0']);
|
|
37
|
+
});
|
|
38
|
+
it('parallel advances animations together and completes when all done', () => {
|
|
39
|
+
const calls = [];
|
|
40
|
+
const a = (function* () {
|
|
41
|
+
calls.push('a0');
|
|
42
|
+
yield;
|
|
43
|
+
calls.push('a1');
|
|
44
|
+
yield;
|
|
45
|
+
})();
|
|
46
|
+
const b = (function* () {
|
|
47
|
+
calls.push('b0');
|
|
48
|
+
yield;
|
|
49
|
+
})();
|
|
50
|
+
const p = parallel(a, b);
|
|
51
|
+
while (!p.next().done) { }
|
|
52
|
+
// Expect interleaved execution: a0, b0, a1
|
|
53
|
+
expect(calls).toEqual(['a0', 'b0', 'a1']);
|
|
54
|
+
});
|
|
55
|
+
// it('any delegates to parallel (same behavior)', () => {
|
|
56
|
+
// const calls1: string[] = [];
|
|
57
|
+
// const calls2: string[] = [];
|
|
58
|
+
// const makeA = () => (function* () {
|
|
59
|
+
// calls1.push('a0');
|
|
60
|
+
// yield;
|
|
61
|
+
// calls1.push('a1');
|
|
62
|
+
// yield;
|
|
63
|
+
// })();
|
|
64
|
+
// const makeB = () => (function* () {
|
|
65
|
+
// calls1.push('b0');
|
|
66
|
+
// yield;
|
|
67
|
+
// })();
|
|
68
|
+
// const a1 = (function* () { calls2.push('a0'); yield; calls2.push('a1'); yield; })();
|
|
69
|
+
// const b1 = (function* () { calls2.push('b0'); yield; })();
|
|
70
|
+
// const parGen = parallel(makeA(), makeB());
|
|
71
|
+
// while (!parGen.next().done) { }
|
|
72
|
+
// expect(calls2).toEqual(['a0', 'b0', 'a1']);
|
|
73
|
+
// expect(calls1).toEqual(['a0', 'b0', 'a1']);
|
|
74
|
+
// });
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=realtime.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.test.js","sourceRoot":"","sources":["../../../src/tween/tests/realtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAEjC,qEAAqE;IACrE,kCAAkC;IAClC,yEAAyE;IAEzE,yDAAyD;IAEzD,2CAA2C;IAC3C,mCAAmC;IAEnC,2DAA2D;IAC3D,sDAAsD;IACtD,0CAA0C;IAC1C,gCAAgC;IAChC,gCAAgC;IAChC,+CAA+C;IAC/C,yCAAyC;IACzC,+CAA+C;IAC/C,iEAAiE;IACjE,QAAQ;IACR,MAAM;IAEN,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;QACV,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;QACV,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QACzE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;QACV,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC;QACV,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1B,2CAA2C;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,mCAAmC;IACnC,mCAAmC;IAEnC,0CAA0C;IAC1C,6BAA6B;IAC7B,iBAAiB;IACjB,6BAA6B;IAC7B,iBAAiB;IACjB,YAAY;IAEZ,0CAA0C;IAC1C,6BAA6B;IAC7B,iBAAiB;IACjB,YAAY;IAEZ,2FAA2F;IAC3F,iEAAiE;IAEjE,iDAAiD;IAEjD,sCAAsC;IAEtC,kDAAkD;IAClD,kDAAkD;IAClD,MAAM;AAEV,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tween.d.ts","sourceRoot":"","sources":["../../src/tween/tween.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,wBAAiB,KAAK,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC9B,cAAc,CAgBhB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function* tween(duration, callback) {
|
|
2
|
+
const durationMs = duration * 1000;
|
|
3
|
+
let elapsedMs = 0;
|
|
4
|
+
while (elapsedMs < durationMs) {
|
|
5
|
+
const t = elapsedMs / durationMs;
|
|
6
|
+
callback(t);
|
|
7
|
+
const dt = yield;
|
|
8
|
+
elapsedMs += dt;
|
|
9
|
+
}
|
|
10
|
+
// Ensure the tween ends exactly at 1
|
|
11
|
+
callback(1);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=tween.js.map
|