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.
Files changed (250) hide show
  1. package/dist/attributes/bounds/bounds.d.ts +10 -0
  2. package/dist/attributes/bounds/bounds.d.ts.map +1 -0
  3. package/dist/attributes/bounds/bounds.js +2 -0
  4. package/dist/attributes/bounds/bounds.js.map +1 -0
  5. package/dist/attributes/fill/blend.d.ts +4 -0
  6. package/dist/attributes/fill/blend.d.ts.map +1 -0
  7. package/dist/attributes/fill/blend.js +14 -0
  8. package/dist/attributes/fill/blend.js.map +1 -0
  9. package/dist/attributes/fill/fill.d.ts +28 -0
  10. package/dist/attributes/fill/fill.d.ts.map +1 -0
  11. package/dist/attributes/fill/fill.js +23 -0
  12. package/dist/attributes/fill/fill.js.map +1 -0
  13. package/dist/attributes/fill/registry.d.ts +23 -0
  14. package/dist/attributes/fill/registry.d.ts.map +1 -0
  15. package/dist/attributes/fill/registry.js +106 -0
  16. package/dist/attributes/fill/registry.js.map +1 -0
  17. package/dist/attributes/index.d.ts +9 -0
  18. package/dist/attributes/index.d.ts.map +1 -0
  19. package/dist/attributes/index.js +9 -0
  20. package/dist/attributes/index.js.map +1 -0
  21. package/dist/attributes/insets/inset.d.ts +7 -0
  22. package/dist/attributes/insets/inset.d.ts.map +1 -0
  23. package/dist/attributes/insets/inset.js +2 -0
  24. package/dist/attributes/insets/inset.js.map +1 -0
  25. package/dist/attributes/position/vector2.d.ts +5 -0
  26. package/dist/attributes/position/vector2.d.ts.map +1 -0
  27. package/dist/attributes/position/vector2.js +2 -0
  28. package/dist/attributes/position/vector2.js.map +1 -0
  29. package/dist/attributes/size/constraints.d.ts +5 -0
  30. package/dist/attributes/size/constraints.d.ts.map +1 -0
  31. package/dist/attributes/size/constraints.js +2 -0
  32. package/dist/attributes/size/constraints.js.map +1 -0
  33. package/dist/attributes/size/size.d.ts +6 -0
  34. package/dist/attributes/size/size.d.ts.map +1 -0
  35. package/dist/attributes/size/size.js +2 -0
  36. package/dist/attributes/size/size.js.map +1 -0
  37. package/dist/attributes/stroke/stroke.d.ts +6 -0
  38. package/dist/attributes/stroke/stroke.d.ts.map +1 -0
  39. package/dist/attributes/stroke/stroke.js +2 -0
  40. package/dist/attributes/stroke/stroke.js.map +1 -0
  41. package/dist/index.d.ts +8 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +8 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/jsx/jsx-dev-runtime.d.ts +4 -0
  46. package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
  47. package/dist/jsx/jsx-dev-runtime.js +16 -0
  48. package/dist/jsx/jsx-dev-runtime.js.map +1 -0
  49. package/dist/jsx/jsx-runtime.d.ts +4 -0
  50. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  51. package/dist/jsx/jsx-runtime.js +16 -0
  52. package/dist/jsx/jsx-runtime.js.map +1 -0
  53. package/dist/nodes/base/node.d.ts +37 -0
  54. package/dist/nodes/base/node.d.ts.map +1 -0
  55. package/dist/nodes/base/node.js +107 -0
  56. package/dist/nodes/base/node.js.map +1 -0
  57. package/dist/nodes/flex/node.d.ts +35 -0
  58. package/dist/nodes/flex/node.d.ts.map +1 -0
  59. package/dist/nodes/flex/node.js +318 -0
  60. package/dist/nodes/flex/node.js.map +1 -0
  61. package/dist/nodes/flex/props.d.ts +27 -0
  62. package/dist/nodes/flex/props.d.ts.map +1 -0
  63. package/dist/nodes/flex/props.js +2 -0
  64. package/dist/nodes/flex/props.js.map +1 -0
  65. package/dist/nodes/index.d.ts +13 -0
  66. package/dist/nodes/index.d.ts.map +1 -0
  67. package/dist/nodes/index.js +13 -0
  68. package/dist/nodes/index.js.map +1 -0
  69. package/dist/nodes/rect/node.d.ts +14 -0
  70. package/dist/nodes/rect/node.d.ts.map +1 -0
  71. package/dist/nodes/rect/node.js +55 -0
  72. package/dist/nodes/rect/node.js.map +1 -0
  73. package/dist/nodes/rect/props.d.ts +10 -0
  74. package/dist/nodes/rect/props.d.ts.map +1 -0
  75. package/dist/nodes/rect/props.js +2 -0
  76. package/dist/nodes/rect/props.js.map +1 -0
  77. package/dist/nodes/registry.d.ts +3 -0
  78. package/dist/nodes/registry.d.ts.map +1 -0
  79. package/dist/nodes/registry.js +31 -0
  80. package/dist/nodes/registry.js.map +1 -0
  81. package/dist/nodes/shape/node.d.ts +15 -0
  82. package/dist/nodes/shape/node.d.ts.map +1 -0
  83. package/dist/nodes/shape/node.js +32 -0
  84. package/dist/nodes/shape/node.js.map +1 -0
  85. package/dist/nodes/shape/props.d.ts +8 -0
  86. package/dist/nodes/shape/props.d.ts.map +1 -0
  87. package/dist/nodes/shape/props.js +2 -0
  88. package/dist/nodes/shape/props.js.map +1 -0
  89. package/dist/nodes/text/node.d.ts +18 -0
  90. package/dist/nodes/text/node.d.ts.map +1 -0
  91. package/dist/nodes/text/node.js +76 -0
  92. package/dist/nodes/text/node.js.map +1 -0
  93. package/dist/nodes/text/props.d.ts +11 -0
  94. package/dist/nodes/text/props.d.ts.map +1 -0
  95. package/dist/nodes/text/props.js +2 -0
  96. package/dist/nodes/text/props.js.map +1 -0
  97. package/dist/nodes/transform/node.d.ts +39 -0
  98. package/dist/nodes/transform/node.d.ts.map +1 -0
  99. package/dist/nodes/transform/node.js +160 -0
  100. package/dist/nodes/transform/node.js.map +1 -0
  101. package/dist/nodes/transform/props.d.ts +11 -0
  102. package/dist/nodes/transform/props.d.ts.map +1 -0
  103. package/dist/nodes/transform/props.js +2 -0
  104. package/dist/nodes/transform/props.js.map +1 -0
  105. package/dist/project/generator.d.ts +2 -0
  106. package/dist/project/generator.d.ts.map +1 -0
  107. package/dist/project/generator.js +2 -0
  108. package/dist/project/generator.js.map +1 -0
  109. package/dist/project/index.d.ts +4 -0
  110. package/dist/project/index.d.ts.map +1 -0
  111. package/dist/project/index.js +4 -0
  112. package/dist/project/index.js.map +1 -0
  113. package/dist/project/project.d.ts +14 -0
  114. package/dist/project/project.d.ts.map +1 -0
  115. package/dist/project/project.js +2 -0
  116. package/dist/project/project.js.map +1 -0
  117. package/dist/project/scene.d.ts +49 -0
  118. package/dist/project/scene.d.ts.map +1 -0
  119. package/dist/project/scene.js +2 -0
  120. package/dist/project/scene.js.map +1 -0
  121. package/dist/rendering/contexts/draw-context.d.ts +17 -0
  122. package/dist/rendering/contexts/draw-context.d.ts.map +1 -0
  123. package/dist/rendering/contexts/draw-context.js +12 -0
  124. package/dist/rendering/contexts/draw-context.js.map +1 -0
  125. package/dist/rendering/contexts/pixi-context.d.ts +29 -0
  126. package/dist/rendering/contexts/pixi-context.d.ts.map +1 -0
  127. package/dist/rendering/contexts/pixi-context.js +117 -0
  128. package/dist/rendering/contexts/pixi-context.js.map +1 -0
  129. package/dist/rendering/index.d.ts +11 -0
  130. package/dist/rendering/index.d.ts.map +1 -0
  131. package/dist/rendering/index.js +11 -0
  132. package/dist/rendering/index.js.map +1 -0
  133. package/dist/rendering/painters/base/painter.d.ts +9 -0
  134. package/dist/rendering/painters/base/painter.d.ts.map +1 -0
  135. package/dist/rendering/painters/base/painter.js +12 -0
  136. package/dist/rendering/painters/base/painter.js.map +1 -0
  137. package/dist/rendering/painters/ellipse/ellipse.d.ts +9 -0
  138. package/dist/rendering/painters/ellipse/ellipse.d.ts.map +1 -0
  139. package/dist/rendering/painters/ellipse/ellipse.js +2 -0
  140. package/dist/rendering/painters/ellipse/ellipse.js.map +1 -0
  141. package/dist/rendering/painters/latex/state.d.ts +6 -0
  142. package/dist/rendering/painters/latex/state.d.ts.map +1 -0
  143. package/dist/rendering/painters/latex/state.js +2 -0
  144. package/dist/rendering/painters/latex/state.js.map +1 -0
  145. package/dist/rendering/painters/rect/cache.d.ts +22 -0
  146. package/dist/rendering/painters/rect/cache.d.ts.map +1 -0
  147. package/dist/rendering/painters/rect/cache.js +106 -0
  148. package/dist/rendering/painters/rect/cache.js.map +1 -0
  149. package/dist/rendering/painters/rect/painter.d.ts +13 -0
  150. package/dist/rendering/painters/rect/painter.d.ts.map +1 -0
  151. package/dist/rendering/painters/rect/painter.js +66 -0
  152. package/dist/rendering/painters/rect/painter.js.map +1 -0
  153. package/dist/rendering/painters/rect/state.d.ts +11 -0
  154. package/dist/rendering/painters/rect/state.d.ts.map +1 -0
  155. package/dist/rendering/painters/rect/state.js +21 -0
  156. package/dist/rendering/painters/rect/state.js.map +1 -0
  157. package/dist/rendering/painters/shape/state.d.ts +9 -0
  158. package/dist/rendering/painters/shape/state.d.ts.map +1 -0
  159. package/dist/rendering/painters/shape/state.js +2 -0
  160. package/dist/rendering/painters/shape/state.js.map +1 -0
  161. package/dist/rendering/painters/text/cache.d.ts +30 -0
  162. package/dist/rendering/painters/text/cache.d.ts.map +1 -0
  163. package/dist/rendering/painters/text/cache.js +525 -0
  164. package/dist/rendering/painters/text/cache.js.map +1 -0
  165. package/dist/rendering/painters/text/geometry/font/cache.d.ts +9 -0
  166. package/dist/rendering/painters/text/geometry/font/cache.d.ts.map +1 -0
  167. package/dist/rendering/painters/text/geometry/font/cache.js +20 -0
  168. package/dist/rendering/painters/text/geometry/font/cache.js.map +1 -0
  169. package/dist/rendering/painters/text/geometry/font/fonts.json +3844 -0
  170. package/dist/rendering/painters/text/geometry/font/loader.d.ts +4 -0
  171. package/dist/rendering/painters/text/geometry/font/loader.d.ts.map +1 -0
  172. package/dist/rendering/painters/text/geometry/font/loader.js +33 -0
  173. package/dist/rendering/painters/text/geometry/font/loader.js.map +1 -0
  174. package/dist/rendering/painters/text/geometry/font/ttf.d.ts +27 -0
  175. package/dist/rendering/painters/text/geometry/font/ttf.d.ts.map +1 -0
  176. package/dist/rendering/painters/text/geometry/font/ttf.js +26 -0
  177. package/dist/rendering/painters/text/geometry/font/ttf.js.map +1 -0
  178. package/dist/rendering/painters/text/geometry/path.d.ts +16 -0
  179. package/dist/rendering/painters/text/geometry/path.d.ts.map +1 -0
  180. package/dist/rendering/painters/text/geometry/path.js +40 -0
  181. package/dist/rendering/painters/text/geometry/path.js.map +1 -0
  182. package/dist/rendering/painters/text/painter.d.ts +13 -0
  183. package/dist/rendering/painters/text/painter.d.ts.map +1 -0
  184. package/dist/rendering/painters/text/painter.js +69 -0
  185. package/dist/rendering/painters/text/painter.js.map +1 -0
  186. package/dist/rendering/painters/text/state.d.ts +12 -0
  187. package/dist/rendering/painters/text/state.d.ts.map +1 -0
  188. package/dist/rendering/painters/text/state.js +22 -0
  189. package/dist/rendering/painters/text/state.js.map +1 -0
  190. package/dist/rendering/painters/transform/painter.d.ts +9 -0
  191. package/dist/rendering/painters/transform/painter.d.ts.map +1 -0
  192. package/dist/rendering/painters/transform/painter.js +18 -0
  193. package/dist/rendering/painters/transform/painter.js.map +1 -0
  194. package/dist/rendering/painters/transform/state.d.ts +9 -0
  195. package/dist/rendering/painters/transform/state.d.ts.map +1 -0
  196. package/dist/rendering/painters/transform/state.js +2 -0
  197. package/dist/rendering/painters/transform/state.js.map +1 -0
  198. package/dist/rendering/textures/multi-fill.d.ts +1 -0
  199. package/dist/rendering/textures/multi-fill.d.ts.map +1 -0
  200. package/dist/rendering/textures/multi-fill.js +18 -0
  201. package/dist/rendering/textures/multi-fill.js.map +1 -0
  202. package/dist/signal/collector.d.ts +6 -0
  203. package/dist/signal/collector.d.ts.map +1 -0
  204. package/dist/signal/collector.js +18 -0
  205. package/dist/signal/collector.js.map +1 -0
  206. package/dist/signal/index.d.ts +3 -0
  207. package/dist/signal/index.d.ts.map +1 -0
  208. package/dist/signal/index.js +3 -0
  209. package/dist/signal/index.js.map +1 -0
  210. package/dist/signal/signal.d.ts +7 -0
  211. package/dist/signal/signal.d.ts.map +1 -0
  212. package/dist/signal/signal.js +217 -0
  213. package/dist/signal/signal.js.map +1 -0
  214. package/dist/signal/type.d.ts +40 -0
  215. package/dist/signal/type.d.ts.map +1 -0
  216. package/dist/signal/type.js +2 -0
  217. package/dist/signal/type.js.map +1 -0
  218. package/dist/tween/ease.d.ts +13 -0
  219. package/dist/tween/ease.d.ts.map +1 -0
  220. package/dist/tween/ease.js +40 -0
  221. package/dist/tween/ease.js.map +1 -0
  222. package/dist/tween/eases.d.ts +12 -0
  223. package/dist/tween/eases.d.ts.map +1 -0
  224. package/dist/tween/eases.js +69 -0
  225. package/dist/tween/eases.js.map +1 -0
  226. package/dist/tween/index.d.ts +7 -0
  227. package/dist/tween/index.d.ts.map +1 -0
  228. package/dist/tween/index.js +7 -0
  229. package/dist/tween/index.js.map +1 -0
  230. package/dist/tween/parallel.d.ts +3 -0
  231. package/dist/tween/parallel.d.ts.map +1 -0
  232. package/dist/tween/parallel.js +24 -0
  233. package/dist/tween/parallel.js.map +1 -0
  234. package/dist/tween/sequence.d.ts +3 -0
  235. package/dist/tween/sequence.d.ts.map +1 -0
  236. package/dist/tween/sequence.js +7 -0
  237. package/dist/tween/sequence.js.map +1 -0
  238. package/dist/tween/tests/realtime.test.d.ts +2 -0
  239. package/dist/tween/tests/realtime.test.d.ts.map +1 -0
  240. package/dist/tween/tests/realtime.test.js +76 -0
  241. package/dist/tween/tests/realtime.test.js.map +1 -0
  242. package/dist/tween/tween.d.ts +3 -0
  243. package/dist/tween/tween.d.ts.map +1 -0
  244. package/dist/tween/tween.js +14 -0
  245. package/dist/tween/tween.js.map +1 -0
  246. package/dist/tween/wait.d.ts +3 -0
  247. package/dist/tween/wait.d.ts.map +1 -0
  248. package/dist/tween/wait.js +10 -0
  249. package/dist/tween/wait.js.map +1 -0
  250. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=type.js.map
