@lobehub/ui 5.25.0 → 5.26.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.
Files changed (62) hide show
  1. package/es/Image/Image.mjs +138 -37
  2. package/es/Image/Image.mjs.map +1 -1
  3. package/es/Image/PreviewGroup.d.mts +1 -0
  4. package/es/Image/PreviewGroup.mjs +33 -10
  5. package/es/Image/PreviewGroup.mjs.map +1 -1
  6. package/es/Image/index.d.mts +2 -2
  7. package/es/Image/index.mjs +1 -1
  8. package/es/Image/style.mjs +126 -71
  9. package/es/Image/style.mjs.map +1 -1
  10. package/es/Image/type.d.mts +14 -17
  11. package/es/Image/viewer/GalleryNav.mjs +44 -0
  12. package/es/Image/viewer/GalleryNav.mjs.map +1 -0
  13. package/es/Image/viewer/ImageViewer.mjs +275 -0
  14. package/es/Image/viewer/ImageViewer.mjs.map +1 -0
  15. package/es/Image/viewer/PreviewOutlet.mjs +19 -0
  16. package/es/Image/viewer/PreviewOutlet.mjs.map +1 -0
  17. package/es/Image/viewer/Toolbar.mjs +184 -0
  18. package/es/Image/viewer/Toolbar.mjs.map +1 -0
  19. package/es/Image/viewer/ViewerChrome.mjs +54 -0
  20. package/es/Image/viewer/ViewerChrome.mjs.map +1 -0
  21. package/es/Image/viewer/geometry.mjs +85 -0
  22. package/es/Image/viewer/geometry.mjs.map +1 -0
  23. package/es/Image/viewer/registry.d.mts +2 -0
  24. package/es/Image/viewer/registry.mjs +52 -0
  25. package/es/Image/viewer/registry.mjs.map +1 -0
  26. package/es/Image/viewer/useChromeIdle.mjs +72 -0
  27. package/es/Image/viewer/useChromeIdle.mjs.map +1 -0
  28. package/es/Image/viewer/useFinalFocus.mjs +10 -0
  29. package/es/Image/viewer/useFinalFocus.mjs.map +1 -0
  30. package/es/Image/viewer/useFlipTransition.mjs +321 -0
  31. package/es/Image/viewer/useFlipTransition.mjs.map +1 -0
  32. package/es/Image/viewer/useGalleryNav.mjs +89 -0
  33. package/es/Image/viewer/useGalleryNav.mjs.map +1 -0
  34. package/es/Image/viewer/useRefitTransition.mjs +47 -0
  35. package/es/Image/viewer/useRefitTransition.mjs.map +1 -0
  36. package/es/Image/viewer/useViewerGestures.mjs +148 -0
  37. package/es/Image/viewer/useViewerGestures.mjs.map +1 -0
  38. package/es/Image/viewer/useZoomPan.mjs +346 -0
  39. package/es/Image/viewer/useZoomPan.mjs.map +1 -0
  40. package/es/base-ui/Toast/hostGuard.mjs +26 -0
  41. package/es/base-ui/Toast/hostGuard.mjs.map +1 -0
  42. package/es/base-ui/Toast/imperative.mjs +43 -20
  43. package/es/base-ui/Toast/imperative.mjs.map +1 -1
  44. package/es/base-ui/Toast/pendingQueue.mjs +30 -0
  45. package/es/base-ui/Toast/pendingQueue.mjs.map +1 -0
  46. package/es/base-ui/index.mjs +1 -1
  47. package/es/i18n/resources/en/image.d.mts +5 -0
  48. package/es/i18n/resources/en/image.mjs +6 -1
  49. package/es/i18n/resources/en/image.mjs.map +1 -1
  50. package/es/i18n/resources/zhCn/image.d.mts +5 -0
  51. package/es/i18n/resources/zhCn/image.mjs +6 -1
  52. package/es/i18n/resources/zhCn/image.mjs.map +1 -1
  53. package/es/index.mjs +8 -8
  54. package/package.json +1 -1
  55. package/es/Image/components/Preview.mjs +0 -23
  56. package/es/Image/components/Preview.mjs.map +0 -1
  57. package/es/Image/components/Toolbar.mjs +0 -129
  58. package/es/Image/components/Toolbar.mjs.map +0 -1
  59. package/es/Image/components/usePreview.mjs +0 -58
  60. package/es/Image/components/usePreview.mjs.map +0 -1
  61. package/es/Image/components/usePreviewGroup.mjs +0 -57
  62. package/es/Image/components/usePreviewGroup.mjs.map +0 -1
