@rafaelaugusto/jolt 0.1.0-rc.7 → 0.1.0-rc.9

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 (233) hide show
  1. package/README.md +2 -2
  2. package/dist/core/arrival.d.ts +19 -0
  3. package/dist/core/arrival.d.ts.map +1 -0
  4. package/dist/core/arrival.js +19 -0
  5. package/dist/core/arrival.js.map +1 -0
  6. package/dist/core/gesture-math.d.ts +22 -0
  7. package/dist/core/gesture-math.d.ts.map +1 -0
  8. package/dist/core/gesture-math.js +45 -0
  9. package/dist/core/gesture-math.js.map +1 -0
  10. package/dist/core/playback.d.ts +5 -0
  11. package/dist/core/playback.d.ts.map +1 -1
  12. package/dist/core/playback.js +23 -0
  13. package/dist/core/playback.js.map +1 -1
  14. package/dist/core/reorder.d.ts +12 -0
  15. package/dist/core/reorder.d.ts.map +1 -0
  16. package/dist/core/reorder.js +30 -0
  17. package/dist/core/reorder.js.map +1 -0
  18. package/dist/core/scroll-header.d.ts +19 -0
  19. package/dist/core/scroll-header.d.ts.map +1 -0
  20. package/dist/core/scroll-header.js +56 -0
  21. package/dist/core/scroll-header.js.map +1 -0
  22. package/dist/core/sequence.d.ts +32 -0
  23. package/dist/core/sequence.d.ts.map +1 -0
  24. package/dist/core/sequence.js +367 -0
  25. package/dist/core/sequence.js.map +1 -0
  26. package/dist/core/shape-path.d.ts +10 -0
  27. package/dist/core/shape-path.d.ts.map +1 -0
  28. package/dist/core/shape-path.js +106 -0
  29. package/dist/core/shape-path.js.map +1 -0
  30. package/dist/core/state-transition.d.ts +16 -0
  31. package/dist/core/state-transition.d.ts.map +1 -0
  32. package/dist/core/state-transition.js +66 -0
  33. package/dist/core/state-transition.js.map +1 -0
  34. package/dist/core/svg-path.d.ts +32 -0
  35. package/dist/core/svg-path.d.ts.map +1 -0
  36. package/dist/core/svg-path.js +282 -0
  37. package/dist/core/svg-path.js.map +1 -0
  38. package/dist/engine.d.ts +1 -18
  39. package/dist/engine.d.ts.map +1 -1
  40. package/dist/engine.js +2 -18
  41. package/dist/engine.js.map +1 -1
  42. package/dist/live-paint.d.ts +11 -0
  43. package/dist/live-paint.d.ts.map +1 -0
  44. package/dist/live-paint.js +66 -0
  45. package/dist/live-paint.js.map +1 -0
  46. package/dist/live-spring-driver.d.ts +4 -1
  47. package/dist/live-spring-driver.d.ts.map +1 -1
  48. package/dist/live-spring-driver.js +41 -1
  49. package/dist/live-spring-driver.js.map +1 -1
  50. package/dist/motion-states.d.ts +2 -7
  51. package/dist/motion-states.d.ts.map +1 -1
  52. package/dist/motion-states.js +79 -107
  53. package/dist/motion-states.js.map +1 -1
  54. package/dist/motion-value.d.ts +3 -0
  55. package/dist/motion-value.d.ts.map +1 -1
  56. package/dist/motion-value.js +56 -47
  57. package/dist/motion-value.js.map +1 -1
  58. package/dist/playback.d.ts +1 -7
  59. package/dist/playback.d.ts.map +1 -1
  60. package/dist/playback.js +1 -24
  61. package/dist/playback.js.map +1 -1
  62. package/dist/reorder/model.d.ts +1 -5
  63. package/dist/reorder/model.d.ts.map +1 -1
  64. package/dist/reorder/model.js +1 -29
  65. package/dist/reorder/model.js.map +1 -1
  66. package/dist/scroll-header/geometry.d.ts +1 -18
  67. package/dist/scroll-header/geometry.d.ts.map +1 -1
  68. package/dist/scroll-header/geometry.js +1 -55
  69. package/dist/scroll-header/geometry.js.map +1 -1
  70. package/dist/sequence.d.ts.map +1 -1
  71. package/dist/sequence.js +8 -349
  72. package/dist/sequence.js.map +1 -1
  73. package/dist/shapes/path.d.ts +1 -9
  74. package/dist/shapes/path.d.ts.map +1 -1
  75. package/dist/shapes/path.js +1 -105
  76. package/dist/shapes/path.js.map +1 -1
  77. package/dist/svg-path.d.ts +1 -31
  78. package/dist/svg-path.d.ts.map +1 -1
  79. package/dist/svg-path.js +1 -281
  80. package/dist/svg-path.js.map +1 -1
  81. package/dist/web/decay.d.ts +14 -0
  82. package/dist/web/decay.d.ts.map +1 -0
  83. package/dist/web/decay.js +62 -0
  84. package/dist/web/decay.js.map +1 -0
  85. package/dist/web/drag.d.ts +51 -2
  86. package/dist/web/drag.d.ts.map +1 -1
  87. package/dist/web/drag.js +179 -18
  88. package/dist/web/drag.js.map +1 -1
  89. package/dist/web/gesture-scroll.d.ts +20 -0
  90. package/dist/web/gesture-scroll.d.ts.map +1 -0
  91. package/dist/web/gesture-scroll.js +99 -0
  92. package/dist/web/gesture-scroll.js.map +1 -0
  93. package/dist/web/gestures.d.ts +63 -0
  94. package/dist/web/gestures.d.ts.map +1 -0
  95. package/dist/web/gestures.js +542 -0
  96. package/dist/web/gestures.js.map +1 -0
  97. package/dist/web/interaction.d.ts +38 -0
  98. package/dist/web/interaction.d.ts.map +1 -0
  99. package/dist/web/interaction.js +85 -0
  100. package/dist/web/interaction.js.map +1 -0
  101. package/dist/web/items.d.ts +28 -0
  102. package/dist/web/items.d.ts.map +1 -0
  103. package/dist/web/items.js +110 -0
  104. package/dist/web/items.js.map +1 -0
  105. package/dist/web/motion-states.d.ts +43 -0
  106. package/dist/web/motion-states.d.ts.map +1 -0
  107. package/dist/web/motion-states.js +243 -0
  108. package/dist/web/motion-states.js.map +1 -0
  109. package/dist/web/progress.d.ts +17 -0
  110. package/dist/web/progress.d.ts.map +1 -0
  111. package/dist/web/progress.js +69 -0
  112. package/dist/web/progress.js.map +1 -0
  113. package/dist/web/public.d.ts +38 -4
  114. package/dist/web/public.d.ts.map +1 -1
  115. package/dist/web/public.js +11 -0
  116. package/dist/web/public.js.map +1 -1
  117. package/dist/web/reorder.d.ts +38 -0
  118. package/dist/web/reorder.d.ts.map +1 -0
  119. package/dist/web/reorder.js +560 -0
  120. package/dist/web/reorder.js.map +1 -0
  121. package/dist/web/runtime.d.ts +86 -4
  122. package/dist/web/runtime.d.ts.map +1 -1
  123. package/dist/web/runtime.js +719 -50
  124. package/dist/web/runtime.js.map +1 -1
  125. package/dist/web/scope.d.ts +1 -1
  126. package/dist/web/scope.d.ts.map +1 -1
  127. package/dist/web/scope.js +27 -2
  128. package/dist/web/scope.js.map +1 -1
  129. package/dist/web/scroll-header.d.ts +53 -0
  130. package/dist/web/scroll-header.d.ts.map +1 -0
  131. package/dist/web/scroll-header.js +395 -0
  132. package/dist/web/scroll-header.js.map +1 -0
  133. package/dist/web/scroll.d.ts +13 -4
  134. package/dist/web/scroll.d.ts.map +1 -1
  135. package/dist/web/scroll.js +44 -9
  136. package/dist/web/scroll.js.map +1 -1
  137. package/dist/web/sequence.d.ts +26 -0
  138. package/dist/web/sequence.d.ts.map +1 -0
  139. package/dist/web/sequence.js +28 -0
  140. package/dist/web/sequence.js.map +1 -0
  141. package/dist/web/shared-layout.d.ts.map +1 -1
  142. package/dist/web/shared-layout.js +22 -9
  143. package/dist/web/shared-layout.js.map +1 -1
  144. package/dist/web/stroke.d.ts +118 -0
  145. package/dist/web/stroke.d.ts.map +1 -0
  146. package/dist/web/stroke.js +470 -0
  147. package/dist/web/stroke.js.map +1 -0
  148. package/dist/web/timers.d.ts +14 -0
  149. package/dist/web/timers.d.ts.map +1 -0
  150. package/dist/web/timers.js +57 -0
  151. package/dist/web/timers.js.map +1 -0
  152. package/dist/web/value-playback.d.ts +44 -0
  153. package/dist/web/value-playback.d.ts.map +1 -0
  154. package/dist/web/value-playback.js +75 -0
  155. package/dist/web/value-playback.js.map +1 -0
  156. package/dist/web/value.d.ts +15 -0
  157. package/dist/web/value.d.ts.map +1 -1
  158. package/dist/web/value.js +24 -0
  159. package/dist/web/value.js.map +1 -1
  160. package/dist/web/viewport.d.ts +3 -1
  161. package/dist/web/viewport.d.ts.map +1 -1
  162. package/dist/web/viewport.js +25 -3
  163. package/dist/web/viewport.js.map +1 -1
  164. package/dist/web/vue/attachment.d.ts +7 -0
  165. package/dist/web/vue/attachment.d.ts.map +1 -0
  166. package/dist/web/vue/attachment.js +50 -0
  167. package/dist/web/vue/attachment.js.map +1 -0
  168. package/dist/web/vue/index.d.ts +2 -0
  169. package/dist/web/vue/index.d.ts.map +1 -1
  170. package/dist/web/vue/index.js +76 -25
  171. package/dist/web/vue/index.js.map +1 -1
  172. package/dist/web/vue/viewport-directive.d.ts +12 -0
  173. package/dist/web/vue/viewport-directive.d.ts.map +1 -0
  174. package/dist/web/vue/viewport-directive.js +85 -0
  175. package/dist/web/vue/viewport-directive.js.map +1 -0
  176. package/dist/web/zoomable.d.ts +41 -0
  177. package/dist/web/zoomable.d.ts.map +1 -0
  178. package/dist/web/zoomable.js +401 -0
  179. package/dist/web/zoomable.js.map +1 -0
  180. package/package.json +12 -2
  181. package/platforms/android/java/org/rafaelaugusto/jolt/DecorationTarget.java +7 -6
  182. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +13 -10
  183. package/platforms/ios/src/JoltLivePaint.h +12 -0
  184. package/platforms/ios/src/JoltLivePaint.m +131 -0
  185. package/platforms/ios/src/JoltLiveSpring.m +9 -4
  186. package/platforms/ios/src/module.modulemap +1 -0
  187. package/src/android-plugin.d.ts +13 -0
  188. package/src/core/arrival.ts +30 -0
  189. package/src/core/gesture-math.ts +53 -0
  190. package/src/core/playback.ts +30 -0
  191. package/src/core/reorder.ts +53 -0
  192. package/src/core/scroll-header.ts +100 -0
  193. package/src/core/sequence.ts +380 -0
  194. package/src/core/shape-path.ts +127 -0
  195. package/src/core/state-transition.ts +97 -0
  196. package/src/core/svg-path.ts +360 -0
  197. package/src/engine.ts +8 -29
  198. package/src/ios-plugin.d.ts +5 -0
  199. package/src/live-paint.ts +78 -0
  200. package/src/live-spring-driver.ts +63 -2
  201. package/src/motion-states.ts +86 -132
  202. package/src/motion-value.ts +62 -54
  203. package/src/playback.ts +1 -39
  204. package/src/reorder/model.ts +1 -47
  205. package/src/scroll-header/geometry.ts +1 -100
  206. package/src/sequence.ts +10 -332
  207. package/src/shapes/path.ts +1 -127
  208. package/src/svg-path.ts +1 -360
  209. package/src/web/decay.ts +76 -0
  210. package/src/web/drag.ts +228 -24
  211. package/src/web/gesture-scroll.ts +129 -0
  212. package/src/web/gestures.ts +667 -0
  213. package/src/web/interaction.ts +136 -0
  214. package/src/web/items.ts +173 -0
  215. package/src/web/motion-states.ts +304 -0
  216. package/src/web/progress.ts +71 -0
  217. package/src/web/public.ts +115 -2
  218. package/src/web/reorder.ts +718 -0
  219. package/src/web/runtime.ts +906 -63
  220. package/src/web/scope.ts +39 -2
  221. package/src/web/scroll-header.ts +492 -0
  222. package/src/web/scroll.ts +61 -12
  223. package/src/web/sequence.ts +60 -0
  224. package/src/web/shared-layout.ts +32 -11
  225. package/src/web/stroke.ts +547 -0
  226. package/src/web/timers.ts +51 -0
  227. package/src/web/value-playback.ts +104 -0
  228. package/src/web/value.ts +28 -0
  229. package/src/web/viewport.ts +29 -4
  230. package/src/web/vue/attachment.ts +47 -0
  231. package/src/web/vue/index.ts +77 -28
  232. package/src/web/vue/viewport-directive.ts +99 -0
  233. package/src/web/zoomable.ts +521 -0