@@ -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,7 @@
1
+ export * from './ease';
2
+ export * from './eases';
3
+ export * from './tween';
4
+ export * from './parallel';
5
+ export * from './sequence';
6
+ export * from './wait';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ export * from './ease';
2
+ export * from './eases';
3
+ export * from './tween';
4
+ export * from './parallel';
5
+ export * from './sequence';
6
+ export * from './wait';
7
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import { FrameGenerator } from "@/project/generator";
2
+ export declare function parallel(...animations: FrameGenerator[]): FrameGenerator;
3
+ //# sourceMappingURL=parallel.d.ts.map
@@ -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,3 @@
1
+ import { FrameGenerator } from "@/project/generator";
2
+ export declare function sequence(...animations: FrameGenerator[]): FrameGenerator;
3
+ //# sourceMappingURL=sequence.d.ts.map
@@ -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,7 @@
1
+ export function* sequence(...animations) {
2
+ for (const animation of animations) {
3
+ // Run each animation to completion before starting the next.
4
+ yield* animation;
5
+ }
6
+ }
7
+ //# sourceMappingURL=sequence.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=realtime.test.d.ts.map
@@ -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,3 @@
1
+ import { FrameGenerator } from "@/project/generator";
2
+ export declare function tween(duration: number, callback: (t: number) => void): FrameGenerator;
3
+ //# sourceMappingURL=tween.d.ts.map
@@ -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