@rafaelaugusto/jolt 0.1.0-beta.1 → 0.1.0-beta.10

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 (302) hide show
  1. package/README.md +367 -18
  2. package/dist/animate.d.ts +19 -3
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +186 -14
  5. package/dist/animate.js.map +1 -1
  6. package/dist/color.d.ts +11 -0
  7. package/dist/color.d.ts.map +1 -0
  8. package/dist/color.js +73 -0
  9. package/dist/color.js.map +1 -0
  10. package/dist/config.d.ts +31 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +73 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/decay.d.ts +11 -0
  15. package/dist/decay.d.ts.map +1 -0
  16. package/dist/decay.js +22 -0
  17. package/dist/decay.js.map +1 -0
  18. package/dist/decoration.d.ts +18 -0
  19. package/dist/decoration.d.ts.map +1 -0
  20. package/dist/decoration.js +155 -0
  21. package/dist/decoration.js.map +1 -0
  22. package/dist/drag-input.d.ts +15 -0
  23. package/dist/drag-input.d.ts.map +1 -0
  24. package/dist/drag-input.js +66 -0
  25. package/dist/drag-input.js.map +1 -0
  26. package/dist/drag-physics.d.ts +20 -0
  27. package/dist/drag-physics.d.ts.map +1 -0
  28. package/dist/drag-physics.js +75 -0
  29. package/dist/drag-physics.js.map +1 -0
  30. package/dist/drag.d.ts +58 -0
  31. package/dist/drag.d.ts.map +1 -0
  32. package/dist/drag.js +324 -0
  33. package/dist/drag.js.map +1 -0
  34. package/dist/driver/android-color.d.ts +20 -0
  35. package/dist/driver/android-color.d.ts.map +1 -0
  36. package/dist/driver/android-color.js +136 -0
  37. package/dist/driver/android-color.js.map +1 -0
  38. package/dist/driver/android-decoration.d.ts +22 -0
  39. package/dist/driver/android-decoration.d.ts.map +1 -0
  40. package/dist/driver/android-decoration.js +139 -0
  41. package/dist/driver/android-decoration.js.map +1 -0
  42. package/dist/driver/android-playback.d.ts +13 -0
  43. package/dist/driver/android-playback.d.ts.map +1 -0
  44. package/dist/driver/android-playback.js +141 -0
  45. package/dist/driver/android-playback.js.map +1 -0
  46. package/dist/driver/android.d.ts +1 -1
  47. package/dist/driver/android.d.ts.map +1 -1
  48. package/dist/driver/android.js +165 -13
  49. package/dist/driver/android.js.map +1 -1
  50. package/dist/driver/index.d.ts +25 -2
  51. package/dist/driver/index.d.ts.map +1 -1
  52. package/dist/driver/index.js.map +1 -1
  53. package/dist/driver/ios-color.d.ts +16 -0
  54. package/dist/driver/ios-color.d.ts.map +1 -0
  55. package/dist/driver/ios-color.js +392 -0
  56. package/dist/driver/ios-color.js.map +1 -0
  57. package/dist/driver/ios-decoration.d.ts +17 -0
  58. package/dist/driver/ios-decoration.d.ts.map +1 -0
  59. package/dist/driver/ios-decoration.js +271 -0
  60. package/dist/driver/ios-decoration.js.map +1 -0
  61. package/dist/driver/ios-layout.d.ts +9 -0
  62. package/dist/driver/ios-layout.d.ts.map +1 -0
  63. package/dist/driver/ios-layout.js +52 -0
  64. package/dist/driver/ios-layout.js.map +1 -0
  65. package/dist/driver/ios-playback.d.ts +10 -0
  66. package/dist/driver/ios-playback.d.ts.map +1 -0
  67. package/dist/driver/ios-playback.js +47 -0
  68. package/dist/driver/ios-playback.js.map +1 -0
  69. package/dist/driver/ios-shadow.d.ts +6 -0
  70. package/dist/driver/ios-shadow.d.ts.map +1 -0
  71. package/dist/driver/ios-shadow.js +52 -0
  72. package/dist/driver/ios-shadow.js.map +1 -0
  73. package/dist/driver/ios.d.ts.map +1 -1
  74. package/dist/driver/ios.js +163 -28
  75. package/dist/driver/ios.js.map +1 -1
  76. package/dist/engine.d.ts +75 -5
  77. package/dist/engine.d.ts.map +1 -1
  78. package/dist/engine.js +293 -23
  79. package/dist/engine.js.map +1 -1
  80. package/dist/haptics.d.ts +21 -0
  81. package/dist/haptics.d.ts.map +1 -0
  82. package/dist/haptics.js +120 -0
  83. package/dist/haptics.js.map +1 -0
  84. package/dist/image-effect-native.d.ts +26 -0
  85. package/dist/image-effect-native.d.ts.map +1 -0
  86. package/dist/image-effect-native.js +73 -0
  87. package/dist/image-effect-native.js.map +1 -0
  88. package/dist/image-effect.d.ts +50 -0
  89. package/dist/image-effect.d.ts.map +1 -0
  90. package/dist/image-effect.js +290 -0
  91. package/dist/image-effect.js.map +1 -0
  92. package/dist/image-owner.d.ts +3 -0
  93. package/dist/image-owner.d.ts.map +1 -0
  94. package/dist/image-owner.js +11 -0
  95. package/dist/image-owner.js.map +1 -0
  96. package/dist/index.d.ts +43 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +20 -1
  99. package/dist/index.js.map +1 -1
  100. package/dist/interaction-surface.d.ts +12 -0
  101. package/dist/interaction-surface.d.ts.map +1 -0
  102. package/dist/interaction-surface.js +36 -0
  103. package/dist/interaction-surface.js.map +1 -0
  104. package/dist/items.d.ts +20 -0
  105. package/dist/items.d.ts.map +1 -0
  106. package/dist/items.js +109 -0
  107. package/dist/items.js.map +1 -0
  108. package/dist/keyboard.d.ts +41 -0
  109. package/dist/keyboard.d.ts.map +1 -0
  110. package/dist/keyboard.js +256 -0
  111. package/dist/keyboard.js.map +1 -0
  112. package/dist/label.d.ts +7 -0
  113. package/dist/label.d.ts.map +1 -0
  114. package/dist/label.js +60 -0
  115. package/dist/label.js.map +1 -0
  116. package/dist/layout.d.ts +13 -0
  117. package/dist/layout.d.ts.map +1 -0
  118. package/dist/layout.js +348 -0
  119. package/dist/layout.js.map +1 -0
  120. package/dist/liquid-grid.d.ts +3 -0
  121. package/dist/liquid-grid.d.ts.map +1 -0
  122. package/dist/liquid-grid.js +24 -0
  123. package/dist/liquid-grid.js.map +1 -0
  124. package/dist/liquid.d.ts +18 -0
  125. package/dist/liquid.d.ts.map +1 -0
  126. package/dist/liquid.js +234 -0
  127. package/dist/liquid.js.map +1 -0
  128. package/dist/loader.d.ts +19 -0
  129. package/dist/loader.d.ts.map +1 -0
  130. package/dist/loader.js +173 -0
  131. package/dist/loader.js.map +1 -0
  132. package/dist/motion-scope.d.ts +39 -0
  133. package/dist/motion-scope.d.ts.map +1 -0
  134. package/dist/motion-scope.js +238 -0
  135. package/dist/motion-scope.js.map +1 -0
  136. package/dist/motion-states.d.ts +36 -0
  137. package/dist/motion-states.d.ts.map +1 -0
  138. package/dist/motion-states.js +165 -0
  139. package/dist/motion-states.js.map +1 -0
  140. package/dist/particles.d.ts +39 -0
  141. package/dist/particles.d.ts.map +1 -0
  142. package/dist/particles.js +265 -0
  143. package/dist/particles.js.map +1 -0
  144. package/dist/path.d.ts +12 -0
  145. package/dist/path.d.ts.map +1 -0
  146. package/dist/path.js +90 -0
  147. package/dist/path.js.map +1 -0
  148. package/dist/playback-group.d.ts +6 -0
  149. package/dist/playback-group.d.ts.map +1 -0
  150. package/dist/playback-group.js +141 -0
  151. package/dist/playback-group.js.map +1 -0
  152. package/dist/playback.d.ts +25 -0
  153. package/dist/playback.d.ts.map +1 -0
  154. package/dist/playback.js +35 -0
  155. package/dist/playback.js.map +1 -0
  156. package/dist/press.d.ts.map +1 -1
  157. package/dist/press.js +23 -7
  158. package/dist/press.js.map +1 -1
  159. package/dist/properties.d.ts +6 -3
  160. package/dist/properties.d.ts.map +1 -1
  161. package/dist/properties.js +26 -2
  162. package/dist/properties.js.map +1 -1
  163. package/dist/reveal.d.ts +25 -0
  164. package/dist/reveal.d.ts.map +1 -0
  165. package/dist/reveal.js +294 -0
  166. package/dist/reveal.js.map +1 -0
  167. package/dist/roll-diff.d.ts +22 -0
  168. package/dist/roll-diff.d.ts.map +1 -0
  169. package/dist/roll-diff.js +36 -0
  170. package/dist/roll-diff.js.map +1 -0
  171. package/dist/roll.d.ts +29 -0
  172. package/dist/roll.d.ts.map +1 -0
  173. package/dist/roll.js +442 -0
  174. package/dist/roll.js.map +1 -0
  175. package/dist/scroll-linked.d.ts +10 -0
  176. package/dist/scroll-linked.d.ts.map +1 -0
  177. package/dist/scroll-linked.js +58 -0
  178. package/dist/scroll-linked.js.map +1 -0
  179. package/dist/sequence.d.ts +10 -5
  180. package/dist/sequence.d.ts.map +1 -1
  181. package/dist/sequence.js +208 -14
  182. package/dist/sequence.js.map +1 -1
  183. package/dist/shimmer.d.ts +12 -0
  184. package/dist/shimmer.d.ts.map +1 -0
  185. package/dist/shimmer.js +161 -0
  186. package/dist/shimmer.js.map +1 -0
  187. package/dist/svg-path.d.ts +14 -0
  188. package/dist/svg-path.d.ts.map +1 -0
  189. package/dist/svg-path.js +281 -0
  190. package/dist/svg-path.js.map +1 -0
  191. package/dist/symbol-effect.d.ts +23 -0
  192. package/dist/symbol-effect.d.ts.map +1 -0
  193. package/dist/symbol-effect.js +187 -0
  194. package/dist/symbol-effect.js.map +1 -0
  195. package/dist/text-layout.d.ts +30 -0
  196. package/dist/text-layout.d.ts.map +1 -0
  197. package/dist/text-layout.js +185 -0
  198. package/dist/text-layout.js.map +1 -0
  199. package/dist/text.d.ts +17 -0
  200. package/dist/text.d.ts.map +1 -0
  201. package/dist/text.js +263 -0
  202. package/dist/text.js.map +1 -0
  203. package/dist/track.d.ts +3 -1
  204. package/dist/track.d.ts.map +1 -1
  205. package/dist/track.js +266 -13
  206. package/dist/track.js.map +1 -1
  207. package/dist/transition.d.ts +17 -1
  208. package/dist/transition.d.ts.map +1 -1
  209. package/dist/transition.js +41 -6
  210. package/dist/transition.js.map +1 -1
  211. package/dist/types.d.ts +48 -1
  212. package/dist/types.d.ts.map +1 -1
  213. package/dist/vue/index.d.ts +95 -0
  214. package/dist/vue/index.d.ts.map +1 -0
  215. package/dist/vue/index.js +163 -0
  216. package/dist/vue/index.js.map +1 -0
  217. package/dist/zoom-native.d.ts +30 -0
  218. package/dist/zoom-native.d.ts.map +1 -0
  219. package/dist/zoom-native.js +56 -0
  220. package/dist/zoom-native.js.map +1 -0
  221. package/dist/zoomable.d.ts +48 -0
  222. package/dist/zoomable.d.ts.map +1 -0
  223. package/dist/zoomable.js +249 -0
  224. package/dist/zoomable.js.map +1 -0
  225. package/package.json +29 -5
  226. package/platforms/android/include.gradle +7 -0
  227. package/platforms/android/java/org/rafaelaugusto/jolt/ColorTarget.java +102 -0
  228. package/platforms/android/java/org/rafaelaugusto/jolt/DecorationTarget.java +154 -0
  229. package/platforms/android/java/org/rafaelaugusto/jolt/ImageEffect.java +288 -0
  230. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFollower.java +91 -0
  231. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  232. package/platforms/android/java/org/rafaelaugusto/jolt/NumberRoll.java +190 -0
  233. package/platforms/android/java/org/rafaelaugusto/jolt/PhotoZoom.java +250 -0
  234. package/platforms/android/java/org/rafaelaugusto/jolt/TextReveal.java +180 -0
  235. package/platforms/android/proguard-rules.pro +19 -0
  236. package/platforms/ios/build.xcconfig +1 -0
  237. package/platforms/ios/src/JoltImageEffect.h +25 -0
  238. package/platforms/ios/src/JoltImageEffect.mm +242 -0
  239. package/platforms/ios/src/JoltInteractiveAnimation.h +18 -0
  240. package/platforms/ios/src/JoltInteractiveAnimation.m +123 -0
  241. package/platforms/ios/src/JoltPhotoZoom.h +23 -0
  242. package/platforms/ios/src/JoltPhotoZoom.m +229 -0
  243. package/platforms/ios/src/module.modulemap +6 -0
  244. package/src/android-plugin.d.ts +155 -0
  245. package/src/animate.ts +249 -36
  246. package/src/color.ts +101 -0
  247. package/src/config.ts +84 -0
  248. package/src/decay.ts +45 -0
  249. package/src/decoration.ts +180 -0
  250. package/src/drag-input.ts +74 -0
  251. package/src/drag-physics.ts +110 -0
  252. package/src/drag.ts +395 -0
  253. package/src/driver/android-color.ts +170 -0
  254. package/src/driver/android-decoration.ts +182 -0
  255. package/src/driver/android-playback.ts +157 -0
  256. package/src/driver/android.ts +208 -20
  257. package/src/driver/index.ts +37 -2
  258. package/src/driver/ios-color.ts +441 -0
  259. package/src/driver/ios-decoration.ts +332 -0
  260. package/src/driver/ios-layout.ts +63 -0
  261. package/src/driver/ios-playback.ts +51 -0
  262. package/src/driver/ios-shadow.ts +50 -0
  263. package/src/driver/ios.ts +193 -33
  264. package/src/engine.ts +321 -27
  265. package/src/haptics.ts +148 -0
  266. package/src/image-effect-native.ts +129 -0
  267. package/src/image-effect.ts +336 -0
  268. package/src/image-owner.ts +12 -0
  269. package/src/index.ts +59 -2
  270. package/src/interaction-surface.ts +41 -0
  271. package/src/ios-plugin.d.ts +81 -0
  272. package/src/items.ts +140 -0
  273. package/src/keyboard.ts +291 -0
  274. package/src/label.ts +76 -0
  275. package/src/layout.ts +408 -0
  276. package/src/liquid-grid.ts +28 -0
  277. package/src/liquid.ts +287 -0
  278. package/src/loader.ts +202 -0
  279. package/src/motion-scope.ts +279 -0
  280. package/src/motion-states.ts +215 -0
  281. package/src/particles.ts +323 -0
  282. package/src/path.ts +124 -0
  283. package/src/playback-group.ts +143 -0
  284. package/src/playback.ts +62 -0
  285. package/src/press.ts +26 -10
  286. package/src/properties.ts +32 -6
  287. package/src/reveal.ts +374 -0
  288. package/src/roll-diff.ts +57 -0
  289. package/src/roll.ts +515 -0
  290. package/src/scroll-linked.ts +73 -0
  291. package/src/sequence.ts +204 -14
  292. package/src/shimmer.ts +180 -0
  293. package/src/svg-path.ts +355 -0
  294. package/src/symbol-effect.ts +226 -0
  295. package/src/text-layout.ts +228 -0
  296. package/src/text.ts +279 -0
  297. package/src/track.ts +347 -12
  298. package/src/transition.ts +63 -6
  299. package/src/types.ts +49 -1
  300. package/src/vue/index.ts +231 -0
  301. package/src/zoom-native.ts +124 -0
  302. package/src/zoomable.ts +330 -0
