@rafaelaugusto/jolt 0.0.0-stage → 0.1.0-beta.1

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -2
  3. package/dist/animate.d.ts +26 -0
  4. package/dist/animate.d.ts.map +1 -0
  5. package/dist/animate.js +161 -0
  6. package/dist/animate.js.map +1 -0
  7. package/dist/driver/android.d.ts +3 -0
  8. package/dist/driver/android.d.ts.map +1 -0
  9. package/dist/driver/android.js +73 -0
  10. package/dist/driver/android.js.map +1 -0
  11. package/dist/driver/index.d.ts +18 -0
  12. package/dist/driver/index.d.ts.map +1 -0
  13. package/dist/driver/index.js +15 -0
  14. package/dist/driver/index.js.map +1 -0
  15. package/dist/driver/ios.d.ts +3 -0
  16. package/dist/driver/ios.d.ts.map +1 -0
  17. package/dist/driver/ios.js +77 -0
  18. package/dist/driver/ios.js.map +1 -0
  19. package/dist/easing.d.ts +8 -0
  20. package/dist/easing.d.ts.map +1 -0
  21. package/dist/easing.js +71 -0
  22. package/dist/easing.js.map +1 -0
  23. package/dist/engine.d.ts +48 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +178 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/index.d.ts +13 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/presets.d.ts +310 -0
  32. package/dist/presets.d.ts.map +1 -0
  33. package/dist/presets.js +141 -0
  34. package/dist/presets.js.map +1 -0
  35. package/dist/press.d.ts +13 -0
  36. package/dist/press.d.ts.map +1 -0
  37. package/dist/press.js +34 -0
  38. package/dist/press.js.map +1 -0
  39. package/dist/properties.d.ts +8 -0
  40. package/dist/properties.d.ts.map +1 -0
  41. package/dist/properties.js +42 -0
  42. package/dist/properties.js.map +1 -0
  43. package/dist/sequence.d.ts +26 -0
  44. package/dist/sequence.d.ts.map +1 -0
  45. package/dist/sequence.js +69 -0
  46. package/dist/sequence.js.map +1 -0
  47. package/dist/spring.d.ts +22 -0
  48. package/dist/spring.d.ts.map +1 -0
  49. package/dist/spring.js +54 -0
  50. package/dist/spring.js.map +1 -0
  51. package/dist/track.d.ts +28 -0
  52. package/dist/track.d.ts.map +1 -0
  53. package/dist/track.js +103 -0
  54. package/dist/track.js.map +1 -0
  55. package/dist/transition.d.ts +58 -0
  56. package/dist/transition.d.ts.map +1 -0
  57. package/dist/transition.js +82 -0
  58. package/dist/transition.js.map +1 -0
  59. package/dist/types.d.ts +40 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +67 -4
  64. package/src/animate.ts +246 -0
  65. package/src/driver/android.ts +101 -0
  66. package/src/driver/index.ts +32 -0
  67. package/src/driver/ios.ts +97 -0
  68. package/src/easing.ts +100 -0
  69. package/src/engine.ts +216 -0
  70. package/src/index.ts +12 -0
  71. package/src/presets.ts +158 -0
  72. package/src/press.ts +49 -0
  73. package/src/properties.ts +51 -0
  74. package/src/sequence.ts +88 -0
  75. package/src/spring.ts +95 -0
  76. package/src/track.ts +163 -0
  77. package/src/transition.ts +160 -0
  78. package/src/types.ts +41 -0