@@ -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 usePreview from "./components/usePreview.mjs";
5
- import { memo } from "react";
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 { Image, Skeleton } from "antd";
8
- import { cssVar, cx, useThemeMode } from "antd-style";
10
+ import { cx, useThemeMode } from "antd-style";
9
11
  //#region src/Image/Image.tsx
10
- const Image$1 = memo(({ ref, style, preview, isLoading, maxHeight = "100%", maxWidth = "100%", minHeight, minWidth, actions, className, alwaysShowActions, variant = "filled", objectFit = "cover", classNames, styles: customStyles, onClick, width, height, ...rest }) => {
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(Skeleton.Avatar, {
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
- width
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: [actions && /* @__PURE__ */ jsx("div", {
34
- className: cx(actionsClassName, alwaysShowActions ? "" : "actions-hidden"),
35
- children: actions
36
- }), /* @__PURE__ */ jsx(Image, {
37
- className: cx(styles.image, classNames?.image),
38
- fallback: isDarkMode ? FALLBACK_DARK : FALLBACK_LIGHT,
39
- height,
40
- loading: "lazy",
41
- preview: preview === false ? false : mergePreview,
42
- width,
43
- classNames: { root: cx(styles.wrapper, classNames?.wrapper) },
44
- style: {
45
- maxHeight,
46
- maxWidth,
47
- minHeight,
48
- minWidth,
49
- objectFit: objectFit || "cover",
50
- ...customStyles?.image
51
- },
52
- styles: { root: customStyles?.wrapper },
53
- onClick,
54
- ...rest
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$1.displayName = "Image";
159
+ Image.displayName = "Image";
59
160
  //#endregion
60
- export { Image$1 as default };
161
+ export { Image as default };
61
162
 
62
163
  //# sourceMappingURL=Image.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.mjs","names":["Image","Flexbox","AntImage"],"sources":["../../src/Image/Image.tsx"],"sourcesContent":["'use client';\n\nimport { Image as AntImage, Skeleton } from 'antd';\nimport { cssVar, cx, useThemeMode } from 'antd-style';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport usePreview from './components/usePreview';\nimport { FALLBACK_DARK, FALLBACK_LIGHT, styles, variants } from './style';\nimport type { ImageProps } from './type';\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 width,\n height,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n const actionsClassName = alwaysShowActions ? styles.actionsVisible : styles.actionsHidden;\n const mergePreview = usePreview(preview);\n\n if (isLoading)\n return (\n <div onClick={onClick}>\n <Skeleton.Avatar\n active\n style={{\n borderRadius: cssVar.borderRadius,\n height,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n width,\n }}\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 <AntImage\n className={cx(styles.image, classNames?.image)}\n fallback={isDarkMode ? FALLBACK_DARK : FALLBACK_LIGHT}\n height={height}\n loading={'lazy'}\n preview={preview === false ? false : (mergePreview as any)}\n width={width}\n classNames={{\n root: cx(styles.wrapper, classNames?.wrapper),\n }}\n style={{\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n objectFit: objectFit || 'cover',\n ...customStyles?.image,\n }}\n styles={{\n root: customStyles?.wrapper,\n }}\n onClick={onClick}\n {...rest}\n />\n </Flexbox>\n );\n },\n);\n\nImage.displayName = 'Image';\n\nexport default Image;\n"],"mappings":";;;;;;;;;AAYA,MAAMA,UAAQ,MACX,EACC,KACA,OACA,SACA,WACA,YAAY,QACZ,WAAW,QACX,WACA,UACA,SACA,WACA,mBACA,UAAU,UACV,YAAY,SACZ,YACA,QAAQ,cACR,SACA,OACA,QACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,aAAa;CACpC,MAAM,mBAAmB,oBAAoB,OAAO,iBAAiB,OAAO;CAC5E,MAAM,eAAe,WAAW,OAAO;CAEvC,IAAI,WACF,OACE,oBAAC,OAAD;EAAc;EACZ,UAAA,oBAAC,SAAS,QAAV;GACE,QAAA;GACA,OAAO;IACL,cAAc,OAAO;IACrB;IACA;IACA;IACA;IACA;IACA;GACF;EACD,CAAA;CACE,CAAA;CAGT,OACE,qBAACC,mBAAD;EAAS,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,GAAG,SAAS;EAAQ;EAAY;EAA3E,UAAA,CACG,WACC,oBAAC,OAAD;GAAK,WAAW,GAAG,kBAAkB,oBAAoB,KAAK,gBAAgB;GAC3E,UAAA;EACE,CAAA,GAEP,oBAACC,OAAD;GACE,WAAW,GAAG,OAAO,OAAO,YAAY,KAAK;GAC7C,UAAU,aAAa,gBAAgB;GAC/B;GACR,SAAS;GACT,SAAS,YAAY,QAAQ,QAAS;GAC/B;GACP,YAAY,EACV,MAAM,GAAG,OAAO,SAAS,YAAY,OAAO,EAC9C;GACA,OAAO;IACL;IACA;IACA;IACA;IACA,WAAW,aAAa;IACxB,GAAG,cAAc;GACnB;GACA,QAAQ,EACN,MAAM,cAAc,QACtB;GACS;GACT,GAAI;EACL,CAAA,CACM;;AAEb,CACF;AAEA,QAAM,cAAc"}
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,4 +1,5 @@
1
1
  import { PreviewGroupProps } from "./type.mjs";
2
+ import "./viewer/registry.mjs";
2
3
  //#region src/Image/PreviewGroup.d.ts
3
4
  declare const PreviewGroup: import("react").NamedExoticComponent<PreviewGroupProps>;
4
5
  //#endregion
@@ -1,21 +1,44 @@
1
1
  "use client";
2
- import usePreview from "./components/usePreviewGroup.mjs";
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 { PreviewGroup: AntdPreviewGroup } = Image;
8
- const PreviewGroup = memo(({ items, children, enable = true, preview }) => {
9
- const mergePreview = usePreview(preview);
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(AntdPreviewGroup, {
12
- items,
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":["usePreviewGroup"],"sources":["../../src/Image/PreviewGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Image } from 'antd';\nimport { memo } from 'react';\n\nimport usePreviewGroup from './components/usePreviewGroup';\nimport type { PreviewGroupProps } from './type';\n\nconst { PreviewGroup: AntdPreviewGroup } = Image;\n\nconst PreviewGroup = memo<PreviewGroupProps>(({ items, children, enable = true, preview }) => {\n const mergePreview = usePreviewGroup(preview);\n\n if (!enable) return children;\n\n return (\n <AntdPreviewGroup items={items} preview={mergePreview}>\n {children}\n </AntdPreviewGroup>\n );\n});\n\nPreviewGroup.displayName = 'PreviewGroup';\n\nexport default PreviewGroup;\n"],"mappings":";;;;;;AAQA,MAAM,EAAE,cAAc,qBAAqB;AAE3C,MAAM,eAAe,MAAyB,EAAE,OAAO,UAAU,SAAS,MAAM,cAAc;CAC5F,MAAM,eAAeA,WAAgB,OAAO;CAE5C,IAAI,CAAC,QAAQ,OAAO;CAEpB,OACE,oBAAC,kBAAD;EAAyB;EAAO,SAAS;EACtC;CACe,CAAA;AAEtB,CAAC;AAED,aAAa,cAAc"}
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"}
@@ -1,4 +1,4 @@
1
- import { ImagePreviewOptions, ImageProps, PreviewGroupPreviewOptions, PreviewGroupProps } from "./type.mjs";
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 PreviewGroupPreviewOptions, type PreviewGroupProps, Image as default };
11
+ export { IImage, type ImagePreviewOptions, type ImageProps, PreviewGroup, type PreviewGroupProps, Image as default };
12
12
  //# sourceMappingURL=index.d.mts.map
@@ -1,5 +1,5 @@
1
- import Image$1 from "./Image.mjs";
2
1
  import PreviewGroup from "./PreviewGroup.mjs";
2
+ import Image$1 from "./Image.mjs";
3
3
  //#region src/Image/index.ts
4
4
  const Image = Image$1;
5
5
  Image.PreviewGroup = PreviewGroup;
@@ -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
- preview: css`
47
- .${prefixCls}-image-preview-mask {
48
- background: color-mix(in srgb, ${cssVar.colorBgLayout} 90%, transparent);
49
- }
42
+ previewable: css`
43
+ cursor: zoom-in;
44
+ `,
45
+ root: css`
46
+ cursor: pointer;
47
+ user-select: none;
50
48
 
51
- .${prefixCls}-image-preview-close {
52
- color: ${cssVar.colorTextDescription};
53
- background: ${cssVar.colorBgContainer};
54
- box-shadow: ${cssVar.boxShadowTertiary};
49
+ position: relative;
55
50
 
56
- svg {
57
- stroke: ${cssVar.colorTextDescription};
58
- }
51
+ overflow: hidden;
59
52
 
60
- &:hover {
61
- color: ${cssVar.colorText};
62
- background: ${cssVar.colorBgContainer};
53
+ width: fit-content;
54
+ border-radius: ${cssVar.borderRadius};
63
55
 
64
- svg {
65
- stroke: ${cssVar.colorText};
66
- }
67
- }
68
- }
56
+ line-height: 1;
69
57
 
70
- .${prefixCls}-image-preview-img {
71
- width: 100%;
58
+ &:hover {
59
+ .actions-hidden {
60
+ opacity: 1;
61
+ }
72
62
  }
63
+ `,
64
+ toolbar: css`
65
+ pointer-events: auto;
73
66
 
74
- .${prefixCls}-image-preview-switch {
75
- display: flex;
76
- align-items: center;
77
- justify-content: center;
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
- width: 32px;
80
- height: 32px;
81
- padding: 0;
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
- color: ${cssVar.colorTextDescription};
84
+ min-width: 44px;
85
+ height: 36px;
86
+ padding-inline: 8px;
87
+ border-radius: 999px;
84
88
 
85
- background: ${cssVar.colorBgContainer};
86
- box-shadow: ${cssVar.boxShadowTertiary};
89
+ font-size: 12px;
90
+ font-variant-numeric: tabular-nums;
91
+ color: ${cssVar.colorTextTertiary};
87
92
 
88
- svg {
89
- transform: scale(0.75);
90
- }
93
+ transition:
94
+ color 400ms ${cssVar.motionEaseOut},
95
+ background 100ms ${cssVar.motionEaseOut};
91
96
 
92
- &:hover {
93
- color: ${cssVar.colorText};
94
- background: ${cssVar.colorBgContainer};
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
- .${prefixCls}-image-preview-switch-disabled {
99
- display: none;
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
- .ant-image-preview-progress {
103
- color: ${cssVar.colorTextDescription};
129
+ @media (prefers-reduced-motion: reduce) {
130
+ transition: none;
104
131
  }
132
+ `,
133
+ viewerClose: css`
134
+ pointer-events: auto;
105
135
 
106
- img {
107
- min-width: 100%;
108
- }
136
+ position: absolute;
137
+ inset-block-start: 16px;
138
+ inset-inline-end: 16px;
139
+
140
+ filter: ${controlHalo};
109
141
  `,
110
- root: css`
111
- cursor: pointer;
112
- user-select: none;
142
+ viewerCounter: css`
143
+ pointer-events: none;
113
144
 
114
- position: relative;
145
+ position: absolute;
146
+ inset-block-start: 16px;
147
+ inset-inline-start: 50%;
148
+ transform: translateX(-50%);
115
149
 
116
- overflow: hidden;
150
+ padding-block: 4px;
151
+ padding-inline: 12px;
152
+ border-radius: 999px;
117
153
 
118
- width: fit-content;
119
- border-radius: ${cssVar.borderRadius};
154
+ font-size: 12px;
155
+ font-variant-numeric: tabular-nums;
156
+ color: ${cssVar.colorTextSecondary};
120
157
 
121
- line-height: 1;
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
- .${prefixCls}-image-cover {
124
- display: none !important;
125
- }
166
+ position: absolute;
167
+ transform-origin: center center;
126
168
 
127
- &:hover {
128
- .actions-hidden {
129
- opacity: 1;
130
- }
131
- }
169
+ object-fit: contain;
170
+
171
+ -webkit-user-drag: none;
132
172
  `,
133
- toolbar: css`
134
- ${staticStylish.variantOutlinedWithoutHover};
135
- padding: 4px;
136
- border-color: ${cssVar.colorFillTertiary};
137
- border-radius: ${cssVar.borderRadiusLG};
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;
@@ -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\nconst prefixCls = 'ant';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\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 mask: css`\n ${lobeStaticStylish.blur};\n backdrop-filter: blur(8px);\n `,\n outlined: lobeStaticStylish.variantOutlinedWithoutHover,\n preview: css`\n .${prefixCls}-image-preview-mask {\n background: color-mix(in srgb, ${cssVar.colorBgLayout} 90%, transparent);\n }\n\n .${prefixCls}-image-preview-close {\n color: ${cssVar.colorTextDescription};\n background: ${cssVar.colorBgContainer};\n box-shadow: ${cssVar.boxShadowTertiary};\n\n svg {\n stroke: ${cssVar.colorTextDescription};\n }\n\n &:hover {\n color: ${cssVar.colorText};\n background: ${cssVar.colorBgContainer};\n\n svg {\n stroke: ${cssVar.colorText};\n }\n }\n }\n\n .${prefixCls}-image-preview-img {\n width: 100%;\n }\n\n .${prefixCls}-image-preview-switch {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n\n color: ${cssVar.colorTextDescription};\n\n background: ${cssVar.colorBgContainer};\n box-shadow: ${cssVar.boxShadowTertiary};\n\n svg {\n transform: scale(0.75);\n }\n\n &:hover {\n color: ${cssVar.colorText};\n background: ${cssVar.colorBgContainer};\n }\n }\n\n .${prefixCls}-image-preview-switch-disabled {\n display: none;\n }\n\n .ant-image-preview-progress {\n color: ${cssVar.colorTextDescription};\n }\n\n img {\n min-width: 100%;\n }\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 .${prefixCls}-image-cover {\n display: none !important;\n }\n\n &:hover {\n .actions-hidden {\n opacity: 1;\n }\n }\n `,\n toolbar: css`\n ${lobeStaticStylish.variantOutlinedWithoutHover};\n padding: 4px;\n border-color: ${cssVar.colorFillTertiary};\n border-radius: ${cssVar.borderRadiusLG};\n `,\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,MAAM,YAAY;AAElB,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;CAC5D,OAAO;EACL,eAAe,GAAG;;;;;;;;;;EAUlB,gBAAgB,GAAG;;;;;;;;;;EAUnB,YAAYA,cAAkB;EAC9B,QAAQ,GAAG;QACPA,cAAkB,4BAA4B;QAC9CA,cAAkB,0BAA0B;;EAEhD,OAAO,GAAG;;;;;;;;EAQV,MAAM,GAAG;QACLA,cAAkB,KAAK;;;EAG3B,UAAUA,cAAkB;EAC5B,SAAS,GAAG;SACP,UAAU;yCACsB,OAAO,cAAc;;;SAGrD,UAAU;iBACF,OAAO,qBAAqB;sBACvB,OAAO,iBAAiB;sBACxB,OAAO,kBAAkB;;;oBAG3B,OAAO,qBAAqB;;;;mBAI7B,OAAO,UAAU;wBACZ,OAAO,iBAAiB;;;sBAG1B,OAAO,UAAU;;;;;SAK9B,UAAU;;;;SAIV,UAAU;;;;;;;;;iBASF,OAAO,qBAAqB;;sBAEvB,OAAO,iBAAiB;sBACxB,OAAO,kBAAkB;;;;;;;mBAO5B,OAAO,UAAU;wBACZ,OAAO,iBAAiB;;;;SAIvC,UAAU;;;;;iBAKF,OAAO,qBAAqB;;;;;;;EAOzC,MAAM,GAAG;;;;;;;;;uBASU,OAAO,aAAa;;;;SAIlC,UAAU;;;;;;;;;;EAUf,SAAS,GAAG;QACRA,cAAkB,4BAA4B;;sBAEhC,OAAO,kBAAkB;uBACxB,OAAO,eAAe;;EAGzC,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"}
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"}