package/README.md CHANGED
@@ -31,7 +31,7 @@ NativeScript's `view.animate()` covers the basics and stops there: one curve for
31
31
 
32
32
  Jolt computes the motion once, in JavaScript, when the animation starts, and hands it to the platform as keyframes: Core Animation on iOS, `ObjectAnimator` on Android. Those default view tracks play without per-frame JavaScript. Real-size layout, opt-in subscribers, gesture input and timeline step activation retain their documented [execution limits](https://jolt.rafaelaugusto.dev/guide/how-it-works). Springs follow real physics, and an animation that interrupts another one starts from where the view is, at the speed it was going.
33
33
 
34
- The [0.1.0-rc.7 release candidate](https://github.com/rafaelaugustos/jolt/releases/tag/v0.1.0-rc.7) adds Web colors and borders, intrinsic size and FLIP, seekable scenes, pointer/viewport helpers, owned scopes and continuous Vue setup, top-layer overlay geometry, shared elements and integration diagnostics. Native execution keeps the RC.6 behavior. The preview has **74 examples in English, Portuguese, Spanish and Simplified Chinese**. Install `@rafaelaugusto/jolt@0.1.0-rc.7` and rebuild native apps; external native properties also need matching `@rafaelaugusto/jolt-native@0.1.0-rc.7`. [Stable-release acceptance](https://jolt.rafaelaugusto.dev/guide/not-there-yet) remains in progress.
34
+ The [0.1.0-rc.9 release candidate](https://github.com/rafaelaugustos/jolt/releases/tag/v0.1.0-rc.9) adds Web inertial/value drag, composed gestures, image zoom, coordinated nested scroll, collapsing headers with refresh, and keyed reorder. Native retained springs now support border/text colors, widths and independent corners while preserving mixed paint ownership. The preview has **74 examples in English, Portuguese, Spanish and Simplified Chinese**. Install `@rafaelaugusto/jolt@0.1.0-rc.9` and rebuild native apps; external native properties also need matching `@rafaelaugusto/jolt-native@0.1.0-rc.9`. [Stable-release acceptance](https://jolt.rafaelaugusto.dev/guide/not-there-yet) remains in progress.
35
35
 
36
36
  For the browser, import **`@rafaelaugusto/jolt/web`**. It installs without NativeScript, Vue or React; **`@rafaelaugusto/jolt/web/vue`** optionally integrates Vue 3.5 DOM refs and enter/leave. Both entries are experimental and use the same motion compiler as native playback. See [installation](https://jolt.rafaelaugusto.dev/guide/install#experimental-web-candidate), [finite Web playback](https://jolt.rafaelaugusto.dev/guide/web-runtime) and [Vue Web motion](https://jolt.rafaelaugusto.dev/guide/web-vue). Mavis integration and its shared application proof continue separately.
37
37
 
@@ -101,7 +101,7 @@ For the browser, import **`@rafaelaugusto/jolt/web`**. It installs without Nativ
101
101
  npm install @rafaelaugusto/jolt@next
102
102
  ```
103
103
 
104
- The current release candidate is **0.1.0-rc.7**, published under the `next` tag. Requires `@nativescript/core` 8.9 or later. It doesn't depend on a framework: it takes a view, or an element that holds one. Rebuild the native app after installing or upgrading Jolt. See [release status and limits](https://jolt.rafaelaugusto.dev/guide/not-there-yet) for the remaining stable-release acceptance work.
104
+ The current release candidate is **0.1.0-rc.9**, published under the `next` tag. Requires `@nativescript/core` 8.9 or later. It doesn't depend on a framework: it takes a view, or an element that holds one. Rebuild the native app after installing or upgrading Jolt. See [release status and limits](https://jolt.rafaelaugusto.dev/guide/not-there-yet) for the remaining stable-release acceptance work.
105
105
 
106
106
  On iOS 15+, Jolt requests up to 120 Hz on ProMotion displays. Set `CADisableMinimumFrameDurationOnPhone` to `true` in the app's `App_Resources/iOS/Info.plist` and rebuild to enable higher rates on iPhone. See the [iOS setup](https://jolt.rafaelaugusto.dev/guide/install#promotion-on-ios); the system still chooses the actual refresh rate.
107
107
 
@@ -0,0 +1,19 @@
1
+ import type { Animation } from './playback.js';
2
+ /** Internal forecast for starting a timeline step before another one arrives. */
3
+ export interface ArrivalTiming {
4
+ read(): {
5
+ remaining: number | undefined;
6
+ paused: boolean;
7
+ arrived: boolean;
8
+ };
9
+ subscribe(callback: () => void): () => void;
10
+ }
11
+ export declare function arrivalTimingOf(animation: Animation): ArrivalTiming | undefined;
12
+ export declare function setArrivalTiming(animation: Animation, timing: ArrivalTiming): void;
13
+ /**
14
+ * Resolves once the animation looks done, which for a spring is well before
15
+ * `finished`. Sequences move on to the next step then.
16
+ */
17
+ export declare function arrivalOf(animation: Animation): Promise<unknown>;
18
+ export declare function setArrival(animation: Animation, arrival: Promise<unknown>): void;
19
+ //# sourceMappingURL=arrival.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrival.d.ts","sourceRoot":"","sources":["../../src/core/arrival.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI9C,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI;QAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IAC5E,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C;AAGD,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,6BAEnD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,QAE3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAEzE"}
@@ -0,0 +1,19 @@
1
+ const arrivals = new WeakMap();
2
+ const arrivalTimings = new WeakMap();
3
+ export function arrivalTimingOf(animation) {
4
+ return arrivalTimings.get(animation);
5
+ }
6
+ export function setArrivalTiming(animation, timing) {
7
+ arrivalTimings.set(animation, timing);
8
+ }
9
+ /**
10
+ * Resolves once the animation looks done, which for a spring is well before
11
+ * `finished`. Sequences move on to the next step then.
12
+ */
13
+ export function arrivalOf(animation) {
14
+ return arrivals.get(animation) ?? animation.finished;
15
+ }
16
+ export function setArrival(animation, arrival) {
17
+ arrivals.set(animation, arrival);
18
+ }
19
+ //# sourceMappingURL=arrival.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrival.js","sourceRoot":"","sources":["../../src/core/arrival.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA+B,CAAA;AAO3D,MAAM,cAAc,GAAG,IAAI,OAAO,EAA4B,CAAA;AAE9D,MAAM,UAAU,eAAe,CAAC,SAAoB;IAClD,OAAO,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAoB,EAAE,MAAqB;IAC1E,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,SAAoB;IAC5C,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAoB,EAAE,OAAyB;IACxE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAClC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface ContactPoint {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export declare function contactGeometry(points: readonly ContactPoint[]): {
6
+ x: number;
7
+ y: number;
8
+ distance: number;
9
+ angle: number;
10
+ };
11
+ export declare function angleDelta(next: number, previous: number): number;
12
+ export declare const constrain: (value: number, min: number, max: number) => number;
13
+ /** Finger delta is consumed exactly once. Positive panel motion collapses it. */
14
+ export declare function consumeScroll(delta: number, panel: number, bounds: readonly [number, number], offsets: readonly {
15
+ position: number;
16
+ max: number;
17
+ }[]): {
18
+ panel: number;
19
+ scroll: number[];
20
+ remaining: number;
21
+ };
22
+ //# sourceMappingURL=gesture-math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture-math.d.ts","sourceRoot":"","sources":["../../src/core/gesture-math.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE;;;;;EAa9D;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAExD;AACD,eAAO,MAAM,SAAS,UAAW,MAAM,OAAO,MAAM,OAAO,MAAM,WAC5B,CAAA;AACrC,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,OAAO,EAAE,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE;;;;EAwBtD"}
@@ -0,0 +1,45 @@
1
+ export function contactGeometry(points) {
2
+ const count = points.length;
3
+ if (!count)
4
+ return { x: 0, y: 0, distance: 0, angle: 0 };
5
+ const x = points.reduce((sum, p) => sum + p.x, 0) / count;
6
+ const y = points.reduce((sum, p) => sum + p.y, 0) / count;
7
+ const first = points[0], second = points[1] ?? first;
8
+ return {
9
+ x,
10
+ y,
11
+ distance: Math.hypot(second.x - first.x, second.y - first.y),
12
+ angle: (Math.atan2(second.y - first.y, second.x - first.x) * 180) / Math.PI,
13
+ };
14
+ }
15
+ export function angleDelta(next, previous) {
16
+ return ((((next - previous + 540) % 360) + 360) % 360) - 180;
17
+ }
18
+ export const constrain = (value, min, max) => Math.max(min, Math.min(max, value));
19
+ /** Finger delta is consumed exactly once. Positive panel motion collapses it. */
20
+ export function consumeScroll(delta, panel, bounds, offsets) {
21
+ let rest = delta;
22
+ const scroll = offsets.map((item) => item.position);
23
+ const movePanel = () => {
24
+ const next = constrain(panel + rest, ...bounds);
25
+ rest -= next - panel;
26
+ panel = next;
27
+ };
28
+ const moveScroll = () => {
29
+ offsets.forEach((item, i) => {
30
+ const next = constrain(scroll[i] - rest, 0, item.max);
31
+ rest += next - scroll[i];
32
+ scroll[i] = next;
33
+ });
34
+ };
35
+ if (delta < 0) {
36
+ movePanel();
37
+ moveScroll();
38
+ }
39
+ else {
40
+ moveScroll();
41
+ movePanel();
42
+ }
43
+ return { panel, scroll, remaining: rest };
44
+ }
45
+ //# sourceMappingURL=gesture-math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture-math.js","sourceRoot":"","sources":["../../src/core/gesture-math.ts"],"names":[],"mappings":"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"}
@@ -41,4 +41,9 @@ export interface PlaybackState {
41
41
  /** Read only on user commands; there is no frame loop in JavaScript. */
42
42
  export declare function createClock(now: () => number, initial?: number): PlaybackClock;
43
43
  export declare function validateProgress(value: number, duration: number): void;
44
+ export declare function registerPlayback(animation: Animation, read: () => PlaybackState): () => void;
45
+ export declare function playbackSource(animation: Animation): {
46
+ read: () => PlaybackState;
47
+ subscribe(listener: () => void): () => void;
48
+ };
44
49
  //# sourceMappingURL=playback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"playback.d.ts","sourceRoot":"","sources":["../../src/core/playback.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAU,SAAQ,WAAW,CAAC,OAAO,CAAC;IACrD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,+FAA+F;IAC/F,IAAI,IAAI,IAAI,CAAA;CACb;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,0DAA0D;IAC1D,KAAK,IAAI,IAAI,CAAA;IACb,yFAAyF;IACzF,IAAI,IAAI,IAAI,CAAA;IACZ,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,MAAM,CAAA;IACd,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,IAAI,IAAI,CAAA;CACf;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,OAAO,SAAI,GAAG,aAAa,CA0BzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAO/D"}
1
+ {"version":3,"file":"playback.d.ts","sourceRoot":"","sources":["../../src/core/playback.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAU,SAAQ,WAAW,CAAC,OAAO,CAAC;IACrD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,+FAA+F;IAC/F,IAAI,IAAI,IAAI,CAAA;CACb;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,0DAA0D;IAC1D,KAAK,IAAI,IAAI,CAAA;IACb,yFAAyF;IACzF,IAAI,IAAI,IAAI,CAAA;IACZ,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,MAAM,CAAA;IACd,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,IAAI,IAAI,CAAA;CACf;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,OAAO,SAAI,GAAG,aAAa,CA0BzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAO/D;AAUD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,cAM/E;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS;IAI/C,IAAI,QAjBI,aAAa;IAkBrB,SAAS,WAAW,MAAM,IAAI;EAOjC"}
@@ -32,4 +32,27 @@ export function validateProgress(value, duration) {
32
32
  if (!Number.isFinite(duration))
33
33
  throw new RangeError('Progress requires a finite animation; endless loops can pause and play.');
34
34
  }
35
+ const sources = new WeakMap();
36
+ export function registerPlayback(animation, read) {
37
+ const source = { read, listeners: new Set() };
38
+ sources.set(animation, source);
39
+ return () => {
40
+ for (const listener of [...source.listeners])
41
+ listener();
42
+ };
43
+ }
44
+ export function playbackSource(animation) {
45
+ const source = sources.get(animation);
46
+ if (!source)
47
+ throw new TypeError('This animation does not expose a playback clock.');
48
+ return {
49
+ read: source.read,
50
+ subscribe(listener) {
51
+ source.listeners.add(listener);
52
+ return () => {
53
+ source.listeners.delete(listener);
54
+ };
55
+ },
56
+ };
57
+ }
35
58
  //# sourceMappingURL=playback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playback.js","sourceRoot":"","sources":["../../src/core/playback.ts"],"names":[],"mappings":"AA6CA,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,GAAiB,EAAE,OAAO,GAAG,CAAC;IACxD,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,IAAI,MAAM,GAAG,GAAG,EAAE,CAAA;IAClB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAA;IACzD,OAAO;QACL,IAAI;QACJ,KAAK;YACH,MAAM,GAAG,IAAI,EAAE,CAAA;YACf,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAI;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,EAAE,CAAA;gBACd,MAAM,GAAG,KAAK,CAAA;YAChB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,EAAE;YACL,MAAM,GAAG,EAAE,CAAA;YACX,MAAM,GAAG,GAAG,EAAE,CAAA;QAChB,CAAC;QACD,MAAM;YACJ,MAAM,GAAG,IAAI,EAAE,CAAA;YACf,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,QAAgB;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAA;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,yEAAyE,CAC1E,CAAA;AACL,CAAC"}
1
+ {"version":3,"file":"playback.js","sourceRoot":"","sources":["../../src/core/playback.ts"],"names":[],"mappings":"AA6CA,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,GAAiB,EAAE,OAAO,GAAG,CAAC;IACxD,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,IAAI,MAAM,GAAG,GAAG,EAAE,CAAA;IAClB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAA;IACzD,OAAO;QACL,IAAI;QACJ,KAAK;YACH,MAAM,GAAG,IAAI,EAAE,CAAA;YACf,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAI;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,EAAE,CAAA;gBACd,MAAM,GAAG,KAAK,CAAA;YAChB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,EAAE;YACL,MAAM,GAAG,EAAE,CAAA;YACX,MAAM,GAAG,GAAG,EAAE,CAAA;QAChB,CAAC;QACD,MAAM;YACJ,MAAM,GAAG,IAAI,EAAE,CAAA;YACf,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,QAAgB;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAA;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,yEAAyE,CAC1E,CAAA;AACL,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAMxB,CAAA;AAEH,MAAM,UAAU,gBAAgB,CAAC,SAAoB,EAAE,IAAyB;IAC9E,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAc,EAAE,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YAAE,QAAQ,EAAE,CAAA;IAC1D,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACpF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,CAAC,QAAoB;YAC5B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC9B,OAAO,GAAG,EAAE;gBACV,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACnC,CAAC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type ReorderKey = string | number;
2
+ export interface ReorderMove<K extends ReorderKey = ReorderKey> {
3
+ key: K;
4
+ beforeKey: K | null;
5
+ fromIndex: number;
6
+ toIndex: number;
7
+ }
8
+ export declare function itemKeys<T, K extends ReorderKey>(items: readonly T[], key: (item: T) => K): K[];
9
+ export declare function sameKeys<K>(a: readonly K[], b: readonly K[]): boolean;
10
+ /** toIndex is the final position, after removing the dragged item. */
11
+ export declare function moveAt<K extends ReorderKey>(keys: readonly K[], fromIndex: number, toIndex: number): ReorderMove<K> | undefined;
12
+ //# sourceMappingURL=reorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../../src/core/reorder.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AACxC,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU;IAC5D,GAAG,EAAE,CAAC,CAAA;IACN,SAAS,EAAE,CAAC,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,UAAU,EAC9C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAClB,CAAC,EAAE,CAaL;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,CAErE;AAED,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,CAAC,SAAS,UAAU,EACzC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAiB5B"}
@@ -0,0 +1,30 @@
1
+ export function itemKeys(items, key) {
2
+ const keys = items.map(key);
3
+ if (keys.some((value) => (typeof value !== 'string' && typeof value !== 'number') ||
4
+ (typeof value === 'number' && !Number.isFinite(value))))
5
+ throw new TypeError('Reorder keys must be strings or finite numbers.');
6
+ if (new Set(keys).size !== keys.length)
7
+ throw new TypeError('Reorder keys must be unique and stable across recycling.');
8
+ return keys;
9
+ }
10
+ export function sameKeys(a, b) {
11
+ return a.length === b.length && a.every((key, index) => key === b[index]);
12
+ }
13
+ /** toIndex is the final position, after removing the dragged item. */
14
+ export function moveAt(keys, fromIndex, toIndex) {
15
+ if (!Number.isInteger(fromIndex) ||
16
+ !Number.isInteger(toIndex) ||
17
+ fromIndex < 0 ||
18
+ toIndex < 0 ||
19
+ fromIndex >= keys.length ||
20
+ toIndex >= keys.length ||
21
+ fromIndex === toIndex)
22
+ return undefined;
23
+ return {
24
+ key: keys[fromIndex],
25
+ beforeKey: keys[toIndex < fromIndex ? toIndex : toIndex + 1] ?? null,
26
+ fromIndex,
27
+ toIndex,
28
+ };
29
+ }
30
+ //# sourceMappingURL=reorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder.js","sourceRoot":"","sources":["../../src/core/reorder.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,QAAQ,CACtB,KAAmB,EACnB,GAAmB;IAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,IACE,IAAI,CAAC,IAAI,CACP,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;QACxD,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACzD;QAED,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;IACxE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;QACpC,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAA;IACjF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,CAAe,EAAE,CAAe;IAC1D,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,MAAM,CACpB,IAAkB,EAClB,SAAiB,EACjB,OAAe;IAEf,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAC5B,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1B,SAAS,GAAG,CAAC;QACb,OAAO,GAAG,CAAC;QACX,SAAS,IAAI,IAAI,CAAC,MAAM;QACxB,OAAO,IAAI,IAAI,CAAC,MAAM;QACtB,SAAS,KAAK,OAAO;QAErB,OAAO,SAAS,CAAA;IAClB,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,SAAS,CAAE;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI;QACpE,SAAS;QACT,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface ScrollHeaderGeometry {
2
+ expanded: number;
3
+ minimum: number;
4
+ section: number;
5
+ range: number;
6
+ spacer: number;
7
+ rowHeight: number;
8
+ parallax: number;
9
+ divider: number;
10
+ handoff: number;
11
+ focusHandoff: number;
12
+ titleFade: readonly [number, number];
13
+ toolbarFade: readonly [number, number];
14
+ }
15
+ export declare function headerGeometry(expanded: number, minimum: number, section: number, rowHeight: number, parallax: number, divider?: number, titleFade?: readonly [number, number], toolbarFade?: readonly [number, number]): ScrollHeaderGeometry;
16
+ /** Keep collapsed rows relative to the pinned edge; keep expanded content in place. */
17
+ export declare function resizedOffset(offset: number, before: ScrollHeaderGeometry, after: ScrollHeaderGeometry): number;
18
+ export declare function restoredOffset(offset: number, before: ScrollHeaderGeometry, after: ScrollHeaderGeometry, previousIndex: number, nextIndex: number): number;
19
+ //# sourceMappingURL=scroll-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-header.d.ts","sourceRoot":"","sources":["../../src/core/scroll-header.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,SAAI,EACX,SAAS,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAY,EAC/C,WAAW,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAgB,GACpD,oBAAoB,CA4CtB;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,oBAAoB,UAQ5B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,oBAAoB,EAC3B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,UAUlB"}
@@ -0,0 +1,56 @@
1
+ export function headerGeometry(expanded, minimum, section, rowHeight, parallax, divider = 0, titleFade = [0, 0.7], toolbarFade = [0.55, 0.95]) {
2
+ if (![expanded, minimum, section, rowHeight, parallax, divider].every(Number.isFinite) ||
3
+ divider < 0 ||
4
+ minimum <= 0 ||
5
+ expanded <= minimum ||
6
+ section < 0 ||
7
+ rowHeight <= 0 ||
8
+ parallax < 0 ||
9
+ parallax > expanded - minimum)
10
+ throw new RangeError('scrollHeader needs expanded > minimum > 0, a positive rowHeight, and parallax within the collapse range.');
11
+ for (const interval of [titleFade, toolbarFade]) {
12
+ if (!Array.isArray(interval) ||
13
+ interval.length !== 2 ||
14
+ !interval.every(Number.isFinite) ||
15
+ interval[0] < 0 ||
16
+ interval[1] > 1 ||
17
+ interval[0] >= interval[1])
18
+ throw new RangeError('Fade intervals must increase within [0, 1].');
19
+ }
20
+ return {
21
+ divider,
22
+ handoff: (toolbarFade[0] + toolbarFade[1]) / 2,
23
+ // Transfer while both titles are visible; alpha zero removes a UIView
24
+ // from VoiceOver before an accessibility flag alone can preserve its focus.
25
+ focusHandoff: titleFade[1] > toolbarFade[0]
26
+ ? (toolbarFade[0] + Math.min(titleFade[1], toolbarFade[1])) / 2
27
+ : (toolbarFade[0] + toolbarFade[1]) / 2,
28
+ titleFade: [...titleFade],
29
+ toolbarFade: [...toolbarFade],
30
+ expanded,
31
+ minimum,
32
+ section,
33
+ rowHeight,
34
+ parallax,
35
+ range: expanded - minimum,
36
+ spacer: expanded + section,
37
+ };
38
+ }
39
+ /** Keep collapsed rows relative to the pinned edge; keep expanded content in place. */
40
+ export function resizedOffset(offset, before, after) {
41
+ if (offset <= 0)
42
+ return 0;
43
+ // Growing the compact title/section must not cover the previously visible row.
44
+ // Its position relative to the pinned bottom is range + row position - offset.
45
+ const delta = offset >= before.range ? after.range - before.range : after.spacer - before.spacer;
46
+ return Math.max(0, offset + delta);
47
+ }
48
+ export function restoredOffset(offset, before, after, previousIndex, nextIndex) {
49
+ if (offset <= 0)
50
+ return 0;
51
+ return Math.max(0, offset +
52
+ after.spacer -
53
+ before.spacer +
54
+ (nextIndex - previousIndex) * (after.rowHeight + after.divider));
55
+ }
56
+ //# sourceMappingURL=scroll-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-header.js","sourceRoot":"","sources":["../../src/core/scroll-header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type Animation, type PlaybackClock } from './playback.js';
2
+ export type SequencePosition = number | '<' | `${'+' | '-'}${number}`;
3
+ export interface PlayableAnimation extends Animation {
4
+ pause(): void;
5
+ play(): void;
6
+ readonly paused: boolean;
7
+ readonly duration?: number;
8
+ }
9
+ export interface TimelineAnimation extends PlayableAnimation {
10
+ readonly duration: number | undefined;
11
+ }
12
+ export interface SequenceHost {
13
+ driver: {
14
+ now(): number;
15
+ after(ms: number, callback: () => void): () => void;
16
+ clock?(duration: number): PlaybackClock;
17
+ };
18
+ slowdown: number;
19
+ active?(): boolean;
20
+ cancelled?(): boolean;
21
+ }
22
+ export interface PreparedStep {
23
+ step: () => Animation;
24
+ position: Position;
25
+ }
26
+ /** Platform adapters resolve targets/initial values; scheduling semantics live here. */
27
+ export declare function composePrepared(prepared: readonly PreparedStep[], controlled: boolean, host: SequenceHost): Animation;
28
+ export type Position = number | '<' | {
29
+ offset: number;
30
+ } | undefined;
31
+ export declare function parsePosition(at: SequencePosition | undefined): Position;
32
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/core/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,eAAe,CAAA;AAGtB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,EAAE,CAAA;AACrE,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AACD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AACD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,GAAG,IAAI,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;QACnD,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAA;KACxC,CAAA;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,IAAI,OAAO,CAAA;IAClB,SAAS,CAAC,IAAI,OAAO,CAAA;CACtB;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,SAAS,CAAA;IACrB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,UAAU,EAAE,OAAO,EACnB,IAAI,EAAE,YAAY,GACjB,SAAS,CAsTX;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAA;AACpE,wBAAgB,aAAa,CAAC,EAAE,EAAE,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAYxE"}