@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,2 @@
1
+ import { ImageElementProps } from './interface';
2
+ export declare const COMMON_PROPS: (keyof Omit<ImageElementProps, 'src'>)[];
package/dist/common.js ADDED
@@ -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
+ export { COMMON_PROPS };
@@ -0,0 +1,10 @@
1
+ let vue = require("vue");
2
+ var PreviewGroupContextKey = Symbol("PreviewGroupContext");
3
+ function usePreviewGroupContext() {
4
+ return (0, vue.inject)(PreviewGroupContextKey, null);
5
+ }
6
+ function usePreviewGroupProvider(value) {
7
+ (0, vue.provide)(PreviewGroupContextKey, value);
8
+ }
9
+ exports.usePreviewGroupContext = usePreviewGroupContext;
10
+ exports.usePreviewGroupProvider = usePreviewGroupProvider;
@@ -0,0 +1,7 @@
1
+ import { OnGroupPreview, RegisterImage } from './interface';
2
+ export interface PreviewGroupContextProps {
3
+ register: RegisterImage;
4
+ onPreview: OnGroupPreview;
5
+ }
6
+ export declare function usePreviewGroupContext(): PreviewGroupContextProps | null;
7
+ export declare function usePreviewGroupProvider(value: PreviewGroupContextProps): void;
@@ -0,0 +1,9 @@
1
+ import { inject, provide } from "vue";
2
+ var PreviewGroupContextKey = Symbol("PreviewGroupContext");
3
+ function usePreviewGroupContext() {
4
+ return inject(PreviewGroupContextKey, null);
5
+ }
6
+ function usePreviewGroupProvider(value) {
7
+ provide(PreviewGroupContextKey, value);
8
+ }
9
+ export { usePreviewGroupContext, usePreviewGroupProvider };
@@ -0,0 +1,25 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_util = require("./util.cjs");
3
+ function fixPoint(key, start, width, clientWidth) {
4
+ const startAddWidth = start + width;
5
+ const offsetStart = (width - clientWidth) / 2;
6
+ if (width > clientWidth) {
7
+ if (start > 0) return { [key]: offsetStart };
8
+ if (start < 0 && startAddWidth < clientWidth) return { [key]: -offsetStart };
9
+ } else if (start < 0 || startAddWidth > clientWidth) return { [key]: start < 0 ? offsetStart : -offsetStart };
10
+ return {};
11
+ }
12
+ function getFixScaleEleTransPosition(width, height, left, top) {
13
+ const { width: clientWidth, height: clientHeight } = require_util.getClientSize();
14
+ let fixPos = null;
15
+ if (width <= clientWidth && height <= clientHeight) fixPos = {
16
+ x: 0,
17
+ y: 0
18
+ };
19
+ else if (width > clientWidth || height > clientHeight) fixPos = {
20
+ ...fixPoint("x", left, width, clientWidth),
21
+ ...fixPoint("y", top, height, clientHeight)
22
+ };
23
+ return fixPos;
24
+ }
25
+ exports.default = getFixScaleEleTransPosition;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Fix positon x,y point when
3
+ *
4
+ * Ele width && height < client
5
+ * - Back origin
6
+ *
7
+ * - Ele width | height > clientWidth | clientHeight
8
+ * - left | top > 0 -> Back 0
9
+ * - left | top + width | height < clientWidth | clientHeight -> Back left | top + width | height === clientWidth | clientHeight
10
+ *
11
+ * Regardless of other
12
+ */
13
+ export default function getFixScaleEleTransPosition(width: number, height: number, left: number, top: number): null | {
14
+ x: number;
15
+ y: number;
16
+ };
@@ -0,0 +1,24 @@
1
+ import { getClientSize } from "./util.js";
2
+ function fixPoint(key, start, width, clientWidth) {
3
+ const startAddWidth = start + width;
4
+ const offsetStart = (width - clientWidth) / 2;
5
+ if (width > clientWidth) {
6
+ if (start > 0) return { [key]: offsetStart };
7
+ if (start < 0 && startAddWidth < clientWidth) return { [key]: -offsetStart };
8
+ } else if (start < 0 || startAddWidth > clientWidth) return { [key]: start < 0 ? offsetStart : -offsetStart };
9
+ return {};
10
+ }
11
+ function getFixScaleEleTransPosition(width, height, left, top) {
12
+ const { width: clientWidth, height: clientHeight } = getClientSize();
13
+ let fixPos = null;
14
+ if (width <= clientWidth && height <= clientHeight) fixPos = {
15
+ x: 0,
16
+ y: 0
17
+ };
18
+ else if (width > clientWidth || height > clientHeight) fixPos = {
19
+ ...fixPoint("x", left, width, clientWidth),
20
+ ...fixPoint("y", top, height, clientHeight)
21
+ };
22
+ return fixPos;
23
+ }
24
+ export { getFixScaleEleTransPosition as default };
@@ -0,0 +1,96 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_util = require("../util.cjs");
3
+ const require_isEqual = require("../util/dist/isEqual.cjs");
4
+ const require_raf = require("../util/dist/raf.cjs");
5
+ let vue = require("vue");
6
+ var initialTransform = {
7
+ x: 0,
8
+ y: 0,
9
+ rotate: 0,
10
+ scale: 1,
11
+ flipX: false,
12
+ flipY: false
13
+ };
14
+ function useImageTransform(imgRef, minScale, maxScale, onTransform) {
15
+ const frame = (0, vue.shallowRef)(null);
16
+ const queue = (0, vue.ref)([]);
17
+ const transform = (0, vue.shallowRef)(initialTransform);
18
+ const resetTransform = (action) => {
19
+ const oldTransform = transform.value;
20
+ transform.value = initialTransform;
21
+ if (!require_isEqual.isEqual_default(initialTransform, oldTransform)) onTransform?.({
22
+ transform: initialTransform,
23
+ action
24
+ });
25
+ };
26
+ const updateTransform = (newTransform, action) => {
27
+ if (frame.value === null) {
28
+ queue.value = [];
29
+ frame.value = require_raf.raf_default(() => {
30
+ let memoState = transform.value;
31
+ queue.value.forEach((queueState) => {
32
+ memoState = {
33
+ ...memoState,
34
+ ...queueState
35
+ };
36
+ });
37
+ frame.value = null;
38
+ onTransform?.({
39
+ transform: memoState,
40
+ action
41
+ });
42
+ transform.value = memoState;
43
+ });
44
+ }
45
+ queue.value.push({
46
+ ...transform.value,
47
+ ...newTransform
48
+ });
49
+ };
50
+ const dispatchZoomChange = (ratio, action, centerX, centerY, isTouch) => {
51
+ if (!imgRef.value) return;
52
+ const { width, height, offsetWidth, offsetHeight, offsetLeft, offsetTop } = imgRef.value;
53
+ const _transform = transform.value;
54
+ const _maxScale = maxScale.value;
55
+ const _minScale = minScale.value;
56
+ let newRatio = ratio;
57
+ let newScale = _transform.scale * ratio;
58
+ if (newScale > _maxScale) {
59
+ newScale = _maxScale;
60
+ newRatio = _maxScale / _transform.scale;
61
+ } else if (newScale < _minScale) {
62
+ newScale = isTouch ? newScale : _minScale;
63
+ newRatio = newScale / _transform.scale;
64
+ }
65
+ const mergedCenterX = centerX ?? innerWidth / 2;
66
+ const mergedCenterY = centerY ?? innerHeight / 2;
67
+ const diffRatio = newRatio - 1;
68
+ const diffImgX = diffRatio * width * .5;
69
+ const diffImgY = diffRatio * height * .5;
70
+ const diffOffsetLeft = diffRatio * (mergedCenterX - _transform.x - offsetLeft);
71
+ const diffOffsetTop = diffRatio * (mergedCenterY - _transform.y - offsetTop);
72
+ let newX = _transform.x - (diffOffsetLeft - diffImgX);
73
+ let newY = _transform.y - (diffOffsetTop - diffImgY);
74
+ if (ratio < 1 && newScale === 1) {
75
+ const mergedWidth = offsetWidth * newScale;
76
+ const mergedHeight = offsetHeight * newScale;
77
+ const { width: clientWidth, height: clientHeight } = require_util.getClientSize();
78
+ if (mergedWidth <= clientWidth && mergedHeight <= clientHeight) {
79
+ newX = 0;
80
+ newY = 0;
81
+ }
82
+ }
83
+ updateTransform({
84
+ x: newX,
85
+ y: newY,
86
+ scale: newScale
87
+ }, action);
88
+ };
89
+ return {
90
+ transform,
91
+ resetTransform,
92
+ updateTransform,
93
+ dispatchZoomChange
94
+ };
95
+ }
96
+ exports.default = useImageTransform;
@@ -0,0 +1,21 @@
1
+ import { Ref } from 'vue';
2
+ export interface TransformType {
3
+ x: number;
4
+ y: number;
5
+ rotate: number;
6
+ scale: number;
7
+ flipX: boolean;
8
+ flipY: boolean;
9
+ }
10
+ export type TransformAction = 'flipY' | 'flipX' | 'rotateLeft' | 'rotateRight' | 'zoomIn' | 'zoomOut' | 'close' | 'prev' | 'next' | 'wheel' | 'doubleClick' | 'move' | 'dragRebound' | 'touchZoom' | 'reset';
11
+ export type UpdateTransformFunc = (newTransform: Partial<TransformType>, action: TransformAction) => void;
12
+ export type DispatchZoomChangeFunc = (ratio: number, action: TransformAction, centerX?: number, centerY?: number, isTouch?: boolean) => void;
13
+ export default function useImageTransform(imgRef: Ref<HTMLImageElement>, minScale: Ref<number>, maxScale: Ref<number>, onTransform: (info: {
14
+ transform: TransformType;
15
+ action: TransformAction;
16
+ }) => void): {
17
+ transform: import('vue').ShallowRef<TransformType, TransformType>;
18
+ resetTransform: (action: TransformAction) => void;
19
+ updateTransform: UpdateTransformFunc;
20
+ dispatchZoomChange: DispatchZoomChangeFunc;
21
+ };
@@ -0,0 +1,95 @@
1
+ import { getClientSize } from "../util.js";
2
+ import { isEqual_default } from "../util/dist/isEqual.js";
3
+ import { raf_default } from "../util/dist/raf.js";
4
+ import { ref, shallowRef } from "vue";
5
+ var initialTransform = {
6
+ x: 0,
7
+ y: 0,
8
+ rotate: 0,
9
+ scale: 1,
10
+ flipX: false,
11
+ flipY: false
12
+ };
13
+ function useImageTransform(imgRef, minScale, maxScale, onTransform) {
14
+ const frame = shallowRef(null);
15
+ const queue = ref([]);
16
+ const transform = shallowRef(initialTransform);
17
+ const resetTransform = (action) => {
18
+ const oldTransform = transform.value;
19
+ transform.value = initialTransform;
20
+ if (!isEqual_default(initialTransform, oldTransform)) onTransform?.({
21
+ transform: initialTransform,
22
+ action
23
+ });
24
+ };
25
+ const updateTransform = (newTransform, action) => {
26
+ if (frame.value === null) {
27
+ queue.value = [];
28
+ frame.value = raf_default(() => {
29
+ let memoState = transform.value;
30
+ queue.value.forEach((queueState) => {
31
+ memoState = {
32
+ ...memoState,
33
+ ...queueState
34
+ };
35
+ });
36
+ frame.value = null;
37
+ onTransform?.({
38
+ transform: memoState,
39
+ action
40
+ });
41
+ transform.value = memoState;
42
+ });
43
+ }
44
+ queue.value.push({
45
+ ...transform.value,
46
+ ...newTransform
47
+ });
48
+ };
49
+ const dispatchZoomChange = (ratio, action, centerX, centerY, isTouch) => {
50
+ if (!imgRef.value) return;
51
+ const { width, height, offsetWidth, offsetHeight, offsetLeft, offsetTop } = imgRef.value;
52
+ const _transform = transform.value;
53
+ const _maxScale = maxScale.value;
54
+ const _minScale = minScale.value;
55
+ let newRatio = ratio;
56
+ let newScale = _transform.scale * ratio;
57
+ if (newScale > _maxScale) {
58
+ newScale = _maxScale;
59
+ newRatio = _maxScale / _transform.scale;
60
+ } else if (newScale < _minScale) {
61
+ newScale = isTouch ? newScale : _minScale;
62
+ newRatio = newScale / _transform.scale;
63
+ }
64
+ const mergedCenterX = centerX ?? innerWidth / 2;
65
+ const mergedCenterY = centerY ?? innerHeight / 2;
66
+ const diffRatio = newRatio - 1;
67
+ const diffImgX = diffRatio * width * .5;
68
+ const diffImgY = diffRatio * height * .5;
69
+ const diffOffsetLeft = diffRatio * (mergedCenterX - _transform.x - offsetLeft);
70
+ const diffOffsetTop = diffRatio * (mergedCenterY - _transform.y - offsetTop);
71
+ let newX = _transform.x - (diffOffsetLeft - diffImgX);
72
+ let newY = _transform.y - (diffOffsetTop - diffImgY);
73
+ if (ratio < 1 && newScale === 1) {
74
+ const mergedWidth = offsetWidth * newScale;
75
+ const mergedHeight = offsetHeight * newScale;
76
+ const { width: clientWidth, height: clientHeight } = getClientSize();
77
+ if (mergedWidth <= clientWidth && mergedHeight <= clientHeight) {
78
+ newX = 0;
79
+ newY = 0;
80
+ }
81
+ }
82
+ updateTransform({
83
+ x: newX,
84
+ y: newY,
85
+ scale: newScale
86
+ }, action);
87
+ };
88
+ return {
89
+ transform,
90
+ resetTransform,
91
+ updateTransform,
92
+ dispatchZoomChange
93
+ };
94
+ }
95
+ export { useImageTransform as default };
@@ -0,0 +1,93 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_warning = require("../util/dist/warning.cjs");
3
+ require("../util/dist/index.cjs");
4
+ const require_getFixScaleEleTransPosition = require("../getFixScaleEleTransPosition.cjs");
5
+ const require_previewConfig = require("../previewConfig.cjs");
6
+ let vue = require("vue");
7
+ function useMouseEvent(imgRef, movable, open, scaleStep, transform, updateTransform, dispatchZoomChange) {
8
+ const isMoving = (0, vue.shallowRef)(false);
9
+ const startPositionInfo = (0, vue.shallowRef)({
10
+ diffX: 0,
11
+ diffY: 0,
12
+ transformX: 0,
13
+ transformY: 0
14
+ });
15
+ const onMouseDown = (event) => {
16
+ const { x, y } = transform.value;
17
+ if (!movable.value || event.button !== 0) return;
18
+ event.preventDefault();
19
+ event.stopPropagation();
20
+ startPositionInfo.value = {
21
+ diffX: event.pageX - x,
22
+ diffY: event.pageY - y,
23
+ transformX: x,
24
+ transformY: y
25
+ };
26
+ isMoving.value = true;
27
+ };
28
+ const onMouseMove = (event) => {
29
+ if (open.value && isMoving.value) updateTransform({
30
+ x: event.pageX - startPositionInfo.value.diffX,
31
+ y: event.pageY - startPositionInfo.value.diffY
32
+ }, "move");
33
+ };
34
+ const onMouseUp = () => {
35
+ if (open.value && isMoving.value) {
36
+ const { x, y, scale, rotate } = transform.value;
37
+ isMoving.value = false;
38
+ const { transformX, transformY } = startPositionInfo.value;
39
+ if (!(x !== transformX && y !== transformY)) return;
40
+ if (!imgRef.value) return;
41
+ const width = imgRef.value.offsetWidth * scale;
42
+ const height = imgRef.value.offsetHeight * scale;
43
+ const { left, top } = imgRef.value.getBoundingClientRect() ?? {};
44
+ const isRotate = rotate % 180 !== 0;
45
+ const fixState = require_getFixScaleEleTransPosition.default(isRotate ? height : width, isRotate ? width : height, left, top);
46
+ if (fixState) updateTransform({ ...fixState }, "dragRebound");
47
+ }
48
+ };
49
+ const onWheel = (event) => {
50
+ if (!open.value || event.deltaY === 0) return;
51
+ const scaleRatio = Math.abs(event.deltaY / 100);
52
+ let ratio = 1 + Math.min(scaleRatio, 1) * scaleStep.value;
53
+ if (event.deltaY > 0) ratio = 1 / ratio;
54
+ dispatchZoomChange(ratio, "wheel", event.clientX, event.clientY);
55
+ };
56
+ (0, vue.watch)([
57
+ open,
58
+ isMoving,
59
+ transform,
60
+ movable
61
+ ], (_n, _o, onCleanup) => {
62
+ if (movable.value) {
63
+ window.addEventListener("mouseup", onMouseUp, false);
64
+ window.addEventListener("mousemove", onMouseMove, false);
65
+ try {
66
+ /* istanbul ignore next */
67
+ if (window.top !== window.self) {
68
+ window?.top?.addEventListener("mouseup", onMouseUp, false);
69
+ window?.top?.addEventListener("mousemove", onMouseMove, false);
70
+ }
71
+ } catch (e) {
72
+ require_warning.warning_default(false, `[vc-image] ${e}`);
73
+ }
74
+ }
75
+ onCleanup(() => {
76
+ window.removeEventListener("mouseup", onMouseUp);
77
+ window.removeEventListener("mousemove", onMouseMove);
78
+ /* istanbul ignore next */
79
+ try {
80
+ window.top?.removeEventListener("mouseup", onMouseUp);
81
+ window.top?.removeEventListener("mousemove", onMouseMove);
82
+ } catch (error) {}
83
+ });
84
+ });
85
+ return {
86
+ isMoving,
87
+ onMouseDown,
88
+ onMouseMove,
89
+ onMouseUp,
90
+ onWheel
91
+ };
92
+ }
93
+ exports.default = useMouseEvent;
@@ -0,0 +1,9 @@
1
+ import { Ref } from 'vue';
2
+ import { DispatchZoomChangeFunc, TransformType, UpdateTransformFunc } from './useImageTransform.ts';
3
+ export default function useMouseEvent(imgRef: Ref<HTMLImageElement>, movable: Ref<boolean>, open: Ref<boolean>, scaleStep: Ref<number>, transform: Ref<TransformType>, updateTransform: UpdateTransformFunc, dispatchZoomChange: DispatchZoomChangeFunc): {
4
+ isMoving: import('vue').ShallowRef<boolean, boolean>;
5
+ onMouseDown: (event: MouseEvent) => void;
6
+ onMouseMove: (event: MouseEvent) => void;
7
+ onMouseUp: () => void;
8
+ onWheel: (event: WheelEvent) => void;
9
+ };
@@ -0,0 +1,92 @@
1
+ import { warning_default } from "../util/dist/warning.js";
2
+ import "../util/dist/index.js";
3
+ import getFixScaleEleTransPosition from "../getFixScaleEleTransPosition.js";
4
+ import { BASE_SCALE_RATIO, WHEEL_MAX_SCALE_RATIO } from "../previewConfig.js";
5
+ import { shallowRef, watch } from "vue";
6
+ function useMouseEvent(imgRef, movable, open, scaleStep, transform, updateTransform, dispatchZoomChange) {
7
+ const isMoving = shallowRef(false);
8
+ const startPositionInfo = shallowRef({
9
+ diffX: 0,
10
+ diffY: 0,
11
+ transformX: 0,
12
+ transformY: 0
13
+ });
14
+ const onMouseDown = (event) => {
15
+ const { x, y } = transform.value;
16
+ if (!movable.value || event.button !== 0) return;
17
+ event.preventDefault();
18
+ event.stopPropagation();
19
+ startPositionInfo.value = {
20
+ diffX: event.pageX - x,
21
+ diffY: event.pageY - y,
22
+ transformX: x,
23
+ transformY: y
24
+ };
25
+ isMoving.value = true;
26
+ };
27
+ const onMouseMove = (event) => {
28
+ if (open.value && isMoving.value) updateTransform({
29
+ x: event.pageX - startPositionInfo.value.diffX,
30
+ y: event.pageY - startPositionInfo.value.diffY
31
+ }, "move");
32
+ };
33
+ const onMouseUp = () => {
34
+ if (open.value && isMoving.value) {
35
+ const { x, y, scale, rotate } = transform.value;
36
+ isMoving.value = false;
37
+ const { transformX, transformY } = startPositionInfo.value;
38
+ if (!(x !== transformX && y !== transformY)) return;
39
+ if (!imgRef.value) return;
40
+ const width = imgRef.value.offsetWidth * scale;
41
+ const height = imgRef.value.offsetHeight * scale;
42
+ const { left, top } = imgRef.value.getBoundingClientRect() ?? {};
43
+ const isRotate = rotate % 180 !== 0;
44
+ const fixState = getFixScaleEleTransPosition(isRotate ? height : width, isRotate ? width : height, left, top);
45
+ if (fixState) updateTransform({ ...fixState }, "dragRebound");
46
+ }
47
+ };
48
+ const onWheel = (event) => {
49
+ if (!open.value || event.deltaY === 0) return;
50
+ const scaleRatio = Math.abs(event.deltaY / 100);
51
+ let ratio = 1 + Math.min(scaleRatio, 1) * scaleStep.value;
52
+ if (event.deltaY > 0) ratio = 1 / ratio;
53
+ dispatchZoomChange(ratio, "wheel", event.clientX, event.clientY);
54
+ };
55
+ watch([
56
+ open,
57
+ isMoving,
58
+ transform,
59
+ movable
60
+ ], (_n, _o, onCleanup) => {
61
+ if (movable.value) {
62
+ window.addEventListener("mouseup", onMouseUp, false);
63
+ window.addEventListener("mousemove", onMouseMove, false);
64
+ try {
65
+ /* istanbul ignore next */
66
+ if (window.top !== window.self) {
67
+ window?.top?.addEventListener("mouseup", onMouseUp, false);
68
+ window?.top?.addEventListener("mousemove", onMouseMove, false);
69
+ }
70
+ } catch (e) {
71
+ warning_default(false, `[vc-image] ${e}`);
72
+ }
73
+ }
74
+ onCleanup(() => {
75
+ window.removeEventListener("mouseup", onMouseUp);
76
+ window.removeEventListener("mousemove", onMouseMove);
77
+ /* istanbul ignore next */
78
+ try {
79
+ window.top?.removeEventListener("mouseup", onMouseUp);
80
+ window.top?.removeEventListener("mousemove", onMouseMove);
81
+ } catch (error) {}
82
+ });
83
+ });
84
+ return {
85
+ isMoving,
86
+ onMouseDown,
87
+ onMouseMove,
88
+ onMouseUp,
89
+ onWheel
90
+ };
91
+ }
92
+ export { useMouseEvent as default };
@@ -0,0 +1,45 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_common = require("../common.cjs");
3
+ let vue = require("vue");
4
+ function usePreviewItems(items) {
5
+ const images = (0, vue.shallowRef)({});
6
+ const registerImage = (id, data) => {
7
+ images.value = {
8
+ ...images.value,
9
+ [id]: data
10
+ };
11
+ return () => {
12
+ const cloneImgs = { ...images.value };
13
+ delete cloneImgs[id];
14
+ images.value = cloneImgs;
15
+ };
16
+ };
17
+ const mergedItems = (0, vue.shallowRef)([]);
18
+ (0, vue.watchEffect)(() => {
19
+ if (items?.value) {
20
+ mergedItems.value = items.value.map((item) => {
21
+ if (typeof item === "string") return { data: { src: item } };
22
+ const data = {};
23
+ Object.keys(item).forEach((key) => {
24
+ if (["src", ...require_common.COMMON_PROPS].includes(key)) data[key] = item[key];
25
+ });
26
+ return { data };
27
+ });
28
+ return;
29
+ }
30
+ mergedItems.value = Object.keys(images.value).reduce((total, id) => {
31
+ const { canPreview, data } = images.value[id];
32
+ if (canPreview) total.push({
33
+ data,
34
+ id
35
+ });
36
+ return total;
37
+ }, []);
38
+ });
39
+ return [
40
+ mergedItems,
41
+ registerImage,
42
+ (0, vue.computed)(() => !!items?.value)
43
+ ];
44
+ }
45
+ exports.default = usePreviewItems;
@@ -0,0 +1,10 @@
1
+ import { Ref } from 'vue';
2
+ import { PreviewImageElementProps, RegisterImage } from '../interface';
3
+ import { PreviewGroupProps } from '../PreviewGroup.tsx';
4
+ export type Items = Omit<PreviewImageElementProps & {
5
+ id?: string;
6
+ }, 'canPreview'>[];
7
+ /**
8
+ * Merge props provided `items` or context collected images
9
+ */
10
+ export default function usePreviewItems(items?: Ref<PreviewGroupProps['items'] | undefined>): [items: Ref<Items>, registerImage: RegisterImage, fromItems: Ref<boolean>];
@@ -0,0 +1,44 @@
1
+ import { COMMON_PROPS } from "../common.js";
2
+ import { computed, shallowRef, watchEffect } from "vue";
3
+ function usePreviewItems(items) {
4
+ const images = shallowRef({});
5
+ const registerImage = (id, data) => {
6
+ images.value = {
7
+ ...images.value,
8
+ [id]: data
9
+ };
10
+ return () => {
11
+ const cloneImgs = { ...images.value };
12
+ delete cloneImgs[id];
13
+ images.value = cloneImgs;
14
+ };
15
+ };
16
+ const mergedItems = shallowRef([]);
17
+ watchEffect(() => {
18
+ if (items?.value) {
19
+ mergedItems.value = items.value.map((item) => {
20
+ if (typeof item === "string") return { data: { src: item } };
21
+ const data = {};
22
+ Object.keys(item).forEach((key) => {
23
+ if (["src", ...COMMON_PROPS].includes(key)) data[key] = item[key];
24
+ });
25
+ return { data };
26
+ });
27
+ return;
28
+ }
29
+ mergedItems.value = Object.keys(images.value).reduce((total, id) => {
30
+ const { canPreview, data } = images.value[id];
31
+ if (canPreview) total.push({
32
+ data,
33
+ id
34
+ });
35
+ return total;
36
+ }, []);
37
+ });
38
+ return [
39
+ mergedItems,
40
+ registerImage,
41
+ computed(() => !!items?.value)
42
+ ];
43
+ }
44
+ export { usePreviewItems as default };
@@ -0,0 +1,25 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_context = require("../context.cjs");
3
+ let vue = require("vue");
4
+ var uid = 0;
5
+ function useRegisterImage(canPreview, data) {
6
+ uid += 1;
7
+ const id = (0, vue.shallowRef)(String(uid));
8
+ const groupContext = require_context.usePreviewGroupContext();
9
+ const registerData = () => ({
10
+ data: data.value,
11
+ canPreview: canPreview.value
12
+ });
13
+ let unRegister;
14
+ (0, vue.onMounted)(() => {
15
+ if (groupContext) unRegister = groupContext.register(id.value, registerData());
16
+ });
17
+ (0, vue.watch)([canPreview, data], () => {
18
+ if (groupContext) groupContext.register(id.value, registerData());
19
+ }, { deep: true });
20
+ (0, vue.onBeforeUnmount)(() => {
21
+ unRegister?.();
22
+ });
23
+ return id.value;
24
+ }
25
+ exports.default = useRegisterImage;
@@ -0,0 +1,3 @@
1
+ import { Ref } from 'vue';
2
+ import { ImageElementProps } from '../interface';
3
+ export default function useRegisterImage(canPreview: Ref<boolean>, data: Ref<ImageElementProps>): string;