@@ -0,0 +1,165 @@
1
+ import { prepareAnimation, toView } from './animate.js';
2
+ import { isColorProperty } from './color.js';
3
+ import { isProperty } from './properties.js';
4
+ /** Coordinated named targets. Omitted properties freeze when leaving their previous state. */
5
+ export function motionStates(targets, definitions, options = {}) {
6
+ const views = new Map(Object.entries(targets).map(([name, target]) => [name, toView(target)]));
7
+ if (new Set(views.values()).size !== views.size)
8
+ throw new TypeError('Motion state targets must refer to distinct views.');
9
+ const states = new Map();
10
+ const defaults = normalize(options.transition);
11
+ for (const [name, state] of Object.entries(definitions)) {
12
+ if (!state || typeof state !== 'object' || Array.isArray(state))
13
+ throw new TypeError(`Invalid motion state "${name}".`);
14
+ const rows = [];
15
+ for (const [target, values] of Object.entries(state)) {
16
+ const view = views.get(target);
17
+ if (!view)
18
+ throw new TypeError(`Unknown motion target "${target}".`);
19
+ if (!values || typeof values !== 'object' || Array.isArray(values))
20
+ throw new TypeError(`Invalid motion values for "${target}".`);
21
+ const frames = {};
22
+ for (const [property, value] of Object.entries(values)) {
23
+ if (value === undefined)
24
+ continue;
25
+ if (property !== 'scale' && !isProperty(property))
26
+ throw new TypeError(`Invalid motion state property "${property}".`);
27
+ if (!isColorProperty(property) &&
28
+ (typeof value !== 'number' || !Number.isFinite(value)))
29
+ throw new TypeError(`Motion state "${property}" requires a finite endpoint.`);
30
+ if (Array.isArray(value) || value === null)
31
+ throw new TypeError(`Motion state "${property}" requires a single endpoint.`);
32
+ Object.assign(frames, { [property]: value });
33
+ }
34
+ // Validate every definition up front without claiming any native property.
35
+ prepareAnimation(view, frames, defaults);
36
+ rows.push([view, frames]);
37
+ }
38
+ states.set(name, rows);
39
+ }
40
+ let current;
41
+ let settled;
42
+ let disposed = false;
43
+ let paused = false;
44
+ let active;
45
+ const controller = {
46
+ get current() {
47
+ return current;
48
+ },
49
+ get settled() {
50
+ return settled;
51
+ },
52
+ get disposed() {
53
+ return disposed;
54
+ },
55
+ get paused() {
56
+ return paused;
57
+ },
58
+ to(name, transition) {
59
+ if (disposed)
60
+ throw new Error('Motion states controller is disposed.');
61
+ const rows = states.get(name);
62
+ if (!rows)
63
+ throw new TypeError(`Unknown motion state "${name}".`);
64
+ const timing = transition === undefined ? defaults : normalize(transition);
65
+ const prepared = rows.map(([view, frames]) => prepareAnimation(view, frames, timing));
66
+ const previous = active;
67
+ const children = [];
68
+ // Start replacements first: the engine transfers visible position AND velocity.
69
+ try {
70
+ for (const start of prepared) {
71
+ const child = start();
72
+ children.push(child);
73
+ if (paused)
74
+ child.pause();
75
+ }
76
+ }
77
+ catch (error) {
78
+ children.forEach((child) => child.stop());
79
+ previous?.handle.stop();
80
+ active = undefined;
81
+ throw error;
82
+ }
83
+ let cancelled = false;
84
+ const finished = Promise.all(children.map((child) => child.finished)).then((results) => {
85
+ const completed = !cancelled && !disposed && active?.handle === handle && results.every(Boolean);
86
+ if (active?.handle === handle) {
87
+ active = undefined;
88
+ if (completed)
89
+ settled = name;
90
+ }
91
+ return completed;
92
+ });
93
+ const handle = {
94
+ finished,
95
+ stop() {
96
+ cancelled = true;
97
+ children.forEach((child) => child.stop());
98
+ },
99
+ then: (resolve, reject) => finished.then(resolve, reject),
100
+ };
101
+ active = { handle, children };
102
+ current = name;
103
+ // Also cancels old, omitted properties, without touching the new owners.
104
+ previous?.handle.stop();
105
+ return handle;
106
+ },
107
+ pause() {
108
+ if (disposed || paused)
109
+ return;
110
+ paused = true;
111
+ active?.children.forEach((child) => child.pause());
112
+ },
113
+ play() {
114
+ if (disposed || !paused)
115
+ return;
116
+ paused = false;
117
+ active?.children.forEach((child) => child.play());
118
+ },
119
+ stop() {
120
+ active?.handle.stop();
121
+ active = undefined;
122
+ },
123
+ dispose() {
124
+ if (disposed)
125
+ return;
126
+ disposed = true;
127
+ controller.stop();
128
+ },
129
+ };
130
+ return options.scope ? options.scope.add(controller) : controller;
131
+ }
132
+ function normalize(transition) {
133
+ if (transition === undefined)
134
+ return 'snappy';
135
+ if (typeof transition === 'string') {
136
+ if (!['smooth', 'snappy', 'bouncy'].includes(transition))
137
+ throw new TypeError('Unknown state spring.');
138
+ return transition;
139
+ }
140
+ if (!transition || typeof transition !== 'object')
141
+ throw new TypeError('Invalid state transition.');
142
+ const allowed = new Set([
143
+ 'type',
144
+ 'delay',
145
+ 'duration',
146
+ 'ease',
147
+ 'times',
148
+ 'stiffness',
149
+ 'damping',
150
+ 'mass',
151
+ 'bounce',
152
+ 'velocity',
153
+ ]);
154
+ for (const key of Object.keys(transition))
155
+ if (!allowed.has(key))
156
+ throw new TypeError(`State transitions do not support "${key}".`);
157
+ if (transition.duration !== undefined &&
158
+ (!Number.isFinite(transition.duration) || transition.duration < 0))
159
+ throw new RangeError('State transition duration must be finite and nonnegative.');
160
+ if (transition.delay !== undefined &&
161
+ (!Number.isFinite(transition.delay) || transition.delay < 0))
162
+ throw new RangeError('State transition delay must be finite and nonnegative.');
163
+ return { ...transition };
164
+ }
165
+ //# sourceMappingURL=motion-states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-states.js","sourceRoot":"","sources":["../src/motion-states.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Target } from './types.js';
2
+ export interface ConfettiOptions {
3
+ /** Approximate number of particles in the burst. Defaults to 80. */
4
+ count?: number;
5
+ colors?: readonly string[];
6
+ }
7
+ export interface ParticleOptions {
8
+ colors?: readonly string[];
9
+ shape?: 'circle' | 'rectangle' | 'ring';
10
+ /** Center point, or a line across the top/bottom of the target. */
11
+ source?: 'center' | 'top' | 'bottom';
12
+ /** Total particles per second, shared across all colors. Defaults to 20. */
13
+ rate?: number;
14
+ /** Particle lifetime in milliseconds. Defaults to 3000. */
15
+ lifetime?: number;
16
+ /** Longest side in DIPs. Defaults to 6. */
17
+ size?: number;
18
+ /** DIPs per second. Defaults to 60. */
19
+ velocity?: number;
20
+ velocityRange?: number;
21
+ /** Degrees clockwise from right: -90 is up, 90 is down. Defaults to -90. */
22
+ angle?: number;
23
+ /** Emission cone in degrees, from 0 to 360. Defaults to 30. */
24
+ spread?: number;
25
+ /** Downward acceleration in DIPs per second squared. Defaults to 0. */
26
+ gravity?: number;
27
+ /** Degrees per second. Defaults to 0. */
28
+ spin?: number;
29
+ spinRange?: number;
30
+ /** Fade each particle over its lifetime. Defaults to true. */
31
+ fadeOut?: boolean;
32
+ /** Emit for this many milliseconds, then let particles expire. Omit to keep emitting. */
33
+ duration?: number;
34
+ }
35
+ /** Bursts from the target's center into its window. iOS only; returns immediate cleanup. */
36
+ export declare function confetti(target: Target, options?: ConfettiOptions): () => void;
37
+ /** Adds a native particle emitter to the target. iOS only; returns immediate cleanup. */
38
+ export declare function particles(target: Target, options?: ParticleOptions): () => void;
39
+ //# sourceMappingURL=particles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles.d.ts","sourceRoot":"","sources":["../src/particles.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAA;IACvC,mEAAmE;IACnE,MAAM,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAA;IACpC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAUD,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,IAAI,CAqBlF;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,IAAI,CAEnF"}
@@ -0,0 +1,265 @@
1
+ import { Application, Color, isIOS } from '@nativescript/core';
2
+ import { toView } from './animate.js';
3
+ import { reducedMotion } from './config.js';
4
+ const bursts = new WeakMap();
5
+ const emitters = new WeakMap();
6
+ const palette = ['#facc15', '#ef4444', '#3b82f6', '#22c55e', '#a855f7'];
7
+ const textures = new Map();
8
+ const radians = (degrees) => (degrees * Math.PI) / 180;
9
+ const BURST_DURATION = 200;
10
+ /** Bursts from the target's center into its window. iOS only; returns immediate cleanup. */
11
+ export function confetti(target, options = {}) {
12
+ const count = number('count', options.count ?? 80, 0, 10000);
13
+ if (!Number.isInteger(count))
14
+ throw new RangeError('Particle count must be an integer.');
15
+ const settings = resolve({
16
+ colors: options.colors ?? palette,
17
+ shape: 'rectangle',
18
+ rate: count / (BURST_DURATION / 1000),
19
+ duration: BURST_DURATION,
20
+ lifetime: 2200,
21
+ size: 8,
22
+ velocity: 260,
23
+ velocityRange: 100,
24
+ angle: -90,
25
+ spread: 100,
26
+ gravity: 420,
27
+ spinRange: 360,
28
+ }, true);
29
+ return start(target, settings, true);
30
+ }
31
+ /** Adds a native particle emitter to the target. iOS only; returns immediate cleanup. */
32
+ export function particles(target, options = {}) {
33
+ return start(target, resolve(options), false);
34
+ }
35
+ function start(target, settings, overlay) {
36
+ const view = toView(target);
37
+ const running = overlay ? bursts : emitters;
38
+ running.get(view)?.();
39
+ if (!isIOS || settings.rate === 0 || reducedMotion())
40
+ return () => { };
41
+ return new Emitter(view, settings, overlay, running).stop;
42
+ }
43
+ function resolve(options, burst = false) {
44
+ const colors = options.colors ?? ['#ffffff'];
45
+ if (!Array.isArray(colors) ||
46
+ colors.length === 0 ||
47
+ colors.length > 32 ||
48
+ Array.from(colors).some((color) => typeof color !== 'string' || !Color.isValid(color)))
49
+ throw new TypeError('Particles need 1 to 32 valid color strings.');
50
+ const shape = options.shape ?? 'circle';
51
+ const source = options.source ?? 'center';
52
+ if (!['circle', 'rectangle', 'ring'].includes(shape))
53
+ throw new TypeError('Unknown particle shape.');
54
+ if (!['center', 'top', 'bottom'].includes(source))
55
+ throw new TypeError('Unknown particle source.');
56
+ const lifetime = number('lifetime', options.lifetime ?? 3000, 1, 60000);
57
+ const rate = number('rate', options.rate ?? 20, 0, burst ? 50000 : 10000);
58
+ if (!burst && (rate * lifetime) / 1000 > 10000)
59
+ throw new RangeError('Particle rate × lifetime must not exceed 10000 live particles.');
60
+ const duration = options.duration === undefined
61
+ ? undefined
62
+ : number('duration', options.duration, 1, 2147483647 - lifetime - 50);
63
+ const fadeOut = options.fadeOut ?? true;
64
+ if (typeof fadeOut !== 'boolean')
65
+ throw new TypeError('Particle fadeOut must be a boolean.');
66
+ return {
67
+ colors: [...colors],
68
+ shape,
69
+ source,
70
+ lifetime,
71
+ rate,
72
+ duration,
73
+ fadeOut,
74
+ size: number('size', options.size ?? 6, 1, 128),
75
+ velocity: number('velocity', options.velocity ?? 60, 0, 10000),
76
+ velocityRange: number('velocityRange', options.velocityRange ?? 0, 0, 10000),
77
+ angle: number('angle', options.angle ?? -90, -360, 360),
78
+ spread: number('spread', options.spread ?? 30, 0, 360),
79
+ gravity: number('gravity', options.gravity ?? 0, -10000, 10000),
80
+ spin: number('spin', options.spin ?? 0, -3600, 3600),
81
+ spinRange: number('spinRange', options.spinRange ?? 0, 0, 3600),
82
+ };
83
+ }
84
+ function number(name, value, min, max) {
85
+ if (!Number.isFinite(value) || value < min || value > max)
86
+ throw new RangeError(`Particle ${name} must be between ${min} and ${max}.`);
87
+ return value;
88
+ }
89
+ class Emitter {
90
+ view;
91
+ settings;
92
+ overlay;
93
+ running;
94
+ stopped = false;
95
+ queued = false;
96
+ layer;
97
+ native;
98
+ window;
99
+ timer;
100
+ observer;
101
+ constructor(view, settings, overlay, running) {
102
+ this.view = view;
103
+ this.settings = settings;
104
+ this.overlay = overlay;
105
+ this.running = running;
106
+ running.set(view, this.stop);
107
+ view.on('loaded', this.schedule);
108
+ view.on('layoutChanged', this.schedule);
109
+ view.on('unloaded', this.stop);
110
+ this.schedule();
111
+ }
112
+ stop = () => {
113
+ if (this.stopped)
114
+ return;
115
+ this.stopped = true;
116
+ this.view.off('loaded', this.schedule);
117
+ this.view.off('layoutChanged', this.schedule);
118
+ this.view.off('unloaded', this.stop);
119
+ if (this.running.get(this.view) === this.stop)
120
+ this.running.delete(this.view);
121
+ if (this.timer !== undefined)
122
+ clearTimeout(this.timer);
123
+ if (this.observer)
124
+ Application.ios.removeNotificationObserver(this.observer, UIAccessibilityReduceMotionStatusDidChangeNotification);
125
+ this.layer?.removeAllAnimations();
126
+ this.layer?.removeFromSuperlayer();
127
+ this.layer = this.native = this.window = undefined;
128
+ this.timer = this.observer = undefined;
129
+ };
130
+ schedule = () => {
131
+ if (this.stopped || this.queued)
132
+ return;
133
+ this.queued = true;
134
+ void Promise.resolve().then(() => {
135
+ this.queued = false;
136
+ if (this.stopped)
137
+ return;
138
+ try {
139
+ this.update();
140
+ }
141
+ catch (error) {
142
+ this.stop();
143
+ throw error;
144
+ }
145
+ });
146
+ };
147
+ motionChanged = () => {
148
+ if (reducedMotion())
149
+ this.stop();
150
+ };
151
+ update() {
152
+ if (!this.view.isLoaded)
153
+ return;
154
+ if (reducedMotion())
155
+ return this.stop();
156
+ const native = this.view.nativeViewProtected;
157
+ const window = native?.window;
158
+ if (this.layer && (!native || !window))
159
+ return this.stop();
160
+ if (!native || !window)
161
+ return;
162
+ if (this.native && (this.native !== native || this.window !== window))
163
+ return this.stop();
164
+ const bounds = native.layer.bounds;
165
+ if (bounds.size.width <= 0 || bounds.size.height <= 0) {
166
+ if (this.layer)
167
+ this.stop();
168
+ return;
169
+ }
170
+ CATransaction.begin();
171
+ CATransaction.setDisableActions(true);
172
+ try {
173
+ if (!this.layer) {
174
+ this.native = native;
175
+ this.window = window;
176
+ const host = this.overlay ? window.layer : native.layer;
177
+ const layer = (this.layer = CAEmitterLayer.new());
178
+ layer.name = this.overlay ? 'jolt:confetti' : 'jolt:particles';
179
+ layer.frame = host.bounds;
180
+ layer.emitterShape =
181
+ this.settings.source === 'center' ? kCAEmitterLayerPoint : kCAEmitterLayerLine;
182
+ layer.emitterCells = NSArray.arrayWithArray(this.cells());
183
+ host.addSublayer(layer);
184
+ // Start from an empty emitter, even if its parent has been alive for hours.
185
+ layer.beginTime = host.convertTimeFromLayer(CACurrentMediaTime(), null);
186
+ if (this.overlay)
187
+ layer.emitterPosition = native.convertPointToView(CGPointMake(bounds.origin.x + bounds.size.width / 2, bounds.origin.y + bounds.size.height / 2), window);
188
+ this.observer = Application.ios.addNotificationObserver(UIAccessibilityReduceMotionStatusDidChangeNotification, this.motionChanged);
189
+ if (this.settings.duration !== undefined) {
190
+ // The render server stops emission even if JS is blocked. The timer
191
+ // only removes the empty layer after the last particles have expired.
192
+ layer.birthRate = 0;
193
+ const emission = CABasicAnimation.animationWithKeyPath('birthRate');
194
+ emission.fromValue = 1;
195
+ emission.toValue = 1;
196
+ emission.duration = this.settings.duration / 1000;
197
+ layer.addAnimationForKey(emission, 'jolt:emission');
198
+ this.timer = setTimeout(this.stop, this.settings.duration + this.settings.lifetime + 50);
199
+ }
200
+ }
201
+ if (!this.overlay) {
202
+ const layer = this.layer;
203
+ layer.frame = bounds;
204
+ layer.emitterSize = CGSizeMake(bounds.size.width, 0);
205
+ layer.emitterPosition = CGPointMake(bounds.size.width / 2, this.settings.source === 'top'
206
+ ? 0
207
+ : this.settings.source === 'bottom'
208
+ ? bounds.size.height
209
+ : bounds.size.height / 2);
210
+ }
211
+ }
212
+ finally {
213
+ CATransaction.commit();
214
+ }
215
+ }
216
+ cells() {
217
+ const options = this.settings;
218
+ const image = texture(options.shape);
219
+ return options.colors.map((color) => {
220
+ const cell = CAEmitterCell.emitterCell();
221
+ cell.contents = image.CGImage;
222
+ cell.color = new Color(color).ios.CGColor;
223
+ cell.birthRate = options.rate / options.colors.length;
224
+ cell.lifetime = options.lifetime / 1000;
225
+ cell.scale = options.size / 32;
226
+ cell.velocity = options.velocity;
227
+ cell.velocityRange = options.velocityRange;
228
+ // Horizontal line emitters point upward at longitude zero; point
229
+ // emitters point right. Keep the public angle in view coordinates.
230
+ cell.emissionLongitude = radians(options.angle + (options.source === 'center' ? 0 : 90));
231
+ cell.emissionRange = radians(options.spread);
232
+ cell.yAcceleration = options.gravity;
233
+ cell.spin = radians(options.spin);
234
+ cell.spinRange = radians(options.spinRange);
235
+ cell.alphaSpeed = options.fadeOut ? -1 / cell.lifetime : 0;
236
+ return cell;
237
+ });
238
+ }
239
+ }
240
+ function texture(shape) {
241
+ const cached = textures.get(shape);
242
+ if (cached)
243
+ return cached;
244
+ const format = UIGraphicsImageRendererFormat.defaultFormat();
245
+ format.scale = 1;
246
+ format.opaque = false;
247
+ const height = shape === 'rectangle' ? 18 : 32;
248
+ const renderer = UIGraphicsImageRenderer.alloc().initWithSizeFormat(CGSizeMake(32, height), format);
249
+ const image = renderer.imageWithActions((context) => {
250
+ const cg = context.CGContext;
251
+ CGContextSetFillColorWithColor(cg, UIColor.whiteColor.CGColor);
252
+ if (shape === 'rectangle')
253
+ CGContextFillRect(cg, CGRectMake(0, 0, 32, height));
254
+ else if (shape === 'circle')
255
+ CGContextFillEllipseInRect(cg, CGRectMake(0, 0, 32, 32));
256
+ else {
257
+ CGContextSetStrokeColorWithColor(cg, UIColor.whiteColor.CGColor);
258
+ CGContextSetLineWidth(cg, 3);
259
+ CGContextStrokeEllipseInRect(cg, CGRectMake(2, 2, 28, 28));
260
+ }
261
+ });
262
+ textures.set(shape, image);
263
+ return image;
264
+ }
265
+ //# sourceMappingURL=particles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles.js","sourceRoot":"","sources":["../src/particles.ts"],"names":[],"mappings":"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"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { type Track } from './track.js';
2
+ import { type Transition, type ResolvedTransition } from './transition.js';
3
+ import type { Keyframes, KeyframeProperty } from './types.js';
4
+ export type PathProperty = 'x' | 'y' | 'rotate';
5
+ export interface PreparedPath {
6
+ readonly properties: readonly PathProperty[];
7
+ readonly starts: ReadonlyMap<PathProperty, number>;
8
+ readonly transition: ResolvedTransition;
9
+ track(property: PathProperty, offset: number, delay: number): Track;
10
+ }
11
+ export declare function preparePath(keyframes: Keyframes, base: Transition, overrides: Partial<Record<KeyframeProperty | 'path', Transition>>): PreparedPath | undefined;
12
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,KAAK,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7D,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAA;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IAClD,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAA;IACvC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAA;CACpE;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,GAChE,YAAY,GAAG,SAAS,CAoE1B"}
package/dist/path.js ADDED
@@ -0,0 +1,90 @@
1
+ import { parsePath } from './svg-path.js';
2
+ import { reducedMotion, timeScale } from './config.js';
3
+ import { createTrack, instantTrack } from './track.js';
4
+ import { mergeTransitions, resolveTransition, } from './transition.js';
5
+ export function preparePath(keyframes, base, overrides) {
6
+ if (keyframes.orient !== undefined && typeof keyframes.orient !== 'boolean')
7
+ throw new TypeError('Path orient must be a boolean.');
8
+ if (keyframes.path === undefined) {
9
+ if (keyframes.orient !== undefined)
10
+ throw new TypeError('orient requires a path.');
11
+ return undefined;
12
+ }
13
+ if (keyframes.x !== undefined || keyframes.y !== undefined)
14
+ throw new TypeError('A path owns x and y; omit explicit x/y keyframes.');
15
+ if (keyframes.orient && keyframes.rotate !== undefined)
16
+ throw new TypeError('An oriented path owns rotate; omit explicit rotate keyframes.');
17
+ if (overrides.x || overrides.y || (keyframes.orient && overrides.rotate))
18
+ throw new TypeError('Use the path transition to time its coordinates together.');
19
+ const geometry = parsePath(keyframes.path);
20
+ const orient = keyframes.orient === true;
21
+ const transition = resolveTransition(overrides.path ? mergeTransitions(base, overrides.path) : base, 'opacity', 2);
22
+ if (!Number.isFinite(transition.curve.type === 'tween' ? transition.curve.duration : 0) ||
23
+ !Number.isFinite(transition.delay))
24
+ throw new RangeError('Path duration and delay must be finite.');
25
+ const properties = orient ? ['x', 'y', 'rotate'] : ['x', 'y'];
26
+ const first = geometry.at(0);
27
+ let motion;
28
+ return {
29
+ properties,
30
+ starts: new Map(properties.map((property) => [property, first[property]])),
31
+ transition,
32
+ track(property, offset, requested) {
33
+ motion ??= sample(geometry, transition, orient);
34
+ const { progress, times, frames } = motion;
35
+ const to = geometry.at(progress.to)[property] + offset;
36
+ if (reducedMotion())
37
+ return instantTrack(property, to);
38
+ const delay = requested / timeScale();
39
+ const shift = delay - progress.delay;
40
+ const pose = (time) => geometry.at(progress.valueAt(time - shift))[property] + offset;
41
+ return {
42
+ ...progress,
43
+ property,
44
+ delay,
45
+ end: progress.end + shift,
46
+ arrival: progress.arrival + shift,
47
+ times,
48
+ values: offset
49
+ ? frames[property].map((value) => value + offset)
50
+ : frames[property],
51
+ to,
52
+ valueAt: pose,
53
+ velocityAt(time) {
54
+ if (time <= delay || time >= progress.end + shift)
55
+ return 0;
56
+ const position = progress.valueAt(time - shift);
57
+ if (position < 0 || position > 1)
58
+ return 0;
59
+ const epsilon = Math.min(1e-5, 0.01 / Math.max(1, geometry.length));
60
+ const a = Math.max(0, position - epsilon), b = Math.min(1, position + epsilon);
61
+ return (((geometry.at(b)[property] - geometry.at(a)[property]) / (b - a)) *
62
+ progress.velocityAt(time - shift));
63
+ },
64
+ };
65
+ },
66
+ };
67
+ }
68
+ /** Sample scalar timing once, then project all coordinates through the same path. */
69
+ function sample(geometry, transition, orient) {
70
+ const progress = createTrack('opacity', [0, 1], transition, 0);
71
+ const count = Math.max(1, Math.min(6000, Math.max(Math.ceil((progress.duration / 1000) * 60), Math.ceil(geometry.length / 2))));
72
+ const times = Array.from({ length: count + 1 }, (_, i) => i / count);
73
+ const frames = { x: [], y: [], rotate: [] };
74
+ for (const time of times) {
75
+ const position = time === 0
76
+ ? 0
77
+ : time === 1
78
+ ? 1
79
+ : progress.valueAt(progress.delay + time * progress.duration);
80
+ if (!Number.isFinite(position))
81
+ throw new RangeError('Path easing must return finite progress.');
82
+ const pose = geometry.at(position);
83
+ frames.x.push(pose.x);
84
+ frames.y.push(pose.y);
85
+ if (orient)
86
+ frames.rotate.push(pose.rotate);
87
+ }
88
+ return { progress, times, frames };
89
+ }
90
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ViewAnimation } from './engine.js';
2
+ import { type PlaybackAnimation } from './playback.js';
3
+ /** Staggered views share a finite time range. Shorter children remain seekable
4
+ * until the whole group settles, unless another animation has taken ownership. */
5
+ export declare function playbackGroup(children: readonly ViewAnimation[]): PlaybackAnimation;
6
+ //# sourceMappingURL=playback-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playback-group.d.ts","sourceRoot":"","sources":["../src/playback-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAExE;kFACkF;AAClF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,iBAAiB,CAiInF"}