@ozdao/martyrs 0.2.425 → 0.2.427

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 (116) hide show
  1. package/dist/martyrs/src/components/Chips/{Chips.vue.cjs → Chips.vue2.cjs} +2 -2
  2. package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +1 -0
  3. package/dist/martyrs/src/components/Chips/{Chips.vue.js → Chips.vue2.js} +2 -2
  4. package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +1 -0
  5. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs → Dropdown.vue2.cjs} +2 -2
  6. package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +1 -0
  7. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.js → Dropdown.vue2.js} +2 -2
  8. package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs.map → Dropdown.vue2.js.map} +1 -1
  9. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
  10. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  11. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs +87 -5
  12. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs.map +1 -1
  13. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +88 -6
  14. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
  15. package/dist/martyrs/src/components/Popup/{Popup.vue2.cjs → Popup.vue.cjs} +2 -2
  16. package/dist/martyrs/src/components/Popup/{Popup.vue2.js.map → Popup.vue.cjs.map} +1 -1
  17. package/dist/martyrs/src/components/Popup/{Popup.vue2.js → Popup.vue.js} +2 -2
  18. package/dist/martyrs/src/components/Popup/Popup.vue.js.map +1 -0
  19. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.cjs → SelectMulti.vue2.cjs} +2 -2
  20. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.cjs.map +1 -0
  21. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.js → SelectMulti.vue2.js} +2 -2
  22. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.cjs.map → SelectMulti.vue2.js.map} +1 -1
  23. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +1 -1
  24. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
  25. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +1 -1
  26. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +1 -1
  27. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
  28. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
  29. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +2 -2
  30. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
  31. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
  32. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  33. package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.cjs +1 -1
  34. package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.js +1 -1
  35. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
  36. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
  37. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  38. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  39. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  40. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  41. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  42. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  43. package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
  45. package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.cjs +1 -1
  46. package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js +1 -1
  47. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
  48. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
  49. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
  50. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
  51. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  52. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  53. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
  55. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +1 -1
  56. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +1 -1
  57. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  58. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  59. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
  60. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  61. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +2 -2
  62. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
  63. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
  65. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  67. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  68. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  69. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  70. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  71. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
  72. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  73. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +2 -2
  74. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +2 -2
  75. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  77. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +1 -1
  78. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  79. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.cjs +1 -1
  80. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +1 -1
  81. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs +53 -15
  82. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs.map +1 -1
  83. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js +54 -16
  84. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js.map +1 -1
  85. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  86. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  87. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  88. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  89. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.cjs +2 -2
  90. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.js +2 -2
  91. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +38 -66
  92. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  93. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +39 -67
  94. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  95. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  96. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  97. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +2 -2
  98. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +2 -2
  99. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
  100. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
  101. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +1 -1
  102. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +1 -1
  103. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  105. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  106. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  107. package/dist/style.css +39 -61
  108. package/package.json +1 -1
  109. package/src/components/PhotoViewer/PhotoViewer.vue +140 -12
  110. package/src/modules/products/components/blocks/ImagesThumbnails.vue +48 -37
  111. package/src/modules/products/components/pages/Product.vue +5 -29
  112. package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +0 -1
  113. package/dist/martyrs/src/components/Chips/Chips.vue.js.map +0 -1
  114. package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +0 -1
  115. package/dist/martyrs/src/components/Popup/Popup.vue2.cjs.map +0 -1
  116. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +0 -1
@@ -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 _hoisted_1 = { class: "font-main" };
6
6
  const _hoisted_2 = { class: "t-truncate" };
7
7
  const _hoisted_3 = {
@@ -30,4 +30,4 @@ const _sfc_main = {
30
30
  }
31
31
  };
32
32
  exports.default = _sfc_main;
33
- //# sourceMappingURL=Chips.vue.cjs.map
33
+ //# sourceMappingURL=Chips.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chips.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock, openBlock, renderSlot, Fragment, renderList, normalizeClass, createElementVNode, toDisplayString } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  const _hoisted_1 = { class: "font-main" };
4
4
  const _hoisted_2 = { class: "t-truncate" };
