@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.
- package/LICENSE +21 -0
- package/dist/Image.cjs +228 -0
- package/dist/Image.d.ts +46 -0
- package/dist/Image.js +226 -0
- package/dist/Preview/CloseBtn.cjs +41 -0
- package/dist/Preview/CloseBtn.d.ts +8 -0
- package/dist/Preview/CloseBtn.js +39 -0
- package/dist/Preview/Footer.cjs +231 -0
- package/dist/Preview/Footer.d.ts +24 -0
- package/dist/Preview/Footer.js +229 -0
- package/dist/Preview/PrevNext.cjs +56 -0
- package/dist/Preview/PrevNext.d.ts +10 -0
- package/dist/Preview/PrevNext.js +54 -0
- package/dist/Preview/index.cjs +399 -0
- package/dist/Preview/index.d.ts +101 -0
- package/dist/Preview/index.js +397 -0
- package/dist/PreviewGroup.cjs +135 -0
- package/dist/PreviewGroup.d.ts +34 -0
- package/dist/PreviewGroup.js +133 -0
- package/dist/common.cjs +12 -0
- package/dist/common.d.ts +2 -0
- package/dist/common.js +12 -0
- package/dist/context.cjs +10 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.js +9 -0
- package/dist/getFixScaleEleTransPosition.cjs +25 -0
- package/dist/getFixScaleEleTransPosition.d.ts +16 -0
- package/dist/getFixScaleEleTransPosition.js +24 -0
- package/dist/hooks/useImageTransform.cjs +96 -0
- package/dist/hooks/useImageTransform.d.ts +21 -0
- package/dist/hooks/useImageTransform.js +95 -0
- package/dist/hooks/useMouseEvent.cjs +93 -0
- package/dist/hooks/useMouseEvent.d.ts +9 -0
- package/dist/hooks/useMouseEvent.js +92 -0
- package/dist/hooks/usePreviewItems.cjs +45 -0
- package/dist/hooks/usePreviewItems.d.ts +10 -0
- package/dist/hooks/usePreviewItems.js +44 -0
- package/dist/hooks/useRegisterImage.cjs +25 -0
- package/dist/hooks/useRegisterImage.d.ts +3 -0
- package/dist/hooks/useRegisterImage.js +24 -0
- package/dist/hooks/useStatus.cjs +46 -0
- package/dist/hooks/useStatus.d.ts +13 -0
- package/dist/hooks/useStatus.js +45 -0
- package/dist/hooks/useTouchEvent.cjs +120 -0
- package/dist/hooks/useTouchEvent.d.ts +8 -0
- package/dist/hooks/useTouchEvent.js +119 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +6 -0
- package/dist/interface.cjs +0 -0
- package/dist/interface.d.ts +13 -0
- package/dist/interface.js +0 -0
- package/dist/portal/dist/Context.cjs +12 -0
- package/dist/portal/dist/Context.js +11 -0
- package/dist/portal/dist/Portal.cjs +91 -0
- package/dist/portal/dist/Portal.js +91 -0
- package/dist/portal/dist/index.cjs +3 -0
- package/dist/portal/dist/index.js +3 -0
- package/dist/portal/dist/useDom.cjs +47 -0
- package/dist/portal/dist/useDom.js +47 -0
- package/dist/portal/dist/useScrollLocker.cjs +26 -0
- package/dist/portal/dist/useScrollLocker.js +26 -0
- package/dist/portal/dist/util.cjs +4 -0
- package/dist/portal/dist/util.js +4 -0
- package/dist/previewConfig.cjs +4 -0
- package/dist/previewConfig.d.ts +4 -0
- package/dist/previewConfig.js +3 -0
- package/dist/util/dist/Dom/canUseDom.cjs +4 -0
- package/dist/util/dist/Dom/canUseDom.js +4 -0
- package/dist/util/dist/Dom/contains.cjs +11 -0
- package/dist/util/dist/Dom/contains.js +11 -0
- package/dist/util/dist/Dom/dynamicCSS.cjs +78 -0
- package/dist/util/dist/Dom/dynamicCSS.js +77 -0
- package/dist/util/dist/KeyCode.cjs +81 -0
- package/dist/util/dist/KeyCode.js +81 -0
- package/dist/util/dist/RenderComponent.cjs +29 -0
- package/dist/util/dist/RenderComponent.js +29 -0
- package/dist/util/dist/classnames.cjs +36 -0
- package/dist/util/dist/classnames.js +35 -0
- package/dist/util/dist/getScrollBarSize.cjs +45 -0
- package/dist/util/dist/getScrollBarSize.js +45 -0
- package/dist/util/dist/hooks/useMergedState.cjs +24 -0
- package/dist/util/dist/hooks/useMergedState.js +24 -0
- package/dist/util/dist/index.cjs +3 -0
- package/dist/util/dist/index.js +3 -0
- package/dist/util/dist/isEqual.cjs +27 -0
- package/dist/util/dist/isEqual.js +27 -0
- package/dist/util/dist/omit.cjs +8 -0
- package/dist/util/dist/omit.js +8 -0
- package/dist/util/dist/pickAttrs.cjs +39 -0
- package/dist/util/dist/pickAttrs.js +39 -0
- package/dist/util/dist/props-util/index.cjs +47 -0
- package/dist/util/dist/props-util/index.js +44 -0
- package/dist/util/dist/raf.cjs +36 -0
- package/dist/util/dist/raf.js +36 -0
- package/dist/util/dist/type.cjs +2 -0
- package/dist/util/dist/type.js +2 -0
- package/dist/util/dist/utils/transition.cjs +21 -0
- package/dist/util/dist/utils/transition.js +21 -0
- package/dist/util/dist/warning.cjs +37 -0
- package/dist/util/dist/warning.js +37 -0
- package/dist/util.cjs +26 -0
- package/dist/util.d.ts +5 -0
- package/dist/util.js +25 -0
- package/package.json +48 -0
package/dist/common.d.ts
ADDED
package/dist/common.js
ADDED
package/dist/context.cjs
ADDED
|
@@ -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;
|
package/dist/context.js
ADDED
|
@@ -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;
|