@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.
- package/dist/martyrs/src/components/Chips/{Chips.vue.cjs → Chips.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Chips/{Chips.vue.js → Chips.vue2.js} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs → Dropdown.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.js → Dropdown.vue2.js} +2 -2
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs.map → Dropdown.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs +87 -5
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +88 -6
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
- package/dist/martyrs/src/components/Popup/{Popup.vue2.cjs → Popup.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Popup/{Popup.vue2.js.map → Popup.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Popup/{Popup.vue2.js → Popup.vue.js} +2 -2
- package/dist/martyrs/src/components/Popup/Popup.vue.js.map +1 -0
- package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.cjs → SelectMulti.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.js → SelectMulti.vue2.js} +2 -2
- package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.cjs.map → SelectMulti.vue2.js.map} +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +2 -2
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs +53 -15
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js +54 -16
- package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +38 -66
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +39 -67
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/style.css +39 -61
- package/package.json +1 -1
- package/src/components/PhotoViewer/PhotoViewer.vue +140 -12
- package/src/modules/products/components/blocks/ImagesThumbnails.vue +48 -37
- package/src/modules/products/components/pages/Product.vue +5 -29
- package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.js.map +0 -1
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +0 -1
- package/dist/martyrs/src/components/Popup/Popup.vue2.cjs.map +0 -1
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
64
|
+
//# sourceMappingURL=Dropdown.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
57
|
+
const newScale = Math.min(Math.max(1, scale.value + delta), 3);
|
|
58
|
+
const rect = image.value.getBoundingClientRect();
|
|
59
|
+
const mouseX = event.clientX - rect.left - rect.width / 2;
|
|
60
|
+
const mouseY = event.clientY - rect.top - rect.height / 2;
|
|
61
|
+
const scaleChange = newScale / scale.value;
|
|
62
|
+
position.x = position.x - mouseX / scale.value * (scaleChange - 1);
|
|
63
|
+
position.y = position.y - mouseY / scale.value * (scaleChange - 1);
|
|
64
|
+
scale.value = newScale;
|
|
65
|
+
constrainPosition();
|
|
26
66
|
};
|
|
27
67
|
const startDrag = (event) => {
|
|
28
68
|
event.preventDefault();
|
|
69
|
+
if (scale.value <= 1) return;
|
|
29
70
|
dragging.value = true;
|
|
30
71
|
startPosition.x = event.type === "mousedown" ? event.clientX : event.touches[0].clientX;
|
|
31
72
|
startPosition.y = event.type === "mousedown" ? event.clientY : event.touches[0].clientY;
|
|
@@ -33,8 +74,11 @@ const _sfc_main = {
|
|
|
33
74
|
if (dragging.value) {
|
|
34
75
|
const currentX = moveEvent.type === "mousemove" ? moveEvent.clientX : moveEvent.touches[0].clientX;
|
|
35
76
|
const currentY = moveEvent.type === "mousemove" ? moveEvent.clientY : moveEvent.touches[0].clientY;
|
|
36
|
-
|
|
37
|
-
|
|
77
|
+
const deltaX = (currentX - startPosition.x) / scale.value;
|
|
78
|
+
const deltaY = (currentY - startPosition.y) / scale.value;
|
|
79
|
+
position.x += deltaX;
|
|
80
|
+
position.y += deltaY;
|
|
81
|
+
constrainPosition();
|
|
38
82
|
startPosition.x = currentX;
|
|
39
83
|
startPosition.y = currentY;
|
|
40
84
|
}
|
|
@@ -72,7 +116,17 @@ const _sfc_main = {
|
|
|
72
116
|
const distanceY = Math.abs(touch1.clientY - touch2.clientY);
|
|
73
117
|
const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
|
|
74
118
|
const scaleFactor = newDistance / startDistance.value;
|
|
75
|
-
|
|
119
|
+
const centerX = (touch1.clientX + touch2.clientX) / 2;
|
|
120
|
+
const centerY = (touch1.clientY + touch2.clientY) / 2;
|
|
121
|
+
const rect = image.value.getBoundingClientRect();
|
|
122
|
+
const touchCenterX = centerX - rect.left - rect.width / 2;
|
|
123
|
+
const touchCenterY = centerY - rect.top - rect.height / 2;
|
|
124
|
+
const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
|
|
125
|
+
const scaleChange = newScale / scale.value;
|
|
126
|
+
position.x = position.x - touchCenterX / scale.value * (scaleChange - 1);
|
|
127
|
+
position.y = position.y - touchCenterY / scale.value * (scaleChange - 1);
|
|
128
|
+
scale.value = newScale;
|
|
129
|
+
constrainPosition();
|
|
76
130
|
}
|
|
77
131
|
};
|
|
78
132
|
const handleTouchEnd = (event) => {
|
|
@@ -85,6 +139,33 @@ const _sfc_main = {
|
|
|
85
139
|
position.x = 0;
|
|
86
140
|
position.y = 0;
|
|
87
141
|
};
|
|
142
|
+
const constrainPosition = () => {
|
|
143
|
+
if (scale.value <= 1) {
|
|
144
|
+
position.x = 0;
|
|
145
|
+
position.y = 0;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();
|
|
149
|
+
const scaledWidth = renderedWidth * scale.value;
|
|
150
|
+
const scaledHeight = renderedHeight * scale.value;
|
|
151
|
+
const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;
|
|
152
|
+
const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;
|
|
153
|
+
if (horizontalOffset > 0) {
|
|
154
|
+
position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));
|
|
155
|
+
} else {
|
|
156
|
+
position.x = 0;
|
|
157
|
+
}
|
|
158
|
+
if (verticalOffset > 0) {
|
|
159
|
+
position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));
|
|
160
|
+
} else {
|
|
161
|
+
position.y = 0;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
vue.onMounted(() => {
|
|
165
|
+
window.addEventListener("resize", () => {
|
|
166
|
+
constrainPosition();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
88
169
|
return (_ctx, _cache) => {
|
|
89
170
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
90
171
|
class: "photo-container",
|
|
@@ -98,7 +179,8 @@ const _sfc_main = {
|
|
|
98
179
|
loading: "lazy",
|
|
99
180
|
src: __props.photoUrl,
|
|
100
181
|
style: vue.normalizeStyle(imgStyle.value),
|
|
101
|
-
|
|
182
|
+
ref_key: "image",
|
|
183
|
+
ref: image,
|
|
102
184
|
onLoad: initialize
|
|
103
185
|
}, null, 44, _hoisted_1)
|
|
104
186
|
], 32);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhotoViewer.vue.cjs","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, computed } from 'vue';\n\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\n\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\nconst handleWheel = (event) => {\n event.preventDefault();\n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n scale.value = Math.min(Math.max(1, scale.value + delta), 3);\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n position.x += (currentX - startPosition.x) / scale.value;\n position.y += (currentY - startPosition.y) / scale.value;\n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n</script>\n\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.3s;\n}\n</style>\n"],"names":["ref","reactive","computed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhotoViewer.vue.cjs","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n<script setup>\nimport { ref, reactive, computed, onMounted, watch } from 'vue';\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\nconst image = ref(null);\nconst container = ref(null);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\n// Наблюдаем за изменением масштаба, чтобы ограничивать позицию\nwatch(scale, () => {\n constrainPosition();\n});\n\nconst getImageDimensions = () => {\n if (!image.value) return { width: 0, height: 0 };\n \n // Используем естественные размеры изображения\n const imgWidth = image.value.naturalWidth;\n const imgHeight = image.value.naturalHeight;\n \n // Получаем размеры контейнера\n const containerRect = image.value.parentElement?.getBoundingClientRect();\n if (!containerRect) return { width: 0, height: 0 };\n \n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n \n // Определяем, как изображение вписывается в контейнер (с учетом object-fit: scale-down)\n let renderedWidth, renderedHeight;\n \n if (imgWidth > containerWidth || imgHeight > containerHeight) {\n const ratioX = containerWidth / imgWidth;\n const ratioY = containerHeight / imgHeight;\n const ratio = Math.min(ratioX, ratioY);\n \n renderedWidth = imgWidth * ratio;\n renderedHeight = imgHeight * ratio;\n } else {\n renderedWidth = imgWidth;\n renderedHeight = imgHeight;\n }\n \n return {\n renderedWidth,\n renderedHeight,\n containerWidth,\n containerHeight\n };\n};\n\nconst handleWheel = (event) => {\n event.preventDefault();\n \n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n const newScale = Math.min(Math.max(1, scale.value + delta), 3);\n \n // Рассчитываем позицию курсора относительно центра изображения\n const rect = image.value.getBoundingClientRect();\n const mouseX = event.clientX - rect.left - rect.width / 2;\n const mouseY = event.clientY - rect.top - rect.height / 2;\n \n // Сохраняем соотношение позиции курсора к изображению при масштабировании\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию так, чтобы точка под курсором оставалась на месте\n position.x = position.x - (mouseX / scale.value) * (scaleChange - 1);\n position.y = position.y - (mouseY / scale.value) * (scaleChange - 1);\n \n // Обновляем масштаб\n scale.value = newScale;\n \n // Ограничиваем позицию после обновления масштаба\n constrainPosition();\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n if (scale.value <= 1) return; // Не позволяем перетаскивать при масштабе 1\n \n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n \n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n \n const deltaX = (currentX - startPosition.x) / scale.value;\n const deltaY = (currentY - startPosition.y) / scale.value;\n \n position.x += deltaX;\n position.y += deltaY;\n \n // Ограничиваем позицию после перемещения\n constrainPosition();\n \n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n \n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n \n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n \n // Получаем центр между двумя касаниями\n const centerX = (touch1.clientX + touch2.clientX) / 2;\n const centerY = (touch1.clientY + touch2.clientY) / 2;\n \n // Получаем координаты центра касания относительно изображения\n const rect = image.value.getBoundingClientRect();\n const touchCenterX = centerX - rect.left - rect.width / 2;\n const touchCenterY = centerY - rect.top - rect.height / 2;\n \n const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию, чтобы центр касания оставался на месте\n position.x = position.x - (touchCenterX / scale.value) * (scaleChange - 1);\n position.y = position.y - (touchCenterY / scale.value) * (scaleChange - 1);\n \n scale.value = newScale;\n constrainPosition();\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n\nconst constrainPosition = () => {\n // Если масштаб 1, сбрасываем позицию в центр\n if (scale.value <= 1) {\n position.x = 0;\n position.y = 0;\n return;\n }\n \n const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();\n \n // Вычисляем максимальное смещение\n const scaledWidth = renderedWidth * scale.value;\n const scaledHeight = renderedHeight * scale.value;\n \n // Отступ от края изображения до края контейнера при текущем масштабе\n const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;\n const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;\n \n // Ограничиваем смещение, чтобы изображение не выходило за пределы контейнера\n if (horizontalOffset > 0) {\n position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));\n } else {\n position.x = 0;\n }\n \n if (verticalOffset > 0) {\n position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));\n } else {\n position.y = 0;\n }\n};\n\nonMounted(() => {\n window.addEventListener('resize', () => {\n constrainPosition();\n });\n});\n</script>\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.05s;\n transform-origin: center center;\n}\n</style>"],"names":["ref","reactive","computed","watch","onMounted"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ref, reactive, computed, createElementBlock, openBlock, createElementVNode, normalizeStyle } from "vue";
|
|
1
|
+
import { ref, reactive, computed, watch, onMounted, createElementBlock, openBlock, createElementVNode, normalizeStyle } from "vue";
|
|
2
2
|
/* empty css */
|
|
3
3
|
const _hoisted_1 = ["src"];
|
|
4
4
|
const _sfc_main = {
|
|
@@ -14,16 +14,57 @@ const _sfc_main = {
|
|
|
14
14
|
const startPosition = reactive({ x: 0, y: 0 });
|
|
15
15
|
const startScale = ref(1);
|
|
16
16
|
const startDistance = ref(0);
|
|
17
|
+
const image = ref(null);
|
|
18
|
+
ref(null);
|
|
17
19
|
const imgStyle = computed(() => ({
|
|
18
20
|
transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`
|
|
19
21
|
}));
|
|
22
|
+
watch(scale, () => {
|
|
23
|
+
constrainPosition();
|
|
24
|
+
});
|
|
25
|
+
const getImageDimensions = () => {
|
|
26
|
+
var _a;
|
|
27
|
+
if (!image.value) return { width: 0, height: 0 };
|
|
28
|
+
const imgWidth = image.value.naturalWidth;
|
|
29
|
+
const imgHeight = image.value.naturalHeight;
|
|
30
|
+
const containerRect = (_a = image.value.parentElement) == null ? void 0 : _a.getBoundingClientRect();
|
|
31
|
+
if (!containerRect) return { width: 0, height: 0 };
|
|
32
|
+
const containerWidth = containerRect.width;
|
|
33
|
+
const containerHeight = containerRect.height;
|
|
34
|
+
let renderedWidth, renderedHeight;
|
|
35
|
+
if (imgWidth > containerWidth || imgHeight > containerHeight) {
|
|
36
|
+
const ratioX = containerWidth / imgWidth;
|
|
37
|
+
const ratioY = containerHeight / imgHeight;
|
|
38
|
+
const ratio = Math.min(ratioX, ratioY);
|
|
39
|
+
renderedWidth = imgWidth * ratio;
|
|
40
|
+
renderedHeight = imgHeight * ratio;
|
|
41
|
+
} else {
|
|
42
|
+
renderedWidth = imgWidth;
|
|
43
|
+
renderedHeight = imgHeight;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
renderedWidth,
|
|
47
|
+
renderedHeight,
|
|
48
|
+
containerWidth,
|
|
49
|
+
containerHeight
|
|
50
|
+
};
|
|
51
|
+
};
|
|
20
52
|
const handleWheel = (event) => {
|
|
21
53
|
event.preventDefault();
|
|
22
54
|
const delta = event.deltaY > 0 ? -0.1 : 0.1;
|
|
23
|
-
|
|
55
|
+
const newScale = Math.min(Math.max(1, scale.value + delta), 3);
|
|
56
|
+
const rect = image.value.getBoundingClientRect();
|
|
57
|
+
const mouseX = event.clientX - rect.left - rect.width / 2;
|
|
58
|
+
const mouseY = event.clientY - rect.top - rect.height / 2;
|
|
59
|
+
const scaleChange = newScale / scale.value;
|
|
60
|
+
position.x = position.x - mouseX / scale.value * (scaleChange - 1);
|
|
61
|
+
position.y = position.y - mouseY / scale.value * (scaleChange - 1);
|
|
62
|
+
scale.value = newScale;
|
|
63
|
+
constrainPosition();
|
|
24
64
|
};
|
|
25
65
|
const startDrag = (event) => {
|
|
26
66
|
event.preventDefault();
|
|
67
|
+
if (scale.value <= 1) return;
|
|
27
68
|
dragging.value = true;
|
|
28
69
|
startPosition.x = event.type === "mousedown" ? event.clientX : event.touches[0].clientX;
|
|
29
70
|
startPosition.y = event.type === "mousedown" ? event.clientY : event.touches[0].clientY;
|
|
@@ -31,8 +72,11 @@ const _sfc_main = {
|
|
|
31
72
|
if (dragging.value) {
|
|
32
73
|
const currentX = moveEvent.type === "mousemove" ? moveEvent.clientX : moveEvent.touches[0].clientX;
|
|
33
74
|
const currentY = moveEvent.type === "mousemove" ? moveEvent.clientY : moveEvent.touches[0].clientY;
|
|
34
|
-
|
|
35
|
-
|
|
75
|
+
const deltaX = (currentX - startPosition.x) / scale.value;
|
|
76
|
+
const deltaY = (currentY - startPosition.y) / scale.value;
|
|
77
|
+
position.x += deltaX;
|
|
78
|
+
position.y += deltaY;
|
|
79
|
+
constrainPosition();
|
|
36
80
|
startPosition.x = currentX;
|
|
37
81
|
startPosition.y = currentY;
|
|
38
82
|
}
|
|
@@ -70,7 +114,17 @@ const _sfc_main = {
|
|
|
70
114
|
const distanceY = Math.abs(touch1.clientY - touch2.clientY);
|
|
71
115
|
const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
|
|
72
116
|
const scaleFactor = newDistance / startDistance.value;
|
|
73
|
-
|
|
117
|
+
const centerX = (touch1.clientX + touch2.clientX) / 2;
|
|
118
|
+
const centerY = (touch1.clientY + touch2.clientY) / 2;
|
|
119
|
+
const rect = image.value.getBoundingClientRect();
|
|
120
|
+
const touchCenterX = centerX - rect.left - rect.width / 2;
|
|
121
|
+
const touchCenterY = centerY - rect.top - rect.height / 2;
|
|
122
|
+
const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);
|
|
123
|
+
const scaleChange = newScale / scale.value;
|
|
124
|
+
position.x = position.x - touchCenterX / scale.value * (scaleChange - 1);
|
|
125
|
+
position.y = position.y - touchCenterY / scale.value * (scaleChange - 1);
|
|
126
|
+
scale.value = newScale;
|
|
127
|
+
constrainPosition();
|
|
74
128
|
}
|
|
75
129
|
};
|
|
76
130
|
const handleTouchEnd = (event) => {
|
|
@@ -83,6 +137,33 @@ const _sfc_main = {
|
|
|
83
137
|
position.x = 0;
|
|
84
138
|
position.y = 0;
|
|
85
139
|
};
|
|
140
|
+
const constrainPosition = () => {
|
|
141
|
+
if (scale.value <= 1) {
|
|
142
|
+
position.x = 0;
|
|
143
|
+
position.y = 0;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();
|
|
147
|
+
const scaledWidth = renderedWidth * scale.value;
|
|
148
|
+
const scaledHeight = renderedHeight * scale.value;
|
|
149
|
+
const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;
|
|
150
|
+
const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;
|
|
151
|
+
if (horizontalOffset > 0) {
|
|
152
|
+
position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));
|
|
153
|
+
} else {
|
|
154
|
+
position.x = 0;
|
|
155
|
+
}
|
|
156
|
+
if (verticalOffset > 0) {
|
|
157
|
+
position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));
|
|
158
|
+
} else {
|
|
159
|
+
position.y = 0;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
onMounted(() => {
|
|
163
|
+
window.addEventListener("resize", () => {
|
|
164
|
+
constrainPosition();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
86
167
|
return (_ctx, _cache) => {
|
|
87
168
|
return openBlock(), createElementBlock("div", {
|
|
88
169
|
class: "photo-container",
|
|
@@ -96,7 +177,8 @@ const _sfc_main = {
|
|
|
96
177
|
loading: "lazy",
|
|
97
178
|
src: __props.photoUrl,
|
|
98
179
|
style: normalizeStyle(imgStyle.value),
|
|
99
|
-
|
|
180
|
+
ref_key: "image",
|
|
181
|
+
ref: image,
|
|
100
182
|
onLoad: initialize
|
|
101
183
|
}, null, 44, _hoisted_1)
|
|
102
184
|
], 32);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhotoViewer.vue.js","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive, computed } from 'vue';\n\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\n\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\nconst handleWheel = (event) => {\n event.preventDefault();\n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n scale.value = Math.min(Math.max(1, scale.value + delta), 3);\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n position.x += (currentX - startPosition.x) / scale.value;\n position.y += (currentY - startPosition.y) / scale.value;\n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n scale.value = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n</script>\n\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.3s;\n}\n</style>\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhotoViewer.vue.js","sources":["../../../../../src/components/PhotoViewer/PhotoViewer.vue"],"sourcesContent":["<template>\n <div class=\"photo-container\" @wheel=\"handleWheel\" @mousedown=\"startDrag\" @touchstart=\"handleTouchStart\" @touchmove=\"handleTouchMove\" @touchend=\"handleTouchEnd\">\n <img loading=\"lazy\" :src=\"photoUrl\" :style=\"imgStyle\" ref=\"image\" @load=\"initialize\" />\n </div>\n</template>\n<script setup>\nimport { ref, reactive, computed, onMounted, watch } from 'vue';\nconst props = defineProps({\n photoUrl: String,\n show: Boolean,\n});\nconst scale = ref(1);\nconst position = reactive({ x: 0, y: 0 });\nconst dragging = ref(false);\nconst startPosition = reactive({ x: 0, y: 0 });\nconst startScale = ref(1);\nconst startDistance = ref(0);\nconst image = ref(null);\nconst container = ref(null);\n\nconst imgStyle = computed(() => ({\n transform: `scale(${scale.value}) translate(${position.x}px, ${position.y}px)`,\n}));\n\n// Наблюдаем за изменением масштаба, чтобы ограничивать позицию\nwatch(scale, () => {\n constrainPosition();\n});\n\nconst getImageDimensions = () => {\n if (!image.value) return { width: 0, height: 0 };\n \n // Используем естественные размеры изображения\n const imgWidth = image.value.naturalWidth;\n const imgHeight = image.value.naturalHeight;\n \n // Получаем размеры контейнера\n const containerRect = image.value.parentElement?.getBoundingClientRect();\n if (!containerRect) return { width: 0, height: 0 };\n \n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n \n // Определяем, как изображение вписывается в контейнер (с учетом object-fit: scale-down)\n let renderedWidth, renderedHeight;\n \n if (imgWidth > containerWidth || imgHeight > containerHeight) {\n const ratioX = containerWidth / imgWidth;\n const ratioY = containerHeight / imgHeight;\n const ratio = Math.min(ratioX, ratioY);\n \n renderedWidth = imgWidth * ratio;\n renderedHeight = imgHeight * ratio;\n } else {\n renderedWidth = imgWidth;\n renderedHeight = imgHeight;\n }\n \n return {\n renderedWidth,\n renderedHeight,\n containerWidth,\n containerHeight\n };\n};\n\nconst handleWheel = (event) => {\n event.preventDefault();\n \n const delta = event.deltaY > 0 ? -0.1 : 0.1;\n const newScale = Math.min(Math.max(1, scale.value + delta), 3);\n \n // Рассчитываем позицию курсора относительно центра изображения\n const rect = image.value.getBoundingClientRect();\n const mouseX = event.clientX - rect.left - rect.width / 2;\n const mouseY = event.clientY - rect.top - rect.height / 2;\n \n // Сохраняем соотношение позиции курсора к изображению при масштабировании\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию так, чтобы точка под курсором оставалась на месте\n position.x = position.x - (mouseX / scale.value) * (scaleChange - 1);\n position.y = position.y - (mouseY / scale.value) * (scaleChange - 1);\n \n // Обновляем масштаб\n scale.value = newScale;\n \n // Ограничиваем позицию после обновления масштаба\n constrainPosition();\n};\n\nconst startDrag = (event) => {\n event.preventDefault();\n if (scale.value <= 1) return; // Не позволяем перетаскивать при масштабе 1\n \n dragging.value = true;\n startPosition.x = event.type === 'mousedown' ? event.clientX : event.touches[0].clientX;\n startPosition.y = event.type === 'mousedown' ? event.clientY : event.touches[0].clientY;\n \n const move = (moveEvent) => {\n if (dragging.value) {\n const currentX = moveEvent.type === 'mousemove' ? moveEvent.clientX : moveEvent.touches[0].clientX;\n const currentY = moveEvent.type === 'mousemove' ? moveEvent.clientY : moveEvent.touches[0].clientY;\n \n const deltaX = (currentX - startPosition.x) / scale.value;\n const deltaY = (currentY - startPosition.y) / scale.value;\n \n position.x += deltaX;\n position.y += deltaY;\n \n // Ограничиваем позицию после перемещения\n constrainPosition();\n \n startPosition.x = currentX;\n startPosition.y = currentY;\n }\n };\n \n const endDrag = () => {\n dragging.value = false;\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', endDrag);\n document.removeEventListener('touchmove', move);\n document.removeEventListener('touchend', endDrag);\n };\n \n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', endDrag);\n document.addEventListener('touchmove', move);\n document.addEventListener('touchend', endDrag);\n};\n\nconst handleTouchStart = (event) => {\n if (event.touches.length === 2) {\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n startDistance.value = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n startScale.value = scale.value;\n } else {\n startDrag(event);\n }\n};\n\nconst handleTouchMove = (event) => {\n if (event.touches.length === 2) {\n event.preventDefault();\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const distanceX = Math.abs(touch1.clientX - touch2.clientX);\n const distanceY = Math.abs(touch1.clientY - touch2.clientY);\n const newDistance = Math.sqrt(distanceX ** 2 + distanceY ** 2);\n const scaleFactor = newDistance / startDistance.value;\n \n // Получаем центр между двумя касаниями\n const centerX = (touch1.clientX + touch2.clientX) / 2;\n const centerY = (touch1.clientY + touch2.clientY) / 2;\n \n // Получаем координаты центра касания относительно изображения\n const rect = image.value.getBoundingClientRect();\n const touchCenterX = centerX - rect.left - rect.width / 2;\n const touchCenterY = centerY - rect.top - rect.height / 2;\n \n const newScale = Math.min(Math.max(1, startScale.value * scaleFactor), 3);\n const scaleChange = newScale / scale.value;\n \n // Обновляем позицию, чтобы центр касания оставался на месте\n position.x = position.x - (touchCenterX / scale.value) * (scaleChange - 1);\n position.y = position.y - (touchCenterY / scale.value) * (scaleChange - 1);\n \n scale.value = newScale;\n constrainPosition();\n }\n};\n\nconst handleTouchEnd = (event) => {\n if (event.touches.length === 0) {\n startDistance.value = 0;\n }\n};\n\nconst initialize = () => {\n scale.value = 1;\n position.x = 0;\n position.y = 0;\n};\n\nconst constrainPosition = () => {\n // Если масштаб 1, сбрасываем позицию в центр\n if (scale.value <= 1) {\n position.x = 0;\n position.y = 0;\n return;\n }\n \n const { renderedWidth, renderedHeight, containerWidth, containerHeight } = getImageDimensions();\n \n // Вычисляем максимальное смещение\n const scaledWidth = renderedWidth * scale.value;\n const scaledHeight = renderedHeight * scale.value;\n \n // Отступ от края изображения до края контейнера при текущем масштабе\n const horizontalOffset = (scaledWidth - containerWidth) / 2 / scale.value;\n const verticalOffset = (scaledHeight - containerHeight) / 2 / scale.value;\n \n // Ограничиваем смещение, чтобы изображение не выходило за пределы контейнера\n if (horizontalOffset > 0) {\n position.x = Math.max(-horizontalOffset, Math.min(horizontalOffset, position.x));\n } else {\n position.x = 0;\n }\n \n if (verticalOffset > 0) {\n position.y = Math.max(-verticalOffset, Math.min(verticalOffset, position.y));\n } else {\n position.y = 0;\n }\n};\n\nonMounted(() => {\n window.addEventListener('resize', () => {\n constrainPosition();\n });\n});\n</script>\n<style>\n.photo-container {\n width: 100%;\n height: 100%;\n background: black;\n overflow: hidden;\n position: relative;\n cursor: grab;\n}\n.photo-container img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n transition: transform 0.05s;\n transform-origin: center center;\n}\n</style>"],"names":[],"mappings":"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"}
|
|
@@ -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.
|
|
90
|
+
//# sourceMappingURL=Popup.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popup.
|
|
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.
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue.cjs → SelectMulti.vue2.cjs}
RENAMED
|
@@ -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.
|
|
450
|
+
//# sourceMappingURL=SelectMulti.vue2.cjs.map
|