@lobehub/ui 5.25.0 → 5.27.0
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/es/Image/Image.mjs +138 -37
- package/es/Image/Image.mjs.map +1 -1
- package/es/Image/PreviewGroup.d.mts +1 -0
- package/es/Image/PreviewGroup.mjs +33 -10
- package/es/Image/PreviewGroup.mjs.map +1 -1
- package/es/Image/index.d.mts +2 -2
- package/es/Image/index.mjs +1 -1
- package/es/Image/style.mjs +126 -71
- package/es/Image/style.mjs.map +1 -1
- package/es/Image/type.d.mts +14 -17
- package/es/Image/viewer/GalleryNav.mjs +44 -0
- package/es/Image/viewer/GalleryNav.mjs.map +1 -0
- package/es/Image/viewer/ImageViewer.mjs +275 -0
- package/es/Image/viewer/ImageViewer.mjs.map +1 -0
- package/es/Image/viewer/PreviewOutlet.mjs +19 -0
- package/es/Image/viewer/PreviewOutlet.mjs.map +1 -0
- package/es/Image/viewer/Toolbar.mjs +184 -0
- package/es/Image/viewer/Toolbar.mjs.map +1 -0
- package/es/Image/viewer/ViewerChrome.mjs +54 -0
- package/es/Image/viewer/ViewerChrome.mjs.map +1 -0
- package/es/Image/viewer/geometry.mjs +85 -0
- package/es/Image/viewer/geometry.mjs.map +1 -0
- package/es/Image/viewer/registry.d.mts +2 -0
- package/es/Image/viewer/registry.mjs +52 -0
- package/es/Image/viewer/registry.mjs.map +1 -0
- package/es/Image/viewer/useChromeIdle.mjs +72 -0
- package/es/Image/viewer/useChromeIdle.mjs.map +1 -0
- package/es/Image/viewer/useFinalFocus.mjs +10 -0
- package/es/Image/viewer/useFinalFocus.mjs.map +1 -0
- package/es/Image/viewer/useFlipTransition.mjs +321 -0
- package/es/Image/viewer/useFlipTransition.mjs.map +1 -0
- package/es/Image/viewer/useGalleryNav.mjs +89 -0
- package/es/Image/viewer/useGalleryNav.mjs.map +1 -0
- package/es/Image/viewer/useRefitTransition.mjs +47 -0
- package/es/Image/viewer/useRefitTransition.mjs.map +1 -0
- package/es/Image/viewer/useViewerGestures.mjs +148 -0
- package/es/Image/viewer/useViewerGestures.mjs.map +1 -0
- package/es/Image/viewer/useZoomPan.mjs +346 -0
- package/es/Image/viewer/useZoomPan.mjs.map +1 -0
- package/es/base-ui/Toast/hostGuard.mjs +26 -0
- package/es/base-ui/Toast/hostGuard.mjs.map +1 -0
- package/es/base-ui/Toast/imperative.mjs +69 -31
- package/es/base-ui/Toast/imperative.mjs.map +1 -1
- package/es/base-ui/Toast/pendingQueue.mjs +30 -0
- package/es/base-ui/Toast/pendingQueue.mjs.map +1 -0
- package/es/base-ui/Toast/type.d.mts +7 -0
- package/es/base-ui/index.mjs +1 -1
- package/es/i18n/resources/en/image.d.mts +5 -0
- package/es/i18n/resources/en/image.mjs +6 -1
- package/es/i18n/resources/en/image.mjs.map +1 -1
- package/es/i18n/resources/zhCn/image.d.mts +5 -0
- package/es/i18n/resources/zhCn/image.mjs +6 -1
- package/es/i18n/resources/zhCn/image.mjs.map +1 -1
- package/es/index.mjs +8 -8
- package/package.json +1 -1
- package/es/Image/components/Preview.mjs +0 -23
- package/es/Image/components/Preview.mjs.map +0 -1
- package/es/Image/components/Toolbar.mjs +0 -129
- package/es/Image/components/Toolbar.mjs.map +0 -1
- package/es/Image/components/usePreview.mjs +0 -58
- package/es/Image/components/usePreview.mjs.map +0 -1
- package/es/Image/components/usePreviewGroup.mjs +0 -57
- package/es/Image/components/usePreviewGroup.mjs.map +0 -1
package/es/Image/Image.mjs
CHANGED
|
@@ -1,62 +1,163 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import FlexBasic_default from "../Flex/FlexBasic.mjs";
|
|
3
|
+
import SkeletonAvatar from "../Skeleton/SkeletonAvatar.mjs";
|
|
4
|
+
import { usePreviewGroupContext } from "./PreviewGroup.mjs";
|
|
3
5
|
import { FALLBACK_DARK, FALLBACK_LIGHT, styles, variants } from "./style.mjs";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
+
import { openPreview } from "./viewer/registry.mjs";
|
|
7
|
+
import PreviewOutlet from "./viewer/PreviewOutlet.mjs";
|
|
8
|
+
import { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
6
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
import {
|
|
8
|
-
import { cssVar, cx, useThemeMode } from "antd-style";
|
|
10
|
+
import { cx, useThemeMode } from "antd-style";
|
|
9
11
|
//#region src/Image/Image.tsx
|
|
10
|
-
const
|
|
12
|
+
const DEFAULT_MAX_SCALE = 8;
|
|
13
|
+
const resolvePreview = (groupPreview, imagePreview) => {
|
|
14
|
+
if (imagePreview === false) return false;
|
|
15
|
+
if (imagePreview === void 0 && groupPreview === false) return false;
|
|
16
|
+
const groupOptions = typeof groupPreview === "object" ? groupPreview : void 0;
|
|
17
|
+
const imageOptions = typeof imagePreview === "object" ? imagePreview : void 0;
|
|
18
|
+
return {
|
|
19
|
+
...groupOptions,
|
|
20
|
+
...imageOptions
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
const Image = memo(({ ref, style, preview, isLoading, maxHeight = "100%", maxWidth = "100%", minHeight, minWidth, actions, className, alwaysShowActions, variant = "filled", objectFit = "cover", classNames, styles: customStyles, onClick, onError, onPointerDown, width, height, size, src, alt, loading = "lazy", ...rest }) => {
|
|
11
24
|
const { isDarkMode } = useThemeMode();
|
|
25
|
+
const [hasError, setHasError] = useState(false);
|
|
26
|
+
const lastSrcRef = useRef(src);
|
|
27
|
+
const imgRef = useRef(null);
|
|
28
|
+
const preOpenFocusRef = useRef(null);
|
|
29
|
+
const id = useId();
|
|
30
|
+
const group = usePreviewGroupContext();
|
|
31
|
+
if (lastSrcRef.current !== src) {
|
|
32
|
+
lastSrcRef.current = src;
|
|
33
|
+
if (hasError) setHasError(false);
|
|
34
|
+
}
|
|
35
|
+
const resolvedWidth = width ?? size;
|
|
36
|
+
const resolvedHeight = height ?? size;
|
|
37
|
+
const resolvedPreview = resolvePreview(group?.preview, preview);
|
|
38
|
+
const previewEnabled = resolvedPreview !== false;
|
|
39
|
+
const resolvedOptions = useMemo(() => previewEnabled ? {
|
|
40
|
+
maxScale: DEFAULT_MAX_SCALE,
|
|
41
|
+
...resolvedPreview
|
|
42
|
+
} : void 0, [previewEnabled, resolvedPreview]);
|
|
43
|
+
const previewSrc = resolvedOptions?.src;
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!group) return;
|
|
46
|
+
return group.register({
|
|
47
|
+
getElement: () => imgRef.current,
|
|
48
|
+
id,
|
|
49
|
+
options: resolvedOptions,
|
|
50
|
+
previewSrc,
|
|
51
|
+
src: src ?? ""
|
|
52
|
+
});
|
|
53
|
+
}, [
|
|
54
|
+
group,
|
|
55
|
+
id,
|
|
56
|
+
src,
|
|
57
|
+
previewSrc,
|
|
58
|
+
resolvedOptions
|
|
59
|
+
]);
|
|
60
|
+
const handleError = useCallback((event) => {
|
|
61
|
+
setHasError(true);
|
|
62
|
+
onError?.(event);
|
|
63
|
+
}, [onError]);
|
|
64
|
+
const handlePointerDown = useCallback((event) => {
|
|
65
|
+
onPointerDown?.(event);
|
|
66
|
+
const active = document.activeElement;
|
|
67
|
+
preOpenFocusRef.current = active instanceof HTMLElement && active !== document.body && active !== document.documentElement ? active : null;
|
|
68
|
+
}, [onPointerDown]);
|
|
69
|
+
const handleClick = useCallback((event) => {
|
|
70
|
+
onClick?.(event);
|
|
71
|
+
if (!previewEnabled || !imgRef.current || !resolvedOptions) return;
|
|
72
|
+
const clickedEntry = {
|
|
73
|
+
element: imgRef.current,
|
|
74
|
+
options: resolvedOptions,
|
|
75
|
+
previewSrc,
|
|
76
|
+
src: imgRef.current.currentSrc || imgRef.current.src
|
|
77
|
+
};
|
|
78
|
+
const openerFocusElement = preOpenFocusRef.current;
|
|
79
|
+
if (!group) {
|
|
80
|
+
openPreview(clickedEntry, void 0, 0, openerFocusElement);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const galleryEntries = [];
|
|
84
|
+
let clickedIndex = -1;
|
|
85
|
+
for (const groupEntry of group.getEntries()) {
|
|
86
|
+
const element = groupEntry.getElement();
|
|
87
|
+
if (!element || !groupEntry.options) continue;
|
|
88
|
+
if (element === imgRef.current) clickedIndex = galleryEntries.length;
|
|
89
|
+
galleryEntries.push({
|
|
90
|
+
element,
|
|
91
|
+
options: groupEntry.options,
|
|
92
|
+
previewSrc: groupEntry.previewSrc,
|
|
93
|
+
src: element.currentSrc || element.src
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
openPreview(clickedEntry, galleryEntries, clickedIndex >= 0 ? clickedIndex : 0, openerFocusElement);
|
|
97
|
+
}, [
|
|
98
|
+
onClick,
|
|
99
|
+
previewEnabled,
|
|
100
|
+
resolvedOptions,
|
|
101
|
+
previewSrc,
|
|
102
|
+
group
|
|
103
|
+
]);
|
|
12
104
|
const actionsClassName = alwaysShowActions ? styles.actionsVisible : styles.actionsHidden;
|
|
13
|
-
const mergePreview = usePreview(preview);
|
|
14
105
|
if (isLoading) return /* @__PURE__ */ jsx("div", {
|
|
15
106
|
onClick,
|
|
16
|
-
children: /* @__PURE__ */ jsx(
|
|
107
|
+
children: /* @__PURE__ */ jsx(SkeletonAvatar, {
|
|
17
108
|
active: true,
|
|
109
|
+
height: resolvedHeight,
|
|
18
110
|
style: {
|
|
19
|
-
borderRadius: cssVar.borderRadius,
|
|
20
|
-
height,
|
|
21
111
|
maxHeight,
|
|
22
112
|
maxWidth,
|
|
23
113
|
minHeight,
|
|
24
|
-
minWidth
|
|
25
|
-
|
|
26
|
-
|
|
114
|
+
minWidth
|
|
115
|
+
},
|
|
116
|
+
width: resolvedWidth
|
|
27
117
|
})
|
|
28
118
|
});
|
|
29
119
|
return /* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
30
120
|
className: cx(variants({ variant }), className),
|
|
31
121
|
ref,
|
|
32
122
|
style,
|
|
33
|
-
children: [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
123
|
+
children: [
|
|
124
|
+
actions && /* @__PURE__ */ jsx("div", {
|
|
125
|
+
className: cx(actionsClassName, alwaysShowActions ? "" : "actions-hidden"),
|
|
126
|
+
children: actions
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ jsx("div", {
|
|
129
|
+
className: cx(styles.wrapper, classNames?.wrapper),
|
|
130
|
+
style: customStyles?.wrapper,
|
|
131
|
+
children: /* @__PURE__ */ jsx("img", {
|
|
132
|
+
alt,
|
|
133
|
+
className: cx(styles.image, previewEnabled && styles.previewable, classNames?.image),
|
|
134
|
+
height: resolvedHeight,
|
|
135
|
+
loading,
|
|
136
|
+
ref: imgRef,
|
|
137
|
+
src: hasError ? isDarkMode ? FALLBACK_DARK : FALLBACK_LIGHT : src,
|
|
138
|
+
width: resolvedWidth,
|
|
139
|
+
style: {
|
|
140
|
+
height: resolvedHeight,
|
|
141
|
+
maxHeight,
|
|
142
|
+
maxWidth,
|
|
143
|
+
minHeight,
|
|
144
|
+
minWidth,
|
|
145
|
+
objectFit,
|
|
146
|
+
width: resolvedWidth,
|
|
147
|
+
...customStyles?.image
|
|
148
|
+
},
|
|
149
|
+
onClick: handleClick,
|
|
150
|
+
onError: handleError,
|
|
151
|
+
onPointerDown: handlePointerDown,
|
|
152
|
+
...rest
|
|
153
|
+
})
|
|
154
|
+
}),
|
|
155
|
+
previewEnabled && /* @__PURE__ */ jsx(PreviewOutlet, { elementRef: imgRef })
|
|
156
|
+
]
|
|
56
157
|
});
|
|
57
158
|
});
|
|
58
|
-
Image
|
|
159
|
+
Image.displayName = "Image";
|
|
59
160
|
//#endregion
|
|
60
|
-
export { Image
|
|
161
|
+
export { Image as default };
|
|
61
162
|
|
|
62
163
|
//# sourceMappingURL=Image.mjs.map
|
package/es/Image/Image.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.mjs","names":["
|
|
1
|
+
{"version":3,"file":"Image.mjs","names":["Flexbox"],"sources":["../../src/Image/Image.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport {\n memo,\n type MouseEvent,\n type PointerEvent,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { SkeletonAvatar } from '@/Skeleton';\n\nimport { usePreviewGroupContext } from './PreviewGroup';\nimport { FALLBACK_DARK, FALLBACK_LIGHT, styles, variants } from './style';\nimport type { ImagePreviewOptions, ImageProps } from './type';\nimport PreviewOutlet from './viewer/PreviewOutlet';\nimport { openPreview, type PreviewEntry } from './viewer/registry';\n\nconst DEFAULT_MAX_SCALE = 8;\n\nconst resolvePreview = (\n groupPreview: boolean | ImagePreviewOptions | undefined,\n imagePreview: boolean | ImagePreviewOptions | undefined,\n): ImagePreviewOptions | false => {\n if (imagePreview === false) return false;\n if (imagePreview === undefined && groupPreview === false) return false;\n\n const groupOptions = typeof groupPreview === 'object' ? groupPreview : undefined;\n const imageOptions = typeof imagePreview === 'object' ? imagePreview : undefined;\n\n return { ...groupOptions, ...imageOptions };\n};\n\nconst Image = memo<ImageProps>(\n ({\n ref,\n style,\n preview,\n isLoading,\n maxHeight = '100%',\n maxWidth = '100%',\n minHeight,\n minWidth,\n actions,\n className,\n alwaysShowActions,\n variant = 'filled',\n objectFit = 'cover',\n classNames,\n styles: customStyles,\n onClick,\n onError,\n onPointerDown,\n width,\n height,\n size,\n src,\n alt,\n loading = 'lazy',\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n const [hasError, setHasError] = useState(false);\n const lastSrcRef = useRef(src);\n const imgRef = useRef<HTMLImageElement>(null);\n const preOpenFocusRef = useRef<HTMLElement | null>(null);\n const id = useId();\n const group = usePreviewGroupContext();\n\n if (lastSrcRef.current !== src) {\n lastSrcRef.current = src;\n if (hasError) setHasError(false);\n }\n\n const resolvedWidth = width ?? size;\n const resolvedHeight = height ?? size;\n\n const resolvedPreview = resolvePreview(group?.preview, preview);\n const previewEnabled = resolvedPreview !== false;\n const resolvedOptions = useMemo(\n () => (previewEnabled ? { maxScale: DEFAULT_MAX_SCALE, ...resolvedPreview } : undefined),\n [previewEnabled, resolvedPreview],\n );\n const previewSrc = resolvedOptions?.src;\n\n useEffect(() => {\n if (!group) return;\n return group.register({\n getElement: () => imgRef.current,\n id,\n options: resolvedOptions,\n previewSrc,\n src: src ?? '',\n });\n }, [group, id, src, previewSrc, resolvedOptions]);\n\n const handleError = useCallback(\n (event: SyntheticEvent<HTMLImageElement>) => {\n setHasError(true);\n onError?.(event);\n },\n [onError],\n );\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLImageElement>) => {\n onPointerDown?.(event);\n const active = document.activeElement;\n preOpenFocusRef.current =\n active instanceof HTMLElement &&\n active !== document.body &&\n active !== document.documentElement\n ? active\n : null;\n },\n [onPointerDown],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLImageElement>) => {\n onClick?.(event);\n if (!previewEnabled || !imgRef.current || !resolvedOptions) return;\n const clickedEntry: PreviewEntry = {\n element: imgRef.current,\n options: resolvedOptions,\n previewSrc,\n src: imgRef.current.currentSrc || imgRef.current.src,\n };\n const openerFocusElement = preOpenFocusRef.current;\n\n if (!group) {\n openPreview(clickedEntry, undefined, 0, openerFocusElement);\n return;\n }\n\n const galleryEntries: PreviewEntry[] = [];\n let clickedIndex = -1;\n for (const groupEntry of group.getEntries()) {\n const element = groupEntry.getElement();\n if (!element || !groupEntry.options) continue;\n if (element === imgRef.current) clickedIndex = galleryEntries.length;\n galleryEntries.push({\n element,\n options: groupEntry.options,\n previewSrc: groupEntry.previewSrc,\n src: element.currentSrc || element.src,\n });\n }\n openPreview(\n clickedEntry,\n galleryEntries,\n clickedIndex >= 0 ? clickedIndex : 0,\n openerFocusElement,\n );\n },\n [onClick, previewEnabled, resolvedOptions, previewSrc, group],\n );\n\n const actionsClassName = alwaysShowActions ? styles.actionsVisible : styles.actionsHidden;\n\n if (isLoading)\n return (\n <div onClick={onClick}>\n <SkeletonAvatar\n active\n height={resolvedHeight}\n style={{ maxHeight, maxWidth, minHeight, minWidth }}\n width={resolvedWidth}\n />\n </div>\n );\n\n return (\n <Flexbox className={cx(variants({ variant }), className)} ref={ref} style={style}>\n {actions && (\n <div className={cx(actionsClassName, alwaysShowActions ? '' : 'actions-hidden')}>\n {actions}\n </div>\n )}\n <div className={cx(styles.wrapper, classNames?.wrapper)} style={customStyles?.wrapper}>\n <img\n alt={alt}\n className={cx(styles.image, previewEnabled && styles.previewable, classNames?.image)}\n height={resolvedHeight}\n loading={loading}\n ref={imgRef}\n src={hasError ? (isDarkMode ? FALLBACK_DARK : FALLBACK_LIGHT) : src}\n width={resolvedWidth}\n style={{\n height: resolvedHeight,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n objectFit,\n width: resolvedWidth,\n ...customStyles?.image,\n }}\n onClick={handleClick}\n onError={handleError}\n onPointerDown={handlePointerDown}\n {...rest}\n />\n </div>\n {previewEnabled && <PreviewOutlet elementRef={imgRef} />}\n </Flexbox>\n );\n },\n);\n\nImage.displayName = 'Image';\n\nexport default Image;\n"],"mappings":"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"}
|
|
@@ -1,21 +1,44 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import
|
|
3
|
-
import { memo } from "react";
|
|
2
|
+
import { createContext, memo, use, useCallback, useMemo, useRef } from "react";
|
|
4
3
|
import { jsx } from "react/jsx-runtime";
|
|
5
|
-
import { Image } from "antd";
|
|
6
4
|
//#region src/Image/PreviewGroup.tsx
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
5
|
+
const PreviewGroupContext = createContext(null);
|
|
6
|
+
const usePreviewGroupContext = () => use(PreviewGroupContext);
|
|
7
|
+
const compareEntries = (a, b) => {
|
|
8
|
+
const elementA = a.getElement();
|
|
9
|
+
const elementB = b.getElement();
|
|
10
|
+
if (!elementA || !elementB) return 0;
|
|
11
|
+
const position = elementA.compareDocumentPosition(elementB);
|
|
12
|
+
if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
|
|
13
|
+
if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;
|
|
14
|
+
return 0;
|
|
15
|
+
};
|
|
16
|
+
const PreviewGroup = memo(({ children, enable = true, preview }) => {
|
|
17
|
+
const entriesRef = useRef(/* @__PURE__ */ new Map());
|
|
18
|
+
const register = useCallback((entry) => {
|
|
19
|
+
entriesRef.current.set(entry.id, entry);
|
|
20
|
+
return () => {
|
|
21
|
+
entriesRef.current.delete(entry.id);
|
|
22
|
+
};
|
|
23
|
+
}, []);
|
|
24
|
+
const getEntries = useCallback(() => [...entriesRef.current.values()].sort(compareEntries), []);
|
|
25
|
+
const value = useMemo(() => ({
|
|
26
|
+
getEntries,
|
|
27
|
+
preview,
|
|
28
|
+
register
|
|
29
|
+
}), [
|
|
30
|
+
getEntries,
|
|
31
|
+
preview,
|
|
32
|
+
register
|
|
33
|
+
]);
|
|
10
34
|
if (!enable) return children;
|
|
11
|
-
return /* @__PURE__ */ jsx(
|
|
12
|
-
|
|
13
|
-
preview: mergePreview,
|
|
35
|
+
return /* @__PURE__ */ jsx(PreviewGroupContext, {
|
|
36
|
+
value,
|
|
14
37
|
children
|
|
15
38
|
});
|
|
16
39
|
});
|
|
17
40
|
PreviewGroup.displayName = "PreviewGroup";
|
|
18
41
|
//#endregion
|
|
19
|
-
export { PreviewGroup as default };
|
|
42
|
+
export { PreviewGroup as default, usePreviewGroupContext };
|
|
20
43
|
|
|
21
44
|
//# sourceMappingURL=PreviewGroup.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewGroup.mjs","names":[
|
|
1
|
+
{"version":3,"file":"PreviewGroup.mjs","names":[],"sources":["../../src/Image/PreviewGroup.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, memo, use, useCallback, useMemo, useRef } from 'react';\n\nimport type { ImagePreviewOptions, PreviewGroupProps } from './type';\nimport type { ResolvedPreviewOptions } from './viewer/registry';\n\nexport interface PreviewGroupEntry {\n getElement: () => HTMLImageElement | null;\n id: string;\n options?: ResolvedPreviewOptions;\n previewSrc?: string;\n src: string;\n}\n\ninterface PreviewGroupContextValue {\n getEntries: () => PreviewGroupEntry[];\n preview?: boolean | ImagePreviewOptions;\n register: (entry: PreviewGroupEntry) => () => void;\n}\n\nconst PreviewGroupContext = createContext<PreviewGroupContextValue | null>(null);\n\nexport const usePreviewGroupContext = () => use(PreviewGroupContext);\n\nconst compareEntries = (a: PreviewGroupEntry, b: PreviewGroupEntry) => {\n const elementA = a.getElement();\n const elementB = b.getElement();\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n};\n\nconst PreviewGroup = memo<PreviewGroupProps>(({ children, enable = true, preview }) => {\n const entriesRef = useRef(new Map<string, PreviewGroupEntry>());\n\n const register = useCallback((entry: PreviewGroupEntry) => {\n entriesRef.current.set(entry.id, entry);\n return () => {\n entriesRef.current.delete(entry.id);\n };\n }, []);\n\n const getEntries = useCallback(() => [...entriesRef.current.values()].sort(compareEntries), []);\n\n const value = useMemo<PreviewGroupContextValue>(\n () => ({ getEntries, preview, register }),\n [getEntries, preview, register],\n );\n\n if (!enable) return children;\n\n return <PreviewGroupContext value={value}>{children}</PreviewGroupContext>;\n});\n\nPreviewGroup.displayName = 'PreviewGroup';\n\nexport default PreviewGroup;\n"],"mappings":";;;;AAqBA,MAAM,sBAAsB,cAA+C,IAAI;AAE/E,MAAa,+BAA+B,IAAI,mBAAmB;AAEnE,MAAM,kBAAkB,GAAsB,MAAyB;CACrE,MAAM,WAAW,EAAE,WAAW;CAC9B,MAAM,WAAW,EAAE,WAAW;CAC9B,IAAI,CAAC,YAAY,CAAC,UAAU,OAAO;CACnC,MAAM,WAAW,SAAS,wBAAwB,QAAQ;CAC1D,IAAI,WAAW,KAAK,6BAA6B,OAAO;CACxD,IAAI,WAAW,KAAK,6BAA6B,OAAO;CACxD,OAAO;AACT;AAEA,MAAM,eAAe,MAAyB,EAAE,UAAU,SAAS,MAAM,cAAc;CACrF,MAAM,aAAa,uBAAO,IAAI,IAA+B,CAAC;CAE9D,MAAM,WAAW,aAAa,UAA6B;EACzD,WAAW,QAAQ,IAAI,MAAM,IAAI,KAAK;EACtC,aAAa;GACX,WAAW,QAAQ,OAAO,MAAM,EAAE;EACpC;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,kBAAkB,CAAC,GAAG,WAAW,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAK,cAAc,GAAG,CAAC,CAAC;CAE9F,MAAM,QAAQ,eACL;EAAE;EAAY;EAAS;CAAS,IACvC;EAAC;EAAY;EAAS;CAAQ,CAChC;CAEA,IAAI,CAAC,QAAQ,OAAO;CAEpB,OAAO,oBAAC,qBAAD;EAA4B;EAAQ;CAA8B,CAAA;AAC3E,CAAC;AAED,aAAa,cAAc"}
|
package/es/Image/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ImagePreviewOptions, ImageProps,
|
|
1
|
+
import { ImagePreviewOptions, ImageProps, PreviewGroupProps } from "./type.mjs";
|
|
2
2
|
import PreviewGroup from "./PreviewGroup.mjs";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
//#region src/Image/index.d.ts
|
|
@@ -8,5 +8,5 @@ interface IImage {
|
|
|
8
8
|
}
|
|
9
9
|
declare const Image: IImage;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { IImage, type ImagePreviewOptions, type ImageProps, PreviewGroup, type
|
|
11
|
+
export { IImage, type ImagePreviewOptions, type ImageProps, PreviewGroup, type PreviewGroupProps, Image as default };
|
|
12
12
|
//# sourceMappingURL=index.d.mts.map
|
package/es/Image/index.mjs
CHANGED
package/es/Image/style.mjs
CHANGED
|
@@ -2,8 +2,8 @@ import { staticStylish } from "../styles/theme/customStylishStatic.mjs";
|
|
|
2
2
|
import { createStaticStyles } from "antd-style";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
4
|
//#region src/Image/style.ts
|
|
5
|
-
const prefixCls = "ant";
|
|
6
5
|
const styles = createStaticStyles(({ css, cssVar }) => {
|
|
6
|
+
const controlHalo = `drop-shadow(0 0 2px ${cssVar.colorBgLayout}) drop-shadow(0 1px 6px ${cssVar.colorBgLayout})`;
|
|
7
7
|
return {
|
|
8
8
|
actionsHidden: css`
|
|
9
9
|
cursor: pointer;
|
|
@@ -37,104 +37,159 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
37
37
|
|
|
38
38
|
width: auto;
|
|
39
39
|
height: auto;
|
|
40
|
-
`,
|
|
41
|
-
mask: css`
|
|
42
|
-
${staticStylish.blur};
|
|
43
|
-
backdrop-filter: blur(8px);
|
|
44
40
|
`,
|
|
45
41
|
outlined: staticStylish.variantOutlinedWithoutHover,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
previewable: css`
|
|
43
|
+
cursor: zoom-in;
|
|
44
|
+
`,
|
|
45
|
+
root: css`
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
user-select: none;
|
|
50
48
|
|
|
51
|
-
|
|
52
|
-
color: ${cssVar.colorTextDescription};
|
|
53
|
-
background: ${cssVar.colorBgContainer};
|
|
54
|
-
box-shadow: ${cssVar.boxShadowTertiary};
|
|
49
|
+
position: relative;
|
|
55
50
|
|
|
56
|
-
|
|
57
|
-
stroke: ${cssVar.colorTextDescription};
|
|
58
|
-
}
|
|
51
|
+
overflow: hidden;
|
|
59
52
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
background: ${cssVar.colorBgContainer};
|
|
53
|
+
width: fit-content;
|
|
54
|
+
border-radius: ${cssVar.borderRadius};
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
stroke: ${cssVar.colorText};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
56
|
+
line-height: 1;
|
|
69
57
|
|
|
70
|
-
|
|
71
|
-
|
|
58
|
+
&:hover {
|
|
59
|
+
.actions-hidden {
|
|
60
|
+
opacity: 1;
|
|
61
|
+
}
|
|
72
62
|
}
|
|
63
|
+
`,
|
|
64
|
+
toolbar: css`
|
|
65
|
+
pointer-events: auto;
|
|
73
66
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
position: absolute;
|
|
68
|
+
inset-block-end: 16px;
|
|
69
|
+
inset-inline-start: 50%;
|
|
70
|
+
transform: translateX(-50%);
|
|
71
|
+
`,
|
|
72
|
+
toolbarRow: css`
|
|
73
|
+
padding-block: 4px;
|
|
74
|
+
padding-inline: 6px;
|
|
75
|
+
border-radius: 999px;
|
|
78
76
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
background: color-mix(in srgb, ${cssVar.colorBgLayout} 60%, transparent);
|
|
78
|
+
backdrop-filter: blur(12px);
|
|
79
|
+
`,
|
|
80
|
+
toolbarPercentage: css`
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
user-select: none;
|
|
82
83
|
|
|
83
|
-
|
|
84
|
+
min-width: 44px;
|
|
85
|
+
height: 36px;
|
|
86
|
+
padding-inline: 8px;
|
|
87
|
+
border-radius: 999px;
|
|
84
88
|
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
font-size: 12px;
|
|
90
|
+
font-variant-numeric: tabular-nums;
|
|
91
|
+
color: ${cssVar.colorTextTertiary};
|
|
87
92
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
93
|
+
transition:
|
|
94
|
+
color 400ms ${cssVar.motionEaseOut},
|
|
95
|
+
background 100ms ${cssVar.motionEaseOut};
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
97
|
+
&:hover {
|
|
98
|
+
color: ${cssVar.colorTextSecondary};
|
|
99
|
+
background: ${cssVar.colorFillTertiary};
|
|
96
100
|
}
|
|
101
|
+
`,
|
|
102
|
+
viewerBackdrop: css`
|
|
103
|
+
position: fixed;
|
|
104
|
+
inset: 0;
|
|
97
105
|
|
|
98
|
-
|
|
99
|
-
|
|
106
|
+
opacity: 0;
|
|
107
|
+
background: color-mix(in srgb, ${cssVar.colorBgLayout} 90%, transparent);
|
|
108
|
+
backdrop-filter: blur(8px);
|
|
109
|
+
`,
|
|
110
|
+
viewerChrome: css`
|
|
111
|
+
pointer-events: none;
|
|
112
|
+
position: absolute;
|
|
113
|
+
inset: 0;
|
|
114
|
+
opacity: 0;
|
|
115
|
+
`,
|
|
116
|
+
viewerChromeIdle: css`
|
|
117
|
+
pointer-events: none;
|
|
118
|
+
position: absolute;
|
|
119
|
+
inset: 0;
|
|
120
|
+
transition:
|
|
121
|
+
opacity 200ms ${cssVar.motionEaseOut},
|
|
122
|
+
visibility 200ms;
|
|
123
|
+
|
|
124
|
+
&[data-idle-hidden] {
|
|
125
|
+
visibility: hidden;
|
|
126
|
+
opacity: 0;
|
|
100
127
|
}
|
|
101
128
|
|
|
102
|
-
|
|
103
|
-
|
|
129
|
+
@media (prefers-reduced-motion: reduce) {
|
|
130
|
+
transition: none;
|
|
104
131
|
}
|
|
132
|
+
`,
|
|
133
|
+
viewerClose: css`
|
|
134
|
+
pointer-events: auto;
|
|
105
135
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
136
|
+
position: absolute;
|
|
137
|
+
inset-block-start: 16px;
|
|
138
|
+
inset-inline-end: 16px;
|
|
139
|
+
|
|
140
|
+
filter: ${controlHalo};
|
|
109
141
|
`,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
user-select: none;
|
|
142
|
+
viewerCounter: css`
|
|
143
|
+
pointer-events: none;
|
|
113
144
|
|
|
114
|
-
position:
|
|
145
|
+
position: absolute;
|
|
146
|
+
inset-block-start: 16px;
|
|
147
|
+
inset-inline-start: 50%;
|
|
148
|
+
transform: translateX(-50%);
|
|
115
149
|
|
|
116
|
-
|
|
150
|
+
padding-block: 4px;
|
|
151
|
+
padding-inline: 12px;
|
|
152
|
+
border-radius: 999px;
|
|
117
153
|
|
|
118
|
-
|
|
119
|
-
|
|
154
|
+
font-size: 12px;
|
|
155
|
+
font-variant-numeric: tabular-nums;
|
|
156
|
+
color: ${cssVar.colorTextSecondary};
|
|
120
157
|
|
|
121
|
-
|
|
158
|
+
background: color-mix(in srgb, ${cssVar.colorBgLayout} 60%, transparent);
|
|
159
|
+
backdrop-filter: blur(12px);
|
|
160
|
+
`,
|
|
161
|
+
viewerImage: css`
|
|
162
|
+
will-change: transform;
|
|
163
|
+
cursor: zoom-out;
|
|
164
|
+
user-select: none;
|
|
122
165
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
166
|
+
position: absolute;
|
|
167
|
+
transform-origin: center center;
|
|
126
168
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
}
|
|
169
|
+
object-fit: contain;
|
|
170
|
+
|
|
171
|
+
-webkit-user-drag: none;
|
|
132
172
|
`,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
173
|
+
viewerNavButton: css`
|
|
174
|
+
pointer-events: auto;
|
|
175
|
+
|
|
176
|
+
position: absolute;
|
|
177
|
+
inset-block-start: 50%;
|
|
178
|
+
transform: translateY(-50%);
|
|
179
|
+
|
|
180
|
+
filter: ${controlHalo};
|
|
181
|
+
`,
|
|
182
|
+
viewerNavNext: css`
|
|
183
|
+
inset-inline-end: 16px;
|
|
184
|
+
`,
|
|
185
|
+
viewerNavPrev: css`
|
|
186
|
+
inset-inline-start: 16px;
|
|
187
|
+
`,
|
|
188
|
+
viewerPopup: css`
|
|
189
|
+
position: fixed;
|
|
190
|
+
inset: 0;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
outline: none;
|
|
138
193
|
`,
|
|
139
194
|
wrapper: css`
|
|
140
195
|
position: relative;
|
package/es/Image/style.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.mjs","names":["lobeStaticStylish"],"sources":["../../src/Image/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nimport { lobeStaticStylish } from '@/styles';\n\
|
|
1
|
+
{"version":3,"file":"style.mjs","names":["lobeStaticStylish"],"sources":["../../src/Image/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nimport { lobeStaticStylish } from '@/styles';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\n // Bare viewer controls float directly over arbitrary image content; the\n // theme-side halo (light halo around dark icons in light mode and vice\n // versa) is what keeps them readable without a container panel.\n const controlHalo = `drop-shadow(0 0 2px ${cssVar.colorBgLayout}) drop-shadow(0 1px 6px ${cssVar.colorBgLayout})`;\n return {\n actionsHidden: css`\n cursor: pointer;\n\n position: absolute;\n z-index: 1;\n inset-block-start: 0;\n inset-inline-end: 0;\n\n opacity: 0;\n `,\n actionsVisible: css`\n cursor: pointer;\n\n position: absolute;\n z-index: 1;\n inset-block-start: 0;\n inset-inline-end: 0;\n\n opacity: 1;\n `,\n borderless: lobeStaticStylish.variantBorderlessWithoutHover,\n filled: css`\n ${lobeStaticStylish.variantOutlinedWithoutHover};\n ${lobeStaticStylish.variantFilledWithoutHover};\n `,\n image: css`\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: auto;\n height: auto;\n `,\n outlined: lobeStaticStylish.variantOutlinedWithoutHover,\n previewable: css`\n cursor: zoom-in;\n `,\n root: css`\n cursor: pointer;\n user-select: none;\n\n position: relative;\n\n overflow: hidden;\n\n width: fit-content;\n border-radius: ${cssVar.borderRadius};\n\n line-height: 1;\n\n &:hover {\n .actions-hidden {\n opacity: 1;\n }\n }\n `,\n toolbar: css`\n pointer-events: auto;\n\n position: absolute;\n inset-block-end: 16px;\n inset-inline-start: 50%;\n transform: translateX(-50%);\n `,\n // The glass lives on the icon row, not the toolbar itself: tooltips and\n // the more-menu portal into the toolbar element, and an ancestor\n // backdrop-filter/filter would distort those popups too.\n toolbarRow: css`\n padding-block: 4px;\n padding-inline: 6px;\n border-radius: 999px;\n\n background: color-mix(in srgb, ${cssVar.colorBgLayout} 60%, transparent);\n backdrop-filter: blur(12px);\n `,\n toolbarPercentage: css`\n cursor: pointer;\n user-select: none;\n\n min-width: 44px;\n height: 36px;\n padding-inline: 8px;\n border-radius: 999px;\n\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n color: ${cssVar.colorTextTertiary};\n\n transition:\n color 400ms ${cssVar.motionEaseOut},\n background 100ms ${cssVar.motionEaseOut};\n\n &:hover {\n color: ${cssVar.colorTextSecondary};\n background: ${cssVar.colorFillTertiary};\n }\n `,\n\n viewerBackdrop: css`\n position: fixed;\n inset: 0;\n\n opacity: 0;\n background: color-mix(in srgb, ${cssVar.colorBgLayout} 90%, transparent);\n backdrop-filter: blur(8px);\n `,\n viewerChrome: css`\n pointer-events: none;\n position: absolute;\n inset: 0;\n opacity: 0;\n `,\n viewerChromeIdle: css`\n pointer-events: none;\n position: absolute;\n inset: 0;\n transition:\n opacity 200ms ${cssVar.motionEaseOut},\n visibility 200ms;\n\n &[data-idle-hidden] {\n visibility: hidden;\n opacity: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n `,\n viewerClose: css`\n pointer-events: auto;\n\n position: absolute;\n inset-block-start: 16px;\n inset-inline-end: 16px;\n\n filter: ${controlHalo};\n `,\n viewerCounter: css`\n pointer-events: none;\n\n position: absolute;\n inset-block-start: 16px;\n inset-inline-start: 50%;\n transform: translateX(-50%);\n\n padding-block: 4px;\n padding-inline: 12px;\n border-radius: 999px;\n\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n color: ${cssVar.colorTextSecondary};\n\n background: color-mix(in srgb, ${cssVar.colorBgLayout} 60%, transparent);\n backdrop-filter: blur(12px);\n `,\n viewerImage: css`\n will-change: transform;\n cursor: zoom-out;\n user-select: none;\n\n position: absolute;\n transform-origin: center center;\n\n object-fit: contain;\n\n -webkit-user-drag: none;\n `,\n viewerNavButton: css`\n pointer-events: auto;\n\n position: absolute;\n inset-block-start: 50%;\n transform: translateY(-50%);\n\n filter: ${controlHalo};\n `,\n viewerNavNext: css`\n inset-inline-end: 16px;\n `,\n viewerNavPrev: css`\n inset-inline-start: 16px;\n `,\n viewerPopup: css`\n position: fixed;\n inset: 0;\n overflow: hidden;\n outline: none;\n `,\n wrapper: css`\n position: relative;\n overflow: hidden;\n max-width: 100%;\n height: auto;\n `,\n };\n});\n\nexport const variants = cva(styles.root, {\n defaultVariants: {\n variant: 'filled',\n },\n\n variants: {\n variant: {\n filled: styles.filled,\n outlined: styles.outlined,\n borderless: styles.borderless,\n },\n },\n});\n\nexport const FALLBACK_DARK =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2IiBmaWxsPSIjM0IzQjNCIi8+CjxwYXRoIGQ9Ik0xNTYuODg4IDkxLjAwMkgxMDAuMTEyQzk1LjYzMjkgOTEuMDAyIDkyLjAwMTUgOTQuNjMzNCA5Mi4wMDE1IDk5LjExMjdWMTU1Ljg4OEM5Mi4wMDE1IDE2MC4zNjcgOTUuNjMyOSAxNjMuOTk5IDEwMC4xMTIgMTYzLjk5OUgxNTYuODg4QzE2MS4zNjcgMTYzLjk5OSAxNjQuOTk4IDE2MC4zNjcgMTY0Ljk5OCAxNTUuODg4Vjk5LjExMjdDMTY0Ljk5OCA5NC42MzM0IDE2MS4zNjcgOTEuMDAyIDE1Ni44ODggOTEuMDAyWiIgc3Ryb2tlPSIjNjI2MjYyIiBzdHJva2Utd2lkdGg9IjguMTEwNzciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTY0Ljk5OCAxMzkuNjY4TDE1Mi40ODQgMTI3LjE1M0MxNTAuOTYyIDEyNS42MzIgMTQ4LjkgMTI0Ljc3OCAxNDYuNzQ5IDEyNC43NzhDMTQ0LjU5OSAxMjQuNzc4IDE0Mi41MzYgMTI1LjYzMiAxNDEuMDE1IDEyNy4xNTNMMTA0LjE2OCAxNjRNMTE2LjMzNCAxMjMuNDQ1QzEyMC44MTMgMTIzLjQ0NSAxMjQuNDQ1IDExOS44MTQgMTI0LjQ0NSAxMTUuMzM0QzEyNC40NDUgMTEwLjg1NSAxMjAuODEzIDEwNy4yMjQgMTE2LjMzNCAxMDcuMjI0QzExMS44NTUgMTA3LjIyNCAxMDguMjIzIDExMC44NTUgMTA4LjIyMyAxMTUuMzM0QzEwOC4yMjMgMTE5LjgxNCAxMTEuODU1IDEyMy40NDUgMTE2LjMzNCAxMjMuNDQ1WiIgc3Ryb2tlPSIjNjI2MjYyIiBzdHJva2Utd2lkdGg9IjguMTEwNzciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K';\nexport const FALLBACK_LIGHT =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI1NiIgdmlld0JveD0iMCAwIDI1NiAyNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2IiBmaWxsPSIjRUNFQ0VDIi8+CjxwYXRoIGQ9Ik0xNTYuODg4IDkxLjAwMkgxMDAuMTEyQzk1LjYzMjkgOTEuMDAyIDkyLjAwMTUgOTQuNjMzNCA5Mi4wMDE1IDk5LjExMjdWMTU1Ljg4OEM5Mi4wMDE1IDE2MC4zNjcgOTUuNjMyOSAxNjMuOTk5IDEwMC4xMTIgMTYzLjk5OUgxNTYuODg4QzE2MS4zNjcgMTYzLjk5OSAxNjQuOTk4IDE2MC4zNjcgMTY0Ljk5OCAxNTUuODg4Vjk5LjExMjdDMTY0Ljk5OCA5NC42MzM0IDE2MS4zNjcgOTEuMDAyIDE1Ni44ODggOTEuMDAyWiIgc3Ryb2tlPSIjRDdEN0Q3IiBzdHJva2Utd2lkdGg9IjguMTEwNzciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTY0Ljk5OCAxMzkuNjY4TDE1Mi40ODQgMTI3LjE1M0MxNTAuOTYyIDEyNS42MzIgMTQ4LjkgMTI0Ljc3OCAxNDYuNzQ5IDEyNC43NzhDMTQ0LjU5OSAxMjQuNzc4IDE0Mi41MzYgMTI1LjYzMiAxNDEuMDE1IDEyNy4xNTNMMTA0LjE2OCAxNjRNMTE2LjMzNCAxMjMuNDQ1QzEyMC44MTMgMTIzLjQ0NSAxMjQuNDQ1IDExOS44MTQgMTI0LjQ0NSAxMTUuMzM0QzEyNC40NDUgMTEwLjg1NSAxMjAuODEzIDEwNy4yMjQgMTE2LjMzNCAxMDcuMjI0QzExMS44NTUgMTA3LjIyNCAxMDguMjIzIDExMC44NTUgMTA4LjIyMyAxMTUuMzM0QzEwOC4yMjMgMTE5LjgxNCAxMTEuODU1IDEyMy40NDUgMTE2LjMzNCAxMjMuNDQ1WiIgc3Ryb2tlPSIjRDdEN0Q3IiBzdHJva2Utd2lkdGg9IjguMTEwNzciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K';\n"],"mappings":";;;;AAKA,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;CAI5D,MAAM,cAAc,uBAAuB,OAAO,cAAc,0BAA0B,OAAO,cAAc;CAC/G,OAAO;EACL,eAAe,GAAG;;;;;;;;;;EAUlB,gBAAgB,GAAG;;;;;;;;;;EAUnB,YAAYA,cAAkB;EAC9B,QAAQ,GAAG;QACPA,cAAkB,4BAA4B;QAC9CA,cAAkB,0BAA0B;;EAEhD,OAAO,GAAG;;;;;;;;EAQV,UAAUA,cAAkB;EAC5B,aAAa,GAAG;;;EAGhB,MAAM,GAAG;;;;;;;;;uBASU,OAAO,aAAa;;;;;;;;;;EAUvC,SAAS,GAAG;;;;;;;;EAWZ,YAAY,GAAG;;;;;uCAKoB,OAAO,cAAc;;;EAGxD,mBAAmB,GAAG;;;;;;;;;;;eAWX,OAAO,kBAAkB;;;sBAGlB,OAAO,cAAc;2BAChB,OAAO,cAAc;;;iBAG/B,OAAO,mBAAmB;sBACrB,OAAO,kBAAkB;;;EAI3C,gBAAgB,GAAG;;;;;uCAKgB,OAAO,cAAc;;;EAGxD,cAAc,GAAG;;;;;;EAMjB,kBAAkB,GAAG;;;;;wBAKD,OAAO,cAAc;;;;;;;;;;;;EAYzC,aAAa,GAAG;;;;;;;gBAOJ,YAAY;;EAExB,eAAe,GAAG;;;;;;;;;;;;;;eAcP,OAAO,mBAAmB;;uCAEF,OAAO,cAAc;;;EAGxD,aAAa,GAAG;;;;;;;;;;;;EAYhB,iBAAiB,GAAG;;;;;;;gBAOR,YAAY;;EAExB,eAAe,GAAG;;;EAGlB,eAAe,GAAG;;;EAGlB,aAAa,GAAG;;;;;;EAMhB,SAAS,GAAG;;;;;;CAMd;AACF,CAAC;AAED,MAAa,WAAW,IAAI,OAAO,MAAM;CACvC,iBAAiB,EACf,SAAS,SACX;CAEA,UAAU,EACR,SAAS;EACP,QAAQ,OAAO;EACf,UAAU,OAAO;EACjB,YAAY,OAAO;CACrB,EACF;AACF,CAAC;AAED,MAAa,gBACX;AACF,MAAa,iBACX"}
|