@voila.dev/motion 0.0.0-stage → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +105 -2
  2. package/dist/accessibility/reduced-motion.d.ts +13 -0
  3. package/dist/accessibility/reduced-motion.d.ts.map +1 -0
  4. package/dist/accessibility/reduced-motion.js +56 -0
  5. package/dist/accessibility/reduced-motion.js.map +7 -0
  6. package/dist/animate/animate.d.ts +21 -0
  7. package/dist/animate/animate.d.ts.map +1 -0
  8. package/dist/animate/animate.js +76 -0
  9. package/dist/animate/animate.js.map +7 -0
  10. package/dist/animate/controls.d.ts +16 -0
  11. package/dist/animate/controls.d.ts.map +1 -0
  12. package/dist/animate/controls.js +62 -0
  13. package/dist/animate/controls.js.map +7 -0
  14. package/dist/animate/dom.d.ts +11 -0
  15. package/dist/animate/dom.d.ts.map +1 -0
  16. package/dist/animate/dom.js +112 -0
  17. package/dist/animate/dom.js.map +7 -0
  18. package/dist/animate/js-animation.d.ts +25 -0
  19. package/dist/animate/js-animation.d.ts.map +1 -0
  20. package/dist/animate/js-animation.js +117 -0
  21. package/dist/animate/js-animation.js.map +7 -0
  22. package/dist/animate/plan.d.ts +17 -0
  23. package/dist/animate/plan.d.ts.map +1 -0
  24. package/dist/animate/plan.js +48 -0
  25. package/dist/animate/plan.js.map +7 -0
  26. package/dist/animate/style.d.ts +27 -0
  27. package/dist/animate/style.d.ts.map +1 -0
  28. package/dist/animate/style.js +96 -0
  29. package/dist/animate/style.js.map +7 -0
  30. package/dist/animate/types.d.ts +62 -0
  31. package/dist/animate/types.d.ts.map +1 -0
  32. package/dist/animate/types.js +1 -0
  33. package/dist/animate/types.js.map +7 -0
  34. package/dist/animate/value.d.ts +13 -0
  35. package/dist/animate/value.d.ts.map +1 -0
  36. package/dist/animate/value.js +71 -0
  37. package/dist/animate/value.js.map +7 -0
  38. package/dist/animate/waapi.d.ts +20 -0
  39. package/dist/animate/waapi.d.ts.map +1 -0
  40. package/dist/animate/waapi.js +152 -0
  41. package/dist/animate/waapi.js.map +7 -0
  42. package/dist/dom.d.ts +12 -0
  43. package/dist/dom.d.ts.map +1 -0
  44. package/dist/dom.js +17 -0
  45. package/dist/dom.js.map +7 -0
  46. package/dist/easing/cubic-bezier.d.ts +4 -0
  47. package/dist/easing/cubic-bezier.d.ts.map +1 -0
  48. package/dist/easing/cubic-bezier.js +54 -0
  49. package/dist/easing/cubic-bezier.js.map +7 -0
  50. package/dist/easing/linear-css.d.ts +9 -0
  51. package/dist/easing/linear-css.d.ts.map +1 -0
  52. package/dist/easing/linear-css.js +30 -0
  53. package/dist/easing/linear-css.js.map +7 -0
  54. package/dist/easing/named.d.ts +16 -0
  55. package/dist/easing/named.d.ts.map +1 -0
  56. package/dist/easing/named.js +82 -0
  57. package/dist/easing/named.js.map +7 -0
  58. package/dist/easing/spring.d.ts +11 -0
  59. package/dist/easing/spring.d.ts.map +1 -0
  60. package/dist/easing/spring.js +18 -0
  61. package/dist/easing/spring.js.map +7 -0
  62. package/dist/easing/steps.d.ts +4 -0
  63. package/dist/easing/steps.d.ts.map +1 -0
  64. package/dist/easing/steps.js +14 -0
  65. package/dist/easing/steps.js.map +7 -0
  66. package/dist/easing/types.d.ts +5 -0
  67. package/dist/easing/types.d.ts.map +1 -0
  68. package/dist/easing/types.js +1 -0
  69. package/dist/easing/types.js.map +7 -0
  70. package/dist/frame/driver.d.ts +13 -0
  71. package/dist/frame/driver.d.ts.map +1 -0
  72. package/dist/frame/driver.js +42 -0
  73. package/dist/frame/driver.js.map +7 -0
  74. package/dist/frame/frame.d.ts +20 -0
  75. package/dist/frame/frame.d.ts.map +1 -0
  76. package/dist/frame/frame.js +77 -0
  77. package/dist/frame/frame.js.map +7 -0
  78. package/dist/generators/inertia.d.ts +20 -0
  79. package/dist/generators/inertia.d.ts.map +1 -0
  80. package/dist/generators/inertia.js +59 -0
  81. package/dist/generators/inertia.js.map +7 -0
  82. package/dist/generators/spring.d.ts +17 -0
  83. package/dist/generators/spring.d.ts.map +1 -0
  84. package/dist/generators/spring.js +87 -0
  85. package/dist/generators/spring.js.map +7 -0
  86. package/dist/generators/tween.d.ts +15 -0
  87. package/dist/generators/tween.d.ts.map +1 -0
  88. package/dist/generators/tween.js +51 -0
  89. package/dist/generators/tween.js.map +7 -0
  90. package/dist/generators/types.d.ts +30 -0
  91. package/dist/generators/types.d.ts.map +1 -0
  92. package/dist/generators/types.js +1 -0
  93. package/dist/generators/types.js.map +7 -0
  94. package/dist/index.d.ts +26 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +97 -0
  97. package/dist/index.js.map +7 -0
  98. package/dist/interpolate/array.d.ts +3 -0
  99. package/dist/interpolate/array.d.ts.map +1 -0
  100. package/dist/interpolate/array.js +12 -0
  101. package/dist/interpolate/array.js.map +7 -0
  102. package/dist/interpolate/color-parse.d.ts +14 -0
  103. package/dist/interpolate/color-parse.d.ts.map +1 -0
  104. package/dist/interpolate/color-parse.js +111 -0
  105. package/dist/interpolate/color-parse.js.map +7 -0
  106. package/dist/interpolate/color.d.ts +11 -0
  107. package/dist/interpolate/color.d.ts.map +1 -0
  108. package/dist/interpolate/color.js +74 -0
  109. package/dist/interpolate/color.js.map +7 -0
  110. package/dist/interpolate/complex.d.ts +7 -0
  111. package/dist/interpolate/complex.d.ts.map +1 -0
  112. package/dist/interpolate/complex.js +56 -0
  113. package/dist/interpolate/complex.js.map +7 -0
  114. package/dist/interpolate/interpolate.d.ts +16 -0
  115. package/dist/interpolate/interpolate.d.ts.map +1 -0
  116. package/dist/interpolate/interpolate.js +39 -0
  117. package/dist/interpolate/interpolate.js.map +7 -0
  118. package/dist/interpolate/mix.d.ts +8 -0
  119. package/dist/interpolate/mix.d.ts.map +1 -0
  120. package/dist/interpolate/mix.js +48 -0
  121. package/dist/interpolate/mix.js.map +7 -0
  122. package/dist/interpolate/number.d.ts +2 -0
  123. package/dist/interpolate/number.d.ts.map +1 -0
  124. package/dist/interpolate/number.js +7 -0
  125. package/dist/interpolate/number.js.map +7 -0
  126. package/dist/interpolate/object.d.ts +5 -0
  127. package/dist/interpolate/object.d.ts.map +1 -0
  128. package/dist/interpolate/object.js +17 -0
  129. package/dist/interpolate/object.js.map +7 -0
  130. package/dist/interpolate/path/flatten.d.ts +10 -0
  131. package/dist/interpolate/path/flatten.d.ts.map +1 -0
  132. package/dist/interpolate/path/flatten.js +135 -0
  133. package/dist/interpolate/path/flatten.js.map +7 -0
  134. package/dist/interpolate/path/morph.d.ts +9 -0
  135. package/dist/interpolate/path/morph.d.ts.map +1 -0
  136. package/dist/interpolate/path/morph.js +72 -0
  137. package/dist/interpolate/path/morph.js.map +7 -0
  138. package/dist/interpolate/path/parse.d.ts +24 -0
  139. package/dist/interpolate/path/parse.d.ts.map +1 -0
  140. package/dist/interpolate/path/parse.js +125 -0
  141. package/dist/interpolate/path/parse.js.map +7 -0
  142. package/dist/interpolate/path/rings.d.ts +13 -0
  143. package/dist/interpolate/path/rings.d.ts.map +1 -0
  144. package/dist/interpolate/path/rings.js +117 -0
  145. package/dist/interpolate/path/rings.js.map +7 -0
  146. package/dist/react/index.d.ts +7 -0
  147. package/dist/react/index.d.ts.map +1 -0
  148. package/dist/react/index.js +19 -0
  149. package/dist/react/index.js.map +7 -0
  150. package/dist/react/presence.d.ts +27 -0
  151. package/dist/react/presence.d.ts.map +1 -0
  152. package/dist/react/presence.js +135 -0
  153. package/dist/react/presence.js.map +7 -0
  154. package/dist/react/use-animate.d.ts +17 -0
  155. package/dist/react/use-animate.d.ts.map +1 -0
  156. package/dist/react/use-animate.js +34 -0
  157. package/dist/react/use-animate.js.map +7 -0
  158. package/dist/react/use-motion-value.d.ts +4 -0
  159. package/dist/react/use-motion-value.d.ts.map +1 -0
  160. package/dist/react/use-motion-value.js +11 -0
  161. package/dist/react/use-motion-value.js.map +7 -0
  162. package/dist/react/use-reduced-motion.d.ts +7 -0
  163. package/dist/react/use-reduced-motion.d.ts.map +1 -0
  164. package/dist/react/use-reduced-motion.js +19 -0
  165. package/dist/react/use-reduced-motion.js.map +7 -0
  166. package/dist/react/use-spring.d.ts +9 -0
  167. package/dist/react/use-spring.d.ts.map +1 -0
  168. package/dist/react/use-spring.js +27 -0
  169. package/dist/react/use-spring.js.map +7 -0
  170. package/dist/react/use-transform.d.ts +13 -0
  171. package/dist/react/use-transform.d.ts.map +1 -0
  172. package/dist/react/use-transform.js +44 -0
  173. package/dist/react/use-transform.js.map +7 -0
  174. package/dist/sequence/sequence.d.ts +25 -0
  175. package/dist/sequence/sequence.d.ts.map +1 -0
  176. package/dist/sequence/sequence.js +68 -0
  177. package/dist/sequence/sequence.js.map +7 -0
  178. package/dist/stagger/stagger.d.ts +12 -0
  179. package/dist/stagger/stagger.d.ts.map +1 -0
  180. package/dist/stagger/stagger.js +21 -0
  181. package/dist/stagger/stagger.js.map +7 -0
  182. package/dist/testing/manual-frames.d.ts +11 -0
  183. package/dist/testing/manual-frames.d.ts.map +1 -0
  184. package/dist/testing/manual-frames.js +40 -0
  185. package/dist/testing/manual-frames.js.map +7 -0
  186. package/dist/value/motion-value.d.ts +27 -0
  187. package/dist/value/motion-value.d.ts.map +1 -0
  188. package/dist/value/motion-value.js +88 -0
  189. package/dist/value/motion-value.js.map +7 -0
  190. package/dist/value/transform.d.ts +16 -0
  191. package/dist/value/transform.d.ts.map +1 -0
  192. package/dist/value/transform.js +28 -0
  193. package/dist/value/transform.js.map +7 -0
  194. package/dist/view/in-view.d.ts +19 -0
  195. package/dist/view/in-view.d.ts.map +1 -0
  196. package/dist/view/in-view.js +46 -0
  197. package/dist/view/in-view.js.map +7 -0
  198. package/dist/view/resize.d.ts +13 -0
  199. package/dist/view/resize.d.ts.map +1 -0
  200. package/dist/view/resize.js +72 -0
  201. package/dist/view/resize.js.map +7 -0
  202. package/dist/view/resolve-elements.d.ts +3 -0
  203. package/dist/view/resolve-elements.d.ts.map +1 -0
  204. package/dist/view/resolve-elements.js +10 -0
  205. package/dist/view/resolve-elements.js.map +7 -0
  206. package/dist/view/scroll-measure.d.ts +16 -0
  207. package/dist/view/scroll-measure.d.ts.map +1 -0
  208. package/dist/view/scroll-measure.js +51 -0
  209. package/dist/view/scroll-measure.js.map +7 -0
  210. package/dist/view/scroll-offset.d.ts +28 -0
  211. package/dist/view/scroll-offset.d.ts.map +1 -0
  212. package/dist/view/scroll-offset.js +55 -0
  213. package/dist/view/scroll-offset.js.map +7 -0
  214. package/dist/view/scroll.d.ts +34 -0
  215. package/dist/view/scroll.d.ts.map +1 -0
  216. package/dist/view/scroll.js +83 -0
  217. package/dist/view/scroll.js.map +7 -0
  218. package/package.json +57 -5
  219. package/src/accessibility/reduced-motion.ts +75 -0
  220. package/src/animate/animate.ts +155 -0
  221. package/src/animate/controls.ts +76 -0
  222. package/src/animate/dom.ts +166 -0
  223. package/src/animate/js-animation.ts +151 -0
  224. package/src/animate/plan.ts +74 -0
  225. package/src/animate/style.ts +131 -0
  226. package/src/animate/types.ts +69 -0
  227. package/src/animate/value.ts +93 -0
  228. package/src/animate/waapi.ts +212 -0
  229. package/src/dom.ts +35 -0
  230. package/src/easing/cubic-bezier.ts +64 -0
  231. package/src/easing/linear-css.ts +41 -0
  232. package/src/easing/named.ts +88 -0
  233. package/src/easing/spring.ts +25 -0
  234. package/src/easing/steps.ts +16 -0
  235. package/src/easing/types.ts +18 -0
  236. package/src/frame/driver.ts +56 -0
  237. package/src/frame/frame.ts +102 -0
  238. package/src/generators/inertia.ts +88 -0
  239. package/src/generators/spring.ts +117 -0
  240. package/src/generators/tween.ts +74 -0
  241. package/src/generators/types.ts +31 -0
  242. package/src/index.ts +91 -0
  243. package/src/interpolate/array.ts +13 -0
  244. package/src/interpolate/color-parse.ts +136 -0
  245. package/src/interpolate/color.ts +97 -0
  246. package/src/interpolate/complex.ts +80 -0
  247. package/src/interpolate/interpolate.ts +60 -0
  248. package/src/interpolate/mix.ts +74 -0
  249. package/src/interpolate/number.ts +3 -0
  250. package/src/interpolate/object.ts +20 -0
  251. package/src/interpolate/path/flatten.ts +185 -0
  252. package/src/interpolate/path/morph.ts +100 -0
  253. package/src/interpolate/path/parse.ts +162 -0
  254. package/src/interpolate/path/rings.ts +151 -0
  255. package/src/react/index.ts +11 -0
  256. package/src/react/presence.tsx +194 -0
  257. package/src/react/use-animate.ts +46 -0
  258. package/src/react/use-motion-value.ts +9 -0
  259. package/src/react/use-reduced-motion.ts +22 -0
  260. package/src/react/use-spring.ts +35 -0
  261. package/src/react/use-transform.ts +73 -0
  262. package/src/sequence/sequence.ts +129 -0
  263. package/src/stagger/stagger.ts +36 -0
  264. package/src/testing/browser-commands.d.ts +11 -0
  265. package/src/testing/manual-frames.ts +49 -0
  266. package/src/value/motion-value.ts +131 -0
  267. package/src/value/transform.ts +61 -0
  268. package/src/view/in-view.ts +74 -0
  269. package/src/view/resize.ts +101 -0
  270. package/src/view/resolve-elements.ts +11 -0
  271. package/src/view/scroll-measure.ts +83 -0
  272. package/src/view/scroll-offset.ts +100 -0
  273. package/src/view/scroll.ts +143 -0
