@v-c/image 0.0.1

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 (105) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Image.cjs +228 -0
  3. package/dist/Image.d.ts +46 -0
  4. package/dist/Image.js +226 -0
  5. package/dist/Preview/CloseBtn.cjs +41 -0
  6. package/dist/Preview/CloseBtn.d.ts +8 -0
  7. package/dist/Preview/CloseBtn.js +39 -0
  8. package/dist/Preview/Footer.cjs +231 -0
  9. package/dist/Preview/Footer.d.ts +24 -0
  10. package/dist/Preview/Footer.js +229 -0
  11. package/dist/Preview/PrevNext.cjs +56 -0
  12. package/dist/Preview/PrevNext.d.ts +10 -0
  13. package/dist/Preview/PrevNext.js +54 -0
  14. package/dist/Preview/index.cjs +399 -0
  15. package/dist/Preview/index.d.ts +101 -0
  16. package/dist/Preview/index.js +397 -0
  17. package/dist/PreviewGroup.cjs +135 -0
  18. package/dist/PreviewGroup.d.ts +34 -0
  19. package/dist/PreviewGroup.js +133 -0
  20. package/dist/common.cjs +12 -0
  21. package/dist/common.d.ts +2 -0
  22. package/dist/common.js +12 -0
  23. package/dist/context.cjs +10 -0
  24. package/dist/context.d.ts +7 -0
  25. package/dist/context.js +9 -0
  26. package/dist/getFixScaleEleTransPosition.cjs +25 -0
  27. package/dist/getFixScaleEleTransPosition.d.ts +16 -0
  28. package/dist/getFixScaleEleTransPosition.js +24 -0
  29. package/dist/hooks/useImageTransform.cjs +96 -0
  30. package/dist/hooks/useImageTransform.d.ts +21 -0
  31. package/dist/hooks/useImageTransform.js +95 -0
  32. package/dist/hooks/useMouseEvent.cjs +93 -0
  33. package/dist/hooks/useMouseEvent.d.ts +9 -0
  34. package/dist/hooks/useMouseEvent.js +92 -0
  35. package/dist/hooks/usePreviewItems.cjs +45 -0
  36. package/dist/hooks/usePreviewItems.d.ts +10 -0
  37. package/dist/hooks/usePreviewItems.js +44 -0
  38. package/dist/hooks/useRegisterImage.cjs +25 -0
  39. package/dist/hooks/useRegisterImage.d.ts +3 -0
  40. package/dist/hooks/useRegisterImage.js +24 -0
  41. package/dist/hooks/useStatus.cjs +46 -0
  42. package/dist/hooks/useStatus.d.ts +13 -0
  43. package/dist/hooks/useStatus.js +45 -0
  44. package/dist/hooks/useTouchEvent.cjs +120 -0
  45. package/dist/hooks/useTouchEvent.d.ts +8 -0
  46. package/dist/hooks/useTouchEvent.js +119 -0
  47. package/dist/index.cjs +8 -0
  48. package/dist/index.d.ts +11 -0
  49. package/dist/index.js +6 -0
  50. package/dist/interface.cjs +0 -0
  51. package/dist/interface.d.ts +13 -0
  52. package/dist/interface.js +0 -0
  53. package/dist/portal/dist/Context.cjs +12 -0
  54. package/dist/portal/dist/Context.js +11 -0
  55. package/dist/portal/dist/Portal.cjs +91 -0
  56. package/dist/portal/dist/Portal.js +91 -0
  57. package/dist/portal/dist/index.cjs +3 -0
  58. package/dist/portal/dist/index.js +3 -0
  59. package/dist/portal/dist/useDom.cjs +47 -0
  60. package/dist/portal/dist/useDom.js +47 -0
  61. package/dist/portal/dist/useScrollLocker.cjs +26 -0
  62. package/dist/portal/dist/useScrollLocker.js +26 -0
  63. package/dist/portal/dist/util.cjs +4 -0
  64. package/dist/portal/dist/util.js +4 -0
  65. package/dist/previewConfig.cjs +4 -0
  66. package/dist/previewConfig.d.ts +4 -0
  67. package/dist/previewConfig.js +3 -0
  68. package/dist/util/dist/Dom/canUseDom.cjs +4 -0
  69. package/dist/util/dist/Dom/canUseDom.js +4 -0
  70. package/dist/util/dist/Dom/contains.cjs +11 -0
  71. package/dist/util/dist/Dom/contains.js +11 -0
  72. package/dist/util/dist/Dom/dynamicCSS.cjs +78 -0
  73. package/dist/util/dist/Dom/dynamicCSS.js +77 -0
  74. package/dist/util/dist/KeyCode.cjs +81 -0
  75. package/dist/util/dist/KeyCode.js +81 -0
  76. package/dist/util/dist/RenderComponent.cjs +29 -0
  77. package/dist/util/dist/RenderComponent.js +29 -0
  78. package/dist/util/dist/classnames.cjs +36 -0
  79. package/dist/util/dist/classnames.js +35 -0
  80. package/dist/util/dist/getScrollBarSize.cjs +45 -0
  81. package/dist/util/dist/getScrollBarSize.js +45 -0
  82. package/dist/util/dist/hooks/useMergedState.cjs +24 -0
  83. package/dist/util/dist/hooks/useMergedState.js +24 -0
  84. package/dist/util/dist/index.cjs +3 -0
  85. package/dist/util/dist/index.js +3 -0
  86. package/dist/util/dist/isEqual.cjs +27 -0
  87. package/dist/util/dist/isEqual.js +27 -0
  88. package/dist/util/dist/omit.cjs +8 -0
  89. package/dist/util/dist/omit.js +8 -0
  90. package/dist/util/dist/pickAttrs.cjs +39 -0
  91. package/dist/util/dist/pickAttrs.js +39 -0
  92. package/dist/util/dist/props-util/index.cjs +47 -0
  93. package/dist/util/dist/props-util/index.js +44 -0
  94. package/dist/util/dist/raf.cjs +36 -0
  95. package/dist/util/dist/raf.js +36 -0
  96. package/dist/util/dist/type.cjs +2 -0
  97. package/dist/util/dist/type.js +2 -0
  98. package/dist/util/dist/utils/transition.cjs +21 -0
  99. package/dist/util/dist/utils/transition.js +21 -0
  100. package/dist/util/dist/warning.cjs +37 -0
  101. package/dist/util/dist/warning.js +37 -0
  102. package/dist/util.cjs +26 -0
  103. package/dist/util.d.ts +5 -0
  104. package/dist/util.js +25 -0
  105. package/package.json +48 -0
