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

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 (38) hide show
  1. package/README.md +18 -0
  2. package/dist/driver/android-gradient.d.ts +5 -0
  3. package/dist/driver/android-gradient.d.ts.map +1 -0
  4. package/dist/driver/android-gradient.js +89 -0
  5. package/dist/driver/android-gradient.js.map +1 -0
  6. package/dist/driver/ios-gradient.d.ts +5 -0
  7. package/dist/driver/ios-gradient.d.ts.map +1 -0
  8. package/dist/driver/ios-gradient.js +109 -0
  9. package/dist/driver/ios-gradient.js.map +1 -0
  10. package/dist/gradient.d.ts +90 -0
  11. package/dist/gradient.d.ts.map +1 -0
  12. package/dist/gradient.js +247 -0
  13. package/dist/gradient.js.map +1 -0
  14. package/dist/index.d.ts +4 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/motion-scope.d.ts +1 -1
  19. package/dist/motion-scope.d.ts.map +1 -1
  20. package/dist/motion-states.d.ts +9 -2
  21. package/dist/motion-states.d.ts.map +1 -1
  22. package/dist/motion-states.js +64 -9
  23. package/dist/motion-states.js.map +1 -1
  24. package/dist/transition.d.ts +15 -0
  25. package/dist/transition.d.ts.map +1 -1
  26. package/dist/transition.js +17 -0
  27. package/dist/transition.js.map +1 -1
  28. package/package.json +1 -1
  29. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +195 -0
  30. package/platforms/android/proguard-rules.pro +2 -0
  31. package/src/android-plugin.d.ts +29 -0
  32. package/src/driver/android-gradient.ts +109 -0
  33. package/src/driver/ios-gradient.ts +114 -0
  34. package/src/gradient.ts +372 -0
  35. package/src/index.ts +16 -2
  36. package/src/motion-scope.ts +2 -2
  37. package/src/motion-states.ts +73 -19
  38. package/src/transition.ts +30 -0