@@ -0,0 +1,42 @@
1
+ function clock() {
2
+ return typeof performance === "undefined" ? Date.now() : performance.now();
3
+ }
4
+ function browserDriver() {
5
+ let handle;
6
+ const hasAnimationFrame = typeof requestAnimationFrame === "function";
7
+ return {
8
+ request(tick) {
9
+ handle = hasAnimationFrame ? requestAnimationFrame(tick) : setTimeout(() => tick(clock()), 1e3 / 60);
10
+ },
11
+ cancel() {
12
+ if (handle === void 0) return;
13
+ if (hasAnimationFrame) cancelAnimationFrame(handle);
14
+ else clearTimeout(handle);
15
+ handle = void 0;
16
+ },
17
+ now: clock
18
+ };
19
+ }
20
+ let injected;
21
+ let fallback;
22
+ const driverListeners = /* @__PURE__ */ new Set();
23
+ function frameDriver() {
24
+ if (injected) return injected;
25
+ fallback ??= browserDriver();
26
+ return fallback;
27
+ }
28
+ function setFrameDriver(driver) {
29
+ const previous = frameDriver();
30
+ injected = driver;
31
+ for (const listener of driverListeners) listener(previous);
32
+ }
33
+ function onFrameDriverChange(listener) {
34
+ driverListeners.add(listener);
35
+ return () => driverListeners.delete(listener);
36
+ }
37
+ export {
38
+ frameDriver,
39
+ onFrameDriverChange,
40
+ setFrameDriver
41
+ };
42
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/frame/driver.ts"],
4
+ "sourcesContent": ["/** What ticks the frame loop: the browser's frames by default, a test clock when injected. */\nexport interface FrameDriver {\n\trequest(tick: (timestamp: number) => void): void;\n\tcancel(): void;\n\t/** Milliseconds, on the same clock as the timestamps handed to `tick`. */\n\tnow(): number;\n}\n\nfunction clock(): number {\n\treturn typeof performance === \"undefined\" ? Date.now() : performance.now();\n}\n\n/** Read lazily so importing on the server never touches the browser globals. */\nfunction browserDriver(): FrameDriver {\n\tlet handle: number | ReturnType<typeof setTimeout> | undefined;\n\tconst hasAnimationFrame = typeof requestAnimationFrame === \"function\";\n\treturn {\n\t\trequest(tick) {\n\t\t\thandle = hasAnimationFrame\n\t\t\t\t? requestAnimationFrame(tick)\n\t\t\t\t: setTimeout(() => tick(clock()), 1000 / 60);\n\t\t},\n\t\tcancel() {\n\t\t\tif (handle === undefined) return;\n\t\t\tif (hasAnimationFrame) cancelAnimationFrame(handle as number);\n\t\t\telse clearTimeout(handle);\n\t\t\thandle = undefined;\n\t\t},\n\t\tnow: clock,\n\t};\n}\n\nlet injected: FrameDriver | undefined;\nlet fallback: FrameDriver | undefined;\nconst driverListeners = new Set<(previous: FrameDriver) => void>();\n\nexport function frameDriver(): FrameDriver {\n\tif (injected) return injected;\n\tfallback ??= browserDriver();\n\treturn fallback;\n}\n\n/** `undefined` restores the browser's frames. */\nexport function setFrameDriver(driver: FrameDriver | undefined): void {\n\tconst previous = frameDriver();\n\tinjected = driver;\n\tfor (const listener of driverListeners) listener(previous);\n}\n\n/** The loop listens so a driver swapped mid-animation carries the pending frame over. */\nexport function onFrameDriverChange(\n\tlistener: (previous: FrameDriver) => void,\n): () => void {\n\tdriverListeners.add(listener);\n\treturn () => driverListeners.delete(listener);\n}\n"],
5
+ "mappings": "AAQA,SAAS,QAAgB;AACxB,SAAO,OAAO,gBAAgB,cAAc,KAAK,IAAI,IAAI,YAAY,IAAI;AAC1E;AAGA,SAAS,gBAA6B;AACrC,MAAI;AACJ,QAAM,oBAAoB,OAAO,0BAA0B;AAC3D,SAAO;AAAA,IACN,QAAQ,MAAM;AACb,eAAS,oBACN,sBAAsB,IAAI,IAC1B,WAAW,MAAM,KAAK,MAAM,CAAC,GAAG,MAAO,EAAE;AAAA,IAC7C;AAAA,IACA,SAAS;AACR,UAAI,WAAW,OAAW;AAC1B,UAAI,kBAAmB,sBAAqB,MAAgB;AAAA,UACvD,cAAa,MAAM;AACxB,eAAS;AAAA,IACV;AAAA,IACA,KAAK;AAAA,EACN;AACD;AAEA,IAAI;AACJ,IAAI;AACJ,MAAM,kBAAkB,oBAAI,IAAqC;AAE1D,SAAS,cAA2B;AAC1C,MAAI,SAAU,QAAO;AACrB,eAAa,cAAc;AAC3B,SAAO;AACR;AAGO,SAAS,eAAe,QAAuC;AACrE,QAAM,WAAW,YAAY;AAC7B,aAAW;AACX,aAAW,YAAY,gBAAiB,UAAS,QAAQ;AAC1D;AAGO,SAAS,oBACf,UACa;AACb,kBAAgB,IAAI,QAAQ;AAC5B,SAAO,MAAM,gBAAgB,OAAO,QAAQ;AAC7C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ export interface FrameData {
2
+ /** Milliseconds since the previous frame, clamped so a backgrounded tab does not teleport. */
3
+ readonly delta: number;
4
+ readonly timestamp: number;
5
+ }
6
+ export type FrameCallback = (data: FrameData) => void;
7
+ type Schedule = (callback: FrameCallback, keepAlive?: boolean) => FrameCallback;
8
+ export declare const frame: {
9
+ readonly read: Schedule;
10
+ readonly update: Schedule;
11
+ readonly render: Schedule;
12
+ };
13
+ export declare function cancelFrame(callback: FrameCallback): void;
14
+ export declare function frameData(): FrameData;
15
+ /** Milliseconds; inside a frame, that frame's timestamp, so every value read in it agrees. */
16
+ export declare function now(): number;
17
+ /** For tests: forget every callback and the frame clock. */
18
+ export declare function resetFrameLoop(): void;
19
+ export {};
20
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/frame/frame.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAEtD,KAAK,QAAQ,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,aAAa,CAAC;AAuDhF,eAAO,MAAM,KAAK,EAAE;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CACwC,CAAC;AAEpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAIzD;AAED,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED,8FAA8F;AAC9F,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,IAAI,IAAI,CAOrC"}
@@ -0,0 +1,77 @@
1
+ import { frameDriver, onFrameDriverChange } from "./driver.js";
2
+ const PHASES = ["read", "update", "render"];
3
+ const IDEAL_DELTA = 1e3 / 60;
4
+ const MAX_DELTA = 40;
5
+ let pending = PHASES.map(() => /* @__PURE__ */ new Set());
6
+ let running;
7
+ let keepAlive = /* @__PURE__ */ new Set();
8
+ let scheduled = false;
9
+ let inFrame = false;
10
+ let data = { delta: IDEAL_DELTA, timestamp: 0 };
11
+ let lastTimestamp;
12
+ function request() {
13
+ if (scheduled) return;
14
+ scheduled = true;
15
+ frameDriver().request(tick);
16
+ }
17
+ function tick(timestamp) {
18
+ scheduled = false;
19
+ const delta = lastTimestamp === void 0 ? IDEAL_DELTA : Math.max(1, Math.min(timestamp - lastTimestamp, MAX_DELTA));
20
+ data = { delta, timestamp };
21
+ inFrame = true;
22
+ pending.forEach((_, index) => {
23
+ running = pending[index];
24
+ pending[index] = /* @__PURE__ */ new Set();
25
+ for (const callback of running) {
26
+ callback(data);
27
+ if (keepAlive.has(callback)) pending[index].add(callback);
28
+ }
29
+ });
30
+ running = void 0;
31
+ inFrame = false;
32
+ const idle = pending.every((set) => set.size === 0);
33
+ lastTimestamp = idle ? void 0 : timestamp;
34
+ if (!idle) request();
35
+ }
36
+ function schedule(phase) {
37
+ return (callback, alive = false) => {
38
+ if (alive) keepAlive.add(callback);
39
+ pending[phase].add(callback);
40
+ request();
41
+ return callback;
42
+ };
43
+ }
44
+ const frame = { read: schedule(0), update: schedule(1), render: schedule(2) };
45
+ function cancelFrame(callback) {
46
+ keepAlive.delete(callback);
47
+ running?.delete(callback);
48
+ for (const set of pending) set.delete(callback);
49
+ }
50
+ function frameData() {
51
+ return data;
52
+ }
53
+ function now() {
54
+ return inFrame ? data.timestamp : frameDriver().now();
55
+ }
56
+ function resetFrameLoop() {
57
+ if (scheduled) frameDriver().cancel();
58
+ pending = PHASES.map(() => /* @__PURE__ */ new Set());
59
+ keepAlive = /* @__PURE__ */ new Set();
60
+ scheduled = false;
61
+ lastTimestamp = void 0;
62
+ data = { delta: IDEAL_DELTA, timestamp: 0 };
63
+ }
64
+ onFrameDriverChange((previous) => {
65
+ if (!scheduled) return;
66
+ previous.cancel();
67
+ scheduled = false;
68
+ request();
69
+ });
70
+ export {
71
+ cancelFrame,
72
+ frame,
73
+ frameData,
74
+ now,
75
+ resetFrameLoop
76
+ };
77
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/frame/frame.ts"],
4
+ "sourcesContent": ["import { frameDriver, onFrameDriverChange } from \"#/frame/driver.ts\";\n\nexport interface FrameData {\n\t/** Milliseconds since the previous frame, clamped so a backgrounded tab does not teleport. */\n\treadonly delta: number;\n\treadonly timestamp: number;\n}\n\nexport type FrameCallback = (data: FrameData) => void;\n\ntype Schedule = (callback: FrameCallback, keepAlive?: boolean) => FrameCallback;\n\nconst PHASES = [\"read\", \"update\", \"render\"] as const;\nconst IDEAL_DELTA = 1000 / 60;\nconst MAX_DELTA = 40;\n\nlet pending = PHASES.map(() => new Set<FrameCallback>());\nlet running: Set<FrameCallback> | undefined;\nlet keepAlive = new Set<FrameCallback>();\nlet scheduled = false;\nlet inFrame = false;\nlet data: FrameData = { delta: IDEAL_DELTA, timestamp: 0 };\nlet lastTimestamp: number | undefined;\n\nfunction request(): void {\n\tif (scheduled) return;\n\tscheduled = true;\n\tframeDriver().request(tick);\n}\n\nfunction tick(timestamp: number): void {\n\tscheduled = false;\n\tconst delta =\n\t\tlastTimestamp === undefined\n\t\t\t? IDEAL_DELTA\n\t\t\t: Math.max(1, Math.min(timestamp - lastTimestamp, MAX_DELTA));\n\tdata = { delta, timestamp };\n\tinFrame = true;\n\t// Swapping each phase's set as it starts is what makes the scheduling rule\n\t// hold: a later phase's set is still the one that will run, an earlier or\n\t// the current phase's set is already the next frame's.\n\tpending.forEach((_, index) => {\n\t\trunning = pending[index];\n\t\tpending[index] = new Set();\n\t\tfor (const callback of running) {\n\t\t\tcallback(data);\n\t\t\tif (keepAlive.has(callback)) pending[index].add(callback);\n\t\t}\n\t});\n\trunning = undefined;\n\tinFrame = false;\n\tconst idle = pending.every((set) => set.size === 0);\n\tlastTimestamp = idle ? undefined : timestamp;\n\tif (!idle) request();\n}\n\nfunction schedule(phase: number): Schedule {\n\treturn (callback, alive = false) => {\n\t\tif (alive) keepAlive.add(callback);\n\t\tpending[phase].add(callback);\n\t\trequest();\n\t\treturn callback;\n\t};\n}\n\nexport const frame: {\n\treadonly read: Schedule;\n\treadonly update: Schedule;\n\treadonly render: Schedule;\n} = { read: schedule(0), update: schedule(1), render: schedule(2) };\n\nexport function cancelFrame(callback: FrameCallback): void {\n\tkeepAlive.delete(callback);\n\trunning?.delete(callback);\n\tfor (const set of pending) set.delete(callback);\n}\n\nexport function frameData(): FrameData {\n\treturn data;\n}\n\n/** Milliseconds; inside a frame, that frame's timestamp, so every value read in it agrees. */\nexport function now(): number {\n\treturn inFrame ? data.timestamp : frameDriver().now();\n}\n\n/** For tests: forget every callback and the frame clock. */\nexport function resetFrameLoop(): void {\n\tif (scheduled) frameDriver().cancel();\n\tpending = PHASES.map(() => new Set<FrameCallback>());\n\tkeepAlive = new Set();\n\tscheduled = false;\n\tlastTimestamp = undefined;\n\tdata = { delta: IDEAL_DELTA, timestamp: 0 };\n}\n\nonFrameDriverChange((previous) => {\n\tif (!scheduled) return;\n\tprevious.cancel();\n\tscheduled = false;\n\trequest();\n});\n"],
5
+ "mappings": "AAAA,SAAS,aAAa,2BAA2B;AAYjD,MAAM,SAAS,CAAC,QAAQ,UAAU,QAAQ;AAC1C,MAAM,cAAc,MAAO;AAC3B,MAAM,YAAY;AAElB,IAAI,UAAU,OAAO,IAAI,MAAM,oBAAI,IAAmB,CAAC;AACvD,IAAI;AACJ,IAAI,YAAY,oBAAI,IAAmB;AACvC,IAAI,YAAY;AAChB,IAAI,UAAU;AACd,IAAI,OAAkB,EAAE,OAAO,aAAa,WAAW,EAAE;AACzD,IAAI;AAEJ,SAAS,UAAgB;AACxB,MAAI,UAAW;AACf,cAAY;AACZ,cAAY,EAAE,QAAQ,IAAI;AAC3B;AAEA,SAAS,KAAK,WAAyB;AACtC,cAAY;AACZ,QAAM,QACL,kBAAkB,SACf,cACA,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,eAAe,SAAS,CAAC;AAC9D,SAAO,EAAE,OAAO,UAAU;AAC1B,YAAU;AAIV,UAAQ,QAAQ,CAAC,GAAG,UAAU;AAC7B,cAAU,QAAQ,KAAK;AACvB,YAAQ,KAAK,IAAI,oBAAI,IAAI;AACzB,eAAW,YAAY,SAAS;AAC/B,eAAS,IAAI;AACb,UAAI,UAAU,IAAI,QAAQ,EAAG,SAAQ,KAAK,EAAE,IAAI,QAAQ;AAAA,IACzD;AAAA,EACD,CAAC;AACD,YAAU;AACV,YAAU;AACV,QAAM,OAAO,QAAQ,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;AAClD,kBAAgB,OAAO,SAAY;AACnC,MAAI,CAAC,KAAM,SAAQ;AACpB;AAEA,SAAS,SAAS,OAAyB;AAC1C,SAAO,CAAC,UAAU,QAAQ,UAAU;AACnC,QAAI,MAAO,WAAU,IAAI,QAAQ;AACjC,YAAQ,KAAK,EAAE,IAAI,QAAQ;AAC3B,YAAQ;AACR,WAAO;AAAA,EACR;AACD;AAEO,MAAM,QAIT,EAAE,MAAM,SAAS,CAAC,GAAG,QAAQ,SAAS,CAAC,GAAG,QAAQ,SAAS,CAAC,EAAE;AAE3D,SAAS,YAAY,UAA+B;AAC1D,YAAU,OAAO,QAAQ;AACzB,WAAS,OAAO,QAAQ;AACxB,aAAW,OAAO,QAAS,KAAI,OAAO,QAAQ;AAC/C;AAEO,SAAS,YAAuB;AACtC,SAAO;AACR;AAGO,SAAS,MAAc;AAC7B,SAAO,UAAU,KAAK,YAAY,YAAY,EAAE,IAAI;AACrD;AAGO,SAAS,iBAAuB;AACtC,MAAI,UAAW,aAAY,EAAE,OAAO;AACpC,YAAU,OAAO,IAAI,MAAM,oBAAI,IAAmB,CAAC;AACnD,cAAY,oBAAI,IAAI;AACpB,cAAY;AACZ,kBAAgB;AAChB,SAAO,EAAE,OAAO,aAAa,WAAW,EAAE;AAC3C;AAEA,oBAAoB,CAAC,aAAa;AACjC,MAAI,CAAC,UAAW;AAChB,WAAS,OAAO;AAChB,cAAY;AACZ,UAAQ;AACT,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ import type { Generator } from "./types.js";
2
+ export interface InertiaOptions {
3
+ readonly from: number;
4
+ /** Units per second, typically a gesture's release velocity. */
5
+ readonly velocity: number;
6
+ /** How far the throw carries: target = from + power × velocity. */
7
+ readonly power?: number;
8
+ /** Seconds; higher glides longer. */
9
+ readonly timeConstant?: number;
10
+ readonly min?: number;
11
+ readonly max?: number;
12
+ readonly bounceStiffness?: number;
13
+ readonly bounceDamping?: number;
14
+ readonly restDelta?: number;
15
+ /** Snap the natural resting point, e.g. to a grid. */
16
+ readonly modifyTarget?: (target: number) => number;
17
+ }
18
+ /** A throw decaying exponentially, handing over to a spring when it hits `min` or `max`. */
19
+ export declare function inertia(options: InertiaOptions): Generator;
20
+ //# sourceMappingURL=inertia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inertia.d.ts","sourceRoot":"","sources":["../../src/generators/inertia.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAaD,4FAA4F;AAC5F,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,CAuD1D"}
@@ -0,0 +1,59 @@
1
+ import { spring } from "./spring.js";
2
+ function boundBeyond(value, min, max) {
3
+ if (min !== void 0 && value < min) {
4
+ return min;
5
+ }
6
+ if (max !== void 0 && value > max) {
7
+ return max;
8
+ }
9
+ return void 0;
10
+ }
11
+ function inertia(options) {
12
+ const { from, velocity, min, max } = options;
13
+ const timeConstant = options.timeConstant ?? 0.325;
14
+ const restDelta = options.restDelta ?? 0.5;
15
+ function bounce(start, startVelocity, bound2) {
16
+ return spring({
17
+ from: start,
18
+ to: bound2,
19
+ velocity: startVelocity,
20
+ stiffness: options.bounceStiffness ?? 500,
21
+ damping: options.bounceDamping ?? 10,
22
+ restDelta
23
+ });
24
+ }
25
+ const outside = boundBeyond(from, min, max);
26
+ if (outside !== void 0) {
27
+ return bounce(from, velocity, outside);
28
+ }
29
+ const ideal = from + (options.power ?? 0.8) * velocity;
30
+ const target = options.modifyTarget?.(ideal) ?? ideal;
31
+ const amplitude = target - from;
32
+ function decay(t) {
33
+ const remaining = amplitude * Math.exp(-t / timeConstant);
34
+ return {
35
+ value: target - remaining,
36
+ velocity: remaining / timeConstant,
37
+ done: false
38
+ };
39
+ }
40
+ const settle = Math.abs(amplitude) > restDelta ? timeConstant * Math.log(Math.abs(amplitude) / restDelta) : 0;
41
+ const bound = boundBeyond(target, min, max);
42
+ if (bound === void 0) {
43
+ return {
44
+ duration: settle,
45
+ at: (elapsed) => elapsed >= settle ? { value: target, velocity: 0, done: true } : decay(Math.max(0, elapsed))
46
+ };
47
+ }
48
+ const hit = -timeConstant * Math.log((target - bound) / amplitude);
49
+ const atHit = decay(hit);
50
+ const handover = bounce(bound, atHit.velocity, bound);
51
+ return {
52
+ duration: hit + handover.duration,
53
+ at: (elapsed) => elapsed < hit ? decay(Math.max(0, elapsed)) : handover.at(elapsed - hit)
54
+ };
55
+ }
56
+ export {
57
+ inertia
58
+ };
59
+ //# sourceMappingURL=inertia.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/generators/inertia.ts"],
4
+ "sourcesContent": ["import { spring } from \"#/generators/spring.ts\";\nimport type { Generator, GeneratorState } from \"#/generators/types.ts\";\n\nexport interface InertiaOptions {\n\treadonly from: number;\n\t/** Units per second, typically a gesture's release velocity. */\n\treadonly velocity: number;\n\t/** How far the throw carries: target = from + power \u00D7 velocity. */\n\treadonly power?: number;\n\t/** Seconds; higher glides longer. */\n\treadonly timeConstant?: number;\n\treadonly min?: number;\n\treadonly max?: number;\n\treadonly bounceStiffness?: number;\n\treadonly bounceDamping?: number;\n\treadonly restDelta?: number;\n\t/** Snap the natural resting point, e.g. to a grid. */\n\treadonly modifyTarget?: (target: number) => number;\n}\n\n/** The bound the value is past or heading past, if any. */\nfunction boundBeyond(value: number, min?: number, max?: number) {\n\tif (min !== undefined && value < min) {\n\t\treturn min;\n\t}\n\tif (max !== undefined && value > max) {\n\t\treturn max;\n\t}\n\treturn undefined;\n}\n\n/** A throw decaying exponentially, handing over to a spring when it hits `min` or `max`. */\nexport function inertia(options: InertiaOptions): Generator {\n\tconst { from, velocity, min, max } = options;\n\tconst timeConstant = options.timeConstant ?? 0.325;\n\tconst restDelta = options.restDelta ?? 0.5;\n\tfunction bounce(start: number, startVelocity: number, bound: number) {\n\t\treturn spring({\n\t\t\tfrom: start,\n\t\t\tto: bound,\n\t\t\tvelocity: startVelocity,\n\t\t\tstiffness: options.bounceStiffness ?? 500,\n\t\t\tdamping: options.bounceDamping ?? 10,\n\t\t\trestDelta,\n\t\t});\n\t}\n\n\tconst outside = boundBeyond(from, min, max);\n\tif (outside !== undefined) {\n\t\treturn bounce(from, velocity, outside);\n\t}\n\n\tconst ideal = from + (options.power ?? 0.8) * velocity;\n\tconst target = options.modifyTarget?.(ideal) ?? ideal;\n\tconst amplitude = target - from;\n\tfunction decay(t: number): GeneratorState {\n\t\tconst remaining = amplitude * Math.exp(-t / timeConstant);\n\t\treturn {\n\t\t\tvalue: target - remaining,\n\t\t\tvelocity: remaining / timeConstant,\n\t\t\tdone: false,\n\t\t};\n\t}\n\tconst settle =\n\t\tMath.abs(amplitude) > restDelta\n\t\t\t? timeConstant * Math.log(Math.abs(amplitude) / restDelta)\n\t\t\t: 0;\n\n\tconst bound = boundBeyond(target, min, max);\n\tif (bound === undefined) {\n\t\treturn {\n\t\t\tduration: settle,\n\t\t\tat: (elapsed) =>\n\t\t\t\telapsed >= settle\n\t\t\t\t\t? { value: target, velocity: 0, done: true }\n\t\t\t\t\t: decay(Math.max(0, elapsed)),\n\t\t};\n\t}\n\n\tconst hit = -timeConstant * Math.log((target - bound) / amplitude);\n\tconst atHit = decay(hit);\n\tconst handover = bounce(bound, atHit.velocity, bound);\n\treturn {\n\t\tduration: hit + handover.duration,\n\t\tat: (elapsed) =>\n\t\t\telapsed < hit ? decay(Math.max(0, elapsed)) : handover.at(elapsed - hit),\n\t};\n}\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AAqBvB,SAAS,YAAY,OAAe,KAAc,KAAc;AAC/D,MAAI,QAAQ,UAAa,QAAQ,KAAK;AACrC,WAAO;AAAA,EACR;AACA,MAAI,QAAQ,UAAa,QAAQ,KAAK;AACrC,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAGO,SAAS,QAAQ,SAAoC;AAC3D,QAAM,EAAE,MAAM,UAAU,KAAK,IAAI,IAAI;AACrC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,YAAY,QAAQ,aAAa;AACvC,WAAS,OAAO,OAAe,eAAuBA,QAAe;AACpE,WAAO,OAAO;AAAA,MACb,MAAM;AAAA,MACN,IAAIA;AAAA,MACJ,UAAU;AAAA,MACV,WAAW,QAAQ,mBAAmB;AAAA,MACtC,SAAS,QAAQ,iBAAiB;AAAA,MAClC;AAAA,IACD,CAAC;AAAA,EACF;AAEA,QAAM,UAAU,YAAY,MAAM,KAAK,GAAG;AAC1C,MAAI,YAAY,QAAW;AAC1B,WAAO,OAAO,MAAM,UAAU,OAAO;AAAA,EACtC;AAEA,QAAM,QAAQ,QAAQ,QAAQ,SAAS,OAAO;AAC9C,QAAM,SAAS,QAAQ,eAAe,KAAK,KAAK;AAChD,QAAM,YAAY,SAAS;AAC3B,WAAS,MAAM,GAA2B;AACzC,UAAM,YAAY,YAAY,KAAK,IAAI,CAAC,IAAI,YAAY;AACxD,WAAO;AAAA,MACN,OAAO,SAAS;AAAA,MAChB,UAAU,YAAY;AAAA,MACtB,MAAM;AAAA,IACP;AAAA,EACD;AACA,QAAM,SACL,KAAK,IAAI,SAAS,IAAI,YACnB,eAAe,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,SAAS,IACvD;AAEJ,QAAM,QAAQ,YAAY,QAAQ,KAAK,GAAG;AAC1C,MAAI,UAAU,QAAW;AACxB,WAAO;AAAA,MACN,UAAU;AAAA,MACV,IAAI,CAAC,YACJ,WAAW,SACR,EAAE,OAAO,QAAQ,UAAU,GAAG,MAAM,KAAK,IACzC,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA,IAC/B;AAAA,EACD;AAEA,QAAM,MAAM,CAAC,eAAe,KAAK,KAAK,SAAS,SAAS,SAAS;AACjE,QAAM,QAAQ,MAAM,GAAG;AACvB,QAAM,WAAW,OAAO,OAAO,MAAM,UAAU,KAAK;AACpD,SAAO;AAAA,IACN,UAAU,MAAM,SAAS;AAAA,IACzB,IAAI,CAAC,YACJ,UAAU,MAAM,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,SAAS,GAAG,UAAU,GAAG;AAAA,EACzE;AACD;",
6
+ "names": ["bound"]
7
+ }
@@ -0,0 +1,17 @@
1
+ import type { Generator, SpringOptions } from "./types.js";
2
+ export interface SpringPhysics {
3
+ readonly stiffness: number;
4
+ readonly damping: number;
5
+ readonly mass: number;
6
+ }
7
+ /**
8
+ * Duration and bounce to physics, SwiftUI's mapping: the undamped period is
9
+ * the perceived duration, and the damping ratio is `1 - bounce`.
10
+ */
11
+ export declare function springPhysics(options?: SpringOptions): SpringPhysics;
12
+ export declare function spring(options: SpringOptions & {
13
+ from: number;
14
+ to: number;
15
+ velocity?: number;
16
+ }): Generator;
17
+ //# sourceMappingURL=spring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../../src/generators/spring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EAET,aAAa,EACb,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,aAAa,CAgBxE;AAoDD,wBAAgB,MAAM,CACrB,OAAO,EAAE,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,SAAS,CA0BX"}
@@ -0,0 +1,87 @@
1
+ const MAX_DURATION = 20;
2
+ const SETTLE_STEP = 5e-3;
3
+ function springPhysics(options = {}) {
4
+ const { stiffness, damping, mass } = options;
5
+ if (stiffness !== void 0 || damping !== void 0 || mass !== void 0) {
6
+ return {
7
+ stiffness: stiffness ?? 100,
8
+ damping: damping ?? 10,
9
+ mass: mass ?? 1
10
+ };
11
+ }
12
+ const duration = Math.max(options.duration ?? 0.3, 1e-3);
13
+ const bounce = Math.min(Math.max(options.bounce ?? 0, 0), 0.95);
14
+ return {
15
+ stiffness: (2 * Math.PI / duration) ** 2,
16
+ damping: 4 * Math.PI * (1 - bounce) / duration,
17
+ mass: 1
18
+ };
19
+ }
20
+ function oscillator(physics, x0, v0) {
21
+ const omega = Math.sqrt(physics.stiffness / physics.mass);
22
+ const zeta = physics.damping / (2 * Math.sqrt(physics.stiffness * physics.mass));
23
+ if (Math.abs(zeta - 1) < 1e-6) {
24
+ const c = v0 + omega * x0;
25
+ return (t) => {
26
+ const decay = Math.exp(-omega * t);
27
+ return [decay * (x0 + c * t), decay * (c - omega * (x0 + c * t))];
28
+ };
29
+ }
30
+ if (zeta < 1) {
31
+ const omegaD = omega * Math.sqrt(1 - zeta * zeta);
32
+ const b = (v0 + zeta * omega * x0) / omegaD;
33
+ return (t) => {
34
+ const decay = Math.exp(-zeta * omega * t);
35
+ const cos = Math.cos(omegaD * t);
36
+ const sin = Math.sin(omegaD * t);
37
+ const x = x0 * cos + b * sin;
38
+ return [
39
+ decay * x,
40
+ decay * (-zeta * omega * x + omegaD * (b * cos - x0 * sin))
41
+ ];
42
+ };
43
+ }
44
+ const root = omega * Math.sqrt(zeta * zeta - 1);
45
+ const r1 = -zeta * omega + root;
46
+ const r2 = -zeta * omega - root;
47
+ const c2 = (v0 - r1 * x0) / (r2 - r1);
48
+ const c1 = x0 - c2;
49
+ return (t) => {
50
+ const e1 = c1 * Math.exp(r1 * t);
51
+ const e2 = c2 * Math.exp(r2 * t);
52
+ return [e1 + e2, r1 * e1 + r2 * e2];
53
+ };
54
+ }
55
+ function restThresholds(options, span) {
56
+ const restDelta = options.restDelta ?? Math.max(span, 1) * 1e-3;
57
+ return { restDelta, restSpeed: options.restSpeed ?? restDelta * 10 };
58
+ }
59
+ function spring(options) {
60
+ const { from, to } = options;
61
+ const velocity = options.velocity ?? 0;
62
+ const displacement = oscillator(springPhysics(options), from - to, velocity);
63
+ const { restDelta, restSpeed } = restThresholds(options, Math.abs(to - from));
64
+ function atRest(t) {
65
+ const [x, v] = displacement(t);
66
+ return Math.abs(x) <= restDelta && Math.abs(v) <= restSpeed;
67
+ }
68
+ let duration = 0;
69
+ while (duration < MAX_DURATION && !atRest(duration)) {
70
+ duration += SETTLE_STEP;
71
+ }
72
+ return {
73
+ duration,
74
+ at(elapsed) {
75
+ if (elapsed >= duration) {
76
+ return { value: to, velocity: 0, done: true };
77
+ }
78
+ const [x, v] = displacement(Math.max(0, elapsed));
79
+ return { value: to + x, velocity: v, done: false };
80
+ }
81
+ };
82
+ }
83
+ export {
84
+ spring,
85
+ springPhysics
86
+ };
87
+ //# sourceMappingURL=spring.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/generators/spring.ts"],
4
+ "sourcesContent": ["import type {\n\tGenerator,\n\tGeneratorState,\n\tSpringOptions,\n} from \"#/generators/types.ts\";\n\nexport interface SpringPhysics {\n\treadonly stiffness: number;\n\treadonly damping: number;\n\treadonly mass: number;\n}\n\n/** A spring that never settles would animate forever: stop looking after this. */\nconst MAX_DURATION = 20;\nconst SETTLE_STEP = 0.005;\n\n/**\n * Duration and bounce to physics, SwiftUI's mapping: the undamped period is\n * the perceived duration, and the damping ratio is `1 - bounce`.\n */\nexport function springPhysics(options: SpringOptions = {}): SpringPhysics {\n\tconst { stiffness, damping, mass } = options;\n\tif (stiffness !== undefined || damping !== undefined || mass !== undefined) {\n\t\treturn {\n\t\t\tstiffness: stiffness ?? 100,\n\t\t\tdamping: damping ?? 10,\n\t\t\tmass: mass ?? 1,\n\t\t};\n\t}\n\tconst duration = Math.max(options.duration ?? 0.3, 0.001);\n\tconst bounce = Math.min(Math.max(options.bounce ?? 0, 0), 0.95);\n\treturn {\n\t\tstiffness: ((2 * Math.PI) / duration) ** 2,\n\t\tdamping: (4 * Math.PI * (1 - bounce)) / duration,\n\t\tmass: 1,\n\t};\n}\n\ntype Displacement = (t: number) => readonly [number, number];\n\n/** The damped oscillator's closed form: displacement from the target and its velocity at `t`. */\nfunction oscillator(\n\tphysics: SpringPhysics,\n\tx0: number,\n\tv0: number,\n): Displacement {\n\tconst omega = Math.sqrt(physics.stiffness / physics.mass);\n\tconst zeta =\n\t\tphysics.damping / (2 * Math.sqrt(physics.stiffness * physics.mass));\n\tif (Math.abs(zeta - 1) < 1e-6) {\n\t\tconst c = v0 + omega * x0;\n\t\treturn (t) => {\n\t\t\tconst decay = Math.exp(-omega * t);\n\t\t\treturn [decay * (x0 + c * t), decay * (c - omega * (x0 + c * t))];\n\t\t};\n\t}\n\tif (zeta < 1) {\n\t\tconst omegaD = omega * Math.sqrt(1 - zeta * zeta);\n\t\tconst b = (v0 + zeta * omega * x0) / omegaD;\n\t\treturn (t) => {\n\t\t\tconst decay = Math.exp(-zeta * omega * t);\n\t\t\tconst cos = Math.cos(omegaD * t);\n\t\t\tconst sin = Math.sin(omegaD * t);\n\t\t\tconst x = x0 * cos + b * sin;\n\t\t\treturn [\n\t\t\t\tdecay * x,\n\t\t\t\tdecay * (-zeta * omega * x + omegaD * (b * cos - x0 * sin)),\n\t\t\t];\n\t\t};\n\t}\n\tconst root = omega * Math.sqrt(zeta * zeta - 1);\n\tconst r1 = -zeta * omega + root;\n\tconst r2 = -zeta * omega - root;\n\tconst c2 = (v0 - r1 * x0) / (r2 - r1);\n\tconst c1 = x0 - c2;\n\treturn (t) => {\n\t\tconst e1 = c1 * Math.exp(r1 * t);\n\t\tconst e2 = c2 * Math.exp(r2 * t);\n\t\treturn [e1 + e2, r1 * e1 + r2 * e2];\n\t};\n}\n\n/** Rest thresholds scale with the motion, so 0\u21921 and 0\u21921000 both settle to the eye. */\nfunction restThresholds(options: SpringOptions, span: number) {\n\tconst restDelta = options.restDelta ?? Math.max(span, 1) * 0.001;\n\treturn { restDelta, restSpeed: options.restSpeed ?? restDelta * 10 };\n}\n\nexport function spring(\n\toptions: SpringOptions & { from: number; to: number; velocity?: number },\n): Generator {\n\tconst { from, to } = options;\n\tconst velocity = options.velocity ?? 0;\n\tconst displacement = oscillator(springPhysics(options), from - to, velocity);\n\tconst { restDelta, restSpeed } = restThresholds(options, Math.abs(to - from));\n\n\tfunction atRest(t: number): boolean {\n\t\tconst [x, v] = displacement(t);\n\t\treturn Math.abs(x) <= restDelta && Math.abs(v) <= restSpeed;\n\t}\n\n\tlet duration = 0;\n\twhile (duration < MAX_DURATION && !atRest(duration)) {\n\t\tduration += SETTLE_STEP;\n\t}\n\n\treturn {\n\t\tduration,\n\t\tat(elapsed): GeneratorState {\n\t\t\tif (elapsed >= duration) {\n\t\t\t\treturn { value: to, velocity: 0, done: true };\n\t\t\t}\n\t\t\tconst [x, v] = displacement(Math.max(0, elapsed));\n\t\t\treturn { value: to + x, velocity: v, done: false };\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "AAaA,MAAM,eAAe;AACrB,MAAM,cAAc;AAMb,SAAS,cAAc,UAAyB,CAAC,GAAkB;AACzE,QAAM,EAAE,WAAW,SAAS,KAAK,IAAI;AACrC,MAAI,cAAc,UAAa,YAAY,UAAa,SAAS,QAAW;AAC3E,WAAO;AAAA,MACN,WAAW,aAAa;AAAA,MACxB,SAAS,WAAW;AAAA,MACpB,MAAM,QAAQ;AAAA,IACf;AAAA,EACD;AACA,QAAM,WAAW,KAAK,IAAI,QAAQ,YAAY,KAAK,IAAK;AACxD,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,UAAU,GAAG,CAAC,GAAG,IAAI;AAC9D,SAAO;AAAA,IACN,YAAa,IAAI,KAAK,KAAM,aAAa;AAAA,IACzC,SAAU,IAAI,KAAK,MAAM,IAAI,UAAW;AAAA,IACxC,MAAM;AAAA,EACP;AACD;AAKA,SAAS,WACR,SACA,IACA,IACe;AACf,QAAM,QAAQ,KAAK,KAAK,QAAQ,YAAY,QAAQ,IAAI;AACxD,QAAM,OACL,QAAQ,WAAW,IAAI,KAAK,KAAK,QAAQ,YAAY,QAAQ,IAAI;AAClE,MAAI,KAAK,IAAI,OAAO,CAAC,IAAI,MAAM;AAC9B,UAAM,IAAI,KAAK,QAAQ;AACvB,WAAO,CAAC,MAAM;AACb,YAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC;AACjC,aAAO,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,GAAG;AAAA,IACjE;AAAA,EACD;AACA,MAAI,OAAO,GAAG;AACb,UAAM,SAAS,QAAQ,KAAK,KAAK,IAAI,OAAO,IAAI;AAChD,UAAM,KAAK,KAAK,OAAO,QAAQ,MAAM;AACrC,WAAO,CAAC,MAAM;AACb,YAAM,QAAQ,KAAK,IAAI,CAAC,OAAO,QAAQ,CAAC;AACxC,YAAM,MAAM,KAAK,IAAI,SAAS,CAAC;AAC/B,YAAM,MAAM,KAAK,IAAI,SAAS,CAAC;AAC/B,YAAM,IAAI,KAAK,MAAM,IAAI;AACzB,aAAO;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,CAAC,OAAO,QAAQ,IAAI,UAAU,IAAI,MAAM,KAAK;AAAA,MACvD;AAAA,IACD;AAAA,EACD;AACA,QAAM,OAAO,QAAQ,KAAK,KAAK,OAAO,OAAO,CAAC;AAC9C,QAAM,KAAK,CAAC,OAAO,QAAQ;AAC3B,QAAM,KAAK,CAAC,OAAO,QAAQ;AAC3B,QAAM,MAAM,KAAK,KAAK,OAAO,KAAK;AAClC,QAAM,KAAK,KAAK;AAChB,SAAO,CAAC,MAAM;AACb,UAAM,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC;AAC/B,UAAM,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC;AAC/B,WAAO,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAAA,EACnC;AACD;AAGA,SAAS,eAAe,SAAwB,MAAc;AAC7D,QAAM,YAAY,QAAQ,aAAa,KAAK,IAAI,MAAM,CAAC,IAAI;AAC3D,SAAO,EAAE,WAAW,WAAW,QAAQ,aAAa,YAAY,GAAG;AACpE;AAEO,SAAS,OACf,SACY;AACZ,QAAM,EAAE,MAAM,GAAG,IAAI;AACrB,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,eAAe,WAAW,cAAc,OAAO,GAAG,OAAO,IAAI,QAAQ;AAC3E,QAAM,EAAE,WAAW,UAAU,IAAI,eAAe,SAAS,KAAK,IAAI,KAAK,IAAI,CAAC;AAE5E,WAAS,OAAO,GAAoB;AACnC,UAAM,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC;AAC7B,WAAO,KAAK,IAAI,CAAC,KAAK,aAAa,KAAK,IAAI,CAAC,KAAK;AAAA,EACnD;AAEA,MAAI,WAAW;AACf,SAAO,WAAW,gBAAgB,CAAC,OAAO,QAAQ,GAAG;AACpD,gBAAY;AAAA,EACb;AAEA,SAAO;AAAA,IACN;AAAA,IACA,GAAG,SAAyB;AAC3B,UAAI,WAAW,UAAU;AACxB,eAAO,EAAE,OAAO,IAAI,UAAU,GAAG,MAAM,KAAK;AAAA,MAC7C;AACA,YAAM,CAAC,GAAG,CAAC,IAAI,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC;AAChD,aAAO,EAAE,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,MAAM;AAAA,IAClD;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ import type { EasingDefinition } from "../easing/types.js";
2
+ import type { Generator } from "./types.js";
3
+ export interface TweenOptions {
4
+ readonly keyframes: readonly number[];
5
+ /** Seconds, default 0.3. */
6
+ readonly duration?: number;
7
+ /** One easing for every segment, or one per segment. */
8
+ readonly ease?: EasingDefinition | readonly EasingDefinition[];
9
+ /** Each keyframe's offset in 0..1, default evenly spaced. */
10
+ readonly times?: readonly number[];
11
+ /** A tween's shape is fixed by its easing; accepted so options pass through unchanged. */
12
+ readonly velocity?: number;
13
+ }
14
+ export declare function tween(options: TweenOptions): Generator;
15
+ //# sourceMappingURL=tween.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tween.d.ts","sourceRoot":"","sources":["../../src/generators/tween.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE,CAAC;IAC/D,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAWD,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAgDtD"}
@@ -0,0 +1,51 @@
1
+ import { easeOut, resolveEasing } from "../easing/named.js";
2
+ const VELOCITY_WINDOW = 5e-3;
3
+ function isEasingList(ease) {
4
+ return Array.isArray(ease) && typeof ease[0] !== "number";
5
+ }
6
+ function tween(options) {
7
+ const { keyframes } = options;
8
+ const duration = Math.max(0, options.duration ?? 0.3);
9
+ const last = keyframes.length - 1;
10
+ const times = options.times ?? keyframes.map((_unused, index) => last === 0 ? 0 : index / last);
11
+ const eases = Array.from({ length: Math.max(last, 1) }, (_unused, index) => {
12
+ const ease = options.ease;
13
+ if (ease === void 0) {
14
+ return easeOut;
15
+ }
16
+ return resolveEasing(
17
+ isEasingList(ease) ? ease[index] ?? ease[ease.length - 1] ?? "easeOut" : ease
18
+ );
19
+ });
20
+ function valueAt(elapsed) {
21
+ const progress = duration === 0 ? 1 : Math.min(1, Math.max(0, elapsed / duration));
22
+ let segment = 0;
23
+ while (segment < last - 1 && progress > (times[segment + 1] ?? 1)) {
24
+ segment += 1;
25
+ }
26
+ const start = times[segment] ?? 0;
27
+ const end = times[segment + 1] ?? 1;
28
+ const from = keyframes[segment] ?? 0;
29
+ const to = keyframes[segment + 1] ?? from;
30
+ const local = end === start ? 1 : (progress - start) / (end - start);
31
+ const eased = (eases[segment] ?? easeOut)(Math.min(1, Math.max(0, local)));
32
+ return from + (to - from) * eased;
33
+ }
34
+ return {
35
+ duration,
36
+ at(elapsed) {
37
+ if (elapsed >= duration) {
38
+ return { value: keyframes[last] ?? 0, velocity: 0, done: true };
39
+ }
40
+ const value = valueAt(elapsed);
41
+ const before = Math.max(0, elapsed - VELOCITY_WINDOW);
42
+ const after = before === elapsed ? elapsed + VELOCITY_WINDOW : elapsed;
43
+ const velocity = (valueAt(after) - valueAt(before)) / (after - before);
44
+ return { value, velocity, done: false };
45
+ }
46
+ };
47
+ }
48
+ export {
49
+ tween
50
+ };
51
+ //# sourceMappingURL=tween.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/generators/tween.ts"],
4
+ "sourcesContent": ["import { easeOut, resolveEasing } from \"#/easing/named.ts\";\nimport type { EasingDefinition } from \"#/easing/types.ts\";\nimport type { Generator, GeneratorState } from \"#/generators/types.ts\";\n\nexport interface TweenOptions {\n\treadonly keyframes: readonly number[];\n\t/** Seconds, default 0.3. */\n\treadonly duration?: number;\n\t/** One easing for every segment, or one per segment. */\n\treadonly ease?: EasingDefinition | readonly EasingDefinition[];\n\t/** Each keyframe's offset in 0..1, default evenly spaced. */\n\treadonly times?: readonly number[];\n\t/** A tween's shape is fixed by its easing; accepted so options pass through unchanged. */\n\treadonly velocity?: number;\n}\n\n/** Window for the finite difference that reports velocity. */\nconst VELOCITY_WINDOW = 0.005;\n\nfunction isEasingList(\n\tease: TweenOptions[\"ease\"],\n): ease is readonly EasingDefinition[] {\n\treturn Array.isArray(ease) && typeof ease[0] !== \"number\";\n}\n\nexport function tween(options: TweenOptions): Generator {\n\tconst { keyframes } = options;\n\tconst duration = Math.max(0, options.duration ?? 0.3);\n\tconst last = keyframes.length - 1;\n\tconst times =\n\t\toptions.times ??\n\t\tkeyframes.map((_unused, index) => (last === 0 ? 0 : index / last));\n\tconst eases = Array.from({ length: Math.max(last, 1) }, (_unused, index) => {\n\t\tconst ease = options.ease;\n\t\tif (ease === undefined) {\n\t\t\treturn easeOut;\n\t\t}\n\t\treturn resolveEasing(\n\t\t\tisEasingList(ease)\n\t\t\t\t? (ease[index] ?? ease[ease.length - 1] ?? \"easeOut\")\n\t\t\t\t: ease,\n\t\t);\n\t});\n\n\tfunction valueAt(elapsed: number): number {\n\t\tconst progress =\n\t\t\tduration === 0 ? 1 : Math.min(1, Math.max(0, elapsed / duration));\n\t\tlet segment = 0;\n\t\twhile (segment < last - 1 && progress > (times[segment + 1] ?? 1)) {\n\t\t\tsegment += 1;\n\t\t}\n\t\tconst start = times[segment] ?? 0;\n\t\tconst end = times[segment + 1] ?? 1;\n\t\tconst from = keyframes[segment] ?? 0;\n\t\tconst to = keyframes[segment + 1] ?? from;\n\t\tconst local = end === start ? 1 : (progress - start) / (end - start);\n\t\tconst eased = (eases[segment] ?? easeOut)(Math.min(1, Math.max(0, local)));\n\t\treturn from + (to - from) * eased;\n\t}\n\n\treturn {\n\t\tduration,\n\t\tat(elapsed): GeneratorState {\n\t\t\tif (elapsed >= duration) {\n\t\t\t\treturn { value: keyframes[last] ?? 0, velocity: 0, done: true };\n\t\t\t}\n\t\t\tconst value = valueAt(elapsed);\n\t\t\tconst before = Math.max(0, elapsed - VELOCITY_WINDOW);\n\t\t\tconst after = before === elapsed ? elapsed + VELOCITY_WINDOW : elapsed;\n\t\t\tconst velocity = (valueAt(after) - valueAt(before)) / (after - before);\n\t\t\treturn { value, velocity, done: false };\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS,qBAAqB;AAiBvC,MAAM,kBAAkB;AAExB,SAAS,aACR,MACsC;AACtC,SAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,KAAK,CAAC,MAAM;AAClD;AAEO,SAAS,MAAM,SAAkC;AACvD,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,YAAY,GAAG;AACpD,QAAM,OAAO,UAAU,SAAS;AAChC,QAAM,QACL,QAAQ,SACR,UAAU,IAAI,CAAC,SAAS,UAAW,SAAS,IAAI,IAAI,QAAQ,IAAK;AAClE,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,UAAU;AAC3E,UAAM,OAAO,QAAQ;AACrB,QAAI,SAAS,QAAW;AACvB,aAAO;AAAA,IACR;AACA,WAAO;AAAA,MACN,aAAa,IAAI,IACb,KAAK,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,KAAK,YACzC;AAAA,IACJ;AAAA,EACD,CAAC;AAED,WAAS,QAAQ,SAAyB;AACzC,UAAM,WACL,aAAa,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,QAAQ,CAAC;AACjE,QAAI,UAAU;AACd,WAAO,UAAU,OAAO,KAAK,YAAY,MAAM,UAAU,CAAC,KAAK,IAAI;AAClE,iBAAW;AAAA,IACZ;AACA,UAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,UAAM,MAAM,MAAM,UAAU,CAAC,KAAK;AAClC,UAAM,OAAO,UAAU,OAAO,KAAK;AACnC,UAAM,KAAK,UAAU,UAAU,CAAC,KAAK;AACrC,UAAM,QAAQ,QAAQ,QAAQ,KAAK,WAAW,UAAU,MAAM;AAC9D,UAAM,SAAS,MAAM,OAAO,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AACzE,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC7B;AAEA,SAAO;AAAA,IACN;AAAA,IACA,GAAG,SAAyB;AAC3B,UAAI,WAAW,UAAU;AACxB,eAAO,EAAE,OAAO,UAAU,IAAI,KAAK,GAAG,UAAU,GAAG,MAAM,KAAK;AAAA,MAC/D;AACA,YAAM,QAAQ,QAAQ,OAAO;AAC7B,YAAM,SAAS,KAAK,IAAI,GAAG,UAAU,eAAe;AACpD,YAAM,QAAQ,WAAW,UAAU,UAAU,kBAAkB;AAC/D,YAAM,YAAY,QAAQ,KAAK,IAAI,QAAQ,MAAM,MAAM,QAAQ;AAC/D,aAAO,EAAE,OAAO,UAAU,MAAM,MAAM;AAAA,IACvC;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ export interface GeneratorState {
2
+ readonly value: number;
3
+ /** Units per second. */
4
+ readonly velocity: number;
5
+ readonly done: boolean;
6
+ }
7
+ /** One number moving over time: a spring, a tween or a decay. */
8
+ export interface Generator {
9
+ /** Seconds until it settles. */
10
+ readonly duration: number;
11
+ /** The state `elapsed` seconds after the start. */
12
+ at(elapsed: number): GeneratorState;
13
+ }
14
+ export interface SpringOptions {
15
+ /**
16
+ * Perceived duration in seconds, SwiftUI's model: how long the motion
17
+ * looks like it takes, not when the last sub-pixel wobble ends. Ignored
18
+ * when `stiffness`, `damping` or `mass` is given.
19
+ */
20
+ readonly duration?: number;
21
+ /** 0 never overshoots; towards 1, springier. */
22
+ readonly bounce?: number;
23
+ readonly stiffness?: number;
24
+ readonly damping?: number;
25
+ readonly mass?: number;
26
+ /** Below this speed (units per second) and `restDelta`, the spring is done. */
27
+ readonly restSpeed?: number;
28
+ readonly restDelta?: number;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACvB;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACzB,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ export { onReducedMotionChange, prefersReducedMotion, type ReducedMotionPolicy, reducedMotionPolicy, setReducedMotion, shouldReduceMotion, } from "./accessibility/reduced-motion.js";
2
+ export { type Animate, animate, createAnimate } from "./animate/animate.js";
3
+ export type { AnimationControls, AnimationOptions, AnimationState, DOMKeyframes, ElementTarget, Keyframes, ValueAnimationOptions, } from "./animate/types.js";
4
+ export { cubicBezier } from "./easing/cubic-bezier.js";
5
+ export { linearEasing } from "./easing/linear-css.js";
6
+ export { anticipate, backIn, backInOut, backOut, circIn, circInOut, circOut, easeIn, easeInOut, easeOut, linear, resolveEasing, } from "./easing/named.js";
7
+ export { type SpringEasing, springEasing } from "./easing/spring.js";
8
+ export { steps } from "./easing/steps.js";
9
+ export type { CubicBezier, Easing, EasingDefinition, EasingName, } from "./easing/types.js";
10
+ export { cancelFrame, type FrameCallback, type FrameData, frame, frameData, } from "./frame/frame.js";
11
+ export { type InertiaOptions, inertia } from "./generators/inertia.js";
12
+ export { spring, springPhysics } from "./generators/spring.js";
13
+ export { type TweenOptions, tween } from "./generators/tween.js";
14
+ export type { Generator, GeneratorState, SpringOptions, } from "./generators/types.js";
15
+ export { mixColor } from "./interpolate/color.js";
16
+ export { type InterpolateOptions, interpolate, } from "./interpolate/interpolate.js";
17
+ export { type Mixer, mix } from "./interpolate/mix.js";
18
+ export { mixPath } from "./interpolate/path/morph.js";
19
+ export type { Segment, SegmentOptions, SequenceAt, } from "./sequence/sequence.js";
20
+ export { type StaggerOptions, stagger } from "./stagger/stagger.js";
21
+ export { isMotionValue, type MotionValue, type MotionValueEvent, motionValue, } from "./value/motion-value.js";
22
+ export { transformValue } from "./value/transform.js";
23
+ export { type InViewOptions, inView, type OnViewEnd, type OnViewStart, } from "./view/in-view.js";
24
+ export { resize, type Size } from "./view/resize.js";
25
+ export { type OnScroll, type ScrollDrivable, type ScrollInfo, type ScrollOptions, scroll, } from "./view/scroll.js";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EACX,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACN,UAAU,EACV,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,aAAa,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,YAAY,EACX,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,UAAU,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,EACL,SAAS,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EACX,SAAS,EACT,cAAc,EACd,aAAa,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EACN,KAAK,kBAAkB,EACvB,WAAW,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,YAAY,EACX,OAAO,EACP,cAAc,EACd,UAAU,GACV,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACN,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,WAAW,GACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACN,KAAK,aAAa,EAClB,MAAM,EACN,KAAK,SAAS,EACd,KAAK,WAAW,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACN,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,MAAM,GACN,MAAM,kBAAkB,CAAC"}