@@ -0,0 +1,397 @@
1
+ import { clsx } from "../util/dist/classnames.js";
2
+ import "../util/dist/index.js";
3
+ import { usePreviewGroupContext } from "../context.js";
4
+ import useStatus from "../hooks/useStatus.js";
5
+ import { src_default } from "../portal/dist/index.js";
6
+ import { KeyCodeStr } from "../util/dist/KeyCode.js";
7
+ import { getTransitionProps } from "../util/dist/utils/transition.js";
8
+ import useImageTransform from "../hooks/useImageTransform.js";
9
+ import { BASE_SCALE_RATIO } from "../previewConfig.js";
10
+ import useMouseEvent from "../hooks/useMouseEvent.js";
11
+ import useTouchEvent from "../hooks/useTouchEvent.js";
12
+ import CloseBtn_default from "./CloseBtn.js";
13
+ import Footer_default from "./Footer.js";
14
+ import PrevNext_default from "./PrevNext.js";
15
+ import { Transition, computed, createVNode, defineComponent, mergeDefaults, mergeProps, nextTick, shallowRef, watch, watchEffect } from "vue";
16
+ var Preview_default = /* @__PURE__ */ defineComponent((props, { attrs }) => {
17
+ const imgEl = shallowRef();
18
+ const groupContext = usePreviewGroupContext();
19
+ const showLeftOrRightSwitches = computed(() => !!groupContext && (props.count ?? 1) > 1);
20
+ const showOperationsProgress = computed(() => !!groupContext && (props.count ?? 1) >= 1);
21
+ const enableTransition = shallowRef(true);
22
+ watch(enableTransition, async (val) => {
23
+ if (!val) {
24
+ await nextTick();
25
+ enableTransition.value = true;
26
+ }
27
+ });
28
+ const { transform, resetTransform, updateTransform, dispatchZoomChange } = useImageTransform(imgEl, computed(() => props.minScale ?? 1), computed(() => props.maxScale ?? 50), (info) => props.onTransform?.(info));
29
+ const { isMoving, onMouseDown, onWheel } = useMouseEvent(imgEl, computed(() => props.movable ?? true), computed(() => !!props.open), computed(() => props.scaleStep ?? .5), transform, updateTransform, dispatchZoomChange);
30
+ const { isTouching, onTouchStart, onTouchMove, onTouchEnd } = useTouchEvent(imgEl, computed(() => props.movable ?? true), computed(() => !!props.open), computed(() => props.minScale ?? 1), transform, updateTransform, dispatchZoomChange);
31
+ watch(() => props.open, (open) => {
32
+ if (!open) resetTransform("close");
33
+ });
34
+ const onDoubleClick = (event) => {
35
+ if (!props.open) return;
36
+ if (transform.value.scale !== 1) updateTransform({
37
+ x: 0,
38
+ y: 0,
39
+ scale: 1
40
+ }, "doubleClick");
41
+ else dispatchZoomChange(1 + (props.scaleStep ?? .5), "doubleClick", event.clientX, event.clientY);
42
+ };
43
+ const onZoomIn = () => {
44
+ dispatchZoomChange(1 + (props.scaleStep ?? .5), "zoomIn");
45
+ };
46
+ const onZoomOut = () => {
47
+ dispatchZoomChange(1 / (1 + (props.scaleStep ?? .5)), "zoomOut");
48
+ };
49
+ const onRotateRight = () => {
50
+ updateTransform({ rotate: transform.value.rotate + 90 }, "rotateRight");
51
+ };
52
+ const onRotateLeft = () => {
53
+ updateTransform({ rotate: transform.value.rotate - 90 }, "rotateLeft");
54
+ };
55
+ const onFlipX = () => {
56
+ updateTransform({ flipX: !transform.value.flipX }, "flipX");
57
+ };
58
+ const onFlipY = () => {
59
+ updateTransform({ flipY: !transform.value.flipY }, "flipY");
60
+ };
61
+ const onReset = () => {
62
+ resetTransform("reset");
63
+ };
64
+ const onActive = (offset) => {
65
+ const current = props.current ?? 0;
66
+ const count = props.count ?? 1;
67
+ const nextCurrent = current + offset;
68
+ if (nextCurrent >= 0 && nextCurrent <= count - 1) {
69
+ enableTransition.value = false;
70
+ resetTransform(offset < 0 ? "prev" : "next");
71
+ props.onChange?.(nextCurrent, current);
72
+ }
73
+ };
74
+ const onKeyDown = (event) => {
75
+ if (!props.open) return;
76
+ const { key } = event;
77
+ if (key === KeyCodeStr.Escape) {
78
+ props.onClose?.();
79
+ return;
80
+ }
81
+ if (showLeftOrRightSwitches.value) {
82
+ if (key === KeyCodeStr.ArrowLeft) onActive(-1);
83
+ else if (key === KeyCodeStr.ArrowRight) onActive(1);
84
+ }
85
+ };
86
+ watchEffect((onCleanup) => {
87
+ if (props.open) window.addEventListener("keydown", onKeyDown);
88
+ onCleanup(() => {
89
+ window.removeEventListener("keydown", onKeyDown);
90
+ });
91
+ });
92
+ const lockScroll = shallowRef(false);
93
+ watch(() => props.open, (open) => {
94
+ if (open) lockScroll.value = true;
95
+ });
96
+ const portalRender = shallowRef(false);
97
+ watch(() => props.open, (open) => {
98
+ if (open) portalRender.value = true;
99
+ });
100
+ const onVisibleChanged = (nextVisible) => {
101
+ if (!nextVisible) {
102
+ lockScroll.value = false;
103
+ portalRender.value = false;
104
+ }
105
+ props.afterOpenChange?.(nextVisible);
106
+ };
107
+ const setImgRef = (el) => {
108
+ imgEl.value = el;
109
+ };
110
+ const [getImgRef, srcAndOnload] = useStatus({
111
+ src: computed(() => props.src),
112
+ fallback: computed(() => props.fallback)
113
+ });
114
+ return () => {
115
+ const { prefixCls, rootClassName, src, alt, imageInfo, open, closeIcon, getContainer, current = 0, count = 1, countRender, motionName = "fade", imageRender, imgCommonProps, actionsRender, classNames = {}, styles = {}, mousePosition, zIndex, icons = {} } = props;
116
+ const bodyStyle = { ...styles.body ?? {} };
117
+ if (mousePosition) bodyStyle.transformOrigin = `${mousePosition.x}px ${mousePosition.y}px`;
118
+ const image = {
119
+ url: src || "",
120
+ alt: alt || "",
121
+ ...imageInfo
122
+ };
123
+ const imgNode = createVNode("img", mergeProps(imgCommonProps, {
124
+ "src": srcAndOnload.value.src,
125
+ "ref": (el) => {
126
+ setImgRef(el);
127
+ getImgRef(el);
128
+ },
129
+ "width": props.width,
130
+ "height": props.height,
131
+ "class": `${prefixCls}-img`,
132
+ "alt": alt,
133
+ "onLoad": srcAndOnload.value.onLoad,
134
+ "style": {
135
+ transform: `translate3d(${transform.value.x}px, ${transform.value.y}px, 0) scale3d(${transform.value.flipX ? "-" : ""}${transform.value.scale}, ${transform.value.flipY ? "-" : ""}${transform.value.scale}, 1) rotate(${transform.value.rotate}deg)`,
136
+ transitionDuration: !enableTransition.value || isTouching.value ? "0s" : void 0
137
+ },
138
+ "onWheel": onWheel,
139
+ "onMousedown": onMouseDown,
140
+ "onDblclick": onDoubleClick,
141
+ "onTouchstart": onTouchStart,
142
+ "onTouchmove": onTouchMove,
143
+ "onTouchend": onTouchEnd,
144
+ "onTouchcancel": onTouchEnd
145
+ }), null);
146
+ const mergedRootStyle = {
147
+ ...styles.root ?? {},
148
+ ...attrs.style
149
+ };
150
+ if (zIndex) mergedRootStyle.zIndex = zIndex;
151
+ const mergedRootCls = clsx(prefixCls, rootClassName, classNames.root, { [`${prefixCls}-moving`]: isMoving.value });
152
+ const transitionProps = getTransitionProps(motionName);
153
+ return createVNode(src_default, {
154
+ "open": portalRender.value,
155
+ "getContainer": getContainer,
156
+ "autoLock": lockScroll.value
157
+ }, { default: () => [createVNode(Transition, mergeProps(transitionProps, {
158
+ "onAfterEnter": () => onVisibleChanged(true),
159
+ "onAfterLeave": () => onVisibleChanged(false)
160
+ }), { default: () => {
161
+ if (!(portalRender.value && open)) return null;
162
+ return createVNode("div", {
163
+ "class": mergedRootCls,
164
+ "style": mergedRootStyle
165
+ }, [
166
+ createVNode("div", {
167
+ "class": clsx(`${prefixCls}-mask`, classNames.mask),
168
+ "style": styles.mask,
169
+ "onClick": () => props.onClose?.()
170
+ }, null),
171
+ createVNode("div", {
172
+ "class": clsx(`${prefixCls}-body`, classNames.body),
173
+ "style": bodyStyle
174
+ }, [imageRender ? imageRender(imgNode, {
175
+ transform: transform.value,
176
+ image,
177
+ ...groupContext ? { current } : {}
178
+ }) : imgNode]),
179
+ closeIcon !== false && closeIcon !== null && createVNode(CloseBtn_default, {
180
+ "prefixCls": prefixCls,
181
+ "icon": closeIcon === true ? icons.close : closeIcon || icons.close,
182
+ "onClick": () => props.onClose?.()
183
+ }, null),
184
+ showLeftOrRightSwitches.value && createVNode(PrevNext_default, {
185
+ "prefixCls": prefixCls,
186
+ "current": current,
187
+ "count": count,
188
+ "icons": icons,
189
+ "onActive": onActive
190
+ }, null),
191
+ createVNode(Footer_default, {
192
+ "prefixCls": prefixCls,
193
+ "showProgress": showOperationsProgress.value,
194
+ "current": current,
195
+ "count": count,
196
+ "showSwitch": showLeftOrRightSwitches.value,
197
+ "classNames": classNames,
198
+ "styles": styles,
199
+ "image": image,
200
+ "transform": transform.value,
201
+ "icons": icons,
202
+ "countRender": countRender,
203
+ "actionsRender": actionsRender,
204
+ "scale": transform.value.scale,
205
+ "minScale": props.minScale ?? 1,
206
+ "maxScale": props.maxScale ?? 50,
207
+ "onActive": onActive,
208
+ "onFlipY": onFlipY,
209
+ "onFlipX": onFlipX,
210
+ "onRotateLeft": onRotateLeft,
211
+ "onRotateRight": onRotateRight,
212
+ "onZoomOut": onZoomOut,
213
+ "onZoomIn": onZoomIn,
214
+ "onClose": () => props.onClose?.(),
215
+ "onReset": onReset
216
+ }, null)
217
+ ]);
218
+ } })] });
219
+ };
220
+ }, {
221
+ props: /* @__PURE__ */ mergeDefaults({
222
+ prefixCls: {
223
+ type: String,
224
+ required: true,
225
+ default: void 0
226
+ },
227
+ classNames: {
228
+ type: Object,
229
+ required: false,
230
+ default: void 0
231
+ },
232
+ styles: {
233
+ type: Object,
234
+ required: false,
235
+ default: void 0
236
+ },
237
+ imageInfo: {
238
+ type: Object,
239
+ required: false,
240
+ default: void 0
241
+ },
242
+ fallback: {
243
+ type: String,
244
+ required: false,
245
+ default: void 0
246
+ },
247
+ imgCommonProps: {
248
+ type: Object,
249
+ required: false,
250
+ default: void 0
251
+ },
252
+ width: {
253
+ type: [String, Number],
254
+ required: false,
255
+ default: void 0
256
+ },
257
+ height: {
258
+ type: [String, Number],
259
+ required: false,
260
+ default: void 0
261
+ },
262
+ current: {
263
+ type: Number,
264
+ required: false,
265
+ default: void 0
266
+ },
267
+ count: {
268
+ type: Number,
269
+ required: false,
270
+ default: void 0
271
+ },
272
+ onChange: {
273
+ type: Function,
274
+ required: false,
275
+ default: void 0
276
+ },
277
+ onClose: {
278
+ type: Function,
279
+ required: false,
280
+ default: void 0
281
+ },
282
+ mousePosition: {
283
+ type: [null, Object],
284
+ required: true,
285
+ default: void 0
286
+ },
287
+ rootClassName: {
288
+ type: String,
289
+ required: false,
290
+ default: void 0
291
+ },
292
+ src: {
293
+ type: String,
294
+ required: false,
295
+ default: void 0
296
+ },
297
+ alt: {
298
+ type: String,
299
+ required: false,
300
+ default: void 0
301
+ },
302
+ scaleStep: {
303
+ type: Number,
304
+ required: false,
305
+ default: void 0
306
+ },
307
+ minScale: {
308
+ type: Number,
309
+ required: false,
310
+ default: void 0
311
+ },
312
+ maxScale: {
313
+ type: Number,
314
+ required: false,
315
+ default: void 0
316
+ },
317
+ motionName: {
318
+ type: String,
319
+ required: false,
320
+ default: void 0
321
+ },
322
+ open: {
323
+ type: Boolean,
324
+ required: false,
325
+ default: void 0
326
+ },
327
+ getContainer: {
328
+ required: false,
329
+ default: void 0
330
+ },
331
+ zIndex: {
332
+ type: Number,
333
+ required: false,
334
+ default: void 0
335
+ },
336
+ afterOpenChange: {
337
+ type: Function,
338
+ required: false,
339
+ default: void 0
340
+ },
341
+ movable: {
342
+ type: Boolean,
343
+ required: false,
344
+ default: void 0
345
+ },
346
+ icons: {
347
+ type: Object,
348
+ required: false,
349
+ default: void 0
350
+ },
351
+ closeIcon: {
352
+ type: [
353
+ Object,
354
+ Function,
355
+ String,
356
+ Number,
357
+ null,
358
+ Boolean,
359
+ Array
360
+ ],
361
+ required: false,
362
+ default: void 0
363
+ },
364
+ onTransform: {
365
+ type: Function,
366
+ required: false,
367
+ default: void 0
368
+ },
369
+ countRender: {
370
+ type: Function,
371
+ required: false,
372
+ default: void 0
373
+ },
374
+ imageRender: {
375
+ type: Function,
376
+ required: false,
377
+ default: void 0
378
+ },
379
+ actionsRender: {
380
+ type: Function,
381
+ required: false,
382
+ default: void 0
383
+ }
384
+ }, {
385
+ movable: true,
386
+ scaleStep: .5,
387
+ minScale: 1,
388
+ maxScale: 50,
389
+ motionName: "fade",
390
+ current: 0,
391
+ count: 1,
392
+ icons: {}
393
+ }),
394
+ name: "ImagePreview",
395
+ inheritAttrs: false
396
+ });
397
+ export { Preview_default as default };
@@ -0,0 +1,135 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_useMergedState = require("./util/dist/hooks/useMergedState.cjs");
3
+ const require_context = require("./context.cjs");
4
+ const require_index = require("./Preview/index.cjs");
5
+ const require_usePreviewItems = require("./hooks/usePreviewItems.cjs");
6
+ let vue = require("vue");
7
+ var PreviewGroup = /* @__PURE__ */ (0, vue.defineComponent)((props, { slots, emit }) => {
8
+ const mergedPreviewConfig = (0, vue.computed)(() => {
9
+ if (props.preview && typeof props.preview === "object") return props.preview;
10
+ return {};
11
+ });
12
+ const previewOpen = (0, vue.computed)(() => mergedPreviewConfig.value.open);
13
+ const previewCurrent = (0, vue.computed)(() => mergedPreviewConfig.value.current);
14
+ const [mergedItems, register, fromItems] = require_usePreviewItems.default((0, vue.toRef)(props, "items"));
15
+ const [current, setCurrent] = require_useMergedState.useMergedState(0, { value: previewCurrent });
16
+ const keepOpenIndex = (0, vue.shallowRef)(false);
17
+ const [isShowPreview, setShowPreview] = require_useMergedState.useMergedState(!!previewOpen.value, { value: previewOpen });
18
+ const triggerShowPreview = (next) => {
19
+ const prev = isShowPreview.value;
20
+ setShowPreview(next);
21
+ if (next !== prev) mergedPreviewConfig.value.onOpenChange?.(next, { current: current.value });
22
+ };
23
+ const mousePosition = (0, vue.shallowRef)(null);
24
+ const onPreviewFromImage = (id, imageSrc, mouseX, mouseY) => {
25
+ const itemsList = mergedItems.value;
26
+ const index = fromItems.value ? itemsList.findIndex((item) => item.data.src === imageSrc) : itemsList.findIndex((item) => item.id === id);
27
+ setCurrent(index < 0 ? 0 : index);
28
+ triggerShowPreview(true);
29
+ mousePosition.value = {
30
+ x: mouseX,
31
+ y: mouseY
32
+ };
33
+ keepOpenIndex.value = true;
34
+ };
35
+ (0, vue.watch)(isShowPreview, (open) => {
36
+ if (open) {
37
+ if (!keepOpenIndex.value) setCurrent(0);
38
+ } else keepOpenIndex.value = false;
39
+ });
40
+ const onInternalChange = (next, prev) => {
41
+ setCurrent(next);
42
+ mergedPreviewConfig.value.onChange?.(next, prev);
43
+ emit("change", next, prev);
44
+ };
45
+ const onPreviewClose = () => {
46
+ triggerShowPreview(false);
47
+ mousePosition.value = null;
48
+ };
49
+ require_context.usePreviewGroupProvider({
50
+ register,
51
+ onPreview: onPreviewFromImage
52
+ });
53
+ return () => {
54
+ const itemsList = mergedItems.value;
55
+ const { src,...imgCommonProps } = itemsList[current.value]?.data || {};
56
+ const countRender = slots.countRender ? (currentNum, total) => slots.countRender?.(currentNum, total) : mergedPreviewConfig.value.countRender;
57
+ const { open: _open, current: _current, onOpenChange: _onOpenChange, onChange: _onChange,...restPreviewConfig } = mergedPreviewConfig.value;
58
+ return (0, vue.createVNode)(vue.Fragment, null, [slots.default?.(), (0, vue.createVNode)(require_index.default, (0, vue.mergeProps)({
59
+ "aria-hidden": !isShowPreview.value,
60
+ "open": isShowPreview.value,
61
+ "prefixCls": props.previewPrefixCls,
62
+ "onClose": onPreviewClose,
63
+ "mousePosition": mousePosition.value,
64
+ "imgCommonProps": imgCommonProps,
65
+ "src": src,
66
+ "fallback": props.fallback,
67
+ "icons": props.icons,
68
+ "current": current.value,
69
+ "count": itemsList.length,
70
+ "onChange": onInternalChange
71
+ }, restPreviewConfig, {
72
+ "countRender": countRender,
73
+ "classNames": props.classNames?.popup,
74
+ "styles": props.styles?.popup
75
+ }), null)]);
76
+ };
77
+ }, {
78
+ props: /* @__PURE__ */ (0, vue.mergeDefaults)({
79
+ previewPrefixCls: {
80
+ type: String,
81
+ required: false,
82
+ default: void 0
83
+ },
84
+ classNames: {
85
+ type: Object,
86
+ required: false,
87
+ default: void 0
88
+ },
89
+ styles: {
90
+ type: Object,
91
+ required: false,
92
+ default: void 0
93
+ },
94
+ icons: {
95
+ required: false,
96
+ default: void 0
97
+ },
98
+ items: {
99
+ type: Array,
100
+ required: false,
101
+ default: void 0
102
+ },
103
+ fallback: {
104
+ type: String,
105
+ required: false,
106
+ default: void 0
107
+ },
108
+ preview: {
109
+ type: [Boolean, Object],
110
+ required: false,
111
+ default: void 0
112
+ },
113
+ children: {
114
+ type: [
115
+ Object,
116
+ Function,
117
+ String,
118
+ Number,
119
+ null,
120
+ Boolean,
121
+ Array
122
+ ],
123
+ required: false,
124
+ default: void 0
125
+ }
126
+ }, {
127
+ previewPrefixCls: "vc-image-preview",
128
+ icons: {}
129
+ }),
130
+ name: "ImagePreviewGroup",
131
+ inheritAttrs: false,
132
+ emits: ["change"]
133
+ });
134
+ var PreviewGroup_default = PreviewGroup;
135
+ exports.default = PreviewGroup_default;
@@ -0,0 +1,34 @@
1
+ import { VueNode } from '@v-c/util/dist/type';
2
+ import { CSSProperties } from 'vue';
3
+ import { TransformType } from './hooks/useImageTransform';
4
+ import { ImgInfo } from './Image';
5
+ import { ImageElementProps } from './interface';
6
+ import { InternalPreviewConfig, PreviewProps, PreviewSemanticName } from './Preview';
7
+ export interface GroupPreviewConfig extends Omit<InternalPreviewConfig, 'imageRender'> {
8
+ current?: number;
9
+ imageRender?: (originalNode: VueNode, info: {
10
+ transform: TransformType;
11
+ current: number;
12
+ image: ImgInfo;
13
+ }) => VueNode;
14
+ onOpenChange?: (value: boolean, info: {
15
+ current: number;
16
+ }) => void;
17
+ onChange?: (current: number, prevCurrent: number) => void;
18
+ }
19
+ export interface PreviewGroupProps {
20
+ previewPrefixCls?: string;
21
+ classNames?: {
22
+ popup?: Partial<Record<PreviewSemanticName, string>>;
23
+ };
24
+ styles?: {
25
+ popup?: Partial<Record<PreviewSemanticName, CSSProperties>>;
26
+ };
27
+ icons?: PreviewProps['icons'];
28
+ items?: (string | ImageElementProps)[];
29
+ fallback?: string;
30
+ preview?: boolean | GroupPreviewConfig;
31
+ children?: VueNode;
32
+ }
33
+ declare const PreviewGroup: import('vue').DefineSetupFnComponent<PreviewGroupProps, {}, {}, PreviewGroupProps & {}, import('vue').PublicProps>;
34
+ export default PreviewGroup;
@@ -0,0 +1,133 @@
1
+ import { useMergedState } from "./util/dist/hooks/useMergedState.js";
2
+ import { usePreviewGroupProvider } from "./context.js";
3
+ import Preview_default from "./Preview/index.js";
4
+ import usePreviewItems from "./hooks/usePreviewItems.js";
5
+ import { Fragment, computed, createVNode, defineComponent, mergeDefaults, mergeProps, shallowRef, toRef, watch } from "vue";
6
+ var PreviewGroup_default = /* @__PURE__ */ defineComponent((props, { slots, emit }) => {
7
+ const mergedPreviewConfig = computed(() => {
8
+ if (props.preview && typeof props.preview === "object") return props.preview;
9
+ return {};
10
+ });
11
+ const previewOpen = computed(() => mergedPreviewConfig.value.open);
12
+ const previewCurrent = computed(() => mergedPreviewConfig.value.current);
13
+ const [mergedItems, register, fromItems] = usePreviewItems(toRef(props, "items"));
14
+ const [current, setCurrent] = useMergedState(0, { value: previewCurrent });
15
+ const keepOpenIndex = shallowRef(false);
16
+ const [isShowPreview, setShowPreview] = useMergedState(!!previewOpen.value, { value: previewOpen });
17
+ const triggerShowPreview = (next) => {
18
+ const prev = isShowPreview.value;
19
+ setShowPreview(next);
20
+ if (next !== prev) mergedPreviewConfig.value.onOpenChange?.(next, { current: current.value });
21
+ };
22
+ const mousePosition = shallowRef(null);
23
+ const onPreviewFromImage = (id, imageSrc, mouseX, mouseY) => {
24
+ const itemsList = mergedItems.value;
25
+ const index = fromItems.value ? itemsList.findIndex((item) => item.data.src === imageSrc) : itemsList.findIndex((item) => item.id === id);
26
+ setCurrent(index < 0 ? 0 : index);
27
+ triggerShowPreview(true);
28
+ mousePosition.value = {
29
+ x: mouseX,
30
+ y: mouseY
31
+ };
32
+ keepOpenIndex.value = true;
33
+ };
34
+ watch(isShowPreview, (open) => {
35
+ if (open) {
36
+ if (!keepOpenIndex.value) setCurrent(0);
37
+ } else keepOpenIndex.value = false;
38
+ });
39
+ const onInternalChange = (next, prev) => {
40
+ setCurrent(next);
41
+ mergedPreviewConfig.value.onChange?.(next, prev);
42
+ emit("change", next, prev);
43
+ };
44
+ const onPreviewClose = () => {
45
+ triggerShowPreview(false);
46
+ mousePosition.value = null;
47
+ };
48
+ usePreviewGroupProvider({
49
+ register,
50
+ onPreview: onPreviewFromImage
51
+ });
52
+ return () => {
53
+ const itemsList = mergedItems.value;
54
+ const { src,...imgCommonProps } = itemsList[current.value]?.data || {};
55
+ const countRender = slots.countRender ? (currentNum, total) => slots.countRender?.(currentNum, total) : mergedPreviewConfig.value.countRender;
56
+ const { open: _open, current: _current, onOpenChange: _onOpenChange, onChange: _onChange,...restPreviewConfig } = mergedPreviewConfig.value;
57
+ return createVNode(Fragment, null, [slots.default?.(), createVNode(Preview_default, mergeProps({
58
+ "aria-hidden": !isShowPreview.value,
59
+ "open": isShowPreview.value,
60
+ "prefixCls": props.previewPrefixCls,
61
+ "onClose": onPreviewClose,
62
+ "mousePosition": mousePosition.value,
63
+ "imgCommonProps": imgCommonProps,
64
+ "src": src,
65
+ "fallback": props.fallback,
66
+ "icons": props.icons,
67
+ "current": current.value,
68
+ "count": itemsList.length,
69
+ "onChange": onInternalChange
70
+ }, restPreviewConfig, {
71
+ "countRender": countRender,
72
+ "classNames": props.classNames?.popup,
73
+ "styles": props.styles?.popup
74
+ }), null)]);
75
+ };
76
+ }, {
77
+ props: /* @__PURE__ */ mergeDefaults({
78
+ previewPrefixCls: {
79
+ type: String,
80
+ required: false,
81
+ default: void 0
82
+ },
83
+ classNames: {
84
+ type: Object,
85
+ required: false,
86
+ default: void 0
87
+ },
88
+ styles: {
89
+ type: Object,
90
+ required: false,
91
+ default: void 0
92
+ },
93
+ icons: {
94
+ required: false,
95
+ default: void 0
96
+ },
97
+ items: {
98
+ type: Array,
99
+ required: false,
100
+ default: void 0
101
+ },
102
+ fallback: {
103
+ type: String,
104
+ required: false,
105
+ default: void 0
106
+ },
107
+ preview: {
108
+ type: [Boolean, Object],
109
+ required: false,
110
+ default: void 0
111
+ },
112
+ children: {
113
+ type: [
114
+ Object,
115
+ Function,
116
+ String,
117
+ Number,
118
+ null,
119
+ Boolean,
120
+ Array
121
+ ],
122
+ required: false,
123
+ default: void 0
124
+ }
125
+ }, {
126
+ previewPrefixCls: "vc-image-preview",
127
+ icons: {}
128
+ }),
129
+ name: "ImagePreviewGroup",
130
+ inheritAttrs: false,
131
+ emits: ["change"]
132
+ });
133
+ export { PreviewGroup_default as default };
@@ -0,0 +1,12 @@
1
+ const COMMON_PROPS = [
2
+ "crossOrigin",
3
+ "decoding",
4
+ "draggable",
5
+ "loading",
6
+ "referrerPolicy",
7
+ "sizes",
8
+ "srcset",
9
+ "useMap",
10
+ "alt"
11
+ ];
12
+ exports.COMMON_PROPS = COMMON_PROPS;