package/README.md CHANGED
@@ -38,6 +38,7 @@ Jolt computes the motion once, in JavaScript, when the animation starts, and han
38
38
  - [Corners, borders and shadows](#corners-borders-and-shadows) with native playback and selective stopping.
39
39
  - [Motion paths](#motion-along-a-path) with optional tangent orientation on iOS and Android.
40
40
  - [Colors](#colors) for backgrounds, borders and text, interpolated in OKLab on iOS and Android.
41
+ - [Gradients](#gradients): native linear, radial and conic gradients with animated colors, angle, center and radius.
41
42
  - [Motion scopes and states](https://jolt.rafaelaugusto.dev/guide/motion-controllers) for component cleanup and coordinated visual states.
42
43
  - [Animated touch targets](https://jolt.rafaelaugusto.dev/guide/interaction-surface) with an opt-in native interaction surface.
43
44
  - [Layout changes](https://jolt.rafaelaugusto.dev/guide/layout): insertion, removal, reorder and resize of container children.
@@ -186,6 +187,21 @@ Color strings and NativeScript `Color` objects work as targets or keyframes; `nu
186
187
 
187
188
  Android includes a Java animation target; rebuild the native app after installing or upgrading Jolt.
188
189
 
190
+ ## Gradients
191
+
192
+ ```ts
193
+ import { gradient } from '@rafaelaugusto/jolt'
194
+
195
+ const glow = gradient(card, {
196
+ type: 'radial',
197
+ colors: ['#A78BFA', '#0F172A'],
198
+ radius: 0.45,
199
+ })
200
+ glow.animate({ center: { x: 0.7, y: 0.7 }, radius: 0.9 }, { duration: 1400 })
201
+ ```
202
+
203
+ Native linear, radial and conic gradients behind a layout's children, which NativeScript's CSS doesn't have beyond a static `linear-gradient`. Colors, stops, angle, center and radius animate with springs, tweens and repeats: a `CAGradientLayer` with Core Animation keyframes on iOS, a native drawable and animator on Android. Rebuild Android after upgrading. See the [guide](https://jolt.rafaelaugusto.dev/guide/gradients).
204
+
189
205
  ## Transitions
190
206
 
191
207
  The third argument says how to get there. Without one, transforms move with a spring and opacity and colors ease over 300ms. Keyframes tween.
@@ -206,6 +222,8 @@ animate(card, { y: 0 }, { stiffness: 300, damping: 20, mass: 1 })
206
222
 
207
223
  `bounce` goes from -1 to 1: 0 settles without overshooting, higher values bounce more, negative values settle more slowly. `duration` is how long the spring feels, the same model as SwiftUI. Or describe it with `stiffness`, `damping` and `mass`. A spring starts with the velocity of the animation it interrupts, unless you pass `velocity` (units per second).
208
224
 
225
+ Coming from React Native, `origamiSpring({ friction: 7, tension: 40 })` gives the spring `Animated.spring` plays for `friction` and `tension`. See [From React Native Animated](https://jolt.rafaelaugusto.dev/guide/react-native) for the rest of the mapping.
226
+
209
227
  ### Tweens
210
228
 
211
229
  ```ts
@@ -0,0 +1,5 @@
1
+ import { type View } from '@nativescript/core';
2
+ import type { GradientPainter, GradientType } from '../gradient.js';
3
+ /** A gradient drawable stacked on the view's own background: above its color, below its children. */
4
+ export declare function androidGradient(view: View, type: GradientType): GradientPainter | undefined;
5
+ //# sourceMappingURL=android-gradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-gradient.d.ts","sourceRoot":"","sources":["../../src/driver/android-gradient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAiB,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAalF,qGAAqG;AACrG,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,YAAY,GACjB,eAAe,GAAG,SAAS,CA0F7B"}
@@ -0,0 +1,89 @@
1
+ import { Utils } from '@nativescript/core';
2
+ const floats = (values) => {
3
+ const array = Array.create('float', values.length);
4
+ values.forEach((value, i) => (array[i] = value));
5
+ return array;
6
+ };
7
+ const ints = (values) => {
8
+ const array = Array.create('int', values.length);
9
+ values.forEach((value, i) => (array[i] = value | 0));
10
+ return array;
11
+ };
12
+ /** A gradient drawable stacked on the view's own background: above its color, below its children. */
13
+ export function androidGradient(view, type) {
14
+ let layer;
15
+ try {
16
+ layer = new org.rafaelaugusto.jolt.GradientLayer(type === 'linear' ? 0 : type === 'radial' ? 1 : 2);
17
+ }
18
+ catch {
19
+ // A JS-only update cannot install the native plugin.
20
+ return undefined;
21
+ }
22
+ let stack;
23
+ let queued = false;
24
+ const wrap = () => {
25
+ const native = view.nativeViewProtected;
26
+ if (!native)
27
+ return;
28
+ const corner = typeof view.borderRadius === 'number' ? view.borderRadius : 0;
29
+ layer.setCorner(corner * Utils.layout.getDisplayDensity());
30
+ const background = native.getBackground();
31
+ if (stack && background === stack)
32
+ return;
33
+ const layers = Array.create(android.graphics.drawable.Drawable, 2);
34
+ layers[0] = background ?? new android.graphics.drawable.ColorDrawable(0);
35
+ layers[1] = layer;
36
+ stack = new android.graphics.drawable.LayerDrawable(layers);
37
+ native.setBackground(stack);
38
+ };
39
+ // Core replaces the background drawable when its style changes; stack on the new one.
40
+ const rewrap = () => {
41
+ if (queued)
42
+ return;
43
+ queued = true;
44
+ void Promise.resolve().then(() => {
45
+ queued = false;
46
+ wrap();
47
+ });
48
+ };
49
+ view.on('loaded', wrap);
50
+ view.style.on('backgroundInternalChange', rewrap);
51
+ view.style.on('borderTopLeftRadiusChange', rewrap);
52
+ wrap();
53
+ return {
54
+ paint(frame) {
55
+ layer.paint(ints(frame.colors), floats(frame.stops), frame.angle, frame.x, frame.y, frame.radius);
56
+ },
57
+ play(frames, times, timing, onEnd) {
58
+ let active = true;
59
+ layer.play(floats(times), ints(frames.flatMap((frame) => frame.colors)), floats(frames.flatMap((frame) => frame.stops)), floats(frames.flatMap((frame) => [frame.angle, frame.x, frame.y, frame.radius])), Math.round(timing.duration), Math.round(timing.delay), timing.repeat === Infinity ? -1 : timing.repeat, timing.reverse, new org.rafaelaugusto.jolt.GradientLayer.Listener({
60
+ onEnd: (finished) => {
61
+ if (!active)
62
+ return;
63
+ active = false;
64
+ onEnd(finished);
65
+ },
66
+ }));
67
+ return {
68
+ cancel() {
69
+ if (!active)
70
+ return;
71
+ active = false;
72
+ layer.cancel();
73
+ onEnd(false);
74
+ },
75
+ };
76
+ },
77
+ remove() {
78
+ view.off('loaded', wrap);
79
+ view.style.off('backgroundInternalChange', rewrap);
80
+ view.style.off('borderTopLeftRadiusChange', rewrap);
81
+ layer.cancel();
82
+ const native = view.nativeViewProtected;
83
+ if (native && stack && native.getBackground() === stack)
84
+ native.setBackground(stack.getDrawable(0));
85
+ stack = undefined;
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=android-gradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-gradient.js","sourceRoot":"","sources":["../../src/driver/android-gradient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type View } from '@nativescript/core';
2
+ import { type GradientPainter, type GradientType } from '../gradient.js';
3
+ /** A CAGradientLayer at the back of the view's layer: above its background, below its children. */
4
+ export declare function iosGradient(view: View, type: GradientType): GradientPainter;
5
+ //# sourceMappingURL=ios-gradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-gradient.d.ts","sourceRoot":"","sources":["../../src/driver/ios-gradient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAA;AAIvB,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,GAAG,eAAe,CAsG3E"}
@@ -0,0 +1,109 @@
1
+ import { Color } from '@nativescript/core';
2
+ import { gradientPoints, } from '../gradient.js';
3
+ const keys = ['colors', 'locations', 'startPoint', 'endPoint'];
4
+ /** A CAGradientLayer at the back of the view's layer: above its background, below its children. */
5
+ export function iosGradient(view, type) {
6
+ const layer = CAGradientLayer.new();
7
+ layer.type =
8
+ type === 'linear'
9
+ ? kCAGradientLayerAxial
10
+ : type === 'radial'
11
+ ? kCAGradientLayerRadial
12
+ : kCAGradientLayerConic;
13
+ let current;
14
+ let generation = 0;
15
+ const native = () => view.nativeViewProtected;
16
+ const size = () => {
17
+ const bounds = native()?.layer.bounds;
18
+ return { width: bounds?.size.width ?? 0, height: bounds?.size.height ?? 0 };
19
+ };
20
+ const values = (frame) => {
21
+ const { width, height } = size();
22
+ const { start, end: toward } = gradientPoints(type, frame, width, height);
23
+ // Core Animation starts a conic gradient on the side opposite its end point.
24
+ const end = type === 'conic' ? { x: 2 * start.x - toward.x, y: 2 * start.y - toward.y } : toward;
25
+ return {
26
+ colors: NSArray.arrayWithArray(frame.colors.map((argb) => new Color(argb).ios.CGColor)),
27
+ locations: NSArray.arrayWithArray(frame.stops),
28
+ startPoint: NSValue.valueWithCGPoint(CGPointMake(start.x, start.y)),
29
+ endPoint: NSValue.valueWithCGPoint(CGPointMake(end.x, end.y)),
30
+ };
31
+ };
32
+ const attach = () => {
33
+ const host = native();
34
+ if (!host)
35
+ return;
36
+ CATransaction.begin();
37
+ CATransaction.setDisableActions(true);
38
+ if (layer.superlayer !== host.layer)
39
+ host.layer.insertSublayerAtIndex(layer, 0);
40
+ layer.frame = host.layer.bounds;
41
+ layer.cornerRadius = host.layer.cornerRadius;
42
+ if (current) {
43
+ const model = values(current);
44
+ layer.colors = model.colors;
45
+ layer.locations = model.locations;
46
+ layer.startPoint = model.startPoint.CGPointValue;
47
+ layer.endPoint = model.endPoint.CGPointValue;
48
+ }
49
+ CATransaction.commit();
50
+ };
51
+ view.on('loaded', attach);
52
+ view.on('layoutChanged', attach);
53
+ return {
54
+ paint(frame) {
55
+ current = frame;
56
+ generation++;
57
+ for (const key of keys)
58
+ layer.removeAnimationForKey(`jolt:gradient:${key}`);
59
+ attach();
60
+ },
61
+ play(frames, times, timing, onEnd) {
62
+ const instance = ++generation;
63
+ current = frames[frames.length - 1];
64
+ attach();
65
+ const sampled = frames.map(values);
66
+ const now = CACurrentMediaTime();
67
+ CATransaction.begin();
68
+ if (timing.repeat !== Infinity)
69
+ CATransaction.setCompletionBlock(() => {
70
+ if (instance === generation)
71
+ onEnd(true);
72
+ });
73
+ for (const key of keys) {
74
+ const animation = CAKeyframeAnimation.animationWithKeyPath(key);
75
+ animation.values = NSArray.arrayWithArray(sampled.map((value) => value[key]));
76
+ animation.keyTimes = NSArray.arrayWithArray(times);
77
+ animation.duration = Math.max(timing.duration, 1) / 1000;
78
+ animation.beginTime = layer.convertTimeFromLayer(now + timing.delay / 1000, null);
79
+ animation.fillMode = kCAFillModeBackwards;
80
+ if (timing.repeat > 0) {
81
+ animation.autoreverses = timing.reverse;
82
+ animation.repeatCount = timing.reverse
83
+ ? (timing.repeat + 1) / 2
84
+ : timing.repeat + 1;
85
+ }
86
+ layer.addAnimationForKey(animation, `jolt:gradient:${key}`);
87
+ }
88
+ CATransaction.commit();
89
+ return {
90
+ cancel() {
91
+ if (instance !== generation)
92
+ return;
93
+ generation++;
94
+ for (const key of keys)
95
+ layer.removeAnimationForKey(`jolt:gradient:${key}`);
96
+ onEnd(false);
97
+ },
98
+ };
99
+ },
100
+ remove() {
101
+ generation++;
102
+ view.off('loaded', attach);
103
+ view.off('layoutChanged', attach);
104
+ layer.removeAllAnimations();
105
+ layer.removeFromSuperlayer();
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=ios-gradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-gradient.js","sourceRoot":"","sources":["../../src/driver/ios-gradient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type View } from '@nativescript/core';
2
+ import { type ColorValue } from './color.js';
3
+ import type { Animation } from './engine.js';
4
+ import { type SpringName, type Transition } from './transition.js';
5
+ import type { Target } from './types.js';
6
+ export type GradientType = 'linear' | 'radial' | 'conic';
7
+ export interface GradientValues {
8
+ /** Two to eight colors. Animating keeps the count. */
9
+ colors?: readonly ColorValue[];
10
+ /** Where each color sits, from 0 to 1. Evenly spaced by default. */
11
+ stops?: readonly number[];
12
+ /** Degrees, like CSS: `linear` points this way (180 runs top to bottom), `conic` starts here (0 is up). */
13
+ angle?: number;
14
+ /** `radial` and `conic`: the center, in fractions of the view's width and height. */
15
+ center?: {
16
+ readonly x: number;
17
+ readonly y: number;
18
+ };
19
+ /** `radial`: the radius, in fractions of the view's shorter side. */
20
+ radius?: number;
21
+ }
22
+ export interface GradientOptions extends GradientValues {
23
+ type: GradientType;
24
+ colors: readonly ColorValue[];
25
+ }
26
+ export interface Gradient {
27
+ readonly type: GradientType;
28
+ /** Animates to new values from the ones on screen. Colors and stops keep their count. */
29
+ animate(values: GradientValues, transition?: Transition | SpringName): Animation;
30
+ /** Applies values at once, stopping the animation in progress. */
31
+ set(values: GradientValues): void;
32
+ /** Stops the animation in progress where it is. */
33
+ stop(): void;
34
+ /** Takes the gradient off the view. */
35
+ remove(): void;
36
+ }
37
+ /** Everything the platform needs to paint one frame. */
38
+ export interface GradientFrame {
39
+ colors: number[];
40
+ stops: number[];
41
+ angle: number;
42
+ x: number;
43
+ y: number;
44
+ radius: number;
45
+ }
46
+ export interface GradientTiming {
47
+ duration: number;
48
+ delay: number;
49
+ repeat: number;
50
+ reverse: boolean;
51
+ }
52
+ export interface GradientPainter {
53
+ paint(frame: GradientFrame): void;
54
+ /** Plays sampled frames natively; `onEnd(false)` when cancelled. */
55
+ play(frames: readonly GradientFrame[], times: readonly number[], timing: GradientTiming, onEnd: (finished: boolean) => void): {
56
+ cancel(): void;
57
+ };
58
+ remove(): void;
59
+ }
60
+ type PainterFactory = (view: View, type: GradientType) => GradientPainter | undefined;
61
+ /** Test seam, like `setDriver`. */
62
+ export declare function setGradientPainter(next: PainterFactory | undefined): void;
63
+ /**
64
+ * Paints a native gradient behind a layout's children and animates it.
65
+ *
66
+ * ```ts
67
+ * const glow = gradient(halo, { type: 'radial', colors: ['#FF0080', '#7928CA00'], radius: 0.8 })
68
+ * glow.animate({ center: { x: 0.8, y: 0.2 }, radius: 1.2 }, { duration: 2000 })
69
+ * ```
70
+ */
71
+ export declare function gradient(target: Target, options: GradientOptions): Gradient;
72
+ /** One frame between two states. Geometry follows the curve, overshoot included; colors and stops stay between their ends. */
73
+ export declare function mix(from: GradientFrame, to: GradientFrame, progress: number, reduced?: boolean): GradientFrame;
74
+ /**
75
+ * The points a platform gradient needs, in unit coordinates of a `width` × `height` box.
76
+ * Linear follows CSS: the line runs through the center at `angle` and is long enough
77
+ * for the corners to get the first and last colors.
78
+ */
79
+ export declare function gradientPoints(type: GradientType, frame: GradientFrame, width: number, height: number): {
80
+ start: {
81
+ x: number;
82
+ y: number;
83
+ };
84
+ end: {
85
+ x: number;
86
+ y: number;
87
+ };
88
+ };
89
+ export {};
90
+ //# sourceMappingURL=gradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient.d.ts","sourceRoot":"","sources":["../src/gradient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import { isAndroid, isIOS } from '@nativescript/core';
2
+ import { toView } from './animate.js';
3
+ import { colorMixer, parseColor } from './color.js';
4
+ import { reducedMotion } from './config.js';
5
+ import { getDriver } from './driver/index.js';
6
+ import { androidGradient } from './driver/android-gradient.js';
7
+ import { iosGradient } from './driver/ios-gradient.js';
8
+ import { createTrack } from './track.js';
9
+ import { resolveTransition, springs, } from './transition.js';
10
+ let factory;
11
+ /** Test seam, like `setDriver`. */
12
+ export function setGradientPainter(next) {
13
+ factory = next;
14
+ }
15
+ function platformPainter(view, type) {
16
+ if (isIOS)
17
+ return iosGradient(view, type);
18
+ if (isAndroid)
19
+ return androidGradient(view, type);
20
+ return undefined;
21
+ }
22
+ const types = ['linear', 'radial', 'conic'];
23
+ /**
24
+ * Paints a native gradient behind a layout's children and animates it.
25
+ *
26
+ * ```ts
27
+ * const glow = gradient(halo, { type: 'radial', colors: ['#FF0080', '#7928CA00'], radius: 0.8 })
28
+ * glow.animate({ center: { x: 0.8, y: 0.2 }, radius: 1.2 }, { duration: 2000 })
29
+ * ```
30
+ */
31
+ export function gradient(target, options) {
32
+ const view = toView(target);
33
+ if (!options || !types.includes(options.type))
34
+ throw new TypeError(`Gradient type must be 'linear', 'radial' or 'conic'.`);
35
+ const first = resolve({ colors: [], stops: [], angle: 180, x: 0.5, y: 0.5, radius: 0.5 }, options, false);
36
+ return new GradientController(view, options.type, first);
37
+ }
38
+ class GradientController {
39
+ view;
40
+ type;
41
+ painter;
42
+ pending;
43
+ removed = false;
44
+ model;
45
+ running;
46
+ constructor(view, type, frame) {
47
+ this.view = view;
48
+ this.type = type;
49
+ this.model = frame;
50
+ this.attach((factory ?? platformPainter)(view, type));
51
+ view.on('unloaded', this.unloaded);
52
+ }
53
+ unloaded = () => this.stop();
54
+ attach(painter) {
55
+ if (!painter)
56
+ return;
57
+ if (this.removed)
58
+ return painter.remove();
59
+ this.painter = painter;
60
+ painter.paint(this.pending ?? this.model);
61
+ this.pending = undefined;
62
+ }
63
+ animate(values, transition) {
64
+ this.assertActive();
65
+ const from = this.presented();
66
+ const to = resolve(from, values, true);
67
+ const resolved = typeof transition === 'string' ? springOf(transition) : (transition ?? {});
68
+ const track = createTrack('opacity', [0, 1], resolveTransition(resolved, 'opacity', 2), 0);
69
+ const reduced = reducedMotion();
70
+ const frameAt = (progress) => mix(from, to, progress, reduced);
71
+ this.cancelRunning();
72
+ this.model = frameAt(track.to);
73
+ let settle;
74
+ const finished = new Promise((resolve) => (settle = resolve));
75
+ const animation = {
76
+ finished,
77
+ stop: () => {
78
+ if (this.running?.settle === settle)
79
+ this.stop();
80
+ },
81
+ then: (onfulfilled, onrejected) => finished.then(onfulfilled, onrejected),
82
+ };
83
+ if (track.end === 0 || !this.painter) {
84
+ this.paint(this.model);
85
+ settle(true);
86
+ return animation;
87
+ }
88
+ const handle = this.painter.play(track.values.map(frameAt), track.times, {
89
+ duration: track.duration,
90
+ delay: track.delay,
91
+ repeat: track.repeat,
92
+ reverse: track.reverse,
93
+ }, (completed) => {
94
+ if (this.running?.settle !== settle)
95
+ return;
96
+ this.running = undefined;
97
+ settle(completed);
98
+ });
99
+ this.running = {
100
+ from,
101
+ to,
102
+ track,
103
+ startedAt: getDriver().now(),
104
+ handle,
105
+ settle,
106
+ };
107
+ return animation;
108
+ }
109
+ set(values) {
110
+ this.assertActive();
111
+ const next = resolve(this.presented(), values, false);
112
+ this.cancelRunning();
113
+ this.model = next;
114
+ this.paint(next);
115
+ }
116
+ stop() {
117
+ if (!this.running)
118
+ return;
119
+ const current = this.presented();
120
+ this.cancelRunning();
121
+ this.model = current;
122
+ this.paint(current);
123
+ }
124
+ remove() {
125
+ if (this.removed)
126
+ return;
127
+ this.cancelRunning();
128
+ this.removed = true;
129
+ this.view.off('unloaded', this.unloaded);
130
+ this.painter?.remove();
131
+ this.painter = undefined;
132
+ }
133
+ paint(frame) {
134
+ if (this.painter)
135
+ this.painter.paint(frame);
136
+ else
137
+ this.pending = frame;
138
+ }
139
+ presented() {
140
+ const running = this.running;
141
+ if (!running)
142
+ return this.model;
143
+ const elapsed = getDriver().now() - running.startedAt;
144
+ return mix(running.from, running.to, running.track.valueAt(elapsed), reducedMotion());
145
+ }
146
+ cancelRunning() {
147
+ const running = this.running;
148
+ if (!running)
149
+ return;
150
+ this.running = undefined;
151
+ running.handle.cancel();
152
+ running.settle(false);
153
+ }
154
+ assertActive() {
155
+ if (this.removed)
156
+ throw new Error('This gradient was removed.');
157
+ }
158
+ }
159
+ function springOf(name) {
160
+ const spring = springs[name];
161
+ if (!spring || !Object.hasOwn(springs, name))
162
+ throw new Error(`Unknown spring "${name}".`);
163
+ return spring;
164
+ }
165
+ /** Validates values and fills in what they leave out from `base`. */
166
+ function resolve(base, values, sameCount) {
167
+ if (!values || typeof values !== 'object')
168
+ throw new TypeError('Gradient values must be an object.');
169
+ const colors = values.colors ? values.colors.map(parseColor) : base.colors;
170
+ if (colors.length < 2 || colors.length > 8)
171
+ throw new RangeError('A gradient needs between two and eight colors.');
172
+ if (sameCount && values.colors && colors.length !== base.colors.length)
173
+ throw new RangeError(`Animating a gradient keeps its ${base.colors.length} colors; use set() to change the count.`);
174
+ const stops = values.stops
175
+ ? [...values.stops]
176
+ : values.colors || base.stops.length !== colors.length
177
+ ? colors.map((_, i) => i / (colors.length - 1))
178
+ : base.stops;
179
+ if (stops.length !== colors.length ||
180
+ stops.some((stop, i) => !Number.isFinite(stop) || stop < 0 || stop > 1 || stop < (stops[i - 1] ?? 0)))
181
+ throw new RangeError('Gradient stops need one value per color, from 0 to 1, without going back.');
182
+ const angle = values.angle ?? base.angle;
183
+ const x = values.center?.x ?? base.x;
184
+ const y = values.center?.y ?? base.y;
185
+ const radius = values.radius ?? base.radius;
186
+ for (const [name, value] of [
187
+ ['angle', angle],
188
+ ['center', x],
189
+ ['center', y],
190
+ ['radius', radius],
191
+ ])
192
+ if (!Number.isFinite(value))
193
+ throw new RangeError(`Invalid gradient ${name}: ${value}.`);
194
+ if (radius < 0)
195
+ throw new RangeError(`Gradient radius must not be negative, got ${radius}.`);
196
+ return { colors, stops, angle, x, y, radius };
197
+ }
198
+ /** One frame between two states. Geometry follows the curve, overshoot included; colors and stops stay between their ends. */
199
+ export function mix(from, to, progress, reduced = false) {
200
+ const p = Math.min(Math.max(progress, 0), 1);
201
+ const g = reduced ? 1 : progress;
202
+ const lerp = (a, b, t) => a + (b - a) * t;
203
+ return {
204
+ colors: to.colors.map((color, i) => colorMixer(from.colors[i] ?? color, color)(p)),
205
+ stops: to.stops.map((stop, i) => lerp(from.stops[i] ?? stop, stop, p)),
206
+ angle: lerp(from.angle, to.angle, g),
207
+ x: lerp(from.x, to.x, g),
208
+ y: lerp(from.y, to.y, g),
209
+ radius: Math.max(0, lerp(from.radius, to.radius, g)),
210
+ };
211
+ }
212
+ /**
213
+ * The points a platform gradient needs, in unit coordinates of a `width` × `height` box.
214
+ * Linear follows CSS: the line runs through the center at `angle` and is long enough
215
+ * for the corners to get the first and last colors.
216
+ */
217
+ export function gradientPoints(type, frame, width, height) {
218
+ const radians = (frame.angle * Math.PI) / 180;
219
+ const sin = Math.sin(radians);
220
+ const cos = Math.cos(radians);
221
+ if (type === 'linear') {
222
+ const length = Math.abs(width * sin) + Math.abs(height * cos);
223
+ const dx = width > 0 ? (sin * length) / (2 * width) : 0;
224
+ const dy = height > 0 ? (-cos * length) / (2 * height) : 0;
225
+ return { start: { x: 0.5 - dx, y: 0.5 - dy }, end: { x: 0.5 + dx, y: 0.5 + dy } };
226
+ }
227
+ const center = { x: frame.x, y: frame.y };
228
+ const shorter = Math.min(width, height);
229
+ if (type === 'radial') {
230
+ const r = frame.radius * shorter;
231
+ return {
232
+ start: center,
233
+ end: {
234
+ x: center.x + (width > 0 ? r / width : 0),
235
+ y: center.y + (height > 0 ? r / height : 0),
236
+ },
237
+ };
238
+ }
239
+ return {
240
+ start: center,
241
+ end: {
242
+ x: center.x + (width > 0 ? (sin * shorter) / (2 * width) : 0),
243
+ y: center.y + (height > 0 ? (-cos * shorter) / (2 * height) : 0),
244
+ },
245
+ };
246
+ }
247
+ //# sourceMappingURL=gradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient.js","sourceRoot":"","sources":["../src/gradient.ts"],"names":[],"mappings":"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"}