| | |
| | | /*! medium-zoom 1.0.5 | MIT License | https://github.com/francoischalifour/medium-zoom */ |
| | | (function(global, factory) { |
| | | typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = global || self, |
| | | global.mediumZoom = factory()); |
| | | })(this, function() { |
| | | (function (global, factory) { |
| | | typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = global || self, |
| | | global.mediumZoom = factory()); |
| | | })(this, function () { |
| | | "use strict"; |
| | | var _extends = Object.assign || function(target) { |
| | | for (var i = 1; i < arguments.length; i++) { |
| | | var source = arguments[i]; |
| | | for (var key in source) { |
| | | if (Object.prototype.hasOwnProperty.call(source, key)) { |
| | | target[key] = source[key]; |
| | | } |
| | | var _extends = Object.assign || function (target) { |
| | | for (var i = 1; i < arguments.length; i++) { |
| | | var source = arguments[i]; |
| | | for (var key in source) { |
| | | if (Object.prototype.hasOwnProperty.call(source, key)) { |
| | | target[key] = source[key]; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return target; |
| | | return target; |
| | | }; |
| | | var isSupported = function isSupported(node) { |
| | | return node.tagName === "IMG"; |
| | | return node.tagName === "IMG"; |
| | | }; |
| | | var isNodeList = function isNodeList(selector) { |
| | | return NodeList.prototype.isPrototypeOf(selector); |
| | | return NodeList.prototype.isPrototypeOf(selector); |
| | | }; |
| | | var isNode = function isNode(selector) { |
| | | return selector && selector.nodeType === 1; |
| | | return selector && selector.nodeType === 1; |
| | | }; |
| | | var isSvg = function isSvg(image) { |
| | | var source = image.currentSrc || image.src; |
| | | return source.substr(-4).toLowerCase() === ".svg"; |
| | | var source = image.currentSrc || image.src; |
| | | return source.substr(-4).toLowerCase() === ".svg"; |
| | | }; |
| | | var getImagesFromSelector = function getImagesFromSelector(selector) { |
| | | try { |
| | | if (Array.isArray(selector)) { |
| | | return selector.filter(isSupported); |
| | | try { |
| | | if (Array.isArray(selector)) { |
| | | return selector.filter(isSupported); |
| | | } |
| | | if (isNodeList(selector)) { |
| | | return [].slice.call(selector).filter(isSupported); |
| | | } |
| | | if (isNode(selector)) { |
| | | return [selector].filter(isSupported); |
| | | } |
| | | if (typeof selector === "string") { |
| | | return [].slice.call(document.querySelectorAll(selector)).filter(isSupported); |
| | | } |
| | | return []; |
| | | } catch (err) { |
| | | throw new TypeError("The provided selector is invalid.\n" + "Expects a CSS selector, a Node element, a NodeList or an array.\n" + "See: https://github.com/francoischalifour/medium-zoom"); |
| | | } |
| | | if (isNodeList(selector)) { |
| | | return [].slice.call(selector).filter(isSupported); |
| | | } |
| | | if (isNode(selector)) { |
| | | return [ selector ].filter(isSupported); |
| | | } |
| | | if (typeof selector === "string") { |
| | | return [].slice.call(document.querySelectorAll(selector)).filter(isSupported); |
| | | } |
| | | return []; |
| | | } catch (err) { |
| | | throw new TypeError("The provided selector is invalid.\n" + "Expects a CSS selector, a Node element, a NodeList or an array.\n" + "See: https://github.com/francoischalifour/medium-zoom"); |
| | | } |
| | | }; |
| | | var createOverlay = function createOverlay() { |
| | | var overlay = document.createElement("div"); |
| | | overlay.classList.add("medium-zoom-overlay"); |
| | | return overlay; |
| | | var overlay = document.createElement("div"); |
| | | overlay.classList.add("medium-zoom-overlay"); |
| | | return overlay; |
| | | }; |
| | | var cloneTarget = function cloneTarget(template) { |
| | | var _template$getBounding = template.getBoundingClientRect(), top = _template$getBounding.top, left = _template$getBounding.left, width = _template$getBounding.width, height = _template$getBounding.height; |
| | | var clone = template.cloneNode(); |
| | | var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; |
| | | clone.removeAttribute("id"); |
| | | clone.style.position = "absolute"; |
| | | clone.style.top = top + scrollTop + "px"; |
| | | clone.style.left = left + scrollLeft + "px"; |
| | | clone.style.width = width + "px"; |
| | | clone.style.height = height + "px"; |
| | | clone.style.transform = ""; |
| | | return clone; |
| | | var _template$getBounding = template.getBoundingClientRect(), top = _template$getBounding.top, |
| | | left = _template$getBounding.left, width = _template$getBounding.width, |
| | | height = _template$getBounding.height; |
| | | var clone = template.cloneNode(); |
| | | var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; |
| | | clone.removeAttribute("id"); |
| | | clone.style.position = "absolute"; |
| | | clone.style.top = top + scrollTop + "px"; |
| | | clone.style.left = left + scrollLeft + "px"; |
| | | clone.style.width = width + "px"; |
| | | clone.style.height = height + "px"; |
| | | clone.style.transform = ""; |
| | | return clone; |
| | | }; |
| | | var createCustomEvent = function createCustomEvent(type, params) { |
| | | var eventParams = _extends({ |
| | | bubbles: false, |
| | | cancelable: false, |
| | | detail: undefined |
| | | }, params); |
| | | if (typeof window.CustomEvent === "function") { |
| | | return new CustomEvent(type, eventParams); |
| | | } |
| | | var customEvent = document.createEvent("CustomEvent"); |
| | | customEvent.initCustomEvent(type, eventParams.bubbles, eventParams.cancelable, eventParams.detail); |
| | | return customEvent; |
| | | var eventParams = _extends({ |
| | | bubbles: false, |
| | | cancelable: false, |
| | | detail: undefined |
| | | }, params); |
| | | if (typeof window.CustomEvent === "function") { |
| | | return new CustomEvent(type, eventParams); |
| | | } |
| | | var customEvent = document.createEvent("CustomEvent"); |
| | | customEvent.initCustomEvent(type, eventParams.bubbles, eventParams.cancelable, eventParams.detail); |
| | | return customEvent; |
| | | }; |
| | | var mediumZoom = function mediumZoom(selector) { |
| | | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| | | var Promise = window.Promise || function Promise(fn) { |
| | | function noop() {} |
| | | fn(noop, noop); |
| | | }; |
| | | var _handleClick = function _handleClick(event) { |
| | | var target = event.target; |
| | | if (target === overlay) { |
| | | close(); |
| | | return; |
| | | } |
| | | if (images.indexOf(target) === -1) { |
| | | return; |
| | | } |
| | | toggle({ |
| | | target: target |
| | | }); |
| | | }; |
| | | var _handleScroll = function _handleScroll() { |
| | | if (isAnimating || !active.original) { |
| | | return; |
| | | } |
| | | var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | if (Math.abs(scrollTop - currentScroll) > zoomOptions.scrollOffset) { |
| | | setTimeout(close, 150); |
| | | } |
| | | }; |
| | | var _handleKeyUp = function _handleKeyUp(event) { |
| | | var key = event.key || event.keyCode; |
| | | if (key === "Escape" || key === "Esc" || key === 27) { |
| | | close(); |
| | | } |
| | | }; |
| | | var update = function update() { |
| | | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
| | | var newOptions = options; |
| | | if (options.container && options.container instanceof Object) { |
| | | newOptions.container = _extends({}, zoomOptions.container, options.container); |
| | | } |
| | | if (options.template) { |
| | | var template = isNode(options.template) ? options.template : document.querySelector(options.template); |
| | | newOptions.template = template; |
| | | } |
| | | zoomOptions = _extends({}, zoomOptions, newOptions); |
| | | images.forEach(function(image) { |
| | | image.dispatchEvent(createCustomEvent("medium-zoom:update", { |
| | | detail: { |
| | | zoom: zoom |
| | | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| | | var Promise = window.Promise || function Promise(fn) { |
| | | function noop() { |
| | | } |
| | | })); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var clone = function clone() { |
| | | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
| | | return mediumZoom(_extends({}, zoomOptions, options)); |
| | | }; |
| | | var attach = function attach() { |
| | | for (var _len = arguments.length, selectors = Array(_len), _key = 0; _key < _len; _key++) { |
| | | selectors[_key] = arguments[_key]; |
| | | } |
| | | var newImages = selectors.reduce(function(imagesAccumulator, currentSelector) { |
| | | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); |
| | | }, []); |
| | | newImages.filter(function(newImage) { |
| | | return images.indexOf(newImage) === -1; |
| | | }).forEach(function(newImage) { |
| | | images.push(newImage); |
| | | newImage.classList.add("medium-zoom-image"); |
| | | }); |
| | | eventListeners.forEach(function(_ref) { |
| | | var type = _ref.type, listener = _ref.listener, options = _ref.options; |
| | | newImages.forEach(function(image) { |
| | | image.addEventListener(type, listener, options); |
| | | }); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var detach = function detach() { |
| | | for (var _len2 = arguments.length, selectors = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
| | | selectors[_key2] = arguments[_key2]; |
| | | } |
| | | if (active.zoomed) { |
| | | close(); |
| | | } |
| | | var imagesToDetach = selectors.length > 0 ? selectors.reduce(function(imagesAccumulator, currentSelector) { |
| | | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); |
| | | }, []) : images; |
| | | imagesToDetach.forEach(function(image) { |
| | | image.classList.remove("medium-zoom-image"); |
| | | image.dispatchEvent(createCustomEvent("medium-zoom:detach", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | }); |
| | | images = images.filter(function(image) { |
| | | return imagesToDetach.indexOf(image) === -1; |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var on = function on(type, listener) { |
| | | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
| | | images.forEach(function(image) { |
| | | image.addEventListener("medium-zoom:" + type, listener, options); |
| | | }); |
| | | eventListeners.push({ |
| | | type: "medium-zoom:" + type, |
| | | listener: listener, |
| | | options: options |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var off = function off(type, listener) { |
| | | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
| | | images.forEach(function(image) { |
| | | image.removeEventListener("medium-zoom:" + type, listener, options); |
| | | }); |
| | | eventListeners = eventListeners.filter(function(eventListener) { |
| | | return !(eventListener.type === "medium-zoom:" + type && eventListener.listener.toString() === listener.toString()); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var open = function open() { |
| | | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref2.target; |
| | | var _animate = function _animate() { |
| | | var container = { |
| | | width: document.documentElement.clientWidth, |
| | | height: document.documentElement.clientHeight, |
| | | left: 0, |
| | | top: 0, |
| | | right: 0, |
| | | bottom: 0 |
| | | }; |
| | | var viewportWidth = void 0; |
| | | var viewportHeight = void 0; |
| | | if (zoomOptions.container) { |
| | | if (zoomOptions.container instanceof Object) { |
| | | container = _extends({}, container, zoomOptions.container); |
| | | viewportWidth = container.width - container.left - container.right - zoomOptions.margin * 2; |
| | | viewportHeight = container.height - container.top - container.bottom - zoomOptions.margin * 2; |
| | | } else { |
| | | var zoomContainer = isNode(zoomOptions.container) ? zoomOptions.container : document.querySelector(zoomOptions.container); |
| | | var _zoomContainer$getBou = zoomContainer.getBoundingClientRect(), _width = _zoomContainer$getBou.width, _height = _zoomContainer$getBou.height, _left = _zoomContainer$getBou.left, _top = _zoomContainer$getBou.top; |
| | | container = _extends({}, container, { |
| | | width: _width, |
| | | height: _height, |
| | | left: _left, |
| | | top: _top |
| | | }); |
| | | } |
| | | } |
| | | viewportWidth = viewportWidth || container.width - zoomOptions.margin * 2; |
| | | viewportHeight = viewportHeight || container.height - zoomOptions.margin * 2; |
| | | var zoomTarget = active.zoomedHd || active.original; |
| | | var naturalWidth = isSvg(zoomTarget) ? viewportWidth : zoomTarget.naturalWidth || viewportWidth; |
| | | var naturalHeight = isSvg(zoomTarget) ? viewportHeight : zoomTarget.naturalHeight || viewportHeight; |
| | | var _zoomTarget$getBoundi = zoomTarget.getBoundingClientRect(), top = _zoomTarget$getBoundi.top, left = _zoomTarget$getBoundi.left, width = _zoomTarget$getBoundi.width, height = _zoomTarget$getBoundi.height; |
| | | var scaleX = Math.min(naturalWidth, viewportWidth) / width; |
| | | var scaleY = Math.min(naturalHeight, viewportHeight) / height; |
| | | var scale = Math.min(scaleX, scaleY); |
| | | var translateX = (-left + (viewportWidth - width) / 2 + zoomOptions.margin + container.left) / scale; |
| | | var translateY = (-top + (viewportHeight - height) / 2 + zoomOptions.margin + container.top) / scale; |
| | | var transform = "scale(" + scale + ") translate3d(" + translateX + "px, " + translateY + "px, 0)"; |
| | | active.zoomed.style.transform = transform; |
| | | if (active.zoomedHd) { |
| | | active.zoomedHd.style.transform = transform; |
| | | } |
| | | |
| | | fn(noop, noop); |
| | | }; |
| | | return new Promise(function(resolve) { |
| | | if (target && images.indexOf(target) === -1) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | var _handleOpenEnd = function _handleOpenEnd() { |
| | | isAnimating = false; |
| | | active.zoomed.removeEventListener("transitionend", _handleOpenEnd); |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:opened", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | resolve(zoom); |
| | | }; |
| | | if (active.zoomed) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | if (target) { |
| | | active.original = target; |
| | | } else if (images.length > 0) { |
| | | var _images = images; |
| | | active.original = _images[0]; |
| | | } else { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:open", { |
| | | detail: { |
| | | zoom: zoom |
| | | var _handleClick = function _handleClick(event) { |
| | | var target = event.target; |
| | | if (target === overlay) { |
| | | close(); |
| | | return; |
| | | } |
| | | })); |
| | | scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | isAnimating = true; |
| | | active.zoomed = cloneTarget(active.original); |
| | | document.body.appendChild(overlay); |
| | | if (zoomOptions.template) { |
| | | var template = isNode(zoomOptions.template) ? zoomOptions.template : document.querySelector(zoomOptions.template); |
| | | active.template = document.createElement("div"); |
| | | active.template.appendChild(template.content.cloneNode(true)); |
| | | document.body.appendChild(active.template); |
| | | } |
| | | document.body.appendChild(active.zoomed); |
| | | window.requestAnimationFrame(function() { |
| | | document.body.classList.add("medium-zoom--opened"); |
| | | }); |
| | | active.original.classList.add("medium-zoom-image--hidden"); |
| | | active.zoomed.classList.add("medium-zoom-image--opened"); |
| | | active.zoomed.addEventListener("click", close); |
| | | active.zoomed.addEventListener("transitionend", _handleOpenEnd); |
| | | if (active.original.getAttribute("data-zoom-src")) { |
| | | active.zoomedHd = active.zoomed.cloneNode(); |
| | | active.zoomedHd.removeAttribute("srcset"); |
| | | active.zoomedHd.removeAttribute("sizes"); |
| | | active.zoomedHd.src = active.zoomed.getAttribute("data-zoom-src"); |
| | | active.zoomedHd.onerror = function() { |
| | | clearInterval(getZoomTargetSize); |
| | | console.warn("Unable to reach the zoom image target " + active.zoomedHd.src); |
| | | active.zoomedHd = null; |
| | | _animate(); |
| | | }; |
| | | var getZoomTargetSize = setInterval(function() { |
| | | if (active.zoomedHd.complete) { |
| | | clearInterval(getZoomTargetSize); |
| | | active.zoomedHd.classList.add("medium-zoom-image--opened"); |
| | | active.zoomedHd.addEventListener("click", close); |
| | | document.body.appendChild(active.zoomedHd); |
| | | _animate(); |
| | | } |
| | | }, 10); |
| | | } else if (active.original.hasAttribute("srcset")) { |
| | | active.zoomedHd = active.zoomed.cloneNode(); |
| | | active.zoomedHd.removeAttribute("sizes"); |
| | | var loadEventListener = active.zoomedHd.addEventListener("load", function() { |
| | | active.zoomedHd.removeEventListener("load", loadEventListener); |
| | | active.zoomedHd.classList.add("medium-zoom-image--opened"); |
| | | active.zoomedHd.addEventListener("click", close); |
| | | document.body.appendChild(active.zoomedHd); |
| | | _animate(); |
| | | if (images.indexOf(target) === -1) { |
| | | return; |
| | | } |
| | | toggle({ |
| | | target: target |
| | | }); |
| | | } else { |
| | | _animate(); |
| | | } |
| | | }); |
| | | }; |
| | | var close = function close() { |
| | | return new Promise(function(resolve) { |
| | | if (isAnimating || !active.original) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | var _handleCloseEnd = function _handleCloseEnd() { |
| | | active.original.classList.remove("medium-zoom-image--hidden"); |
| | | document.body.removeChild(active.zoomed); |
| | | if (active.zoomedHd) { |
| | | document.body.removeChild(active.zoomedHd); |
| | | }; |
| | | var _handleScroll = function _handleScroll() { |
| | | if (isAnimating || !active.original) { |
| | | return; |
| | | } |
| | | document.body.removeChild(overlay); |
| | | active.zoomed.classList.remove("medium-zoom-image--opened"); |
| | | if (active.template) { |
| | | document.body.removeChild(active.template); |
| | | var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | if (Math.abs(scrollTop - currentScroll) > zoomOptions.scrollOffset) { |
| | | setTimeout(close, 150); |
| | | } |
| | | isAnimating = false; |
| | | active.zoomed.removeEventListener("transitionend", _handleCloseEnd); |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:closed", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | active.original = null; |
| | | active.zoomed = null; |
| | | active.zoomedHd = null; |
| | | active.template = null; |
| | | resolve(zoom); |
| | | }; |
| | | isAnimating = true; |
| | | document.body.classList.remove("medium-zoom--opened"); |
| | | active.zoomed.style.transform = ""; |
| | | if (active.zoomedHd) { |
| | | active.zoomedHd.style.transform = ""; |
| | | } |
| | | if (active.template) { |
| | | active.template.style.transition = "opacity 150ms"; |
| | | active.template.style.opacity = 0; |
| | | } |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:close", { |
| | | detail: { |
| | | zoom: zoom |
| | | }; |
| | | var _handleKeyUp = function _handleKeyUp(event) { |
| | | var key = event.key || event.keyCode; |
| | | if (key === "Escape" || key === "Esc" || key === 27) { |
| | | close(); |
| | | } |
| | | })); |
| | | active.zoomed.addEventListener("transitionend", _handleCloseEnd); |
| | | }); |
| | | }; |
| | | var toggle = function toggle() { |
| | | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref3.target; |
| | | if (active.original) { |
| | | return close(); |
| | | }; |
| | | var update = function update() { |
| | | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
| | | var newOptions = options; |
| | | if (options.container && options.container instanceof Object) { |
| | | newOptions.container = _extends({}, zoomOptions.container, options.container); |
| | | } |
| | | if (options.template) { |
| | | var template = isNode(options.template) ? options.template : document.querySelector(options.template); |
| | | newOptions.template = template; |
| | | } |
| | | zoomOptions = _extends({}, zoomOptions, newOptions); |
| | | images.forEach(function (image) { |
| | | image.dispatchEvent(createCustomEvent("medium-zoom:update", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var clone = function clone() { |
| | | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
| | | return mediumZoom(_extends({}, zoomOptions, options)); |
| | | }; |
| | | var attach = function attach() { |
| | | for (var _len = arguments.length, selectors = Array(_len), _key = 0; _key < _len; _key++) { |
| | | selectors[_key] = arguments[_key]; |
| | | } |
| | | var newImages = selectors.reduce(function (imagesAccumulator, currentSelector) { |
| | | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); |
| | | }, []); |
| | | newImages.filter(function (newImage) { |
| | | return images.indexOf(newImage) === -1; |
| | | }).forEach(function (newImage) { |
| | | images.push(newImage); |
| | | newImage.classList.add("medium-zoom-image"); |
| | | }); |
| | | eventListeners.forEach(function (_ref) { |
| | | var type = _ref.type, listener = _ref.listener, options = _ref.options; |
| | | newImages.forEach(function (image) { |
| | | image.addEventListener(type, listener, options); |
| | | }); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var detach = function detach() { |
| | | for (var _len2 = arguments.length, selectors = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
| | | selectors[_key2] = arguments[_key2]; |
| | | } |
| | | if (active.zoomed) { |
| | | close(); |
| | | } |
| | | var imagesToDetach = selectors.length > 0 ? selectors.reduce(function (imagesAccumulator, currentSelector) { |
| | | return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector)); |
| | | }, []) : images; |
| | | imagesToDetach.forEach(function (image) { |
| | | image.classList.remove("medium-zoom-image"); |
| | | image.dispatchEvent(createCustomEvent("medium-zoom:detach", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | }); |
| | | images = images.filter(function (image) { |
| | | return imagesToDetach.indexOf(image) === -1; |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var on = function on(type, listener) { |
| | | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
| | | images.forEach(function (image) { |
| | | image.addEventListener("medium-zoom:" + type, listener, options); |
| | | }); |
| | | eventListeners.push({ |
| | | type: "medium-zoom:" + type, |
| | | listener: listener, |
| | | options: options |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var off = function off(type, listener) { |
| | | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
| | | images.forEach(function (image) { |
| | | image.removeEventListener("medium-zoom:" + type, listener, options); |
| | | }); |
| | | eventListeners = eventListeners.filter(function (eventListener) { |
| | | return !(eventListener.type === "medium-zoom:" + type && eventListener.listener.toString() === listener.toString()); |
| | | }); |
| | | return zoom; |
| | | }; |
| | | var open = function open() { |
| | | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref2.target; |
| | | var _animate = function _animate() { |
| | | var container = { |
| | | width: document.documentElement.clientWidth, |
| | | height: document.documentElement.clientHeight, |
| | | left: 0, |
| | | top: 0, |
| | | right: 0, |
| | | bottom: 0 |
| | | }; |
| | | var viewportWidth = void 0; |
| | | var viewportHeight = void 0; |
| | | if (zoomOptions.container) { |
| | | if (zoomOptions.container instanceof Object) { |
| | | container = _extends({}, container, zoomOptions.container); |
| | | viewportWidth = container.width - container.left - container.right - zoomOptions.margin * 2; |
| | | viewportHeight = container.height - container.top - container.bottom - zoomOptions.margin * 2; |
| | | } else { |
| | | var zoomContainer = isNode(zoomOptions.container) ? zoomOptions.container : document.querySelector(zoomOptions.container); |
| | | var _zoomContainer$getBou = zoomContainer.getBoundingClientRect(), |
| | | _width = _zoomContainer$getBou.width, _height = _zoomContainer$getBou.height, |
| | | _left = _zoomContainer$getBou.left, _top = _zoomContainer$getBou.top; |
| | | container = _extends({}, container, { |
| | | width: _width, |
| | | height: _height, |
| | | left: _left, |
| | | top: _top |
| | | }); |
| | | } |
| | | } |
| | | viewportWidth = viewportWidth || container.width - zoomOptions.margin * 2; |
| | | viewportHeight = viewportHeight || container.height - zoomOptions.margin * 2; |
| | | var zoomTarget = active.zoomedHd || active.original; |
| | | var naturalWidth = isSvg(zoomTarget) ? viewportWidth : zoomTarget.naturalWidth || viewportWidth; |
| | | var naturalHeight = isSvg(zoomTarget) ? viewportHeight : zoomTarget.naturalHeight || viewportHeight; |
| | | var _zoomTarget$getBoundi = zoomTarget.getBoundingClientRect(), top = _zoomTarget$getBoundi.top, |
| | | left = _zoomTarget$getBoundi.left, width = _zoomTarget$getBoundi.width, |
| | | height = _zoomTarget$getBoundi.height; |
| | | var scaleX = Math.min(naturalWidth, viewportWidth) / width; |
| | | var scaleY = Math.min(naturalHeight, viewportHeight) / height; |
| | | var scale = Math.min(scaleX, scaleY); |
| | | var translateX = (-left + (viewportWidth - width) / 2 + zoomOptions.margin + container.left) / scale; |
| | | var translateY = (-top + (viewportHeight - height) / 2 + zoomOptions.margin + container.top) / scale; |
| | | var transform = "scale(" + scale + ") translate3d(" + translateX + "px, " + translateY + "px, 0)"; |
| | | active.zoomed.style.transform = transform; |
| | | if (active.zoomedHd) { |
| | | active.zoomedHd.style.transform = transform; |
| | | } |
| | | }; |
| | | return new Promise(function (resolve) { |
| | | if (target && images.indexOf(target) === -1) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | var _handleOpenEnd = function _handleOpenEnd() { |
| | | isAnimating = false; |
| | | active.zoomed.removeEventListener("transitionend", _handleOpenEnd); |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:opened", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | resolve(zoom); |
| | | }; |
| | | if (active.zoomed) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | if (target) { |
| | | active.original = target; |
| | | } else if (images.length > 0) { |
| | | var _images = images; |
| | | active.original = _images[0]; |
| | | } else { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:open", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |
| | | isAnimating = true; |
| | | active.zoomed = cloneTarget(active.original); |
| | | document.body.appendChild(overlay); |
| | | if (zoomOptions.template) { |
| | | var template = isNode(zoomOptions.template) ? zoomOptions.template : document.querySelector(zoomOptions.template); |
| | | active.template = document.createElement("div"); |
| | | active.template.appendChild(template.content.cloneNode(true)); |
| | | document.body.appendChild(active.template); |
| | | } |
| | | document.body.appendChild(active.zoomed); |
| | | window.requestAnimationFrame(function () { |
| | | document.body.classList.add("medium-zoom--opened"); |
| | | }); |
| | | active.original.classList.add("medium-zoom-image--hidden"); |
| | | active.zoomed.classList.add("medium-zoom-image--opened"); |
| | | active.zoomed.addEventListener("click", close); |
| | | active.zoomed.addEventListener("transitionend", _handleOpenEnd); |
| | | if (active.original.getAttribute("data-zoom-src")) { |
| | | active.zoomedHd = active.zoomed.cloneNode(); |
| | | active.zoomedHd.removeAttribute("srcset"); |
| | | active.zoomedHd.removeAttribute("sizes"); |
| | | active.zoomedHd.src = active.zoomed.getAttribute("data-zoom-src"); |
| | | active.zoomedHd.onerror = function () { |
| | | clearInterval(getZoomTargetSize); |
| | | console.warn("Unable to reach the zoom image target " + active.zoomedHd.src); |
| | | active.zoomedHd = null; |
| | | _animate(); |
| | | }; |
| | | var getZoomTargetSize = setInterval(function () { |
| | | if (active.zoomedHd.complete) { |
| | | clearInterval(getZoomTargetSize); |
| | | active.zoomedHd.classList.add("medium-zoom-image--opened"); |
| | | active.zoomedHd.addEventListener("click", close); |
| | | document.body.appendChild(active.zoomedHd); |
| | | _animate(); |
| | | } |
| | | }, 10); |
| | | } else if (active.original.hasAttribute("srcset")) { |
| | | active.zoomedHd = active.zoomed.cloneNode(); |
| | | active.zoomedHd.removeAttribute("sizes"); |
| | | var loadEventListener = active.zoomedHd.addEventListener("load", function () { |
| | | active.zoomedHd.removeEventListener("load", loadEventListener); |
| | | active.zoomedHd.classList.add("medium-zoom-image--opened"); |
| | | active.zoomedHd.addEventListener("click", close); |
| | | document.body.appendChild(active.zoomedHd); |
| | | _animate(); |
| | | }); |
| | | } else { |
| | | _animate(); |
| | | } |
| | | }); |
| | | }; |
| | | var close = function close() { |
| | | return new Promise(function (resolve) { |
| | | if (isAnimating || !active.original) { |
| | | resolve(zoom); |
| | | return; |
| | | } |
| | | var _handleCloseEnd = function _handleCloseEnd() { |
| | | active.original.classList.remove("medium-zoom-image--hidden"); |
| | | document.body.removeChild(active.zoomed); |
| | | if (active.zoomedHd) { |
| | | document.body.removeChild(active.zoomedHd); |
| | | } |
| | | document.body.removeChild(overlay); |
| | | active.zoomed.classList.remove("medium-zoom-image--opened"); |
| | | if (active.template) { |
| | | document.body.removeChild(active.template); |
| | | } |
| | | isAnimating = false; |
| | | active.zoomed.removeEventListener("transitionend", _handleCloseEnd); |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:closed", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | active.original = null; |
| | | active.zoomed = null; |
| | | active.zoomedHd = null; |
| | | active.template = null; |
| | | resolve(zoom); |
| | | }; |
| | | isAnimating = true; |
| | | document.body.classList.remove("medium-zoom--opened"); |
| | | active.zoomed.style.transform = ""; |
| | | if (active.zoomedHd) { |
| | | active.zoomedHd.style.transform = ""; |
| | | } |
| | | if (active.template) { |
| | | active.template.style.transition = "opacity 150ms"; |
| | | active.template.style.opacity = 0; |
| | | } |
| | | active.original.dispatchEvent(createCustomEvent("medium-zoom:close", { |
| | | detail: { |
| | | zoom: zoom |
| | | } |
| | | })); |
| | | active.zoomed.addEventListener("transitionend", _handleCloseEnd); |
| | | }); |
| | | }; |
| | | var toggle = function toggle() { |
| | | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, target = _ref3.target; |
| | | if (active.original) { |
| | | return close(); |
| | | } |
| | | return open({ |
| | | target: target |
| | | }); |
| | | }; |
| | | var getOptions = function getOptions() { |
| | | return zoomOptions; |
| | | }; |
| | | var getImages = function getImages() { |
| | | return images; |
| | | }; |
| | | var getZoomedImage = function getZoomedImage() { |
| | | return active.original; |
| | | }; |
| | | var images = []; |
| | | var eventListeners = []; |
| | | var isAnimating = false; |
| | | var scrollTop = 0; |
| | | var zoomOptions = options; |
| | | var active = { |
| | | original: null, |
| | | zoomed: null, |
| | | zoomedHd: null, |
| | | template: null |
| | | }; |
| | | if (Object.prototype.toString.call(selector) === "[object Object]") { |
| | | zoomOptions = selector; |
| | | } else if (selector || typeof selector === "string") { |
| | | attach(selector); |
| | | } |
| | | return open({ |
| | | target: target |
| | | }); |
| | | }; |
| | | var getOptions = function getOptions() { |
| | | return zoomOptions; |
| | | }; |
| | | var getImages = function getImages() { |
| | | return images; |
| | | }; |
| | | var getZoomedImage = function getZoomedImage() { |
| | | return active.original; |
| | | }; |
| | | var images = []; |
| | | var eventListeners = []; |
| | | var isAnimating = false; |
| | | var scrollTop = 0; |
| | | var zoomOptions = options; |
| | | var active = { |
| | | original: null, |
| | | zoomed: null, |
| | | zoomedHd: null, |
| | | template: null |
| | | }; |
| | | if (Object.prototype.toString.call(selector) === "[object Object]") { |
| | | zoomOptions = selector; |
| | | } else if (selector || typeof selector === "string") { |
| | | attach(selector); |
| | | } |
| | | zoomOptions = _extends({ |
| | | margin: 0, |
| | | scrollOffset: 40, |
| | | container: null, |
| | | template: null |
| | | }, zoomOptions); |
| | | var overlay = createOverlay(); |
| | | document.addEventListener("click", _handleClick); |
| | | document.addEventListener("keyup", _handleKeyUp); |
| | | document.addEventListener("scroll", _handleScroll); |
| | | window.addEventListener("resize", close); |
| | | var zoom = { |
| | | open: open, |
| | | close: close, |
| | | toggle: toggle, |
| | | update: update, |
| | | clone: clone, |
| | | attach: attach, |
| | | detach: detach, |
| | | on: on, |
| | | off: off, |
| | | getOptions: getOptions, |
| | | getImages: getImages, |
| | | getZoomedImage: getZoomedImage |
| | | }; |
| | | return zoom; |
| | | zoomOptions = _extends({ |
| | | margin: 0, |
| | | scrollOffset: 40, |
| | | container: null, |
| | | template: null |
| | | }, zoomOptions); |
| | | var overlay = createOverlay(); |
| | | document.addEventListener("click", _handleClick); |
| | | document.addEventListener("keyup", _handleKeyUp); |
| | | document.addEventListener("scroll", _handleScroll); |
| | | window.addEventListener("resize", close); |
| | | var zoom = { |
| | | open: open, |
| | | close: close, |
| | | toggle: toggle, |
| | | update: update, |
| | | clone: clone, |
| | | attach: attach, |
| | | detach: detach, |
| | | on: on, |
| | | off: off, |
| | | getOptions: getOptions, |
| | | getImages: getImages, |
| | | getZoomedImage: getZoomedImage |
| | | }; |
| | | return zoom; |
| | | }; |
| | | return mediumZoom; |
| | | }); |
| | | }); |
| | | |
| | | mediumZoom(document.querySelectorAll('div.post-content img')); |
| | | mediumZoom(document.querySelectorAll('div.post-content img')); |