@rafaelaugusto/jolt 0.1.0-beta.6 → 0.1.0-beta.7
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.
- package/README.md +12 -2
- package/dist/image-effect-native.d.ts +26 -0
- package/dist/image-effect-native.d.ts.map +1 -0
- package/dist/image-effect-native.js +73 -0
- package/dist/image-effect-native.js.map +1 -0
- package/dist/image-effect.d.ts +50 -0
- package/dist/image-effect.d.ts.map +1 -0
- package/dist/image-effect.js +290 -0
- package/dist/image-effect.js.map +1 -0
- package/dist/image-owner.d.ts +3 -0
- package/dist/image-owner.d.ts.map +1 -0
- package/dist/image-owner.js +11 -0
- package/dist/image-owner.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/liquid.d.ts.map +1 -1
- package/dist/liquid.js +4 -0
- package/dist/liquid.js.map +1 -1
- package/dist/zoom-native.d.ts +30 -0
- package/dist/zoom-native.d.ts.map +1 -0
- package/dist/zoom-native.js +56 -0
- package/dist/zoom-native.js.map +1 -0
- package/dist/zoomable.d.ts +48 -0
- package/dist/zoomable.d.ts.map +1 -0
- package/dist/zoomable.js +249 -0
- package/dist/zoomable.js.map +1 -0
- package/package.json +2 -1
- package/platforms/android/java/org/rafaelaugusto/jolt/ImageEffect.java +288 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/PhotoZoom.java +250 -0
- package/platforms/android/proguard-rules.pro +4 -0
- package/platforms/ios/build.xcconfig +1 -0
- package/platforms/ios/src/JoltImageEffect.h +25 -0
- package/platforms/ios/src/JoltImageEffect.mm +242 -0
- package/platforms/ios/src/JoltPhotoZoom.h +23 -0
- package/platforms/ios/src/JoltPhotoZoom.m +229 -0
- package/platforms/ios/src/module.modulemap +5 -0
- package/src/android-plugin.d.ts +78 -0
- package/src/image-effect-native.ts +129 -0
- package/src/image-effect.ts +336 -0
- package/src/image-owner.ts +12 -0
- package/src/index.ts +9 -0
- package/src/ios-plugin.d.ts +59 -0
- package/src/liquid.ts +4 -0
- package/src/zoom-native.ts +124 -0
- package/src/zoomable.ts +330 -0
package/README.md
CHANGED
|
@@ -50,6 +50,8 @@ Jolt computes the motion once, in JavaScript, when the animation starts, and han
|
|
|
50
50
|
- [SF Symbol effects](#sf-symbols) and animated icon replacement on iOS 17+.
|
|
51
51
|
- [Shimmer](#shimmer) for loading placeholders on iOS.
|
|
52
52
|
- [Liquid images](#liquid-images) with native texture deformation on iOS.
|
|
53
|
+
- [Image effects](https://jolt.rafaelaugusto.dev/guide/image-effects): ripple, touch distortion and dissolve with native Metal/AGSL rendering and explicit fallback.
|
|
54
|
+
- [Photo zoom and pan](https://jolt.rafaelaugusto.dev/guide/photo-zoom): native pinch, double tap, bounds and vertical dismissal intents.
|
|
53
55
|
- [Loaders](#loaders) with dots, bars and ring styles on iOS.
|
|
54
56
|
- [Circular reveal](#circular-reveal) to show or hide content from a point on iOS.
|
|
55
57
|
- [Haptics](#haptics) at arrival or at marked points in an animation on iOS.
|
|
@@ -563,9 +565,17 @@ Each running property remembers its curve and start time. On Android, interrupti
|
|
|
563
565
|
|
|
564
566
|
## Demo
|
|
565
567
|
|
|
566
|
-
[`demo/`](./demo) opens an interactive assistant on iOS: a fan of document tools, a voice screen with letter-by-letter text, and a staged conversation with document previews. Open **Help → Watch demo** to replay the flow. The orb is an animated illustration; speech, documents and audio are sample data.
|
|
568
|
+
[`demo/`](./demo) opens an interactive assistant on iOS and Android: a fan of document tools, a voice screen with letter-by-letter text, and a staged conversation with document previews and a rolling countdown, with the screens cross-fading through the Vue entry. Open **Help → Watch demo** to replay the flow. The orb is an animated illustration; speech, documents and audio are sample data.
|
|
567
569
|
|
|
568
|
-
|
|
570
|
+
| Assistant | Presets | Springs | Stagger |
|
|
571
|
+
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: |
|
|
572
|
+
| <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-assistant.gif" width="200" alt="The assistant replaying its flow on iOS"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-presets.gif" width="200" alt="fadeInUp, popIn and shake"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-springs.gif" width="200" alt="smooth, snappy and bouncy springs on an interruptible ball"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-stagger.gif" width="200" alt="Rows entering with a stagger"> |
|
|
573
|
+
|
|
574
|
+
| Sequences | Press (Android) | Rolling numbers | Text (Android) |
|
|
575
|
+
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: |
|
|
576
|
+
| <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-sequences.gif" width="200" alt="Overlapping steps and steps in order"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-press-android.gif" width="200" alt="Three press effects"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-rolling.gif" width="200" alt="Digits rolling up and down"> | <img src="https://raw.githubusercontent.com/rafaelaugustos/jolt/main/.github/assets/demo-text-android.gif" width="200" alt="Letter and word entrances"> |
|
|
577
|
+
|
|
578
|
+
The animation playground opens with `--playground` on iOS and `--es playground true` on Android, with presets, interruptible springs, decay, text, press effects, list rows, the keyboard composer and the native iOS helpers. See the [demo guide](./docs/guide/demo.md) for preview arguments and implementation notes. Each page of the [documentation](https://jolt.rafaelaugusto.dev) opens with a clip of its feature.
|
|
569
579
|
|
|
570
580
|
With the [NativeScript CLI](https://docs.nativescript.org/setup/) installed:
|
|
571
581
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Image, type ImageSource } from '@nativescript/core';
|
|
2
|
+
export interface ImageEffectSettings {
|
|
3
|
+
mode: number;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
amplitude: number;
|
|
7
|
+
radius: number;
|
|
8
|
+
duration: number;
|
|
9
|
+
seed: number;
|
|
10
|
+
to?: ImageSource;
|
|
11
|
+
}
|
|
12
|
+
export interface ImageRenderer {
|
|
13
|
+
readonly backend: 'metal' | 'agsl';
|
|
14
|
+
readonly progress: number;
|
|
15
|
+
readonly frames: number;
|
|
16
|
+
readonly textureBytes: number;
|
|
17
|
+
readonly longestFrameMs: number;
|
|
18
|
+
play(endpoint: number): void;
|
|
19
|
+
pause(): void;
|
|
20
|
+
resume(): void;
|
|
21
|
+
seek(progress: number): void;
|
|
22
|
+
finish(endpoint: number): void;
|
|
23
|
+
stop(preserveImage?: boolean): void;
|
|
24
|
+
}
|
|
25
|
+
export declare function createImageRenderer(image: Image, settings: ImageEffectSettings, ended: (completed: boolean, progress: number) => void): ImageRenderer | undefined;
|
|
26
|
+
//# sourceMappingURL=image-effect-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-effect-native.d.ts","sourceRoot":"","sources":["../src/image-effect-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAE1F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,WAAW,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,IAAI,IAAI,CAAA;IACd,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CACpC;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GACpD,aAAa,GAAG,SAAS,CAiG3B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Utils, isAndroid, isIOS } from '@nativescript/core';
|
|
2
|
+
export function createImageRenderer(image, settings, ended) {
|
|
3
|
+
const { mode, x, y, amplitude, radius, duration, seed, to } = settings;
|
|
4
|
+
if (isIOS && typeof JoltImageEffect !== 'undefined') {
|
|
5
|
+
const native = JoltImageEffect.createWithViewDestinationModeOriginXOriginYAmplitudeRadiusDurationSeedListener(image.nativeViewProtected, to?.ios ?? null, mode, x, y, amplitude, radius, duration, seed, ended);
|
|
6
|
+
if (!native)
|
|
7
|
+
return undefined;
|
|
8
|
+
return {
|
|
9
|
+
backend: 'metal',
|
|
10
|
+
get progress() {
|
|
11
|
+
return native.progress;
|
|
12
|
+
},
|
|
13
|
+
get frames() {
|
|
14
|
+
return native.frames;
|
|
15
|
+
},
|
|
16
|
+
get textureBytes() {
|
|
17
|
+
return native.textureBytes;
|
|
18
|
+
},
|
|
19
|
+
get longestFrameMs() {
|
|
20
|
+
return native.longestFrame * 1000;
|
|
21
|
+
},
|
|
22
|
+
play: (p) => native.play(p),
|
|
23
|
+
pause: () => native.pause(),
|
|
24
|
+
resume: () => native.resume(),
|
|
25
|
+
seek: (p) => native.seek(p),
|
|
26
|
+
finish: (p) => native.finish(p),
|
|
27
|
+
stop: (preserveImage) => preserveImage ? native.stopPreservingImage() : native.stop(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (isAndroid && android.os.Build.VERSION.SDK_INT >= 33) {
|
|
31
|
+
const density = Utils.layout.getDisplayDensity();
|
|
32
|
+
const background = image.nativeViewProtected.getBackground();
|
|
33
|
+
// NativeScript draws bitmap pixels itself: ImageView.getImageMatrix() does
|
|
34
|
+
// not describe its stretch, EXIF rotation or inner border clipping.
|
|
35
|
+
const geometry = Array.create('float', 6);
|
|
36
|
+
geometry[0] = image.imageSource?.rotationAngle ?? 0;
|
|
37
|
+
geometry[1] = to?.rotationAngle ?? 0;
|
|
38
|
+
const corners = ['TopLeft', 'TopRight', 'BottomRight', 'BottomLeft'];
|
|
39
|
+
corners.forEach((corner, i) => {
|
|
40
|
+
geometry[i + 2] = background?.[`getBorder${corner}Radius`]?.() ?? 0;
|
|
41
|
+
});
|
|
42
|
+
const native = new org.rafaelaugusto.jolt.ImageEffect(image.nativeViewProtected, image.imageSource?.android ?? null, to?.android ?? null, geometry, mode, x * density, y * density, amplitude * density, radius * density, duration, seed, image
|
|
43
|
+
.touchListener ?? null, new org.rafaelaugusto.jolt.ImageEffect.Listener({ onEnd: ended }));
|
|
44
|
+
if (!native.isSupported()) {
|
|
45
|
+
const reason = native.getFailureReason();
|
|
46
|
+
native.stop();
|
|
47
|
+
throw new Error(reason);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
backend: 'agsl',
|
|
51
|
+
get progress() {
|
|
52
|
+
return native.getProgress();
|
|
53
|
+
},
|
|
54
|
+
get frames() {
|
|
55
|
+
return native.getFrames();
|
|
56
|
+
},
|
|
57
|
+
get textureBytes() {
|
|
58
|
+
return native.getTextureBytes();
|
|
59
|
+
},
|
|
60
|
+
get longestFrameMs() {
|
|
61
|
+
return native.getLongestFrameNanos() / 1e6;
|
|
62
|
+
},
|
|
63
|
+
play: (p) => native.play(p),
|
|
64
|
+
pause: () => native.pause(),
|
|
65
|
+
resume: () => native.resume(),
|
|
66
|
+
seek: (p) => native.seek(p),
|
|
67
|
+
finish: (p) => native.finish(p),
|
|
68
|
+
stop: (preserveImage) => preserveImage ? native.stopPreservingImage() : native.stop(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=image-effect-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-effect-native.js","sourceRoot":"","sources":["../src/image-effect-native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ImageSource } from '@nativescript/core';
|
|
2
|
+
import type { Animation } from './engine.js';
|
|
3
|
+
import type { Target } from './types.js';
|
|
4
|
+
export type ImageEffectName = 'ripple' | 'distortion' | 'dissolve';
|
|
5
|
+
export interface ImageEffectOptions {
|
|
6
|
+
/** Origin in target-local DIPs; defaults to the center. */
|
|
7
|
+
origin?: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
};
|
|
11
|
+
/** Maximum displacement in DIPs, 0..64. Defaults to 8. */
|
|
12
|
+
amplitude?: number;
|
|
13
|
+
/** Influence radius in DIPs, greater than zero. Defaults to 96. */
|
|
14
|
+
radius?: number;
|
|
15
|
+
/** Milliseconds for a finite effect (or drag release). Defaults to 650. */
|
|
16
|
+
duration?: number;
|
|
17
|
+
/** Deterministic dissolve noise seed, 0..65535. Defaults to 1. */
|
|
18
|
+
seed?: number;
|
|
19
|
+
/** Loaded destination raster for dissolve. */
|
|
20
|
+
to?: ImageSource;
|
|
21
|
+
/** Prepare at progress zero without starting. */
|
|
22
|
+
paused?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface ImageEffectDiagnostics {
|
|
25
|
+
backend: 'waiting' | 'metal' | 'agsl' | 'fallback';
|
|
26
|
+
reason?: 'reduced-motion' | 'unsupported' | 'not-visible';
|
|
27
|
+
/** Native setup error, when available. Intended for developer diagnostics. */
|
|
28
|
+
detail?: string;
|
|
29
|
+
frames: number;
|
|
30
|
+
textureBytes: number;
|
|
31
|
+
peakTextureBytes: number;
|
|
32
|
+
preparationMs: number;
|
|
33
|
+
longestFrameMs: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ImageEffect extends Animation {
|
|
36
|
+
readonly effect: ImageEffectName;
|
|
37
|
+
readonly paused: boolean;
|
|
38
|
+
/** Finite progress; distortion rejects seeking because it follows native touch input. */
|
|
39
|
+
progress: number;
|
|
40
|
+
readonly diagnostics: Readonly<ImageEffectDiagnostics>;
|
|
41
|
+
pause(): void;
|
|
42
|
+
play(): void;
|
|
43
|
+
/** Reverse a finite effect from its current pixels. Terminal handles remain terminal. */
|
|
44
|
+
reverse(): void;
|
|
45
|
+
/** Complete immediately at the current direction's endpoint. */
|
|
46
|
+
finish(): void;
|
|
47
|
+
}
|
|
48
|
+
/** Optional native image effects. Stop restores the source; dissolve completion commits its destination. */
|
|
49
|
+
export declare function imageEffect(target: Target, effect: ImageEffectName, options?: ImageEffectOptions): ImageEffect;
|
|
50
|
+
//# sourceMappingURL=image-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-effect.d.ts","sourceRoot":"","sources":["../src/image-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAGZ,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAA;AAClE,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8CAA8C;IAC9C,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AACD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAA;IAClD,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAA;IACzD,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB;AACD,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAA;IACtD,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,yFAAyF;IACzF,OAAO,IAAI,IAAI,CAAA;IACf,gEAAgE;IAChE,MAAM,IAAI,IAAI,CAAA;CACf;AAcD,4GAA4G;AAC5G,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CA8Cb"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { Application, Image, ImageSource, isIOS, } from '@nativescript/core';
|
|
2
|
+
import { toView } from './animate.js';
|
|
3
|
+
import { reducedMotion, timeScale } from './config.js';
|
|
4
|
+
import { ownImage } from './image-owner.js';
|
|
5
|
+
import { createImageRenderer } from './image-effect-native.js';
|
|
6
|
+
const names = ['ripple', 'distortion', 'dissolve'];
|
|
7
|
+
const surfaceChanges = [
|
|
8
|
+
'tintColorChange',
|
|
9
|
+
...['TopLeft', 'TopRight', 'BottomRight', 'BottomLeft'].map((corner) => `border${corner}RadiusChange`),
|
|
10
|
+
...['Top', 'Right', 'Bottom', 'Left'].flatMap((edge) => [
|
|
11
|
+
`padding${edge}Change`,
|
|
12
|
+
`border${edge}WidthChange`,
|
|
13
|
+
]),
|
|
14
|
+
];
|
|
15
|
+
/** Optional native image effects. Stop restores the source; dissolve completion commits its destination. */
|
|
16
|
+
export function imageEffect(target, effect, options = {}) {
|
|
17
|
+
const image = toView(target);
|
|
18
|
+
if (!(image instanceof Image))
|
|
19
|
+
throw new TypeError('imageEffect() expects a NativeScript Image.');
|
|
20
|
+
if (!names.includes(effect))
|
|
21
|
+
throw new TypeError(`Unknown image effect: ${String(effect)}.`);
|
|
22
|
+
if (!options || typeof options !== 'object')
|
|
23
|
+
throw new TypeError('Image effect options must be an object.');
|
|
24
|
+
const amplitude = options.amplitude ?? 8, radius = options.radius ?? 96;
|
|
25
|
+
const duration = options.duration ?? 650, seed = options.seed ?? 1;
|
|
26
|
+
if (!Number.isFinite(amplitude) || amplitude < 0 || amplitude > 64)
|
|
27
|
+
throw new RangeError('Image displacement must be between 0 and 64 DIPs.');
|
|
28
|
+
if (!Number.isFinite(radius) ||
|
|
29
|
+
radius <= 0 ||
|
|
30
|
+
!Number.isFinite(duration) ||
|
|
31
|
+
duration <= 0)
|
|
32
|
+
throw new RangeError('Image radius and duration must be positive finite numbers.');
|
|
33
|
+
if (!Number.isInteger(seed) || seed < 0 || seed > 65535)
|
|
34
|
+
throw new RangeError('Image seed must be an integer between 0 and 65535.');
|
|
35
|
+
if (options.origin &&
|
|
36
|
+
(!Number.isFinite(options.origin.x) || !Number.isFinite(options.origin.y)))
|
|
37
|
+
throw new RangeError('Image origin must contain finite local coordinates.');
|
|
38
|
+
if (options.paused !== undefined && typeof options.paused !== 'boolean')
|
|
39
|
+
throw new TypeError('paused must be a boolean.');
|
|
40
|
+
if (effect === 'dissolve' &&
|
|
41
|
+
(!(options.to instanceof ImageSource) ||
|
|
42
|
+
!Number.isFinite(options.to.width) ||
|
|
43
|
+
!Number.isFinite(options.to.height) ||
|
|
44
|
+
options.to.width <= 0 ||
|
|
45
|
+
options.to.height <= 0))
|
|
46
|
+
throw new TypeError('Dissolve requires a loaded destination ImageSource.');
|
|
47
|
+
return new Effect(image, effect, {
|
|
48
|
+
...options,
|
|
49
|
+
amplitude,
|
|
50
|
+
radius,
|
|
51
|
+
duration: duration / timeScale(),
|
|
52
|
+
seed,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
class Effect {
|
|
56
|
+
image;
|
|
57
|
+
effect;
|
|
58
|
+
options;
|
|
59
|
+
finished;
|
|
60
|
+
resolve;
|
|
61
|
+
renderer;
|
|
62
|
+
releaseOwnership = () => { };
|
|
63
|
+
terminal = false;
|
|
64
|
+
queued = false;
|
|
65
|
+
committing = false;
|
|
66
|
+
userPaused;
|
|
67
|
+
suspended = false;
|
|
68
|
+
position = 0;
|
|
69
|
+
direction = 1;
|
|
70
|
+
dimensions = '';
|
|
71
|
+
stats = {
|
|
72
|
+
backend: 'waiting',
|
|
73
|
+
frames: 0,
|
|
74
|
+
textureBytes: 0,
|
|
75
|
+
peakTextureBytes: 0,
|
|
76
|
+
preparationMs: 0,
|
|
77
|
+
longestFrameMs: 0,
|
|
78
|
+
};
|
|
79
|
+
reduceObserver;
|
|
80
|
+
constructor(image, effect, options) {
|
|
81
|
+
this.image = image;
|
|
82
|
+
this.effect = effect;
|
|
83
|
+
this.options = options;
|
|
84
|
+
this.userPaused = options.paused ?? false;
|
|
85
|
+
this.finished = new Promise((resolve) => {
|
|
86
|
+
this.resolve = resolve;
|
|
87
|
+
});
|
|
88
|
+
this.releaseOwnership = ownImage(image, this.stop);
|
|
89
|
+
for (const event of ['loaded', 'layoutChanged'])
|
|
90
|
+
image.on(event, this.schedule);
|
|
91
|
+
for (const event of ['imageSourceChange', 'stretchChange'])
|
|
92
|
+
image.on(event, this.changed);
|
|
93
|
+
image.on('unloaded', this.stop);
|
|
94
|
+
image.style.on('visibilityChange', this.visible);
|
|
95
|
+
for (const event of surfaceChanges)
|
|
96
|
+
image.style.on(event, this.changed);
|
|
97
|
+
Application.on(Application.suspendEvent, this.suspend);
|
|
98
|
+
Application.on(Application.resumeEvent, this.resume);
|
|
99
|
+
if (isIOS)
|
|
100
|
+
this.reduceObserver = Application.ios.addNotificationObserver(UIAccessibilityReduceMotionStatusDidChangeNotification, this.preferences);
|
|
101
|
+
this.schedule();
|
|
102
|
+
}
|
|
103
|
+
then(fulfilled, rejected) {
|
|
104
|
+
return this.finished.then(fulfilled, rejected);
|
|
105
|
+
}
|
|
106
|
+
get paused() {
|
|
107
|
+
return this.userPaused;
|
|
108
|
+
}
|
|
109
|
+
get progress() {
|
|
110
|
+
return this.renderer?.progress ?? this.position;
|
|
111
|
+
}
|
|
112
|
+
set progress(value) {
|
|
113
|
+
if (this.effect === 'distortion')
|
|
114
|
+
throw new TypeError('Distortion follows touch input and cannot be scrubbed.');
|
|
115
|
+
if (!Number.isFinite(value) || value < 0 || value > 1)
|
|
116
|
+
throw new RangeError('Image progress must be between 0 and 1.');
|
|
117
|
+
if (this.terminal)
|
|
118
|
+
return;
|
|
119
|
+
this.position = value;
|
|
120
|
+
this.renderer?.seek(value);
|
|
121
|
+
}
|
|
122
|
+
get diagnostics() {
|
|
123
|
+
return {
|
|
124
|
+
...this.stats,
|
|
125
|
+
...(this.renderer
|
|
126
|
+
? {
|
|
127
|
+
frames: this.renderer.frames,
|
|
128
|
+
textureBytes: this.renderer.textureBytes,
|
|
129
|
+
longestFrameMs: this.renderer.longestFrameMs,
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
pause = () => {
|
|
135
|
+
if (this.terminal)
|
|
136
|
+
return;
|
|
137
|
+
this.userPaused = true;
|
|
138
|
+
this.renderer?.pause();
|
|
139
|
+
};
|
|
140
|
+
play = () => {
|
|
141
|
+
if (this.terminal)
|
|
142
|
+
return;
|
|
143
|
+
this.userPaused = false;
|
|
144
|
+
if (this.suspended)
|
|
145
|
+
return;
|
|
146
|
+
if (this.renderer) {
|
|
147
|
+
if (this.effect === 'distortion')
|
|
148
|
+
this.renderer.resume();
|
|
149
|
+
else
|
|
150
|
+
this.renderer.play(this.direction);
|
|
151
|
+
}
|
|
152
|
+
else
|
|
153
|
+
this.schedule();
|
|
154
|
+
};
|
|
155
|
+
reverse = () => {
|
|
156
|
+
if (this.effect === 'distortion')
|
|
157
|
+
throw new TypeError('Distortion has no finite playback direction.');
|
|
158
|
+
if (this.terminal)
|
|
159
|
+
return;
|
|
160
|
+
this.direction = this.direction === 1 ? 0 : 1;
|
|
161
|
+
this.play();
|
|
162
|
+
};
|
|
163
|
+
finish = () => {
|
|
164
|
+
if (this.terminal)
|
|
165
|
+
return;
|
|
166
|
+
if (this.effect === 'distortion')
|
|
167
|
+
return this.stop();
|
|
168
|
+
this.complete(true, this.direction);
|
|
169
|
+
};
|
|
170
|
+
stop = () => this.complete(false, this.progress);
|
|
171
|
+
complete = (completed, position, preserveImage = false) => {
|
|
172
|
+
if (this.terminal)
|
|
173
|
+
return;
|
|
174
|
+
this.terminal = true;
|
|
175
|
+
this.position = position;
|
|
176
|
+
this.stats = { ...this.diagnostics, textureBytes: 0 };
|
|
177
|
+
this.renderer?.stop(preserveImage);
|
|
178
|
+
this.renderer = undefined;
|
|
179
|
+
this.releaseOwnership();
|
|
180
|
+
for (const event of ['loaded', 'layoutChanged'])
|
|
181
|
+
this.image.off(event, this.schedule);
|
|
182
|
+
for (const event of ['imageSourceChange', 'stretchChange'])
|
|
183
|
+
this.image.off(event, this.changed);
|
|
184
|
+
this.image.off('unloaded', this.stop);
|
|
185
|
+
this.image.style.off('visibilityChange', this.visible);
|
|
186
|
+
for (const event of surfaceChanges)
|
|
187
|
+
this.image.style.off(event, this.changed);
|
|
188
|
+
Application.off(Application.suspendEvent, this.suspend);
|
|
189
|
+
Application.off(Application.resumeEvent, this.resume);
|
|
190
|
+
if (this.reduceObserver)
|
|
191
|
+
Application.ios.removeNotificationObserver(this.reduceObserver, UIAccessibilityReduceMotionStatusDidChangeNotification);
|
|
192
|
+
this.reduceObserver = undefined;
|
|
193
|
+
if (completed && this.effect === 'dissolve' && position === 1) {
|
|
194
|
+
this.committing = true;
|
|
195
|
+
// The view may clear its ImageSource on disposal. Keep the caller's
|
|
196
|
+
// destination reusable by giving the view its own wrapper.
|
|
197
|
+
const destination = new ImageSource(this.options.to.getNativeSource());
|
|
198
|
+
destination.rotationAngle = this.options.to.rotationAngle;
|
|
199
|
+
this.image.imageSource = destination;
|
|
200
|
+
this.committing = false;
|
|
201
|
+
}
|
|
202
|
+
this.resolve(completed);
|
|
203
|
+
};
|
|
204
|
+
changed = (event) => {
|
|
205
|
+
if (this.committing)
|
|
206
|
+
return;
|
|
207
|
+
if (this.renderer)
|
|
208
|
+
this.complete(false, this.progress, event?.eventName === 'imageSourceChange');
|
|
209
|
+
else
|
|
210
|
+
this.schedule();
|
|
211
|
+
};
|
|
212
|
+
suspend = () => {
|
|
213
|
+
this.suspended = true;
|
|
214
|
+
this.renderer?.pause();
|
|
215
|
+
};
|
|
216
|
+
resume = () => {
|
|
217
|
+
this.suspended = false;
|
|
218
|
+
this.schedule();
|
|
219
|
+
if (!this.userPaused)
|
|
220
|
+
this.play();
|
|
221
|
+
};
|
|
222
|
+
visible = () => {
|
|
223
|
+
if (this.image.visibility !== 'visible')
|
|
224
|
+
this.stop();
|
|
225
|
+
};
|
|
226
|
+
preferences = () => {
|
|
227
|
+
if (reducedMotion())
|
|
228
|
+
this.fallback('reduced-motion');
|
|
229
|
+
};
|
|
230
|
+
fallback(reason) {
|
|
231
|
+
this.stats = { ...this.stats, backend: 'fallback', reason };
|
|
232
|
+
// Reduced/unsupported rendering still performs a requested content change.
|
|
233
|
+
if (this.effect === 'dissolve' && this.direction === 1) {
|
|
234
|
+
this.complete(true, 1);
|
|
235
|
+
}
|
|
236
|
+
else
|
|
237
|
+
this.complete(false, 0);
|
|
238
|
+
}
|
|
239
|
+
schedule = () => {
|
|
240
|
+
if (this.queued || this.terminal)
|
|
241
|
+
return;
|
|
242
|
+
this.queued = true;
|
|
243
|
+
void Promise.resolve().then(() => {
|
|
244
|
+
this.queued = false;
|
|
245
|
+
if (this.terminal || this.suspended || !this.image.isLoaded)
|
|
246
|
+
return;
|
|
247
|
+
if (reducedMotion())
|
|
248
|
+
return this.fallback('reduced-motion');
|
|
249
|
+
if (this.image.visibility !== 'visible')
|
|
250
|
+
return this.fallback('not-visible');
|
|
251
|
+
const { width, height } = this.image.getActualSize();
|
|
252
|
+
if (width <= 0 || height <= 0)
|
|
253
|
+
return;
|
|
254
|
+
const dimensions = `${width}:${height}`;
|
|
255
|
+
if (this.renderer) {
|
|
256
|
+
if (this.dimensions !== dimensions)
|
|
257
|
+
this.stop();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (!this.image.imageSource)
|
|
261
|
+
return;
|
|
262
|
+
this.dimensions = dimensions;
|
|
263
|
+
const started = Date.now();
|
|
264
|
+
try {
|
|
265
|
+
this.renderer = createImageRenderer(this.image, {
|
|
266
|
+
...this.options,
|
|
267
|
+
mode: names.indexOf(this.effect),
|
|
268
|
+
x: this.options.origin?.x ?? width / 2,
|
|
269
|
+
y: this.options.origin?.y ?? height / 2,
|
|
270
|
+
}, this.complete);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
this.stats.preparationMs = Date.now() - started;
|
|
274
|
+
this.stats.detail = String(error);
|
|
275
|
+
return this.fallback('unsupported');
|
|
276
|
+
}
|
|
277
|
+
if (!this.renderer)
|
|
278
|
+
return this.fallback('unsupported');
|
|
279
|
+
this.stats.backend = this.renderer.backend;
|
|
280
|
+
this.stats.preparationMs = Date.now() - started;
|
|
281
|
+
this.stats.peakTextureBytes = this.renderer.textureBytes;
|
|
282
|
+
this.renderer.pause();
|
|
283
|
+
if (this.position)
|
|
284
|
+
this.renderer.seek(this.position);
|
|
285
|
+
if (!this.userPaused && !this.suspended)
|
|
286
|
+
this.play();
|
|
287
|
+
});
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=image-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-effect.js","sourceRoot":"","sources":["../src/image-effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-owner.d.ts","sourceRoot":"","sources":["../src/image-owner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAK/C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAMnE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Rendering effects share one image surface; ordinary view transforms stay independent. */
|
|
2
|
+
const owners = new WeakMap();
|
|
3
|
+
export function ownImage(image, stop) {
|
|
4
|
+
owners.get(image)?.();
|
|
5
|
+
owners.set(image, stop);
|
|
6
|
+
return () => {
|
|
7
|
+
if (owners.get(image) === stop)
|
|
8
|
+
owners.delete(image);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=image-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-owner.js","sourceRoot":"","sources":["../src/image-owner.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,MAAM,MAAM,GAAG,IAAI,OAAO,EAAqB,CAAA;AAE/C,MAAM,UAAU,QAAQ,CAAC,KAAY,EAAE,IAAgB;IACrD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA;IACrB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE;QACV,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ export { shimmer } from './shimmer.js';
|
|
|
15
15
|
export type { ShimmerOptions } from './shimmer.js';
|
|
16
16
|
export { liquid } from './liquid.js';
|
|
17
17
|
export type { LiquidOptions, LiquidEffect } from './liquid.js';
|
|
18
|
+
export { imageEffect } from './image-effect.js';
|
|
19
|
+
export type { ImageEffect, ImageEffectName, ImageEffectOptions, ImageEffectDiagnostics, } from './image-effect.js';
|
|
20
|
+
export { zoomable } from './zoomable.js';
|
|
21
|
+
export type { Zoomable, ZoomableOptions, ZoomState, PhotoDismissal } from './zoomable.js';
|
|
18
22
|
export { loader } from './loader.js';
|
|
19
23
|
export type { LoaderOptions, LoaderStyle } from './loader.js';
|
|
20
24
|
export { reveal, conceal } from './reveal.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACpD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAClF,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC5D,mBAAmB,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ export { followKeyboard } from './keyboard.js';
|
|
|
7
7
|
export { confetti, particles } from './particles.js';
|
|
8
8
|
export { shimmer } from './shimmer.js';
|
|
9
9
|
export { liquid } from './liquid.js';
|
|
10
|
+
export { imageEffect } from './image-effect.js';
|
|
11
|
+
export { zoomable } from './zoomable.js';
|
|
10
12
|
export { loader } from './loader.js';
|
|
11
13
|
export { reveal, conceal } from './reveal.js';
|
|
12
14
|
export { animateText } from './text.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/liquid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liquid.d.ts","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"liquid.d.ts","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIxC,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,KAAK,IAAI,IAAI,CAAA;IACb,4CAA4C;IAC5C,MAAM,IAAI,IAAI,CAAA;IACd,2DAA2D;IAC3D,IAAI,IAAI,IAAI,CAAA;CACb;AASD,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAkBhF"}
|
package/dist/liquid.js
CHANGED
|
@@ -3,6 +3,7 @@ import { tintColorProperty } from '@nativescript/core/ui/image';
|
|
|
3
3
|
import { toView } from './animate.js';
|
|
4
4
|
import { liquidGrid } from './liquid-grid.js';
|
|
5
5
|
import { reducedMotion } from './config.js';
|
|
6
|
+
import { ownImage } from './image-owner.js';
|
|
6
7
|
const running = new WeakMap();
|
|
7
8
|
const key = 'jolt:liquid';
|
|
8
9
|
const columns = 24;
|
|
@@ -32,6 +33,7 @@ export function liquid(target, options = {}) {
|
|
|
32
33
|
class Liquid {
|
|
33
34
|
image;
|
|
34
35
|
settings;
|
|
36
|
+
releaseOwnership;
|
|
35
37
|
stopped = false;
|
|
36
38
|
queued = false;
|
|
37
39
|
pausedByUser = false;
|
|
@@ -46,6 +48,7 @@ class Liquid {
|
|
|
46
48
|
constructor(image, settings) {
|
|
47
49
|
this.image = image;
|
|
48
50
|
this.settings = settings;
|
|
51
|
+
this.releaseOwnership = ownImage(image, this.stop);
|
|
49
52
|
running.set(image, this);
|
|
50
53
|
for (const event of ['loaded', 'layoutChanged', 'imageSourceChange', 'stretchChange'])
|
|
51
54
|
image.on(event, this.schedule);
|
|
@@ -72,6 +75,7 @@ class Liquid {
|
|
|
72
75
|
if (this.stopped)
|
|
73
76
|
return;
|
|
74
77
|
this.stopped = true;
|
|
78
|
+
this.releaseOwnership?.();
|
|
75
79
|
for (const event of ['loaded', 'layoutChanged', 'imageSourceChange', 'stretchChange'])
|
|
76
80
|
this.image.off(event, this.schedule);
|
|
77
81
|
this.image.off('unloaded', this.unloaded);
|