5
5
  const _hoisted_3 = {
@@ -30,4 +30,4 @@ const _sfc_main = {
30
30
  export {
31
31
  _sfc_main as default
32
32
  };
33
- //# sourceMappingURL=Chips.vue.js.map
33
+ //# sourceMappingURL=Chips.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chips.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -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 clickOutside = require("../FieldPhone/click-outside.cjs");
5
- ;/* empty css */
5
+ ;/* empty css */
6
6
  const _hoisted_1 = {
7
7
  key: 0,
8
8
  class: "w-100 h-100 flex-center flex"
@@ -61,4 +61,4 @@ const _sfc_main = {
61
61
  }
62
62
  };
63
63
  exports.default = _sfc_main;
64
- //# sourceMappingURL=Dropdown.vue.cjs.map
64
+ //# sourceMappingURL=Dropdown.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dropdown.vue2.cjs","sources":["../../../../../src/components/Dropdown/Dropdown.vue"],"sourcesContent":["<template>\n <div class=\"dropdown pos-relative\" v-click-outside=\"clickedOutside\" @click.stop=\"isOpen = !isOpen\">\n <div v-if=\"isComponentLabel\" class=\"w-100 h-100 flex-center flex\">\n <component :is=\"label.component\" v-bind=\"label.props\" :class=\"label.class\"></component>\n </div>\n <div v-else>\n {{ label }}\n </div>\n <transition name=\"TransitionTranslateY\" mode=\"out-in\">\n <div \n v-show=\"isOpen\" \n :style=\"{ left: align === 'left' ? '0' : 'auto', right: align === 'right' ? '0' : 'auto' }\" \n class=\"dropdown-content radius-big\" \n >\n <slot></slot>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed } from 'vue';\nimport clickOutside from '../FieldPhone/click-outside';\n\nlet vClickOutside = clickOutside\n\nconst props = defineProps({\n label: {\n type: [String, Object],\n default: 'Open'\n },\n align: {\n type: String,\n default: 'left'\n }\n})\n\nconst isOpen = ref(false);\nconst isComponentLabel = computed(() => typeof props.label === 'object');\n\nfunction clickedOutside () {\n isOpen.value = false\n}\n</script>\n\n<style >\n.dropdown-content {\n display: block;\n position: absolute;\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n z-index: 1;\n}\n\n/*.dropdown:hover .dropdown-content {\n display: block;\n}*/\n</style>\n"],"names":["clickOutside","ref","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBA,QAAI,gBAAgBA,aAAAA;AAEpB,UAAM,QAAQ;AAWd,UAAM,SAASC,IAAG,IAAC,KAAK;AACxB,UAAM,mBAAmBC,IAAAA,SAAS,MAAM,OAAO,MAAM,UAAU,QAAQ;AAEvE,aAAS,iBAAkB;AACzB,aAAO,QAAQ;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { ref, computed, withDirectives, createElementBlock, openBlock, withModifiers, createVNode, createBlock, resolveDynamicComponent, mergeProps, toDisplayString, Transition, withCtx, createElementVNode, normalizeStyle, renderSlot, vShow, unref } from "vue";
2
2
  import clickOutside from "../FieldPhone/click-outside.js";
3
- /* empty css */
3
+ /* empty css */
4
4
  const _hoisted_1 = {
5
5
  key: 0,
6
6
  class: "w-100 h-100 flex-center flex"
@@ -61,4 +61,4 @@ const _sfc_main = {
61
61
  export {
62
62
  _sfc_main as default
63
63
  };
64
- //# sourceMappingURL=Dropdown.vue.js.map
64
+ //# sourceMappingURL=Dropdown.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.vue.cjs","sources":["../../../../../src/components/Dropdown/Dropdown.vue"],"sourcesContent":["<template>\n <div class=\"dropdown pos-relative\" v-click-outside=\"clickedOutside\" @click.stop=\"isOpen = !isOpen\">\n <div v-if=\"isComponentLabel\" class=\"w-100 h-100 flex-center flex\">\n <component :is=\"label.component\" v-bind=\"label.props\" :class=\"label.class\"></component>\n </div>\n <div v-else>\n {{ label }}\n </div>\n <transition name=\"TransitionTranslateY\" mode=\"out-in\">\n <div \n v-show=\"isOpen\" \n :style=\"{ left: align === 'left' ? '0' : 'auto', right: align === 'right' ? '0' : 'auto' }\" \n class=\"dropdown-content radius-big\" \n >\n <slot></slot>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed } from 'vue';\nimport clickOutside from '../FieldPhone/click-outside';\n\nlet vClickOutside = clickOutside\n\nconst props = defineProps({\n label: {\n type: [String, Object],\n default: 'Open'\n },\n align: {\n type: String,\n default: 'left'\n }\n})\n\nconst isOpen = ref(false);\nconst isComponentLabel = computed(() => typeof props.label === 'object');\n\nfunction clickedOutside () {\n isOpen.value = false\n}\n</script>\n\n<style >\n.dropdown-content {\n display: block;\n position: absolute;\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n z-index: 1;\n}\n\n/*.dropdown:hover .dropdown-content {\n display: block;\n}*/\n</style>\n"],"names":["clickOutside","ref","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBA,QAAI,gBAAgBA,aAAAA;AAEpB,UAAM,QAAQ;AAWd,UAAM,SAASC,IAAG,IAAC,KAAK;AACxB,UAAM,mBAAmBC,IAAAA,SAAS,MAAM,OAAO,MAAM,UAAU,QAAQ;AAEvE,aAAS,iBAAkB;AACzB,aAAO,QAAQ;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Dropdown.vue2.js","sources":["../../../../../src/components/Dropdown/Dropdown.vue"],"sourcesContent":["<template>\n <div class=\"dropdown pos-relative\" v-click-outside=\"clickedOutside\" @click.stop=\"isOpen = !isOpen\">\n <div v-if=\"isComponentLabel\" class=\"w-100 h-100 flex-center flex\">\n <component :is=\"label.component\" v-bind=\"label.props\" :class=\"label.class\"></component>\n </div>\n <div v-else>\n {{ label }}\n </div>\n <transition name=\"TransitionTranslateY\" mode=\"out-in\">\n <div \n v-show=\"isOpen\" \n :style=\"{ left: align === 'left' ? '0' : 'auto', right: align === 'right' ? '0' : 'auto' }\" \n class=\"dropdown-content radius-big\" \n >\n <slot></slot>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed } from 'vue';\nimport clickOutside from '../FieldPhone/click-outside';\n\nlet vClickOutside = clickOutside\n\nconst props = defineProps({\n label: {\n type: [String, Object],\n default: 'Open'\n },\n align: {\n type: String,\n default: 'left'\n }\n})\n\nconst isOpen = ref(false);\nconst isComponentLabel = computed(() => typeof props.label === 'object');\n\nfunction clickedOutside () {\n isOpen.value = false\n}\n</script>\n\n<style >\n.dropdown-content {\n display: block;\n position: absolute;\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n z-index: 1;\n}\n\n/*.dropdown:hover .dropdown-content {\n display: block;\n}*/\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,QAAI,gBAAgB;AAEpB,UAAM,QAAQ;AAWd,UAAM,SAAS,IAAI,KAAK;AACxB,UAAM,mBAAmB,SAAS,MAAM,OAAO,MAAM,UAAU,QAAQ;AAEvE,aAAS,iBAAkB;AACzB,aAAO,QAAQ;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -4,7 +4,7 @@ const vue = require("vue");
4
4
  const Loader = require("../Loader/Loader.vue2.cjs");
5
5
  const Skeleton = require("../Skeleton/Skeleton.vue.cjs");
6
6
  const EmptyState = require("../EmptyState/EmptyState.vue.cjs");
7
- const Dropdown = require("../Dropdown/Dropdown.vue.cjs");
7
+ const Dropdown = require("../Dropdown/Dropdown.vue2.cjs");
8
8
  const Calendar = require("../DatePicker/Calendar.vue.cjs");
9
9
  const BottomSheet = require("../BottomSheet/BottomSheet.vue.cjs");
10
10
  const BlockSearch = require("../../modules/globals/views/components/blocks/BlockSearch.vue.cjs");
@@ -2,7 +2,7 @@ import { mergeModels, useModel, shallowRef, ref, watch, onMounted, onUnmounted,
2
2
  import Loader from "../Loader/Loader.vue2.js";
3
3
  import Skeleton from "../Skeleton/Skeleton.vue.js";
4
4
  import _sfc_main$9 from "../EmptyState/EmptyState.vue.js";
5
- import _sfc_main$5 from "../Dropdown/Dropdown.vue.js";
5
+ import _sfc_main$5 from "../Dropdown/Dropdown.vue2.js";
6
6
  import Calendar from "../DatePicker/Calendar.vue.js";
7
7
  import _sfc_main$3 from "../BottomSheet/BottomSheet.vue.js";
8
8
  import _sfc_main$1 from "../../modules/globals/views/components/blocks/BlockSearch.vue.js";
@@ -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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"}
@@ -4,7 +4,7 @@ const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const vueI18n = require("vue-i18n");
6
6
  const IconCross = require("../../modules/icons/navigation/IconCross.vue.cjs");
7
- ;/* empty css */
7
+ ;/* empty css */
8
8
  const _hoisted_1 = {
9
9
  key: 0,
10
10
  class: "mn-b-small"
@@ -87,4 +87,4 @@ const _sfc_main = {
87
87
  }
88
88
  };
89
89
  exports.default = _sfc_main;
90
- //# sourceMappingURL=Popup.vue2.cjs.map
90
+ //# sourceMappingURL=Popup.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popup.vue2.js","sources":["../../../../../src/components/Popup/Popup.vue"],"sourcesContent":["<template>\n\t\t<transition name=\"moveFromTop\">\n\t\t\t<teleport to=\"body\" v-if=\"isPopupOpen\">\n\t\t\t\t<div v-if=\"isPopupOpen\" key=\"popup-content\" class=\"pd-small z-index-6 popup-wrapper\"\n\t\t\t\t\t:class=\"{\n \t\t\t\t\t'pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t\t}\"\n\t\t\t\t>\n\n\t\t\t\t\t<transition name=\"TransitionTranslateY\" mode=\"out-in\">\n\t\t\t\t\t\t<section class=\"h-max-100 o-y-scroll pos-relative z-index-4\" v-bind=\"$attrs\" :class=\"$attrs.class\">\n\t\t\t\t\t\t\t\t<h4 v-if=\"title\" class=\"mn-b-small\">{{title}}</h4>\n\t\t\t\t\t\t\t\t<IconCross :fill=\"'rgb(var(--white))'\" @click=\"closePopup()\" class=\"cursor-pointer bg-second pd-micro radius-extra pos-absolute pos-t-0 pos-r-0 mn-t-semi mn-r-semi hover-scale-1 i-medium z-index-5\"/>\n\t\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</section> \n\t\t\t\t\t</transition>\n\n\t\t\t\t\t<div \n\t\t\t\t\t\t@click=\"closePopup()\" \n\t\t\t\t :class=\"{'active':isPopupOpen === true}\" \n\t\t\t\t class=\"color-overlay z-index-3\">\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t</teleport>\n\t</transition>\n</template>\n\n<script setup>\nimport { computed, watch, onMounted, ref, nextTick } from 'vue';\n// Import libs\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\n// Icons\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n// Define props\nconst props = defineProps({\n isPopupOpen: {\n \ttype: Boolean,\n\t default: false\n },\n style: String,\n title: String,\n});\nconst emits = defineEmits(['close-popup'])\n\nfunction closePopup() {\n emits(\"close-popup\");\n} \n\nwatch(() => props.isPopupOpen, (newVal) => {\n if (newVal) {\n document.body.classList.add('no-scroll');\n } else {\n document.body.classList.remove('no-scroll');\n }\n});\n\n// Accessing router and store\nconst route = useRoute()\nconst router = useRouter()\n// Localization\nconst text = {\n \tmessages: {\n\t en: {},\n\t ru: {}\n\t}\n}\nconst { t } = useI18n(text)\n</script>\n\n<style lang=\"scss\">\n\t.no-scroll {\n\t overflow: hidden;\n\t}\n\n\t.popup-wrapper {\n\t\tdisplay: flex;\n\t\tposition: fixed;\n\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\tz-index: 40;\n\n\t\t.popup {\n\t\t\tposition: absolute;\n\t\t\theight: auto;\n\t\t\tpadding: 2rem;\n\t\t\tmin-width: 24rem;\n\t\t\tborder-radius: 2rem;\n\t\t\toverflow: hidden;\n\n\t\t\tcolor: white;\n\t\t\tbackground: black;\n\n\t\t\tz-index: 40;\n\t\t}\n\t}\n\n\t.color-overlay {\n\t\tdisplay: block;\n\t\tposition: fixed;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tbackground: rgba(0,0,0,0.0);\n\t\tpointer-events: none;\n\n\t\ttransform: scale(1.5);\n\n\t\ttransition: all 0.5s cubic-bezier(.31,.79,.24,.92);\n\n\t\t&.active {\n\t\t\tbackground: rgba(#000,0.25);\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,QAAQ;AAQd,UAAM,QAAQ;AAEd,aAAS,aAAa;AACpB,YAAM,aAAa;AAAA,IACrB;AAEA,UAAM,MAAM,MAAM,aAAa,CAAC,WAAW;AACzC,UAAI,QAAQ;AACV,iBAAS,KAAK,UAAU,IAAI,WAAW;AAAA,MAC3C,OAAS;AACL,iBAAS,KAAK,UAAU,OAAO,WAAW;AAAA,MAC9C;AAAA,IACA,CAAC;AAGa,aAAQ;AACP,cAAS;AAExB,UAAM,OAAO;AAAA,MACV,UAAU;AAAA,QACR,IAAI,CAAE;AAAA,QACN,IAAI,CAAA;AAAA,MACT;AAAA,IACA;AACA,UAAM,EAAE,EAAC,IAAK,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Popup.vue.cjs","sources":["../../../../../src/components/Popup/Popup.vue"],"sourcesContent":["<template>\n\t\t<transition name=\"moveFromTop\">\n\t\t\t<teleport to=\"body\" v-if=\"isPopupOpen\">\n\t\t\t\t<div v-if=\"isPopupOpen\" key=\"popup-content\" class=\"pd-small z-index-6 popup-wrapper\"\n\t\t\t\t\t:class=\"{\n \t\t\t\t\t'pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t\t}\"\n\t\t\t\t>\n\n\t\t\t\t\t<transition name=\"TransitionTranslateY\" mode=\"out-in\">\n\t\t\t\t\t\t<section class=\"h-max-100 o-y-scroll pos-relative z-index-4\" v-bind=\"$attrs\" :class=\"$attrs.class\">\n\t\t\t\t\t\t\t\t<h4 v-if=\"title\" class=\"mn-b-small\">{{title}}</h4>\n\t\t\t\t\t\t\t\t<IconCross :fill=\"'rgb(var(--white))'\" @click=\"closePopup()\" class=\"cursor-pointer bg-second pd-micro radius-extra pos-absolute pos-t-0 pos-r-0 mn-t-semi mn-r-semi hover-scale-1 i-medium z-index-5\"/>\n\t\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</section> \n\t\t\t\t\t</transition>\n\n\t\t\t\t\t<div \n\t\t\t\t\t\t@click=\"closePopup()\" \n\t\t\t\t :class=\"{'active':isPopupOpen === true}\" \n\t\t\t\t class=\"color-overlay z-index-3\">\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t</teleport>\n\t</transition>\n</template>\n\n<script setup>\nimport { computed, watch, onMounted, ref, nextTick } from 'vue';\n// Import libs\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\n// Icons\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n// Define props\nconst props = defineProps({\n isPopupOpen: {\n \ttype: Boolean,\n\t default: false\n },\n style: String,\n title: String,\n});\nconst emits = defineEmits(['close-popup'])\n\nfunction closePopup() {\n emits(\"close-popup\");\n} \n\nwatch(() => props.isPopupOpen, (newVal) => {\n if (newVal) {\n document.body.classList.add('no-scroll');\n } else {\n document.body.classList.remove('no-scroll');\n }\n});\n\n// Accessing router and store\nconst route = useRoute()\nconst router = useRouter()\n// Localization\nconst text = {\n \tmessages: {\n\t en: {},\n\t ru: {}\n\t}\n}\nconst { t } = useI18n(text)\n</script>\n\n<style lang=\"scss\">\n\t.no-scroll {\n\t overflow: hidden;\n\t}\n\n\t.popup-wrapper {\n\t\tdisplay: flex;\n\t\tposition: fixed;\n\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\tz-index: 40;\n\n\t\t.popup {\n\t\t\tposition: absolute;\n\t\t\theight: auto;\n\t\t\tpadding: 2rem;\n\t\t\tmin-width: 24rem;\n\t\t\tborder-radius: 2rem;\n\t\t\toverflow: hidden;\n\n\t\t\tcolor: white;\n\t\t\tbackground: black;\n\n\t\t\tz-index: 40;\n\t\t}\n\t}\n\n\t.color-overlay {\n\t\tdisplay: block;\n\t\tposition: fixed;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tbackground: rgba(0,0,0,0.0);\n\t\tpointer-events: none;\n\n\t\ttransform: scale(1.5);\n\n\t\ttransition: all 0.5s cubic-bezier(.31,.79,.24,.92);\n\n\t\t&.active {\n\t\t\tbackground: rgba(#000,0.25);\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n</style>\n"],"names":["watch","useRoute","useRouter","useI18n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,QAAQ;AAQd,UAAM,QAAQ;AAEd,aAAS,aAAa;AACpB,YAAM,aAAa;AAAA,IACrB;AAEAA,QAAK,MAAC,MAAM,MAAM,aAAa,CAAC,WAAW;AACzC,UAAI,QAAQ;AACV,iBAAS,KAAK,UAAU,IAAI,WAAW;AAAA,MAC3C,OAAS;AACL,iBAAS,KAAK,UAAU,OAAO,WAAW;AAAA,MAC9C;AAAA,IACA,CAAC;AAGaC,cAAQ,SAAA;AACPC,cAAS,UAAA;AAExB,UAAM,OAAO;AAAA,MACV,UAAU;AAAA,QACR,IAAI,CAAE;AAAA,QACN,IAAI,CAAA;AAAA,MACT;AAAA,IACA;AACA,UAAM,EAAE,EAAC,IAAKC,QAAAA,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@ import { watch, createBlock, openBlock, Transition, withCtx, createCommentVNode,
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import { useI18n } from "vue-i18n";
4
4
  import _sfc_main$1 from "../../modules/icons/navigation/IconCross.vue.js";
5
- /* empty css */
5
+ /* empty css */
6
6
  const _hoisted_1 = {
7
7
  key: 0,
8
8
  class: "mn-b-small"
@@ -87,4 +87,4 @@ const _sfc_main = {
87
87
  export {
88
88
  _sfc_main as default
89
89
  };
90
- //# sourceMappingURL=Popup.vue2.js.map
90
+ //# sourceMappingURL=Popup.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popup.vue.js","sources":["../../../../../src/components/Popup/Popup.vue"],"sourcesContent":["<template>\n\t\t<transition name=\"moveFromTop\">\n\t\t\t<teleport to=\"body\" v-if=\"isPopupOpen\">\n\t\t\t\t<div v-if=\"isPopupOpen\" key=\"popup-content\" class=\"pd-small z-index-6 popup-wrapper\"\n\t\t\t\t\t:class=\"{\n \t\t\t\t\t'pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t\t}\"\n\t\t\t\t>\n\n\t\t\t\t\t<transition name=\"TransitionTranslateY\" mode=\"out-in\">\n\t\t\t\t\t\t<section class=\"h-max-100 o-y-scroll pos-relative z-index-4\" v-bind=\"$attrs\" :class=\"$attrs.class\">\n\t\t\t\t\t\t\t\t<h4 v-if=\"title\" class=\"mn-b-small\">{{title}}</h4>\n\t\t\t\t\t\t\t\t<IconCross :fill=\"'rgb(var(--white))'\" @click=\"closePopup()\" class=\"cursor-pointer bg-second pd-micro radius-extra pos-absolute pos-t-0 pos-r-0 mn-t-semi mn-r-semi hover-scale-1 i-medium z-index-5\"/>\n\t\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</section> \n\t\t\t\t\t</transition>\n\n\t\t\t\t\t<div \n\t\t\t\t\t\t@click=\"closePopup()\" \n\t\t\t\t :class=\"{'active':isPopupOpen === true}\" \n\t\t\t\t class=\"color-overlay z-index-3\">\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t</teleport>\n\t</transition>\n</template>\n\n<script setup>\nimport { computed, watch, onMounted, ref, nextTick } from 'vue';\n// Import libs\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\n// Icons\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n// Define props\nconst props = defineProps({\n isPopupOpen: {\n \ttype: Boolean,\n\t default: false\n },\n style: String,\n title: String,\n});\nconst emits = defineEmits(['close-popup'])\n\nfunction closePopup() {\n emits(\"close-popup\");\n} \n\nwatch(() => props.isPopupOpen, (newVal) => {\n if (newVal) {\n document.body.classList.add('no-scroll');\n } else {\n document.body.classList.remove('no-scroll');\n }\n});\n\n// Accessing router and store\nconst route = useRoute()\nconst router = useRouter()\n// Localization\nconst text = {\n \tmessages: {\n\t en: {},\n\t ru: {}\n\t}\n}\nconst { t } = useI18n(text)\n</script>\n\n<style lang=\"scss\">\n\t.no-scroll {\n\t overflow: hidden;\n\t}\n\n\t.popup-wrapper {\n\t\tdisplay: flex;\n\t\tposition: fixed;\n\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\tz-index: 40;\n\n\t\t.popup {\n\t\t\tposition: absolute;\n\t\t\theight: auto;\n\t\t\tpadding: 2rem;\n\t\t\tmin-width: 24rem;\n\t\t\tborder-radius: 2rem;\n\t\t\toverflow: hidden;\n\n\t\t\tcolor: white;\n\t\t\tbackground: black;\n\n\t\t\tz-index: 40;\n\t\t}\n\t}\n\n\t.color-overlay {\n\t\tdisplay: block;\n\t\tposition: fixed;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tbackground: rgba(0,0,0,0.0);\n\t\tpointer-events: none;\n\n\t\ttransform: scale(1.5);\n\n\t\ttransition: all 0.5s cubic-bezier(.31,.79,.24,.92);\n\n\t\t&.active {\n\t\t\tbackground: rgba(#000,0.25);\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,QAAQ;AAQd,UAAM,QAAQ;AAEd,aAAS,aAAa;AACpB,YAAM,aAAa;AAAA,IACrB;AAEA,UAAM,MAAM,MAAM,aAAa,CAAC,WAAW;AACzC,UAAI,QAAQ;AACV,iBAAS,KAAK,UAAU,IAAI,WAAW;AAAA,MAC3C,OAAS;AACL,iBAAS,KAAK,UAAU,OAAO,WAAW;AAAA,MAC9C;AAAA,IACA,CAAC;AAGa,aAAQ;AACP,cAAS;AAExB,UAAM,OAAO;AAAA,MACV,UAAU;AAAA,QACR,IAAI,CAAE;AAAA,QACN,IAAI,CAAA;AAAA,MACT;AAAA,IACA;AACA,UAAM,EAAE,EAAC,IAAK,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const multiselectMixin = require("./multiselectMixin.cjs");
4
4
  const pointerMixin = require("./pointerMixin.cjs");
5
5
  const vue = require("vue");
6
- ;/* empty css */
6
+ ;/* empty css */
7
7
  const _pluginVue_exportHelper = require("../../../../_virtual/_plugin-vue_export-helper.cjs");
8
8
  const _sfc_main = {
9
9
  name: "vue-multiselect",
@@ -447,4 +447,4 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
447
447
  }
448
448
  const SelectMulti = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["render", _sfc_render]]);
449
449
  exports.default = SelectMulti;
450
- //# sourceMappingURL=SelectMulti.vue.cjs.map
450
+ //# sourceMappingURL=SelectMulti.vue2.cjs.map