lightgallery
Version:
lightGallery is a feature-rich, modular JavaScript gallery plugin for building beautiful image and video galleries for the web and the mobile
891 lines • 36.5 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var lg_zoom_settings_1 = require("./lg-zoom-settings");
var lg_events_1 = require("../../lg-events");
var ZOOM_TRANSITION_DURATION = 500;
var Zoom = /** @class */ (function () {
function Zoom(instance, $LG) {
// get lightGallery core plugin instance
this.core = instance;
this.$LG = $LG;
this.settings = __assign(__assign({}, lg_zoom_settings_1.zoomSettings), this.core.settings);
return this;
}
// Append Zoom controls. Actual size, Zoom-in, Zoom-out
Zoom.prototype.buildTemplates = function () {
var zoomIcons = this.settings.showZoomInOutIcons
? "<button id=\"" + this.core.getIdName('lg-zoom-in') + "\" type=\"button\" aria-label=\"" + this.settings.zoomPluginStrings['zoomIn'] + "\" class=\"lg-zoom-in lg-icon\"></button><button id=\"" + this.core.getIdName('lg-zoom-out') + "\" type=\"button\" aria-label=\"" + this.settings.zoomPluginStrings['zoomIn'] + "\" class=\"lg-zoom-out lg-icon\"></button>"
: '';
if (this.settings.actualSize) {
zoomIcons += "<button id=\"" + this.core.getIdName('lg-actual-size') + "\" type=\"button\" aria-label=\"" + this.settings.zoomPluginStrings['viewActualSize'] + "\" class=\"" + this.settings.actualSizeIcons.zoomIn + " lg-icon\"></button>";
}
this.core.outer.addClass('lg-use-transition-for-zoom');
this.core.$toolbar.first().append(zoomIcons);
};
/**
* @desc Enable zoom option only once the image is completely loaded
* If zoomFromOrigin is true, Zoom is enabled once the dummy image has been inserted
*
* Zoom styles are defined under lg-zoomable CSS class.
*/
Zoom.prototype.enableZoom = function (event) {
var _this = this;
// delay will be 0 except first time
var _speed = this.settings.enableZoomAfter + event.detail.delay;
// set _speed value 0 if gallery opened from direct url and if it is first slide
if (this.$LG('body').first().hasClass('lg-from-hash') &&
event.detail.delay) {
// will execute only once
_speed = 0;
}
else {
// Remove lg-from-hash to enable starting animation.
this.$LG('body').first().removeClass('lg-from-hash');
}
this.zoomableTimeout = setTimeout(function () {
if (!_this.isImageSlide(_this.core.index)) {
return;
}
_this.core.getSlideItem(event.detail.index).addClass('lg-zoomable');
if (event.detail.index === _this.core.index) {
_this.setZoomEssentials();
}
}, _speed + 30);
};
Zoom.prototype.enableZoomOnSlideItemLoad = function () {
// Add zoomable class
this.core.LGel.on(lg_events_1.lGEvents.slideItemLoad + ".zoom", this.enableZoom.bind(this));
};
Zoom.prototype.getDragCords = function (e) {
return {
x: e.pageX,
y: e.pageY,
};
};
Zoom.prototype.getSwipeCords = function (e) {
var x = e.touches[0].pageX;
var y = e.touches[0].pageY;
return {
x: x,
y: y,
};
};
Zoom.prototype.getDragAllowedAxises = function (scale, scaleDiff) {
var $image = this.core
.getSlideItem(this.core.index)
.find('.lg-image')
.first()
.get();
var height = 0;
var width = 0;
var rect = $image.getBoundingClientRect();
if (scale) {
height = $image.offsetHeight * scale;
width = $image.offsetWidth * scale;
}
else if (scaleDiff) {
height = rect.height + scaleDiff * rect.height;
width = rect.width + scaleDiff * rect.width;
}
else {
height = rect.height;
width = rect.width;
}
var allowY = height > this.containerRect.height;
var allowX = width > this.containerRect.width;
return {
allowX: allowX,
allowY: allowY,
};
};
Zoom.prototype.setZoomEssentials = function () {
this.containerRect = this.core.$content.get().getBoundingClientRect();
};
/**
* @desc Image zoom
* Translate the wrap and scale the image to get better user experience
*
* @param {String} scale - Zoom decrement/increment value
*/
Zoom.prototype.zoomImage = function (scale, scaleDiff, reposition, resetToMax) {
if (Math.abs(scaleDiff) <= 0)
return;
var offsetX = this.containerRect.width / 2 + this.containerRect.left;
var offsetY = this.containerRect.height / 2 +
this.containerRect.top +
this.scrollTop;
var originalX;
var originalY;
if (scale === 1) {
this.positionChanged = false;
}
var dragAllowedAxises = this.getDragAllowedAxises(0, scaleDiff);
var allowY = dragAllowedAxises.allowY, allowX = dragAllowedAxises.allowX;
if (this.positionChanged) {
originalX = this.left / (this.scale - scaleDiff);
originalY = this.top / (this.scale - scaleDiff);
this.pageX = offsetX - originalX;
this.pageY = offsetY - originalY;
this.positionChanged = false;
}
var possibleSwipeCords = this.getPossibleSwipeDragCords(scaleDiff);
var x;
var y;
var _x = offsetX - this.pageX;
var _y = offsetY - this.pageY;
if (scale - scaleDiff > 1) {
var scaleVal = (scale - scaleDiff) / Math.abs(scaleDiff);
_x =
(scaleDiff < 0 ? -_x : _x) +
this.left * (scaleVal + (scaleDiff < 0 ? -1 : 1));
_y =
(scaleDiff < 0 ? -_y : _y) +
this.top * (scaleVal + (scaleDiff < 0 ? -1 : 1));
x = _x / scaleVal;
y = _y / scaleVal;
}
else {
var scaleVal = (scale - scaleDiff) * scaleDiff;
x = _x * scaleVal;
y = _y * scaleVal;
}
if (reposition) {
if (allowX) {
if (this.isBeyondPossibleLeft(x, possibleSwipeCords.minX)) {
x = possibleSwipeCords.minX;
}
else if (this.isBeyondPossibleRight(x, possibleSwipeCords.maxX)) {
x = possibleSwipeCords.maxX;
}
}
else {
if (scale > 1) {
if (x < possibleSwipeCords.minX) {
x = possibleSwipeCords.minX;
}
else if (x > possibleSwipeCords.maxX) {
x = possibleSwipeCords.maxX;
}
}
}
// @todo fix this
if (allowY) {
if (this.isBeyondPossibleTop(y, possibleSwipeCords.minY)) {
y = possibleSwipeCords.minY;
}
else if (this.isBeyondPossibleBottom(y, possibleSwipeCords.maxY)) {
y = possibleSwipeCords.maxY;
}
}
else {
// If the translate value based on index of beyond the viewport, utilize the available space to prevent image being cut out
if (scale > 1) {
//If image goes beyond viewport top, use the minim possible translate value
if (y < possibleSwipeCords.minY) {
y = possibleSwipeCords.minY;
}
else if (y > possibleSwipeCords.maxY) {
y = possibleSwipeCords.maxY;
}
}
}
}
this.setZoomStyles({
x: x,
y: y,
scale: scale,
});
this.left = x;
this.top = y;
if (resetToMax) {
this.setZoomImageSize();
}
};
Zoom.prototype.resetImageTranslate = function (index) {
if (!this.isImageSlide(index)) {
return;
}
var $image = this.core.getSlideItem(index).find('.lg-image').first();
this.imageReset = false;
$image.removeClass('reset-transition reset-transition-y reset-transition-x');
this.core.outer.removeClass('lg-actual-size');
$image.css('width', 'auto').css('height', 'auto');
setTimeout(function () {
$image.removeClass('no-transition');
}, 10);
};
Zoom.prototype.setZoomImageSize = function () {
var _this = this;
var $image = this.core
.getSlideItem(this.core.index)
.find('.lg-image')
.first();
setTimeout(function () {
var actualSizeScale = _this.getCurrentImageActualSizeScale();
if (_this.scale >= actualSizeScale) {
$image.addClass('no-transition');
_this.imageReset = true;
}
}, ZOOM_TRANSITION_DURATION);
setTimeout(function () {
var actualSizeScale = _this.getCurrentImageActualSizeScale();
if (_this.scale >= actualSizeScale) {
var dragAllowedAxises = _this.getDragAllowedAxises(_this.scale);
$image
.css('width', $image.get().naturalWidth + 'px')
.css('height', $image.get().naturalHeight + 'px');
_this.core.outer.addClass('lg-actual-size');
if (dragAllowedAxises.allowX && dragAllowedAxises.allowY) {
$image.addClass('reset-transition');
}
else if (dragAllowedAxises.allowX &&
!dragAllowedAxises.allowY) {
$image.addClass('reset-transition-x');
}
else if (!dragAllowedAxises.allowX &&
dragAllowedAxises.allowY) {
$image.addClass('reset-transition-y');
}
}
}, ZOOM_TRANSITION_DURATION + 50);
};
/**
* @desc apply scale3d to image and translate to image wrap
* @param {style} X,Y and scale
*/
Zoom.prototype.setZoomStyles = function (style) {
var $imageWrap = this.core
.getSlideItem(this.core.index)
.find('.lg-img-wrap')
.first();
var $image = this.core
.getSlideItem(this.core.index)
.find('.lg-image')
.first();
var $dummyImage = this.core.outer
.find('.lg-current .lg-dummy-img')
.first();
this.scale = style.scale;
$image.css('transform', 'scale3d(' + style.scale + ', ' + style.scale + ', 1)');
$dummyImage.css('transform', 'scale3d(' + style.scale + ', ' + style.scale + ', 1)');
var transform = 'translate3d(' + style.x + 'px, ' + style.y + 'px, 0)';
$imageWrap.css('transform', transform);
};
/**
* @param index - Index of the current slide
* @param event - event will be available only if the function is called on clicking/taping the imags
*/
Zoom.prototype.setActualSize = function (index, event) {
var _this = this;
var currentItem = this.core.galleryItems[this.core.index];
this.resetImageTranslate(index);
setTimeout(function () {
// Allow zoom only on image
if (!currentItem.src ||
_this.core.outer.hasClass('lg-first-slide-loading')) {
return;
}
var scale = _this.getCurrentImageActualSizeScale();
var prevScale = _this.scale;
if (_this.core.outer.hasClass('lg-zoomed')) {
_this.scale = 1;
}
else {
_this.scale = _this.getScale(scale);
}
_this.setPageCords(event);
_this.beginZoom(_this.scale);
_this.zoomImage(_this.scale, _this.scale - prevScale, true, true);
setTimeout(function () {
_this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');
}, 10);
}, 50);
};
Zoom.prototype.getNaturalWidth = function (index) {
var $image = this.core.getSlideItem(index).find('.lg-image').first();
var naturalWidth = this.core.galleryItems[index].width;
return naturalWidth
? parseFloat(naturalWidth)
: undefined || $image.get().naturalWidth;
};
Zoom.prototype.getActualSizeScale = function (naturalWidth, width) {
var _scale;
var scale;
if (naturalWidth >= width) {
_scale = naturalWidth / width;
scale = _scale || 2;
}
else {
scale = 1;
}
return scale;
};
Zoom.prototype.getCurrentImageActualSizeScale = function () {
var $image = this.core
.getSlideItem(this.core.index)
.find('.lg-image')
.first();
var width = $image.get().offsetWidth;
var naturalWidth = this.getNaturalWidth(this.core.index) || width;
return this.getActualSizeScale(naturalWidth, width);
};
Zoom.prototype.getPageCords = function (event) {
var cords = {};
if (event) {
cords.x = event.pageX || event.touches[0].pageX;
cords.y = event.pageY || event.touches[0].pageY;
}
else {
var containerRect = this.core.$content
.get()
.getBoundingClientRect();
cords.x = containerRect.width / 2 + containerRect.left;
cords.y =
containerRect.height / 2 + this.scrollTop + containerRect.top;
}
return cords;
};
Zoom.prototype.setPageCords = function (event) {
var pageCords = this.getPageCords(event);
this.pageX = pageCords.x;
this.pageY = pageCords.y;
};
Zoom.prototype.manageActualPixelClassNames = function () {
var $actualSize = this.core.getElementById('lg-actual-size');
$actualSize
.removeClass(this.settings.actualSizeIcons.zoomIn)
.addClass(this.settings.actualSizeIcons.zoomOut);
};
// If true, zoomed - in else zoomed out
Zoom.prototype.beginZoom = function (scale) {
this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');
if (scale > 1) {
this.core.outer.addClass('lg-zoomed');
this.manageActualPixelClassNames();
}
else {
this.resetZoom();
}
return scale > 1;
};
Zoom.prototype.getScale = function (scale) {
var actualSizeScale = this.getCurrentImageActualSizeScale();
if (scale < 1) {
scale = 1;
}
else if (scale > actualSizeScale) {
scale = actualSizeScale;
}
return scale;
};
Zoom.prototype.init = function () {
var _this = this;
if (!this.settings.zoom) {
return;
}
this.buildTemplates();
this.enableZoomOnSlideItemLoad();
var tapped = null;
this.core.outer.on('dblclick.lg', function (event) {
if (!_this.$LG(event.target).hasClass('lg-image')) {
return;
}
_this.setActualSize(_this.core.index, event);
});
this.core.outer.on('touchstart.lg', function (event) {
var $target = _this.$LG(event.target);
if (event.touches.length === 1 && $target.hasClass('lg-image')) {
if (!tapped) {
tapped = setTimeout(function () {
tapped = null;
}, 300);
}
else {
clearTimeout(tapped);
tapped = null;
event.preventDefault();
_this.setActualSize(_this.core.index, event);
}
}
});
this.core.LGel.on(lg_events_1.lGEvents.containerResize + ".zoom " + lg_events_1.lGEvents.rotateRight + ".zoom " + lg_events_1.lGEvents.rotateLeft + ".zoom " + lg_events_1.lGEvents.flipHorizontal + ".zoom " + lg_events_1.lGEvents.flipVertical + ".zoom", function () {
if (!_this.core.lgOpened ||
!_this.isImageSlide(_this.core.index) ||
_this.core.touchAction) {
return;
}
var _LGel = _this.core
.getSlideItem(_this.core.index)
.find('.lg-img-wrap')
.first();
_this.top = 0;
_this.left = 0;
_this.setZoomEssentials();
_this.setZoomSwipeStyles(_LGel, { x: 0, y: 0 });
_this.positionChanged = true;
});
// Update zoom on resize and orientationchange
this.$LG(window).on("scroll.lg.zoom.global" + this.core.lgId, function () {
if (!_this.core.lgOpened)
return;
_this.scrollTop = _this.$LG(window).scrollTop();
});
this.core.getElementById('lg-zoom-out').on('click.lg', function () {
// Allow zoom only on image
if (!_this.isImageSlide(_this.core.index)) {
return;
}
var timeout = 0;
if (_this.imageReset) {
_this.resetImageTranslate(_this.core.index);
timeout = 50;
}
setTimeout(function () {
var scale = _this.scale - _this.settings.scale;
if (scale < 1) {
scale = 1;
}
_this.beginZoom(scale);
_this.zoomImage(scale, -_this.settings.scale, true, true);
}, timeout);
});
this.core.getElementById('lg-zoom-in').on('click.lg', function () {
_this.zoomIn();
});
this.core.getElementById('lg-actual-size').on('click.lg', function () {
_this.setActualSize(_this.core.index);
});
this.core.LGel.on(lg_events_1.lGEvents.beforeOpen + ".zoom", function () {
_this.core.outer.find('.lg-item').removeClass('lg-zoomable');
});
this.core.LGel.on(lg_events_1.lGEvents.afterOpen + ".zoom", function () {
_this.scrollTop = _this.$LG(window).scrollTop();
// Set the initial value center
_this.pageX = _this.core.outer.width() / 2;
_this.pageY = _this.core.outer.height() / 2 + _this.scrollTop;
_this.scale = 1;
});
// Reset zoom on slide change
this.core.LGel.on(lg_events_1.lGEvents.afterSlide + ".zoom", function (event) {
var prevIndex = event.detail.prevIndex;
_this.scale = 1;
_this.positionChanged = false;
_this.resetZoom(prevIndex);
_this.resetImageTranslate(prevIndex);
if (_this.isImageSlide(_this.core.index)) {
_this.setZoomEssentials();
}
});
// Drag option after zoom
this.zoomDrag();
this.pinchZoom();
this.zoomSwipe();
// Store the zoomable timeout value just to clear it while closing
this.zoomableTimeout = false;
this.positionChanged = false;
};
Zoom.prototype.zoomIn = function () {
// Allow zoom only on image
if (!this.isImageSlide(this.core.index)) {
return;
}
var scale = this.scale + this.settings.scale;
scale = this.getScale(scale);
this.beginZoom(scale);
this.zoomImage(scale, Math.min(this.settings.scale, scale - this.scale), true, true);
};
// Reset zoom effect
Zoom.prototype.resetZoom = function (index) {
this.core.outer.removeClass('lg-zoomed lg-zoom-drag-transition');
var $actualSize = this.core.getElementById('lg-actual-size');
var $item = this.core.getSlideItem(index !== undefined ? index : this.core.index);
$actualSize
.removeClass(this.settings.actualSizeIcons.zoomOut)
.addClass(this.settings.actualSizeIcons.zoomIn);
$item.find('.lg-img-wrap').first().removeAttr('style');
$item.find('.lg-image').first().removeAttr('style');
this.scale = 1;
this.left = 0;
this.top = 0;
// Reset pagx pagy values to center
this.setPageCords();
};
Zoom.prototype.getTouchDistance = function (e) {
return Math.sqrt((e.touches[0].pageX - e.touches[1].pageX) *
(e.touches[0].pageX - e.touches[1].pageX) +
(e.touches[0].pageY - e.touches[1].pageY) *
(e.touches[0].pageY - e.touches[1].pageY));
};
Zoom.prototype.pinchZoom = function () {
var _this = this;
var startDist = 0;
var pinchStarted = false;
var initScale = 1;
var prevScale = 0;
var $item = this.core.getSlideItem(this.core.index);
this.core.outer.on('touchstart.lg', function (e) {
$item = _this.core.getSlideItem(_this.core.index);
if (!_this.isImageSlide(_this.core.index)) {
return;
}
if (e.touches.length === 2) {
e.preventDefault();
if (_this.core.outer.hasClass('lg-first-slide-loading')) {
return;
}
initScale = _this.scale || 1;
_this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');
_this.setPageCords(e);
_this.resetImageTranslate(_this.core.index);
_this.core.touchAction = 'pinch';
startDist = _this.getTouchDistance(e);
}
});
this.core.$inner.on('touchmove.lg', function (e) {
if (e.touches.length === 2 &&
_this.core.touchAction === 'pinch' &&
(_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target))) {
e.preventDefault();
var endDist = _this.getTouchDistance(e);
var distance = startDist - endDist;
if (!pinchStarted && Math.abs(distance) > 5) {
pinchStarted = true;
}
if (pinchStarted) {
prevScale = _this.scale;
var _scale = Math.max(1, initScale + -distance * 0.02);
_this.scale =
Math.round((_scale + Number.EPSILON) * 100) / 100;
var diff = _this.scale - prevScale;
_this.zoomImage(_this.scale, Math.round((diff + Number.EPSILON) * 100) / 100, false, false);
}
}
});
this.core.$inner.on('touchend.lg', function (e) {
if (_this.core.touchAction === 'pinch' &&
(_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target))) {
pinchStarted = false;
startDist = 0;
if (_this.scale <= 1) {
_this.resetZoom();
}
else {
var actualSizeScale = _this.getCurrentImageActualSizeScale();
if (_this.scale >= actualSizeScale) {
var scaleDiff = actualSizeScale - _this.scale;
if (scaleDiff === 0) {
scaleDiff = 0.01;
}
_this.zoomImage(actualSizeScale, scaleDiff, false, true);
}
_this.manageActualPixelClassNames();
_this.core.outer.addClass('lg-zoomed');
}
_this.core.touchAction = undefined;
}
});
};
Zoom.prototype.touchendZoom = function (startCoords, endCoords, allowX, allowY, touchDuration) {
var distanceXnew = endCoords.x - startCoords.x;
var distanceYnew = endCoords.y - startCoords.y;
var speedX = Math.abs(distanceXnew) / touchDuration + 1;
var speedY = Math.abs(distanceYnew) / touchDuration + 1;
if (speedX > 2) {
speedX += 1;
}
if (speedY > 2) {
speedY += 1;
}
distanceXnew = distanceXnew * speedX;
distanceYnew = distanceYnew * speedY;
var _LGel = this.core
.getSlideItem(this.core.index)
.find('.lg-img-wrap')
.first();
var distance = {};
distance.x = this.left + distanceXnew;
distance.y = this.top + distanceYnew;
var possibleSwipeCords = this.getPossibleSwipeDragCords();
if (Math.abs(distanceXnew) > 15 || Math.abs(distanceYnew) > 15) {
if (allowY) {
if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {
distance.y = possibleSwipeCords.minY;
}
else if (this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)) {
distance.y = possibleSwipeCords.maxY;
}
}
if (allowX) {
if (this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)) {
distance.x = possibleSwipeCords.minX;
}
else if (this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)) {
distance.x = possibleSwipeCords.maxX;
}
}
if (allowY) {
this.top = distance.y;
}
else {
distance.y = this.top;
}
if (allowX) {
this.left = distance.x;
}
else {
distance.x = this.left;
}
this.setZoomSwipeStyles(_LGel, distance);
this.positionChanged = true;
}
};
Zoom.prototype.getZoomSwipeCords = function (startCoords, endCoords, allowX, allowY, possibleSwipeCords) {
var distance = {};
if (allowY) {
distance.y = this.top + (endCoords.y - startCoords.y);
if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {
var diffMinY = possibleSwipeCords.minY - distance.y;
distance.y = possibleSwipeCords.minY - diffMinY / 6;
}
else if (this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)) {
var diffMaxY = distance.y - possibleSwipeCords.maxY;
distance.y = possibleSwipeCords.maxY + diffMaxY / 6;
}
}
else {
distance.y = this.top;
}
if (allowX) {
distance.x = this.left + (endCoords.x - startCoords.x);
if (this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)) {
var diffMinX = possibleSwipeCords.minX - distance.x;
distance.x = possibleSwipeCords.minX - diffMinX / 6;
}
else if (this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)) {
var difMaxX = distance.x - possibleSwipeCords.maxX;
distance.x = possibleSwipeCords.maxX + difMaxX / 6;
}
}
else {
distance.x = this.left;
}
return distance;
};
Zoom.prototype.isBeyondPossibleLeft = function (x, minX) {
return x >= minX;
};
Zoom.prototype.isBeyondPossibleRight = function (x, maxX) {
return x <= maxX;
};
Zoom.prototype.isBeyondPossibleTop = function (y, minY) {
return y >= minY;
};
Zoom.prototype.isBeyondPossibleBottom = function (y, maxY) {
return y <= maxY;
};
Zoom.prototype.isImageSlide = function (index) {
var currentItem = this.core.galleryItems[index];
return this.core.getSlideType(currentItem) === 'image';
};
Zoom.prototype.getPossibleSwipeDragCords = function (scale) {
var $image = this.core
.getSlideItem(this.core.index)
.find('.lg-image')
.first();
var bottom = this.core.mediaContainerPosition.bottom;
var imgRect = $image.get().getBoundingClientRect();
var imageHeight = imgRect.height;
var imageWidth = imgRect.width;
if (scale) {
imageHeight = imageHeight + scale * imageHeight;
imageWidth = imageWidth + scale * imageWidth;
}
var minY = (imageHeight - this.containerRect.height) / 2;
var maxY = (this.containerRect.height - imageHeight) / 2 + bottom;
var minX = (imageWidth - this.containerRect.width) / 2;
var maxX = (this.containerRect.width - imageWidth) / 2;
var possibleSwipeCords = {
minY: minY,
maxY: maxY,
minX: minX,
maxX: maxX,
};
return possibleSwipeCords;
};
Zoom.prototype.setZoomSwipeStyles = function (LGel, distance) {
LGel.css('transform', 'translate3d(' + distance.x + 'px, ' + distance.y + 'px, 0)');
};
Zoom.prototype.zoomSwipe = function () {
var _this = this;
var startCoords = {};
var endCoords = {};
var isMoved = false;
// Allow x direction drag
var allowX = false;
// Allow Y direction drag
var allowY = false;
var startTime = new Date();
var endTime = new Date();
var possibleSwipeCords;
var _LGel;
var $item = this.core.getSlideItem(this.core.index);
this.core.$inner.on('touchstart.lg', function (e) {
// Allow zoom only on image
if (!_this.isImageSlide(_this.core.index)) {
return;
}
$item = _this.core.getSlideItem(_this.core.index);
if ((_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target)) &&
e.touches.length === 1 &&
_this.core.outer.hasClass('lg-zoomed')) {
e.preventDefault();
startTime = new Date();
_this.core.touchAction = 'zoomSwipe';
_LGel = _this.core
.getSlideItem(_this.core.index)
.find('.lg-img-wrap')
.first();
var dragAllowedAxises = _this.getDragAllowedAxises(0);
allowY = dragAllowedAxises.allowY;
allowX = dragAllowedAxises.allowX;
if (allowX || allowY) {
startCoords = _this.getSwipeCords(e);
}
possibleSwipeCords = _this.getPossibleSwipeDragCords();
// reset opacity and transition duration
_this.core.outer.addClass('lg-zoom-dragging lg-zoom-drag-transition');
}
});
this.core.$inner.on('touchmove.lg', function (e) {
if (e.touches.length === 1 &&
_this.core.touchAction === 'zoomSwipe' &&
(_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target))) {
e.preventDefault();
_this.core.touchAction = 'zoomSwipe';
endCoords = _this.getSwipeCords(e);
var distance = _this.getZoomSwipeCords(startCoords, endCoords, allowX, allowY, possibleSwipeCords);
if (Math.abs(endCoords.x - startCoords.x) > 15 ||
Math.abs(endCoords.y - startCoords.y) > 15) {
isMoved = true;
_this.setZoomSwipeStyles(_LGel, distance);
}
}
});
this.core.$inner.on('touchend.lg', function (e) {
if (_this.core.touchAction === 'zoomSwipe' &&
(_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target))) {
e.preventDefault();
_this.core.touchAction = undefined;
_this.core.outer.removeClass('lg-zoom-dragging');
if (!isMoved) {
return;
}
isMoved = false;
endTime = new Date();
var touchDuration = endTime.valueOf() - startTime.valueOf();
_this.touchendZoom(startCoords, endCoords, allowX, allowY, touchDuration);
}
});
};
Zoom.prototype.zoomDrag = function () {
var _this = this;
var startCoords = {};
var endCoords = {};
var isDragging = false;
var isMoved = false;
// Allow x direction drag
var allowX = false;
// Allow Y direction drag
var allowY = false;
var startTime;
var endTime;
var possibleSwipeCords;
var _LGel;
this.core.outer.on('mousedown.lg.zoom', function (e) {
// Allow zoom only on image
if (!_this.isImageSlide(_this.core.index)) {
return;
}
var $item = _this.core.getSlideItem(_this.core.index);
if (_this.$LG(e.target).hasClass('lg-item') ||
$item.get().contains(e.target)) {
startTime = new Date();
_LGel = _this.core
.getSlideItem(_this.core.index)
.find('.lg-img-wrap')
.first();
var dragAllowedAxises = _this.getDragAllowedAxises(0);
allowY = dragAllowedAxises.allowY;
allowX = dragAllowedAxises.allowX;
if (_this.core.outer.hasClass('lg-zoomed')) {
if (_this.$LG(e.target).hasClass('lg-object') &&
(allowX || allowY)) {
e.preventDefault();
startCoords = _this.getDragCords(e);
possibleSwipeCords = _this.getPossibleSwipeDragCords();
isDragging = true;
_this.core.outer
.removeClass('lg-grab')
.addClass('lg-grabbing lg-zoom-drag-transition lg-zoom-dragging');
// reset opacity and transition duration
}
}
}
});
this.$LG(window).on("mousemove.lg.zoom.global" + this.core.lgId, function (e) {
if (isDragging) {
isMoved = true;
endCoords = _this.getDragCords(e);
var distance = _this.getZoomSwipeCords(startCoords, endCoords, allowX, allowY, possibleSwipeCords);
_this.setZoomSwipeStyles(_LGel, distance);
}
});
this.$LG(window).on("mouseup.lg.zoom.global" + this.core.lgId, function (e) {
if (isDragging) {
endTime = new Date();
isDragging = false;
_this.core.outer.removeClass('lg-zoom-dragging');
// Fix for chrome mouse move on click
if (isMoved &&
(startCoords.x !== endCoords.x ||
startCoords.y !== endCoords.y)) {
endCoords = _this.getDragCords(e);
var touchDuration = endTime.valueOf() - startTime.valueOf();
_this.touchendZoom(startCoords, endCoords, allowX, allowY, touchDuration);
}
isMoved = false;
}
_this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');
});
};
Zoom.prototype.closeGallery = function () {
this.resetZoom();
};
Zoom.prototype.destroy = function () {
// Unbind all events added by lightGallery zoom plugin
this.$LG(window).off(".lg.zoom.global" + this.core.lgId);
this.core.LGel.off('.lg.zoom');
this.core.LGel.off('.zoom');
clearTimeout(this.zoomableTimeout);
this.zoomableTimeout = false;
};
return Zoom;
}());
exports.default = Zoom;
//# sourceMappingURL=lg-zoom.js.map