tensum 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/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/dist/coupled-system.d.ts +50 -0
- package/dist/coupled-system.d.ts.map +1 -0
- package/dist/coupled-system.js +269 -0
- package/dist/coupled-system.js.map +1 -0
- package/dist/coupled.d.ts +3 -0
- package/dist/coupled.d.ts.map +1 -0
- package/dist/coupled.js +2 -0
- package/dist/coupled.js.map +1 -0
- package/dist/css-linear.d.ts +20 -0
- package/dist/css-linear.d.ts.map +1 -0
- package/dist/css-linear.js +95 -0
- package/dist/css-linear.js.map +1 -0
- package/dist/css.d.ts +3 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +2 -0
- package/dist/css.js.map +1 -0
- package/dist/gsap/active-tracks.d.ts +32 -0
- package/dist/gsap/active-tracks.d.ts.map +1 -0
- package/dist/gsap/active-tracks.js +177 -0
- package/dist/gsap/active-tracks.js.map +1 -0
- package/dist/gsap/gsap-time.d.ts +10 -0
- package/dist/gsap/gsap-time.d.ts.map +1 -0
- package/dist/gsap/gsap-time.js +62 -0
- package/dist/gsap/gsap-time.js.map +1 -0
- package/dist/gsap/plugin-tween-coordinator.d.ts +30 -0
- package/dist/gsap/plugin-tween-coordinator.d.ts.map +1 -0
- package/dist/gsap/plugin-tween-coordinator.js +72 -0
- package/dist/gsap/plugin-tween-coordinator.js.map +1 -0
- package/dist/gsap/plugin.d.ts +84 -0
- package/dist/gsap/plugin.d.ts.map +1 -0
- package/dist/gsap/plugin.js +552 -0
- package/dist/gsap/plugin.js.map +1 -0
- package/dist/gsap/spring-to.d.ts +93 -0
- package/dist/gsap/spring-to.d.ts.map +1 -0
- package/dist/gsap/spring-to.js +569 -0
- package/dist/gsap/spring-to.js.map +1 -0
- package/dist/gsap/spring-track-policy.d.ts +24 -0
- package/dist/gsap/spring-track-policy.d.ts.map +1 -0
- package/dist/gsap/spring-track-policy.js +76 -0
- package/dist/gsap/spring-track-policy.js.map +1 -0
- package/dist/gsap/track-lifecycle.d.ts +16 -0
- package/dist/gsap/track-lifecycle.d.ts.map +1 -0
- package/dist/gsap/track-lifecycle.js +33 -0
- package/dist/gsap/track-lifecycle.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +9 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +38 -0
- package/dist/math.js.map +1 -0
- package/dist/model.d.ts +14 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +38 -0
- package/dist/model.js.map +1 -0
- package/dist/motion-compatibility.d.ts +18 -0
- package/dist/motion-compatibility.d.ts.map +1 -0
- package/dist/motion-compatibility.js +83 -0
- package/dist/motion-compatibility.js.map +1 -0
- package/dist/parameters.d.ts +52 -0
- package/dist/parameters.d.ts.map +1 -0
- package/dist/parameters.js +124 -0
- package/dist/parameters.js.map +1 -0
- package/dist/settling.d.ts +12 -0
- package/dist/settling.d.ts.map +1 -0
- package/dist/settling.js +107 -0
- package/dist/settling.js.map +1 -0
- package/dist/solver.d.ts +17 -0
- package/dist/solver.d.ts.map +1 -0
- package/dist/solver.js +190 -0
- package/dist/solver.js.map +1 -0
- package/dist/spring.d.ts +9 -0
- package/dist/spring.d.ts.map +1 -0
- package/dist/spring.js +91 -0
- package/dist/spring.js.map +1 -0
- package/dist/support/additive-spring-value.d.ts +39 -0
- package/dist/support/additive-spring-value.d.ts.map +1 -0
- package/dist/support/additive-spring-value.js +281 -0
- package/dist/support/additive-spring-value.js.map +1 -0
- package/dist/support/inertia.d.ts +34 -0
- package/dist/support/inertia.d.ts.map +1 -0
- package/dist/support/inertia.js +293 -0
- package/dist/support/inertia.js.map +1 -0
- package/dist/support/keyframes.d.ts +34 -0
- package/dist/support/keyframes.d.ts.map +1 -0
- package/dist/support/keyframes.js +117 -0
- package/dist/support/keyframes.js.map +1 -0
- package/dist/support/spring-value.d.ts +38 -0
- package/dist/support/spring-value.d.ts.map +1 -0
- package/dist/support/spring-value.js +289 -0
- package/dist/support/spring-value.js.map +1 -0
- package/dist/support/velocity.d.ts +14 -0
- package/dist/support/velocity.d.ts.map +1 -0
- package/dist/support/velocity.js +75 -0
- package/dist/support/velocity.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vector.d.ts +32 -0
- package/dist/vector.d.ts.map +1 -0
- package/dist/vector.js +121 -0
- package/dist/vector.js.map +1 -0
- package/package.json +68 -0
- package/src/coupled-system.ts +383 -0
- package/src/coupled.ts +10 -0
- package/src/css-linear.ts +148 -0
- package/src/css.ts +6 -0
- package/src/gsap/active-tracks.ts +244 -0
- package/src/gsap/gsap-time.ts +91 -0
- package/src/gsap/plugin-tween-coordinator.ts +112 -0
- package/src/gsap/plugin.ts +861 -0
- package/src/gsap/spring-to.ts +836 -0
- package/src/gsap/spring-track-policy.ts +133 -0
- package/src/gsap/track-lifecycle.ts +53 -0
- package/src/index.ts +130 -0
- package/src/math.ts +46 -0
- package/src/model.ts +70 -0
- package/src/motion-compatibility.ts +131 -0
- package/src/parameters.ts +226 -0
- package/src/settling.ts +141 -0
- package/src/solver.ts +262 -0
- package/src/spring.ts +119 -0
- package/src/support/additive-spring-value.ts +343 -0
- package/src/support/inertia.ts +367 -0
- package/src/support/keyframes.ts +188 -0
- package/src/support/spring-value.ts +399 -0
- package/src/support/velocity.ts +119 -0
- package/src/types.ts +70 -0
- package/src/vector.ts +191 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
const MAX_INTEGRATION_STEPS = 1_000_000;
|
|
2
|
+
function assertFinite(name, value) {
|
|
3
|
+
if (!Number.isFinite(value)) {
|
|
4
|
+
throw new RangeError(`${name} must be a finite number`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function assertPositive(name, value) {
|
|
8
|
+
assertFinite(name, value);
|
|
9
|
+
if (value <= 0)
|
|
10
|
+
throw new RangeError(`${name} must be greater than 0`);
|
|
11
|
+
}
|
|
12
|
+
function assertNonNegative(name, value) {
|
|
13
|
+
assertFinite(name, value);
|
|
14
|
+
if (value < 0)
|
|
15
|
+
throw new RangeError(`${name} must be greater than or equal to 0`);
|
|
16
|
+
}
|
|
17
|
+
export function createCoupledSpringSystem(options) {
|
|
18
|
+
if (options.particles.length === 0) {
|
|
19
|
+
throw new RangeError('a coupled spring system requires at least one particle');
|
|
20
|
+
}
|
|
21
|
+
const maxStep = options.maxStep === undefined ? 1 / 240 : options.maxStep;
|
|
22
|
+
assertPositive('maxStep', maxStep);
|
|
23
|
+
const particles = Object.freeze(options.particles.map((particle, index) => {
|
|
24
|
+
assertPositive(`particles[${index}].mass`, particle.mass);
|
|
25
|
+
assertFinite(`particles[${index}].position`, particle.position);
|
|
26
|
+
const velocity = particle.velocity === undefined ? 0 : particle.velocity;
|
|
27
|
+
assertFinite(`particles[${index}].velocity`, velocity);
|
|
28
|
+
if (particle.min !== undefined) {
|
|
29
|
+
assertFinite(`particles[${index}].min`, particle.min);
|
|
30
|
+
}
|
|
31
|
+
if (particle.max !== undefined) {
|
|
32
|
+
assertFinite(`particles[${index}].max`, particle.max);
|
|
33
|
+
}
|
|
34
|
+
if (particle.min !== undefined &&
|
|
35
|
+
particle.max !== undefined &&
|
|
36
|
+
particle.min > particle.max) {
|
|
37
|
+
throw new RangeError(`particles[${index}].min must not exceed max`);
|
|
38
|
+
}
|
|
39
|
+
const restitution = particle.restitution === undefined ? 0 : particle.restitution;
|
|
40
|
+
assertFinite(`particles[${index}].restitution`, restitution);
|
|
41
|
+
if (restitution < 0 || restitution > 1) {
|
|
42
|
+
throw new RangeError(`particles[${index}].restitution must be between 0 and 1`);
|
|
43
|
+
}
|
|
44
|
+
if (particle.anchor) {
|
|
45
|
+
assertFinite(`particles[${index}].anchor.target`, particle.anchor.target);
|
|
46
|
+
assertPositive(`particles[${index}].anchor.stiffness`, particle.anchor.stiffness);
|
|
47
|
+
assertNonNegative(`particles[${index}].anchor.damping`, particle.anchor.damping);
|
|
48
|
+
}
|
|
49
|
+
return Object.freeze({
|
|
50
|
+
...particle,
|
|
51
|
+
velocity: particle.fixed ? 0 : velocity,
|
|
52
|
+
restitution,
|
|
53
|
+
...(particle.anchor === undefined
|
|
54
|
+
? {}
|
|
55
|
+
: { anchor: Object.freeze({ ...particle.anchor }) }),
|
|
56
|
+
});
|
|
57
|
+
}));
|
|
58
|
+
const dimension = particles.length;
|
|
59
|
+
const connections = Object.freeze(options.connections.map((connection, index) => {
|
|
60
|
+
if (!Number.isInteger(connection.from) ||
|
|
61
|
+
connection.from < 0 ||
|
|
62
|
+
connection.from >= dimension) {
|
|
63
|
+
throw new RangeError(`connections[${index}].from is out of range`);
|
|
64
|
+
}
|
|
65
|
+
if (!Number.isInteger(connection.to) ||
|
|
66
|
+
connection.to < 0 ||
|
|
67
|
+
connection.to >= dimension) {
|
|
68
|
+
throw new RangeError(`connections[${index}].to is out of range`);
|
|
69
|
+
}
|
|
70
|
+
if (connection.from === connection.to) {
|
|
71
|
+
throw new RangeError(`connections[${index}] must join two particles`);
|
|
72
|
+
}
|
|
73
|
+
assertPositive(`connections[${index}].stiffness`, connection.stiffness);
|
|
74
|
+
assertNonNegative(`connections[${index}].damping`, connection.damping);
|
|
75
|
+
const restOffset = connection.restOffset === undefined ? 0 : connection.restOffset;
|
|
76
|
+
assertFinite(`connections[${index}].restOffset`, restOffset);
|
|
77
|
+
return Object.freeze({ ...connection, restOffset });
|
|
78
|
+
}));
|
|
79
|
+
const fixedPositions = particles.map((particle) => particle.position);
|
|
80
|
+
const initialState = Object.freeze({
|
|
81
|
+
position: Object.freeze(particles.map((particle) => particle.position)),
|
|
82
|
+
velocity: Object.freeze(particles.map((particle) => particle.velocity)),
|
|
83
|
+
});
|
|
84
|
+
const validateState = (state) => {
|
|
85
|
+
if (state.position.length !== dimension || state.velocity.length !== dimension) {
|
|
86
|
+
throw new RangeError(`state must contain exactly ${dimension} components`);
|
|
87
|
+
}
|
|
88
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
89
|
+
assertFinite(`state.position[${index}]`, state.position[index]);
|
|
90
|
+
assertFinite(`state.velocity[${index}]`, state.velocity[index]);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const forceAtMutable = (position, velocity) => {
|
|
94
|
+
const force = Array(dimension).fill(0);
|
|
95
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
96
|
+
const anchor = particles[index].anchor;
|
|
97
|
+
if (!anchor)
|
|
98
|
+
continue;
|
|
99
|
+
force[index] =
|
|
100
|
+
-anchor.stiffness * (position[index] - anchor.target) -
|
|
101
|
+
anchor.damping * velocity[index];
|
|
102
|
+
}
|
|
103
|
+
for (const connection of connections) {
|
|
104
|
+
const extension = position[connection.to] -
|
|
105
|
+
position[connection.from] -
|
|
106
|
+
connection.restOffset;
|
|
107
|
+
const relativeVelocity = velocity[connection.to] - velocity[connection.from];
|
|
108
|
+
const couplingForce = connection.stiffness * extension + connection.damping * relativeVelocity;
|
|
109
|
+
force[connection.from] += couplingForce;
|
|
110
|
+
force[connection.to] -= couplingForce;
|
|
111
|
+
}
|
|
112
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
113
|
+
assertFinite(`force[${index}]`, force[index]);
|
|
114
|
+
}
|
|
115
|
+
return force;
|
|
116
|
+
};
|
|
117
|
+
const derivative = (position, velocity) => {
|
|
118
|
+
const force = forceAtMutable(position, velocity);
|
|
119
|
+
return {
|
|
120
|
+
position: velocity.map((value, index) => particles[index].fixed ? 0 : value),
|
|
121
|
+
velocity: force.map((value, index) => particles[index].fixed ? 0 : value / particles[index].mass),
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
const integrateStep = (position, velocity, step) => {
|
|
125
|
+
const k1 = derivative(position, velocity);
|
|
126
|
+
const p2 = position.map((value, index) => value + (k1.position[index] * step) / 2);
|
|
127
|
+
const v2 = velocity.map((value, index) => value + (k1.velocity[index] * step) / 2);
|
|
128
|
+
const k2 = derivative(p2, v2);
|
|
129
|
+
const p3 = position.map((value, index) => value + (k2.position[index] * step) / 2);
|
|
130
|
+
const v3 = velocity.map((value, index) => value + (k2.velocity[index] * step) / 2);
|
|
131
|
+
const k3 = derivative(p3, v3);
|
|
132
|
+
const p4 = position.map((value, index) => value + k3.position[index] * step);
|
|
133
|
+
const v4 = velocity.map((value, index) => value + k3.velocity[index] * step);
|
|
134
|
+
const k4 = derivative(p4, v4);
|
|
135
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
136
|
+
const particle = particles[index];
|
|
137
|
+
if (particle.fixed) {
|
|
138
|
+
position[index] = fixedPositions[index];
|
|
139
|
+
velocity[index] = 0;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
position[index] =
|
|
143
|
+
position[index] +
|
|
144
|
+
(step / 6) *
|
|
145
|
+
(k1.position[index] +
|
|
146
|
+
2 * k2.position[index] +
|
|
147
|
+
2 * k3.position[index] +
|
|
148
|
+
k4.position[index]);
|
|
149
|
+
velocity[index] =
|
|
150
|
+
velocity[index] +
|
|
151
|
+
(step / 6) *
|
|
152
|
+
(k1.velocity[index] +
|
|
153
|
+
2 * k2.velocity[index] +
|
|
154
|
+
2 * k3.velocity[index] +
|
|
155
|
+
k4.velocity[index]);
|
|
156
|
+
assertFinite(`position[${index}]`, position[index]);
|
|
157
|
+
assertFinite(`velocity[${index}]`, velocity[index]);
|
|
158
|
+
if (particle.min !== undefined && position[index] < particle.min) {
|
|
159
|
+
position[index] = particle.min;
|
|
160
|
+
if (velocity[index] < 0)
|
|
161
|
+
velocity[index] = -velocity[index] * particle.restitution;
|
|
162
|
+
}
|
|
163
|
+
if (particle.max !== undefined && position[index] > particle.max) {
|
|
164
|
+
position[index] = particle.max;
|
|
165
|
+
if (velocity[index] > 0)
|
|
166
|
+
velocity[index] = -velocity[index] * particle.restitution;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const advanceInto = (state, deltaTime, output) => {
|
|
171
|
+
validateState(state);
|
|
172
|
+
assertFinite('deltaTime', deltaTime);
|
|
173
|
+
if (deltaTime < 0) {
|
|
174
|
+
throw new RangeError('deltaTime must be greater than or equal to 0');
|
|
175
|
+
}
|
|
176
|
+
if (output.position.length < dimension || output.velocity.length < dimension) {
|
|
177
|
+
throw new RangeError(`output buffers must contain at least ${dimension} components`);
|
|
178
|
+
}
|
|
179
|
+
if (deltaTime === 0) {
|
|
180
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
181
|
+
output.position[index] = state.position[index];
|
|
182
|
+
output.velocity[index] = state.velocity[index];
|
|
183
|
+
}
|
|
184
|
+
return output;
|
|
185
|
+
}
|
|
186
|
+
const position = Array.from(state.position);
|
|
187
|
+
const velocity = Array.from(state.velocity);
|
|
188
|
+
const steps = Math.max(1, Math.ceil(deltaTime / maxStep));
|
|
189
|
+
if (!Number.isSafeInteger(steps) || steps > MAX_INTEGRATION_STEPS) {
|
|
190
|
+
throw new RangeError(`advance requires ${steps} integration steps; increase maxStep or split the simulation into smaller calls`);
|
|
191
|
+
}
|
|
192
|
+
const step = deltaTime / steps;
|
|
193
|
+
for (let index = 0; index < steps; index += 1) {
|
|
194
|
+
integrateStep(position, velocity, step);
|
|
195
|
+
}
|
|
196
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
197
|
+
output.position[index] = position[index];
|
|
198
|
+
output.velocity[index] = velocity[index];
|
|
199
|
+
}
|
|
200
|
+
return output;
|
|
201
|
+
};
|
|
202
|
+
const advance = (state, deltaTime) => {
|
|
203
|
+
const output = advanceInto(state, deltaTime, {
|
|
204
|
+
position: Array(dimension),
|
|
205
|
+
velocity: Array(dimension),
|
|
206
|
+
});
|
|
207
|
+
return Object.freeze({
|
|
208
|
+
position: Object.freeze(output.position),
|
|
209
|
+
velocity: Object.freeze(output.velocity),
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
return Object.freeze({
|
|
213
|
+
dimension,
|
|
214
|
+
particles,
|
|
215
|
+
connections,
|
|
216
|
+
initialState,
|
|
217
|
+
maxStep,
|
|
218
|
+
forceAt(state) {
|
|
219
|
+
validateState(state);
|
|
220
|
+
return Object.freeze(forceAtMutable(state.position, state.velocity));
|
|
221
|
+
},
|
|
222
|
+
accelerationAt(state) {
|
|
223
|
+
validateState(state);
|
|
224
|
+
const force = forceAtMutable(state.position, state.velocity);
|
|
225
|
+
return Object.freeze(force.map((value, index) => {
|
|
226
|
+
const acceleration = particles[index].fixed
|
|
227
|
+
? 0
|
|
228
|
+
: value / particles[index].mass;
|
|
229
|
+
assertFinite(`acceleration[${index}]`, acceleration);
|
|
230
|
+
return acceleration;
|
|
231
|
+
}));
|
|
232
|
+
},
|
|
233
|
+
advance,
|
|
234
|
+
advanceInto,
|
|
235
|
+
stateAt(time) {
|
|
236
|
+
assertFinite('time', time);
|
|
237
|
+
if (time < 0)
|
|
238
|
+
throw new RangeError('time must be greater than or equal to 0');
|
|
239
|
+
if (time === 0)
|
|
240
|
+
return initialState;
|
|
241
|
+
return advance(initialState, time);
|
|
242
|
+
},
|
|
243
|
+
energyAt(state) {
|
|
244
|
+
validateState(state);
|
|
245
|
+
let energy = 0;
|
|
246
|
+
for (let index = 0; index < dimension; index += 1) {
|
|
247
|
+
const particle = particles[index];
|
|
248
|
+
if (!particle.fixed) {
|
|
249
|
+
energy += (particle.mass * state.velocity[index] ** 2) / 2;
|
|
250
|
+
}
|
|
251
|
+
if (particle.anchor) {
|
|
252
|
+
energy +=
|
|
253
|
+
(particle.anchor.stiffness *
|
|
254
|
+
(state.position[index] - particle.anchor.target) ** 2) /
|
|
255
|
+
2;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
for (const connection of connections) {
|
|
259
|
+
const extension = state.position[connection.to] -
|
|
260
|
+
state.position[connection.from] -
|
|
261
|
+
connection.restOffset;
|
|
262
|
+
energy += (connection.stiffness * extension ** 2) / 2;
|
|
263
|
+
}
|
|
264
|
+
assertFinite('energy', energy);
|
|
265
|
+
return energy;
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=coupled-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupled-system.js","sourceRoot":"","sources":["../src/coupled-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createCoupledSpringSystem } from './coupled-system.js';
|
|
2
|
+
export type { CoupledAnchor, CoupledParticle, CoupledSpringOptions, CoupledSpringState, CoupledSpringSystem, MutableCoupledSpringState, SpringConnection, } from './coupled-system.js';
|
|
3
|
+
//# sourceMappingURL=coupled.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupled.d.ts","sourceRoot":"","sources":["../src/coupled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC"}
|
package/dist/coupled.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupled.js","sourceRoot":"","sources":["../src/coupled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SpringSolution } from './types.js';
|
|
2
|
+
export interface CSSLinearSpringOptions {
|
|
3
|
+
duration?: number;
|
|
4
|
+
maxError?: number;
|
|
5
|
+
maxDepth?: number;
|
|
6
|
+
maxSamples?: number;
|
|
7
|
+
precision?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface CSSLinearSample {
|
|
10
|
+
time: number;
|
|
11
|
+
progress: number;
|
|
12
|
+
}
|
|
13
|
+
export interface CSSLinearSpring {
|
|
14
|
+
easing: string;
|
|
15
|
+
duration: number;
|
|
16
|
+
maxError: number;
|
|
17
|
+
samples: readonly Readonly<CSSLinearSample>[];
|
|
18
|
+
}
|
|
19
|
+
export declare function springToCSSLinear(spring: SpringSolution, options?: CSSLinearSpringOptions): CSSLinearSpring;
|
|
20
|
+
//# sourceMappingURL=css-linear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-linear.d.ts","sourceRoot":"","sources":["../src/css-linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;CAC/C;AAmBD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAyGjB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
function assertPositive(name, value) {
|
|
2
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
3
|
+
throw new RangeError(`${name} must be a finite number greater than 0`);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
function assertPositiveInteger(name, value) {
|
|
7
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
8
|
+
throw new RangeError(`${name} must be a positive integer`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function rounded(value, precision) {
|
|
12
|
+
const result = Number(value.toFixed(precision));
|
|
13
|
+
return Object.is(result, -0) ? '0' : String(result);
|
|
14
|
+
}
|
|
15
|
+
export function springToCSSLinear(spring, options = {}) {
|
|
16
|
+
if (typeof options !== 'object' || options === null || Array.isArray(options)) {
|
|
17
|
+
throw new TypeError('CSS linear options must be an object when provided');
|
|
18
|
+
}
|
|
19
|
+
const duration = options.duration === undefined ? spring.timing.settlingDuration : options.duration;
|
|
20
|
+
const maxError = options.maxError === undefined ? 0.001 : options.maxError;
|
|
21
|
+
const maxDepth = options.maxDepth === undefined ? 12 : options.maxDepth;
|
|
22
|
+
const maxSamples = options.maxSamples === undefined ? 4096 : options.maxSamples;
|
|
23
|
+
const precision = options.precision === undefined ? 6 : options.precision;
|
|
24
|
+
assertPositive('duration', duration);
|
|
25
|
+
assertPositive('maxError', maxError);
|
|
26
|
+
assertPositiveInteger('maxDepth', maxDepth);
|
|
27
|
+
assertPositiveInteger('maxSamples', maxSamples);
|
|
28
|
+
if (!Number.isInteger(precision) || precision < 0 || precision > 15) {
|
|
29
|
+
throw new RangeError('precision must be an integer between 0 and 15');
|
|
30
|
+
}
|
|
31
|
+
const distance = spring.initialState.target - spring.initialState.position;
|
|
32
|
+
if (!Number.isFinite(distance)) {
|
|
33
|
+
throw new RangeError('CSS spring animation distance must be a finite number');
|
|
34
|
+
}
|
|
35
|
+
if (distance === 0) {
|
|
36
|
+
throw new RangeError('CSS spring export requires a non-zero animation distance');
|
|
37
|
+
}
|
|
38
|
+
const progressAt = (time) => {
|
|
39
|
+
if (spring.timing.settled && time >= duration)
|
|
40
|
+
return 1;
|
|
41
|
+
const progress = (spring.positionAt(time) - spring.initialState.position) / distance;
|
|
42
|
+
if (!Number.isFinite(progress)) {
|
|
43
|
+
throw new RangeError('normalized progress must be a finite number');
|
|
44
|
+
}
|
|
45
|
+
return progress;
|
|
46
|
+
};
|
|
47
|
+
const samples = [
|
|
48
|
+
{ time: 0, progress: progressAt(0) },
|
|
49
|
+
];
|
|
50
|
+
const append = (sample) => {
|
|
51
|
+
if (samples.length >= maxSamples) {
|
|
52
|
+
throw new RangeError(`CSS linear export exceeded maxSamples (${maxSamples})`);
|
|
53
|
+
}
|
|
54
|
+
samples.push(sample);
|
|
55
|
+
};
|
|
56
|
+
const refine = (start, end, depth) => {
|
|
57
|
+
const span = end.time - start.time;
|
|
58
|
+
const checkpoints = [0.25, 0.5, 0.75].map((fraction) => {
|
|
59
|
+
const time = start.time + span * fraction;
|
|
60
|
+
const progress = progressAt(time);
|
|
61
|
+
const linear = start.progress + (end.progress - start.progress) * fraction;
|
|
62
|
+
return { deviation: Math.abs(progress - linear), time, progress };
|
|
63
|
+
});
|
|
64
|
+
const needsRefinement = checkpoints.some(({ deviation }) => deviation > maxError);
|
|
65
|
+
if (needsRefinement && depth < maxDepth) {
|
|
66
|
+
const midpoint = checkpoints[1];
|
|
67
|
+
if (midpoint.time === start.time || midpoint.time === end.time) {
|
|
68
|
+
append(end);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const middle = { time: midpoint.time, progress: midpoint.progress };
|
|
72
|
+
refine(start, middle, depth + 1);
|
|
73
|
+
refine(middle, end, depth + 1);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
append(end);
|
|
77
|
+
};
|
|
78
|
+
// Quarter-period seeds prevent a high-frequency oscillation from aliasing to
|
|
79
|
+
// deceptively straight midpoint samples before adaptive refinement begins.
|
|
80
|
+
const seedCount = Math.max(1, Math.ceil((duration * spring.angularFrequency) / (Math.PI / 2)));
|
|
81
|
+
if (seedCount + 1 > maxSamples) {
|
|
82
|
+
throw new RangeError(`CSS linear export requires more than maxSamples (${maxSamples})`);
|
|
83
|
+
}
|
|
84
|
+
for (let index = 0; index < seedCount; index += 1) {
|
|
85
|
+
const start = samples.at(-1);
|
|
86
|
+
const time = ((index + 1) / seedCount) * duration;
|
|
87
|
+
refine(start, { time, progress: progressAt(time) }, 0);
|
|
88
|
+
}
|
|
89
|
+
const frozenSamples = Object.freeze(samples.map((sample) => Object.freeze({ ...sample })));
|
|
90
|
+
const easing = `linear(${frozenSamples
|
|
91
|
+
.map((sample) => `${rounded(sample.progress, precision)} ${rounded((sample.time / duration) * 100, precision)}%`)
|
|
92
|
+
.join(', ')})`;
|
|
93
|
+
return Object.freeze({ easing, duration, maxError, samples: frozenSamples });
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=css-linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-linear.js","sourceRoot":"","sources":["../src/css-linear.ts"],"names":[],"mappings":"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"}
|
package/dist/css.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,GACvB,MAAM,iBAAiB,CAAC"}
|
package/dist/css.js
ADDED
package/dist/css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SpringState } from '../types.js';
|
|
2
|
+
export interface ActiveTrackState extends SpringState {
|
|
3
|
+
unit?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ActiveTrackHandoffState extends ActiveTrackState {
|
|
6
|
+
terminal?: true;
|
|
7
|
+
}
|
|
8
|
+
export interface ActiveTrackSource {
|
|
9
|
+
state(globalTime?: number): ActiveTrackState;
|
|
10
|
+
restore(): void;
|
|
11
|
+
}
|
|
12
|
+
export interface ActiveTrackRegistration {
|
|
13
|
+
isActive(): boolean;
|
|
14
|
+
isOwner(): boolean;
|
|
15
|
+
activate(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Marks a normally completed track as terminal. A terminal owner remains as
|
|
18
|
+
* the handoff baseline while covered historical tracks are discarded.
|
|
19
|
+
*/
|
|
20
|
+
retire(): boolean;
|
|
21
|
+
release(options?: {
|
|
22
|
+
restore?: boolean;
|
|
23
|
+
}): boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function activeTrackState(target: unknown, property: string, globalTime?: number): ActiveTrackHandoffState | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Preserves a live/unchanged handoff, but atomically invalidates terminal
|
|
28
|
+
* history when the target was externally changed after completion.
|
|
29
|
+
*/
|
|
30
|
+
export declare function reconcileActiveTrackHandoff(target: unknown, property: string, inherited: ActiveTrackHandoffState | undefined, actualPosition: number, actualUnit: string | undefined): ActiveTrackHandoffState | undefined;
|
|
31
|
+
export declare function registerActiveTrack(target: unknown, property: string, source: ActiveTrackSource): ActiveTrackRegistration;
|
|
32
|
+
//# sourceMappingURL=active-tracks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-tracks.d.ts","sourceRoot":"","sources":["../../src/gsap/active-tracks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,IAAI,OAAO,CAAC;IACpB,OAAO,IAAI,OAAO,CAAC;IACnB,QAAQ,IAAI,IAAI,CAAC;IACjB;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC;IAClB,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;CACnD;AA+DD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,uBAAuB,GAAG,SAAS,CAOrC;AA6BD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,uBAAuB,GAAG,SAAS,EAC9C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,uBAAuB,GAAG,SAAS,CAUrC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,GACxB,uBAAuB,CAyFzB"}
|