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 @@
1
+ {"version":3,"file":"additive-spring-value.d.ts","sourceRoot":"","sources":["../../src/support/additive-spring-value.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EAGjB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,iCAAiC;IAChD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,CACnC,QAAQ,EAAE,QAAQ,CAAC,sBAAsB,CAAC,KACvC,IAAI,CAAC;AAEV,MAAM,WAAW,mBAAmB;IAClC,GAAG,IAAI,MAAM,CAAC;IACd,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI,MAAM,CAAC;IACpB,WAAW,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iCAAiC,GAAG,MAAM,CAAC;IAC9E,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAAC;IAC7E,OAAO,IAAI,IAAI,CAAC;CACjB;AAcD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,qBAA0B,GAClC,mBAAmB,CA+QrB"}
@@ -0,0 +1,281 @@
1
+ import { springParameters } from '../parameters.js';
2
+ import { resolveSettlingOptions } from '../settling.js';
3
+ import { createSpring, resolveSpringTimingInput } from '../spring.js';
4
+ function assertFinite(name, value) {
5
+ if (!Number.isFinite(value)) {
6
+ throw new RangeError(`${name} must be a finite number`);
7
+ }
8
+ }
9
+ /**
10
+ * Composes overlapping spring effects as independent additive contributions.
11
+ * Use createSpringValue when each new target should replace the previous one.
12
+ */
13
+ export function createAdditiveSpringValue(initialValue, parameters, driver, options = {}) {
14
+ assertFinite('initialValue', initialValue);
15
+ const defaultParameters = springParameters.fromPhysics(parameters);
16
+ const defaultSettling = resolveSettlingOptions(options.settle);
17
+ const defaultTiming = resolveSpringTimingInput(options.timing);
18
+ const listeners = {
19
+ change: new Set(),
20
+ settle: new Set(),
21
+ unsettled: new Set(),
22
+ };
23
+ const contributions = new Map();
24
+ let base = initialValue;
25
+ let value = initialValue;
26
+ let velocity = 0;
27
+ let nextId = 1;
28
+ let cancelFrame;
29
+ let destroyed = false;
30
+ let lastTime = Number.NEGATIVE_INFINITY;
31
+ let revision = 0;
32
+ const aggregateTarget = () => {
33
+ let aggregate = base;
34
+ for (const contribution of contributions.values()) {
35
+ aggregate += contribution.solution.initialState.target;
36
+ assertFinite('target', aggregate);
37
+ }
38
+ return aggregate;
39
+ };
40
+ const snapshot = () => Object.freeze({
41
+ value,
42
+ velocity,
43
+ target: aggregateTarget(),
44
+ animating: contributions.size > 0,
45
+ contributions: contributions.size,
46
+ });
47
+ const emit = (event) => {
48
+ if (destroyed || listeners[event].size === 0)
49
+ return;
50
+ const current = snapshot();
51
+ for (const listener of [...listeners[event]])
52
+ listener(current);
53
+ };
54
+ const write = (nextValue, nextVelocity) => {
55
+ assertFinite('value', nextValue);
56
+ assertFinite('velocity', nextVelocity);
57
+ const changed = !Object.is(value, nextValue) || !Object.is(velocity, nextVelocity);
58
+ value = nextValue;
59
+ velocity = nextVelocity;
60
+ if (changed)
61
+ emit('change');
62
+ };
63
+ const validateTime = (time) => {
64
+ assertFinite('frame time', time);
65
+ if (time < lastTime)
66
+ throw new RangeError('frame time must be monotonic');
67
+ lastTime = time;
68
+ };
69
+ const sample = (time) => {
70
+ validateTime(time);
71
+ if (contributions.size === 0)
72
+ return;
73
+ const sampledRevision = revision;
74
+ let positionSum = 0;
75
+ let velocitySum = 0;
76
+ let nextBase = base;
77
+ const removedIds = [];
78
+ let removed = false;
79
+ let becameUnsettled = false;
80
+ for (const [id, contribution] of contributions) {
81
+ const elapsed = Math.max(0, time - contribution.startedAt);
82
+ const result = contribution.solution.getSettlingResult();
83
+ if (result.settled && elapsed >= result.duration) {
84
+ nextBase += contribution.solution.initialState.target;
85
+ assertFinite('base', nextBase);
86
+ removedIds.push(id);
87
+ removed = true;
88
+ continue;
89
+ }
90
+ const state = contribution.solution.stateAt(elapsed);
91
+ positionSum += state.position;
92
+ velocitySum += state.velocity;
93
+ assertFinite('position sum', positionSum);
94
+ assertFinite('velocity sum', velocitySum);
95
+ if (!result.settled &&
96
+ !contribution.unsettledNotified &&
97
+ elapsed >= result.duration) {
98
+ contribution.unsettledNotified = true;
99
+ becameUnsettled = true;
100
+ }
101
+ }
102
+ const nextValue = nextBase + positionSum;
103
+ assertFinite('value', nextValue);
104
+ base = nextBase;
105
+ for (const id of removedIds)
106
+ contributions.delete(id);
107
+ write(nextValue, velocitySum);
108
+ if (revision !== sampledRevision)
109
+ return;
110
+ if (becameUnsettled) {
111
+ emit('unsettled');
112
+ if (revision !== sampledRevision)
113
+ return;
114
+ }
115
+ if (removed && contributions.size === 0)
116
+ emit('settle');
117
+ };
118
+ let requestFrame;
119
+ const frame = (time) => {
120
+ cancelFrame = undefined;
121
+ if (destroyed)
122
+ return;
123
+ sample(time);
124
+ if (contributions.size > 0)
125
+ requestFrame();
126
+ };
127
+ requestFrame = () => {
128
+ if (destroyed || cancelFrame || contributions.size === 0)
129
+ return;
130
+ cancelFrame = driver.schedule(frame);
131
+ };
132
+ const sampleNow = () => {
133
+ const time = driver.now();
134
+ sample(time);
135
+ return time;
136
+ };
137
+ const clearAtCurrentValue = () => {
138
+ base = value;
139
+ contributions.clear();
140
+ cancelFrame?.();
141
+ cancelFrame = undefined;
142
+ write(base, 0);
143
+ };
144
+ return Object.freeze({
145
+ get() {
146
+ return value;
147
+ },
148
+ getVelocity() {
149
+ return velocity;
150
+ },
151
+ getTarget() {
152
+ return snapshot().target;
153
+ },
154
+ getSnapshot: snapshot,
155
+ animateBy(delta, contributionOptions = {}) {
156
+ if (destroyed)
157
+ throw new Error('additive spring value has been destroyed');
158
+ assertFinite('delta', delta);
159
+ const initialVelocity = contributionOptions.velocity === undefined
160
+ ? 0
161
+ : contributionOptions.velocity;
162
+ assertFinite('velocity', initialVelocity);
163
+ const contributionParameters = springParameters.fromPhysics(contributionOptions.parameters === undefined
164
+ ? defaultParameters
165
+ : contributionOptions.parameters);
166
+ if (contributionOptions.settle !== undefined) {
167
+ resolveSettlingOptions(contributionOptions.settle);
168
+ }
169
+ const settle = {
170
+ position: defaultSettling.positionEpsilon,
171
+ velocity: defaultSettling.velocityEpsilon,
172
+ maxDuration: defaultSettling.maxDuration,
173
+ refinementIterations: defaultSettling.refinementIterations,
174
+ ...contributionOptions.settle,
175
+ };
176
+ const timing = contributionOptions.timing === undefined
177
+ ? defaultTiming
178
+ : resolveSpringTimingInput(contributionOptions.timing);
179
+ const time = sampleNow();
180
+ assertFinite('target', aggregateTarget() + delta);
181
+ const solution = createSpring({
182
+ from: 0,
183
+ to: delta,
184
+ velocity: initialVelocity,
185
+ ...contributionParameters,
186
+ settle,
187
+ ...(timing === undefined ? {} : { timing }),
188
+ });
189
+ const id = nextId;
190
+ nextId += 1;
191
+ revision += 1;
192
+ if (delta === 0 && initialVelocity === 0) {
193
+ if (contributions.size === 0)
194
+ emit('settle');
195
+ return id;
196
+ }
197
+ contributions.set(id, {
198
+ solution,
199
+ startedAt: time,
200
+ unsettledNotified: false,
201
+ });
202
+ requestFrame();
203
+ return id;
204
+ },
205
+ cancel(contributionId) {
206
+ if (destroyed)
207
+ return;
208
+ if (!Number.isInteger(contributionId) || contributionId <= 0) {
209
+ throw new RangeError('contribution must be a positive integer');
210
+ }
211
+ const time = sampleNow();
212
+ const contribution = contributions.get(contributionId);
213
+ if (!contribution)
214
+ return;
215
+ revision += 1;
216
+ const currentRevision = revision;
217
+ const state = contribution.solution.stateAt(Math.max(0, time - contribution.startedAt));
218
+ const nextBase = base + state.position;
219
+ const nextVelocity = velocity - state.velocity;
220
+ assertFinite('base', nextBase);
221
+ assertFinite('velocity', nextVelocity);
222
+ base = nextBase;
223
+ contributions.delete(contributionId);
224
+ write(value, nextVelocity);
225
+ if (revision !== currentRevision)
226
+ return;
227
+ if (contributions.size === 0) {
228
+ cancelFrame?.();
229
+ cancelFrame = undefined;
230
+ emit('settle');
231
+ }
232
+ },
233
+ jump(nextValue) {
234
+ if (destroyed)
235
+ return;
236
+ assertFinite('value', nextValue);
237
+ const changed = !Object.is(value, nextValue) || velocity !== 0;
238
+ revision += 1;
239
+ const currentRevision = revision;
240
+ base = nextValue;
241
+ contributions.clear();
242
+ cancelFrame?.();
243
+ cancelFrame = undefined;
244
+ write(nextValue, 0);
245
+ if (revision !== currentRevision)
246
+ return;
247
+ if (changed)
248
+ emit('settle');
249
+ },
250
+ stop() {
251
+ if (destroyed || contributions.size === 0)
252
+ return;
253
+ sampleNow();
254
+ if (contributions.size === 0)
255
+ return;
256
+ revision += 1;
257
+ const currentRevision = revision;
258
+ clearAtCurrentValue();
259
+ if (revision !== currentRevision)
260
+ return;
261
+ emit('settle');
262
+ },
263
+ on(event, listener) {
264
+ if (destroyed)
265
+ return () => undefined;
266
+ listeners[event].add(listener);
267
+ return () => listeners[event].delete(listener);
268
+ },
269
+ destroy() {
270
+ if (destroyed)
271
+ return;
272
+ revision += 1;
273
+ destroyed = true;
274
+ clearAtCurrentValue();
275
+ for (const eventListeners of Object.values(listeners)) {
276
+ eventListeners.clear();
277
+ }
278
+ },
279
+ });
280
+ }
281
+ //# sourceMappingURL=additive-spring-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"additive-spring-value.js","sourceRoot":"","sources":["../../src/support/additive-spring-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAsDtE,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAoB,EACpB,UAA4B,EAC5B,MAAmB,EACnB,UAAiC,EAAE;IAEnC,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,SAAS,GAA6D;QAC1E,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,SAAS,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE5D,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,WAAqC,CAAC;IAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,eAAe,GAAG,GAAW,EAAE;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;YACvD,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAqC,EAAE,CACtD,MAAM,CAAC,MAAM,CAAC;QACZ,KAAK;QACL,QAAQ;QACR,MAAM,EAAE,eAAe,EAAE;QACzB,SAAS,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC;QACjC,aAAa,EAAE,aAAa,CAAC,IAAI;KAClC,CAAC,CAAC;IAEL,MAAM,IAAI,GAAG,CAAC,KAA0B,EAAQ,EAAE;QAChD,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACrD,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,YAAoB,EAAQ,EAAE;QAC9D,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACjC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvC,MAAM,OAAO,GACX,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrE,KAAK,GAAG,SAAS,CAAC;QAClB,QAAQ,GAAG,YAAY,CAAC;QACxB,IAAI,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAQ,EAAE;QAC1C,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;QAC1E,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;QACpC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,eAAe,GAAG,QAAQ,CAAC;QAEjC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,aAAa,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACzD,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjD,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;gBACtD,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC/B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC;YAC9B,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC;YAC9B,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC1C,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC1C,IACE,CAAC,MAAM,CAAC,OAAO;gBACf,CAAC,YAAY,CAAC,iBAAiB;gBAC/B,OAAO,IAAI,MAAM,CAAC,QAAQ,EAC1B,CAAC;gBACD,YAAY,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACtC,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;QACzC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACjC,IAAI,GAAG,QAAQ,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,UAAU;YAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9B,IAAI,QAAQ,KAAK,eAAe;YAAE,OAAO;QACzC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,CAAC;YAClB,IAAI,QAAQ,KAAK,eAAe;gBAAE,OAAO;QAC3C,CAAC;QACD,IAAI,OAAO,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,IAAI,YAAwB,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,WAAW,GAAG,SAAS,CAAC;QACxB,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC;YAAE,YAAY,EAAE,CAAC;IAC7C,CAAC,CAAC;IAEF,YAAY,GAAG,GAAS,EAAE;QACxB,IAAI,SAAS,IAAI,WAAW,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACjE,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAW,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,GAAS,EAAE;QACrC,IAAI,GAAG,KAAK,CAAC;QACb,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,WAAW,EAAE,EAAE,CAAC;QAChB,WAAW,GAAG,SAAS,CAAC;QACxB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,WAAW;YACT,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,SAAS;YACP,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,WAAW,EAAE,QAAQ;QACrB,SAAS,CACP,KAAa,EACb,sBAAyD,EAAE;YAE3D,IAAI,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC3E,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,eAAe,GACnB,mBAAmB,CAAC,QAAQ,KAAK,SAAS;gBACxC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YACnC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC1C,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,WAAW,CACzD,mBAAmB,CAAC,UAAU,KAAK,SAAS;gBAC1C,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,mBAAmB,CAAC,UAAU,CACnC,CAAC;YACF,IAAI,mBAAmB,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7C,sBAAsB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,eAAe,CAAC,eAAe;gBACzC,QAAQ,EAAE,eAAe,CAAC,eAAe;gBACzC,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,oBAAoB,EAAE,eAAe,CAAC,oBAAoB;gBAC1D,GAAG,mBAAmB,CAAC,MAAM;aAC9B,CAAC;YACF,MAAM,MAAM,GACV,mBAAmB,CAAC,MAAM,KAAK,SAAS;gBACtC,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC5B,IAAI,EAAE,CAAC;gBACP,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE,eAAe;gBACzB,GAAG,sBAAsB;gBACzB,MAAM;gBACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;aAC5C,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,CAAC;YAClB,MAAM,IAAI,CAAC,CAAC;YACZ,QAAQ,IAAI,CAAC,CAAC;YAEd,IAAI,KAAK,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;gBACzC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE;gBACpB,QAAQ;gBACR,SAAS,EAAE,IAAI;gBACf,iBAAiB,EAAE,KAAK;aACzB,CAAC,CAAC;YACH,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,cAAsB;YAC3B,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,YAAY;gBAAE,OAAO;YAC1B,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,QAAQ,CAAC;YACjC,MAAM,KAAK,GAAgB,YAAY,CAAC,QAAQ,CAAC,OAAO,CACtD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAC3C,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC/C,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/B,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACvC,IAAI,GAAG,QAAQ,CAAC;YAChB,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACrC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC3B,IAAI,QAAQ,KAAK,eAAe;gBAAE,OAAO;YACzC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC7B,WAAW,EAAE,EAAE,CAAC;gBAChB,WAAW,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,SAAiB;YACpB,IAAI,SAAS;gBAAE,OAAO;YACtB,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAC/D,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,QAAQ,CAAC;YACjC,IAAI,GAAG,SAAS,CAAC;YACjB,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,WAAW,EAAE,EAAE,CAAC;YAChB,WAAW,GAAG,SAAS,CAAC;YACxB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,QAAQ,KAAK,eAAe;gBAAE,OAAO;YACzC,IAAI,OAAO;gBAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI;YACF,IAAI,SAAS,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO;YAClD,SAAS,EAAE,CAAC;YACZ,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO;YACrC,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,QAAQ,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,IAAI,QAAQ,KAAK,eAAe;gBAAE,OAAO;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjB,CAAC;QACD,EAAE,CAAC,KAA0B,EAAE,QAAgC;YAC7D,IAAI,SAAS;gBAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;YACtC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,QAAQ,IAAI,CAAC,CAAC;YACd,SAAS,GAAG,IAAI,CAAC;YACjB,mBAAmB,EAAE,CAAC;YACtB,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtD,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { SettlingResult, SpringParameters, SpringSettleInput, SpringSolution, SpringState } from '../types.js';
2
+ export interface InertiaOptions {
3
+ from: number;
4
+ velocity: number;
5
+ timeConstant?: number;
6
+ min?: number;
7
+ max?: number;
8
+ modifyTarget?: (naturalTarget: number) => number;
9
+ boundarySpring?: SpringParameters;
10
+ settle?: SpringSettleInput;
11
+ }
12
+ export interface InertiaBoundaryTransition {
13
+ readonly time: number;
14
+ readonly bound: number;
15
+ readonly incomingVelocity: number;
16
+ readonly spring: SpringSolution;
17
+ }
18
+ export type InertiaPhase = 'decay' | 'spring' | 'complete';
19
+ export interface InertiaSolution {
20
+ readonly initialState: Readonly<SpringState>;
21
+ readonly naturalTarget: number;
22
+ readonly target: number;
23
+ readonly duration: number;
24
+ readonly settled: boolean;
25
+ readonly boundary?: Readonly<InertiaBoundaryTransition>;
26
+ stateAt(time: number): SpringState;
27
+ positionAt(time: number): number;
28
+ velocityAt(time: number): number;
29
+ phaseAt(time: number): InertiaPhase;
30
+ getSettlingResult(): SettlingResult;
31
+ }
32
+ export declare function snapToGrid(size: number, origin?: number): (target: number) => number;
33
+ export declare function createInertia(options: InertiaOptions): InertiaSolution;
34
+ //# sourceMappingURL=inertia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inertia.d.ts","sourceRoot":"","sources":["../../src/support/inertia.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACZ,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACpC,iBAAiB,IAAI,cAAc,CAAC;CACrC;AAuBD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAS/E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CA2RtE"}
@@ -0,0 +1,293 @@
1
+ import { resolveSettlingOptions } from '../settling.js';
2
+ import { createSpring } from '../spring.js';
3
+ import { validateSpringParameters } from '../solver.js';
4
+ const DEFAULT_BOUNDARY_SPRING = Object.freeze({
5
+ mass: 1,
6
+ stiffness: 500,
7
+ damping: 40,
8
+ });
9
+ function assertFinite(name, value) {
10
+ if (!Number.isFinite(value)) {
11
+ throw new RangeError(`${name} must be a finite number`);
12
+ }
13
+ }
14
+ function assertPositive(name, value) {
15
+ assertFinite(name, value);
16
+ if (value <= 0)
17
+ throw new RangeError(`${name} must be greater than 0`);
18
+ }
19
+ function finiteState(position, velocity, suffix = '') {
20
+ assertFinite(`position${suffix}`, position);
21
+ assertFinite(`velocity${suffix}`, velocity);
22
+ return { position, velocity };
23
+ }
24
+ export function snapToGrid(size, origin = 0) {
25
+ assertPositive('grid size', size);
26
+ assertFinite('grid origin', origin);
27
+ return (target) => {
28
+ assertFinite('target', target);
29
+ const result = origin + Math.round((target - origin) / size) * size;
30
+ assertFinite('snapped target', result);
31
+ return result;
32
+ };
33
+ }
34
+ export function createInertia(options) {
35
+ assertFinite('from', options.from);
36
+ assertFinite('velocity', options.velocity);
37
+ const timeConstant = options.timeConstant === undefined ? 0.7 : options.timeConstant;
38
+ assertPositive('timeConstant', timeConstant);
39
+ if (options.min !== undefined)
40
+ assertFinite('min', options.min);
41
+ if (options.max !== undefined)
42
+ assertFinite('max', options.max);
43
+ if (options.min !== undefined &&
44
+ options.max !== undefined &&
45
+ options.min > options.max) {
46
+ throw new RangeError('min must be less than or equal to max');
47
+ }
48
+ const settling = resolveSettlingOptions(options.settle);
49
+ if (options.boundarySpring !== undefined) {
50
+ validateSpringParameters(options.boundarySpring);
51
+ }
52
+ const naturalTarget = options.from + options.velocity * timeConstant;
53
+ assertFinite('naturalTarget', naturalTarget);
54
+ const target = options.modifyTarget === undefined
55
+ ? naturalTarget
56
+ : options.modifyTarget(naturalTarget);
57
+ assertFinite('modified target', target);
58
+ const displacement = options.from - target;
59
+ assertFinite('displacement', displacement);
60
+ const linearCoefficient = options.velocity + displacement / timeConstant;
61
+ assertFinite('linear coefficient', linearCoefficient);
62
+ const decayStateAt = (time) => {
63
+ if (time === 0)
64
+ return { position: options.from, velocity: options.velocity };
65
+ const decay = Math.exp(-time / timeConstant);
66
+ if (decay === 0)
67
+ return { position: target, velocity: 0 };
68
+ const timeDecay = time * decay;
69
+ return finiteState(target + decay * displacement + timeDecay * linearCoefficient, decay * options.velocity -
70
+ (timeDecay / timeConstant) * linearCoefficient);
71
+ };
72
+ const decayBoundsAt = (time) => {
73
+ const decay = Math.exp(-time / timeConstant);
74
+ if (decay === 0)
75
+ return { position: 0, velocity: 0 };
76
+ const timeDecay = time * decay;
77
+ return finiteState(decay * Math.abs(displacement) +
78
+ timeDecay * Math.abs(linearCoefficient), decay * Math.abs(options.velocity) +
79
+ (timeDecay / timeConstant) * Math.abs(linearCoefficient), ' bound');
80
+ };
81
+ const boundsMeet = (time) => {
82
+ const bounds = decayBoundsAt(time);
83
+ return (bounds.position <= settling.positionEpsilon &&
84
+ bounds.velocity <= settling.velocityEpsilon);
85
+ };
86
+ let decayIterations = 0;
87
+ let decayResult;
88
+ if (displacement === 0 && options.velocity === 0) {
89
+ decayResult = { duration: 0, iterations: 0, settled: true };
90
+ }
91
+ else {
92
+ const absoluteLinearCoefficient = Math.abs(linearCoefficient);
93
+ const positionMonotonicAfter = absoluteLinearCoefficient === 0
94
+ ? 0
95
+ : Math.max(0, timeConstant - Math.abs(displacement) / absoluteLinearCoefficient);
96
+ const velocityMonotonicAfter = absoluteLinearCoefficient === 0
97
+ ? 0
98
+ : Math.max(0, timeConstant -
99
+ (Math.abs(options.velocity) * timeConstant) /
100
+ absoluteLinearCoefficient);
101
+ const boundsMonotonicAfter = Math.max(positionMonotonicAfter, velocityMonotonicAfter);
102
+ if (boundsMonotonicAfter > settling.maxDuration) {
103
+ decayResult = {
104
+ duration: settling.maxDuration,
105
+ iterations: 0,
106
+ settled: false,
107
+ };
108
+ }
109
+ else if (boundsMeet(0) && boundsMonotonicAfter === 0) {
110
+ decayResult = { duration: 0, iterations: 0, settled: true };
111
+ }
112
+ else {
113
+ let lower = boundsMonotonicAfter;
114
+ let upper = Math.max(lower, Math.min(settling.maxDuration, 1 / 120));
115
+ if (boundsMeet(lower)) {
116
+ decayResult = { duration: lower, iterations: 0, settled: true };
117
+ }
118
+ else {
119
+ while (upper < settling.maxDuration && !boundsMeet(upper)) {
120
+ lower = upper;
121
+ upper = Math.min(settling.maxDuration, upper * 2);
122
+ decayIterations += 1;
123
+ }
124
+ if (!boundsMeet(upper)) {
125
+ decayResult = {
126
+ duration: settling.maxDuration,
127
+ iterations: decayIterations,
128
+ settled: false,
129
+ };
130
+ }
131
+ else {
132
+ for (let iteration = 0; iteration < settling.refinementIterations; iteration += 1) {
133
+ const midpoint = lower + (upper - lower) / 2;
134
+ if (midpoint === lower || midpoint === upper)
135
+ break;
136
+ if (boundsMeet(midpoint))
137
+ upper = midpoint;
138
+ else
139
+ lower = midpoint;
140
+ decayIterations += 1;
141
+ }
142
+ decayResult = {
143
+ duration: upper,
144
+ iterations: decayIterations,
145
+ settled: true,
146
+ };
147
+ }
148
+ }
149
+ }
150
+ }
151
+ const outsideAtStart = options.min !== undefined && options.from < options.min
152
+ ? options.min
153
+ : options.max !== undefined && options.from > options.max
154
+ ? options.max
155
+ : options.min !== undefined &&
156
+ options.from === options.min &&
157
+ options.velocity < 0
158
+ ? options.min
159
+ : options.max !== undefined &&
160
+ options.from === options.max &&
161
+ options.velocity > 0
162
+ ? options.max
163
+ : undefined;
164
+ const findBoundary = () => {
165
+ if (outsideAtStart !== undefined)
166
+ return { time: 0, bound: outsideAtStart };
167
+ if (options.min === undefined && options.max === undefined)
168
+ return undefined;
169
+ const extremumTime = linearCoefficient === 0
170
+ ? undefined
171
+ : (options.velocity * timeConstant) / linearCoefficient;
172
+ const boundaries = [
173
+ 0,
174
+ ...(extremumTime !== undefined &&
175
+ extremumTime > 0 &&
176
+ extremumTime < decayResult.duration
177
+ ? [extremumTime]
178
+ : []),
179
+ decayResult.duration,
180
+ ];
181
+ for (let index = 1; index < boundaries.length; index += 1) {
182
+ const startTime = boundaries[index - 1];
183
+ const endTime = boundaries[index];
184
+ const startPosition = decayStateAt(startTime).position;
185
+ const endPosition = decayStateAt(endTime).position;
186
+ const increasing = endPosition >= startPosition;
187
+ const bound = increasing
188
+ ? options.max !== undefined &&
189
+ startPosition <= options.max &&
190
+ endPosition >= options.max
191
+ ? options.max
192
+ : undefined
193
+ : options.min !== undefined &&
194
+ startPosition >= options.min &&
195
+ endPosition <= options.min
196
+ ? options.min
197
+ : undefined;
198
+ if (bound === undefined)
199
+ continue;
200
+ let lower = startTime;
201
+ let upper = endTime;
202
+ for (let iteration = 0; iteration < 48; iteration += 1) {
203
+ const midpoint = lower + (upper - lower) / 2;
204
+ const position = decayStateAt(midpoint).position;
205
+ const crossed = increasing ? position >= bound : position <= bound;
206
+ if (crossed)
207
+ upper = midpoint;
208
+ else
209
+ lower = midpoint;
210
+ }
211
+ return { time: upper, bound };
212
+ }
213
+ return undefined;
214
+ };
215
+ const hit = findBoundary();
216
+ let boundary;
217
+ let duration = decayResult.duration;
218
+ let settled = decayResult.settled;
219
+ let iterations = decayResult.iterations;
220
+ if (hit) {
221
+ const hitState = hit.time === 0
222
+ ? { position: options.from, velocity: options.velocity }
223
+ : decayStateAt(hit.time);
224
+ const spring = createSpring({
225
+ from: hitState.position,
226
+ to: hit.bound,
227
+ velocity: hitState.velocity,
228
+ ...(options.boundarySpring ?? DEFAULT_BOUNDARY_SPRING),
229
+ settle: {
230
+ position: settling.positionEpsilon,
231
+ velocity: settling.velocityEpsilon,
232
+ maxDuration: settling.maxDuration,
233
+ refinementIterations: settling.refinementIterations,
234
+ },
235
+ });
236
+ const springResult = spring.getSettlingResult();
237
+ boundary = Object.freeze({
238
+ time: hit.time,
239
+ bound: hit.bound,
240
+ incomingVelocity: hitState.velocity,
241
+ spring,
242
+ });
243
+ duration = hit.time + springResult.duration;
244
+ assertFinite('duration', duration);
245
+ settled = springResult.settled;
246
+ iterations += springResult.iterations;
247
+ }
248
+ const stateAt = (time) => {
249
+ assertFinite('time', time);
250
+ if (time < 0)
251
+ throw new RangeError('time must be greater than or equal to 0');
252
+ if (settled && time >= duration) {
253
+ return { position: boundary?.bound ?? target, velocity: 0 };
254
+ }
255
+ if (boundary && time >= boundary.time) {
256
+ return boundary.spring.stateAt(Math.min(time - boundary.time, boundary.spring.getSettlingDuration()));
257
+ }
258
+ return decayStateAt(Math.min(time, decayResult.duration));
259
+ };
260
+ const phaseAt = (time) => {
261
+ assertFinite('time', time);
262
+ if (time < 0)
263
+ throw new RangeError('time must be greater than or equal to 0');
264
+ if (settled && time >= duration)
265
+ return 'complete';
266
+ if (boundary && time >= boundary.time)
267
+ return 'spring';
268
+ return 'decay';
269
+ };
270
+ return Object.freeze({
271
+ initialState: Object.freeze({
272
+ position: options.from,
273
+ velocity: options.velocity,
274
+ }),
275
+ naturalTarget,
276
+ target: boundary?.bound ?? target,
277
+ duration,
278
+ settled,
279
+ ...(boundary === undefined ? {} : { boundary }),
280
+ stateAt,
281
+ positionAt(time) {
282
+ return stateAt(time).position;
283
+ },
284
+ velocityAt(time) {
285
+ return stateAt(time).velocity;
286
+ },
287
+ phaseAt,
288
+ getSettlingResult() {
289
+ return { duration, iterations, settled };
290
+ },
291
+ });
292
+ }
293
+ //# sourceMappingURL=inertia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inertia.js","sourceRoot":"","sources":["../../src/support/inertia.ts"],"names":[],"mappings":"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"}