@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 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface SpringPhysics {
2
+ stiffness: number;
3
+ damping: number;
4
+ mass: number;
5
+ }
6
+ export interface SpringParams {
7
+ stiffness?: number;
8
+ damping?: number;
9
+ mass?: number;
10
+ bounce?: number;
11
+ duration?: number;
12
+ }
13
+ export interface SpringMotion {
14
+ /** Milliseconds until the spring settles. */
15
+ duration: number;
16
+ position(time: number): number;
17
+ /** Units per second. */
18
+ velocity(time: number): number;
19
+ }
20
+ export declare function springPhysics({ stiffness, damping, mass, bounce, duration, }: SpringParams): SpringPhysics;
21
+ export declare function solveSpring({ stiffness, damping, mass }: SpringPhysics, from: number, to: number, velocity: number, precision: number): SpringMotion;
22
+ //# sourceMappingURL=spring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAC/B;AAKD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,QAAQ,GACT,EAAE,YAAY,GAAG,aAAa,CAW9B;AAED,wBAAgB,WAAW,CACzB,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,aAAa,EAC3C,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,YAAY,CA4Cd"}
package/dist/spring.js ADDED
@@ -0,0 +1,54 @@
1
+ const MAX_DURATION = 10_000;
2
+ const STEP = 1000 / 120;
3
+ export function springPhysics({ stiffness, damping, mass, bounce, duration, }) {
4
+ if (stiffness !== undefined || damping !== undefined || mass !== undefined) {
5
+ return { stiffness: stiffness ?? 170, damping: damping ?? 26, mass: mass ?? 1 };
6
+ }
7
+ // The same model as SwiftUI: duration is the period of the undamped spring,
8
+ // bounce 0 is critically damped, negative values are overdamped.
9
+ const omega = (2 * Math.PI) / ((duration ?? 400) / 1000);
10
+ const b = Math.min(Math.max(bounce ?? 0.15, -0.99), 0.99);
11
+ const ratio = b >= 0 ? 1 - b : 1 / (1 + b);
12
+ return { stiffness: omega * omega, damping: 2 * ratio * omega, mass: 1 };
13
+ }
14
+ export function solveSpring({ stiffness, damping, mass }, from, to, velocity, precision) {
15
+ const x0 = from - to;
16
+ const w0 = Math.sqrt(stiffness / mass);
17
+ const zeta = damping / (2 * Math.sqrt(stiffness * mass));
18
+ let displacement;
19
+ if (Math.abs(zeta - 1) < 1e-6) {
20
+ const b = velocity + w0 * x0;
21
+ displacement = (t) => Math.exp(-w0 * t) * (x0 + b * t);
22
+ }
23
+ else if (zeta < 1) {
24
+ const wd = w0 * Math.sqrt(1 - zeta * zeta);
25
+ const b = (velocity + zeta * w0 * x0) / wd;
26
+ displacement = (t) => Math.exp(-zeta * w0 * t) * (x0 * Math.cos(wd * t) + b * Math.sin(wd * t));
27
+ }
28
+ else {
29
+ const s = w0 * Math.sqrt(zeta * zeta - 1);
30
+ const r1 = -zeta * w0 + s;
31
+ const r2 = -zeta * w0 - s;
32
+ const c1 = (velocity - r2 * x0) / (r1 - r2);
33
+ const c2 = x0 - c1;
34
+ displacement = (t) => c1 * Math.exp(r1 * t) + c2 * Math.exp(r2 * t);
35
+ }
36
+ const position = (time) => to + displacement(time / 1000);
37
+ const speed = (time) => {
38
+ const t = time / 1000;
39
+ return (displacement(t + 0.0005) - displacement(t - 0.0005)) / 0.001;
40
+ };
41
+ let duration = 0;
42
+ while (duration < MAX_DURATION &&
43
+ (Math.abs(displacement(duration / 1000)) > precision ||
44
+ Math.abs(speed(duration)) > precision * 10)) {
45
+ duration += STEP;
46
+ }
47
+ duration = Math.ceil(duration);
48
+ return {
49
+ duration,
50
+ position: (time) => (time >= duration ? to : position(time)),
51
+ velocity: (time) => (time >= duration ? 0 : speed(time)),
52
+ };
53
+ }
54
+ //# sourceMappingURL=spring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.js","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type Property } from './properties.js';
2
+ import type { ResolvedTransition } from './transition.js';
3
+ /**
4
+ * One property animated over time. The curve is computed here and sampled,
5
+ * so the platform plays plain keyframes and nothing runs in JavaScript per frame.
6
+ */
7
+ export interface Track {
8
+ readonly property: Property;
9
+ readonly delay: number;
10
+ /** One iteration, in milliseconds. */
11
+ readonly duration: number;
12
+ readonly repeat: number;
13
+ readonly reverse: boolean;
14
+ /** Offsets from 0 to 1 within one iteration, paired with `values`. */
15
+ readonly times: readonly number[];
16
+ readonly values: readonly number[];
17
+ /** Where the property is left once the track is over. */
18
+ readonly to: number;
19
+ /** Milliseconds from the start until the end of the last iteration. */
20
+ readonly end: number;
21
+ /** When it looks done: a spring is close to its target and stays there, long before it settles. */
22
+ readonly arrival: number;
23
+ valueAt(elapsed: number): number;
24
+ /** Units per second. */
25
+ velocityAt(elapsed: number): number;
26
+ }
27
+ export declare function createTrack(property: Property, keyframes: readonly number[], { curve, delay, repeat, reverse }: ResolvedTransition, velocity: number): Track;
28
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1D,OAAO,KAAK,EAAS,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEhE;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,mGAAmG;IACnG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,wBAAwB;IACxB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CACpC;AAaD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EACrD,QAAQ,EAAE,MAAM,GACf,KAAK,CAuCP"}
package/dist/track.js ADDED
@@ -0,0 +1,103 @@
1
+ import { linear } from './easing.js';
2
+ import { precision } from './properties.js';
3
+ import { solveSpring } from './spring.js';
4
+ const SAMPLES_PER_SECOND = 60;
5
+ const ARRIVAL_TOLERANCE = 0.05;
6
+ export function createTrack(property, keyframes, { curve, delay, repeat, reverse }, velocity) {
7
+ const motion = curve.type === 'spring'
8
+ ? spring(property, keyframes, curve, velocity)
9
+ : tween(keyframes, curve);
10
+ const { duration } = motion;
11
+ const first = motion.values[0];
12
+ const last = motion.values.at(-1);
13
+ const finite = Number.isFinite(repeat);
14
+ const endsBackwards = reverse && finite && repeat % 2 === 1;
15
+ const end = delay + (duration === 0 ? 0 : duration * (repeat + 1));
16
+ const localTime = (elapsed) => {
17
+ const time = elapsed - delay;
18
+ if (time <= 0)
19
+ return [0, 1];
20
+ if (time >= end - delay)
21
+ return [endsBackwards ? 0 : duration, 1];
22
+ const iteration = Math.floor(time / duration);
23
+ const local = time - iteration * duration;
24
+ return reverse && iteration % 2 === 1 ? [duration - local, -1] : [local, 1];
25
+ };
26
+ return {
27
+ property,
28
+ delay,
29
+ duration,
30
+ repeat,
31
+ reverse,
32
+ times: motion.times,
33
+ values: motion.values,
34
+ to: !finite || endsBackwards ? first : last,
35
+ end,
36
+ arrival: curve.type === 'spring' && repeat === 0 ? delay + arrival(motion) : end,
37
+ valueAt: (elapsed) => motion.position(localTime(elapsed)[0]),
38
+ velocityAt: (elapsed) => {
39
+ if (elapsed <= delay || elapsed >= end)
40
+ return 0;
41
+ const [time, direction] = localTime(elapsed);
42
+ return motion.velocity(time) * direction;
43
+ },
44
+ };
45
+ }
46
+ function arrival({ times, values, duration }) {
47
+ const target = values.at(-1);
48
+ const tolerance = Math.max(...values.map((value) => Math.abs(value - target))) * ARRIVAL_TOLERANCE;
49
+ let i = values.length - 1;
50
+ while (i > 0 && Math.abs(values[i - 1] - target) <= tolerance)
51
+ i--;
52
+ return times[i] * duration;
53
+ }
54
+ function spring(property, [from, to], curve, velocity) {
55
+ const motion = solveSpring(curve.physics, from, to, curve.velocity ?? velocity, precision[property]);
56
+ const steps = Math.max(1, Math.ceil((motion.duration / 1000) * SAMPLES_PER_SECOND));
57
+ const times = [];
58
+ const values = [];
59
+ for (let i = 0; i <= steps; i++) {
60
+ times.push(i / steps);
61
+ values.push(i === steps ? to : motion.position((i / steps) * motion.duration));
62
+ }
63
+ return { ...motion, times, values };
64
+ }
65
+ function tween(keyframes, curve) {
66
+ const { duration, ease } = curve;
67
+ const offsets = curve.times ?? keyframes.map((_, i) => i / (keyframes.length - 1));
68
+ const position = (time) => {
69
+ const progress = duration > 0 ? Math.min(Math.max(time / duration, 0), 1) : 1;
70
+ let i = 0;
71
+ while (i < offsets.length - 2 && progress > offsets[i + 1])
72
+ i++;
73
+ const start = offsets[i];
74
+ const span = offsets[i + 1] - start;
75
+ const local = span > 0 ? (progress - start) / span : 1;
76
+ const from = keyframes[i];
77
+ return from + (keyframes[i + 1] - from) * ease[i](local);
78
+ };
79
+ const times = [0];
80
+ const values = [keyframes[0]];
81
+ for (let i = 0; i < keyframes.length - 1; i++) {
82
+ const start = offsets[i];
83
+ const span = offsets[i + 1] - start;
84
+ const from = keyframes[i];
85
+ const to = keyframes[i + 1];
86
+ const easing = ease[i];
87
+ const steps = easing === linear || from === to
88
+ ? 1
89
+ : Math.max(1, Math.ceil(((span * duration) / 1000) * SAMPLES_PER_SECOND));
90
+ for (let step = 1; step <= steps; step++) {
91
+ times.push(start + (span * step) / steps);
92
+ values.push(step === steps ? to : from + (to - from) * easing(step / steps));
93
+ }
94
+ }
95
+ return {
96
+ duration,
97
+ position,
98
+ velocity: (time) => (position(time + 0.5) - position(time - 0.5)) * 1000,
99
+ times,
100
+ values,
101
+ };
102
+ }
103
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type Easing, type EasingFunction } from './easing.js';
2
+ import type { Property } from './properties.js';
3
+ import { type SpringPhysics } from './spring.js';
4
+ export interface Timing {
5
+ /** Milliseconds to wait before starting. The first keyframe is applied right away. */
6
+ delay?: number;
7
+ /** How many more times to play it. `Infinity` keeps going until stopped. */
8
+ repeat?: number;
9
+ /** `reverse` plays every other repeat backwards. */
10
+ repeatType?: 'loop' | 'reverse';
11
+ }
12
+ export interface Tween extends Timing {
13
+ type?: 'tween';
14
+ /** Milliseconds. */
15
+ duration?: number;
16
+ /** One easing, or one per segment between keyframes. */
17
+ ease?: Easing | readonly Easing[];
18
+ /** Where each keyframe sits, from 0 to 1. Evenly spaced by default. */
19
+ times?: readonly number[];
20
+ }
21
+ export interface Spring extends Timing {
22
+ type?: 'spring';
23
+ stiffness?: number;
24
+ damping?: number;
25
+ mass?: number;
26
+ /** From -1 to 1. 0 settles without overshooting, higher values bounce more. */
27
+ bounce?: number;
28
+ /** How long the spring feels, in milliseconds. Goes with `bounce`, ignored with `stiffness`, `damping` or `mass`. */
29
+ duration?: number;
30
+ /** Units per second. Defaults to the velocity of the animation it interrupts. */
31
+ velocity?: number;
32
+ }
33
+ export type Transition = Tween | Spring;
34
+ export type SpringName = 'smooth' | 'snappy' | 'bouncy';
35
+ export declare const springs: Record<SpringName, Spring>;
36
+ export type Curve = {
37
+ type: 'tween';
38
+ duration: number;
39
+ ease: readonly EasingFunction[];
40
+ times: readonly number[] | undefined;
41
+ } | {
42
+ type: 'spring';
43
+ physics: SpringPhysics;
44
+ velocity: number | undefined;
45
+ };
46
+ export interface ResolvedTransition {
47
+ curve: Curve;
48
+ delay: number;
49
+ repeat: number;
50
+ reverse: boolean;
51
+ }
52
+ export declare const DEFAULT_DURATION = 300;
53
+ export declare function hasCurve(transition: Transition): boolean;
54
+ export declare function timingOf(transition: Transition): Timing;
55
+ /** Timing merges key by key, the curve is taken whole from whichever side has one. */
56
+ export declare function mergeTransitions(base: Transition, override: Transition): Transition;
57
+ export declare function resolveTransition(transition: Transition, property: Property, keyframes: number): ResolvedTransition;
58
+ //# sourceMappingURL=transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../src/transition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,WAAW,MAAM;IACrB,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC;AAED,MAAM,WAAW,KAAM,SAAQ,MAAM;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IACjC,uEAAuE;IACvE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,MAAO,SAAQ,MAAM;IACpC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qHAAqH;IACrH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,CAAA;AAEvC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAI9C,CAAA;AAED,MAAM,MAAM,KAAK,GACb;IACE,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,SAAS,cAAc,EAAE,CAAA;IAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;CACrC,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAE5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAMD,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAEnC,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAIxD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAMvD;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,CAInF;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CA8DpB"}
@@ -0,0 +1,82 @@
1
+ import { resolveEasing } from './easing.js';
2
+ import { springPhysics } from './spring.js';
3
+ export const springs = {
4
+ smooth: { type: 'spring', duration: 500, bounce: 0 },
5
+ snappy: { type: 'spring', duration: 400, bounce: 0.15 },
6
+ bouncy: { type: 'spring', duration: 550, bounce: 0.4 },
7
+ };
8
+ const springKeys = ['stiffness', 'damping', 'mass', 'bounce', 'velocity'];
9
+ const curveKeys = ['type', 'duration', 'ease', 'times', ...springKeys];
10
+ const timingKeys = ['delay', 'repeat', 'repeatType'];
11
+ export const DEFAULT_DURATION = 300;
12
+ export function hasCurve(transition) {
13
+ return curveKeys.some((key) => transition[key] !== undefined);
14
+ }
15
+ export function timingOf(transition) {
16
+ const timing = {};
17
+ for (const key of timingKeys) {
18
+ if (transition[key] !== undefined)
19
+ timing[key] = transition[key];
20
+ }
21
+ return timing;
22
+ }
23
+ /** Timing merges key by key, the curve is taken whole from whichever side has one. */
24
+ export function mergeTransitions(base, override) {
25
+ return hasCurve(override)
26
+ ? { ...timingOf(base), ...override }
27
+ : { ...base, ...timingOf(override) };
28
+ }
29
+ export function resolveTransition(transition, property, keyframes) {
30
+ const type = transition.type ??
31
+ (springKeys.some((key) => transition[key] !== undefined)
32
+ ? 'spring'
33
+ : hasCurve(transition) || property === 'opacity' || keyframes > 2
34
+ ? 'tween'
35
+ : 'spring');
36
+ const delay = transition.delay ?? 0;
37
+ const repeat = transition.repeat ?? 0;
38
+ if (delay < 0 || Number.isNaN(delay))
39
+ throw new RangeError(`Invalid delay: ${delay}.`);
40
+ if (repeat < 0 || Number.isNaN(repeat))
41
+ throw new RangeError(`Invalid repeat: ${repeat}.`);
42
+ const timing = { delay, repeat, reverse: transition.repeatType === 'reverse' };
43
+ if (type === 'spring') {
44
+ if (keyframes > 2) {
45
+ throw new Error(`A spring goes from one value to another, but "${property}" has ${keyframes} keyframes. Use a tween for keyframes.`);
46
+ }
47
+ const spring = transition;
48
+ return {
49
+ ...timing,
50
+ curve: { type, physics: springPhysics(spring), velocity: spring.velocity },
51
+ };
52
+ }
53
+ const tween = transition;
54
+ const duration = tween.duration ?? DEFAULT_DURATION;
55
+ if (duration < 0 || Number.isNaN(duration)) {
56
+ throw new RangeError(`Invalid duration: ${duration}.`);
57
+ }
58
+ const segments = keyframes - 1;
59
+ const ease = tween.ease ?? 'easeOut';
60
+ const eases = isEasingList(ease) ? ease : Array.from({ length: segments }, () => ease);
61
+ if (eases.length !== segments) {
62
+ throw new Error(`"${property}" has ${segments} segments between keyframes but ${eases.length} easings.`);
63
+ }
64
+ const times = tween.times;
65
+ if (times) {
66
+ const valid = times.length === keyframes &&
67
+ times[0] === 0 &&
68
+ times.at(-1) === 1 &&
69
+ times.every((time, i) => i === 0 || time >= times[i - 1]);
70
+ if (!valid) {
71
+ throw new Error(`"times" needs one value per keyframe (${keyframes}), going from 0 to 1 without going back.`);
72
+ }
73
+ }
74
+ return {
75
+ ...timing,
76
+ curve: { type, duration, ease: eases.map(resolveEasing), times },
77
+ };
78
+ }
79
+ function isEasingList(ease) {
80
+ return Array.isArray(ease) && ease.length > 0 && typeof ease[0] !== 'number';
81
+ }
82
+ //# sourceMappingURL=transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.js","sourceRoot":"","sources":["../src/transition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { View } from '@nativescript/core';
2
+ import type { SpringName, Transition } from './transition.js';
3
+ /** A value to animate to, or keyframes. `null` stands for the value the view has when the animation starts. */
4
+ export type KeyframeValue = number | readonly (number | null)[];
5
+ export interface Keyframes {
6
+ opacity?: KeyframeValue;
7
+ /** Same as `translateX`, in DIPs. */
8
+ x?: KeyframeValue;
9
+ /** Same as `translateY`, in DIPs. */
10
+ y?: KeyframeValue;
11
+ /** Sets `scaleX` and `scaleY` together. */
12
+ scale?: KeyframeValue;
13
+ scaleX?: KeyframeValue;
14
+ scaleY?: KeyframeValue;
15
+ /** Degrees. */
16
+ rotate?: KeyframeValue;
17
+ rotateX?: KeyframeValue;
18
+ rotateY?: KeyframeValue;
19
+ }
20
+ /** A view, or anything that holds one: a NativeScript-Vue element, an Angular `ElementRef`. */
21
+ export type Target = View | {
22
+ readonly nativeView: View;
23
+ } | {
24
+ readonly nativeElement: View;
25
+ };
26
+ export interface Stagger {
27
+ /** Milliseconds between one target and the next. */
28
+ each: number;
29
+ /** Which target starts first. */
30
+ from?: 'first' | 'last' | 'center' | number;
31
+ }
32
+ export type AnimateOptions = Transition & {
33
+ [K in keyof Keyframes]?: Transition | SpringName;
34
+ } & {
35
+ /** Offset translations/rotations and multiply scale/opacity by their values at the start. */
36
+ relative?: boolean;
37
+ /** With several targets, delays each one by this much more than the previous. */
38
+ stagger?: number | Stagger;
39
+ };
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE7D,+GAA+G;AAC/G,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;AAE/D,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,qCAAqC;IACrC,CAAC,CAAC,EAAE,aAAa,CAAA;IACjB,qCAAqC;IACrC,CAAC,CAAC,EAAE,aAAa,CAAA;IACjB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,eAAe;IACf,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB;AAED,+FAA+F;AAC/F,MAAM,MAAM,MAAM,GAChB,IAAI,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAA;CAAE,CAAA;AAEzE,MAAM,WAAW,OAAO;IACtB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;CAC5C;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;KACvC,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;CACjD,GAAG;IACF,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "@rafaelaugusto/jolt",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-beta.1",
4
+ "description": "Native animations for NativeScript: presets, springs, keyframes and stagger in one call.",
5
+ "keywords": [
6
+ "nativescript",
7
+ "animation",
8
+ "animations",
9
+ "motion",
10
+ "spring",
11
+ "keyframes",
12
+ "ios",
13
+ "android"
14
+ ],
15
+ "author": "Rafael Augusto",
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/rafaelaugustos/jolt.git"
20
+ },
21
+ "homepage": "https://github.com/rafaelaugustos/jolt#readme",
22
+ "bugs": "https://github.com/rafaelaugustos/jolt/issues",
23
+ "type": "module",
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ },
31
+ "./package.json": "./package.json"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "src"
36
+ ],
37
+ "sideEffects": false,
38
+ "scripts": {
39
+ "build": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json",
40
+ "dev": "tsc -p tsconfig.build.json --watch",
41
+ "typecheck": "tsc --noEmit",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest",
44
+ "format": "prettier --write .",
45
+ "format:check": "prettier --check .",
46
+ "docs:dev": "vitepress dev docs",
47
+ "docs:build": "vitepress build docs",
48
+ "docs:preview": "vitepress preview docs",
49
+ "prepack": "npm run build"
50
+ },
51
+ "peerDependencies": {
52
+ "@nativescript/core": ">=8.9.0"
53
+ },
54
+ "devDependencies": {
55
+ "@nativescript/core": "^9.1.3",
56
+ "@nativescript/types-android": "^9.1.1",
57
+ "@nativescript/types-ios": "^9.1.3",
58
+ "prettier": "^3.9.10",
59
+ "typescript": "^7.0.2",
60
+ "vitepress": "^1.6.4",
61
+ "vitest": "^5.0.4"
62
+ },
63
+ "engines": {
64
+ "node": ">=20"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }