(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.window = global.window || {})); }(this, (function (exports) { 'use strict'; function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } var _doc, _win, _docElement, _body, _divContainer, _svgContainer, _identityMatrix, _gEl, _transformProp = "transform", _transformOriginProp = _transformProp + "Origin", _hasOffsetBug, _setDoc = function _setDoc(element) { var doc = element.ownerDocument || element; if (!(_transformProp in element.style) && "msTransform" in element.style) { _transformProp = "msTransform"; _transformOriginProp = _transformProp + "Origin"; } while (doc.parentNode && (doc = doc.parentNode)) {} _win = window; _identityMatrix = new Matrix2D(); if (doc) { _doc = doc; _docElement = doc.documentElement; _body = doc.body; _gEl = _doc.createElementNS("http://www.w3.org/2000/svg", "g"); _gEl.style.transform = "none"; var d1 = doc.createElement("div"), d2 = doc.createElement("div"); _body.appendChild(d1); d1.appendChild(d2); d1.style.position = "static"; d1.style[_transformProp] = "translate3d(0,0,1px)"; _hasOffsetBug = d2.offsetParent !== d1; _body.removeChild(d1); } return doc; }, _forceNonZeroScale = function _forceNonZeroScale(e) { var a, cache; while (e && e !== _body) { cache = e._gsap; cache && cache.uncache && cache.get(e, "x"); if (cache && !cache.scaleX && !cache.scaleY && cache.renderTransform) { cache.scaleX = cache.scaleY = 1e-4; cache.renderTransform(1, cache); a ? a.push(cache) : a = [cache]; } e = e.parentNode; } return a; }, _svgTemps = [], _divTemps = [], _getDocScrollTop = function _getDocScrollTop() { return _win.pageYOffset || _doc.scrollTop || _docElement.scrollTop || _body.scrollTop || 0; }, _getDocScrollLeft = function _getDocScrollLeft() { return _win.pageXOffset || _doc.scrollLeft || _docElement.scrollLeft || _body.scrollLeft || 0; }, _svgOwner = function _svgOwner(element) { return element.ownerSVGElement || ((element.tagName + "").toLowerCase() === "svg" ? element : null); }, _isFixed = function _isFixed(element) { if (_win.getComputedStyle(element).position === "fixed") { return true; } element = element.parentNode; if (element && element.nodeType === 1) { return _isFixed(element); } }, _createSibling = function _createSibling(element, i) { if (element.parentNode && (_doc || _setDoc(element))) { var svg = _svgOwner(element), ns = svg ? svg.getAttribute("xmlns") || "http://www.w3.org/2000/svg" : "http://www.w3.org/1999/xhtml", type = svg ? i ? "rect" : "g" : "div", x = i !== 2 ? 0 : 100, y = i === 3 ? 100 : 0, css = "position:absolute;display:block;pointer-events:none;margin:0;padding:0;", e = _doc.createElementNS ? _doc.createElementNS(ns.replace(/^https/, "http"), type) : _doc.createElement(type); if (i) { if (!svg) { if (!_divContainer) { _divContainer = _createSibling(element); _divContainer.style.cssText = css; } e.style.cssText = css + "width:0.1px;height:0.1px;top:" + y + "px;left:" + x + "px"; _divContainer.appendChild(e); } else { _svgContainer || (_svgContainer = _createSibling(element)); e.setAttribute("width", 0.01); e.setAttribute("height", 0.01); e.setAttribute("transform", "translate(" + x + "," + y + ")"); _svgContainer.appendChild(e); } } return e; } throw "Need document and parent."; }, _consolidate = function _consolidate(m) { var c = new Matrix2D(), i = 0; for (; i < m.numberOfItems; i++) { c.multiply(m.getItem(i).matrix); } return c; }, _getCTM = function _getCTM(svg) { var m = svg.getCTM(), transform; if (!m) { transform = svg.style[_transformProp]; svg.style[_transformProp] = "none"; svg.appendChild(_gEl); m = _gEl.getCTM(); svg.removeChild(_gEl); transform ? svg.style[_transformProp] = transform : svg.style.removeProperty(_transformProp.replace(/([A-Z])/g, "-$1").toLowerCase()); } return m || _identityMatrix.clone(); }, _placeSiblings = function _placeSiblings(element, adjustGOffset) { var svg = _svgOwner(element), isRootSVG = element === svg, siblings = svg ? _svgTemps : _divTemps, parent = element.parentNode, container, m, b, x, y, cs; if (element === _win) { return element; } siblings.length || siblings.push(_createSibling(element, 1), _createSibling(element, 2), _createSibling(element, 3)); container = svg ? _svgContainer : _divContainer; if (svg) { if (isRootSVG) { b = _getCTM(element); x = -b.e / b.a; y = -b.f / b.d; m = _identityMatrix; } else if (element.getBBox) { b = element.getBBox(); m = element.transform ? element.transform.baseVal : {}; m = !m.numberOfItems ? _identityMatrix : m.numberOfItems > 1 ? _consolidate(m) : m.getItem(0).matrix; x = m.a * b.x + m.c * b.y; y = m.b * b.x + m.d * b.y; } else { m = new Matrix2D(); x = y = 0; } if (adjustGOffset && element.tagName.toLowerCase() === "g") { x = y = 0; } (isRootSVG ? svg : parent).appendChild(container); container.setAttribute("transform", "matrix(" + m.a + "," + m.b + "," + m.c + "," + m.d + "," + (m.e + x) + "," + (m.f + y) + ")"); } else { x = y = 0; if (_hasOffsetBug) { m = element.offsetParent; b = element; while (b && (b = b.parentNode) && b !== m && b.parentNode) { if ((_win.getComputedStyle(b)[_transformProp] + "").length > 4) { x = b.offsetLeft; y = b.offsetTop; b = 0; } } } cs = _win.getComputedStyle(element); if (cs.position !== "absolute" && cs.position !== "fixed") { m = element.offsetParent; while (parent && parent !== m) { x += parent.scrollLeft || 0; y += parent.scrollTop || 0; parent = parent.parentNode; } } b = container.style; b.top = element.offsetTop - y + "px"; b.left = element.offsetLeft - x + "px"; b[_transformProp] = cs[_transformProp]; b[_transformOriginProp] = cs[_transformOriginProp]; b.position = cs.position === "fixed" ? "fixed" : "absolute"; element.parentNode.appendChild(container); } return container; }, _setMatrix = function _setMatrix(m, a, b, c, d, e, f) { m.a = a; m.b = b; m.c = c; m.d = d; m.e = e; m.f = f; return m; }; var Matrix2D = function () { function Matrix2D(a, b, c, d, e, f) { if (a === void 0) { a = 1; } if (b === void 0) { b = 0; } if (c === void 0) { c = 0; } if (d === void 0) { d = 1; } if (e === void 0) { e = 0; } if (f === void 0) { f = 0; } _setMatrix(this, a, b, c, d, e, f); } var _proto = Matrix2D.prototype; _proto.inverse = function inverse() { var a = this.a, b = this.b, c = this.c, d = this.d, e = this.e, f = this.f, determinant = a * d - b * c || 1e-10; return _setMatrix(this, d / determinant, -b / determinant, -c / determinant, a / determinant, (c * f - d * e) / determinant, -(a * f - b * e) / determinant); }; _proto.multiply = function multiply(matrix) { var a = this.a, b = this.b, c = this.c, d = this.d, e = this.e, f = this.f, a2 = matrix.a, b2 = matrix.c, c2 = matrix.b, d2 = matrix.d, e2 = matrix.e, f2 = matrix.f; return _setMatrix(this, a2 * a + c2 * c, a2 * b + c2 * d, b2 * a + d2 * c, b2 * b + d2 * d, e + e2 * a + f2 * c, f + e2 * b + f2 * d); }; _proto.clone = function clone() { return new Matrix2D(this.a, this.b, this.c, this.d, this.e, this.f); }; _proto.equals = function equals(matrix) { var a = this.a, b = this.b, c = this.c, d = this.d, e = this.e, f = this.f; return a === matrix.a && b === matrix.b && c === matrix.c && d === matrix.d && e === matrix.e && f === matrix.f; }; _proto.apply = function apply(point, decoratee) { if (decoratee === void 0) { decoratee = {}; } var x = point.x, y = point.y, a = this.a, b = this.b, c = this.c, d = this.d, e = this.e, f = this.f; decoratee.x = x * a + y * c + e || 0; decoratee.y = x * b + y * d + f || 0; return decoratee; }; return Matrix2D; }(); function getGlobalMatrix(element, inverse, adjustGOffset, includeScrollInFixed) { if (!element || !element.parentNode || (_doc || _setDoc(element)).documentElement === element) { return new Matrix2D(); } var zeroScales = _forceNonZeroScale(element), svg = _svgOwner(element), temps = svg ? _svgTemps : _divTemps, container = _placeSiblings(element, adjustGOffset), b1 = temps[0].getBoundingClientRect(), b2 = temps[1].getBoundingClientRect(), b3 = temps[2].getBoundingClientRect(), parent = container.parentNode, isFixed = !includeScrollInFixed && _isFixed(element), m = new Matrix2D((b2.left - b1.left) / 100, (b2.top - b1.top) / 100, (b3.left - b1.left) / 100, (b3.top - b1.top) / 100, b1.left + (isFixed ? 0 : _getDocScrollLeft()), b1.top + (isFixed ? 0 : _getDocScrollTop())); parent.removeChild(container); if (zeroScales) { b1 = zeroScales.length; while (b1--) { b2 = zeroScales[b1]; b2.scaleX = b2.scaleY = 0; b2.renderTransform(1, b2); } } return inverse ? m.inverse() : m; } var gsap, _win$1, _doc$1, _docElement$1, _body$1, _tempDiv, _placeholderDiv, _coreInitted, _checkPrefix, _toArray, _supportsPassive, _isTouchDevice, _touchEventLookup, _isMultiTouching, _isAndroid, InertiaPlugin, _defaultCursor, _supportsPointer, _context, _getStyleSaver, _dragCount = 0, _windowExists = function _windowExists() { return typeof window !== "undefined"; }, _getGSAP = function _getGSAP() { return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap; }, _isFunction = function _isFunction(value) { return typeof value === "function"; }, _isObject = function _isObject(value) { return typeof value === "object"; }, _isUndefined = function _isUndefined(value) { return typeof value === "undefined"; }, _emptyFunc = function _emptyFunc() { return false; }, _transformProp$1 = "transform", _transformOriginProp$1 = "transformOrigin", _round = function _round(value) { return Math.round(value * 10000) / 10000; }, _isArray = Array.isArray, _createElement = function _createElement(type, ns) { var e = _doc$1.createElementNS ? _doc$1.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc$1.createElement(type); return e.style ? e : _doc$1.createElement(type); }, _RAD2DEG = 180 / Math.PI, _bigNum = 1e20, _identityMatrix$1 = new Matrix2D(), _getTime = Date.now || function () { return new Date().getTime(); }, _renderQueue = [], _lookup = {}, _lookupCount = 0, _clickableTagExp = /^(?:a|input|textarea|button|select)$/i, _lastDragTime = 0, _temp1 = {}, _windowProxy = {}, _copy = function _copy(obj, factor) { var copy = {}, p; for (p in obj) { copy[p] = factor ? obj[p] * factor : obj[p]; } return copy; }, _extend = function _extend(obj, defaults) { for (var p in defaults) { if (!(p in obj)) { obj[p] = defaults[p]; } } return obj; }, _setTouchActionForAllDescendants = function _setTouchActionForAllDescendants(elements, value) { var i = elements.length, children; while (i--) { value ? elements[i].style.touchAction = value : elements[i].style.removeProperty("touch-action"); children = elements[i].children; children && children.length && _setTouchActionForAllDescendants(children, value); } }, _renderQueueTick = function _renderQueueTick() { return _renderQueue.forEach(function (func) { return func(); }); }, _addToRenderQueue = function _addToRenderQueue(func) { _renderQueue.push(func); if (_renderQueue.length === 1) { gsap.ticker.add(_renderQueueTick); } }, _renderQueueTimeout = function _renderQueueTimeout() { return !_renderQueue.length && gsap.ticker.remove(_renderQueueTick); }, _removeFromRenderQueue = function _removeFromRenderQueue(func) { var i = _renderQueue.length; while (i--) { if (_renderQueue[i] === func) { _renderQueue.splice(i, 1); } } gsap.to(_renderQueueTimeout, { overwrite: true, delay: 15, duration: 0, onComplete: _renderQueueTimeout, data: "_draggable" }); }, _setDefaults = function _setDefaults(obj, defaults) { for (var p in defaults) { if (!(p in obj)) { obj[p] = defaults[p]; } } return obj; }, _addListener = function _addListener(element, type, func, capture) { if (element.addEventListener) { var touchType = _touchEventLookup[type]; capture = capture || (_supportsPassive ? { passive: false } : null); element.addEventListener(touchType || type, func, capture); touchType && type !== touchType && element.addEventListener(type, func, capture); } }, _removeListener = function _removeListener(element, type, func, capture) { if (element.removeEventListener) { var touchType = _touchEventLookup[type]; element.removeEventListener(touchType || type, func, capture); touchType && type !== touchType && element.removeEventListener(type, func, capture); } }, _preventDefault = function _preventDefault(event) { event.preventDefault && event.preventDefault(); event.preventManipulation && event.preventManipulation(); }, _hasTouchID = function _hasTouchID(list, ID) { var i = list.length; while (i--) { if (list[i].identifier === ID) { return true; } } }, _onMultiTouchDocumentEnd = function _onMultiTouchDocumentEnd(event) { _isMultiTouching = event.touches && _dragCount < event.touches.length; _removeListener(event.target, "touchend", _onMultiTouchDocumentEnd); }, _onMultiTouchDocument = function _onMultiTouchDocument(event) { _isMultiTouching = event.touches && _dragCount < event.touches.length; _addListener(event.target, "touchend", _onMultiTouchDocumentEnd); }, _getDocScrollTop$1 = function _getDocScrollTop(doc) { return _win$1.pageYOffset || doc.scrollTop || doc.documentElement.scrollTop || doc.body.scrollTop || 0; }, _getDocScrollLeft$1 = function _getDocScrollLeft(doc) { return _win$1.pageXOffset || doc.scrollLeft || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; }, _addScrollListener = function _addScrollListener(e, callback) { _addListener(e, "scroll", callback); if (!_isRoot(e.parentNode)) { _addScrollListener(e.parentNode, callback); } }, _removeScrollListener = function _removeScrollListener(e, callback) { _removeListener(e, "scroll", callback); if (!_isRoot(e.parentNode)) { _removeScrollListener(e.parentNode, callback); } }, _isRoot = function _isRoot(e) { return !!(!e || e === _docElement$1 || e.nodeType === 9 || e === _doc$1.body || e === _win$1 || !e.nodeType || !e.parentNode); }, _getMaxScroll = function _getMaxScroll(element, axis) { var dim = axis === "x" ? "Width" : "Height", scroll = "scroll" + dim, client = "client" + dim; return Math.max(0, _isRoot(element) ? Math.max(_docElement$1[scroll], _body$1[scroll]) - (_win$1["inner" + dim] || _docElement$1[client] || _body$1[client]) : element[scroll] - element[client]); }, _recordMaxScrolls = function _recordMaxScrolls(e, skipCurrent) { var x = _getMaxScroll(e, "x"), y = _getMaxScroll(e, "y"); if (_isRoot(e)) { e = _windowProxy; } else { _recordMaxScrolls(e.parentNode, skipCurrent); } e._gsMaxScrollX = x; e._gsMaxScrollY = y; if (!skipCurrent) { e._gsScrollX = e.scrollLeft || 0; e._gsScrollY = e.scrollTop || 0; } }, _setStyle = function _setStyle(element, property, value) { var style = element.style; if (!style) { return; } if (_isUndefined(style[property])) { property = _checkPrefix(property, element) || property; } if (value == null) { style.removeProperty && style.removeProperty(property.replace(/([A-Z])/g, "-$1").toLowerCase()); } else { style[property] = value; } }, _getComputedStyle = function _getComputedStyle(element) { return _win$1.getComputedStyle(element instanceof Element ? element : element.host || (element.parentNode || {}).host || element); }, _tempRect = {}, _parseRect = function _parseRect(e) { if (e === _win$1) { _tempRect.left = _tempRect.top = 0; _tempRect.width = _tempRect.right = _docElement$1.clientWidth || e.innerWidth || _body$1.clientWidth || 0; _tempRect.height = _tempRect.bottom = (e.innerHeight || 0) - 20 < _docElement$1.clientHeight ? _docElement$1.clientHeight : e.innerHeight || _body$1.clientHeight || 0; return _tempRect; } var doc = e.ownerDocument || _doc$1, r = !_isUndefined(e.pageX) ? { left: e.pageX - _getDocScrollLeft$1(doc), top: e.pageY - _getDocScrollTop$1(doc), right: e.pageX - _getDocScrollLeft$1(doc) + 1, bottom: e.pageY - _getDocScrollTop$1(doc) + 1 } : !e.nodeType && !_isUndefined(e.left) && !_isUndefined(e.top) ? e : _toArray(e)[0].getBoundingClientRect(); if (_isUndefined(r.right) && !_isUndefined(r.width)) { r.right = r.left + r.width; r.bottom = r.top + r.height; } else if (_isUndefined(r.width)) { r = { width: r.right - r.left, height: r.bottom - r.top, right: r.right, left: r.left, bottom: r.bottom, top: r.top }; } return r; }, _dispatchEvent = function _dispatchEvent(target, type, callbackName) { var vars = target.vars, callback = vars[callbackName], listeners = target._listeners[type], result; if (_isFunction(callback)) { result = callback.apply(vars.callbackScope || target, vars[callbackName + "Params"] || [target.pointerEvent]); } if (listeners && target.dispatchEvent(type) === false) { result = false; } return result; }, _getBounds = function _getBounds(target, context) { var e = _toArray(target)[0], top, left, offset; if (!e.nodeType && e !== _win$1) { if (!_isUndefined(target.left)) { offset = { x: 0, y: 0 }; return { left: target.left - offset.x, top: target.top - offset.y, width: target.width, height: target.height }; } left = target.min || target.minX || target.minRotation || 0; top = target.min || target.minY || 0; return { left: left, top: top, width: (target.max || target.maxX || target.maxRotation || 0) - left, height: (target.max || target.maxY || 0) - top }; } return _getElementBounds(e, context); }, _point1 = {}, _getElementBounds = function _getElementBounds(element, context) { context = _toArray(context)[0]; var isSVG = element.getBBox && element.ownerSVGElement, doc = element.ownerDocument || _doc$1, left, right, top, bottom, matrix, p1, p2, p3, p4, bbox, width, height, cs; if (element === _win$1) { top = _getDocScrollTop$1(doc); left = _getDocScrollLeft$1(doc); right = left + (doc.documentElement.clientWidth || element.innerWidth || doc.body.clientWidth || 0); bottom = top + ((element.innerHeight || 0) - 20 < doc.documentElement.clientHeight ? doc.documentElement.clientHeight : element.innerHeight || doc.body.clientHeight || 0); } else if (context === _win$1 || _isUndefined(context)) { return element.getBoundingClientRect(); } else { left = top = 0; if (isSVG) { bbox = element.getBBox(); width = bbox.width; height = bbox.height; } else { if (element.viewBox && (bbox = element.viewBox.baseVal)) { left = bbox.x || 0; top = bbox.y || 0; width = bbox.width; height = bbox.height; } if (!width) { cs = _getComputedStyle(element); bbox = cs.boxSizing === "border-box"; width = (parseFloat(cs.width) || element.clientWidth || 0) + (bbox ? 0 : parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth)); height = (parseFloat(cs.height) || element.clientHeight || 0) + (bbox ? 0 : parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth)); } } right = width; bottom = height; } if (element === context) { return { left: left, top: top, width: right - left, height: bottom - top }; } matrix = getGlobalMatrix(context, true).multiply(getGlobalMatrix(element)); p1 = matrix.apply({ x: left, y: top }); p2 = matrix.apply({ x: right, y: top }); p3 = matrix.apply({ x: right, y: bottom }); p4 = matrix.apply({ x: left, y: bottom }); left = Math.min(p1.x, p2.x, p3.x, p4.x); top = Math.min(p1.y, p2.y, p3.y, p4.y); return { left: left, top: top, width: Math.max(p1.x, p2.x, p3.x, p4.x) - left, height: Math.max(p1.y, p2.y, p3.y, p4.y) - top }; }, _parseInertia = function _parseInertia(draggable, snap, max, min, factor, forceZeroVelocity) { var vars = {}, a, i, l; if (snap) { if (factor !== 1 && snap instanceof Array) { vars.end = a = []; l = snap.length; if (_isObject(snap[0])) { for (i = 0; i < l; i++) { a[i] = _copy(snap[i], factor); } } else { for (i = 0; i < l; i++) { a[i] = snap[i] * factor; } } max += 1.1; min -= 1.1; } else if (_isFunction(snap)) { vars.end = function (value) { var result = snap.call(draggable, value), copy, p; if (factor !== 1) { if (_isObject(result)) { copy = {}; for (p in result) { copy[p] = result[p] * factor; } result = copy; } else { result *= factor; } } return result; }; } else { vars.end = snap; } } if (max || max === 0) { vars.max = max; } if (min || min === 0) { vars.min = min; } if (forceZeroVelocity) { vars.velocity = 0; } return vars; }, _isClickable = function _isClickable(element) { var data; return !element || !element.getAttribute || element === _body$1 ? false : (data = element.getAttribute("data-clickable")) === "true" || data !== "false" && (_clickableTagExp.test(element.nodeName + "") || element.getAttribute("contentEditable") === "true") ? true : _isClickable(element.parentNode); }, _setSelectable = function _setSelectable(elements, selectable) { var i = elements.length, e; while (i--) { e = elements[i]; e.ondragstart = e.onselectstart = selectable ? null : _emptyFunc; gsap.set(e, { lazy: true, userSelect: selectable ? "text" : "none" }); } }, _isFixed$1 = function _isFixed(element) { if (_getComputedStyle(element).position === "fixed") { return true; } element = element.parentNode; if (element && element.nodeType === 1) { return _isFixed(element); } }, _supports3D, _addPaddingBR, ScrollProxy = function ScrollProxy(element, vars) { element = gsap.utils.toArray(element)[0]; vars = vars || {}; var content = document.createElement("div"), style = content.style, node = element.firstChild, offsetTop = 0, offsetLeft = 0, prevTop = element.scrollTop, prevLeft = element.scrollLeft, scrollWidth = element.scrollWidth, scrollHeight = element.scrollHeight, extraPadRight = 0, maxLeft = 0, maxTop = 0, elementWidth, elementHeight, contentHeight, nextNode, transformStart, transformEnd; if (_supports3D && vars.force3D !== false) { transformStart = "translate3d("; transformEnd = "px,0px)"; } else if (_transformProp$1) { transformStart = "translate("; transformEnd = "px)"; } this.scrollTop = function (value, force) { if (!arguments.length) { return -this.top(); } this.top(-value, force); }; this.scrollLeft = function (value, force) { if (!arguments.length) { return -this.left(); } this.left(-value, force); }; this.left = function (value, force) { if (!arguments.length) { return -(element.scrollLeft + offsetLeft); } var dif = element.scrollLeft - prevLeft, oldOffset = offsetLeft; if ((dif > 2 || dif < -2) && !force) { prevLeft = element.scrollLeft; gsap.killTweensOf(this, { left: 1, scrollLeft: 1 }); this.left(-prevLeft); if (vars.onKill) { vars.onKill(); } return; } value = -value; if (value < 0) { offsetLeft = value - 0.5 | 0; value = 0; } else if (value > maxLeft) { offsetLeft = value - maxLeft | 0; value = maxLeft; } else { offsetLeft = 0; } if (offsetLeft || oldOffset) { if (!this._skip) { style[_transformProp$1] = transformStart + -offsetLeft + "px," + -offsetTop + transformEnd; } if (offsetLeft + extraPadRight >= 0) { style.paddingRight = offsetLeft + extraPadRight + "px"; } } element.scrollLeft = value | 0; prevLeft = element.scrollLeft; }; this.top = function (value, force) { if (!arguments.length) { return -(element.scrollTop + offsetTop); } var dif = element.scrollTop - prevTop, oldOffset = offsetTop; if ((dif > 2 || dif < -2) && !force) { prevTop = element.scrollTop; gsap.killTweensOf(this, { top: 1, scrollTop: 1 }); this.top(-prevTop); if (vars.onKill) { vars.onKill(); } return; } value = -value; if (value < 0) { offsetTop = value - 0.5 | 0; value = 0; } else if (value > maxTop) { offsetTop = value - maxTop | 0; value = maxTop; } else { offsetTop = 0; } if (offsetTop || oldOffset) { if (!this._skip) { style[_transformProp$1] = transformStart + -offsetLeft + "px," + -offsetTop + transformEnd; } } element.scrollTop = value | 0; prevTop = element.scrollTop; }; this.maxScrollTop = function () { return maxTop; }; this.maxScrollLeft = function () { return maxLeft; }; this.disable = function () { node = content.firstChild; while (node) { nextNode = node.nextSibling; element.appendChild(node); node = nextNode; } if (element === content.parentNode) { element.removeChild(content); } }; this.enable = function () { node = element.firstChild; if (node === content) { return; } while (node) { nextNode = node.nextSibling; content.appendChild(node); node = nextNode; } element.appendChild(content); this.calibrate(); }; this.calibrate = function (force) { var widthMatches = element.clientWidth === elementWidth, cs, x, y; prevTop = element.scrollTop; prevLeft = element.scrollLeft; if (widthMatches && element.clientHeight === elementHeight && content.offsetHeight === contentHeight && scrollWidth === element.scrollWidth && scrollHeight === element.scrollHeight && !force) { return; } if (offsetTop || offsetLeft) { x = this.left(); y = this.top(); this.left(-element.scrollLeft); this.top(-element.scrollTop); } cs = _getComputedStyle(element); if (!widthMatches || force) { style.display = "block"; style.width = "auto"; style.paddingRight = "0px"; extraPadRight = Math.max(0, element.scrollWidth - element.clientWidth); if (extraPadRight) { extraPadRight += parseFloat(cs.paddingLeft) + (_addPaddingBR ? parseFloat(cs.paddingRight) : 0); } } style.display = "inline-block"; style.position = "relative"; style.overflow = "visible"; style.verticalAlign = "top"; style.boxSizing = "content-box"; style.width = "100%"; style.paddingRight = extraPadRight + "px"; if (_addPaddingBR) { style.paddingBottom = cs.paddingBottom; } elementWidth = element.clientWidth; elementHeight = element.clientHeight; scrollWidth = element.scrollWidth; scrollHeight = element.scrollHeight; maxLeft = element.scrollWidth - elementWidth; maxTop = element.scrollHeight - elementHeight; contentHeight = content.offsetHeight; style.display = "block"; if (x || y) { this.left(x); this.top(y); } }; this.content = content; this.element = element; this._skip = false; this.enable(); }, _initCore = function _initCore(required) { if (_windowExists() && document.body) { var nav = window && window.navigator; _win$1 = window; _doc$1 = document; _docElement$1 = _doc$1.documentElement; _body$1 = _doc$1.body; _tempDiv = _createElement("div"); _supportsPointer = !!window.PointerEvent; _placeholderDiv = _createElement("div"); _placeholderDiv.style.cssText = "visibility:hidden;height:1px;top:-1px;pointer-events:none;position:relative;clear:both;cursor:grab"; _defaultCursor = _placeholderDiv.style.cursor === "grab" ? "grab" : "move"; _isAndroid = nav && nav.userAgent.toLowerCase().indexOf("android") !== -1; _isTouchDevice = "ontouchstart" in _docElement$1 && "orientation" in _win$1 || nav && (nav.MaxTouchPoints > 0 || nav.msMaxTouchPoints > 0); _addPaddingBR = function () { var div = _createElement("div"), child = _createElement("div"), childStyle = child.style, parent = _body$1, val; childStyle.display = "inline-block"; childStyle.position = "relative"; div.style.cssText = "width:90px;height:40px;padding:10px;overflow:auto;visibility:hidden"; div.appendChild(child); parent.appendChild(div); val = child.offsetHeight + 18 > div.scrollHeight; parent.removeChild(div); return val; }(); _touchEventLookup = function (types) { var standard = types.split(","), converted = ("onpointerdown" in _tempDiv ? "pointerdown,pointermove,pointerup,pointercancel" : "onmspointerdown" in _tempDiv ? "MSPointerDown,MSPointerMove,MSPointerUp,MSPointerCancel" : types).split(","), obj = {}, i = 4; while (--i > -1) { obj[standard[i]] = converted[i]; obj[converted[i]] = standard[i]; } try { _docElement$1.addEventListener("test", null, Object.defineProperty({}, "passive", { get: function get() { _supportsPassive = 1; } })); } catch (e) {} return obj; }("touchstart,touchmove,touchend,touchcancel"); _addListener(_doc$1, "touchcancel", _emptyFunc); _addListener(_win$1, "touchmove", _emptyFunc); _body$1 && _body$1.addEventListener("touchstart", _emptyFunc); _addListener(_doc$1, "contextmenu", function () { for (var p in _lookup) { if (_lookup[p].isPressed) { _lookup[p].endDrag(); } } }); gsap = _coreInitted = _getGSAP(); } if (gsap) { InertiaPlugin = gsap.plugins.inertia; _context = gsap.core.context || function () {}; _checkPrefix = gsap.utils.checkPrefix; _transformProp$1 = _checkPrefix(_transformProp$1); _transformOriginProp$1 = _checkPrefix(_transformOriginProp$1); _toArray = gsap.utils.toArray; _getStyleSaver = gsap.core.getStyleSaver; _supports3D = !!_checkPrefix("perspective"); } else if (required) { console.warn("Please gsap.registerPlugin(Draggable)"); } }; var EventDispatcher = function () { function EventDispatcher(target) { this._listeners = {}; this.target = target || this; } var _proto = EventDispatcher.prototype; _proto.addEventListener = function addEventListener(type, callback) { var list = this._listeners[type] || (this._listeners[type] = []); if (!~list.indexOf(callback)) { list.push(callback); } }; _proto.removeEventListener = function removeEventListener(type, callback) { var list = this._listeners[type], i = list && list.indexOf(callback); i >= 0 && list.splice(i, 1); }; _proto.dispatchEvent = function dispatchEvent(type) { var _this = this; var result; (this._listeners[type] || []).forEach(function (callback) { return callback.call(_this, { type: type, target: _this.target }) === false && (result = false); }); return result; }; return EventDispatcher; }(); var Draggable = function (_EventDispatcher) { _inheritsLoose(Draggable, _EventDispatcher); function Draggable(target, vars) { var _this2; _this2 = _EventDispatcher.call(this) || this; _coreInitted || _initCore(1); target = _toArray(target)[0]; _this2.styles = _getStyleSaver && _getStyleSaver(target, "transform,left,top"); if (!InertiaPlugin) { InertiaPlugin = gsap.plugins.inertia; } _this2.vars = vars = _copy(vars || {}); _this2.target = target; _this2.x = _this2.y = _this2.rotation = 0; _this2.dragResistance = parseFloat(vars.dragResistance) || 0; _this2.edgeResistance = isNaN(vars.edgeResistance) ? 1 : parseFloat(vars.edgeResistance) || 0; _this2.lockAxis = vars.lockAxis; _this2.autoScroll = vars.autoScroll || 0; _this2.lockedAxis = null; _this2.allowEventDefault = !!vars.allowEventDefault; gsap.getProperty(target, "x"); var type = (vars.type || "x,y").toLowerCase(), xyMode = ~type.indexOf("x") || ~type.indexOf("y"), rotationMode = type.indexOf("rotation") !== -1, xProp = rotationMode ? "rotation" : xyMode ? "x" : "left", yProp = xyMode ? "y" : "top", allowX = !!(~type.indexOf("x") || ~type.indexOf("left") || type === "scroll"), allowY = !!(~type.indexOf("y") || ~type.indexOf("top") || type === "scroll"), minimumMovement = vars.minimumMovement || 2, self = _assertThisInitialized(_this2), triggers = _toArray(vars.trigger || vars.handle || target), killProps = {}, dragEndTime = 0, checkAutoScrollBounds = false, autoScrollMarginTop = vars.autoScrollMarginTop || 40, autoScrollMarginRight = vars.autoScrollMarginRight || 40, autoScrollMarginBottom = vars.autoScrollMarginBottom || 40, autoScrollMarginLeft = vars.autoScrollMarginLeft || 40, isClickable = vars.clickableTest || _isClickable, clickTime = 0, gsCache = target._gsap || gsap.core.getCache(target), isFixed = _isFixed$1(target), getPropAsNum = function getPropAsNum(property, unit) { return parseFloat(gsCache.get(target, property, unit)); }, ownerDoc = target.ownerDocument || _doc$1, enabled, scrollProxy, startPointerX, startPointerY, startElementX, startElementY, hasBounds, hasDragCallback, hasMoveCallback, maxX, minX, maxY, minY, touch, touchID, rotationOrigin, dirty, old, snapX, snapY, snapXY, isClicking, touchEventTarget, matrix, interrupted, allowNativeTouchScrolling, touchDragAxis, isDispatching, clickDispatch, trustedClickDispatch, isPreventingDefault, innerMatrix, dragged, onContextMenu = function onContextMenu(e) { _preventDefault(e); e.stopImmediatePropagation && e.stopImmediatePropagation(); return false; }, render = function render(suppressEvents) { if (self.autoScroll && self.isDragging && (checkAutoScrollBounds || dirty)) { var e = target, autoScrollFactor = self.autoScroll * 15, parent, isRoot, rect, pointerX, pointerY, changeX, changeY, gap; checkAutoScrollBounds = false; _windowProxy.scrollTop = _win$1.pageYOffset != null ? _win$1.pageYOffset : ownerDoc.documentElement.scrollTop != null ? ownerDoc.documentElement.scrollTop : ownerDoc.body.scrollTop; _windowProxy.scrollLeft = _win$1.pageXOffset != null ? _win$1.pageXOffset : ownerDoc.documentElement.scrollLeft != null ? ownerDoc.documentElement.scrollLeft : ownerDoc.body.scrollLeft; pointerX = self.pointerX - _windowProxy.scrollLeft; pointerY = self.pointerY - _windowProxy.scrollTop; while (e && !isRoot) { isRoot = _isRoot(e.parentNode); parent = isRoot ? _windowProxy : e.parentNode; rect = isRoot ? { bottom: Math.max(_docElement$1.clientHeight, _win$1.innerHeight || 0), right: Math.max(_docElement$1.clientWidth, _win$1.innerWidth || 0), left: 0, top: 0 } : parent.getBoundingClientRect(); changeX = changeY = 0; if (allowY) { gap = parent._gsMaxScrollY - parent.scrollTop; if (gap < 0) { changeY = gap; } else if (pointerY > rect.bottom - autoScrollMarginBottom && gap) { checkAutoScrollBounds = true; changeY = Math.min(gap, autoScrollFactor * (1 - Math.max(0, rect.bottom - pointerY) / autoScrollMarginBottom) | 0); } else if (pointerY < rect.top + autoScrollMarginTop && parent.scrollTop) { checkAutoScrollBounds = true; changeY = -Math.min(parent.scrollTop, autoScrollFactor * (1 - Math.max(0, pointerY - rect.top) / autoScrollMarginTop) | 0); } if (changeY) { parent.scrollTop += changeY; } } if (allowX) { gap = parent._gsMaxScrollX - parent.scrollLeft; if (gap < 0) { changeX = gap; } else if (pointerX > rect.right - autoScrollMarginRight && gap) { checkAutoScrollBounds = true; changeX = Math.min(gap, autoScrollFactor * (1 - Math.max(0, rect.right - pointerX) / autoScrollMarginRight) | 0); } else if (pointerX < rect.left + autoScrollMarginLeft && parent.scrollLeft) { checkAutoScrollBounds = true; changeX = -Math.min(parent.scrollLeft, autoScrollFactor * (1 - Math.max(0, pointerX - rect.left) / autoScrollMarginLeft) | 0); } if (changeX) { parent.scrollLeft += changeX; } } if (isRoot && (changeX || changeY)) { _win$1.scrollTo(parent.scrollLeft, parent.scrollTop); setPointerPosition(self.pointerX + changeX, self.pointerY + changeY); } e = parent; } } if (dirty) { var x = self.x, y = self.y; if (rotationMode) { self.deltaX = x - parseFloat(gsCache.rotation); self.rotation = x; gsCache.rotation = x + "deg"; gsCache.renderTransform(1, gsCache); } else { if (scrollProxy) { if (allowY) { self.deltaY = y - scrollProxy.top(); scrollProxy.top(y); } if (allowX) { self.deltaX = x - scrollProxy.left(); scrollProxy.left(x); } } else if (xyMode) { if (allowY) { self.deltaY = y - parseFloat(gsCache.y); gsCache.y = y + "px"; } if (allowX) { self.deltaX = x - parseFloat(gsCache.x); gsCache.x = x + "px"; } gsCache.renderTransform(1, gsCache); } else { if (allowY) { self.deltaY = y - parseFloat(target.style.top || 0); target.style.top = y + "px"; } if (allowX) { self.deltaX = x - parseFloat(target.style.left || 0); target.style.left = x + "px"; } } } if (hasDragCallback && !suppressEvents && !isDispatching) { isDispatching = true; if (_dispatchEvent(self, "drag", "onDrag") === false) { if (allowX) { self.x -= self.deltaX; } if (allowY) { self.y -= self.deltaY; } render(true); } isDispatching = false; } } dirty = false; }, syncXY = function syncXY(skipOnUpdate, skipSnap) { var x = self.x, y = self.y, snappedValue, cs; if (!target._gsap) { gsCache = gsap.core.getCache(target); } gsCache.uncache && gsap.getProperty(target, "x"); if (xyMode) { self.x = parseFloat(gsCache.x); self.y = parseFloat(gsCache.y); } else if (rotationMode) { self.x = self.rotation = parseFloat(gsCache.rotation); } else if (scrollProxy) { self.y = scrollProxy.top(); self.x = scrollProxy.left(); } else { self.y = parseFloat(target.style.top || (cs = _getComputedStyle(target)) && cs.top) || 0; self.x = parseFloat(target.style.left || (cs || {}).left) || 0; } if ((snapX || snapY || snapXY) && !skipSnap && (self.isDragging || self.isThrowing)) { if (snapXY) { _temp1.x = self.x; _temp1.y = self.y; snappedValue = snapXY(_temp1); if (snappedValue.x !== self.x) { self.x = snappedValue.x; dirty = true; } if (snappedValue.y !== self.y) { self.y = snappedValue.y; dirty = true; } } if (snapX) { snappedValue = snapX(self.x); if (snappedValue !== self.x) { self.x = snappedValue; if (rotationMode) { self.rotation = snappedValue; } dirty = true; } } if (snapY) { snappedValue = snapY(self.y); if (snappedValue !== self.y) { self.y = snappedValue; } dirty = true; } } dirty && render(true); if (!skipOnUpdate) { self.deltaX = self.x - x; self.deltaY = self.y - y; _dispatchEvent(self, "throwupdate", "onThrowUpdate"); } }, buildSnapFunc = function buildSnapFunc(snap, min, max, factor) { if (min == null) { min = -_bigNum; } if (max == null) { max = _bigNum; } if (_isFunction(snap)) { return function (n) { var edgeTolerance = !self.isPressed ? 1 : 1 - self.edgeResistance; return snap.call(self, (n > max ? max + (n - max) * edgeTolerance : n < min ? min + (n - min) * edgeTolerance : n) * factor) * factor; }; } if (_isArray(snap)) { return function (n) { var i = snap.length, closest = 0, absDif = _bigNum, val, dif; while (--i > -1) { val = snap[i]; dif = val - n; if (dif < 0) { dif = -dif; } if (dif < absDif && val >= min && val <= max) { closest = i; absDif = dif; } } return snap[closest]; }; } return isNaN(snap) ? function (n) { return n; } : function () { return snap * factor; }; }, buildPointSnapFunc = function buildPointSnapFunc(snap, minX, maxX, minY, maxY, radius, factor) { radius = radius && radius < _bigNum ? radius * radius : _bigNum; if (_isFunction(snap)) { return function (point) { var edgeTolerance = !self.isPressed ? 1 : 1 - self.edgeResistance, x = point.x, y = point.y, result, dx, dy; point.x = x = x > maxX ? maxX + (x - maxX) * edgeTolerance : x < minX ? minX + (x - minX) * edgeTolerance : x; point.y = y = y > maxY ? maxY + (y - maxY) * edgeTolerance : y < minY ? minY + (y - minY) * edgeTolerance : y; result = snap.call(self, point); if (result !== point) { point.x = result.x; point.y = result.y; } if (factor !== 1) { point.x *= factor; point.y *= factor; } if (radius < _bigNum) { dx = point.x - x; dy = point.y - y; if (dx * dx + dy * dy > radius) { point.x = x; point.y = y; } } return point; }; } if (_isArray(snap)) { return function (p) { var i = snap.length, closest = 0, minDist = _bigNum, x, y, point, dist; while (--i > -1) { point = snap[i]; x = point.x - p.x; y = point.y - p.y; dist = x * x + y * y; if (dist < minDist) { closest = i; minDist = dist; } } return minDist <= radius ? snap[closest] : p; }; } return function (n) { return n; }; }, calculateBounds = function calculateBounds() { var bounds, targetBounds, snap, snapIsRaw; hasBounds = false; if (scrollProxy) { scrollProxy.calibrate(); self.minX = minX = -scrollProxy.maxScrollLeft(); self.minY = minY = -scrollProxy.maxScrollTop(); self.maxX = maxX = self.maxY = maxY = 0; hasBounds = true; } else if (!!vars.bounds) { bounds = _getBounds(vars.bounds, target.parentNode); if (rotationMode) { self.minX = minX = bounds.left; self.maxX = maxX = bounds.left + bounds.width; self.minY = minY = self.maxY = maxY = 0; } else if (!_isUndefined(vars.bounds.maxX) || !_isUndefined(vars.bounds.maxY)) { bounds = vars.bounds; self.minX = minX = bounds.minX; self.minY = minY = bounds.minY; self.maxX = maxX = bounds.maxX; self.maxY = maxY = bounds.maxY; } else { targetBounds = _getBounds(target, target.parentNode); self.minX = minX = Math.round(getPropAsNum(xProp, "px") + bounds.left - targetBounds.left); self.minY = minY = Math.round(getPropAsNum(yProp, "px") + bounds.top - targetBounds.top); self.maxX = maxX = Math.round(minX + (bounds.width - targetBounds.width)); self.maxY = maxY = Math.round(minY + (bounds.height - targetBounds.height)); } if (minX > maxX) { self.minX = maxX; self.maxX = maxX = minX; minX = self.minX; } if (minY > maxY) { self.minY = maxY; self.maxY = maxY = minY; minY = self.minY; } if (rotationMode) { self.minRotation = minX; self.maxRotation = maxX; } hasBounds = true; } if (vars.liveSnap) { snap = vars.liveSnap === true ? vars.snap || {} : vars.liveSnap; snapIsRaw = _isArray(snap) || _isFunction(snap); if (rotationMode) { snapX = buildSnapFunc(snapIsRaw ? snap : snap.rotation, minX, maxX, 1); snapY = null; } else { if (snap.points) { snapXY = buildPointSnapFunc(snapIsRaw ? snap : snap.points, minX, maxX, minY, maxY, snap.radius, scrollProxy ? -1 : 1); } else { if (allowX) { snapX = buildSnapFunc(snapIsRaw ? snap : snap.x || snap.left || snap.scrollLeft, minX, maxX, scrollProxy ? -1 : 1); } if (allowY) { snapY = buildSnapFunc(snapIsRaw ? snap : snap.y || snap.top || snap.scrollTop, minY, maxY, scrollProxy ? -1 : 1); } } } } }, onThrowComplete = function onThrowComplete() { self.isThrowing = false; _dispatchEvent(self, "throwcomplete", "onThrowComplete"); }, onThrowInterrupt = function onThrowInterrupt() { self.isThrowing = false; }, animate = function animate(inertia, forceZeroVelocity) { var snap, snapIsRaw, tween, overshootTolerance; if (inertia && InertiaPlugin) { if (inertia === true) { snap = vars.snap || vars.liveSnap || {}; snapIsRaw = _isArray(snap) || _isFunction(snap); inertia = { resistance: (vars.throwResistance || vars.resistance || 1000) / (rotationMode ? 10 : 1) }; if (rotationMode) { inertia.rotation = _parseInertia(self, snapIsRaw ? snap : snap.rotation, maxX, minX, 1, forceZeroVelocity); } else { if (allowX) { inertia[xProp] = _parseInertia(self, snapIsRaw ? snap : snap.points || snap.x || snap.left, maxX, minX, scrollProxy ? -1 : 1, forceZeroVelocity || self.lockedAxis === "x"); } if (allowY) { inertia[yProp] = _parseInertia(self, snapIsRaw ? snap : snap.points || snap.y || snap.top, maxY, minY, scrollProxy ? -1 : 1, forceZeroVelocity || self.lockedAxis === "y"); } if (snap.points || _isArray(snap) && _isObject(snap[0])) { inertia.linkedProps = xProp + "," + yProp; inertia.radius = snap.radius; } } } self.isThrowing = true; overshootTolerance = !isNaN(vars.overshootTolerance) ? vars.overshootTolerance : vars.edgeResistance === 1 ? 0 : 1 - self.edgeResistance + 0.2; if (!inertia.duration) { inertia.duration = { max: Math.max(vars.minDuration || 0, "maxDuration" in vars ? vars.maxDuration : 2), min: !isNaN(vars.minDuration) ? vars.minDuration : overshootTolerance === 0 || _isObject(inertia) && inertia.resistance > 1000 ? 0 : 0.5, overshoot: overshootTolerance }; } self.tween = tween = gsap.to(scrollProxy || target, { inertia: inertia, data: "_draggable", onComplete: onThrowComplete, onInterrupt: onThrowInterrupt, onUpdate: vars.fastMode ? _dispatchEvent : syncXY, onUpdateParams: vars.fastMode ? [self, "onthrowupdate", "onThrowUpdate"] : snap && snap.radius ? [false, true] : [] }); if (!vars.fastMode) { if (scrollProxy) { scrollProxy._skip = true; } tween.render(1e9, true, true); syncXY(true, true); self.endX = self.x; self.endY = self.y; if (rotationMode) { self.endRotation = self.x; } tween.play(0); syncXY(true, true); if (scrollProxy) { scrollProxy._skip = false; } } } else if (hasBounds) { self.applyBounds(); } }, updateMatrix = function updateMatrix(shiftStart) { var start = matrix, p; matrix = getGlobalMatrix(target.parentNode, true); if (shiftStart && self.isPressed && !matrix.equals(start || new Matrix2D())) { p = start.inverse().apply({ x: startPointerX, y: startPointerY }); matrix.apply(p, p); startPointerX = p.x; startPointerY = p.y; } if (matrix.equals(_identityMatrix$1)) { matrix = null; } }, recordStartPositions = function recordStartPositions() { var edgeTolerance = 1 - self.edgeResistance, offsetX = isFixed ? _getDocScrollLeft$1(ownerDoc) : 0, offsetY = isFixed ? _getDocScrollTop$1(ownerDoc) : 0, parsedOrigin, x, y; if (xyMode) { gsCache.x = getPropAsNum(xProp, "px") + "px"; gsCache.y = getPropAsNum(yProp, "px") + "px"; gsCache.renderTransform(); } updateMatrix(false); _point1.x = self.pointerX - offsetX; _point1.y = self.pointerY - offsetY; matrix && matrix.apply(_point1, _point1); startPointerX = _point1.x; startPointerY = _point1.y; if (dirty) { setPointerPosition(self.pointerX, self.pointerY); render(true); } innerMatrix = getGlobalMatrix(target); if (scrollProxy) { calculateBounds(); startElementY = scrollProxy.top(); startElementX = scrollProxy.left(); } else { if (isTweening()) { syncXY(true, true); calculateBounds(); } else { self.applyBounds(); } if (rotationMode) { parsedOrigin = target.ownerSVGElement ? [gsCache.xOrigin - target.getBBox().x, gsCache.yOrigin - target.getBBox().y] : (_getComputedStyle(target)[_transformOriginProp$1] || "0 0").split(" "); rotationOrigin = self.rotationOrigin = getGlobalMatrix(target).apply({ x: parseFloat(parsedOrigin[0]) || 0, y: parseFloat(parsedOrigin[1]) || 0 }); syncXY(true, true); x = self.pointerX - rotationOrigin.x - offsetX; y = rotationOrigin.y - self.pointerY + offsetY; startElementX = self.x; startElementY = self.y = Math.atan2(y, x) * _RAD2DEG; } else { startElementY = getPropAsNum(yProp, "px"); startElementX = getPropAsNum(xProp, "px"); } } if (hasBounds && edgeTolerance) { if (startElementX > maxX) { startElementX = maxX + (startElementX - maxX) / edgeTolerance; } else if (startElementX < minX) { startElementX = minX - (minX - startElementX) / edgeTolerance; } if (!rotationMode) { if (startElementY > maxY) { startElementY = maxY + (startElementY - maxY) / edgeTolerance; } else if (startElementY < minY) { startElementY = minY - (minY - startElementY) / edgeTolerance; } } } self.startX = startElementX = _round(startElementX); self.startY = startElementY = _round(startElementY); }, isTweening = function isTweening() { return self.tween && self.tween.isActive(); }, removePlaceholder = function removePlaceholder() { if (_placeholderDiv.parentNode && !isTweening() && !self.isDragging) { _placeholderDiv.parentNode.removeChild(_placeholderDiv); } }, onPress = function onPress(e, force) { var i; if (!enabled || self.isPressed || !e || (e.type === "mousedown" || e.type === "pointerdown") && !force && _getTime() - clickTime < 30 && _touchEventLookup[self.pointerEvent.type]) { isPreventingDefault && e && enabled && _preventDefault(e); return; } interrupted = isTweening(); dragged = false; self.pointerEvent = e; if (_touchEventLookup[e.type]) { touchEventTarget = ~e.type.indexOf("touch") ? e.currentTarget || e.target : ownerDoc; _addListener(touchEventTarget, "touchend", onRelease); _addListener(touchEventTarget, "touchmove", onMove); _addListener(touchEventTarget, "touchcancel", onRelease); _addListener(ownerDoc, "touchstart", _onMultiTouchDocument); } else { touchEventTarget = null; _addListener(ownerDoc, "mousemove", onMove); } touchDragAxis = null; if (!_supportsPointer || !touchEventTarget) { _addListener(ownerDoc, "mouseup", onRelease); e && e.target && _addListener(e.target, "mouseup", onRelease); } isClicking = isClickable.call(self, e.target) && vars.dragClickables === false && !force; if (isClicking) { _addListener(e.target, "change", onRelease); _dispatchEvent(self, "pressInit", "onPressInit"); _dispatchEvent(self, "press", "onPress"); _setSelectable(triggers, true); isPreventingDefault = false; return; } allowNativeTouchScrolling = !touchEventTarget || allowX === allowY || self.vars.allowNativeTouchScrolling === false || self.vars.allowContextMenu && e && (e.ctrlKey || e.which > 2) ? false : allowX ? "y" : "x"; isPreventingDefault = !allowNativeTouchScrolling && !self.allowEventDefault; if (isPreventingDefault) { _preventDefault(e); _addListener(_win$1, "touchforcechange", _preventDefault); } if (e.changedTouches) { e = touch = e.changedTouches[0]; touchID = e.identifier; } else if (e.pointerId) { touchID = e.pointerId; } else { touch = touchID = null; } _dragCount++; _addToRenderQueue(render); startPointerY = self.pointerY = e.pageY; startPointerX = self.pointerX = e.pageX; _dispatchEvent(self, "pressInit", "onPressInit"); if (allowNativeTouchScrolling || self.autoScroll) { _recordMaxScrolls(target.parentNode); } if (target.parentNode && self.autoScroll && !scrollProxy && !rotationMode && target.parentNode._gsMaxScrollX && !_placeholderDiv.parentNode && !target.getBBox) { _placeholderDiv.style.width = target.parentNode.scrollWidth + "px"; target.parentNode.appendChild(_placeholderDiv); } recordStartPositions(); self.tween && self.tween.kill(); self.isThrowing = false; gsap.killTweensOf(scrollProxy || target, killProps, true); scrollProxy && gsap.killTweensOf(target, { scrollTo: 1 }, true); self.tween = self.lockedAxis = null; if (vars.zIndexBoost || !rotationMode && !scrollProxy && vars.zIndexBoost !== false) { target.style.zIndex = Draggable.zIndex++; } self.isPressed = true; hasDragCallback = !!(vars.onDrag || self._listeners.drag); hasMoveCallback = !!(vars.onMove || self._listeners.move); if (vars.cursor !== false || vars.activeCursor) { i = triggers.length; while (--i > -1) { gsap.set(triggers[i], { cursor: vars.activeCursor || vars.cursor || (_defaultCursor === "grab" ? "grabbing" : _defaultCursor) }); } } _dispatchEvent(self, "press", "onPress"); }, onMove = function onMove(e) { var originalEvent = e, touches, pointerX, pointerY, i, dx, dy; if (!enabled || _isMultiTouching || !self.isPressed || !e) { isPreventingDefault && e && enabled && _preventDefault(e); return; } self.pointerEvent = e; touches = e.changedTouches; if (touches) { e = touches[0]; if (e !== touch && e.identifier !== touchID) { i = touches.length; while (--i > -1 && (e = touches[i]).identifier !== touchID && e.target !== target) {} if (i < 0) { return; } } } else if (e.pointerId && touchID && e.pointerId !== touchID) { return; } if (touchEventTarget && allowNativeTouchScrolling && !touchDragAxis) { _point1.x = e.pageX - (isFixed ? _getDocScrollLeft$1(ownerDoc) : 0); _point1.y = e.pageY - (isFixed ? _getDocScrollTop$1(ownerDoc) : 0); matrix && matrix.apply(_point1, _point1); pointerX = _point1.x; pointerY = _point1.y; dx = Math.abs(pointerX - startPointerX); dy = Math.abs(pointerY - startPointerY); if (dx !== dy && (dx > minimumMovement || dy > minimumMovement) || _isAndroid && allowNativeTouchScrolling === touchDragAxis) { touchDragAxis = dx > dy && allowX ? "x" : "y"; if (allowNativeTouchScrolling && touchDragAxis !== allowNativeTouchScrolling) { _addListener(_win$1, "touchforcechange", _preventDefault); } if (self.vars.lockAxisOnTouchScroll !== false && allowX && allowY) { self.lockedAxis = touchDragAxis === "x" ? "y" : "x"; _isFunction(self.vars.onLockAxis) && self.vars.onLockAxis.call(self, originalEvent); } if (_isAndroid && allowNativeTouchScrolling === touchDragAxis) { onRelease(originalEvent); return; } } } if (!self.allowEventDefault && (!allowNativeTouchScrolling || touchDragAxis && allowNativeTouchScrolling !== touchDragAxis) && originalEvent.cancelable !== false) { _preventDefault(originalEvent); isPreventingDefault = true; } else if (isPreventingDefault) { isPreventingDefault = false; } if (self.autoScroll) { checkAutoScrollBounds = true; } setPointerPosition(e.pageX, e.pageY, hasMoveCallback); }, setPointerPosition = function setPointerPosition(pointerX, pointerY, invokeOnMove) { var dragTolerance = 1 - self.dragResistance, edgeTolerance = 1 - self.edgeResistance, prevPointerX = self.pointerX, prevPointerY = self.pointerY, prevStartElementY = startElementY, prevX = self.x, prevY = self.y, prevEndX = self.endX, prevEndY = self.endY, prevEndRotation = self.endRotation, prevDirty = dirty, xChange, yChange, x, y, dif, temp; self.pointerX = pointerX; self.pointerY = pointerY; if (isFixed) { pointerX -= _getDocScrollLeft$1(ownerDoc); pointerY -= _getDocScrollTop$1(ownerDoc); } if (rotationMode) { y = Math.atan2(rotationOrigin.y - pointerY, pointerX - rotationOrigin.x) * _RAD2DEG; dif = self.y - y; if (dif > 180) { startElementY -= 360; self.y = y; } else if (dif < -180) { startElementY += 360; self.y = y; } if (self.x !== startElementX || Math.abs(startElementY - y) > minimumMovement) { self.y = y; x = startElementX + (startElementY - y) * dragTolerance; } else { x = startElementX; } } else { if (matrix) { temp = pointerX * matrix.a + pointerY * matrix.c + matrix.e; pointerY = pointerX * matrix.b + pointerY * matrix.d + matrix.f; pointerX = temp; } yChange = pointerY - startPointerY; xChange = pointerX - startPointerX; if (yChange < minimumMovement && yChange > -minimumMovement) { yChange = 0; } if (xChange < minimumMovement && xChange > -minimumMovement) { xChange = 0; } if ((self.lockAxis || self.lockedAxis) && (xChange || yChange)) { temp = self.lockedAxis; if (!temp) { self.lockedAxis = temp = allowX && Math.abs(xChange) > Math.abs(yChange) ? "y" : allowY ? "x" : null; if (temp && _isFunction(self.vars.onLockAxis)) { self.vars.onLockAxis.call(self, self.pointerEvent); } } if (temp === "y") { yChange = 0; } else if (temp === "x") { xChange = 0; } } x = _round(startElementX + xChange * dragTolerance); y = _round(startElementY + yChange * dragTolerance); } if ((snapX || snapY || snapXY) && (self.x !== x || self.y !== y && !rotationMode)) { if (snapXY) { _temp1.x = x; _temp1.y = y; temp = snapXY(_temp1); x = _round(temp.x); y = _round(temp.y); } if (snapX) { x = _round(snapX(x)); } if (snapY) { y = _round(snapY(y)); } } if (hasBounds) { if (x > maxX) { x = maxX + Math.round((x - maxX) * edgeTolerance); } else if (x < minX) { x = minX + Math.round((x - minX) * edgeTolerance); } if (!rotationMode) { if (y > maxY) { y = Math.round(maxY + (y - maxY) * edgeTolerance); } else if (y < minY) { y = Math.round(minY + (y - minY) * edgeTolerance); } } } if (self.x !== x || self.y !== y && !rotationMode) { if (rotationMode) { self.endRotation = self.x = self.endX = x; dirty = true; } else { if (allowY) { self.y = self.endY = y; dirty = true; } if (allowX) { self.x = self.endX = x; dirty = true; } } if (!invokeOnMove || _dispatchEvent(self, "move", "onMove") !== false) { if (!self.isDragging && self.isPressed) { self.isDragging = dragged = true; _dispatchEvent(self, "dragstart", "onDragStart"); } } else { self.pointerX = prevPointerX; self.pointerY = prevPointerY; startElementY = prevStartElementY; self.x = prevX; self.y = prevY; self.endX = prevEndX; self.endY = prevEndY; self.endRotation = prevEndRotation; dirty = prevDirty; } } }, onRelease = function onRelease(e, force) { if (!enabled || !self.isPressed || e && touchID != null && !force && (e.pointerId && e.pointerId !== touchID && e.target !== target || e.changedTouches && !_hasTouchID(e.changedTouches, touchID))) { isPreventingDefault && e && enabled && _preventDefault(e); return; } self.isPressed = false; var originalEvent = e, wasDragging = self.isDragging, isContextMenuRelease = self.vars.allowContextMenu && e && (e.ctrlKey || e.which > 2), placeholderDelayedCall = gsap.delayedCall(0.001, removePlaceholder), touches, i, syntheticEvent, eventTarget, syntheticClick; if (touchEventTarget) { _removeListener(touchEventTarget, "touchend", onRelease); _removeListener(touchEventTarget, "touchmove", onMove); _removeListener(touchEventTarget, "touchcancel", onRelease); _removeListener(ownerDoc, "touchstart", _onMultiTouchDocument); } else { _removeListener(ownerDoc, "mousemove", onMove); } _removeListener(_win$1, "touchforcechange", _preventDefault); if (!_supportsPointer || !touchEventTarget) { _removeListener(ownerDoc, "mouseup", onRelease); e && e.target && _removeListener(e.target, "mouseup", onRelease); } dirty = false; if (wasDragging) { dragEndTime = _lastDragTime = _getTime(); self.isDragging = false; } _removeFromRenderQueue(render); if (isClicking && !isContextMenuRelease) { if (e) { _removeListener(e.target, "change", onRelease); self.pointerEvent = originalEvent; } _setSelectable(triggers, false); _dispatchEvent(self, "release", "onRelease"); _dispatchEvent(self, "click", "onClick"); isClicking = false; return; } i = triggers.length; while (--i > -1) { _setStyle(triggers[i], "cursor", vars.cursor || (vars.cursor !== false ? _defaultCursor : null)); } _dragCount--; if (e) { touches = e.changedTouches; if (touches) { e = touches[0]; if (e !== touch && e.identifier !== touchID) { i = touches.length; while (--i > -1 && (e = touches[i]).identifier !== touchID && e.target !== target) {} if (i < 0 && !force) { return; } } } self.pointerEvent = originalEvent; self.pointerX = e.pageX; self.pointerY = e.pageY; } if (isContextMenuRelease && originalEvent) { _preventDefault(originalEvent); isPreventingDefault = true; _dispatchEvent(self, "release", "onRelease"); } else if (originalEvent && !wasDragging) { isPreventingDefault = false; if (interrupted && (vars.snap || vars.bounds)) { animate(vars.inertia || vars.throwProps); } _dispatchEvent(self, "release", "onRelease"); if ((!_isAndroid || originalEvent.type !== "touchmove") && originalEvent.type.indexOf("cancel") === -1) { _dispatchEvent(self, "click", "onClick"); if (_getTime() - clickTime < 300) { _dispatchEvent(self, "doubleclick", "onDoubleClick"); } eventTarget = originalEvent.target || target; clickTime = _getTime(); syntheticClick = function syntheticClick() { if (clickTime !== clickDispatch && self.enabled() && !self.isPressed && !originalEvent.defaultPrevented) { if (eventTarget.click) { eventTarget.click(); } else if (ownerDoc.createEvent) { syntheticEvent = ownerDoc.createEvent("MouseEvents"); syntheticEvent.initMouseEvent("click", true, true, _win$1, 1, self.pointerEvent.screenX, self.pointerEvent.screenY, self.pointerX, self.pointerY, false, false, false, false, 0, null); eventTarget.dispatchEvent(syntheticEvent); } } }; if (!_isAndroid && !originalEvent.defaultPrevented) { gsap.delayedCall(0.05, syntheticClick); } } } else { animate(vars.inertia || vars.throwProps); if (!self.allowEventDefault && originalEvent && (vars.dragClickables !== false || !isClickable.call(self, originalEvent.target)) && wasDragging && (!allowNativeTouchScrolling || touchDragAxis && allowNativeTouchScrolling === touchDragAxis) && originalEvent.cancelable !== false) { isPreventingDefault = true; _preventDefault(originalEvent); } else { isPreventingDefault = false; } _dispatchEvent(self, "release", "onRelease"); } isTweening() && placeholderDelayedCall.duration(self.tween.duration()); wasDragging && _dispatchEvent(self, "dragend", "onDragEnd"); return true; }, updateScroll = function updateScroll(e) { if (e && self.isDragging && !scrollProxy) { var parent = e.target || target.parentNode, deltaX = parent.scrollLeft - parent._gsScrollX, deltaY = parent.scrollTop - parent._gsScrollY; if (deltaX || deltaY) { if (matrix) { startPointerX -= deltaX * matrix.a + deltaY * matrix.c; startPointerY -= deltaY * matrix.d + deltaX * matrix.b; } else { startPointerX -= deltaX; startPointerY -= deltaY; } parent._gsScrollX += deltaX; parent._gsScrollY += deltaY; setPointerPosition(self.pointerX, self.pointerY); } } }, onClick = function onClick(e) { var time = _getTime(), recentlyClicked = time - clickTime < 100, recentlyDragged = time - dragEndTime < 50, alreadyDispatched = recentlyClicked && clickDispatch === clickTime, defaultPrevented = self.pointerEvent && self.pointerEvent.defaultPrevented, alreadyDispatchedTrusted = recentlyClicked && trustedClickDispatch === clickTime, trusted = e.isTrusted || e.isTrusted == null && recentlyClicked && alreadyDispatched; if ((alreadyDispatched || recentlyDragged && self.vars.suppressClickOnDrag !== false) && e.stopImmediatePropagation) { e.stopImmediatePropagation(); } if (recentlyClicked && !(self.pointerEvent && self.pointerEvent.defaultPrevented) && (!alreadyDispatched || trusted && !alreadyDispatchedTrusted)) { if (trusted && alreadyDispatched) { trustedClickDispatch = clickTime; } clickDispatch = clickTime; return; } if (self.isPressed || recentlyDragged || recentlyClicked) { if (!trusted || !e.detail || !recentlyClicked || defaultPrevented) { _preventDefault(e); } } if (!recentlyClicked && !recentlyDragged && !dragged) { e && e.target && (self.pointerEvent = e); _dispatchEvent(self, "click", "onClick"); } }, localizePoint = function localizePoint(p) { return matrix ? { x: p.x * matrix.a + p.y * matrix.c + matrix.e, y: p.x * matrix.b + p.y * matrix.d + matrix.f } : { x: p.x, y: p.y }; }; old = Draggable.get(target); old && old.kill(); _this2.startDrag = function (event, align) { var r1, r2, p1, p2; onPress(event || self.pointerEvent, true); if (align && !self.hitTest(event || self.pointerEvent)) { r1 = _parseRect(event || self.pointerEvent); r2 = _parseRect(target); p1 = localizePoint({ x: r1.left + r1.width / 2, y: r1.top + r1.height / 2 }); p2 = localizePoint({ x: r2.left + r2.width / 2, y: r2.top + r2.height / 2 }); startPointerX -= p1.x - p2.x; startPointerY -= p1.y - p2.y; } if (!self.isDragging) { self.isDragging = dragged = true; _dispatchEvent(self, "dragstart", "onDragStart"); } }; _this2.drag = onMove; _this2.endDrag = function (e) { return onRelease(e || self.pointerEvent, true); }; _this2.timeSinceDrag = function () { return self.isDragging ? 0 : (_getTime() - dragEndTime) / 1000; }; _this2.timeSinceClick = function () { return (_getTime() - clickTime) / 1000; }; _this2.hitTest = function (target, threshold) { return Draggable.hitTest(self.target, target, threshold); }; _this2.getDirection = function (from, diagonalThreshold) { var mode = from === "velocity" && InertiaPlugin ? from : _isObject(from) && !rotationMode ? "element" : "start", xChange, yChange, ratio, direction, r1, r2; if (mode === "element") { r1 = _parseRect(self.target); r2 = _parseRect(from); } xChange = mode === "start" ? self.x - startElementX : mode === "velocity" ? InertiaPlugin.getVelocity(target, xProp) : r1.left + r1.width / 2 - (r2.left + r2.width / 2); if (rotationMode) { return xChange < 0 ? "counter-clockwise" : "clockwise"; } else { diagonalThreshold = diagonalThreshold || 2; yChange = mode === "start" ? self.y - startElementY : mode === "velocity" ? InertiaPlugin.getVelocity(target, yProp) : r1.top + r1.height / 2 - (r2.top + r2.height / 2); ratio = Math.abs(xChange / yChange); direction = ratio < 1 / diagonalThreshold ? "" : xChange < 0 ? "left" : "right"; if (ratio < diagonalThreshold) { if (direction !== "") { direction += "-"; } direction += yChange < 0 ? "up" : "down"; } } return direction; }; _this2.applyBounds = function (newBounds, sticky) { var x, y, forceZeroVelocity, e, parent, isRoot; if (newBounds && vars.bounds !== newBounds) { vars.bounds = newBounds; return self.update(true, sticky); } syncXY(true); calculateBounds(); if (hasBounds && !isTweening()) { x = self.x; y = self.y; if (x > maxX) { x = maxX; } else if (x < minX) { x = minX; } if (y > maxY) { y = maxY; } else if (y < minY) { y = minY; } if (self.x !== x || self.y !== y) { forceZeroVelocity = true; self.x = self.endX = x; if (rotationMode) { self.endRotation = x; } else { self.y = self.endY = y; } dirty = true; render(true); if (self.autoScroll && !self.isDragging) { _recordMaxScrolls(target.parentNode); e = target; _windowProxy.scrollTop = _win$1.pageYOffset != null ? _win$1.pageYOffset : ownerDoc.documentElement.scrollTop != null ? ownerDoc.documentElement.scrollTop : ownerDoc.body.scrollTop; _windowProxy.scrollLeft = _win$1.pageXOffset != null ? _win$1.pageXOffset : ownerDoc.documentElement.scrollLeft != null ? ownerDoc.documentElement.scrollLeft : ownerDoc.body.scrollLeft; while (e && !isRoot) { isRoot = _isRoot(e.parentNode); parent = isRoot ? _windowProxy : e.parentNode; if (allowY && parent.scrollTop > parent._gsMaxScrollY) { parent.scrollTop = parent._gsMaxScrollY; } if (allowX && parent.scrollLeft > parent._gsMaxScrollX) { parent.scrollLeft = parent._gsMaxScrollX; } e = parent; } } } if (self.isThrowing && (forceZeroVelocity || self.endX > maxX || self.endX < minX || self.endY > maxY || self.endY < minY)) { animate(vars.inertia || vars.throwProps, forceZeroVelocity); } } return self; }; _this2.update = function (applyBounds, sticky, ignoreExternalChanges) { if (sticky && self.isPressed) { var m = getGlobalMatrix(target), p = innerMatrix.apply({ x: self.x - startElementX, y: self.y - startElementY }), m2 = getGlobalMatrix(target.parentNode, true); m2.apply({ x: m.e - p.x, y: m.f - p.y }, p); self.x -= p.x - m2.e; self.y -= p.y - m2.f; render(true); recordStartPositions(); } var x = self.x, y = self.y; updateMatrix(!sticky); if (applyBounds) { self.applyBounds(); } else { dirty && ignoreExternalChanges && render(true); syncXY(true); } if (sticky) { setPointerPosition(self.pointerX, self.pointerY); dirty && render(true); } if (self.isPressed && !sticky && (allowX && Math.abs(x - self.x) > 0.01 || allowY && Math.abs(y - self.y) > 0.01 && !rotationMode)) { recordStartPositions(); } if (self.autoScroll) { _recordMaxScrolls(target.parentNode, self.isDragging); checkAutoScrollBounds = self.isDragging; render(true); _removeScrollListener(target, updateScroll); _addScrollListener(target, updateScroll); } return self; }; _this2.enable = function (type) { var setVars = { lazy: true }, id, i, trigger; if (vars.cursor !== false) { setVars.cursor = vars.cursor || _defaultCursor; } if (gsap.utils.checkPrefix("touchCallout")) { setVars.touchCallout = "none"; } if (type !== "soft") { _setTouchActionForAllDescendants(triggers, allowX === allowY ? "none" : vars.allowNativeTouchScrolling && target.scrollHeight === target.clientHeight === (target.scrollWidth === target.clientHeight) || vars.allowEventDefault ? "manipulation" : allowX ? "pan-y" : "pan-x"); i = triggers.length; while (--i > -1) { trigger = triggers[i]; _supportsPointer || _addListener(trigger, "mousedown", onPress); _addListener(trigger, "touchstart", onPress); _addListener(trigger, "click", onClick, true); gsap.set(trigger, setVars); if (trigger.getBBox && trigger.ownerSVGElement && allowX !== allowY) { gsap.set(trigger.ownerSVGElement, { touchAction: vars.allowNativeTouchScrolling || vars.allowEventDefault ? "manipulation" : allowX ? "pan-y" : "pan-x" }); } vars.allowContextMenu || _addListener(trigger, "contextmenu", onContextMenu); } _setSelectable(triggers, false); } _addScrollListener(target, updateScroll); enabled = true; if (InertiaPlugin && type !== "soft") { InertiaPlugin.track(scrollProxy || target, xyMode ? "x,y" : rotationMode ? "rotation" : "top,left"); } target._gsDragID = id = "d" + _lookupCount++; _lookup[id] = self; if (scrollProxy) { scrollProxy.enable(); scrollProxy.element._gsDragID = id; } (vars.bounds || rotationMode) && recordStartPositions(); vars.bounds && self.applyBounds(); return self; }; _this2.disable = function (type) { var dragging = self.isDragging, i = triggers.length, trigger; while (--i > -1) { _setStyle(triggers[i], "cursor", null); } if (type !== "soft") { _setTouchActionForAllDescendants(triggers, null); i = triggers.length; while (--i > -1) { trigger = triggers[i]; _setStyle(trigger, "touchCallout", null); _removeListener(trigger, "mousedown", onPress); _removeListener(trigger, "touchstart", onPress); _removeListener(trigger, "click", onClick, true); _removeListener(trigger, "contextmenu", onContextMenu); } _setSelectable(triggers, true); if (touchEventTarget) { _removeListener(touchEventTarget, "touchcancel", onRelease); _removeListener(touchEventTarget, "touchend", onRelease); _removeListener(touchEventTarget, "touchmove", onMove); } _removeListener(ownerDoc, "mouseup", onRelease); _removeListener(ownerDoc, "mousemove", onMove); } _removeScrollListener(target, updateScroll); enabled = false; if (InertiaPlugin && type !== "soft") { InertiaPlugin.untrack(scrollProxy || target, xyMode ? "x,y" : rotationMode ? "rotation" : "top,left"); self.tween && self.tween.kill(); } scrollProxy && scrollProxy.disable(); _removeFromRenderQueue(render); self.isDragging = self.isPressed = isClicking = false; dragging && _dispatchEvent(self, "dragend", "onDragEnd"); return self; }; _this2.enabled = function (value, type) { return arguments.length ? value ? self.enable(type) : self.disable(type) : enabled; }; _this2.kill = function () { self.isThrowing = false; self.tween && self.tween.kill(); self.disable(); gsap.set(triggers, { clearProps: "userSelect" }); delete _lookup[target._gsDragID]; return self; }; _this2.revert = function () { this.kill(); this.styles && this.styles.revert(); }; if (~type.indexOf("scroll")) { scrollProxy = _this2.scrollProxy = new ScrollProxy(target, _extend({ onKill: function onKill() { self.isPressed && onRelease(null); } }, vars)); target.style.overflowY = allowY && !_isTouchDevice ? "auto" : "hidden"; target.style.overflowX = allowX && !_isTouchDevice ? "auto" : "hidden"; target = scrollProxy.content; } if (rotationMode) { killProps.rotation = 1; } else { if (allowX) { killProps[xProp] = 1; } if (allowY) { killProps[yProp] = 1; } } gsCache.force3D = "force3D" in vars ? vars.force3D : true; _context(_assertThisInitialized(_this2)); _this2.enable(); return _this2; } Draggable.register = function register(core) { gsap = core; _initCore(); }; Draggable.create = function create(targets, vars) { _coreInitted || _initCore(true); return _toArray(targets).map(function (target) { return new Draggable(target, vars); }); }; Draggable.get = function get(target) { return _lookup[(_toArray(target)[0] || {})._gsDragID]; }; Draggable.timeSinceDrag = function timeSinceDrag() { return (_getTime() - _lastDragTime) / 1000; }; Draggable.hitTest = function hitTest(obj1, obj2, threshold) { if (obj1 === obj2) { return false; } var r1 = _parseRect(obj1), r2 = _parseRect(obj2), top = r1.top, left = r1.left, right = r1.right, bottom = r1.bottom, width = r1.width, height = r1.height, isOutside = r2.left > right || r2.right < left || r2.top > bottom || r2.bottom < top, overlap, area, isRatio; if (isOutside || !threshold) { return !isOutside; } isRatio = (threshold + "").indexOf("%") !== -1; threshold = parseFloat(threshold) || 0; overlap = { left: Math.max(left, r2.left), top: Math.max(top, r2.top) }; overlap.width = Math.min(right, r2.right) - overlap.left; overlap.height = Math.min(bottom, r2.bottom) - overlap.top; if (overlap.width < 0 || overlap.height < 0) { return false; } if (isRatio) { threshold *= 0.01; area = overlap.width * overlap.height; return area >= width * height * threshold || area >= r2.width * r2.height * threshold; } return overlap.width > threshold && overlap.height > threshold; }; return Draggable; }(EventDispatcher); _setDefaults(Draggable.prototype, { pointerX: 0, pointerY: 0, startX: 0, startY: 0, deltaX: 0, deltaY: 0, isDragging: false, isPressed: false }); Draggable.zIndex = 1000; Draggable.version = "3.12.2"; _getGSAP() && gsap.registerPlugin(Draggable); exports.Draggable = Draggable; exports.default = Draggable; if (typeof(window) === 'undefined' || window !== exports) {Object.defineProperty(exports, '__esModule', { value: true });} else {delete window.default;} })));