@ozdao/martyrs 0.2.424 → 0.2.426
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/dist/builder.js +2 -12
- package/dist/builder.mjs +2 -12
- package/dist/martyrs/src/components/Block/Block.vue.cjs +1 -1
- package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs +87 -5
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +88 -6
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
- package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs → Tooltip.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs.map → Tooltip.vue2.js.map} +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs +52 -14
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js +53 -15
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +37 -65
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +38 -66
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
- package/dist/style.css +39 -61
- package/package.json +1 -1
- package/src/builder/modes/spa.dev.js +3 -1
- package/src/builder/modes/spa.prod.js +1 -1
- package/src/builder/modes/ssr.dev.js +10 -10
- package/src/components/PhotoViewer/PhotoViewer.vue +140 -12
- package/src/modules/products/components/blocks/ImagesThumbnails.vue +46 -37
- package/src/modules/products/components/pages/Product.vue +5 -28
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue.js.map +0 -1
package/dist/builder.js
CHANGED
|
@@ -637,7 +637,6 @@ function requireSsr_dev() {
|
|
|
637
637
|
const { transformDevStats } = requireSsrTransformWebpackStats();
|
|
638
638
|
ssr_dev = function createSsrDevServer(projectRoot, { clientConfig, serverConfig, ssrConfig, createServerPath }) {
|
|
639
639
|
const clientCompiler = webpack2(clientConfig);
|
|
640
|
-
const serverCompiler = webpack2(serverConfig);
|
|
641
640
|
const ssrCompiler = webpack2(ssrConfig);
|
|
642
641
|
const createDevRenderer = (onUpdate) => {
|
|
643
642
|
const createHotReloadingServerRenderer = (config) => {
|
|
@@ -750,15 +749,6 @@ function requireSsr_dev() {
|
|
|
750
749
|
process.exit(1);
|
|
751
750
|
}
|
|
752
751
|
};
|
|
753
|
-
serverCompiler.watch({}, async (err, stats) => {
|
|
754
|
-
if (err) {
|
|
755
|
-
console.error(err);
|
|
756
|
-
return;
|
|
757
|
-
}
|
|
758
|
-
console.log(stats.toString(serverConfig.stats));
|
|
759
|
-
console.log("Server.js has changed, updating...");
|
|
760
|
-
await startServer();
|
|
761
|
-
});
|
|
762
752
|
return startServer;
|
|
763
753
|
};
|
|
764
754
|
return ssr_dev;
|
|
@@ -870,7 +860,7 @@ function requireSpa_dev() {
|
|
|
870
860
|
Object.keys(require.cache).forEach((id) => {
|
|
871
861
|
delete require.cache[id];
|
|
872
862
|
});
|
|
873
|
-
const { createServer } =
|
|
863
|
+
const { createServer } = createServerPath;
|
|
874
864
|
let { app, server, env } = await createServer();
|
|
875
865
|
app.use(history());
|
|
876
866
|
app.use(clientDevMiddleware);
|
|
@@ -921,7 +911,7 @@ function requireSpa_prod() {
|
|
|
921
911
|
spa_prod = function createSpaProdServer(projectRoot, { createServerPath }) {
|
|
922
912
|
const port = process.env.PORT || 8080;
|
|
923
913
|
const startServer = async () => {
|
|
924
|
-
const { createServer } =
|
|
914
|
+
const { createServer } = createServerPath;
|
|
925
915
|
let { app, server } = await createServer();
|
|
926
916
|
app.use(express.static(path.resolve(projectRoot, "builds/web/spa")));
|
|
927
917
|
app.use(history({
|
package/dist/builder.mjs
CHANGED
|
@@ -614,7 +614,6 @@ function requireSsr_dev() {
|
|
|
614
614
|
const { transformDevStats } = requireSsrTransformWebpackStats();
|
|
615
615
|
ssr_dev = function createSsrDevServer(projectRoot, { clientConfig, serverConfig, ssrConfig, createServerPath }) {
|
|
616
616
|
const clientCompiler = webpack2(clientConfig);
|
|
617
|
-
const serverCompiler = webpack2(serverConfig);
|
|
618
617
|
const ssrCompiler = webpack2(ssrConfig);
|
|
619
618
|
const createDevRenderer = (onUpdate) => {
|
|
620
619
|
const createHotReloadingServerRenderer = (config) => {
|
|
@@ -727,15 +726,6 @@ function requireSsr_dev() {
|
|
|
727
726
|
process.exit(1);
|
|
728
727
|
}
|
|
729
728
|
};
|
|
730
|
-
serverCompiler.watch({}, async (err, stats) => {
|
|
731
|
-
if (err) {
|
|
732
|
-
console.error(err);
|
|
733
|
-
return;
|
|
734
|
-
}
|
|
735
|
-
console.log(stats.toString(serverConfig.stats));
|
|
736
|
-
console.log("Server.js has changed, updating...");
|
|
737
|
-
await startServer();
|
|
738
|
-
});
|
|
739
729
|
return startServer;
|
|
740
730
|
};
|
|
741
731
|
return ssr_dev;
|
|
@@ -847,7 +837,7 @@ function requireSpa_dev() {
|
|
|
847
837
|
Object.keys(require.cache).forEach((id) => {
|
|
848
838
|
delete require.cache[id];
|
|
849
839
|
});
|
|
850
|
-
const { createServer } =
|
|
840
|
+
const { createServer } = createServerPath;
|
|
851
841
|
let { app, server, env } = await createServer();
|
|
852
842
|
app.use(history());
|
|
853
843
|
app.use(clientDevMiddleware);
|
|
@@ -898,7 +888,7 @@ function requireSpa_prod() {
|
|
|
898
888
|
spa_prod = function createSpaProdServer(projectRoot, { createServerPath }) {
|
|
899
889
|
const port = process.env.PORT || 8080;
|
|
900
890
|
const startServer = async () => {
|
|
901
|
-
const { createServer } =
|
|
891
|
+
const { createServer } = createServerPath;
|
|
902
892
|
let { app, server } = await createServer();
|
|
903
893
|
app.use(express.static(path.resolve(projectRoot, "builds/web/spa")));
|
|
904
894
|
app.use(history({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
|
-
const Tooltip = require("../Tooltip/Tooltip.
|
|
4
|
+
const Tooltip = require("../Tooltip/Tooltip.vue2.cjs");
|
|
5
5
|
const _hoisted_1 = { class: "bg-light pd-medium radius-medium" };
|
|
6
6
|
const _hoisted_2 = {
|
|
7
7
|
key: 0,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useSlots, createElementBlock, openBlock, createCommentVNode, renderSlot, createBlock, toDisplayString, Fragment, renderList, normalizeClass, withCtx, createElementVNode, Comment } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../Tooltip/Tooltip.
|
|
2
|
+
import _sfc_main$1 from "../Tooltip/Tooltip.vue2.js";
|
|
3
3
|
const _hoisted_1 = { class: "bg-light pd-medium radius-medium" };
|
|
4
4
|
const _hoisted_2 = {
|
|
5
5
|
key: 0,
|
|
@@ -16,16 +16,57 @@ const _sfc_main = {
|
|
|
16
16
|
const startPosition = vue.reactive({ x: 0, y: 0 });
|
|
17
17
|
const startScale = vue.ref(1);
|
|
18
18
|
const startDistance = vue.ref(0);
|
|
19
|
+
const image = vue.ref(null);
|
|
20
|
+
vue.ref(null);
|
|
19
21
|
const imgStyle = vue.computed(() => ({
|
|
20
22
|
transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`
|
|
21
23
|
}));
|
|
24
|
+
vue.watch(scale, () => {
|
|
25
|
+
constrainPosition();
|
|
26
|
+
});
|
|
27
|
+
const getImageDimensions = () => {
|
|
28
|
+
var _a;
|
|
29
|
+
if (!image.value) return { width: 0, height: 0 };
|
|
30
|
+
const imgWidth = image.value.naturalWidth;
|
|
31
|
+
const imgHeight = image.value.naturalHeight;
|
|
32
|
+
const containerRect = (_a = image.value.parentElement) == null ? void 0 : _a.getBoundingClientRect();
|
|
33
|
+
if (!containerRect) return { width: 0, height: 0 };
|
|
34
|
+
const containerWidth = containerRect.width;
|
|
35
|
+
const containerHeight = containerRect.height;
|
|
36
|
+
let renderedWidth, renderedHeight;
|
|
37
|
+
if (imgWidth > containerWidth || imgHeight > containerHeight) {
|
|
38
|
+
const ratioX = containerWidth / imgWidth;
|
|
39
|
+
const ratioY = containerHeight / imgHeight;
|
|
40
|
+
const ratio = Math.min(ratioX, ratioY);
|
|
41
|
+
renderedWidth = imgWidth * ratio;
|
|
42
|
+
renderedHeight = imgHeight * ratio;
|
|
43
|
+
} else {
|
|
44
|
+
renderedWidth = imgWidth;
|
|
45
|
+
renderedHeight = imgHeight;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
renderedWidth,
|
|
49
|
+
renderedHeight,
|
|
50
|
+
containerWidth,
|
|
51
|
+
containerHeight
|
|
52
|
+
};
|
|
53
|
+
};
|
|
22
54
|
const handleWheel = (event) => {
|
|
23
55
|
event.preventDefault();
|
|
24
56
|
const delta = event.deltaY > 0 ? -0.1 : 0.1;
|
|
25
|
-
|
|
57
|
+
const newScale = Math.min(Math.max(1, scale.value + delta), 3);
|
|
58
|
+
const rect = image.value.getBoundingClientRect();
|
|
59
|
+
const mouseX = event.clientX - rect.left - rect.width / 2;
|
|
60
|
+
const mouseY = event.clientY - rect.top - rect.height / 2;
|
|
61
|
+
const scaleChange = newScale / scale.value;
|
|
62
|
+
position.x = position.x - mouseX / scale.value * (scaleChange - 1);
|
|
63
|
+
position.y = position.y - mouseY / scale.value * (scaleChange - 1);
|
|
64
|
+
scale.value = newScale;
|
|
65
|
+
constrainPosition();
|
|
26
66
|
};
|
|
27
67
|
const startDrag = (event) => {
|
|
28
68
|
event.preventDefault();
|
|
69
|
+
if (scale.value <= 1) return;
|
|
29
70
|
dragging.value = true;
|
|
30
71
|
startPosition.x = event.type === "mousedown" ? event.clientX : event.touches[0].clientX;
|
|
31
72
|
startPosition.y = event.type === "mousedown" ? event.clientY : event.touches[0].clientY;
|
|
@@ -33,8 +74,11 @@ const _sfc_main = {
|
|
|
33
74
|
if (dragging.value) {
|
|
34
75
|
const currentX = moveEvent.type === "mousemove" ? moveEvent.clientX : moveEvent.touches[0].clientX;
|
|
35
76
|
const currentY = moveEvent.type === "mousemove" ? moveEvent.clientY : moveEvent.touches[0].clientY;
|
|
36
|
-
|
|
37
|
-
|
|
77
|
+
const deltaX = (currentX - startPosition.x) / scale.value;
|
|
78
|
+
const deltaY = (currentY - startPosition.y) / scale.value;
|
|
79
|
+
position.x += deltaX;
|
|
80
|
+
position.y += deltaY;
|
|
81
|
+
constrainPosition();
|
|
38
82
|
startPosition.x = currentX;
|
|
39
83
|
startPosition.y = currentY;
|
|
40
84
|
}
|
|
@@ -72,7 +116,17 @@ const _sfc_main = {
|
|
|
72
116
|
const distanceY = Math.abs(touch1.clientY - touch2.clientY);
|
|
73
117
|
const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
|
|
74
118
|
const scaleFactor = newDistance / startDistance.value;
|
|
75
|
-
|
|
119
|
+
const centerX = (touch1.clientX + touch2.clientX) / 2;
|
|
120
|
+
const centerY = (touch1.clientY + touch2.clientY) / 2;
|
|
121
|
+
const rect = image.value.getBoundingClientRect();
|
|
122
|
+
const touchCenterX = centerX - rect.left - rect.width / 2;
|
|
123
|
+
const touchCenterY = centerY - rect.top - rect.height / 2;
|
|
124
|
+
const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
|
|
125
|
+
const scaleChange = newScale / scale.value;
|
|
126
|
+
position.x = position.x - touchCenterX / scale.value * (scaleChange - 1);
|
|
127
|
+
position.y = position.y - touchCenterY / scale.value * (scaleChange - 1);
|
|
128
|
+
scale.value = newScale;
|
|
129
|
+
constrainPosition();
|
|
76
130
|
}
|
|
77
131
|
};
|
|
78
132
|
const handleTouchEnd = (event) => {
|
|
@@ -85,6 +139,33 @@ const _sfc_main = {
|
|
|
85
139
|
position.x = 0;
|
|
86
140
|
position.y = 0;
|
|
87
141
|
};
|
|
142
|
+
const constrainPosition = () => {
|
|
143
|
+
if (scale.value <= 1) {
|
|
144
|
+
position.x = 0;
|
|
145
|
+
position.y = 0;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();
|
|
149
|
+
const scaledWidth = renderedWidth * scale.value;
|
|
150
|
+
const scaledHeight = renderedHeight * scale.value;
|
|
151
|
+
const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;
|
|
152
|
+
const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;
|
|
153
|
+
if (horizontalOffset > 0) {
|
|
154
|
+
position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));
|
|
155
|
+
} else {
|
|
156
|
+
position.x = 0;
|
|
157
|
+
}
|
|
158
|
+
if (verticalOffset > 0) {
|
|
159
|
+
position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));
|
|
160
|
+
} else {
|
|
161
|
+
position.y = 0;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
vue.onMounted(() => {
|
|
165
|
+
window.addEventListener("resize", () => {
|
|
166
|
+
constrainPosition();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
88
169
|
return (_ctx, _cache) => {
|
|
89
170
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
90
171
|
class: "photo-container",
|
|
@@ -98,7 +179,8 @@ const _sfc_main = {
|
|
|
98
179
|
loading: "lazy",
|
|
99
180
|
src: __props.photoUrl,
|
|
100
181
|
style: vue.normalizeStyle(imgStyle.value),
|
|
101
|
-
|
|
182
|
+
ref_key: "image",
|
|
183
|
+
ref: image,
|
|
102
184
|
onLoad: initialize
|
|
103
185
|
}, null, 44, _hoisted_1)
|
|
104
186
|
], 32);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhotoViewer.vue.cjs","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, computed } from 'vue';\n\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\n\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\nconst handleWheel = (event) => {\n event.preventDefault();\n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n scale.value = Math.min(Math.max(1, scale.value + delta), 3);\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n position.x += (currentX - startPosition.x) / scale.value;\n position.y += (currentY - startPosition.y) / scale.value;\n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n</script>\n\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.3s;\n}\n</style>\n"],"names":["ref","reactive","computed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhotoViewer.vue.cjs","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n<script setup>\nimport { ref, reactive, computed, onMounted, watch } from 'vue';\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\nconst image = ref(null);\nconst container = ref(null);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\n// Наблюдаем за изменением масштаба, чтобы ограничивать позицию\nwatch(scale, () => {\n constrainPosition();\n});\n\nconst getImageDimensions = () => {\n if (!image.value) return { width: 0, height: 0 };\n \n // Используем естественные размеры изображения\n const imgWidth = image.value.naturalWidth;\n const imgHeight = image.value.naturalHeight;\n \n // Получаем размеры контейнера\n const containerRect = image.value.parentElement?.getBoundingClientRect();\n if (!containerRect) return { width: 0, height: 0 };\n \n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n \n // Определяем, как изображение вписывается в контейнер (с учетом object-fit: scale-down)\n let renderedWidth, renderedHeight;\n \n if (imgWidth > containerWidth || imgHeight > containerHeight) {\n const ratioX = containerWidth / imgWidth;\n const ratioY = containerHeight / imgHeight;\n const ratio = Math.min(ratioX, ratioY);\n \n renderedWidth = imgWidth * ratio;\n renderedHeight = imgHeight * ratio;\n } else {\n renderedWidth = imgWidth;\n renderedHeight = imgHeight;\n }\n \n return {\n renderedWidth,\n renderedHeight,\n containerWidth,\n containerHeight\n };\n};\n\nconst handleWheel = (event) => {\n event.preventDefault();\n \n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n const newScale = Math.min(Math.max(1, scale.value + delta), 3);\n \n // Рассчитываем позицию курсора относительно центра изображения\n const rect = image.value.getBoundingClientRect();\n const mouseX = event.clientX - rect.left - rect.width / 2;\n const mouseY = event.clientY - rect.top - rect.height / 2;\n \n // Сохраняем соотношение позиции курсора к изображению при масштабировании\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию так, чтобы точка под курсором оставалась на месте\n position.x = position.x - (mouseX / scale.value) * (scaleChange - 1);\n position.y = position.y - (mouseY / scale.value) * (scaleChange - 1);\n \n // Обновляем масштаб\n scale.value = newScale;\n \n // Ограничиваем позицию после обновления масштаба\n constrainPosition();\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n if (scale.value <= 1) return; // Не позволяем перетаскивать при масштабе 1\n \n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n \n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n \n const deltaX = (currentX - startPosition.x) / scale.value;\n const deltaY = (currentY - startPosition.y) / scale.value;\n \n position.x += deltaX;\n position.y += deltaY;\n \n // Ограничиваем позицию после перемещения\n constrainPosition();\n \n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n \n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n \n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n \n // Получаем центр между двумя касаниями\n const centerX = (touch1.clientX + touch2.clientX) / 2;\n const centerY = (touch1.clientY + touch2.clientY) / 2;\n \n // Получаем координаты центра касания относительно изображения\n const rect = image.value.getBoundingClientRect();\n const touchCenterX = centerX - rect.left - rect.width / 2;\n const touchCenterY = centerY - rect.top - rect.height / 2;\n \n const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию, чтобы центр касания оставался на месте\n position.x = position.x - (touchCenterX / scale.value) * (scaleChange - 1);\n position.y = position.y - (touchCenterY / scale.value) * (scaleChange - 1);\n \n scale.value = newScale;\n constrainPosition();\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n\nconst constrainPosition = () => {\n // Если масштаб 1, сбрасываем позицию в центр\n if (scale.value <= 1) {\n position.x = 0;\n position.y = 0;\n return;\n }\n \n const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();\n \n // Вычисляем максимальное смещение\n const scaledWidth = renderedWidth * scale.value;\n const scaledHeight = renderedHeight * scale.value;\n \n // Отступ от края изображения до края контейнера при текущем масштабе\n const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;\n const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;\n \n // Ограничиваем смещение, чтобы изображение не выходило за пределы контейнера\n if (horizontalOffset > 0) {\n position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));\n } else {\n position.x = 0;\n }\n \n if (verticalOffset > 0) {\n position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));\n } else {\n position.y = 0;\n }\n};\n\nonMounted(() => {\n window.addEventListener('resize', () => {\n constrainPosition();\n });\n});\n</script>\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.05s;\n transform-origin: center center;\n}\n</style>"],"names":["ref","reactive","computed","watch","onMounted"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ref, reactive, computed, createElementBlock, openBlock, createElementVNode, normalizeStyle } from "vue";
|
|
1
|
+
import { ref, reactive, computed, watch, onMounted, createElementBlock, openBlock, createElementVNode, normalizeStyle } from "vue";
|
|
2
2
|
/* empty css */
|
|
3
3
|
const _hoisted_1 = ["src"];
|
|
4
4
|
const _sfc_main = {
|
|
@@ -14,16 +14,57 @@ const _sfc_main = {
|
|
|
14
14
|
const startPosition = reactive({ x: 0, y: 0 });
|
|
15
15
|
const startScale = ref(1);
|
|
16
16
|
const startDistance = ref(0);
|
|
17
|
+
const image = ref(null);
|
|
18
|
+
ref(null);
|
|
17
19
|
const imgStyle = computed(() => ({
|
|
18
20
|
transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`
|
|
19
21
|
}));
|
|
22
|
+
watch(scale, () => {
|
|
23
|
+
constrainPosition();
|
|
24
|
+
});
|
|
25
|
+
const getImageDimensions = () => {
|
|
26
|
+
var _a;
|
|
27
|
+
if (!image.value) return { width: 0, height: 0 };
|
|
28
|
+
const imgWidth = image.value.naturalWidth;
|
|
29
|
+
const imgHeight = image.value.naturalHeight;
|
|
30
|
+
const containerRect = (_a = image.value.parentElement) == null ? void 0 : _a.getBoundingClientRect();
|
|
31
|
+
if (!containerRect) return { width: 0, height: 0 };
|
|
32
|
+
const containerWidth = containerRect.width;
|
|
33
|
+
const containerHeight = containerRect.height;
|
|
34
|
+
let renderedWidth, renderedHeight;
|
|
35
|
+
if (imgWidth > containerWidth || imgHeight > containerHeight) {
|
|
36
|
+
const ratioX = containerWidth / imgWidth;
|
|
37
|
+
const ratioY = containerHeight / imgHeight;
|
|
38
|
+
const ratio = Math.min(ratioX, ratioY);
|
|
39
|
+
renderedWidth = imgWidth * ratio;
|
|
40
|
+
renderedHeight = imgHeight * ratio;
|
|
41
|
+
} else {
|
|
42
|
+
renderedWidth = imgWidth;
|
|
43
|
+
renderedHeight = imgHeight;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
renderedWidth,
|
|
47
|
+
renderedHeight,
|
|
48
|
+
containerWidth,
|
|
49
|
+
containerHeight
|
|
50
|
+
};
|
|
51
|
+
};
|
|
20
52
|
const handleWheel = (event) => {
|
|
21
53
|
event.preventDefault();
|
|
22
54
|
const delta = event.deltaY > 0 ? -0.1 : 0.1;
|
|
23
|
-
|
|
55
|
+
const newScale = Math.min(Math.max(1, scale.value + delta), 3);
|
|
56
|
+
const rect = image.value.getBoundingClientRect();
|
|
57
|
+
const mouseX = event.clientX - rect.left - rect.width / 2;
|
|
58
|
+
const mouseY = event.clientY - rect.top - rect.height / 2;
|
|
59
|
+
const scaleChange = newScale / scale.value;
|
|
60
|
+
position.x = position.x - mouseX / scale.value * (scaleChange - 1);
|
|
61
|
+
position.y = position.y - mouseY / scale.value * (scaleChange - 1);
|
|
62
|
+
scale.value = newScale;
|
|
63
|
+
constrainPosition();
|
|
24
64
|
};
|
|
25
65
|
const startDrag = (event) => {
|
|
26
66
|
event.preventDefault();
|
|
67
|
+
if (scale.value <= 1) return;
|
|
27
68
|
dragging.value = true;
|
|
28
69
|
startPosition.x = event.type === "mousedown" ? event.clientX : event.touches[0].clientX;
|
|
29
70
|
startPosition.y = event.type === "mousedown" ? event.clientY : event.touches[0].clientY;
|
|
@@ -31,8 +72,11 @@ const _sfc_main = {
|
|
|
31
72
|
if (dragging.value) {
|
|
32
73
|
const currentX = moveEvent.type === "mousemove" ? moveEvent.clientX : moveEvent.touches[0].clientX;
|
|
33
74
|
const currentY = moveEvent.type === "mousemove" ? moveEvent.clientY : moveEvent.touches[0].clientY;
|
|
34
|
-
|
|
35
|
-
|
|
75
|
+
const deltaX = (currentX - startPosition.x) / scale.value;
|
|
76
|
+
const deltaY = (currentY - startPosition.y) / scale.value;
|
|
77
|
+
position.x += deltaX;
|
|
78
|
+
position.y += deltaY;
|
|
79
|
+
constrainPosition();
|
|
36
80
|
startPosition.x = currentX;
|
|
37
81
|
startPosition.y = currentY;
|
|
38
82
|
}
|
|
@@ -70,7 +114,17 @@ const _sfc_main = {
|
|
|
70
114
|
const distanceY = Math.abs(touch1.clientY - touch2.clientY);
|
|
71
115
|
const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
|
|
72
116
|
const scaleFactor = newDistance / startDistance.value;
|
|
73
|
-
|
|
117
|
+
const centerX = (touch1.clientX + touch2.clientX) / 2;
|
|
118
|
+
const centerY = (touch1.clientY + touch2.clientY) / 2;
|
|
119
|
+
const rect = image.value.getBoundingClientRect();
|
|
120
|
+
const touchCenterX = centerX - rect.left - rect.width / 2;
|
|
121
|
+
const touchCenterY = centerY - rect.top - rect.height / 2;
|
|
122
|
+
const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
|
|
123
|
+
const scaleChange = newScale / scale.value;
|
|
124
|
+
position.x = position.x - touchCenterX / scale.value * (scaleChange - 1);
|
|
125
|
+
position.y = position.y - touchCenterY / scale.value * (scaleChange - 1);
|
|
126
|
+
scale.value = newScale;
|
|
127
|
+
constrainPosition();
|
|
74
128
|
}
|
|
75
129
|
};
|
|
76
130
|
const handleTouchEnd = (event) => {
|
|
@@ -83,6 +137,33 @@ const _sfc_main = {
|
|
|
83
137
|
position.x = 0;
|
|
84
138
|
position.y = 0;
|
|
85
139
|
};
|
|
140
|
+
const constrainPosition = () => {
|
|
141
|
+
if (scale.value <= 1) {
|
|
142
|
+
position.x = 0;
|
|
143
|
+
position.y = 0;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();
|
|
147
|
+
const scaledWidth = renderedWidth * scale.value;
|
|
148
|
+
const scaledHeight = renderedHeight * scale.value;
|
|
149
|
+
const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;
|
|
150
|
+
const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;
|
|
151
|
+
if (horizontalOffset > 0) {
|
|
152
|
+
position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));
|
|
153
|
+
} else {
|
|
154
|
+
position.x = 0;
|
|
155
|
+
}
|
|
156
|
+
if (verticalOffset > 0) {
|
|
157
|
+
position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));
|
|
158
|
+
} else {
|
|
159
|
+
position.y = 0;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
onMounted(() => {
|
|
163
|
+
window.addEventListener("resize", () => {
|
|
164
|
+
constrainPosition();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
86
167
|
return (_ctx, _cache) => {
|
|
87
168
|
return openBlock(), createElementBlock("div", {
|
|
88
169
|
class: "photo-container",
|
|
@@ -96,7 +177,8 @@ const _sfc_main = {
|
|
|
96
177
|
loading: "lazy",
|
|
97
178
|
src: __props.photoUrl,
|
|
98
179
|
style: normalizeStyle(imgStyle.value),
|
|
99
|
-
|
|
180
|
+
ref_key: "image",
|
|
181
|
+
ref: image,
|
|
100
182
|
onLoad: initialize
|
|
101
183
|
}, null, 44, _hoisted_1)
|
|
102
184
|
], 32);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhotoViewer.vue.js","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, computed } from 'vue';\n\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\n\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\nconst handleWheel = (event) => {\n event.preventDefault();\n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n scale.value = Math.min(Math.max(1, scale.value + delta), 3);\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n position.x += (currentX - startPosition.x) / scale.value;\n position.y += (currentY - startPosition.y) / scale.value;\n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n</script>\n\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.3s;\n}\n</style>\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhotoViewer.vue.js","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n<script setup>\nimport { ref, reactive, computed, onMounted, watch } from 'vue';\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\nconst image = ref(null);\nconst container = ref(null);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\n// Наблюдаем за изменением масштаба, чтобы ограничивать позицию\nwatch(scale, () => {\n constrainPosition();\n});\n\nconst getImageDimensions = () => {\n if (!image.value) return { width: 0, height: 0 };\n \n // Используем естественные размеры изображения\n const imgWidth = image.value.naturalWidth;\n const imgHeight = image.value.naturalHeight;\n \n // Получаем размеры контейнера\n const containerRect = image.value.parentElement?.getBoundingClientRect();\n if (!containerRect) return { width: 0, height: 0 };\n \n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n \n // Определяем, как изображение вписывается в контейнер (с учетом object-fit: scale-down)\n let renderedWidth, renderedHeight;\n \n if (imgWidth > containerWidth || imgHeight > containerHeight) {\n const ratioX = containerWidth / imgWidth;\n const ratioY = containerHeight / imgHeight;\n const ratio = Math.min(ratioX, ratioY);\n \n renderedWidth = imgWidth * ratio;\n renderedHeight = imgHeight * ratio;\n } else {\n renderedWidth = imgWidth;\n renderedHeight = imgHeight;\n }\n \n return {\n renderedWidth,\n renderedHeight,\n containerWidth,\n containerHeight\n };\n};\n\nconst handleWheel = (event) => {\n event.preventDefault();\n \n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n const newScale = Math.min(Math.max(1, scale.value + delta), 3);\n \n // Рассчитываем позицию курсора относительно центра изображения\n const rect = image.value.getBoundingClientRect();\n const mouseX = event.clientX - rect.left - rect.width / 2;\n const mouseY = event.clientY - rect.top - rect.height / 2;\n \n // Сохраняем соотношение позиции курсора к изображению при масштабировании\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию так, чтобы точка под курсором оставалась на месте\n position.x = position.x - (mouseX / scale.value) * (scaleChange - 1);\n position.y = position.y - (mouseY / scale.value) * (scaleChange - 1);\n \n // Обновляем масштаб\n scale.value = newScale;\n \n // Ограничиваем позицию после обновления масштаба\n constrainPosition();\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n if (scale.value <= 1) return; // Не позволяем перетаскивать при масштабе 1\n \n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n \n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n \n const deltaX = (currentX - startPosition.x) / scale.value;\n const deltaY = (currentY - startPosition.y) / scale.value;\n \n position.x += deltaX;\n position.y += deltaY;\n \n // Ограничиваем позицию после перемещения\n constrainPosition();\n \n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n \n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n \n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n \n // Получаем центр между двумя касаниями\n const centerX = (touch1.clientX + touch2.clientX) / 2;\n const centerY = (touch1.clientY + touch2.clientY) / 2;\n \n // Получаем координаты центра касания относительно изображения\n const rect = image.value.getBoundingClientRect();\n const touchCenterX = centerX - rect.left - rect.width / 2;\n const touchCenterY = centerY - rect.top - rect.height / 2;\n \n const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию, чтобы центр касания оставался на месте\n position.x = position.x - (touchCenterX / scale.value) * (scaleChange - 1);\n position.y = position.y - (touchCenterY / scale.value) * (scaleChange - 1);\n \n scale.value = newScale;\n constrainPosition();\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n\nconst constrainPosition = () => {\n // Если масштаб 1, сбрасываем позицию в центр\n if (scale.value <= 1) {\n position.x = 0;\n position.y = 0;\n return;\n }\n \n const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();\n \n // Вычисляем максимальное смещение\n const scaledWidth = renderedWidth * scale.value;\n const scaledHeight = renderedHeight * scale.value;\n \n // Отступ от края изображения до края контейнера при текущем масштабе\n const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;\n const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;\n \n // Ограничиваем смещение, чтобы изображение не выходило за пределы контейнера\n if (horizontalOffset > 0) {\n position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));\n } else {\n position.x = 0;\n }\n \n if (verticalOffset > 0) {\n position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));\n } else {\n position.y = 0;\n }\n};\n\nonMounted(() => {\n window.addEventListener('resize', () => {\n constrainPosition();\n });\n});\n</script>\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.05s;\n transform-origin: center center;\n}\n</style>"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
|
-
;/* empty css
|
|
4
|
+
;/* empty css */
|
|
5
5
|
const _sfc_main = {
|
|
6
6
|
__name: "Tooltip",
|
|
7
7
|
props: {
|
|
@@ -49,4 +49,4 @@ const _sfc_main = {
|
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
51
|
exports.default = _sfc_main;
|
|
52
|
-
//# sourceMappingURL=Tooltip.
|
|
52
|
+
//# sourceMappingURL=Tooltip.vue2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.vue2.cjs","sources":["../../../../../src/components/Tooltip/Tooltip.vue"],"sourcesContent":["<template>\n <div class=\"cursor-pointer tooltip-container\" @mouseover=\"showTooltip\" @mouseleave=\"hideTooltip\">\n <slot></slot>\n <div class=\"tooltip-content\" :style=\"tooltipStyle\">\n {{ text }}\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive } from 'vue';\n\nconst props = defineProps({\n text: {\n type: String,\n required: true\n }\n});\n\nconst visible = ref(false);\n\nconst tooltipStyle = reactive({\n position: 'absolute',\n width: 'max-content',\n zIndex: 1000,\n background: '#333',\n color: '#fff',\n padding: '5px 10px',\n borderRadius: '3px',\n fontSize: '14px',\n display: 'none',\n});\n\nfunction showTooltip(event) {\n visible.value = true;\n tooltipStyle.left = `${(event.clientX / 100) + 10 }px`;\n tooltipStyle.top = `${(event.clientY / 100) + 10 }px`;\n tooltipStyle.display = 'block';\n}\n\nfunction hideTooltip() {\n visible.value = false;\n tooltipStyle.display = 'none';\n}\n</script>\n\n<style >\n.tooltip-container {\n position: relative;\n display: inline-block;\n}\n\n.tooltip-content {\n pointer-events: none;\n}\n</style>"],"names":["ref","reactive"],"mappings":";;;;;;;;;;;;;AAmBA,UAAM,UAAUA,IAAG,IAAC,KAAK;AAEzB,UAAM,eAAeC,IAAAA,SAAS;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAED,aAAS,YAAY,OAAO;AAC1B,cAAQ,QAAQ;AAChB,mBAAa,OAAO,GAAI,MAAM,UAAU,MAAO,EAAE;AACjD,mBAAa,MAAM,GAAI,MAAM,UAAU,MAAO,EAAE;AAChD,mBAAa,UAAU;AAAA,IACzB;AAEA,aAAS,cAAc;AACrB,cAAQ,QAAQ;AAChB,mBAAa,UAAU;AAAA,IACzB;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, reactive, createElementBlock, openBlock, renderSlot, createElementVNode, normalizeStyle, toDisplayString } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
const _sfc_main = {
|
|
4
4
|
__name: "Tooltip",
|
|
5
5
|
props: {
|
|
@@ -49,4 +49,4 @@ const _sfc_main = {
|
|
|
49
49
|
export {
|
|
50
50
|
_sfc_main as default
|
|
51
51
|
};
|
|
52
|
-
//# sourceMappingURL=Tooltip.
|
|
52
|
+
//# sourceMappingURL=Tooltip.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.
|
|
1
|
+
{"version":3,"file":"Tooltip.vue2.js","sources":["../../../../../src/components/Tooltip/Tooltip.vue"],"sourcesContent":["<template>\n <div class=\"cursor-pointer tooltip-container\" @mouseover=\"showTooltip\" @mouseleave=\"hideTooltip\">\n <slot></slot>\n <div class=\"tooltip-content\" :style=\"tooltipStyle\">\n {{ text }}\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive } from 'vue';\n\nconst props = defineProps({\n text: {\n type: String,\n required: true\n }\n});\n\nconst visible = ref(false);\n\nconst tooltipStyle = reactive({\n position: 'absolute',\n width: 'max-content',\n zIndex: 1000,\n background: '#333',\n color: '#fff',\n padding: '5px 10px',\n borderRadius: '3px',\n fontSize: '14px',\n display: 'none',\n});\n\nfunction showTooltip(event) {\n visible.value = true;\n tooltipStyle.left = `${(event.clientX / 100) + 10 }px`;\n tooltipStyle.top = `${(event.clientY / 100) + 10 }px`;\n tooltipStyle.display = 'block';\n}\n\nfunction hideTooltip() {\n visible.value = false;\n tooltipStyle.display = 'none';\n}\n</script>\n\n<style >\n.tooltip-container {\n position: relative;\n display: inline-block;\n}\n\n.tooltip-content {\n pointer-events: none;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;AAmBA,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,eAAe,SAAS;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAED,aAAS,YAAY,OAAO;AAC1B,cAAQ,QAAQ;AAChB,mBAAa,OAAO,GAAI,MAAM,UAAU,MAAO,EAAE;AACjD,mBAAa,MAAM,GAAI,MAAM,UAAU,MAAO,EAAE;AAChD,mBAAa,UAAU;AAAA,IACzB;AAEA,aAAS,cAAc;AACrB,cAAQ,QAAQ;AAChB,mBAAa,UAAU;AAAA,IACzB;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
4
|
const vueRouter = require("vue-router");
|
|
5
|
-
const Tooltip = require("../../../../../components/Tooltip/Tooltip.
|
|
5
|
+
const Tooltip = require("../../../../../components/Tooltip/Tooltip.vue2.cjs");
|
|
6
6
|
const Dropdown = require("../../../../../components/Dropdown/Dropdown.vue2.cjs");
|
|
7
7
|
const PlaceholderUserpic = require("../../../../icons/placeholders/PlaceholderUserpic.vue.cjs");
|
|
8
8
|
const PlaceholderOrganizationPic = require("../../../../icons/placeholders/PlaceholderOrganizationPic.vue.cjs");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, createCommentVNode, openBlock, createElementVNode, createBlock, withModifiers, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode, Fragment, renderList, normalizeClass } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.
|
|
3
|
+
import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.vue2.js";
|
|
4
4
|
import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.vue2.js";
|
|
5
5
|
import PlaceholderUserpic from "../../../../icons/placeholders/PlaceholderUserpic.vue.js";
|
|
6
6
|
import PlaceholderOrganizationPic from "../../../../icons/placeholders/PlaceholderOrganizationPic.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const vue = require("vue");
|
|
4
|
-
const Tooltip = require("../../../../components/Tooltip/Tooltip.
|
|
4
|
+
const Tooltip = require("../../../../components/Tooltip/Tooltip.vue2.cjs");
|
|
5
5
|
const IconStatusCreated = require("../icons/IconStatusCreated.vue.cjs");
|
|
6
6
|
const IconStatusConfirmed = require("../icons/IconStatusConfirmed.vue.cjs");
|
|
7
7
|
const IconStatusInUse = require("../icons/IconStatusInUse.vue.cjs");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { computed, createElementBlock, openBlock, createElementVNode, createCommentVNode, normalizeClass, Fragment, renderList, toDisplayString, createVNode, withCtx, createBlock, resolveDynamicComponent } from "vue";
|
|
2
|
-
import _sfc_main$7 from "../../../../components/Tooltip/Tooltip.
|
|
2
|
+
import _sfc_main$7 from "../../../../components/Tooltip/Tooltip.vue2.js";
|
|
3
3
|
import _sfc_main$6 from "../icons/IconStatusCreated.vue.js";
|
|
4
4
|
import _sfc_main$5 from "../icons/IconStatusConfirmed.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../icons/IconStatusInUse.vue.js";
|
|
@@ -4,7 +4,7 @@ const vue = require("vue");
|
|
|
4
4
|
const vueRouter = require("vue-router");
|
|
5
5
|
const Feed = require("../../../../components/Feed/Feed.vue.cjs");
|
|
6
6
|
;/* empty css */
|
|
7
|
-
;/* empty css
|
|
7
|
+
;/* empty css */
|
|
8
8
|
const Popup = require("../../../../components/Popup/Popup.vue.cjs");
|
|
9
9
|
const SectionPageTitle = require("../../../globals/views/components/sections/SectionPageTitle.vue.cjs");
|
|
10
10
|
const MembersAdd = require("../sections/MembersAdd.vue.cjs");
|
|
@@ -2,7 +2,7 @@ import { ref, onMounted, computed, resolveComponent, createElementBlock, openBlo
|
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
3
|
import _sfc_main$4 from "../../../../components/Feed/Feed.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
|
-
/* empty css
|
|
5
|
+
/* empty css */
|
|
6
6
|
import _sfc_main$2 from "../../../../components/Popup/Popup.vue.js";
|
|
7
7
|
import _sfc_main$1 from "../../../globals/views/components/sections/SectionPageTitle.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../sections/MembersAdd.vue.js";
|
|
@@ -6,7 +6,7 @@ const mixins = require("../../../../globals/views/mixins/mixins.cjs");
|
|
|
6
6
|
const pages = require("../../store/pages.cjs");
|
|
7
7
|
const Button = require("../../../../../components/Button/Button.vue.cjs");
|
|
8
8
|
;/* empty css */
|
|
9
|
-
;/* empty css
|
|
9
|
+
;/* empty css */
|
|
10
10
|
const Constructor = require("../../../../constructor/components/sections/Constructor.vue.cjs");
|
|
11
11
|
const _hoisted_1 = { key: 0 };
|
|
12
12
|
const _hoisted_2 = {
|
|
@@ -4,7 +4,7 @@ import { useGlobalMixins } from "../../../../globals/views/mixins/mixins.js";
|
|
|
4
4
|
import { actions, state } from "../../store/pages.js";
|
|
5
5
|
import _sfc_main$2 from "../../../../../components/Button/Button.vue.js";
|
|
6
6
|
/* empty css */
|
|
7
|
-
/* empty css
|
|
7
|
+
/* empty css */
|
|
8
8
|
import _sfc_main$1 from "../../../../constructor/components/sections/Constructor.vue.js";
|
|
9
9
|
const _hoisted_1 = { key: 0 };
|
|
10
10
|
const _hoisted_2 = {
|