zkit-ui 2.0.5 → 2.0.6
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 +1 -1
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryLayoutSupport.java → NativeImagePreviewLayoutSupport.java} +12 -12
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryMediaItem.java → NativeImagePreviewMediaItem.java} +2 -2
- package/android/src/main/java/cn/fontree/zkit/ui/preview/NativeImagePreviewModule.kt +43 -0
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryPagerAdapter.java → NativeImagePreviewPagerAdapter.java} +18 -18
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GallerySharedElementGeometry.java → NativeImagePreviewSharedElementGeometry.java} +2 -2
- package/android/src/main/java/cn/fontree/zkit/ui/preview/NativeImagePreviewSharedElementNames.java +39 -0
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GallerySharedElementState.java → NativeImagePreviewSharedElementState.java} +4 -4
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GallerySourceViewRegistry.java → NativeImagePreviewSourceViewRegistry.java} +2 -2
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryTransitionSnapshotView.java → NativeImagePreviewTransitionSnapshotView.java} +3 -3
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryVideoPlayerView.java → NativeImagePreviewVideoPlayerView.java} +7 -7
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GaleriaView.kt → NativeImagePreviewView.kt} +18 -18
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryViewerOverlayView.java → NativeImagePreviewViewerOverlayView.java} +49 -49
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryViewerPageView.java → NativeImagePreviewViewerPageView.java} +27 -27
- package/android/src/main/java/cn/fontree/zkit/ui/preview/{GalleryViewerTransitionController.java → NativeImagePreviewViewerTransitionController.java} +22 -22
- package/dist/ui/NativeImagePreview/NativeImagePreview.js +6 -6
- package/dist/ui/NativeImagePreview/NativeImagePreview.web.d.ts +1 -0
- package/dist/ui/NativeImagePreview/NativeImagePreview.web.d.ts.map +1 -1
- package/dist/ui/NativeImagePreview/NativeImagePreview.web.js +105 -11
- package/dist/ui/NativeImagePreview/context.d.ts +1 -1
- package/dist/ui/NativeImagePreview/context.d.ts.map +1 -1
- package/dist/ui/NativeImagePreview/types.d.ts +3 -1
- package/dist/ui/NativeImagePreview/types.d.ts.map +1 -1
- package/dist/ui/NativeImagePreview/utils.d.ts.map +1 -1
- package/dist/ui/NativeImagePreview/utils.js +1 -0
- package/dist/ui/NativeImagePreview/web/geometry.d.ts +20 -0
- package/dist/ui/NativeImagePreview/web/geometry.d.ts.map +1 -0
- package/dist/ui/NativeImagePreview/web/geometry.js +121 -0
- package/dist/ui/NativeImagePreview/web/media.d.ts +6 -0
- package/dist/ui/NativeImagePreview/web/media.d.ts.map +1 -0
- package/dist/ui/NativeImagePreview/web/media.js +90 -0
- package/dist/ui/NativeImagePreview/web/styles.css +137 -0
- package/dist/ui/NativeImagePreview/web/transition.d.ts +15 -0
- package/dist/ui/NativeImagePreview/web/transition.d.ts.map +1 -0
- package/dist/ui/NativeImagePreview/web/transition.js +77 -0
- package/dist/ui/NativeImagePreview/web/types.d.ts +74 -0
- package/dist/ui/NativeImagePreview/web/types.d.ts.map +1 -0
- package/dist/ui/NativeImagePreview/web/types.js +3 -0
- package/dist/ui/NativeImagePreview/web/viewer.d.ts +104 -0
- package/dist/ui/NativeImagePreview/web/viewer.d.ts.map +1 -0
- package/dist/ui/NativeImagePreview/web/viewer.js +894 -0
- package/expo-module.config.json +2 -2
- package/ios/{GalleryViewer/GaleriaImageLoader.swift → NativeImagePreview/NativeImagePreviewImageLoader.swift} +7 -7
- package/ios/NativeImagePreview/NativeImagePreviewImageViewInteraction.swift +245 -0
- package/ios/{GalleryViewer/GaleriaLayoutSupport.swift → NativeImagePreview/NativeImagePreviewLayoutSupport.swift} +19 -19
- package/ios/NativeImagePreview/NativeImagePreviewMedia.swift +28 -0
- package/ios/NativeImagePreview/NativeImagePreviewSourceViewRegistry.swift +80 -0
- package/ios/{GalleryViewer/GaleriaVideoPlayerView.swift → NativeImagePreview/NativeImagePreviewVideoPlayerView.swift} +1 -1
- package/ios/{GalleryViewer/GaleriaViewerConfiguration.swift → NativeImagePreview/NativeImagePreviewViewerConfiguration.swift} +7 -7
- package/ios/{GalleryViewer/GaleriaViewerController.swift → NativeImagePreview/NativeImagePreviewViewerController.swift} +36 -36
- package/ios/{GalleryViewer/GaleriaViewerPageView.swift → NativeImagePreview/NativeImagePreviewViewerPageView.swift} +33 -33
- package/ios/{GalleryViewer/GaleriaViewerTransitionCoordinator.swift → NativeImagePreview/NativeImagePreviewViewerTransitionCoordinator.swift} +16 -16
- package/ios/{GaleriaModule.swift → NativeImagePreviewModule.swift} +4 -4
- package/ios/{GaleriaView.swift → NativeImagePreviewView.swift} +26 -27
- package/package.json +18 -12
- package/src/services/ImagePreviewService/README.md +1 -1
- package/src/types.d.ts +1 -0
- package/src/ui/NativeImagePreview/NativeImagePreview.tsx +7 -7
- package/src/ui/NativeImagePreview/NativeImagePreview.web.tsx +175 -11
- package/src/ui/NativeImagePreview/README.md +3 -3
- package/src/ui/NativeImagePreview/context.tsx +1 -1
- package/src/ui/NativeImagePreview/types.ts +3 -1
- package/src/ui/NativeImagePreview/utils.ts +1 -0
- package/src/ui/NativeImagePreview/web/geometry.ts +134 -0
- package/src/ui/NativeImagePreview/web/media.ts +91 -0
- package/src/ui/NativeImagePreview/web/styles.css +137 -0
- package/src/ui/NativeImagePreview/web/transition.ts +111 -0
- package/src/ui/NativeImagePreview/web/types.ts +88 -0
- package/src/ui/NativeImagePreview/web/viewer.ts +1024 -0
- package/android/src/main/java/cn/fontree/zkit/ui/preview/GaleriaModule.kt +0 -43
- package/android/src/main/java/cn/fontree/zkit/ui/preview/GallerySharedElementNames.java +0 -39
- package/ios/GalleryViewer/GaleriaImageViewInteraction.swift +0 -245
- package/ios/GalleryViewer/GaleriaMedia.swift +0 -28
- package/ios/GalleryViewer/GaleriaSourceViewRegistry.swift +0 -80
- /package/android/src/main/res/layout/{galeria_player_view.xml → native_image_preview_player_view.xml} +0 -0
|
@@ -35,21 +35,115 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.NativeImagePreview = void 0;
|
|
37
37
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
/// <reference lib="dom" />
|
|
39
|
+
require("./web/styles.css");
|
|
38
40
|
const React = __importStar(require("react"));
|
|
39
41
|
const react_native_1 = require("react-native");
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
const utils_1 = require("./utils");
|
|
43
|
+
const viewer_1 = require("./web/viewer");
|
|
44
|
+
const NativeImagePreviewWebContext = React.createContext(null);
|
|
45
|
+
const WebView = react_native_1.View;
|
|
46
|
+
function toWebPreviewItems(items) {
|
|
47
|
+
return items.map(({ alt, height, id, poster, type, url, width }) => ({
|
|
48
|
+
alt: alt !== null && alt !== void 0 ? alt : id,
|
|
49
|
+
height,
|
|
50
|
+
id,
|
|
51
|
+
poster,
|
|
52
|
+
type,
|
|
53
|
+
url,
|
|
54
|
+
width,
|
|
55
|
+
}));
|
|
46
56
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
function findPreviewSourceElement(element) {
|
|
58
|
+
var _a;
|
|
59
|
+
if (!element)
|
|
60
|
+
return null;
|
|
61
|
+
if (element instanceof HTMLImageElement || element instanceof HTMLVideoElement) {
|
|
62
|
+
return element;
|
|
63
|
+
}
|
|
64
|
+
return (_a = element.querySelector('img, video')) !== null && _a !== void 0 ? _a : element;
|
|
65
|
+
}
|
|
66
|
+
function toChangeMeta(meta, items) {
|
|
67
|
+
var _a;
|
|
68
|
+
return {
|
|
69
|
+
reason: meta.reason,
|
|
70
|
+
item: (_a = items[meta.index]) !== null && _a !== void 0 ? _a : null,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const NativeImagePreviewRoot = React.memo(function NativeImagePreview({ children, colorScheme = 'dark', disabled = false, items, onChange, }) {
|
|
74
|
+
const systemColorScheme = (0, react_native_1.useColorScheme)();
|
|
75
|
+
const controllerRef = React.useRef(null);
|
|
76
|
+
const sourceElementsRef = React.useRef([]);
|
|
77
|
+
const resolvedItems = React.useMemo(() => (0, utils_1.normalizeNativeImagePreviewItems)(items), [items]);
|
|
78
|
+
const webItems = React.useMemo(() => toWebPreviewItems(resolvedItems), [resolvedItems]);
|
|
79
|
+
const resolvedColorScheme = (0, utils_1.resolveNativeImagePreviewColorScheme)(colorScheme, systemColorScheme);
|
|
80
|
+
React.useEffect(() => {
|
|
81
|
+
const controller = (0, viewer_1.createNativeImagePreviewWeb)();
|
|
82
|
+
controllerRef.current = controller;
|
|
83
|
+
return () => {
|
|
84
|
+
controller.destroy();
|
|
85
|
+
controllerRef.current = null;
|
|
86
|
+
};
|
|
87
|
+
}, []);
|
|
88
|
+
const open = React.useCallback((index, onItemChange) => {
|
|
89
|
+
var _a, _b;
|
|
90
|
+
const controller = controllerRef.current;
|
|
91
|
+
if (disabled || !controller || webItems.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
const value = (0, utils_1.clampPreviewIndex)(index, webItems.length);
|
|
94
|
+
const getSourceElement = (nextIndex) => { var _a; return findPreviewSourceElement((_a = sourceElementsRef.current[nextIndex]) !== null && _a !== void 0 ? _a : null); };
|
|
95
|
+
void controller.open({
|
|
96
|
+
getSourceElement,
|
|
97
|
+
index: value,
|
|
98
|
+
items: webItems,
|
|
99
|
+
objectFit: 'cover',
|
|
100
|
+
sourceElement: getSourceElement(value),
|
|
101
|
+
sourceImageSize: resolvedItems[value]
|
|
102
|
+
? {
|
|
103
|
+
width: (_a = resolvedItems[value].width) !== null && _a !== void 0 ? _a : 0,
|
|
104
|
+
height: (_b = resolvedItems[value].height) !== null && _b !== void 0 ? _b : 0,
|
|
105
|
+
}
|
|
106
|
+
: null,
|
|
107
|
+
sourceObjectFit: 'cover',
|
|
108
|
+
sourceVisibility: 'hidden',
|
|
109
|
+
theme: resolvedColorScheme,
|
|
110
|
+
onChange: (nextValue, meta) => {
|
|
111
|
+
const changeMeta = toChangeMeta(meta, resolvedItems);
|
|
112
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, changeMeta);
|
|
113
|
+
onItemChange === null || onItemChange === void 0 ? void 0 : onItemChange(nextValue, changeMeta);
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}, [disabled, onChange, resolvedColorScheme, resolvedItems, webItems]);
|
|
117
|
+
const contextValue = React.useMemo(() => ({
|
|
118
|
+
disabled,
|
|
119
|
+
items: resolvedItems,
|
|
120
|
+
open,
|
|
121
|
+
sourceElementsRef,
|
|
122
|
+
}), [disabled, open, resolvedItems]);
|
|
123
|
+
return ((0, jsx_runtime_1.jsx)(NativeImagePreviewWebContext.Provider, { value: contextValue, children: children }));
|
|
50
124
|
});
|
|
51
|
-
const NativeImagePreviewItem = React.memo(function NativeImagePreviewItem({ children, style, }) {
|
|
52
|
-
|
|
125
|
+
const NativeImagePreviewItem = React.memo(function NativeImagePreviewItem({ children, disabled = false, index, onChange, style, }) {
|
|
126
|
+
const context = React.useContext(NativeImagePreviewWebContext);
|
|
127
|
+
const sourceRef = React.useCallback((node) => {
|
|
128
|
+
if (!context)
|
|
129
|
+
return;
|
|
130
|
+
context.sourceElementsRef.current[index] = node;
|
|
131
|
+
}, [context, index]);
|
|
132
|
+
const itemDisabled = !context || context.disabled || disabled || context.items.length === 0;
|
|
133
|
+
const open = React.useCallback(() => {
|
|
134
|
+
if (itemDisabled)
|
|
135
|
+
return;
|
|
136
|
+
context.open(index, onChange);
|
|
137
|
+
}, [context, index, itemDisabled, onChange]);
|
|
138
|
+
const handleKeyDown = React.useCallback((event) => {
|
|
139
|
+
if (itemDisabled)
|
|
140
|
+
return;
|
|
141
|
+
if (event.key !== 'Enter' && event.key !== ' ')
|
|
142
|
+
return;
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
open();
|
|
145
|
+
}, [itemDisabled, open]);
|
|
146
|
+
return ((0, jsx_runtime_1.jsx)(WebView, { ref: sourceRef, "aria-label": itemDisabled ? undefined : 'Open image preview', onClick: itemDisabled ? undefined : open, onKeyDown: itemDisabled ? undefined : handleKeyDown, role: itemDisabled ? undefined : 'button', style: style, tabIndex: itemDisabled ? undefined : 0, children: children }));
|
|
53
147
|
});
|
|
54
148
|
exports.NativeImagePreview = Object.assign(NativeImagePreviewRoot, {
|
|
55
149
|
Item: NativeImagePreviewItem,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import type { NativeImagePreviewChangeMeta, NativeImagePreviewNativeItem, NativeImagePreviewNativeProps, NativeImagePreviewResolvedItem, NativeImagePreviewResolvedColorScheme } from './types';
|
|
3
3
|
export type NativeImagePreviewContextValue = {
|
|
4
|
-
|
|
4
|
+
previewGroupId: string;
|
|
5
5
|
items: readonly NativeImagePreviewResolvedItem[];
|
|
6
6
|
nativeItems: readonly NativeImagePreviewNativeItem[];
|
|
7
7
|
colorScheme: NativeImagePreviewResolvedColorScheme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EACV,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,qCAAqC,EACtC,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,8BAA8B,GAAG;IAC3C,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EACV,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,qCAAqC,EACtC,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACjD,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACrD,WAAW,EAAE,qCAAqC,CAAC;IACnD,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,6BAA6B,CAAC;IAC5C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACxE,CAAC;AAEF,eAAO,MAAM,yBAAyB,sDAC4B,CAAC"}
|
|
@@ -6,6 +6,7 @@ export type NativeImagePreviewMediaType = 'image' | 'video';
|
|
|
6
6
|
export type NativeImagePreviewSource = ImageSourcePropType | string;
|
|
7
7
|
export type NativeImagePreviewItemDescriptor = {
|
|
8
8
|
id?: string;
|
|
9
|
+
alt?: string;
|
|
9
10
|
type?: NativeImagePreviewMediaType;
|
|
10
11
|
url?: string;
|
|
11
12
|
source?: NativeImagePreviewSource;
|
|
@@ -21,6 +22,7 @@ export type NativeImagePreviewResolvedItem = {
|
|
|
21
22
|
poster?: string;
|
|
22
23
|
width?: number;
|
|
23
24
|
height?: number;
|
|
25
|
+
alt?: string;
|
|
24
26
|
raw: NativeImagePreviewItem;
|
|
25
27
|
};
|
|
26
28
|
export type NativeImagePreviewNativeItem = {
|
|
@@ -31,7 +33,7 @@ export type NativeImagePreviewNativeItem = {
|
|
|
31
33
|
width?: number;
|
|
32
34
|
height?: number;
|
|
33
35
|
};
|
|
34
|
-
export type NativeImagePreviewChangeReason = 'swipe';
|
|
36
|
+
export type NativeImagePreviewChangeReason = 'api' | 'swipe';
|
|
35
37
|
export type NativeImagePreviewChangeEventPayload = {
|
|
36
38
|
currentIndex: number;
|
|
37
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,qCAAqC,GAAG,MAAM,GAAG,OAAO,CAAC;AACrE,MAAM,MAAM,6BAA6B,GACrC,qCAAqC,GACrC,QAAQ,CAAC;AACb,MAAM,MAAM,2BAA2B,GAAG,OAAO,GAAG,OAAO,CAAC;AAC5D,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,GAAG,MAAM,CAAC;AAEpE,MAAM,MAAM,gCAAgC,GAAG;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,wBAAwB,GACxB,gCAAgC,CAAC;AAErC,MAAM,MAAM,8BAA8B,GAAG;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,2BAA2B,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,sBAAsB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,2BAA2B,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,6BAA6B,EAC7B,sBAAsB,EAEtB,4BAA4B,EAC5B,8BAA8B,EAC9B,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAejB,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,GAAG,SAAS,sBAQ7C;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ui/NativeImagePreview/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,6BAA6B,EAC7B,sBAAsB,EAEtB,4BAA4B,EAC5B,8BAA8B,EAC9B,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAejB,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,GAAG,SAAS,sBAQ7C;AAqCD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,SAAS,sBAAsB,EAAE,oCAKzC;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,8BAA8B,EAAE,GAC/C,4BAA4B,EAAE,CAShC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAG9D;AAED,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,6BAA6B,GAAG,SAAS,EACtD,iBAAiB,EAAE,eAAe,GACjC,qCAAqC,CAIvC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NativeImagePreviewWebImageSize, NativeImagePreviewWebObjectFit, NativeImagePreviewWebRect } from './types';
|
|
2
|
+
export type SharedElementGeometry = {
|
|
3
|
+
visibleFrame: NativeImagePreviewWebRect;
|
|
4
|
+
contentFrame: NativeImagePreviewWebRect;
|
|
5
|
+
};
|
|
6
|
+
export declare function rectFromDOMRect(rect: DOMRectReadOnly | NativeImagePreviewWebRect): NativeImagePreviewWebRect;
|
|
7
|
+
export declare function rectFromElement(element: Element): NativeImagePreviewWebRect;
|
|
8
|
+
export declare function viewportRect(): NativeImagePreviewWebRect;
|
|
9
|
+
export declare function normalizeRect(input: Pick<NativeImagePreviewWebRect, 'left' | 'top' | 'width' | 'height'>): NativeImagePreviewWebRect;
|
|
10
|
+
export declare function isUsableRect(rect: NativeImagePreviewWebRect | null | undefined): rect is NativeImagePreviewWebRect;
|
|
11
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
12
|
+
export declare function fitRect(mediaSize: NativeImagePreviewWebImageSize, container: NativeImagePreviewWebRect, objectFit: NativeImagePreviewWebObjectFit): NativeImagePreviewWebRect;
|
|
13
|
+
export declare function sharedGeometryFor(container: NativeImagePreviewWebRect, mediaSize: NativeImagePreviewWebImageSize, objectFit: NativeImagePreviewWebObjectFit): SharedElementGeometry;
|
|
14
|
+
export declare function targetGeometryFor(mediaSize: NativeImagePreviewWebImageSize, container: NativeImagePreviewWebRect): SharedElementGeometry;
|
|
15
|
+
export declare function intersectRects(first: NativeImagePreviewWebRect, second: NativeImagePreviewWebRect): NativeImagePreviewWebRect | null;
|
|
16
|
+
export declare function lerp(start: number, end: number, progress: number): number;
|
|
17
|
+
export declare function lerpRect(start: NativeImagePreviewWebRect, end: NativeImagePreviewWebRect, progress: number): NativeImagePreviewWebRect;
|
|
18
|
+
export declare function easeOutCubic(t: number): number;
|
|
19
|
+
export declare function easeOutQuart(t: number): number;
|
|
20
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../../src/ui/NativeImagePreview/web/geometry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAEzH,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,yBAAyB,CAAC;IACxC,YAAY,EAAE,yBAAyB,CAAC;CACzC,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,yBAAyB,GAAG,yBAAyB,CAO5G;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,CAE3E;AAED,wBAAgB,YAAY,IAAI,yBAAyB,CAOxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,yBAAyB,CASpI;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,yBAAyB,CAElH;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,OAAO,CACrB,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,yBAAyB,EACpC,SAAS,EAAE,8BAA8B,GACxC,yBAAyB,CAkB3B;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,yBAAyB,EACpC,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,8BAA8B,GACxC,qBAAqB,CAUvB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,8BAA8B,EAAE,SAAS,EAAE,yBAAyB,GAAG,qBAAqB,CAWxI;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,yBAAyB,GAAG,yBAAyB,GAAG,IAAI,CASpI;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,GAAG,yBAAyB,CAOtI;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.rectFromDOMRect = rectFromDOMRect;
|
|
5
|
+
exports.rectFromElement = rectFromElement;
|
|
6
|
+
exports.viewportRect = viewportRect;
|
|
7
|
+
exports.normalizeRect = normalizeRect;
|
|
8
|
+
exports.isUsableRect = isUsableRect;
|
|
9
|
+
exports.clamp = clamp;
|
|
10
|
+
exports.fitRect = fitRect;
|
|
11
|
+
exports.sharedGeometryFor = sharedGeometryFor;
|
|
12
|
+
exports.targetGeometryFor = targetGeometryFor;
|
|
13
|
+
exports.intersectRects = intersectRects;
|
|
14
|
+
exports.lerp = lerp;
|
|
15
|
+
exports.lerpRect = lerpRect;
|
|
16
|
+
exports.easeOutCubic = easeOutCubic;
|
|
17
|
+
exports.easeOutQuart = easeOutQuart;
|
|
18
|
+
function rectFromDOMRect(rect) {
|
|
19
|
+
return normalizeRect({
|
|
20
|
+
left: rect.left,
|
|
21
|
+
top: rect.top,
|
|
22
|
+
width: rect.width,
|
|
23
|
+
height: rect.height,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function rectFromElement(element) {
|
|
27
|
+
return rectFromDOMRect(element.getBoundingClientRect());
|
|
28
|
+
}
|
|
29
|
+
function viewportRect() {
|
|
30
|
+
return normalizeRect({
|
|
31
|
+
left: 0,
|
|
32
|
+
top: 0,
|
|
33
|
+
width: window.innerWidth,
|
|
34
|
+
height: window.innerHeight,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function normalizeRect(input) {
|
|
38
|
+
return {
|
|
39
|
+
left: input.left,
|
|
40
|
+
top: input.top,
|
|
41
|
+
width: input.width,
|
|
42
|
+
height: input.height,
|
|
43
|
+
right: input.left + input.width,
|
|
44
|
+
bottom: input.top + input.height,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function isUsableRect(rect) {
|
|
48
|
+
return !!rect && rect.width > 1 && rect.height > 1;
|
|
49
|
+
}
|
|
50
|
+
function clamp(value, min, max) {
|
|
51
|
+
return Math.max(min, Math.min(max, value));
|
|
52
|
+
}
|
|
53
|
+
function fitRect(mediaSize, container, objectFit) {
|
|
54
|
+
if (objectFit === 'fill') {
|
|
55
|
+
return normalizeRect(container);
|
|
56
|
+
}
|
|
57
|
+
const widthScale = container.width / Math.max(1, mediaSize.width);
|
|
58
|
+
const heightScale = container.height / Math.max(1, mediaSize.height);
|
|
59
|
+
const scale = objectFit === 'cover'
|
|
60
|
+
? Math.max(widthScale, heightScale)
|
|
61
|
+
: Math.min(widthScale, heightScale);
|
|
62
|
+
const width = mediaSize.width * scale;
|
|
63
|
+
const height = mediaSize.height * scale;
|
|
64
|
+
return normalizeRect({
|
|
65
|
+
left: container.left + (container.width - width) / 2,
|
|
66
|
+
top: container.top + (container.height - height) / 2,
|
|
67
|
+
width,
|
|
68
|
+
height,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function sharedGeometryFor(container, mediaSize, objectFit) {
|
|
72
|
+
var _a;
|
|
73
|
+
const contentFrameInWindow = fitRect(mediaSize, container, objectFit);
|
|
74
|
+
const visibleFrame = (_a = intersectRects(container, contentFrameInWindow)) !== null && _a !== void 0 ? _a : normalizeRect(container);
|
|
75
|
+
const contentFrame = normalizeRect({
|
|
76
|
+
left: contentFrameInWindow.left - visibleFrame.left,
|
|
77
|
+
top: contentFrameInWindow.top - visibleFrame.top,
|
|
78
|
+
width: contentFrameInWindow.width,
|
|
79
|
+
height: contentFrameInWindow.height,
|
|
80
|
+
});
|
|
81
|
+
return { visibleFrame, contentFrame };
|
|
82
|
+
}
|
|
83
|
+
function targetGeometryFor(mediaSize, container) {
|
|
84
|
+
const visibleFrame = fitRect(mediaSize, container, 'contain');
|
|
85
|
+
return {
|
|
86
|
+
visibleFrame,
|
|
87
|
+
contentFrame: normalizeRect({
|
|
88
|
+
left: 0,
|
|
89
|
+
top: 0,
|
|
90
|
+
width: visibleFrame.width,
|
|
91
|
+
height: visibleFrame.height,
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function intersectRects(first, second) {
|
|
96
|
+
const left = Math.max(first.left, second.left);
|
|
97
|
+
const top = Math.max(first.top, second.top);
|
|
98
|
+
const right = Math.min(first.right, second.right);
|
|
99
|
+
const bottom = Math.min(first.bottom, second.bottom);
|
|
100
|
+
if (right <= left || bottom <= top) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return normalizeRect({ left, top, width: right - left, height: bottom - top });
|
|
104
|
+
}
|
|
105
|
+
function lerp(start, end, progress) {
|
|
106
|
+
return start + (end - start) * progress;
|
|
107
|
+
}
|
|
108
|
+
function lerpRect(start, end, progress) {
|
|
109
|
+
return normalizeRect({
|
|
110
|
+
left: lerp(start.left, end.left, progress),
|
|
111
|
+
top: lerp(start.top, end.top, progress),
|
|
112
|
+
width: lerp(start.width, end.width, progress),
|
|
113
|
+
height: lerp(start.height, end.height, progress),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function easeOutCubic(t) {
|
|
117
|
+
return 1 - Math.pow(1 - t, 3);
|
|
118
|
+
}
|
|
119
|
+
function easeOutQuart(t) {
|
|
120
|
+
return 1 - Math.pow(1 - t, 4);
|
|
121
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NativeImagePreviewWebImageSize, NativeImagePreviewWebMediaItem, NativeImagePreviewWebResolvedItem } from './types';
|
|
2
|
+
export declare function normalizeItems(items: readonly NativeImagePreviewWebMediaItem[]): NativeImagePreviewWebResolvedItem[];
|
|
3
|
+
export declare function previewSourceFor(item: NativeImagePreviewWebResolvedItem): string;
|
|
4
|
+
export declare function resolveMediaSize(item: NativeImagePreviewWebResolvedItem, fallback?: NativeImagePreviewWebImageSize | null): Promise<NativeImagePreviewWebImageSize>;
|
|
5
|
+
export declare function waitForElementImage(element: Element | null | undefined): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../../src/ui/NativeImagePreview/web/media.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,8BAA8B,EAAE,8BAA8B,EAAkC,iCAAiC,EAAE,MAAM,SAAS,CAAC;AAEjK,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,8BAA8B,EAAE,GAAG,iCAAiC,EAAE,CAoBpH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iCAAiC,GAAG,MAAM,CAEhF;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,iCAAiC,EACvC,QAAQ,CAAC,EAAE,8BAA8B,GAAG,IAAI,GAC/C,OAAO,CAAC,8BAA8B,CAAC,CAgBzC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.normalizeItems = normalizeItems;
|
|
5
|
+
exports.previewSourceFor = previewSourceFor;
|
|
6
|
+
exports.resolveMediaSize = resolveMediaSize;
|
|
7
|
+
exports.waitForElementImage = waitForElementImage;
|
|
8
|
+
function normalizeItems(items) {
|
|
9
|
+
return items
|
|
10
|
+
.map((item, index) => {
|
|
11
|
+
var _a, _b, _c, _d;
|
|
12
|
+
const src = (_b = (_a = item.src) !== null && _a !== void 0 ? _a : item.url) !== null && _b !== void 0 ? _b : '';
|
|
13
|
+
if (!src.trim()) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const type = resolveType(item);
|
|
17
|
+
return {
|
|
18
|
+
id: (_c = item.id) !== null && _c !== void 0 ? _c : String(index),
|
|
19
|
+
type,
|
|
20
|
+
src,
|
|
21
|
+
poster: item.poster,
|
|
22
|
+
width: item.width,
|
|
23
|
+
height: item.height,
|
|
24
|
+
alt: (_d = item.alt) !== null && _d !== void 0 ? _d : `Image ${index + 1}`,
|
|
25
|
+
raw: item,
|
|
26
|
+
};
|
|
27
|
+
})
|
|
28
|
+
.filter((item) => item !== null);
|
|
29
|
+
}
|
|
30
|
+
function previewSourceFor(item) {
|
|
31
|
+
var _a;
|
|
32
|
+
return item.type === 'video' ? (_a = item.poster) !== null && _a !== void 0 ? _a : item.src : item.src;
|
|
33
|
+
}
|
|
34
|
+
async function resolveMediaSize(item, fallback) {
|
|
35
|
+
if (fallback && fallback.width > 0 && fallback.height > 0) {
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
if (item.width && item.height) {
|
|
39
|
+
return { width: item.width, height: item.height };
|
|
40
|
+
}
|
|
41
|
+
const previewSource = previewSourceFor(item);
|
|
42
|
+
if (!previewSource) {
|
|
43
|
+
return { width: 1, height: 1 };
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return await loadImageSize(previewSource);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { width: 1, height: 1 };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function waitForElementImage(element) {
|
|
53
|
+
if (!(element instanceof HTMLImageElement)) {
|
|
54
|
+
return Promise.resolve();
|
|
55
|
+
}
|
|
56
|
+
if (element.complete && element.naturalWidth > 0) {
|
|
57
|
+
return Promise.resolve();
|
|
58
|
+
}
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
const done = () => {
|
|
61
|
+
element.removeEventListener('load', done);
|
|
62
|
+
element.removeEventListener('error', done);
|
|
63
|
+
resolve();
|
|
64
|
+
};
|
|
65
|
+
element.addEventListener('load', done, { once: true });
|
|
66
|
+
element.addEventListener('error', done, { once: true });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function resolveType(item) {
|
|
70
|
+
var _a, _b;
|
|
71
|
+
if (item.type === 'video') {
|
|
72
|
+
return 'video';
|
|
73
|
+
}
|
|
74
|
+
const src = (_b = (_a = item.src) !== null && _a !== void 0 ? _a : item.url) !== null && _b !== void 0 ? _b : '';
|
|
75
|
+
return /\.(mp4|webm|ogg)(\?.*)?$/i.test(src) ? 'video' : 'image';
|
|
76
|
+
}
|
|
77
|
+
function loadImageSize(src) {
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const image = new Image();
|
|
80
|
+
image.decoding = 'async';
|
|
81
|
+
image.onload = () => {
|
|
82
|
+
resolve({
|
|
83
|
+
width: image.naturalWidth || image.width || 1,
|
|
84
|
+
height: image.naturalHeight || image.height || 1,
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
image.onerror = () => reject(new Error(`Unable to load image: ${src}`));
|
|
88
|
+
image.src = src;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
.native-image-preview-root {
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: 0;
|
|
4
|
+
left: 0;
|
|
5
|
+
z-index: 2147483000;
|
|
6
|
+
width: var(--native-image-preview-vw, 100vw);
|
|
7
|
+
height: var(--native-image-preview-vh, 100vh);
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
color: #fff;
|
|
10
|
+
contain: layout size paint;
|
|
11
|
+
overscroll-behavior: none;
|
|
12
|
+
touch-action: none;
|
|
13
|
+
user-select: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.native-image-preview-backdrop {
|
|
17
|
+
position: absolute;
|
|
18
|
+
inset: 0;
|
|
19
|
+
background: #000;
|
|
20
|
+
will-change: opacity;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.native-image-preview-theme-light .native-image-preview-backdrop {
|
|
24
|
+
background: #fff;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.native-image-preview-viewport {
|
|
28
|
+
position: absolute;
|
|
29
|
+
inset: 0;
|
|
30
|
+
z-index: 1;
|
|
31
|
+
overflow: hidden;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.native-image-preview-track {
|
|
35
|
+
position: absolute;
|
|
36
|
+
top: 0;
|
|
37
|
+
left: 0;
|
|
38
|
+
display: flex;
|
|
39
|
+
width: var(--native-image-preview-vw, 100vw);
|
|
40
|
+
height: var(--native-image-preview-vh, 100vh);
|
|
41
|
+
will-change: transform, opacity;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.native-image-preview-slide {
|
|
45
|
+
position: relative;
|
|
46
|
+
display: grid;
|
|
47
|
+
flex: 0 0 var(--native-image-preview-vw, 100vw);
|
|
48
|
+
width: var(--native-image-preview-vw, 100vw);
|
|
49
|
+
height: var(--native-image-preview-vh, 100vh);
|
|
50
|
+
place-items: center;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.native-image-preview-media {
|
|
55
|
+
display: block;
|
|
56
|
+
max-width: var(--native-image-preview-vw, 100vw);
|
|
57
|
+
max-height: var(--native-image-preview-vh, 100vh);
|
|
58
|
+
object-fit: contain;
|
|
59
|
+
transform-origin: center center;
|
|
60
|
+
will-change: transform;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.native-image-preview-image {
|
|
64
|
+
width: auto;
|
|
65
|
+
height: auto;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.native-image-preview-video {
|
|
69
|
+
width: auto;
|
|
70
|
+
height: auto;
|
|
71
|
+
background: #000;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.native-image-preview-close {
|
|
75
|
+
position: fixed;
|
|
76
|
+
top: max(12px, env(safe-area-inset-top));
|
|
77
|
+
left: max(12px, env(safe-area-inset-left));
|
|
78
|
+
z-index: 3;
|
|
79
|
+
display: grid;
|
|
80
|
+
width: 42px;
|
|
81
|
+
height: 42px;
|
|
82
|
+
padding: 0;
|
|
83
|
+
border: 0;
|
|
84
|
+
border-radius: 999px;
|
|
85
|
+
place-items: center;
|
|
86
|
+
background: rgba(255, 255, 255, 0.12);
|
|
87
|
+
color: #fff;
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
font-size: 30px;
|
|
90
|
+
line-height: 1;
|
|
91
|
+
backdrop-filter: blur(18px);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.native-image-preview-counter {
|
|
95
|
+
position: fixed;
|
|
96
|
+
right: max(14px, env(safe-area-inset-right));
|
|
97
|
+
bottom: max(18px, env(safe-area-inset-bottom));
|
|
98
|
+
z-index: 3;
|
|
99
|
+
min-width: 58px;
|
|
100
|
+
padding: 8px 11px;
|
|
101
|
+
border-radius: 999px;
|
|
102
|
+
background: rgba(255, 255, 255, 0.12);
|
|
103
|
+
color: #fff;
|
|
104
|
+
font-size: 13px;
|
|
105
|
+
font-weight: 720;
|
|
106
|
+
text-align: center;
|
|
107
|
+
backdrop-filter: blur(18px);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.native-image-preview-fly-shell {
|
|
111
|
+
position: fixed;
|
|
112
|
+
top: 0;
|
|
113
|
+
left: 0;
|
|
114
|
+
z-index: 2;
|
|
115
|
+
overflow: hidden;
|
|
116
|
+
border-radius: 0;
|
|
117
|
+
pointer-events: none;
|
|
118
|
+
transform-origin: top left;
|
|
119
|
+
will-change: transform, width, height;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.native-image-preview-fly-media {
|
|
123
|
+
position: absolute;
|
|
124
|
+
top: 0;
|
|
125
|
+
left: 0;
|
|
126
|
+
display: block;
|
|
127
|
+
max-width: none;
|
|
128
|
+
max-height: none;
|
|
129
|
+
object-fit: fill;
|
|
130
|
+
transform-origin: top left;
|
|
131
|
+
will-change: transform, width, height;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.native-image-preview-fading-out {
|
|
135
|
+
opacity: 0;
|
|
136
|
+
transition: opacity 180ms cubic-bezier(0.22, 1, 0.36, 1);
|
|
137
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NativeImagePreviewWebResolvedItem } from './types';
|
|
2
|
+
import { type SharedElementGeometry } from './geometry';
|
|
3
|
+
type SharedTransitionOptions = {
|
|
4
|
+
item: NativeImagePreviewWebResolvedItem;
|
|
5
|
+
from: SharedElementGeometry;
|
|
6
|
+
to: SharedElementGeometry;
|
|
7
|
+
duration?: number;
|
|
8
|
+
parent?: HTMLElement;
|
|
9
|
+
beforeStart?: () => void | Promise<void>;
|
|
10
|
+
onProgress?: (progress: number) => void;
|
|
11
|
+
beforeRemove?: () => void | Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
export declare function animateSharedElement({ item, from, to, duration, parent, beforeStart, onProgress, beforeRemove, }: SharedTransitionOptions): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../../src/ui/NativeImagePreview/web/transition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAA0B,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGhF,KAAK,uBAAuB,GAAG;IAC7B,IAAI,EAAE,iCAAiC,CAAC;IACxC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,EAAE,EAAE,qBAAqB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,EACzC,IAAI,EACJ,IAAI,EACJ,EAAE,EACF,QAAc,EACd,MAAsB,EACtB,WAAW,EACX,UAAU,EACV,YAAY,GACb,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CzC"}
|