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.
Files changed (134) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +21 -0
  3. package/README.md +340 -0
  4. package/dist/coupled-system.d.ts +50 -0
  5. package/dist/coupled-system.d.ts.map +1 -0
  6. package/dist/coupled-system.js +269 -0
  7. package/dist/coupled-system.js.map +1 -0
  8. package/dist/coupled.d.ts +3 -0
  9. package/dist/coupled.d.ts.map +1 -0
  10. package/dist/coupled.js +2 -0
  11. package/dist/coupled.js.map +1 -0
  12. package/dist/css-linear.d.ts +20 -0
  13. package/dist/css-linear.d.ts.map +1 -0
  14. package/dist/css-linear.js +95 -0
  15. package/dist/css-linear.js.map +1 -0
  16. package/dist/css.d.ts +3 -0
  17. package/dist/css.d.ts.map +1 -0
  18. package/dist/css.js +2 -0
  19. package/dist/css.js.map +1 -0
  20. package/dist/gsap/active-tracks.d.ts +32 -0
  21. package/dist/gsap/active-tracks.d.ts.map +1 -0
  22. package/dist/gsap/active-tracks.js +177 -0
  23. package/dist/gsap/active-tracks.js.map +1 -0
  24. package/dist/gsap/gsap-time.d.ts +10 -0
  25. package/dist/gsap/gsap-time.d.ts.map +1 -0
  26. package/dist/gsap/gsap-time.js +62 -0
  27. package/dist/gsap/gsap-time.js.map +1 -0
  28. package/dist/gsap/plugin-tween-coordinator.d.ts +30 -0
  29. package/dist/gsap/plugin-tween-coordinator.d.ts.map +1 -0
  30. package/dist/gsap/plugin-tween-coordinator.js +72 -0
  31. package/dist/gsap/plugin-tween-coordinator.js.map +1 -0
  32. package/dist/gsap/plugin.d.ts +84 -0
  33. package/dist/gsap/plugin.d.ts.map +1 -0
  34. package/dist/gsap/plugin.js +552 -0
  35. package/dist/gsap/plugin.js.map +1 -0
  36. package/dist/gsap/spring-to.d.ts +93 -0
  37. package/dist/gsap/spring-to.d.ts.map +1 -0
  38. package/dist/gsap/spring-to.js +569 -0
  39. package/dist/gsap/spring-to.js.map +1 -0
  40. package/dist/gsap/spring-track-policy.d.ts +24 -0
  41. package/dist/gsap/spring-track-policy.d.ts.map +1 -0
  42. package/dist/gsap/spring-track-policy.js +76 -0
  43. package/dist/gsap/spring-track-policy.js.map +1 -0
  44. package/dist/gsap/track-lifecycle.d.ts +16 -0
  45. package/dist/gsap/track-lifecycle.d.ts.map +1 -0
  46. package/dist/gsap/track-lifecycle.js +33 -0
  47. package/dist/gsap/track-lifecycle.js.map +1 -0
  48. package/dist/index.d.ts +28 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +16 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/math.d.ts +9 -0
  53. package/dist/math.d.ts.map +1 -0
  54. package/dist/math.js +38 -0
  55. package/dist/math.js.map +1 -0
  56. package/dist/model.d.ts +14 -0
  57. package/dist/model.d.ts.map +1 -0
  58. package/dist/model.js +38 -0
  59. package/dist/model.js.map +1 -0
  60. package/dist/motion-compatibility.d.ts +18 -0
  61. package/dist/motion-compatibility.d.ts.map +1 -0
  62. package/dist/motion-compatibility.js +83 -0
  63. package/dist/motion-compatibility.js.map +1 -0
  64. package/dist/parameters.d.ts +52 -0
  65. package/dist/parameters.d.ts.map +1 -0
  66. package/dist/parameters.js +124 -0
  67. package/dist/parameters.js.map +1 -0
  68. package/dist/settling.d.ts +12 -0
  69. package/dist/settling.d.ts.map +1 -0
  70. package/dist/settling.js +107 -0
  71. package/dist/settling.js.map +1 -0
  72. package/dist/solver.d.ts +17 -0
  73. package/dist/solver.d.ts.map +1 -0
  74. package/dist/solver.js +190 -0
  75. package/dist/solver.js.map +1 -0
  76. package/dist/spring.d.ts +9 -0
  77. package/dist/spring.d.ts.map +1 -0
  78. package/dist/spring.js +91 -0
  79. package/dist/spring.js.map +1 -0
  80. package/dist/support/additive-spring-value.d.ts +39 -0
  81. package/dist/support/additive-spring-value.d.ts.map +1 -0
  82. package/dist/support/additive-spring-value.js +281 -0
  83. package/dist/support/additive-spring-value.js.map +1 -0
  84. package/dist/support/inertia.d.ts +34 -0
  85. package/dist/support/inertia.d.ts.map +1 -0
  86. package/dist/support/inertia.js +293 -0
  87. package/dist/support/inertia.js.map +1 -0
  88. package/dist/support/keyframes.d.ts +34 -0
  89. package/dist/support/keyframes.d.ts.map +1 -0
  90. package/dist/support/keyframes.js +117 -0
  91. package/dist/support/keyframes.js.map +1 -0
  92. package/dist/support/spring-value.d.ts +38 -0
  93. package/dist/support/spring-value.d.ts.map +1 -0
  94. package/dist/support/spring-value.js +289 -0
  95. package/dist/support/spring-value.js.map +1 -0
  96. package/dist/support/velocity.d.ts +14 -0
  97. package/dist/support/velocity.d.ts.map +1 -0
  98. package/dist/support/velocity.js +75 -0
  99. package/dist/support/velocity.js.map +1 -0
  100. package/dist/types.d.ts +61 -0
  101. package/dist/types.d.ts.map +1 -0
  102. package/dist/types.js +2 -0
  103. package/dist/types.js.map +1 -0
  104. package/dist/vector.d.ts +32 -0
  105. package/dist/vector.d.ts.map +1 -0
  106. package/dist/vector.js +121 -0
  107. package/dist/vector.js.map +1 -0
  108. package/package.json +68 -0
  109. package/src/coupled-system.ts +383 -0
  110. package/src/coupled.ts +10 -0
  111. package/src/css-linear.ts +148 -0
  112. package/src/css.ts +6 -0
  113. package/src/gsap/active-tracks.ts +244 -0
  114. package/src/gsap/gsap-time.ts +91 -0
  115. package/src/gsap/plugin-tween-coordinator.ts +112 -0
  116. package/src/gsap/plugin.ts +861 -0
  117. package/src/gsap/spring-to.ts +836 -0
  118. package/src/gsap/spring-track-policy.ts +133 -0
  119. package/src/gsap/track-lifecycle.ts +53 -0
  120. package/src/index.ts +130 -0
  121. package/src/math.ts +46 -0
  122. package/src/model.ts +70 -0
  123. package/src/motion-compatibility.ts +131 -0
  124. package/src/parameters.ts +226 -0
  125. package/src/settling.ts +141 -0
  126. package/src/solver.ts +262 -0
  127. package/src/spring.ts +119 -0
  128. package/src/support/additive-spring-value.ts +343 -0
  129. package/src/support/inertia.ts +367 -0
  130. package/src/support/keyframes.ts +188 -0
  131. package/src/support/spring-value.ts +399 -0
  132. package/src/support/velocity.ts +119 -0
  133. package/src/types.ts +70 -0
  134. 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"}
@@ -0,0 +1,2 @@
1
+ export { createCoupledSpringSystem } from './coupled-system.js';
2
+ //# sourceMappingURL=coupled.js.map
@@ -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,3 @@
1
+ export { springToCSSLinear } from './css-linear.js';
2
+ export type { CSSLinearSample, CSSLinearSpring, CSSLinearSpringOptions, } from './css-linear.js';
3
+ //# sourceMappingURL=css.d.ts.map
@@ -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
@@ -0,0 +1,2 @@
1
+ export { springToCSSLinear } from './css-linear.js';
2
+ //# sourceMappingURL=css.js.map
@@ -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"}