@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.
Files changed (37) hide show
  1. package/dist/builder.js +2 -12
  2. package/dist/builder.mjs +2 -12
  3. package/dist/martyrs/src/components/Block/Block.vue.cjs +1 -1
  4. package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
  5. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs +87 -5
  6. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs.map +1 -1
  7. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +88 -6
  8. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
  9. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs → Tooltip.vue2.cjs} +2 -2
  10. package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.cjs.map +1 -0
  11. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
  12. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs.map → Tooltip.vue2.js.map} +1 -1
  13. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  14. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  15. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs +1 -1
  16. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +1 -1
  17. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  18. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  19. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  20. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  21. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs +52 -14
  22. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js +53 -15
  24. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js.map +1 -1
  25. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +37 -65
  26. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  27. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +38 -66
  28. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  29. package/dist/style.css +39 -61
  30. package/package.json +1 -1
  31. package/src/builder/modes/spa.dev.js +3 -1
  32. package/src/builder/modes/spa.prod.js +1 -1
  33. package/src/builder/modes/ssr.dev.js +10 -10
  34. package/src/components/PhotoViewer/PhotoViewer.vue +140 -12
  35. package/src/modules/products/components/blocks/ImagesThumbnails.vue +46 -37
  36. package/src/modules/products/components/pages/Product.vue +5 -28
  37. 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 } = require(createServerPath);
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 } = require(createServerPath);
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 } = require(createServerPath);
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 } = require(createServerPath);
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.vue.cjs");
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.vue.js";
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
- scale.value = Math.min(Math.max(1, scale.value + delta), 3);
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
- position.x += (currentX - startPosition.x) / scale.value;
37
- position.y += (currentY - startPosition.y) / scale.value;
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
- scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
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
- ref: "image",
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
- scale.value = Math.min(Math.max(1, scale.value + delta), 3);
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
- position.x += (currentX - startPosition.x) / scale.value;
35
- position.y += (currentY - startPosition.y) / scale.value;
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
- scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
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
- ref: "image",
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.vue.cjs.map
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.vue.js.map
52
+ //# sourceMappingURL=Tooltip.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.vue.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
+ {"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.vue.cjs");
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.vue.js";
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.vue.cjs");
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.vue.js";
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 = {