{"version":3,"file":"js/imageZoom.b9245da7ee1c125d9dcd.js","mappings":"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","sources":["webpack://netzkern.am/./src/Feature/Lightbox/Code/Scripts/Lightbox/lightbox.js","webpack://netzkern.am/./src/Foundation/Common/code/Frontend/General/global-js/randomNumber.js","webpack://netzkern.am/./node_modules/zoomist/src/js/shared/constants.js","webpack://netzkern.am/./node_modules/zoomist/src/js/core/options.js","webpack://netzkern.am/./node_modules/zoomist/src/js/shared/utils.js","webpack://netzkern.am/./node_modules/zoomist/src/js/core/methods.js","webpack://netzkern.am/./node_modules/zoomist/src/js/core/events.js","webpack://netzkern.am/./node_modules/zoomist/src/js/core/template.js","webpack://netzkern.am/./node_modules/zoomist/src/js/core/modules.js","webpack://netzkern.am/./node_modules/zoomist/src/js/zoomist.js","webpack://netzkern.am/./node_modules/zoomist/src/index.js","webpack://netzkern.am/./src/Foundation/ImageZoom/code/Scripts/imageZoom.js"],"sourcesContent":["import '../../Lightbox/Styles/_lightbox.scss'\r\n\r\nconst Lightbox = new function () {\r\n const that = this;\r\n const tabletWidth = 768;\r\n const desktopWidth = 1024;\r\n\r\n that.init = function () {\r\n that.setLightboxContentContainerToBody();\r\n const aTags = document.querySelectorAll('a[target=\"_lightbox\"], img[target=\"_lightbox\"]');\r\n\r\n if (aTags == null) {\r\n return;\r\n }\r\n\r\n aTags.forEach(function (item) {\r\n let lightboxId = item.getAttribute('data-lightbox-id');\r\n\r\n if (!lightboxId) {\r\n return;\r\n }\r\n\r\n let lightBoxDiv = document.querySelector('.lightbox-overlay-container[data-id=\"' + lightboxId + '\"]');\r\n\r\n if (!lightBoxDiv) {\r\n return;\r\n }\r\n\r\n const openLightbox = (e) => {\r\n const currentTag = e.target;\r\n\r\n e.target.blur();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n lightBoxDiv.classList.add('show');\r\n\r\n const showEvent = new Event('show');\r\n lightBoxDiv.dispatchEvent(showEvent);\r\n\r\n var videoPlayer = lightBoxDiv.querySelector('.video-container .videoPlayer');\r\n\r\n if (videoPlayer != null) {\r\n adjustPlayerHeight(videoPlayer);\r\n // The media element plugin calculates the wrong heights for the lightbox video player\r\n // while the lightbox overlay is closed. Therefore we need to resize after opening the overlay\r\n // that every height is correct calculated\r\n window.dispatchEvent(new Event('resize'));\r\n }\r\n\r\n const lightboxCloseButton = lightBoxDiv.querySelector(\".lightbox-close-button\");\r\n const lightboxOverlay = lightBoxDiv.querySelector(\".lightbox-overlay\");\r\n const lightboxContent = lightBoxDiv.querySelector(\".lightbox-content\");\r\n\r\n if (!lightboxContent || !lightboxOverlay) {\r\n return;\r\n }\r\n\r\n let isInOverlayMousedown = false;\r\n\r\n var preventScrollFunc = function (e) {\r\n if ((e.keycode || e.which) == 32) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n document.querySelector(\"body\").style.overflow = 'hidden';\r\n\r\n\r\n lightboxCloseButton.setAttribute(\"tabindex\", \"0\");\r\n\r\n if (window.innerWidth >= desktopWidth) {\r\n lightboxCloseButton.focus();\r\n }\r\n\r\n // if events are already added, return here\r\n if (lightboxOverlay.dataset.eventsInitialized) {\r\n return;\r\n }\r\n lightboxOverlay.dataset.eventsInitialized = \"true\";\r\n\r\n /* Prevent scrolling in document if modal is closing with space. */\r\n document.addEventListener('keydown', preventScrollFunc, false);\r\n\r\n /* Prevent closing the layout if clicking on the content */\r\n lightboxContent.addEventListener(\"click\",\r\n function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n /* Prevent closing the layout if clicking on the content */\r\n lightboxOverlay.addEventListener(\"click\",\r\n function (e) {\r\n e.stopPropagation();\r\n });\r\n \r\n lightboxOverlay.addEventListener('mousedown', () => {\r\n isInOverlayMousedown = true;\r\n });\r\n\r\n lightboxOverlay.addEventListener('mouseup', () => {\r\n isInOverlayMousedown = false;\r\n });\r\n\r\n lightBoxDiv.addEventListener(\"mouseup\", function (e) {\r\n if (isInOverlayMousedown ||\r\n lightboxOverlay.contains(e.target)) {\r\n isInOverlayMousedown = false;\r\n return;\r\n }\r\n\r\n that.closeLightbox(e, this, lightBoxDiv, currentTag, preventScrollFunc);\r\n });\r\n\r\n lightboxCloseButton.addEventListener(\"click\", function (e) {\r\n that.closeLightbox(e, this, lightBoxDiv, currentTag, preventScrollFunc);\r\n });\r\n\r\n lightboxCloseButton.addEventListener(\"touch\", function (e) {\r\n that.closeLightbox(e, this, lightBoxDiv, currentTag, preventScrollFunc);\r\n });\r\n\r\n lightboxCloseButton.addEventListener(\"keydown\", function (e) {\r\n /* Enter, ESC, Space */\r\n if (e.keyCode == 13 || e.keyCode == 27 || e.keyCode == 32) {\r\n that.closeLightbox(e, this, lightBoxDiv, currentTag, preventScrollFunc);\r\n }\r\n });\r\n\r\n document.addEventListener('keydown', function (e) {\r\n if (lightboxCloseButton) {\r\n if (e.keyCode === 27) {\r\n that.closeLightbox(e, lightboxCloseButton, lightBoxDiv, currentTag, preventScrollFunc);\r\n }\r\n }\r\n })\r\n\r\n lightboxOverlay.dataset.eventsInitialized = \"true\";\r\n };\r\n\r\n const openLightboxWithKeyboard = (e) => {\r\n switch (e.key) {\r\n case 'Enter':\r\n case 'Space':\r\n openLightbox(e);\r\n break;\r\n }\r\n };\r\n\r\n item.addEventListener(\"click\", openLightbox, false);\r\n item.addEventListener(\"keydown\", openLightboxWithKeyboard, false);\r\n });\r\n };\r\n\r\n that.closeLightbox = function (e, closeButton, lightbox, opener, tracker) {\r\n const playButton = lightbox.querySelector(\".mejs__playpause-button button\");\r\n\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n\r\n if (lightbox.classList.contains('show')) {\r\n lightbox.classList.remove('show');\r\n\r\n if (playButton && playButton.getAttribute(\"title\") != \"Abspielen\") {\r\n playButton.click();\r\n }\r\n\r\n const hideEvent = new Event('hide');\r\n lightbox.dispatchEvent(hideEvent);\r\n }\r\n\r\n closeButton.setAttribute(\"tabindex\", -1);\r\n\r\n if (window.innerWidth >= tabletWidth) {\r\n opener.focus();\r\n }\r\n\r\n document.removeEventListener('keydown', tracker);\r\n\r\n document.querySelector(\"body\").style.overflow = 'visible';\r\n };\r\n\r\n /**\r\n * Adjusts the video player size if the controls are displayed in two rows.\r\n * Needs to call after the lightbox is shown because invisible lightbox elements cant adjust video players (no height)\r\n * Video player height is always the height of the player because the controls are usually inside the video (overlayed)\r\n * @param {any} element\r\n * \r\n * This code must be the same as in the frontend project videoplayer.js !!!\r\n * Workaround because we have not access between both projects\r\n * \r\n */\r\n function adjustPlayerHeight(element) {\r\n var controls = element.querySelector(\".mejs__controls\");\r\n var videoContainer = element.querySelector('.videoPlayer__video');\r\n var style = null;\r\n\r\n if (window.getComputedStyle) {\r\n style = getComputedStyle(controls, null);\r\n } else {\r\n style = el.currentStyle;\r\n }\r\n\r\n var bottomVal = parseFloat(style.bottom);\r\n var heightVal = parseFloat(style.height);\r\n\r\n if (bottomVal > 0 && !isNaN(heightVal)) {\r\n /* Set height on video container - previously we set the value on the element but then it conflicted with the parent margin (was ignored) */\r\n videoContainer.style.marginBottom = (heightVal - bottomVal) + \"px\";\r\n } else {\r\n videoContainer.style.removeProperty(\"margin-bottom\");\r\n }\r\n };\r\n\r\n that.setLightboxContentContainerToBody = function () {\r\n var lightboxContentContainer = document.querySelectorAll(\".lightbox-overlay-container\");\r\n\r\n if (!lightboxContentContainer) {\r\n return;\r\n }\r\n\r\n var body = document.querySelector('body');\r\n var lightboxIds = [];\r\n\r\n lightboxContentContainer.forEach(function (container) {\r\n let dataId = container.getAttribute(\"data-id\");\r\n\r\n if (lightboxIds.includes(dataId)) {\r\n // It can be possible that we have more then one lightbox container\r\n // with the same id. Based on cacheable renderings vs not cacheable renderings.\r\n // Therefore we need to remove the doubled lightbox content container\r\n container.remove();\r\n return;\r\n }\r\n\r\n lightboxIds.push(dataId);\r\n body.append(container);\r\n });\r\n };\r\n};\r\n\r\nwindow.am = window.am || {};\r\nwindow.am.lightbox = Lightbox;\r\n\r\nwindow.addEventListener('load', window.am.lightbox.init);\r\n\r\nexport default Lightbox;","function getRandomNumberInRange(minValue, maxValue) {\r\n if (minValue > maxValue) {\r\n throw new Error(\"minValue should be less than or equal to maxValue\");\r\n }\r\n\r\n // Create a Uint32Array (4 bytes = 32 bits)\r\n const randomArray = new Uint32Array(1);\r\n \r\n // Fill the array with a cryptographically secure random number\r\n crypto.getRandomValues(randomArray);\r\n\r\n // Map the random value to the desired range [minValue, maxValue]\r\n const range = maxValue - minValue + 1; // +1 to make maxValue inclusive\r\n return minValue + (randomArray[0] % range);\r\n}\r\n\r\n\r\nexport default getRandomNumberInRange;","export const NAME = 'zoomist'\r\n\r\nexport const MODULES = ['slider', 'zoomer']\r\n\r\nexport const CLASS_CONTAINER = `${NAME}-container`\r\nexport const CLASS_WRAPPER = `${NAME}-wrapper`\r\nexport const CLASS_IMAGE = `${NAME}-image`\r\n\r\nexport const CLASS_SLIDER = `${NAME}-slider`\r\nexport const CLASS_SLIDER_MAIN = `${NAME}-slider-main`\r\nexport const CLASS_SLIDER_BAR = `${NAME}-slider-bar`\r\nexport const CLASS_SLIDER_BUTTON = `${NAME}-slider-button`\r\n\r\nexport const CLASS_ZOOMER = `${NAME}-zoomer`\r\nexport const CLASS_ZOOMER_IN = `${NAME}-in-zoomer`\r\nexport const CLASS_ZOOMER_OUT = `${NAME}-out-zoomer`\r\nexport const CLASS_ZOOMER_DISABLE = `${NAME}-zoomer-disable`\r\n\r\nexport const IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined'\r\nexport const IS_TOUCH = IS_BROWSER && 'ontouchstart' in window ? true : false\r\n\r\nexport const EVENT_TOUCH_START = IS_TOUCH ? 'touchstart' : 'mousedown'\r\nexport const EVENT_TOUCH_MOVE = IS_TOUCH ? 'touchmove' : 'mousemove'\r\nexport const EVENT_TOUCH_END = IS_TOUCH ? 'touchend' : 'mouseup'\r\nexport const EVENT_RESIZE = 'resize'\r\nexport const EVENT_WHEEL = 'wheel'","import {\r\n CLASS_SLIDER,\r\n CLASS_ZOOMER_IN,\r\n CLASS_ZOOMER_OUT\r\n} from './../shared/constants'\r\n\r\nexport default {\r\n // {String} set initial image status\r\n fill: 'cover',\r\n // {String / querySelector} the attribute of image source or a image element\r\n src: 'data-zoomist-src',\r\n // {Boolean} set is draggable or not\r\n draggable: true,\r\n // {Boolean} set is wheelable or not\r\n wheelable: true,\r\n // {Boolean} set is pinchable or not\r\n pinchable: true,\r\n // {Boolean} set image can be drag out of the bounds (it will set to false when fill is contain)\r\n bounds: true,\r\n // {Number} the ratio of zoom at one time\r\n zoomRatio: 0.1,\r\n // {Number > 1, False} the max ratio of the image (compare to the initial image status)\r\n maxRatio: false,\r\n // {Boolean / String}\r\n height: 'auto'\r\n}\r\n\r\nexport const DEFAULT_SLIDER_OPTIONS = {\r\n // {String / querySelector} the css selector string or a element of the slider\r\n el: CLASS_SLIDER,\r\n // {String} the direction of the slider 'horizontal' or 'vertical'\r\n direction: 'horizontal',\r\n // {Number} the max ratio of the slider (only work on options.maxRatio = false)\r\n maxRatio: 2\r\n}\r\n\r\nexport const DEFAULT_ZOOMER_OPTIONS = {\r\n // {String / querySelector} the css selector string or a element of the in zoomer\r\n inEl: CLASS_ZOOMER_IN,\r\n // {String / querySelector} the css selector string or a element of the out zoomer\r\n outEl: CLASS_ZOOMER_OUT,\r\n // {Boolean} in zoomer and out zoomer will be disabled when image comes to maximin or minimum\r\n disableOnBounds: true\r\n}\r\n\r\nexport const EVENTS = {\r\n // invoked when zoomist instance ready\r\n ready: null,\r\n // invoked when image is zooming\r\n zoom: null,\r\n // invoked when wheeling\r\n wheel: null,\r\n // invoked when mousedown on wrapper\r\n dragStart: null,\r\n // invoked when dragging the image\r\n drag: null,\r\n // invoked when mouseup on wrapper\r\n dragEnd: null,\r\n // invoked when mousedown on wrapper\r\n pinchStart: null,\r\n // invoked when pinching the image\r\n pinch: null,\r\n // invoked when mouseup on wrapper\r\n pinchEnd: null,\r\n // invoked when mousedown on slider\r\n slideStart: null,\r\n // invoked when sliding the slider\r\n slide: null,\r\n // invoked when mouseup on slider\r\n slideEnd: null,\r\n // invoked when image changes it's size\r\n resize: null,\r\n // invoked when reset methods be used\r\n reset: null,\r\n // invoked when destroy methods be used\r\n destroy: null,\r\n // invoked when update methods be used\r\n update: null\r\n}","import { IS_TOUCH } from './constants'\r\n\r\n// check value is a object and not null\r\nexport const isObject = (value) => {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\n// check value is a plain object\r\nexport const isPlainObject = (value) => {\r\n if (!isObject(value)) return false\r\n try {\r\n const { constructor } = value\r\n const { prototype } = constructor\r\n const { hasOwnProperty } = Object.prototype\r\n return constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf')\r\n } catch (error) {\r\n return false\r\n }\r\n}\r\n\r\n// set object key and value\r\nexport const setObject = (obj, value) => {\r\n if (!obj) obj = {}\r\n for (const [k, v] of Object.entries(value)) {\r\n obj[k] = v\r\n }\r\n}\r\n\r\n// make a new object from old object\r\nexport const getNewObject = (value) => {\r\n return Object.assign({}, value)\r\n}\r\n\r\n// check value is string and not empty\r\nexport const isString = (value) => {\r\n return typeof value === 'string' && value !== ''\r\n}\r\n\r\n// check value is number and not NaN\r\nexport const isNumber = (value) => {\r\n return typeof value === 'number' && !isNaN(value);\r\n}\r\n\r\n// check element is exist\r\nexport const isElementExist = (value) => {\r\n return getElement(value) !== null\r\n}\r\n\r\n// if value is an element then return value, if not then query value\r\nexport const getElement = (value) => {\r\n return value instanceof HTMLElement ? value : document.querySelector(value)\r\n}\r\n\r\n// check value is img tag or not\r\nexport const isImg = (value) => {\r\n return isElementExist(value) && getElement(value).tagName === 'IMG'\r\n}\r\n\r\n// check value is a function\r\nexport const isFunction = (value) => {\r\n return typeof value === 'function';\r\n}\r\n\r\n// check value is percentage\r\nexport const isPercentage = (value) => {\r\n return value.indexOf('%') > -1\r\n}\r\n\r\n// get elemant style\r\nexport const getStyle = (element, prop) => {\r\n return element[prop] || element.style[prop] || window.getComputedStyle(element).getPropertyValue(prop)\r\n}\r\n\r\n// foreach set style\r\nexport const setStyle = (element, obj) => {\r\n for (const [k, v] of Object.entries(obj)) {\r\n element.style[k] = isNumber(v) ? `${v}px` : v\r\n }\r\n}\r\n\r\n// get mouse pageX and pageY\r\nexport const getPointer = (event) => {\r\n const isNotTouch = !IS_TOUCH || event.type === 'wheel'\r\n return {\r\n x: isNotTouch ? event.pageX : event.touches[0].pageX,\r\n y: isNotTouch ? event.pageY : event.touches[0].pageY,\r\n clientX: isNotTouch ? event.clientX : event.touches[0].clientX,\r\n clientY: isNotTouch ? event.clientY : event.touches[0].clientY\r\n }\r\n}\r\n\r\n// get transformX\r\nexport const getTransformX = (target) => {\r\n const transform = getComputedStyle(target).transform\r\n let mat = transform.match(/^matrix3d\\((.+)\\)$/)\r\n if (mat) return parseFloat(mat[1].split(', ')[12])\r\n mat = transform.match(/^matrix\\((.+)\\)$/)\r\n return mat ? parseFloat(mat[1].split(', ')[4]) : 0\r\n}\r\n\r\n// get transformY\r\nexport const getTransformY = (target) => {\r\n const transform = getComputedStyle(target).transform\r\n let mat = transform.match(/^matrix3d\\((.+)\\)$/)\r\n if (mat) return parseFloat(mat[1].split(', ')[13])\r\n mat = transform.match(/^matrix\\((.+)\\)$/)\r\n return mat ? parseFloat(mat[1].split(', ')[5]) : 0\r\n}\r\n\r\n// like .toFixed(2)\r\nexport const roundToTwo = (value) => {\r\n return +(Math.round(value + \"e+2\") + \"e-2\")\r\n}\r\n\r\n// limit value\r\nexport const minmax = (value, min, max) => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n// first letter to uppercase\r\nexport const upperFirstLetter = (value) => {\r\n return value.charAt(0).toUpperCase() + value.slice(1)\r\n}\r\n\r\n","import {\r\n setStyle,\r\n setObject,\r\n getNewObject,\r\n getTransformX,\r\n getTransformY,\r\n roundToTwo,\r\n minmax,\r\n isFunction\r\n} from './../shared/utils'\r\nimport {\r\n NAME,\r\n CLASS_CONTAINER,\r\n CLASS_ZOOMER_DISABLE\r\n} from './../shared/constants'\r\n\r\nexport default {\r\n /**\r\n * get container (element) data\r\n * @returns {Object}\r\n */\r\n getContainerData() {\r\n return getNewObject(this.data.containerData)\r\n },\r\n\r\n /**\r\n * get image data\r\n * @returns {Object}\r\n */\r\n getImageData() {\r\n return getNewObject(this.data.imageData)\r\n },\r\n\r\n /**\r\n * get slider value\r\n * @returns {Number}\r\n */\r\n getSliderValue() {\r\n return this.__modules__.slider?.value\r\n },\r\n\r\n /**\r\n * get now zoom ratio\r\n * @returns {Number}\r\n */\r\n getZoomRatio() {\r\n return this.ratio\r\n },\r\n\r\n /**\r\n * zoom\r\n * zoomRatio - zoomin when pass a positive number, zoomout when pass a negative number\r\n * pointer - a object which return from getPoiner()\r\n * @param {Number, Object} \r\n */\r\n zoom(zoomRatio, pointer) {\r\n const { image, data, options, ratio } = this\r\n const { bounds, maxRatio } = options\r\n\r\n if (bounds && ratio === 1 && zoomRatio < 0) return;\r\n if (maxRatio && ratio === maxRatio && zoomRatio > 0) return;\r\n\r\n const { originImageData } = data\r\n const containerData = this.getContainerData()\r\n const imageData = this.getImageData()\r\n const imageRect = image.getBoundingClientRect()\r\n\r\n const calcRatio = roundToTwo(ratio * (zoomRatio + 1))\r\n const newRatio = bounds && calcRatio < 1 ? 1 : maxRatio && calcRatio > maxRatio ? maxRatio : calcRatio\r\n const newZoomRatio = newRatio / ratio - 1\r\n\r\n const newWidth = originImageData.width * newRatio\r\n const newHeight = originImageData.height * newRatio\r\n const newLeft = (containerData.width - newWidth) / 2\r\n const newTop = (containerData.height - newHeight) / 2\r\n const distanceX = pointer ? ( imageData.width / 2 - pointer.clientX + imageRect.left ) * newZoomRatio + getTransformX(image) : getTransformX(image)\r\n const distanceY = pointer ? ( imageData.height / 2 - pointer.clientY + imageRect.top ) * newZoomRatio + getTransformY(image) : getTransformY(image)\r\n const transformX = bounds ? minmax(distanceX, newLeft, -newLeft) : distanceX\r\n const transformY = bounds ? minmax(distanceY, newTop, -newTop) : distanceY\r\n\r\n const newData = {\r\n width: newWidth,\r\n height: newHeight,\r\n left: newLeft,\r\n top: newTop\r\n }\r\n\r\n setObject(data.imageData, newData)\r\n\r\n setStyle(image, {\r\n ...newData,\r\n transform: `translate(${transformX}px, ${transformY}px)`\r\n })\r\n\r\n this.ratio = newRatio\r\n\r\n this.emit('zoom', newRatio)\r\n\r\n // if has slider\r\n if (options.slider) {\r\n const { slider } = this.__modules__\r\n const ratioPercentage = roundToTwo(1 - ( slider.maxRatio - newRatio ) / ( slider.maxRatio - 1 )) * 100\r\n\r\n slider.value = minmax(ratioPercentage, 0, 100)\r\n\r\n this.slideTo(ratioPercentage, true)\r\n }\r\n\r\n // if zoomer disableOnBounds\r\n if (options.zoomer) {\r\n const { zoomer } = this.__modules__\r\n if (zoomer.disableOnBounds) {\r\n const { bounds } = options\r\n const { zoomerInEl, zoomerOutEl } = this.__modules__.zoomer\r\n\r\n bounds && this.ratio === 1 ? zoomerOutEl.classList.add(CLASS_ZOOMER_DISABLE) : zoomerOutEl.classList.remove(CLASS_ZOOMER_DISABLE)\r\n this.ratio === maxRatio ? zoomerInEl.classList.add(CLASS_ZOOMER_DISABLE) : zoomerInEl.classList.remove(CLASS_ZOOMER_DISABLE)\r\n }\r\n }\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * zoomTo (zoom to a specific ratio)\r\n * zoomRatio - zoomin when pass a number more than 1, zoomout when pass a number less than 1\r\n * @param {Number} \r\n */\r\n zoomTo(zoomRatio) {\r\n const { ratio } = this\r\n\r\n if (zoomRatio !== ratio) {\r\n const calcRatio = zoomRatio / ratio - 1\r\n this.zoom(calcRatio)\r\n }\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * move - move to a relative position\r\n * x - number\r\n * y - number\r\n * @param {Number}\r\n */\r\n move(x = 0, y = 0) {\r\n const { image, data, options } = this\r\n const { imageData, dragData } = data\r\n const { top, left } = imageData\r\n const { transX, transY } = dragData\r\n const { bounds } = options\r\n\r\n const calcTransX = bounds ? minmax(transX - x, left, -left) : transX - x\r\n const calcTransY = bounds ? minmax(transY - y, top, -top) : transY - y\r\n const newTransX = roundToTwo(calcTransX)\r\n const newTransY = roundToTwo(calcTransY)\r\n\r\n setObject(dragData, {\r\n transX: newTransX,\r\n transY: newTransY\r\n })\r\n image.style.transform = `translate(${newTransX}px, ${newTransY}px)`\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * moveTo - move to a absolute position\r\n * x - number\r\n * y - number\r\n * @param {Number}\r\n */\r\n moveTo(x, y) {\r\n const { data, options } = this\r\n const { imageData, dragData } = data\r\n const { top, left } = imageData\r\n const { transX, transY } = dragData\r\n const { bounds } = options\r\n\r\n x = x ?? Math.abs(left)\r\n y = y ?? Math.abs(top)\r\n\r\n const calcTransX = bounds ? minmax(left + x + transX, left, -left) : left + x + transX\r\n const calcTransY = bounds ? minmax(top + y + transY, top, -top) : top + y + transY\r\n\r\n this.move(calcTransX, calcTransY)\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * slideTo (only work on the slider)\r\n * value - a numer between 0-100\r\n * @param {Number}\r\n */\r\n slideTo(value, onlySlide) {\r\n const { __modules__ } = this\r\n\r\n if (!__modules__.slider) return;\r\n\r\n const { slider } = __modules__\r\n\r\n const position = slider.direction === 'horizontal' ? 'left' : 'top'\r\n const symbol = slider.direction === 'horizontal' ? '' : '-'\r\n const distance = minmax(value, 0, 100)\r\n\r\n slider.sliderButton.style[position] = `${symbol}${distance}%`\r\n\r\n if (!onlySlide) {\r\n const percentage = distance / 100\r\n const minRatio = this.ratio < 1 ? this.ratio : 1\r\n const maxRatio = this.ratio > slider.maxRatio ? this.ratio : slider.maxRatio\r\n const ratio = ( maxRatio - minRatio ) * percentage + minRatio\r\n\r\n this.zoomTo(ratio)\r\n }\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * reset image to initial status\r\n */\r\n reset() {\r\n const { image } = this\r\n\r\n this.zoomTo(1)\r\n\r\n setStyle(image, {\r\n transform: 'translate(0, 0)'\r\n })\r\n\r\n this.emit('reset')\r\n \r\n return this\r\n },\r\n \r\n /**\r\n * destory the instance of zoomist\r\n */\r\n destroy() {\r\n const { element, wrapper } = this\r\n const { slider, zoomer } = this.__modules__\r\n\r\n element[NAME] = undefined\r\n this.mounted = false\r\n \r\n if (slider) this.destroySlider()\r\n if (zoomer) this.destroyZoomer()\r\n \r\n wrapper.remove()\r\n element.style.removeProperty('width')\r\n element.style.removeProperty('padding-bottom')\r\n element.classList.remove(CLASS_CONTAINER)\r\n\r\n this.emit('destroy')\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * a syntactic sugar of destroy and init\r\n */\r\n update() {\r\n this.destroy().init()\r\n\r\n this.emit('update')\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * add handler on __events__\r\n * @param {String} events \r\n * @param {Function} handler \r\n */\r\n on(events, handler) {\r\n if (!isFunction(handler)) return this;\r\n\r\n const { __events__ } = this\r\n\r\n events.split(' ').forEach(evt => {\r\n if (!__events__[evt]) __events__[evt] = []\r\n __events__[evt].push(handler)\r\n })\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * invoke handlers in __events__[event]\r\n * @param {String, ...} args \r\n */\r\n emit(...args) {\r\n const { __events__ } = this\r\n\r\n const event = args[0]\r\n const data = args.slice(1, args.length)\r\n\r\n if (!__events__[event]) return this\r\n\r\n __events__[event].forEach(handler => {\r\n if (isFunction(handler)) handler.apply(this, data)\r\n })\r\n\r\n return this\r\n }\r\n}","import {\r\n setStyle,\r\n setObject,\r\n getPointer,\r\n getTransformX,\r\n getTransformY,\r\n roundToTwo,\r\n minmax\r\n} from './../shared/utils'\r\nimport {\r\n EVENT_TOUCH_START,\r\n EVENT_TOUCH_MOVE,\r\n EVENT_TOUCH_END,\r\n EVENT_RESIZE,\r\n EVENT_WHEEL,\r\n} from './../shared/constants'\r\n\r\n\r\nexport default (zoomist) => {\r\n const { element, wrapper, image, options, data } = zoomist\r\n const { containerData, imageData, originImageData } = data\r\n \r\n // set image size on window resize\r\n const resize = () => {\r\n if (containerData.width === element.offsetWidth) return;\r\n\r\n const widthRatio = element.offsetWidth / containerData.width\r\n const heightRatio = element.offsetHeight / containerData.height\r\n\r\n const originImageWidth = originImageData.width * widthRatio\r\n const originImageHeight = originImageData.height * heightRatio\r\n const originImageLeft = originImageData.left * widthRatio\r\n const originImageTop = originImageData.top * heightRatio\r\n\r\n const imageWidth = imageData.width * widthRatio\r\n const imageHeight = imageData.height * heightRatio\r\n const imageLeft = imageData.left * widthRatio\r\n const imageTop = imageData.top * heightRatio\r\n const transformX = getTransformX(image) * widthRatio\r\n const transformY = getTransformY(image) * heightRatio\r\n\r\n setObject(containerData, {\r\n width: element.offsetWidth,\r\n height: element.offsetHeight\r\n })\r\n\r\n setObject(originImageData, {\r\n width: originImageWidth,\r\n height: originImageHeight,\r\n left: originImageLeft,\r\n top: originImageTop\r\n })\r\n\r\n setObject(imageData, {\r\n width: imageWidth,\r\n height: imageHeight,\r\n left: imageLeft,\r\n top: imageTop\r\n })\r\n\r\n setStyle(zoomist.image, {\r\n width: imageWidth,\r\n height: imageHeight,\r\n left: imageLeft,\r\n top: imageTop,\r\n transform: `translate(${transformX}px, ${transformY}px)`\r\n })\r\n\r\n zoomist.emit('resize')\r\n }\r\n\r\n window.addEventListener(EVENT_RESIZE, resize)\r\n\r\n\r\n // set image drag event\r\n zoomist.dragging = false\r\n zoomist.data.dragData = {\r\n startX: 0,\r\n startY: 0,\r\n transX: 0,\r\n transY: 0\r\n }\r\n\r\n if (options.fill === 'contain' && options.bounds) options.bounds = false\r\n\r\n const { dragData } = data\r\n\r\n const dragStart = (e) => {\r\n if (!options.draggable) return;\r\n if (e.which === 2 || e.which === 3) return;\r\n\r\n const isPinch = e.touches && e.touches.length === 2\r\n\r\n setObject(dragData, {\r\n startX: isPinch ? (e.touches[0].pageX + e.touches[1].pageX) / 2 : getPointer(e).x,\r\n startY: isPinch ? (e.touches[0].pageY + e.touches[1].pageY) / 2 : getPointer(e).y,\r\n transX: getTransformX(image),\r\n transY: getTransformY(image)\r\n })\r\n\r\n zoomist.dragging = true\r\n\r\n zoomist.emit('dragStart', {x: dragData.transX, y: dragData.transY}, e)\r\n\r\n document.addEventListener(EVENT_TOUCH_MOVE, dragMove)\r\n document.addEventListener(EVENT_TOUCH_END, dragEnd)\r\n }\r\n const dragMove = (e) => {\r\n if (!zoomist.dragging) return;\r\n\r\n const isPinch = e.touches && e.touches.length === 2\r\n\r\n const pageX = isPinch ? (e.touches[0].pageX + e.touches[1].pageX) / 2 : getPointer(e).x\r\n const pageY = isPinch ? (e.touches[0].pageY + e.touches[1].pageY) / 2 : getPointer(e).y\r\n if(options.bounds) {\r\n const minPageX = dragData.startX - ( dragData.transX - imageData.left )\r\n const maxPageX = dragData.startX - ( dragData.transX + imageData.left )\r\n const minPageY = dragData.startY - ( dragData.transY - imageData.top )\r\n const maxPageY = dragData.startY - ( dragData.transY + imageData.top )\r\n if (pageX < minPageX) dragData.startX += pageX - minPageX\r\n if (pageX > maxPageX) dragData.startX += pageX - maxPageX\r\n if (pageY < minPageY) dragData.startY += pageY - minPageY\r\n if (pageY > maxPageY) dragData.startY += pageY - maxPageY\r\n }\r\n const transformX = roundToTwo(pageX - dragData.startX + dragData.transX)\r\n const transformY = roundToTwo(pageY - dragData.startY + dragData.transY)\r\n\r\n image.style.transform = `translate(${transformX}px, ${transformY}px)`\r\n\r\n zoomist.emit('drag', {x: transformX, y: transformY}, e)\r\n }\r\n const dragEnd = (e) => {\r\n zoomist.dragging = false\r\n\r\n setObject(dragData, {\r\n transX: getTransformX(image),\r\n transY: getTransformY(image)\r\n })\r\n\r\n zoomist.emit('dragEnd', {x: dragData.transX, y: dragData.transY}, e)\r\n\r\n document.removeEventListener(EVENT_TOUCH_MOVE, dragMove)\r\n document.removeEventListener(EVENT_TOUCH_END, dragEnd)\r\n }\r\n\r\n // set image pinch event\r\n zoomist.pinching = false\r\n zoomist.data.pinchData = {\r\n dist: 0,\r\n startX: 0,\r\n startY: 0\r\n }\r\n\r\n const pinchStart = (e) => {\r\n if (!options.pinchable) return;\r\n if (!e.touches || e.touches.length !== 2) return;\r\n\r\n const { pinchData } = zoomist.data\r\n\r\n setObject(pinchData, {\r\n dist: Math.hypot(e.touches[0].pageX - e.touches[1].pageX, e.touches[0].pageY - e.touches[1].pageY),\r\n startX: e.touches[0].clientX,\r\n startY: e.touches[0].clientY\r\n })\r\n\r\n // zoomist.dragging = false\r\n zoomist.pinching = true\r\n\r\n zoomist.emit('pinchStart', e)\r\n\r\n document.addEventListener(EVENT_TOUCH_MOVE, pinchMove)\r\n document.addEventListener(EVENT_TOUCH_END, pinchEnd)\r\n }\r\n const pinchMove = (e) => {\r\n if (!zoomist.pinching) return;\r\n\r\n const { pinchData } = zoomist.data\r\n\r\n const pinchDist = Math.hypot(e.touches[0].pageX - e.touches[1].pageX, e.touches[0].pageY - e.touches[1].pageY)\r\n const zoomRatio = roundToTwo((pinchDist - pinchData.dist) / 100)\r\n const pointer = {\r\n clientX: (e.touches[0].clientX + e.touches[1].clientX) / 2,\r\n clientY: (e.touches[0].clientY + e.touches[1].clientY) / 2\r\n }\r\n\r\n zoomist.zoom(zoomRatio, pointer)\r\n\r\n pinchData.dist = pinchDist\r\n\r\n zoomist.emit('pinch', e)\r\n }\r\n const pinchEnd = (e) => {\r\n zoomist.pinching = false\r\n\r\n zoomist.emit('pinchEnd', e)\r\n\r\n document.removeEventListener(EVENT_TOUCH_MOVE, pinchMove)\r\n document.removeEventListener(EVENT_TOUCH_END, pinchEnd)\r\n }\r\n\r\n // touch start handler\r\n const touchStart = (e) => {\r\n dragStart(e)\r\n pinchStart(e)\r\n }\r\n\r\n wrapper.addEventListener(EVENT_TOUCH_START, touchStart)\r\n\r\n\r\n // set zomm on mousewheel event\r\n zoomist.wheeling = false\r\n\r\n const wheel = (e) => {\r\n if (!options.wheelable) return;\r\n e.preventDefault()\r\n\r\n const { zoomRatio } = options\r\n\r\n if (zoomist.wheeling) return;\r\n\r\n // prevent wheeling too fast\r\n zoomist.wheeling = true\r\n setTimeout(() => { zoomist.wheeling = false }, 30)\r\n\r\n let delta\r\n if (e.deltaY) delta = e.deltaY > 0 ? -1 : 1\r\n else if (e.wheelDelta) delta = e.wheelDelta / 120\r\n else if (e.detail) delta = e.detail > 0 ? -1 : 1\r\n\r\n zoomist.zoom(delta * zoomRatio, getPointer(e))\r\n\r\n zoomist.emit('wheel', e)\r\n }\r\n\r\n wrapper.addEventListener(EVENT_WHEEL, wheel)\r\n}\r\n\r\n\r\n// slider events\r\nexport const sliderEvents = (zoomist) => {\r\n const { slider } = zoomist.__modules__\r\n\r\n // events\r\n slider.sliding = false\r\n const isHorizontal = slider.direction === 'horizontal'\r\n\r\n const slideHandler = (e) => {\r\n const rect = slider.sliderMain.getBoundingClientRect()\r\n\r\n const mousePoint = isHorizontal ? getPointer(e).clientX : -getPointer(e).clientY\r\n const sliderTotal = isHorizontal ? rect.width : rect.height\r\n const sliderStart = isHorizontal ? rect.left : -rect.bottom\r\n const percentage = minmax(roundToTwo(( mousePoint - sliderStart ) / sliderTotal), 0, 1)\r\n\r\n const minRatio = zoomist.ratio < 1 ? zoomist.ratio : 1\r\n const maxRatio = zoomist.ratio > slider.maxRatio ? zoomist.ratio : slider.maxRatio\r\n const ratio = ( maxRatio - minRatio ) * percentage + minRatio\r\n\r\n zoomist.zoomTo(ratio)\r\n }\r\n const slideStart = (e) => {\r\n slideHandler(e)\r\n\r\n slider.sliding = true\r\n\r\n zoomist.emit('slideStart', zoomist.getSliderValue(), e)\r\n\r\n document.addEventListener(EVENT_TOUCH_MOVE, slideMove)\r\n document.addEventListener(EVENT_TOUCH_END, slideEnd)\r\n }\r\n const slideMove = (e) => {\r\n if (!slider.sliding) return;\r\n\r\n slideHandler(e)\r\n\r\n zoomist.emit('slide', zoomist.getSliderValue(), e)\r\n }\r\n const slideEnd = (e) => {\r\n slider.sliding = false\r\n\r\n zoomist.emit('slideEnd', zoomist.getSliderValue(), e)\r\n\r\n document.removeEventListener(EVENT_TOUCH_MOVE, slideMove)\r\n document.removeEventListener(EVENT_TOUCH_END, slideEnd)\r\n }\r\n\r\n slider.sliderMain.addEventListener(EVENT_TOUCH_START, slideStart)\r\n slider.sliderMain.event = slideStart\r\n}\r\n\r\n\r\n// zoomer events\r\nexport const zoomerEvents = (zoomist) => {\r\n const { zoomRatio } = zoomist.options\r\n const { zoomer } = zoomist.__modules__\r\n\r\n const zoomInHandler = () => zoomist.zoom(zoomRatio)\r\n const zoomOutHandler = () => zoomist.zoom(-zoomRatio)\r\n\r\n zoomer.zoomerInEl.addEventListener('click', zoomInHandler)\r\n zoomer.zoomerOutEl.addEventListener('click', zoomOutHandler)\r\n zoomer.zoomerInEl.event = zoomInHandler\r\n zoomer.zoomerOutEl.event = zoomOutHandler\r\n}","import {\r\n CLASS_SLIDER_MAIN,\r\n CLASS_SLIDER_BAR,\r\n CLASS_SLIDER_BUTTON\r\n} from './../shared/constants'\r\n\r\nexport const sliderTemp = `\r\n
\r\n \r\n \r\n
\r\n`\r\n\r\nexport const inZoomerIcon = `\r\n\r\n \r\n\r\n`\r\n\r\nexport const outZoomerIcon = `\r\n\r\n \r\n\r\n`","import {\r\n DEFAULT_SLIDER_OPTIONS,\r\n DEFAULT_ZOOMER_OPTIONS\r\n} from './options'\r\nimport {\r\n MODULES,\r\n CLASS_SLIDER,\r\n CLASS_SLIDER_MAIN,\r\n CLASS_SLIDER_BAR,\r\n CLASS_SLIDER_BUTTON,\r\n CLASS_ZOOMER,\r\n CLASS_ZOOMER_IN,\r\n CLASS_ZOOMER_OUT,\r\n CLASS_ZOOMER_DISABLE\r\n} from './../shared/constants'\r\nimport {\r\n isElementExist,\r\n getElement,\r\n upperFirstLetter\r\n} from './../shared/utils'\r\nimport {\r\n sliderEvents,\r\n zoomerEvents\r\n} from './events'\r\nimport {\r\n sliderTemp,\r\n inZoomerIcon,\r\n outZoomerIcon\r\n} from './template'\r\n\r\nexport default {\r\n /**\r\n * create all modules\r\n */\r\n createModules() {\r\n const { options } = this\r\n\r\n this.__modules__ = {}\r\n MODULES.forEach(module => {\r\n if (options[module]) this[`create${upperFirstLetter(module)}`]()\r\n })\r\n },\r\n\r\n /**\r\n * create slider module\r\n */\r\n createSlider() {\r\n const { element, options, __modules__ } = this\r\n __modules__.slider = Object.assign({}, DEFAULT_SLIDER_OPTIONS, options.slider)\r\n \r\n const { slider } = __modules__\r\n \r\n if (options.maxRatio) Object.assign(slider, { maxRatio: options.maxRatio })\r\n if (slider.direction !== 'horizontal' && slider.direction !== 'vertical') slider.direction = 'horizontal'\r\n slider.value = 0\r\n\r\n // mount\r\n if (slider.mounted) slider.sliderMain.remove()\r\n\r\n const isCustomEl = slider.isCustomEl = slider.el && isElementExist(slider.el)\r\n const sliderEl = isCustomEl ? getElement(slider.el) : document.createElement('div')\r\n if (!isCustomEl) sliderEl.classList.add(CLASS_SLIDER)\r\n sliderEl.innerHTML = sliderTemp\r\n\r\n slider.sliderEl = sliderEl\r\n slider.sliderMain = sliderEl.querySelector(`.${CLASS_SLIDER_MAIN}`)\r\n slider.sliderBar = sliderEl.querySelector(`.${CLASS_SLIDER_BAR}`)\r\n slider.sliderButton = sliderEl.querySelector(`.${CLASS_SLIDER_BUTTON}`)\r\n slider.sliderMain.classList.add(`${CLASS_SLIDER}-${slider.direction}`)\r\n\r\n // events\r\n sliderEvents(this)\r\n\r\n slider.mounted = true\r\n\r\n // render\r\n if (!isCustomEl) element.append(sliderEl)\r\n },\r\n\r\n /**\r\n * destroy slider module\r\n */\r\n destroySlider() {\r\n const { slider } = this.__modules__\r\n\r\n if (!slider || !slider.mounted) return;\r\n\r\n if (slider.isCustomEl) slider.sliderMain.remove()\r\n else slider.sliderEl.remove()\r\n\r\n slider.mounted = false\r\n },\r\n\r\n /**\r\n * create zoomer module\r\n */\r\n createZoomer() {\r\n const { element, options, __modules__ } = this\r\n __modules__.zoomer = Object.assign({}, DEFAULT_ZOOMER_OPTIONS, options.zoomer)\r\n\r\n const { zoomer } = __modules__\r\n\r\n // mount\r\n if (zoomer.mounted && zoomer.zoomerEl) zoomer.sliderMain.remove()\r\n\r\n const isCustomInEl = zoomer.isCustomInEl = zoomer.inEl && isElementExist(zoomer.inEl)\r\n const isCustomOutEl = zoomer.isCustomOutEl = zoomer.outEl && isElementExist(zoomer.outEl)\r\n const zoomerInEl = isCustomInEl ? getElement(zoomer.inEl) : document.createElement('div')\r\n const zoomerOutEl = isCustomOutEl ? getElement(zoomer.outEl) : document.createElement('div')\r\n if (!isCustomInEl) {\r\n zoomerInEl.classList.add(CLASS_ZOOMER_IN)\r\n zoomerInEl.innerHTML = inZoomerIcon\r\n }\r\n if (!isCustomOutEl) {\r\n zoomerOutEl.classList.add(CLASS_ZOOMER_OUT)\r\n zoomerOutEl.innerHTML = outZoomerIcon\r\n }\r\n\r\n zoomer.zoomerInEl = zoomerInEl\r\n zoomer.zoomerOutEl = zoomerOutEl\r\n\r\n if (zoomer.disableOnBounds) {\r\n const { bounds, maxRatio } = options\r\n\r\n if (bounds && this.ratio === 1) zoomerOutEl.classList.add(CLASS_ZOOMER_DISABLE)\r\n if (this.ratio === maxRatio) zoomerInEl.classList.add(CLASS_ZOOMER_DISABLE)\r\n }\r\n\r\n // events\r\n zoomerEvents(this)\r\n\r\n zoomer.mounted = true\r\n\r\n // render\r\n if (!isCustomInEl || !isCustomOutEl) {\r\n const zoomerEl = document.createElement('div')\r\n zoomerEl.classList.add(CLASS_ZOOMER)\r\n\r\n if (!isCustomInEl) zoomerEl.append(zoomerInEl)\r\n if (!isCustomOutEl) zoomerEl.append(zoomerOutEl)\r\n\r\n zoomer.zoomerEl = zoomerEl\r\n\r\n element.append(zoomerEl)\r\n }\r\n },\r\n\r\n /**\r\n * destroy zoomer module\r\n */\r\n destroyZoomer() {\r\n const { zoomer } = this.__modules__\r\n\r\n if (!zoomer || !zoomer.mounted) return;\r\n\r\n const unbindZoomer = (target) => {\r\n target.removeEventListener('click', target.event)\r\n target.event = undefined\r\n target.classList.remove(CLASS_ZOOMER_DISABLE)\r\n }\r\n\r\n if (zoomer.isCustomInEl) unbindZoomer(zoomer.zoomerInEl)\r\n else zoomer.zoomerInEl.remove()\r\n if (zoomer.isCustomOutEl) unbindZoomer(zoomer.zoomerOutEl)\r\n else zoomer.zoomerOutEl.remove()\r\n if (zoomer.zoomerEl) zoomer.zoomerEl.remove()\r\n\r\n zoomer.mounted = false\r\n }\r\n}","import DEFAULT_OPTIONS, { EVENTS } from './core/options'\r\nimport METHODS from './core/methods'\r\nimport MODULES from './core/modules'\r\nimport bindEvents from './core/events'\r\nimport {\r\n isPlainObject,\r\n isImg,\r\n isString,\r\n isNumber,\r\n isElementExist,\r\n getElement,\r\n setStyle,\r\n isPercentage,\r\n roundToTwo\r\n} from './shared/utils'\r\nimport {\r\n NAME,\r\n CLASS_CONTAINER,\r\n CLASS_WRAPPER,\r\n CLASS_IMAGE\r\n} from './shared/constants'\r\n\r\n\r\n\r\nclass Zoomist {\r\n /**\r\n * \r\n * @param {Element} element - target element \r\n * @param {Object} options - the configuration options\r\n */\r\n constructor(element, options = {}) {\r\n if (!element) throw new Error('The first argument is required.')\r\n if (!isElementExist(element)) throw new Error('This element is not exist.')\r\n\r\n this.element = getElement(element)\r\n this.options = Object.assign({}, DEFAULT_OPTIONS, isPlainObject(options) && options)\r\n \r\n this.init()\r\n }\r\n\r\n init() {\r\n const { element, options } = this\r\n const { src } = options\r\n\r\n if (element[NAME]) return;\r\n\r\n element[NAME] = this\r\n\r\n const source = options.src = isString(src) || isImg(src) ? src : DEFAULT_OPTIONS.src\r\n const url = isImg(source) ? source.src : element.getAttribute(source)\r\n\r\n if (!url) throw new Error(`Cannot find src from ${source}`)\r\n\r\n this.create(url)\r\n }\r\n \r\n create(url) {\r\n if (!url) return;\r\n \r\n const { options } = this\r\n \r\n this.url = url\r\n this.data = {}\r\n this.ratio = 1\r\n\r\n this.__events__ = EVENTS\r\n if (options.on) {\r\n for (const [k, v] of Object.entries(options.on)) {\r\n this.__events__[k] = [v]\r\n }\r\n }\r\n\r\n this.mount()\r\n }\r\n \r\n mount() {\r\n if (this.mounted) return;\r\n\r\n const { element, options, data, url } = this\r\n const { fill, maxRatio, height } = options\r\n \r\n if (this.wrapper) this.wrapper.remove()\r\n\r\n const wrapper = document.createElement('div')\r\n wrapper.classList.add(CLASS_WRAPPER)\r\n \r\n const image = document.createElement('img')\r\n image.classList.add(CLASS_IMAGE)\r\n image.src = url\r\n \r\n image.onload = () => {\r\n this.wrapper = wrapper\r\n this.image = image\r\n \r\n const { naturalWidth, naturalHeight } = image\r\n const imageRatio = naturalWidth / naturalHeight\r\n \r\n // set container height\r\n if (height) {\r\n setStyle(element, { width: '100%' })\r\n if (height === 'auto') setStyle(element, { paddingBottom: `${roundToTwo(naturalHeight / naturalWidth * 100)}%` })\r\n else if (isNumber(height)) setStyle(element, { height: height })\r\n else if (isPercentage(height)) setStyle(element, { paddingBottom: height })\r\n }\r\n \r\n const { offsetWidth, offsetHeight } = element\r\n this.data.containerData = {\r\n width: offsetWidth,\r\n height: offsetHeight,\r\n aspectRatio: offsetWidth / offsetHeight,\r\n }\r\n\r\n // get base on width or height\r\n const { containerData } = data\r\n let baseSide\r\n if (fill !== 'cover' && fill !== 'contain' && fill !== 'none') options.fill = 'cover'\r\n if (options.fill !== 'contain') baseSide = containerData.aspectRatio === imageRatio ? 'both' : containerData.aspectRatio > imageRatio ? 'width' : 'height'\r\n if (options.fill === 'contain') baseSide = containerData.aspectRatio === imageRatio ? 'both' : containerData.aspectRatio > imageRatio ? 'height' : 'width'\r\n \r\n // calculate the image width, height, left, top\r\n const imageWidth = options.fill === 'none' ? naturalWidth : baseSide === 'both' || baseSide === 'width' ? containerData.width : containerData.height * imageRatio\r\n const imageHeight = options.fill === 'none' ? naturalHeight : baseSide === 'both' || baseSide === 'height' ? containerData.height : containerData.width / imageRatio\r\n const imageLeft = (containerData.width - imageWidth) / 2\r\n const imageTop = (containerData.height - imageHeight) / 2\r\n\r\n this.data.originImageData = {\r\n naturalWidth,\r\n naturalHeight,\r\n aspectRatio: imageRatio,\r\n width: imageWidth,\r\n height: imageHeight,\r\n left: imageLeft,\r\n top: imageTop\r\n }\r\n this.data.imageData = Object.assign({}, this.data.originImageData)\r\n \r\n setStyle(image, {\r\n width: imageWidth,\r\n height: imageHeight,\r\n left: imageLeft,\r\n top: imageTop,\r\n })\r\n\r\n // if has maxRatio\r\n if (( !isNumber(maxRatio) || maxRatio <= 1 ) && maxRatio !== false) options.maxRatio = false\r\n\r\n bindEvents(this)\r\n \r\n this.mounted = true\r\n \r\n this.render()\r\n }\r\n }\r\n\r\n render() {\r\n const { element, wrapper, image } = this\r\n\r\n element.classList.add(CLASS_CONTAINER)\r\n\r\n wrapper.append(image)\r\n element.append(wrapper)\r\n\r\n this.createModules()\r\n\r\n this.emit('ready')\r\n }\r\n}\r\n\r\nObject.assign(Zoomist.prototype, METHODS, MODULES)\r\n\r\nexport default Zoomist","import './scss/index.scss'\r\nimport Zoomist from './js/zoomist'\r\n\r\nexport default Zoomist","import Zoomist from 'zoomist'\r\n\r\nimport Lightbox from 'Feature/Lightbox/Code/Scripts/Lightbox/lightbox';\r\nimport getRandomNumberInRange from \"General/global-js/randomNumber\";\r\nimport('Foundation/Common/code/Scripts/Events/ResizeEndEvent');\r\n\r\nimport(/* webpackChunkName: \"imageZoom\" */ '../Styles/imageZoom.scss');\r\n\r\nwindow.am = window.am || {};\r\n\r\nwindow.am.imageZoom = new function () {\r\n let maxWidthMobile = 768;\r\n let maxWidthTablet = 1024;\r\n let zoomistOptions = {\r\n zoomRatio: 0.5,\r\n zoomRatioMax: 4.0,\r\n };\r\n\r\n this.init = () => {\r\n let imageElements = document.querySelectorAll('img[data-image-zoom]:not([data-image-zoom=\"\"]), [data-image-zoom]:not([data-image-zoom=\"\"]) img');\r\n\r\n imageElements.forEach((image) => {\r\n let options = parseOptions(image);\r\n if (!options) {\r\n return;\r\n }\r\n\r\n let lightboxId = prepareLightbox(image, options);\r\n if (!lightboxId) {\r\n return;\r\n }\r\n\r\n let zoomist;\r\n let lightboxContainer = document.querySelector(`.lightbox-overlay-container[data-id=\"${lightboxId}\"]`);\r\n let imageInContainer = lightboxContainer.querySelector('.lightbox-content [data-zoomist-src]');\r\n \r\n let initZoomist = () => {\r\n if (zoomist) {\r\n zoomist.destroy();\r\n }\r\n \r\n zoomist = new Zoomist(imageInContainer, {\r\n // zoom Ratio\r\n zoomRatio: zoomistOptions.zoomRatio,\r\n // max zoom ratio\r\n maxRatio: zoomistOptions.zoomRatioMax,\r\n // height of the zoomist view\r\n height: calcZoomistHeight(),\r\n // if you need silder\r\n slider: false,\r\n // if you need zoomer\r\n zoomer: false,\r\n // if image can be drag out of bounds or not\r\n bounds: false,\r\n });\r\n };\r\n\r\n let destroyZoomist = () => {\r\n if (zoomist) {\r\n zoomist.destroy();\r\n }\r\n zoomist = null;\r\n };\r\n\r\n let calcZoomistHeight = () => {\r\n let zoomistHeight;\r\n let lightboxOverlayMarginMobile = 32;\r\n let lightboxOverlayMarginDesktop = 64;\r\n let isMobile = window.innerWidth < maxWidthMobile;\r\n let isDesktop = window.innerWidth > maxWidthTablet;\r\n let baseHeight = isMobile ? 1080 : 1920;\r\n let lightboxOverlayHeight = 0;\r\n lightboxOverlayHeight += lightboxContainer.querySelector('.overlay-header').offsetHeight;\r\n lightboxOverlayHeight += lightboxContainer.querySelector('.action-area').offsetHeight;\r\n\r\n if (window.innerHeight >= baseHeight) {\r\n zoomistHeight = baseHeight - lightboxOverlayHeight;\r\n } else {\r\n zoomistHeight = window.innerHeight - lightboxOverlayHeight;\r\n }\r\n\r\n zoomistHeight -= isDesktop ? lightboxOverlayMarginDesktop : lightboxOverlayMarginMobile;\r\n\r\n return zoomistHeight;\r\n };\r\n\r\n // set events\r\n window.addEventListener('resizeEnd', initZoomist);\r\n window.addEventListener(\"orientationchange\", initZoomist);\r\n lightboxContainer.addEventListener('show', initZoomist);\r\n lightboxContainer.addEventListener('hide', destroyZoomist);\r\n \r\n let zoomOutButton = lightboxContainer.querySelector('.icon.icons-minus');\r\n let zoomInButton = lightboxContainer.querySelector('.icon.icons-hinzufuegen');\r\n\r\n zoomOutButton.addEventListener('click', () => {\r\n zoomist.zoom(-zoomistOptions.zoomRatio);\r\n });\r\n zoomOutButton.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n case 'Enter':\r\n case 'Space':\r\n case ' ':\r\n e.preventDefault();\r\n zoomist.zoom(-zoomistOptions.zoomRatio);\r\n break;\r\n }\r\n });\r\n \r\n zoomInButton.addEventListener('click', () => {\r\n zoomist.zoom(zoomistOptions.zoomRatio);\r\n });\r\n zoomInButton.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n case 'Enter':\r\n case 'Space':\r\n case ' ':\r\n e.preventDefault();\r\n zoomist.zoom(zoomistOptions.zoomRatio);\r\n break;\r\n case 'Tab':\r\n e.preventDefault();\r\n lightboxContainer.querySelector('.lightbox-close-button').focus();\r\n break;\r\n }\r\n });\r\n });\r\n\r\n Lightbox.init();\r\n };\r\n\r\n let parseOptions = (image) => {\r\n try {\r\n if (image.dataset.imageZoom) {\r\n return JSON.parse(image.dataset.imageZoom); \r\n } else {\r\n let optionsElement = image.closest('[data-image-zoom]:not([data-image-zoom=\"\"]');\r\n\r\n return JSON.parse(optionsElement.dataset.imageZoom);\r\n }\r\n } catch (error) {\r\n console.error('imageZoom: initialization error: exception on options parse', error, image, optionsElement);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n let prepareLightbox = (image, options) => {\r\n\r\n // add icon to image\r\n let imageIconContainer = document.createElement('div');\r\n imageIconContainer.classList.add('zoom-container');\r\n image.parentNode.insertBefore(imageIconContainer, image.nextSibling)\r\n\r\n let imageIcon = document.createElement('span');\r\n imageIcon.classList.add('icon');\r\n imageIcon.classList.add('icons-suchen');\r\n imageIcon.classList.add('image-zoom-click-icon');\r\n imageIconContainer.appendChild(imageIcon);\r\n\r\n // no lightbox for experience editor\r\n if (image.closest('[sc-part-of=\"placeholder rendering\"]')) {\r\n return null;\r\n }\r\n\r\n // create random id for a temp lightbox-overlay-container\r\n let lightboxId = getRandomNumberInRange(0, 10000);\r\n\r\n // prepare source image\r\n image.setAttribute('target', '_lightbox');\r\n image.setAttribute('data-lightbox-id', lightboxId);\r\n image.setAttribute('tabindex', '0');\r\n image.classList.add('focus-effect');\r\n\r\n imageIcon.addEventListener('click', () => image.click());\r\n\r\n // build actual lightbox html\r\n let lightboxContainer = document.createElement('div');\r\n if (document.querySelector('body.lottery-page')) {\r\n lightboxContainer.innerHTML = `
\r\n
\r\n
\r\n
${options.Caption}
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
${options.MobileZoomHint}
\r\n ${options.Caption.length && options.DownloadUrl.length ? `
` : ''}\r\n
\r\n
Du kannst das Motiv über das Icon rechts herunterladen.
\r\n
Du kannst das Motiv über die Icons rechts vergrößern, verkleinern und herunterladen.
\r\n
\r\n ${options.DownloadUrl.length ? `` : ''}\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
`;\r\n }\r\n else {\r\n lightboxContainer.innerHTML = `
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
${options.MobileZoomHint}
\r\n ${options.Caption.length && options.DownloadUrl.length ? `
` : ''}\r\n
\r\n
${options.Caption}
\r\n
\r\n ${options.DownloadUrl.length ? `` : ''}\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
`;\r\n }\r\n \r\n\r\n document.querySelector('main')\r\n .appendChild(lightboxContainer);\r\n\r\n return lightboxId;\r\n };\r\n};\r\n\r\nwindow.addEventListener('load', window.am.imageZoom.init);"],"names":["Lightbox","that","this","init","setLightboxContentContainerToBody","aTags","document","querySelectorAll","forEach","item","lightboxId","getAttribute","lightBoxDiv","querySelector","openLightbox","e","currentTag","target","blur","preventDefault","stopPropagation","stopImmediatePropagation","classList","add","showEvent","Event","dispatchEvent","videoPlayer","element","controls","videoContainer","style","window","getComputedStyle","el","currentStyle","bottomVal","parseFloat","bottom","heightVal","height","isNaN","marginBottom","removeProperty","adjustPlayerHeight","lightboxCloseButton","lightboxOverlay","lightboxContent","isInOverlayMousedown","preventScrollFunc","keycode","which","overflow","setAttribute","innerWidth","focus","dataset","eventsInitialized","addEventListener","contains","closeLightbox","keyCode","key","closeButton","lightbox","opener","tracker","playButton","remove","click","hideEvent","removeEventListener","lightboxContentContainer","body","lightboxIds","container","dataId","includes","push","append","am","minValue","maxValue","Error","randomArray","Uint32Array","crypto","getRandomValues","range","NAME","MODULES","CLASS_CONTAINER","CLASS_WRAPPER","CLASS_IMAGE","CLASS_SLIDER","CLASS_SLIDER_MAIN","CLASS_SLIDER_BAR","CLASS_SLIDER_BUTTON","CLASS_ZOOMER","CLASS_ZOOMER_IN","CLASS_ZOOMER_OUT","CLASS_ZOOMER_DISABLE","IS_TOUCH","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","fill","src","draggable","wheelable","pinchable","bounds","zoomRatio","maxRatio","DEFAULT_SLIDER_OPTIONS","direction","DEFAULT_ZOOMER_OPTIONS","inEl","outEl","disableOnBounds","EVENTS","ready","zoom","wheel","dragStart","drag","dragEnd","pinchStart","pinch","pinchEnd","slideStart","slide","slideEnd","resize","reset","destroy","update","setObject","obj","value","k","v","Object","entries","getNewObject","assign","isNumber","isElementExist","getElement","HTMLElement","isImg","tagName","isFunction","setStyle","getPointer","event","isNotTouch","type","x","pageX","touches","y","pageY","clientX","clientY","getTransformX","transform","mat","match","split","getTransformY","roundToTwo","Math","round","minmax","min","max","getContainerData","data","containerData","getImageData","imageData","getSliderValue","__modules__","slider","getZoomRatio","ratio","pointer","image","options","originImageData","imageRect","getBoundingClientRect","calcRatio","newRatio","newZoomRatio","newWidth","width","newHeight","newLeft","newTop","distanceX","left","distanceY","top","transformX","transformY","newData","emit","ratioPercentage","slideTo","zoomer","zoomerInEl","zoomerOutEl","zoomTo","move","dragData","transX","transY","calcTransX","calcTransY","newTransX","newTransY","moveTo","abs","onlySlide","position","symbol","distance","sliderButton","percentage","minRatio","wrapper","undefined","mounted","destroySlider","destroyZoomer","on","events","handler","__events__","evt","args","slice","length","apply","zoomist","offsetWidth","widthRatio","heightRatio","offsetHeight","originImageWidth","originImageHeight","originImageLeft","originImageTop","imageWidth","imageHeight","imageLeft","imageTop","dragging","startX","startY","dragMove","isPinch","minPageX","maxPageX","minPageY","maxPageY","pinching","pinchData","dist","pinchMove","pinchDist","hypot","wheeling","delta","setTimeout","deltaY","wheelDelta","detail","sliderTemp","createModules","module","charAt","toUpperCase","createSlider","sliderMain","isCustomEl","sliderEl","createElement","innerHTML","sliderBar","sliding","isHorizontal","slideHandler","rect","mousePoint","sliderTotal","sliderStart","slideMove","sliderEvents","createZoomer","zoomerEl","isCustomInEl","isCustomOutEl","zoomInHandler","zoomOutHandler","zoomerEvents","unbindZoomer","Zoomist","constructor","isObject","prototype","hasOwnProperty","call","error","isPlainObject","source","url","create","mount","onload","naturalWidth","naturalHeight","imageRatio","paddingBottom","indexOf","aspectRatio","baseSide","render","imageZoom","zoomistOptions","parseOptions","prepareLightbox","lightboxContainer","imageInContainer","initZoomist","calcZoomistHeight","zoomistHeight","isMobile","isDesktop","baseHeight","lightboxOverlayHeight","innerHeight","zoomOutButton","zoomInButton","JSON","parse","optionsElement","closest","console","imageIconContainer","parentNode","insertBefore","nextSibling","imageIcon","appendChild","getRandomNumberInRange","Caption","CloseButtonAriaLabel","ImageUrl","MobileZoomHint","DownloadUrl","DownloadButtonAriaLabel","ZoomOutButtonAriaLabel","ZoomInButtonAriaLabel"],"sourceRoot":""}