@@ -0,0 +1,310 @@
1
+ import type { AnimateOptions, Keyframes } from './types.js';
2
+ export interface Preset {
3
+ keyframes: Keyframes;
4
+ transition: AnimateOptions;
5
+ }
6
+ /** Add custom preset names through module augmentation, with `true` as each value. */
7
+ export interface Presets {
8
+ }
9
+ export declare const presets: {
10
+ fadeIn: {
11
+ keyframes: {
12
+ opacity: number[];
13
+ };
14
+ transition: {
15
+ readonly duration: 300;
16
+ readonly ease: 'easeOut';
17
+ };
18
+ };
19
+ fadeInUp: {
20
+ keyframes: {
21
+ opacity: number[];
22
+ y: number[];
23
+ };
24
+ transition: {
25
+ type: 'spring';
26
+ duration: 500;
27
+ bounce: 0;
28
+ opacity: {
29
+ readonly duration: 300;
30
+ readonly ease: 'easeOut';
31
+ };
32
+ };
33
+ };
34
+ fadeInDown: {
35
+ keyframes: {
36
+ opacity: number[];
37
+ y: number[];
38
+ };
39
+ transition: {
40
+ type: 'spring';
41
+ duration: 500;
42
+ bounce: 0;
43
+ opacity: {
44
+ readonly duration: 300;
45
+ readonly ease: 'easeOut';
46
+ };
47
+ };
48
+ };
49
+ fadeInLeft: {
50
+ keyframes: {
51
+ opacity: number[];
52
+ x: number[];
53
+ };
54
+ transition: {
55
+ type: 'spring';
56
+ duration: 500;
57
+ bounce: 0;
58
+ opacity: {
59
+ readonly duration: 300;
60
+ readonly ease: 'easeOut';
61
+ };
62
+ };
63
+ };
64
+ fadeInRight: {
65
+ keyframes: {
66
+ opacity: number[];
67
+ x: number[];
68
+ };
69
+ transition: {
70
+ type: 'spring';
71
+ duration: 500;
72
+ bounce: 0;
73
+ opacity: {
74
+ readonly duration: 300;
75
+ readonly ease: 'easeOut';
76
+ };
77
+ };
78
+ };
79
+ zoomIn: {
80
+ keyframes: {
81
+ opacity: number[];
82
+ scale: number[];
83
+ };
84
+ transition: {
85
+ type: 'spring';
86
+ duration: 500;
87
+ bounce: 0;
88
+ opacity: {
89
+ readonly duration: 300;
90
+ readonly ease: 'easeOut';
91
+ };
92
+ };
93
+ };
94
+ popIn: {
95
+ keyframes: {
96
+ opacity: number[];
97
+ scale: number[];
98
+ };
99
+ transition: {
100
+ type: "spring";
101
+ duration: number;
102
+ bounce: number;
103
+ opacity: {
104
+ duration: number;
105
+ };
106
+ };
107
+ };
108
+ flipInX: {
109
+ keyframes: {
110
+ opacity: number[];
111
+ rotateX: number[];
112
+ };
113
+ transition: {
114
+ type: "spring";
115
+ duration: number;
116
+ bounce: number;
117
+ opacity: {
118
+ duration: number;
119
+ };
120
+ };
121
+ };
122
+ flipInY: {
123
+ keyframes: {
124
+ opacity: number[];
125
+ rotateY: number[];
126
+ };
127
+ transition: {
128
+ type: "spring";
129
+ duration: number;
130
+ bounce: number;
131
+ opacity: {
132
+ duration: number;
133
+ };
134
+ };
135
+ };
136
+ fadeOut: {
137
+ keyframes: {
138
+ opacity: number;
139
+ };
140
+ transition: {
141
+ readonly duration: 200;
142
+ readonly ease: 'easeIn';
143
+ };
144
+ };
145
+ fadeOutUp: {
146
+ keyframes: {
147
+ opacity: number;
148
+ y: number;
149
+ };
150
+ transition: {
151
+ readonly duration: 200;
152
+ readonly ease: 'easeIn';
153
+ };
154
+ };
155
+ fadeOutDown: {
156
+ keyframes: {
157
+ opacity: number;
158
+ y: number;
159
+ };
160
+ transition: {
161
+ readonly duration: 200;
162
+ readonly ease: 'easeIn';
163
+ };
164
+ };
165
+ fadeOutLeft: {
166
+ keyframes: {
167
+ opacity: number;
168
+ x: number;
169
+ };
170
+ transition: {
171
+ readonly duration: 200;
172
+ readonly ease: 'easeIn';
173
+ };
174
+ };
175
+ fadeOutRight: {
176
+ keyframes: {
177
+ opacity: number;
178
+ x: number;
179
+ };
180
+ transition: {
181
+ readonly duration: 200;
182
+ readonly ease: 'easeIn';
183
+ };
184
+ };
185
+ zoomOut: {
186
+ keyframes: {
187
+ opacity: number;
188
+ scale: number;
189
+ };
190
+ transition: {
191
+ readonly duration: 200;
192
+ readonly ease: 'easeIn';
193
+ };
194
+ };
195
+ popOut: {
196
+ keyframes: {
197
+ opacity: number;
198
+ scale: (number | null)[];
199
+ };
200
+ transition: {
201
+ duration: number;
202
+ ease: ["easeOut", "easeIn"];
203
+ times: number[];
204
+ opacity: {
205
+ duration: number;
206
+ ease: "easeIn";
207
+ };
208
+ };
209
+ };
210
+ pulse: {
211
+ keyframes: {
212
+ scale: number[];
213
+ };
214
+ transition: {
215
+ duration: number;
216
+ ease: "easeInOut";
217
+ relative: true;
218
+ };
219
+ };
220
+ bounce: {
221
+ keyframes: {
222
+ y: number[];
223
+ };
224
+ transition: {
225
+ duration: number;
226
+ relative: true;
227
+ times: number[];
228
+ ease: ["easeOut", "easeIn", "easeOut", "easeIn"];
229
+ };
230
+ };
231
+ shake: {
232
+ keyframes: {
233
+ x: number[];
234
+ };
235
+ transition: {
236
+ duration: number;
237
+ ease: "easeInOut";
238
+ relative: true;
239
+ };
240
+ };
241
+ wiggle: {
242
+ keyframes: {
243
+ rotate: number[];
244
+ };
245
+ transition: {
246
+ duration: number;
247
+ ease: "easeInOut";
248
+ relative: true;
249
+ };
250
+ };
251
+ heartbeat: {
252
+ keyframes: {
253
+ scale: number[];
254
+ };
255
+ transition: {
256
+ duration: number;
257
+ relative: true;
258
+ times: number[];
259
+ ease: "easeInOut";
260
+ };
261
+ };
262
+ jelly: {
263
+ keyframes: {
264
+ scaleX: number[];
265
+ scaleY: number[];
266
+ };
267
+ transition: {
268
+ duration: number;
269
+ relative: true;
270
+ times: number[];
271
+ ease: "easeInOut";
272
+ };
273
+ };
274
+ flash: {
275
+ keyframes: {
276
+ opacity: number[];
277
+ };
278
+ transition: {
279
+ duration: number;
280
+ ease: "easeInOut";
281
+ relative: true;
282
+ };
283
+ };
284
+ tada: {
285
+ keyframes: {
286
+ scale: number[];
287
+ rotate: number[];
288
+ };
289
+ transition: {
290
+ duration: number;
291
+ ease: "easeInOut";
292
+ relative: true;
293
+ };
294
+ };
295
+ spin: {
296
+ keyframes: {
297
+ rotate: number[];
298
+ };
299
+ transition: {
300
+ duration: number;
301
+ ease: "linear";
302
+ relative: true;
303
+ };
304
+ };
305
+ };
306
+ export type PresetName = keyof typeof presets | Extract<keyof Presets, string>;
307
+ /** Registers a custom preset. Registering it again replaces it for future animations. */
308
+ export declare function definePreset(name: PresetName, preset: Preset): void;
309
+ export declare function getPreset(name: PresetName): Preset;
310
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3D,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,cAAc,CAAA;CAC3B;AAED,sFAAsF;AACtF,MAAM,WAAW,OAAO;CAAG;AAM3B,eAAO,MAAM,OAAO;;QACR,SAAS;YAAI,OAAO;;QAAY,UAAU;+BAL3B,GAAG;2BAAQ,SAAS;;;;;YAO9B,OAAO;YAAU,CAAC;;;kBALb,QAAQ;sBAAY,GAAG;oBAAU,CAAC;;;;;;;;;YASvC,OAAO;YAAU,CAAC;;;kBATb,QAAQ;sBAAY,GAAG;oBAAU,CAAC;;;;;;;;;YAavC,OAAO;YAAU,CAAC;;;kBAbb,QAAQ;sBAAY,GAAG;oBAAU,CAAC;;;;;;;;;YAiBvC,OAAO;YAAU,CAAC;;;kBAjBb,QAAQ;sBAAY,GAAG;oBAAU,CAAC;;;;;;;;;YAqBvC,OAAO;YAAU,KAAK;;;kBArBjB,QAAQ;sBAAY,GAAG;oBAAU,CAAC;;;;;;;;;YAyBvC,OAAO;YAAU,KAAK;;;;;;;gBAKtB,QAAQ;;;;;;YAIR,OAAO;YAAU,OAAO;;;;;;;gBAKxB,QAAQ;;;;;;YAIR,OAAO;YAAU,OAAO;;;;;;;gBAKxB,QAAQ;;;;;QAIZ,SAAS;YAAI,OAAO;;QAAO,UAAU;+BArDtB,GAAG;2BAAQ,QAAQ;;;;QAsDhC,SAAS;YAAI,OAAO;YAAK,CAAC;;QAAS,UAAU;;;;;;QAC3C,SAAS;YAAI,OAAO;YAAK,CAAC;;QAAQ,UAAU;;;;;;QAC5C,SAAS;YAAI,OAAO;YAAK,CAAC;;QAAS,UAAU;;;;;;QAC5C,SAAS;YAAI,OAAO;YAAK,CAAC;;QAAQ,UAAU;;;;;;QACjD,SAAS;YAAI,OAAO;YAAK,KAAK;;QAAU,UAAU;;;;;;;YAE9C,OAAO;YAAK,KAAK;;;;;;;;;;;;;;YAUjB,KAAK;;;;;;;;;;YAIL,CAAC;;;;;;;;;;;YASD,CAAC;;;;;;;;;;YAID,MAAM;;;;;;;;;;YAIN,KAAK;;;;;;;;;;;YAUhB,MAAM;YACN,MAAM;;;;;;;;;;;YAUK,OAAO;;;;;;;;;;YAKlB,KAAK;YACL,MAAM;;;;;;;;;;YAKK,MAAM;;;;;;;;CAGW,CAAA;AAElC,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,GAAG,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,CAAA;AAI9E,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,141 @@
1
+ const fadeIn = { duration: 300, ease: 'easeOut' };
2
+ const fadeOut = { duration: 200, ease: 'easeIn' };
3
+ const enter = { type: 'spring', duration: 500, bounce: 0 };
4
+ export const presets = {
5
+ fadeIn: { keyframes: { opacity: [0, 1] }, transition: fadeIn },
6
+ fadeInUp: {
7
+ keyframes: { opacity: [0, 1], y: [24, 0] },
8
+ transition: { ...enter, opacity: fadeIn },
9
+ },
10
+ fadeInDown: {
11
+ keyframes: { opacity: [0, 1], y: [-24, 0] },
12
+ transition: { ...enter, opacity: fadeIn },
13
+ },
14
+ fadeInLeft: {
15
+ keyframes: { opacity: [0, 1], x: [-24, 0] },
16
+ transition: { ...enter, opacity: fadeIn },
17
+ },
18
+ fadeInRight: {
19
+ keyframes: { opacity: [0, 1], x: [24, 0] },
20
+ transition: { ...enter, opacity: fadeIn },
21
+ },
22
+ zoomIn: {
23
+ keyframes: { opacity: [0, 1], scale: [0.85, 1] },
24
+ transition: { ...enter, opacity: fadeIn },
25
+ },
26
+ popIn: {
27
+ keyframes: { opacity: [0, 1], scale: [0.5, 1] },
28
+ transition: {
29
+ type: 'spring',
30
+ duration: 550,
31
+ bounce: 0.4,
32
+ opacity: { duration: 150 },
33
+ },
34
+ },
35
+ flipInX: {
36
+ keyframes: { opacity: [0, 1], rotateX: [-90, 0] },
37
+ transition: {
38
+ type: 'spring',
39
+ duration: 600,
40
+ bounce: 0.25,
41
+ opacity: { duration: 200 },
42
+ },
43
+ },
44
+ flipInY: {
45
+ keyframes: { opacity: [0, 1], rotateY: [90, 0] },
46
+ transition: {
47
+ type: 'spring',
48
+ duration: 600,
49
+ bounce: 0.25,
50
+ opacity: { duration: 200 },
51
+ },
52
+ },
53
+ fadeOut: { keyframes: { opacity: 0 }, transition: fadeOut },
54
+ fadeOutUp: { keyframes: { opacity: 0, y: -24 }, transition: fadeOut },
55
+ fadeOutDown: { keyframes: { opacity: 0, y: 24 }, transition: fadeOut },
56
+ fadeOutLeft: { keyframes: { opacity: 0, x: -24 }, transition: fadeOut },
57
+ fadeOutRight: { keyframes: { opacity: 0, x: 24 }, transition: fadeOut },
58
+ zoomOut: { keyframes: { opacity: 0, scale: 0.85 }, transition: fadeOut },
59
+ popOut: {
60
+ keyframes: { opacity: 0, scale: [null, 1.08, 0.4] },
61
+ transition: {
62
+ duration: 250,
63
+ ease: ['easeOut', 'easeIn'],
64
+ times: [0, 0.3, 1],
65
+ opacity: { duration: 250, ease: 'easeIn' },
66
+ },
67
+ },
68
+ pulse: {
69
+ keyframes: { scale: [1, 1.06, 1] },
70
+ transition: { duration: 500, ease: 'easeInOut', relative: true },
71
+ },
72
+ bounce: {
73
+ keyframes: { y: [0, -18, 0, -8, 0] },
74
+ transition: {
75
+ duration: 650,
76
+ relative: true,
77
+ times: [0, 0.3, 0.6, 0.8, 1],
78
+ ease: ['easeOut', 'easeIn', 'easeOut', 'easeIn'],
79
+ },
80
+ },
81
+ shake: {
82
+ keyframes: { x: [0, -10, 10, -8, 8, -4, 4, 0] },
83
+ transition: { duration: 500, ease: 'easeInOut', relative: true },
84
+ },
85
+ wiggle: {
86
+ keyframes: { rotate: [0, -8, 8, -5, 5, 0] },
87
+ transition: { duration: 500, ease: 'easeInOut', relative: true },
88
+ },
89
+ heartbeat: {
90
+ keyframes: { scale: [1, 1.15, 1, 1.15, 1, 1] },
91
+ transition: {
92
+ duration: 1000,
93
+ relative: true,
94
+ times: [0, 0.14, 0.28, 0.42, 0.7, 1],
95
+ ease: 'easeInOut',
96
+ },
97
+ },
98
+ jelly: {
99
+ keyframes: {
100
+ scaleX: [1, 1.25, 0.75, 1.15, 0.95, 1.05, 1],
101
+ scaleY: [1, 0.75, 1.25, 0.85, 1.05, 0.95, 1],
102
+ },
103
+ transition: {
104
+ duration: 800,
105
+ relative: true,
106
+ times: [0, 0.3, 0.4, 0.5, 0.65, 0.75, 1],
107
+ ease: 'easeInOut',
108
+ },
109
+ },
110
+ flash: {
111
+ keyframes: { opacity: [1, 0, 1, 0, 1] },
112
+ transition: { duration: 800, ease: 'easeInOut', relative: true },
113
+ },
114
+ tada: {
115
+ keyframes: {
116
+ scale: [1, 0.9, 0.9, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1],
117
+ rotate: [0, -3, -3, 3, -3, 3, -3, 3, -3, 3, 0],
118
+ },
119
+ transition: { duration: 1000, ease: 'easeInOut', relative: true },
120
+ },
121
+ spin: {
122
+ keyframes: { rotate: [0, 360] },
123
+ transition: { duration: 1000, ease: 'linear', relative: true },
124
+ },
125
+ };
126
+ const customPresets = new Map();
127
+ /** Registers a custom preset. Registering it again replaces it for future animations. */
128
+ export function definePreset(name, preset) {
129
+ if (Object.hasOwn(presets, name)) {
130
+ throw new Error(`Preset "${name}" is built in and cannot be replaced.`);
131
+ }
132
+ customPresets.set(name, preset);
133
+ }
134
+ export function getPreset(name) {
135
+ const preset = customPresets.get(name) ??
136
+ (Object.hasOwn(presets, name) ? presets[name] : undefined);
137
+ if (!preset)
138
+ throw new Error(`Unknown preset "${name}".`);
139
+ return preset;
140
+ }
141
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAW,CAAA;AAC1D,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAA;AAC1D,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAW,CAAA;AAEnE,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;IAC9D,QAAQ,EAAE;QACR,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1C;IACD,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAC3C,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1C;IACD,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAC3C,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1C;IACD,WAAW,EAAE;QACX,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAC1C,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1C;IACD,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;QAChD,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1C;IACD,KAAK,EAAE;QACL,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;QAC/C,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC3B;KACF;IACD,OAAO,EAAE;QACP,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QACjD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC3B;KACF;IACD,OAAO,EAAE;QACP,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAChD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC3B;KACF;IAED,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IAC3D,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IACrE,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IACtE,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IACvE,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IACvE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;IACxE,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;QACnD,UAAU,EAAE;YACV,QAAQ,EAAE,GAAG;YACb,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;YAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3C;KACF;IAED,KAAK,EAAE;QACL,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAClC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjE;IACD,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACpC,UAAU,EAAE;YACV,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;SACjD;KACF;IACD,KAAK,EAAE;QACL,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QAC/C,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjE;IACD,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QAC3C,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjE;IACD,SAAS,EAAE;QACT,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QAC9C,UAAU,EAAE;YACV,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,WAAW;SAClB;KACF;IACD,KAAK,EAAE;QACL,SAAS,EAAE;YACT,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SAC7C;QACD,UAAU,EAAE;YACV,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,WAAW;SAClB;KACF;IACD,KAAK,EAAE;QACL,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACvC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjE;IACD,IAAI,EAAE;QACJ,SAAS,EAAE;YACT,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC/C;QACD,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;KAClE;IACD,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QAC/B,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC/D;CAC+B,CAAA;AAIlC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE/C,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,MAAc;IAC3D,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,uCAAuC,CAAC,CAAA;IACzE,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,MAAM,MAAM,GACV,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAA4B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACpF,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAA;IACzD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SpringName } from './transition.js';
2
+ import type { AnimateOptions, Keyframes, Target } from './types.js';
3
+ /**
4
+ * Animates the view to `pressed` while a finger is on it, and back once it's lifted.
5
+ * Returns a function that removes the effect.
6
+ *
7
+ * ```ts
8
+ * press(button)
9
+ * press(card, { scale: 0.97, opacity: 0.85 })
10
+ * ```
11
+ */
12
+ export declare function press(target: Target, pressed?: Keyframes, options?: AnimateOptions | SpringName): () => void;
13
+ //# sourceMappingURL=press.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press.d.ts","sourceRoot":"","sources":["../src/press.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,iBAAiB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAKnE;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,SAA2B,EACpC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,GACpC,MAAM,IAAI,CA0BZ"}
package/dist/press.js ADDED
@@ -0,0 +1,34 @@
1
+ import { animate, toView } from './animate.js';
2
+ import { isProperty, readValue } from './properties.js';
3
+ const pressIn = { type: 'spring', duration: 200, bounce: 0 };
4
+ const release = { type: 'spring', duration: 450, bounce: 0.35 };
5
+ /**
6
+ * Animates the view to `pressed` while a finger is on it, and back once it's lifted.
7
+ * Returns a function that removes the effect.
8
+ *
9
+ * ```ts
10
+ * press(button)
11
+ * press(card, { scale: 0.97, opacity: 0.85 })
12
+ * ```
13
+ */
14
+ export function press(target, pressed = { scale: 0.96 }, options) {
15
+ const view = toView(target);
16
+ const properties = Object.keys(pressed).flatMap((key) => key === 'scale' ? ['scaleX', 'scaleY'] : isProperty(key) ? [key] : []);
17
+ let rest;
18
+ const onTouch = (event) => {
19
+ const { action } = event;
20
+ if (action === 'down' && !rest && view.isEnabled !== false) {
21
+ rest = Object.fromEntries(properties.map((p) => [p, readValue(view, p)]));
22
+ animate(view, pressed, options ?? pressIn);
23
+ }
24
+ else if ((action === 'up' || action === 'cancel') && rest) {
25
+ animate(view, rest, typeof options === 'object'
26
+ ? { ...options, relative: false }
27
+ : (options ?? release));
28
+ rest = undefined;
29
+ }
30
+ };
31
+ view.on('touch', onTouch);
32
+ return () => view.off('touch', onTouch);
33
+ }
34
+ //# sourceMappingURL=press.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press.js","sourceRoot":"","sources":["../src/press.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAA;AAItE,MAAM,OAAO,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;AACxE,MAAM,OAAO,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAE3E;;;;;;;;GAQG;AACH,MAAM,UAAU,KAAK,CACnB,MAAc,EACd,OAAO,GAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EACpC,OAAqC;IAErC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAc,EAAE,CAClE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CACtE,CAAA;IACD,IAAI,IAA2B,CAAA;IAE/B,MAAM,OAAO,GAAG,CAAC,KAAgB,EAAE,EAAE;QACnC,MAAM,EAAE,MAAM,EAAE,GAAG,KAA8B,CAAA;QACjD,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC3D,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5D,OAAO,CACL,IAAI,EACJ,IAAI,EACJ,OAAO,OAAO,KAAK,QAAQ;gBACzB,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;gBACjC,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CACzB,CAAA;YACD,IAAI,GAAG,SAAS,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { View } from '@nativescript/core';
2
+ export type Property = 'opacity' | 'x' | 'y' | 'scaleX' | 'scaleY' | 'rotate' | 'rotateX' | 'rotateY';
3
+ /** How close to its target a spring has to be to count as settled. */
4
+ export declare const precision: Record<Property, number>;
5
+ export declare function isProperty(key: string): key is Property;
6
+ export declare function readValue(view: View, property: Property): number;
7
+ export declare function writeValue(view: View, property: Property, value: number): void;
8
+ //# sourceMappingURL=properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAClB,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AAwBhF,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAS9C,CAAA;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,QAAQ,CAEvD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAGhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAEvE"}
@@ -0,0 +1,42 @@
1
+ const viewKeys = {
2
+ opacity: 'opacity',
3
+ x: 'translateX',
4
+ y: 'translateY',
5
+ scaleX: 'scaleX',
6
+ scaleY: 'scaleY',
7
+ rotate: 'rotate',
8
+ rotateX: 'rotateX',
9
+ rotateY: 'rotateY',
10
+ };
11
+ const defaults = {
12
+ opacity: 1,
13
+ x: 0,
14
+ y: 0,
15
+ scaleX: 1,
16
+ scaleY: 1,
17
+ rotate: 0,
18
+ rotateX: 0,
19
+ rotateY: 0,
20
+ };
21
+ /** How close to its target a spring has to be to count as settled. */
22
+ export const precision = {
23
+ opacity: 0.002,
24
+ x: 0.25,
25
+ y: 0.25,
26
+ scaleX: 0.001,
27
+ scaleY: 0.001,
28
+ rotate: 0.1,
29
+ rotateX: 0.1,
30
+ rotateY: 0.1,
31
+ };
32
+ export function isProperty(key) {
33
+ return key in viewKeys;
34
+ }
35
+ export function readValue(view, property) {
36
+ const value = view[viewKeys[property]];
37
+ return typeof value === 'number' && !Number.isNaN(value) ? value : defaults[property];
38
+ }
39
+ export function writeValue(view, property, value) {
40
+ view[viewKeys[property]] = value;
41
+ }
42
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAG;IACf,OAAO,EAAE,SAAS;IAClB,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,YAAY;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CAC6B,CAAA;AAEjD,MAAM,QAAQ,GAA6B;IACzC,OAAO,EAAE,CAAC;IACV,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;CACX,CAAA;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAA6B;IACjD,OAAO,EAAE,KAAK;IACd,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;CACb,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,IAAI,QAAQ,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAU,EAAE,QAAkB;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,QAAkB,EAAE,KAAa;IACtE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAA;AAClC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Animation } from './engine.js';
2
+ import type { PresetName } from './presets.js';
3
+ import type { SpringName } from './transition.js';
4
+ import type { AnimateOptions, Keyframes, Target } from './types.js';
5
+ export type Step = readonly [
6
+ target: Target | readonly Target[],
7
+ animation: Keyframes | PresetName,
8
+ options?: AnimateOptions | SpringName
9
+ ] | (() => Animation);
10
+ /**
11
+ * Plays steps one after the other. A step starts once the previous one looks
12
+ * done: a spring is close to its target, even if it hasn't fully settled.
13
+ * Views in later steps take their first absolute keyframe right away, so a title
14
+ * that fades in third doesn't show up before its turn. Relative and null keyframes
15
+ * read the current value when their step starts.
16
+ *
17
+ * ```ts
18
+ * await sequence([
19
+ * [logo, 'popIn'],
20
+ * [title, 'fadeInUp'],
21
+ * [buttons, 'fadeInUp', { stagger: 50 }],
22
+ * ])
23
+ * ```
24
+ */
25
+ export declare function sequence(steps: readonly Step[]): Animation;
26
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnE,MAAM,MAAM,IAAI,GACZ,SAAS;IACP,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAClC,SAAS,EAAE,SAAS,GAAG,UAAU;IACjC,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU;CACtC,GACD,CAAC,MAAM,SAAS,CAAC,CAAA;AAErB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,CA8B1D"}
@@ -0,0 +1,69 @@
1
+ import { animate, startingValues, toViews } from './animate.js';
2
+ import { arrivalOf, setArrival, stopView } from './engine.js';
3
+ import { writeValue } from './properties.js';
4
+ /**
5
+ * Plays steps one after the other. A step starts once the previous one looks
6
+ * done: a spring is close to its target, even if it hasn't fully settled.
7
+ * Views in later steps take their first absolute keyframe right away, so a title
8
+ * that fades in third doesn't show up before its turn. Relative and null keyframes
9
+ * read the current value when their step starts.
10
+ *
11
+ * ```ts
12
+ * await sequence([
13
+ * [logo, 'popIn'],
14
+ * [title, 'fadeInUp'],
15
+ * [buttons, 'fadeInUp', { stagger: 50 }],
16
+ * ])
17
+ * ```
18
+ */
19
+ export function sequence(steps) {
20
+ applyStartingValues(steps);
21
+ const started = [];
22
+ let stopped = false;
23
+ const arrived = (async () => {
24
+ for (const step of steps) {
25
+ if (stopped)
26
+ return;
27
+ const animation = typeof step === 'function' ? step() : animate(...step);
28
+ started.push(animation);
29
+ await arrivalOf(animation);
30
+ }
31
+ })();
32
+ const finished = arrived.then(async () => {
33
+ const results = await Promise.all(started.map((animation) => animation.finished));
34
+ return !stopped && results.length === steps.length && results.every(Boolean);
35
+ });
36
+ const animation = {
37
+ finished,
38
+ stop() {
39
+ stopped = true;
40
+ started.forEach((animation) => animation.stop());
41
+ },
42
+ then: (onfulfilled, onrejected) => finished.then(onfulfilled, onrejected),
43
+ };
44
+ setArrival(animation, arrived);
45
+ return animation;
46
+ }
47
+ function applyStartingValues(steps) {
48
+ const claimed = new Map();
49
+ for (const step of steps) {
50
+ if (typeof step === 'function')
51
+ continue;
52
+ const [target, animation, options] = step;
53
+ const starts = startingValues(animation, options);
54
+ for (const view of toViews(target)) {
55
+ let properties = claimed.get(view);
56
+ if (!properties)
57
+ claimed.set(view, (properties = new Set()));
58
+ const fresh = [...starts].filter(([property, value]) => !properties.has(property) && value !== null);
59
+ stopView(view, fresh.map(([property]) => property));
60
+ for (const [property, value] of fresh) {
61
+ if (value !== null)
62
+ writeValue(view, property, value);
63
+ }
64
+ for (const property of starts.keys())
65
+ properties.add(property);
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=sequence.js.map