UNPKG

91.4 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3 typeof define === 'function' && define.amd ? define(['exports'], factory) :
4 (global = global || self, factory(global.window = global.window || {}));
5}(this, (function (exports) { 'use strict';
6
7 function _inheritsLoose(subClass, superClass) {
8 subClass.prototype = Object.create(superClass.prototype);
9 subClass.prototype.constructor = subClass;
10 subClass.__proto__ = superClass;
11 }
12
13 function _assertThisInitialized(self) {
14 if (self === void 0) {
15 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
16 }
17
18 return self;
19 }
20
21 var _doc,
22 _win,
23 _docElement,
24 _body,
25 _divContainer,
26 _svgContainer,
27 _identityMatrix,
28 _gEl,
29 _transformProp = "transform",
30 _transformOriginProp = _transformProp + "Origin",
31 _hasOffsetBug,
32 _setDoc = function _setDoc(element) {
33 var doc = element.ownerDocument || element;
34
35 if (!(_transformProp in element.style) && "msTransform" in element.style) {
36 _transformProp = "msTransform";
37 _transformOriginProp = _transformProp + "Origin";
38 }
39
40 while (doc.parentNode && (doc = doc.parentNode)) {}
41
42 _win = window;
43 _identityMatrix = new Matrix2D();
44
45 if (doc) {
46 _doc = doc;
47 _docElement = doc.documentElement;
48 _body = doc.body;
49 _gEl = _doc.createElementNS("http://www.w3.org/2000/svg", "g");
50 _gEl.style.transform = "none";
51 var d1 = doc.createElement("div"),
52 d2 = doc.createElement("div");
53
54 _body.appendChild(d1);
55
56 d1.appendChild(d2);
57 d1.style.position = "static";
58 d1.style[_transformProp] = "translate3d(0,0,1px)";
59 _hasOffsetBug = d2.offsetParent !== d1;
60
61 _body.removeChild(d1);
62 }
63
64 return doc;
65 },
66 _forceNonZeroScale = function _forceNonZeroScale(e) {
67 var a, cache;
68
69 while (e && e !== _body) {
70 cache = e._gsap;
71 cache && cache.uncache && cache.get(e, "x");
72
73 if (cache && !cache.scaleX && !cache.scaleY && cache.renderTransform) {
74 cache.scaleX = cache.scaleY = 1e-4;
75 cache.renderTransform(1, cache);
76 a ? a.push(cache) : a = [cache];
77 }
78
79 e = e.parentNode;
80 }
81
82 return a;
83 },
84 _svgTemps = [],
85 _divTemps = [],
86 _getDocScrollTop = function _getDocScrollTop() {
87 return _win.pageYOffset || _doc.scrollTop || _docElement.scrollTop || _body.scrollTop || 0;
88 },
89 _getDocScrollLeft = function _getDocScrollLeft() {
90 return _win.pageXOffset || _doc.scrollLeft || _docElement.scrollLeft || _body.scrollLeft || 0;
91 },
92 _svgOwner = function _svgOwner(element) {
93 return element.ownerSVGElement || ((element.tagName + "").toLowerCase() === "svg" ? element : null);
94 },
95 _isFixed = function _isFixed(element) {
96 if (_win.getComputedStyle(element).position === "fixed") {
97 return true;
98 }
99
100 element = element.parentNode;
101
102 if (element && element.nodeType === 1) {
103 return _isFixed(element);
104 }
105 },
106 _createSibling = function _createSibling(element, i) {
107 if (element.parentNode && (_doc || _setDoc(element))) {
108 var svg = _svgOwner(element),
109 ns = svg ? svg.getAttribute("xmlns") || "http://www.w3.org/2000/svg" : "http://www.w3.org/1999/xhtml",
110 type = svg ? i ? "rect" : "g" : "div",
111 x = i !== 2 ? 0 : 100,
112 y = i === 3 ? 100 : 0,
113 css = "position:absolute;display:block;pointer-events:none;margin:0;padding:0;",
114 e = _doc.createElementNS ? _doc.createElementNS(ns.replace(/^https/, "http"), type) : _doc.createElement(type);
115
116 if (i) {
117 if (!svg) {
118 if (!_divContainer) {
119 _divContainer = _createSibling(element);
120 _divContainer.style.cssText = css;
121 }
122
123 e.style.cssText = css + "width:0.1px;height:0.1px;top:" + y + "px;left:" + x + "px";
124
125 _divContainer.appendChild(e);
126 } else {
127 _svgContainer || (_svgContainer = _createSibling(element));
128 e.setAttribute("width", 0.01);
129 e.setAttribute("height", 0.01);
130 e.setAttribute("transform", "translate(" + x + "," + y + ")");
131
132 _svgContainer.appendChild(e);
133 }
134 }
135
136 return e;
137 }
138
139 throw "Need document and parent.";
140 },
141 _consolidate = function _consolidate(m) {
142 var c = new Matrix2D(),
143 i = 0;
144
145 for (; i < m.numberOfItems; i++) {
146 c.multiply(m.getItem(i).matrix);
147 }
148
149 return c;
150 },
151 _getCTM = function _getCTM(svg) {
152 var m = svg.getCTM(),
153 transform;
154
155 if (!m) {
156 transform = svg.style[_transformProp];
157 svg.style[_transformProp] = "none";
158 svg.appendChild(_gEl);
159 m = _gEl.getCTM();
160 svg.removeChild(_gEl);
161 transform ? svg.style[_transformProp] = transform : svg.style.removeProperty(_transformProp.replace(/([A-Z])/g, "-$1").toLowerCase());
162 }
163
164 return m || _identityMatrix.clone();
165 },
166 _placeSiblings = function _placeSiblings(element, adjustGOffset) {
167 var svg = _svgOwner(element),
168 isRootSVG = element === svg,
169 siblings = svg ? _svgTemps : _divTemps,
170 parent = element.parentNode,
171 container,
172 m,
173 b,
174 x,
175 y,
176 cs;
177
178 if (element === _win) {
179 return element;
180 }
181
182 siblings.length || siblings.push(_createSibling(element, 1), _createSibling(element, 2), _createSibling(element, 3));
183 container = svg ? _svgContainer : _divContainer;
184
185 if (svg) {
186 if (isRootSVG) {
187 b = _getCTM(element);
188 x = -b.e / b.a;
189 y = -b.f / b.d;
190 m = _identityMatrix;
191 } else if (element.getBBox) {
192 b = element.getBBox();
193 m = element.transform ? element.transform.baseVal : {};
194 m = !m.numberOfItems ? _identityMatrix : m.numberOfItems > 1 ? _consolidate(m) : m.getItem(0).matrix;
195 x = m.a * b.x + m.c * b.y;
196 y = m.b * b.x + m.d * b.y;
197 } else {
198 m = new Matrix2D();
199 x = y = 0;
200 }
201
202 if (adjustGOffset && element.tagName.toLowerCase() === "g") {
203 x = y = 0;
204 }
205
206 (isRootSVG ? svg : parent).appendChild(container);
207 container.setAttribute("transform", "matrix(" + m.a + "," + m.b + "," + m.c + "," + m.d + "," + (m.e + x) + "," + (m.f + y) + ")");
208 } else {
209 x = y = 0;
210
211 if (_hasOffsetBug) {
212 m = element.offsetParent;
213 b = element;
214
215 while (b && (b = b.parentNode) && b !== m && b.parentNode) {
216 if ((_win.getComputedStyle(b)[_transformProp] + "").length > 4) {
217 x = b.offsetLeft;
218 y = b.offsetTop;
219 b = 0;
220 }
221 }
222 }
223
224 cs = _win.getComputedStyle(element);
225
226 if (cs.position !== "absolute" && cs.position !== "fixed") {
227 m = element.offsetParent;
228
229 while (parent && parent !== m) {
230 x += parent.scrollLeft || 0;
231 y += parent.scrollTop || 0;
232 parent = parent.parentNode;
233 }
234 }
235
236 b = container.style;
237 b.top = element.offsetTop - y + "px";
238 b.left = element.offsetLeft - x + "px";
239 b[_transformProp] = cs[_transformProp];
240 b[_transformOriginProp] = cs[_transformOriginProp];
241 b.position = cs.position === "fixed" ? "fixed" : "absolute";
242 element.parentNode.appendChild(container);
243 }
244
245 return container;
246 },
247 _setMatrix = function _setMatrix(m, a, b, c, d, e, f) {
248 m.a = a;
249 m.b = b;
250 m.c = c;
251 m.d = d;
252 m.e = e;
253 m.f = f;
254 return m;
255 };
256
257 var Matrix2D = function () {
258 function Matrix2D(a, b, c, d, e, f) {
259 if (a === void 0) {
260 a = 1;
261 }
262
263 if (b === void 0) {
264 b = 0;
265 }
266
267 if (c === void 0) {
268 c = 0;
269 }
270
271 if (d === void 0) {
272 d = 1;
273 }
274
275 if (e === void 0) {
276 e = 0;
277 }
278
279 if (f === void 0) {
280 f = 0;
281 }
282
283 _setMatrix(this, a, b, c, d, e, f);
284 }
285
286 var _proto = Matrix2D.prototype;
287
288 _proto.inverse = function inverse() {
289 var a = this.a,
290 b = this.b,
291 c = this.c,
292 d = this.d,
293 e = this.e,
294 f = this.f,
295 determinant = a * d - b * c || 1e-10;
296 return _setMatrix(this, d / determinant, -b / determinant, -c / determinant, a / determinant, (c * f - d * e) / determinant, -(a * f - b * e) / determinant);
297 };
298
299 _proto.multiply = function multiply(matrix) {
300 var a = this.a,
301 b = this.b,
302 c = this.c,
303 d = this.d,
304 e = this.e,
305 f = this.f,
306 a2 = matrix.a,
307 b2 = matrix.c,
308 c2 = matrix.b,
309 d2 = matrix.d,
310 e2 = matrix.e,
311 f2 = matrix.f;
312 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);
313 };
314
315 _proto.clone = function clone() {
316 return new Matrix2D(this.a, this.b, this.c, this.d, this.e, this.f);
317 };
318
319 _proto.equals = function equals(matrix) {
320 var a = this.a,
321 b = this.b,
322 c = this.c,
323 d = this.d,
324 e = this.e,
325 f = this.f;
326 return a === matrix.a && b === matrix.b && c === matrix.c && d === matrix.d && e === matrix.e && f === matrix.f;
327 };
328
329 _proto.apply = function apply(point, decoratee) {
330 if (decoratee === void 0) {
331 decoratee = {};
332 }
333
334 var x = point.x,
335 y = point.y,
336 a = this.a,
337 b = this.b,
338 c = this.c,
339 d = this.d,
340 e = this.e,
341 f = this.f;
342 decoratee.x = x * a + y * c + e || 0;
343 decoratee.y = x * b + y * d + f || 0;
344 return decoratee;
345 };
346
347 return Matrix2D;
348 }();
349 function getGlobalMatrix(element, inverse, adjustGOffset, includeScrollInFixed) {
350 if (!element || !element.parentNode || (_doc || _setDoc(element)).documentElement === element) {
351 return new Matrix2D();
352 }
353
354 var zeroScales = _forceNonZeroScale(element),
355 svg = _svgOwner(element),
356 temps = svg ? _svgTemps : _divTemps,
357 container = _placeSiblings(element, adjustGOffset),
358 b1 = temps[0].getBoundingClientRect(),
359 b2 = temps[1].getBoundingClientRect(),
360 b3 = temps[2].getBoundingClientRect(),
361 parent = container.parentNode,
362 isFixed = !includeScrollInFixed && _isFixed(element),
363 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()));
364
365 parent.removeChild(container);
366
367 if (zeroScales) {
368 b1 = zeroScales.length;
369
370 while (b1--) {
371 b2 = zeroScales[b1];
372 b2.scaleX = b2.scaleY = 0;
373 b2.renderTransform(1, b2);
374 }
375 }
376
377 return inverse ? m.inverse() : m;
378 }
379
380 var gsap,
381 _win$1,
382 _doc$1,
383 _docElement$1,
384 _body$1,
385 _tempDiv,
386 _placeholderDiv,
387 _coreInitted,
388 _checkPrefix,
389 _toArray,
390 _supportsPassive,
391 _isTouchDevice,
392 _touchEventLookup,
393 _dragCount,
394 _isMultiTouching,
395 _isAndroid,
396 InertiaPlugin,
397 _defaultCursor,
398 _supportsPointer,
399 _windowExists = function _windowExists() {
400 return typeof window !== "undefined";
401 },
402 _getGSAP = function _getGSAP() {
403 return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap;
404 },
405 _isFunction = function _isFunction(value) {
406 return typeof value === "function";
407 },
408 _isObject = function _isObject(value) {
409 return typeof value === "object";
410 },
411 _isUndefined = function _isUndefined(value) {
412 return typeof value === "undefined";
413 },
414 _emptyFunc = function _emptyFunc() {
415 return false;
416 },
417 _transformProp$1 = "transform",
418 _transformOriginProp$1 = "transformOrigin",
419 _round = function _round(value) {
420 return Math.round(value * 10000) / 10000;
421 },
422 _isArray = Array.isArray,
423 _createElement = function _createElement(type, ns) {
424 var e = _doc$1.createElementNS ? _doc$1.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc$1.createElement(type);
425 return e.style ? e : _doc$1.createElement(type);
426 },
427 _RAD2DEG = 180 / Math.PI,
428 _bigNum = 1e20,
429 _identityMatrix$1 = new Matrix2D(),
430 _getTime = Date.now || function () {
431 return new Date().getTime();
432 },
433 _renderQueue = [],
434 _lookup = {},
435 _lookupCount = 0,
436 _clickableTagExp = /^(?:a|input|textarea|button|select)$/i,
437 _lastDragTime = 0,
438 _temp1 = {},
439 _windowProxy = {},
440 _copy = function _copy(obj, factor) {
441 var copy = {},
442 p;
443
444 for (p in obj) {
445 copy[p] = factor ? obj[p] * factor : obj[p];
446 }
447
448 return copy;
449 },
450 _extend = function _extend(obj, defaults) {
451 for (var p in defaults) {
452 if (!(p in obj)) {
453 obj[p] = defaults[p];
454 }
455 }
456
457 return obj;
458 },
459 _setTouchActionForAllDescendants = function _setTouchActionForAllDescendants(elements, value) {
460 var i = elements.length,
461 children;
462
463 while (i--) {
464 value ? elements[i].style.touchAction = value : elements[i].style.removeProperty("touch-action");
465 children = elements[i].children;
466 children && children.length && _setTouchActionForAllDescendants(children, value);
467 }
468 },
469 _renderQueueTick = function _renderQueueTick() {
470 return _renderQueue.forEach(function (func) {
471 return func();
472 });
473 },
474 _addToRenderQueue = function _addToRenderQueue(func) {
475 _renderQueue.push(func);
476
477 if (_renderQueue.length === 1) {
478 gsap.ticker.add(_renderQueueTick);
479 }
480 },
481 _renderQueueTimeout = function _renderQueueTimeout() {
482 return !_renderQueue.length && gsap.ticker.remove(_renderQueueTick);
483 },
484 _removeFromRenderQueue = function _removeFromRenderQueue(func) {
485 var i = _renderQueue.length;
486
487 while (i--) {
488 if (_renderQueue[i] === func) {
489 _renderQueue.splice(i, 1);
490 }
491 }
492
493 gsap.to(_renderQueueTimeout, {
494 overwrite: true,
495 delay: 15,
496 duration: 0,
497 onComplete: _renderQueueTimeout,
498 data: "_draggable"
499 });
500 },
501 _setDefaults = function _setDefaults(obj, defaults) {
502 for (var p in defaults) {
503 if (!(p in obj)) {
504 obj[p] = defaults[p];
505 }
506 }
507
508 return obj;
509 },
510 _addListener = function _addListener(element, type, func, capture) {
511 if (element.addEventListener) {
512 var touchType = _touchEventLookup[type];
513 capture = capture || (_supportsPassive ? {
514 passive: false
515 } : null);
516 element.addEventListener(touchType || type, func, capture);
517 touchType && type !== touchType && element.addEventListener(type, func, capture);
518 }
519 },
520 _removeListener = function _removeListener(element, type, func) {
521 if (element.removeEventListener) {
522 var touchType = _touchEventLookup[type];
523 element.removeEventListener(touchType || type, func);
524 touchType && type !== touchType && element.removeEventListener(type, func);
525 }
526 },
527 _preventDefault = function _preventDefault(event) {
528 event.preventDefault && event.preventDefault();
529 event.preventManipulation && event.preventManipulation();
530 },
531 _hasTouchID = function _hasTouchID(list, ID) {
532 var i = list.length;
533
534 while (i--) {
535 if (list[i].identifier === ID) {
536 return true;
537 }
538 }
539 },
540 _onMultiTouchDocumentEnd = function _onMultiTouchDocumentEnd(event) {
541 _isMultiTouching = event.touches && _dragCount < event.touches.length;
542
543 _removeListener(event.target, "touchend", _onMultiTouchDocumentEnd);
544 },
545 _onMultiTouchDocument = function _onMultiTouchDocument(event) {
546 _isMultiTouching = event.touches && _dragCount < event.touches.length;
547
548 _addListener(event.target, "touchend", _onMultiTouchDocumentEnd);
549 },
550 _getDocScrollTop$1 = function _getDocScrollTop(doc) {
551 return _win$1.pageYOffset || doc.scrollTop || doc.documentElement.scrollTop || doc.body.scrollTop || 0;
552 },
553 _getDocScrollLeft$1 = function _getDocScrollLeft(doc) {
554 return _win$1.pageXOffset || doc.scrollLeft || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0;
555 },
556 _addScrollListener = function _addScrollListener(e, callback) {
557 _addListener(e, "scroll", callback);
558
559 if (!_isRoot(e.parentNode)) {
560 _addScrollListener(e.parentNode, callback);
561 }
562 },
563 _removeScrollListener = function _removeScrollListener(e, callback) {
564 _removeListener(e, "scroll", callback);
565
566 if (!_isRoot(e.parentNode)) {
567 _removeScrollListener(e.parentNode, callback);
568 }
569 },
570 _isRoot = function _isRoot(e) {
571 return !!(!e || e === _docElement$1 || e.nodeType === 9 || e === _doc$1.body || e === _win$1 || !e.nodeType || !e.parentNode);
572 },
573 _getMaxScroll = function _getMaxScroll(element, axis) {
574 var dim = axis === "x" ? "Width" : "Height",
575 scroll = "scroll" + dim,
576 client = "client" + dim;
577 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]);
578 },
579 _recordMaxScrolls = function _recordMaxScrolls(e, skipCurrent) {
580 var x = _getMaxScroll(e, "x"),
581 y = _getMaxScroll(e, "y");
582
583 if (_isRoot(e)) {
584 e = _windowProxy;
585 } else {
586 _recordMaxScrolls(e.parentNode, skipCurrent);
587 }
588
589 e._gsMaxScrollX = x;
590 e._gsMaxScrollY = y;
591
592 if (!skipCurrent) {
593 e._gsScrollX = e.scrollLeft || 0;
594 e._gsScrollY = e.scrollTop || 0;
595 }
596 },
597 _setStyle = function _setStyle(element, property, value) {
598 var style = element.style;
599
600 if (!style) {
601 return;
602 }
603
604 if (_isUndefined(style[property])) {
605 property = _checkPrefix(property, element) || property;
606 }
607
608 if (value == null) {
609 style.removeProperty && style.removeProperty(property.replace(/([A-Z])/g, "-$1").toLowerCase());
610 } else {
611 style[property] = value;
612 }
613 },
614 _getComputedStyle = function _getComputedStyle(element) {
615 return _win$1.getComputedStyle(element instanceof Element ? element : element.host || (element.parentNode || {}).host || element);
616 },
617 _tempRect = {},
618 _parseRect = function _parseRect(e) {
619 if (e === _win$1) {
620 _tempRect.left = _tempRect.top = 0;
621 _tempRect.width = _tempRect.right = _docElement$1.clientWidth || e.innerWidth || _body$1.clientWidth || 0;
622 _tempRect.height = _tempRect.bottom = (e.innerHeight || 0) - 20 < _docElement$1.clientHeight ? _docElement$1.clientHeight : e.innerHeight || _body$1.clientHeight || 0;
623 return _tempRect;
624 }
625
626 var doc = e.ownerDocument || _doc$1,
627 r = !_isUndefined(e.pageX) ? {
628 left: e.pageX - _getDocScrollLeft$1(doc),
629 top: e.pageY - _getDocScrollTop$1(doc),
630 right: e.pageX - _getDocScrollLeft$1(doc) + 1,
631 bottom: e.pageY - _getDocScrollTop$1(doc) + 1
632 } : !e.nodeType && !_isUndefined(e.left) && !_isUndefined(e.top) ? e : _toArray(e)[0].getBoundingClientRect();
633
634 if (_isUndefined(r.right) && !_isUndefined(r.width)) {
635 r.right = r.left + r.width;
636 r.bottom = r.top + r.height;
637 } else if (_isUndefined(r.width)) {
638 r = {
639 width: r.right - r.left,
640 height: r.bottom - r.top,
641 right: r.right,
642 left: r.left,
643 bottom: r.bottom,
644 top: r.top
645 };
646 }
647
648 return r;
649 },
650 _dispatchEvent = function _dispatchEvent(target, type, callbackName) {
651 var vars = target.vars,
652 callback = vars[callbackName],
653 listeners = target._listeners[type],
654 result;
655
656 if (_isFunction(callback)) {
657 result = callback.apply(vars.callbackScope || target, vars[callbackName + "Params"] || [target.pointerEvent]);
658 }
659
660 if (listeners && target.dispatchEvent(type) === false) {
661 result = false;
662 }
663
664 return result;
665 },
666 _getBounds = function _getBounds(target, context) {
667 var e = _toArray(target)[0],
668 top,
669 left,
670 offset;
671
672 if (!e.nodeType && e !== _win$1) {
673 if (!_isUndefined(target.left)) {
674 offset = {
675 x: 0,
676 y: 0
677 };
678 return {
679 left: target.left - offset.x,
680 top: target.top - offset.y,
681 width: target.width,
682 height: target.height
683 };
684 }
685
686 left = target.min || target.minX || target.minRotation || 0;
687 top = target.min || target.minY || 0;
688 return {
689 left: left,
690 top: top,
691 width: (target.max || target.maxX || target.maxRotation || 0) - left,
692 height: (target.max || target.maxY || 0) - top
693 };
694 }
695
696 return _getElementBounds(e, context);
697 },
698 _point1 = {},
699 _getElementBounds = function _getElementBounds(element, context) {
700 context = _toArray(context)[0];
701 var isSVG = element.getBBox && element.ownerSVGElement,
702 doc = element.ownerDocument || _doc$1,
703 left,
704 right,
705 top,
706 bottom,
707 matrix,
708 p1,
709 p2,
710 p3,
711 p4,
712 bbox,
713 width,
714 height,
715 cs,
716 contextParent;
717
718 if (element === _win$1) {
719 top = _getDocScrollTop$1(doc);
720 left = _getDocScrollLeft$1(doc);
721 right = left + (doc.documentElement.clientWidth || element.innerWidth || doc.body.clientWidth || 0);
722 bottom = top + ((element.innerHeight || 0) - 20 < doc.documentElement.clientHeight ? doc.documentElement.clientHeight : element.innerHeight || doc.body.clientHeight || 0);
723 } else if (context === _win$1 || _isUndefined(context)) {
724 return element.getBoundingClientRect();
725 } else {
726 left = top = 0;
727
728 if (isSVG) {
729 bbox = element.getBBox();
730 width = bbox.width;
731 height = bbox.height;
732 } else {
733 if (element.viewBox && (bbox = element.viewBox.baseVal)) {
734 left = bbox.x || 0;
735 top = bbox.y || 0;
736 width = bbox.width;
737 height = bbox.height;
738 }
739
740 if (!width) {
741 cs = _getComputedStyle(element);
742 bbox = cs.boxSizing === "border-box";
743 width = (parseFloat(cs.width) || element.clientWidth || 0) + (bbox ? 0 : parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth));
744 height = (parseFloat(cs.height) || element.clientHeight || 0) + (bbox ? 0 : parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth));
745 }
746 }
747
748 right = width;
749 bottom = height;
750 }
751
752 if (element === context) {
753 return {
754 left: left,
755 top: top,
756 width: right - left,
757 height: bottom - top
758 };
759 }
760
761 matrix = getGlobalMatrix(context, true).multiply(getGlobalMatrix(element));
762 p1 = matrix.apply({
763 x: left,
764 y: top
765 });
766 p2 = matrix.apply({
767 x: right,
768 y: top
769 });
770 p3 = matrix.apply({
771 x: right,
772 y: bottom
773 });
774 p4 = matrix.apply({
775 x: left,
776 y: bottom
777 });
778 left = Math.min(p1.x, p2.x, p3.x, p4.x);
779 top = Math.min(p1.y, p2.y, p3.y, p4.y);
780 contextParent = context.parentNode || {};
781 return {
782 left: left + (contextParent.scrollLeft || 0),
783 top: top + (contextParent.scrollTop || 0),
784 width: Math.max(p1.x, p2.x, p3.x, p4.x) - left,
785 height: Math.max(p1.y, p2.y, p3.y, p4.y) - top
786 };
787 },
788 _parseInertia = function _parseInertia(draggable, snap, max, min, factor, forceZeroVelocity) {
789 var vars = {},
790 a,
791 i,
792 l;
793
794 if (snap) {
795 if (factor !== 1 && snap instanceof Array) {
796 vars.end = a = [];
797 l = snap.length;
798
799 if (_isObject(snap[0])) {
800 for (i = 0; i < l; i++) {
801 a[i] = _copy(snap[i], factor);
802 }
803 } else {
804 for (i = 0; i < l; i++) {
805 a[i] = snap[i] * factor;
806 }
807 }
808
809 max += 1.1;
810 min -= 1.1;
811 } else if (_isFunction(snap)) {
812 vars.end = function (value) {
813 var result = snap.call(draggable, value),
814 copy,
815 p;
816
817 if (factor !== 1) {
818 if (_isObject(result)) {
819 copy = {};
820
821 for (p in result) {
822 copy[p] = result[p] * factor;
823 }
824
825 result = copy;
826 } else {
827 result *= factor;
828 }
829 }
830
831 return result;
832 };
833 } else {
834 vars.end = snap;
835 }
836 }
837
838 if (max || max === 0) {
839 vars.max = max;
840 }
841
842 if (min || min === 0) {
843 vars.min = min;
844 }
845
846 if (forceZeroVelocity) {
847 vars.velocity = 0;
848 }
849
850 return vars;
851 },
852 _isClickable = function _isClickable(element) {
853 var data;
854 return !element || !element.getAttribute || element === _body$1 ? false : (data = element.getAttribute("data-clickable")) === "true" || data !== "false" && (element.onclick || _clickableTagExp.test(element.nodeName + "") || element.getAttribute("contentEditable") === "true") ? true : _isClickable(element.parentNode);
855 },
856 _setSelectable = function _setSelectable(elements, selectable) {
857 var i = elements.length,
858 e;
859
860 while (i--) {
861 e = elements[i];
862 e.ondragstart = e.onselectstart = selectable ? null : _emptyFunc;
863 gsap.set(e, {
864 lazy: true,
865 userSelect: selectable ? "text" : "none"
866 });
867 }
868 },
869 _isFixed$1 = function _isFixed(element) {
870 if (_getComputedStyle(element).position === "fixed") {
871 return true;
872 }
873
874 element = element.parentNode;
875
876 if (element && element.nodeType === 1) {
877 return _isFixed(element);
878 }
879 },
880 _supports3D,
881 _addPaddingBR,
882 ScrollProxy = function ScrollProxy(element, vars) {
883 element = gsap.utils.toArray(element)[0];
884 vars = vars || {};
885 var content = document.createElement("div"),
886 style = content.style,
887 node = element.firstChild,
888 offsetTop = 0,
889 offsetLeft = 0,
890 prevTop = element.scrollTop,
891 prevLeft = element.scrollLeft,
892 scrollWidth = element.scrollWidth,
893 scrollHeight = element.scrollHeight,
894 extraPadRight = 0,
895 maxLeft = 0,
896 maxTop = 0,
897 elementWidth,
898 elementHeight,
899 contentHeight,
900 nextNode,
901 transformStart,
902 transformEnd;
903
904 if (_supports3D && vars.force3D !== false) {
905 transformStart = "translate3d(";
906 transformEnd = "px,0px)";
907 } else if (_transformProp$1) {
908 transformStart = "translate(";
909 transformEnd = "px)";
910 }
911
912 this.scrollTop = function (value, force) {
913 if (!arguments.length) {
914 return -this.top();
915 }
916
917 this.top(-value, force);
918 };
919
920 this.scrollLeft = function (value, force) {
921 if (!arguments.length) {
922 return -this.left();
923 }
924
925 this.left(-value, force);
926 };
927
928 this.left = function (value, force) {
929 if (!arguments.length) {
930 return -(element.scrollLeft + offsetLeft);
931 }
932
933 var dif = element.scrollLeft - prevLeft,
934 oldOffset = offsetLeft;
935
936 if ((dif > 2 || dif < -2) && !force) {
937 prevLeft = element.scrollLeft;
938 gsap.killTweensOf(this, {
939 left: 1,
940 scrollLeft: 1
941 });
942 this.left(-prevLeft);
943
944 if (vars.onKill) {
945 vars.onKill();
946 }
947
948 return;
949 }
950
951 value = -value;
952
953 if (value < 0) {
954 offsetLeft = value - 0.5 | 0;
955 value = 0;
956 } else if (value > maxLeft) {
957 offsetLeft = value - maxLeft | 0;
958 value = maxLeft;
959 } else {
960 offsetLeft = 0;
961 }
962
963 if (offsetLeft || oldOffset) {
964 if (!this._skip) {
965 style[_transformProp$1] = transformStart + -offsetLeft + "px," + -offsetTop + transformEnd;
966 }
967
968 if (offsetLeft + extraPadRight >= 0) {
969 style.paddingRight = offsetLeft + extraPadRight + "px";
970 }
971 }
972
973 element.scrollLeft = value | 0;
974 prevLeft = element.scrollLeft;
975 };
976
977 this.top = function (value, force) {
978 if (!arguments.length) {
979 return -(element.scrollTop + offsetTop);
980 }
981
982 var dif = element.scrollTop - prevTop,
983 oldOffset = offsetTop;
984
985 if ((dif > 2 || dif < -2) && !force) {
986 prevTop = element.scrollTop;
987 gsap.killTweensOf(this, {
988 top: 1,
989 scrollTop: 1
990 });
991 this.top(-prevTop);
992
993 if (vars.onKill) {
994 vars.onKill();
995 }
996
997 return;
998 }
999
1000 value = -value;
1001
1002 if (value < 0) {
1003 offsetTop = value - 0.5 | 0;
1004 value = 0;
1005 } else if (value > maxTop) {
1006 offsetTop = value - maxTop | 0;
1007 value = maxTop;
1008 } else {
1009 offsetTop = 0;
1010 }
1011
1012 if (offsetTop || oldOffset) {
1013 if (!this._skip) {
1014 style[_transformProp$1] = transformStart + -offsetLeft + "px," + -offsetTop + transformEnd;
1015 }
1016 }
1017
1018 element.scrollTop = value | 0;
1019 prevTop = element.scrollTop;
1020 };
1021
1022 this.maxScrollTop = function () {
1023 return maxTop;
1024 };
1025
1026 this.maxScrollLeft = function () {
1027 return maxLeft;
1028 };
1029
1030 this.disable = function () {
1031 node = content.firstChild;
1032
1033 while (node) {
1034 nextNode = node.nextSibling;
1035 element.appendChild(node);
1036 node = nextNode;
1037 }
1038
1039 if (element === content.parentNode) {
1040 element.removeChild(content);
1041 }
1042 };
1043
1044 this.enable = function () {
1045 node = element.firstChild;
1046
1047 if (node === content) {
1048 return;
1049 }
1050
1051 while (node) {
1052 nextNode = node.nextSibling;
1053 content.appendChild(node);
1054 node = nextNode;
1055 }
1056
1057 element.appendChild(content);
1058 this.calibrate();
1059 };
1060
1061 this.calibrate = function (force) {
1062 var widthMatches = element.clientWidth === elementWidth,
1063 cs,
1064 x,
1065 y;
1066 prevTop = element.scrollTop;
1067 prevLeft = element.scrollLeft;
1068
1069 if (widthMatches && element.clientHeight === elementHeight && content.offsetHeight === contentHeight && scrollWidth === element.scrollWidth && scrollHeight === element.scrollHeight && !force) {
1070 return;
1071 }
1072
1073 if (offsetTop || offsetLeft) {
1074 x = this.left();
1075 y = this.top();
1076 this.left(-element.scrollLeft);
1077 this.top(-element.scrollTop);
1078 }
1079
1080 cs = _getComputedStyle(element);
1081
1082 if (!widthMatches || force) {
1083 style.display = "block";
1084 style.width = "auto";
1085 style.paddingRight = "0px";
1086 extraPadRight = Math.max(0, element.scrollWidth - element.clientWidth);
1087
1088 if (extraPadRight) {
1089 extraPadRight += parseFloat(cs.paddingLeft) + (_addPaddingBR ? parseFloat(cs.paddingRight) : 0);
1090 }
1091 }
1092
1093 style.display = "inline-block";
1094 style.position = "relative";
1095 style.overflow = "visible";
1096 style.verticalAlign = "top";
1097 style.boxSizing = "content-box";
1098 style.width = "100%";
1099 style.paddingRight = extraPadRight + "px";
1100
1101 if (_addPaddingBR) {
1102 style.paddingBottom = cs.paddingBottom;
1103 }
1104
1105 elementWidth = element.clientWidth;
1106 elementHeight = element.clientHeight;
1107 scrollWidth = element.scrollWidth;
1108 scrollHeight = element.scrollHeight;
1109 maxLeft = element.scrollWidth - elementWidth;
1110 maxTop = element.scrollHeight - elementHeight;
1111 contentHeight = content.offsetHeight;
1112 style.display = "block";
1113
1114 if (x || y) {
1115 this.left(x);
1116 this.top(y);
1117 }
1118 };
1119
1120 this.content = content;
1121 this.element = element;
1122 this._skip = false;
1123 this.enable();
1124 },
1125 _initCore = function _initCore(required) {
1126 if (_windowExists() && document.body) {
1127 var nav = window && window.navigator;
1128 _win$1 = window;
1129 _doc$1 = document;
1130 _docElement$1 = _doc$1.documentElement;
1131 _body$1 = _doc$1.body;
1132 _tempDiv = _createElement("div");
1133 _supportsPointer = !!window.PointerEvent;
1134 _placeholderDiv = _createElement("div");
1135 _placeholderDiv.style.cssText = "visibility:hidden;height:1px;top:-1px;pointer-events:none;position:relative;clear:both;cursor:grab";
1136 _defaultCursor = _placeholderDiv.style.cursor === "grab" ? "grab" : "move";
1137 _isAndroid = nav && nav.userAgent.toLowerCase().indexOf("android") !== -1;
1138 _isTouchDevice = "ontouchstart" in _docElement$1 && "orientation" in _win$1 || nav && (nav.MaxTouchPoints > 0 || nav.msMaxTouchPoints > 0);
1139
1140 _addPaddingBR = function () {
1141 var div = _createElement("div"),
1142 child = _createElement("div"),
1143 childStyle = child.style,
1144 parent = _body$1,
1145 val;
1146
1147 childStyle.display = "inline-block";
1148 childStyle.position = "relative";
1149 div.style.cssText = child.innerHTML = "width:90px;height:40px;padding:10px;overflow:auto;visibility:hidden";
1150 div.appendChild(child);
1151 parent.appendChild(div);
1152 val = child.offsetHeight + 18 > div.scrollHeight;
1153 parent.removeChild(div);
1154 return val;
1155 }();
1156
1157 _touchEventLookup = function (types) {
1158 var standard = types.split(","),
1159 converted = ("onpointerdown" in _tempDiv ? "pointerdown,pointermove,pointerup,pointercancel" : "onmspointerdown" in _tempDiv ? "MSPointerDown,MSPointerMove,MSPointerUp,MSPointerCancel" : types).split(","),
1160 obj = {},
1161 i = 4;
1162
1163 while (--i > -1) {
1164 obj[standard[i]] = converted[i];
1165 obj[converted[i]] = standard[i];
1166 }
1167
1168 try {
1169 _docElement$1.addEventListener("test", null, Object.defineProperty({}, "passive", {
1170 get: function get() {
1171 _supportsPassive = 1;
1172 }
1173 }));
1174 } catch (e) {}
1175
1176 return obj;
1177 }("touchstart,touchmove,touchend,touchcancel");
1178
1179 _addListener(_doc$1, "touchcancel", _emptyFunc);
1180
1181 _addListener(_win$1, "touchmove", _emptyFunc);
1182
1183 _body$1 && _body$1.addEventListener("touchstart", _emptyFunc);
1184
1185 _addListener(_doc$1, "contextmenu", function () {
1186 for (var p in _lookup) {
1187 if (_lookup[p].isPressed) {
1188 _lookup[p].endDrag();
1189 }
1190 }
1191 });
1192
1193 gsap = _coreInitted = _getGSAP();
1194 }
1195
1196 if (gsap) {
1197 InertiaPlugin = gsap.plugins.inertia;
1198 _checkPrefix = gsap.utils.checkPrefix;
1199 _transformProp$1 = _checkPrefix(_transformProp$1);
1200 _transformOriginProp$1 = _checkPrefix(_transformOriginProp$1);
1201 _toArray = gsap.utils.toArray;
1202 _supports3D = !!_checkPrefix("perspective");
1203 } else if (required) {
1204 console.warn("Please gsap.registerPlugin(Draggable)");
1205 }
1206 };
1207
1208 var EventDispatcher = function () {
1209 function EventDispatcher(target) {
1210 this._listeners = {};
1211 this.target = target || this;
1212 }
1213
1214 var _proto = EventDispatcher.prototype;
1215
1216 _proto.addEventListener = function addEventListener(type, callback) {
1217 var list = this._listeners[type] || (this._listeners[type] = []);
1218
1219 if (!~list.indexOf(callback)) {
1220 list.push(callback);
1221 }
1222 };
1223
1224 _proto.removeEventListener = function removeEventListener(type, callback) {
1225 var list = this._listeners[type],
1226 i = list && list.indexOf(callback) || -1;
1227 i > -1 && list.splice(i, 1);
1228 };
1229
1230 _proto.dispatchEvent = function dispatchEvent(type) {
1231 var _this = this;
1232
1233 var result;
1234 (this._listeners[type] || []).forEach(function (callback) {
1235 return callback.call(_this, {
1236 type: type,
1237 target: _this.target
1238 }) === false && (result = false);
1239 });
1240 return result;
1241 };
1242
1243 return EventDispatcher;
1244 }();
1245
1246 var Draggable = function (_EventDispatcher) {
1247 _inheritsLoose(Draggable, _EventDispatcher);
1248
1249 function Draggable(target, vars) {
1250 var _this2;
1251
1252 _this2 = _EventDispatcher.call(this) || this;
1253 _coreInitted || _initCore(1);
1254 target = _toArray(target)[0];
1255
1256 if (!InertiaPlugin) {
1257 InertiaPlugin = gsap.plugins.inertia;
1258 }
1259
1260 _this2.vars = vars = _copy(vars || {});
1261 _this2.target = target;
1262 _this2.x = _this2.y = _this2.rotation = 0;
1263 _this2.dragResistance = parseFloat(vars.dragResistance) || 0;
1264 _this2.edgeResistance = isNaN(vars.edgeResistance) ? 1 : parseFloat(vars.edgeResistance) || 0;
1265 _this2.lockAxis = vars.lockAxis;
1266 _this2.autoScroll = vars.autoScroll || 0;
1267 _this2.lockedAxis = null;
1268 _this2.allowEventDefault = !!vars.allowEventDefault;
1269 gsap.getProperty(target, "x");
1270
1271 var type = (vars.type || "x,y").toLowerCase(),
1272 xyMode = ~type.indexOf("x") || ~type.indexOf("y"),
1273 rotationMode = type.indexOf("rotation") !== -1,
1274 xProp = rotationMode ? "rotation" : xyMode ? "x" : "left",
1275 yProp = xyMode ? "y" : "top",
1276 allowX = !!(~type.indexOf("x") || ~type.indexOf("left") || type === "scroll"),
1277 allowY = !!(~type.indexOf("y") || ~type.indexOf("top") || type === "scroll"),
1278 minimumMovement = vars.minimumMovement || 2,
1279 self = _assertThisInitialized(_this2),
1280 triggers = _toArray(vars.trigger || vars.handle || target),
1281 killProps = {},
1282 dragEndTime = 0,
1283 checkAutoScrollBounds = false,
1284 autoScrollMarginTop = vars.autoScrollMarginTop || 40,
1285 autoScrollMarginRight = vars.autoScrollMarginRight || 40,
1286 autoScrollMarginBottom = vars.autoScrollMarginBottom || 40,
1287 autoScrollMarginLeft = vars.autoScrollMarginLeft || 40,
1288 isClickable = vars.clickableTest || _isClickable,
1289 clickTime = 0,
1290 gsCache = target._gsap || gsap.core.getCache(target),
1291 isFixed = _isFixed$1(target),
1292 getPropAsNum = function getPropAsNum(property, unit) {
1293 return parseFloat(gsCache.get(target, property, unit));
1294 },
1295 ownerDoc = target.ownerDocument || _doc$1,
1296 enabled,
1297 scrollProxy,
1298 startPointerX,
1299 startPointerY,
1300 startElementX,
1301 startElementY,
1302 hasBounds,
1303 hasDragCallback,
1304 hasMoveCallback,
1305 maxX,
1306 minX,
1307 maxY,
1308 minY,
1309 touch,
1310 touchID,
1311 rotationOrigin,
1312 dirty,
1313 old,
1314 snapX,
1315 snapY,
1316 snapXY,
1317 isClicking,
1318 touchEventTarget,
1319 matrix,
1320 interrupted,
1321 allowNativeTouchScrolling,
1322 touchDragAxis,
1323 isDispatching,
1324 clickDispatch,
1325 trustedClickDispatch,
1326 isPreventingDefault,
1327 innerMatrix,
1328 onContextMenu = function onContextMenu(e) {
1329 _preventDefault(e);
1330
1331 e.stopImmediatePropagation && e.stopImmediatePropagation();
1332 return false;
1333 },
1334 render = function render(suppressEvents) {
1335 if (self.autoScroll && self.isDragging && (checkAutoScrollBounds || dirty)) {
1336 var e = target,
1337 autoScrollFactor = self.autoScroll * 15,
1338 parent,
1339 isRoot,
1340 rect,
1341 pointerX,
1342 pointerY,
1343 changeX,
1344 changeY,
1345 gap;
1346 checkAutoScrollBounds = false;
1347 _windowProxy.scrollTop = _win$1.pageYOffset != null ? _win$1.pageYOffset : ownerDoc.documentElement.scrollTop != null ? ownerDoc.documentElement.scrollTop : ownerDoc.body.scrollTop;
1348 _windowProxy.scrollLeft = _win$1.pageXOffset != null ? _win$1.pageXOffset : ownerDoc.documentElement.scrollLeft != null ? ownerDoc.documentElement.scrollLeft : ownerDoc.body.scrollLeft;
1349 pointerX = self.pointerX - _windowProxy.scrollLeft;
1350 pointerY = self.pointerY - _windowProxy.scrollTop;
1351
1352 while (e && !isRoot) {
1353 isRoot = _isRoot(e.parentNode);
1354 parent = isRoot ? _windowProxy : e.parentNode;
1355 rect = isRoot ? {
1356 bottom: Math.max(_docElement$1.clientHeight, _win$1.innerHeight || 0),
1357 right: Math.max(_docElement$1.clientWidth, _win$1.innerWidth || 0),
1358 left: 0,
1359 top: 0
1360 } : parent.getBoundingClientRect();
1361 changeX = changeY = 0;
1362
1363 if (allowY) {
1364 gap = parent._gsMaxScrollY - parent.scrollTop;
1365
1366 if (gap < 0) {
1367 changeY = gap;
1368 } else if (pointerY > rect.bottom - autoScrollMarginBottom && gap) {
1369 checkAutoScrollBounds = true;
1370 changeY = Math.min(gap, autoScrollFactor * (1 - Math.max(0, rect.bottom - pointerY) / autoScrollMarginBottom) | 0);
1371 } else if (pointerY < rect.top + autoScrollMarginTop && parent.scrollTop) {
1372 checkAutoScrollBounds = true;
1373 changeY = -Math.min(parent.scrollTop, autoScrollFactor * (1 - Math.max(0, pointerY - rect.top) / autoScrollMarginTop) | 0);
1374 }
1375
1376 if (changeY) {
1377 parent.scrollTop += changeY;
1378 }
1379 }
1380
1381 if (allowX) {
1382 gap = parent._gsMaxScrollX - parent.scrollLeft;
1383
1384 if (gap < 0) {
1385 changeX = gap;
1386 } else if (pointerX > rect.right - autoScrollMarginRight && gap) {
1387 checkAutoScrollBounds = true;
1388 changeX = Math.min(gap, autoScrollFactor * (1 - Math.max(0, rect.right - pointerX) / autoScrollMarginRight) | 0);
1389 } else if (pointerX < rect.left + autoScrollMarginLeft && parent.scrollLeft) {
1390 checkAutoScrollBounds = true;
1391 changeX = -Math.min(parent.scrollLeft, autoScrollFactor * (1 - Math.max(0, pointerX - rect.left) / autoScrollMarginLeft) | 0);
1392 }
1393
1394 if (changeX) {
1395 parent.scrollLeft += changeX;
1396 }
1397 }
1398
1399 if (isRoot && (changeX || changeY)) {
1400 _win$1.scrollTo(parent.scrollLeft, parent.scrollTop);
1401
1402 setPointerPosition(self.pointerX + changeX, self.pointerY + changeY);
1403 }
1404
1405 e = parent;
1406 }
1407 }
1408
1409 if (dirty) {
1410 var x = self.x,
1411 y = self.y;
1412
1413 if (rotationMode) {
1414 self.deltaX = x - parseFloat(gsCache.rotation);
1415 self.rotation = x;
1416 gsCache.rotation = x + "deg";
1417 gsCache.renderTransform(1, gsCache);
1418 } else {
1419 if (scrollProxy) {
1420 if (allowY) {
1421 self.deltaY = y - scrollProxy.top();
1422 scrollProxy.top(y);
1423 }
1424
1425 if (allowX) {
1426 self.deltaX = x - scrollProxy.left();
1427 scrollProxy.left(x);
1428 }
1429 } else if (xyMode) {
1430 if (allowY) {
1431 self.deltaY = y - parseFloat(gsCache.y);
1432 gsCache.y = y + "px";
1433 }
1434
1435 if (allowX) {
1436 self.deltaX = x - parseFloat(gsCache.x);
1437 gsCache.x = x + "px";
1438 }
1439
1440 gsCache.renderTransform(1, gsCache);
1441 } else {
1442 if (allowY) {
1443 self.deltaY = y - parseFloat(target.style.top || 0);
1444 target.style.top = y + "px";
1445 }
1446
1447 if (allowX) {
1448 self.deltaX = x - parseFloat(target.style.left || 0);
1449 target.style.left = x + "px";
1450 }
1451 }
1452 }
1453
1454 if (hasDragCallback && !suppressEvents && !isDispatching) {
1455 isDispatching = true;
1456
1457 if (_dispatchEvent(self, "drag", "onDrag") === false) {
1458 if (allowX) {
1459 self.x -= self.deltaX;
1460 }
1461
1462 if (allowY) {
1463 self.y -= self.deltaY;
1464 }
1465
1466 render(true);
1467 }
1468
1469 isDispatching = false;
1470 }
1471 }
1472
1473 dirty = false;
1474 },
1475 syncXY = function syncXY(skipOnUpdate, skipSnap) {
1476 var x = self.x,
1477 y = self.y,
1478 snappedValue,
1479 cs;
1480
1481 if (!target._gsap) {
1482 gsCache = gsap.core.getCache(target);
1483 }
1484
1485 gsCache.uncache && gsap.getProperty(target, "x");
1486
1487 if (xyMode) {
1488 self.x = parseFloat(gsCache.x);
1489 self.y = parseFloat(gsCache.y);
1490 } else if (rotationMode) {
1491 self.x = self.rotation = parseFloat(gsCache.rotation);
1492 } else if (scrollProxy) {
1493 self.y = scrollProxy.top();
1494 self.x = scrollProxy.left();
1495 } else {
1496 self.y = parseFloat(target.style.top || (cs = _getComputedStyle(target)) && cs.top) || 0;
1497 self.x = parseFloat(target.style.left || (cs || {}).left) || 0;
1498 }
1499
1500 if ((snapX || snapY || snapXY) && !skipSnap && (self.isDragging || self.isThrowing)) {
1501 if (snapXY) {
1502 _temp1.x = self.x;
1503 _temp1.y = self.y;
1504 snappedValue = snapXY(_temp1);
1505
1506 if (snappedValue.x !== self.x) {
1507 self.x = snappedValue.x;
1508 dirty = true;
1509 }
1510
1511 if (snappedValue.y !== self.y) {
1512 self.y = snappedValue.y;
1513 dirty = true;
1514 }
1515 }
1516
1517 if (snapX) {
1518 snappedValue = snapX(self.x);
1519
1520 if (snappedValue !== self.x) {
1521 self.x = snappedValue;
1522
1523 if (rotationMode) {
1524 self.rotation = snappedValue;
1525 }
1526
1527 dirty = true;
1528 }
1529 }
1530
1531 if (snapY) {
1532 snappedValue = snapY(self.y);
1533
1534 if (snappedValue !== self.y) {
1535 self.y = snappedValue;
1536 }
1537
1538 dirty = true;
1539 }
1540 }
1541
1542 dirty && render(true);
1543
1544 if (!skipOnUpdate) {
1545 self.deltaX = self.x - x;
1546 self.deltaY = self.y - y;
1547
1548 _dispatchEvent(self, "throwupdate", "onThrowUpdate");
1549 }
1550 },
1551 buildSnapFunc = function buildSnapFunc(snap, min, max, factor) {
1552 if (min == null) {
1553 min = -_bigNum;
1554 }
1555
1556 if (max == null) {
1557 max = _bigNum;
1558 }
1559
1560 if (_isFunction(snap)) {
1561 return function (n) {
1562 var edgeTolerance = !self.isPressed ? 1 : 1 - self.edgeResistance;
1563 return snap.call(self, n > max ? max + (n - max) * edgeTolerance : n < min ? min + (n - min) * edgeTolerance : n) * factor;
1564 };
1565 }
1566
1567 if (_isArray(snap)) {
1568 return function (n) {
1569 var i = snap.length,
1570 closest = 0,
1571 absDif = _bigNum,
1572 val,
1573 dif;
1574
1575 while (--i > -1) {
1576 val = snap[i];
1577 dif = val - n;
1578
1579 if (dif < 0) {
1580 dif = -dif;
1581 }
1582
1583 if (dif < absDif && val >= min && val <= max) {
1584 closest = i;
1585 absDif = dif;
1586 }
1587 }
1588
1589 return snap[closest];
1590 };
1591 }
1592
1593 return isNaN(snap) ? function (n) {
1594 return n;
1595 } : function () {
1596 return snap * factor;
1597 };
1598 },
1599 buildPointSnapFunc = function buildPointSnapFunc(snap, minX, maxX, minY, maxY, radius, factor) {
1600 radius = radius && radius < _bigNum ? radius * radius : _bigNum;
1601
1602 if (_isFunction(snap)) {
1603 return function (point) {
1604 var edgeTolerance = !self.isPressed ? 1 : 1 - self.edgeResistance,
1605 x = point.x,
1606 y = point.y,
1607 result,
1608 dx,
1609 dy;
1610 point.x = x = x > maxX ? maxX + (x - maxX) * edgeTolerance : x < minX ? minX + (x - minX) * edgeTolerance : x;
1611 point.y = y = y > maxY ? maxY + (y - maxY) * edgeTolerance : y < minY ? minY + (y - minY) * edgeTolerance : y;
1612 result = snap.call(self, point);
1613
1614 if (result !== point) {
1615 point.x = result.x;
1616 point.y = result.y;
1617 }
1618
1619 if (factor !== 1) {
1620 point.x *= factor;
1621 point.y *= factor;
1622 }
1623
1624 if (radius < _bigNum) {
1625 dx = point.x - x;
1626 dy = point.y - y;
1627
1628 if (dx * dx + dy * dy > radius) {
1629 point.x = x;
1630 point.y = y;
1631 }
1632 }
1633
1634 return point;
1635 };
1636 }
1637
1638 if (_isArray(snap)) {
1639 return function (p) {
1640 var i = snap.length,
1641 closest = 0,
1642 minDist = _bigNum,
1643 x,
1644 y,
1645 point,
1646 dist;
1647
1648 while (--i > -1) {
1649 point = snap[i];
1650 x = point.x - p.x;
1651 y = point.y - p.y;
1652 dist = x * x + y * y;
1653
1654 if (dist < minDist) {
1655 closest = i;
1656 minDist = dist;
1657 }
1658 }
1659
1660 return minDist <= radius ? snap[closest] : p;
1661 };
1662 }
1663
1664 return function (n) {
1665 return n;
1666 };
1667 },
1668 calculateBounds = function calculateBounds() {
1669 var bounds, targetBounds, snap, snapIsRaw;
1670 hasBounds = false;
1671
1672 if (scrollProxy) {
1673 scrollProxy.calibrate();
1674 self.minX = minX = -scrollProxy.maxScrollLeft();
1675 self.minY = minY = -scrollProxy.maxScrollTop();
1676 self.maxX = maxX = self.maxY = maxY = 0;
1677 hasBounds = true;
1678 } else if (!!vars.bounds) {
1679 bounds = _getBounds(vars.bounds, target.parentNode);
1680
1681 if (rotationMode) {
1682 self.minX = minX = bounds.left;
1683 self.maxX = maxX = bounds.left + bounds.width;
1684 self.minY = minY = self.maxY = maxY = 0;
1685 } else if (!_isUndefined(vars.bounds.maxX) || !_isUndefined(vars.bounds.maxY)) {
1686 bounds = vars.bounds;
1687 self.minX = minX = bounds.minX;
1688 self.minY = minY = bounds.minY;
1689 self.maxX = maxX = bounds.maxX;
1690 self.maxY = maxY = bounds.maxY;
1691 } else {
1692 targetBounds = _getBounds(target, target.parentNode);
1693 self.minX = minX = Math.round(getPropAsNum(xProp, "px") + bounds.left - targetBounds.left);
1694 self.minY = minY = Math.round(getPropAsNum(yProp, "px") + bounds.top - targetBounds.top);
1695 self.maxX = maxX = Math.round(minX + (bounds.width - targetBounds.width));
1696 self.maxY = maxY = Math.round(minY + (bounds.height - targetBounds.height));
1697 }
1698
1699 if (minX > maxX) {
1700 self.minX = maxX;
1701 self.maxX = maxX = minX;
1702 minX = self.minX;
1703 }
1704
1705 if (minY > maxY) {
1706 self.minY = maxY;
1707 self.maxY = maxY = minY;
1708 minY = self.minY;
1709 }
1710
1711 if (rotationMode) {
1712 self.minRotation = minX;
1713 self.maxRotation = maxX;
1714 }
1715
1716 hasBounds = true;
1717 }
1718
1719 if (vars.liveSnap) {
1720 snap = vars.liveSnap === true ? vars.snap || {} : vars.liveSnap;
1721 snapIsRaw = _isArray(snap) || _isFunction(snap);
1722
1723 if (rotationMode) {
1724 snapX = buildSnapFunc(snapIsRaw ? snap : snap.rotation, minX, maxX, 1);
1725 snapY = null;
1726 } else {
1727 if (snap.points) {
1728 snapXY = buildPointSnapFunc(snapIsRaw ? snap : snap.points, minX, maxX, minY, maxY, snap.radius, scrollProxy ? -1 : 1);
1729 } else {
1730 if (allowX) {
1731 snapX = buildSnapFunc(snapIsRaw ? snap : snap.x || snap.left || snap.scrollLeft, minX, maxX, scrollProxy ? -1 : 1);
1732 }
1733
1734 if (allowY) {
1735 snapY = buildSnapFunc(snapIsRaw ? snap : snap.y || snap.top || snap.scrollTop, minY, maxY, scrollProxy ? -1 : 1);
1736 }
1737 }
1738 }
1739 }
1740 },
1741 onThrowComplete = function onThrowComplete() {
1742 self.isThrowing = false;
1743
1744 _dispatchEvent(self, "throwcomplete", "onThrowComplete");
1745 },
1746 onThrowInterrupt = function onThrowInterrupt() {
1747 self.isThrowing = false;
1748 },
1749 animate = function animate(inertia, forceZeroVelocity) {
1750 var snap, snapIsRaw, tween, overshootTolerance;
1751
1752 if (inertia && InertiaPlugin) {
1753 if (inertia === true) {
1754 snap = vars.snap || vars.liveSnap || {};
1755 snapIsRaw = _isArray(snap) || _isFunction(snap);
1756 inertia = {
1757 resistance: (vars.throwResistance || vars.resistance || 1000) / (rotationMode ? 10 : 1)
1758 };
1759
1760 if (rotationMode) {
1761 inertia.rotation = _parseInertia(self, snapIsRaw ? snap : snap.rotation, maxX, minX, 1, forceZeroVelocity);
1762 } else {
1763 if (allowX) {
1764 inertia[xProp] = _parseInertia(self, snapIsRaw ? snap : snap.points || snap.x || snap.left, maxX, minX, scrollProxy ? -1 : 1, forceZeroVelocity || self.lockedAxis === "x");
1765 }
1766
1767 if (allowY) {
1768 inertia[yProp] = _parseInertia(self, snapIsRaw ? snap : snap.points || snap.y || snap.top, maxY, minY, scrollProxy ? -1 : 1, forceZeroVelocity || self.lockedAxis === "y");
1769 }
1770
1771 if (snap.points || _isArray(snap) && _isObject(snap[0])) {
1772 inertia.linkedProps = xProp + "," + yProp;
1773 inertia.radius = snap.radius;
1774 }
1775 }
1776 }
1777
1778 self.isThrowing = true;
1779 overshootTolerance = !isNaN(vars.overshootTolerance) ? vars.overshootTolerance : vars.edgeResistance === 1 ? 0 : 1 - self.edgeResistance + 0.2;
1780
1781 if (!inertia.duration) {
1782 inertia.duration = {
1783 max: Math.max(vars.minDuration || 0, "maxDuration" in vars ? vars.maxDuration : 2),
1784 min: !isNaN(vars.minDuration) ? vars.minDuration : overshootTolerance === 0 || _isObject(inertia) && inertia.resistance > 1000 ? 0 : 0.5,
1785 overshoot: overshootTolerance
1786 };
1787 }
1788
1789 self.tween = tween = gsap.to(scrollProxy || target, {
1790 inertia: inertia,
1791 data: "_draggable",
1792 onComplete: onThrowComplete,
1793 onInterrupt: onThrowInterrupt,
1794 onUpdate: vars.fastMode ? _dispatchEvent : syncXY,
1795 onUpdateParams: vars.fastMode ? [self, "onthrowupdate", "onThrowUpdate"] : snap && snap.radius ? [false, true] : []
1796 });
1797
1798 if (!vars.fastMode) {
1799 if (scrollProxy) {
1800 scrollProxy._skip = true;
1801 }
1802
1803 tween.render(1e9, true, true);
1804 syncXY(true, true);
1805 self.endX = self.x;
1806 self.endY = self.y;
1807
1808 if (rotationMode) {
1809 self.endRotation = self.x;
1810 }
1811
1812 tween.play(0);
1813 syncXY(true, true);
1814
1815 if (scrollProxy) {
1816 scrollProxy._skip = false;
1817 }
1818 }
1819 } else if (hasBounds) {
1820 self.applyBounds();
1821 }
1822 },
1823 updateMatrix = function updateMatrix(shiftStart) {
1824 var start = matrix,
1825 p;
1826 matrix = getGlobalMatrix(target.parentNode, true);
1827
1828 if (shiftStart && self.isPressed && !matrix.equals(start || new Matrix2D())) {
1829 p = start.inverse().apply({
1830 x: startPointerX,
1831 y: startPointerY
1832 });
1833 matrix.apply(p, p);
1834 startPointerX = p.x;
1835 startPointerY = p.y;
1836 }
1837
1838 if (matrix.equals(_identityMatrix$1)) {
1839 matrix = null;
1840 }
1841 },
1842 recordStartPositions = function recordStartPositions() {
1843 var edgeTolerance = 1 - self.edgeResistance,
1844 offsetX = isFixed ? _getDocScrollLeft$1(ownerDoc) : 0,
1845 offsetY = isFixed ? _getDocScrollTop$1(ownerDoc) : 0,
1846 parsedOrigin,
1847 x,
1848 y;
1849 updateMatrix(false);
1850 _point1.x = self.pointerX - offsetX;
1851 _point1.y = self.pointerY - offsetY;
1852 matrix && matrix.apply(_point1, _point1);
1853 startPointerX = _point1.x;
1854 startPointerY = _point1.y;
1855
1856 if (dirty) {
1857 setPointerPosition(self.pointerX, self.pointerY);
1858 render(true);
1859 }
1860
1861 innerMatrix = getGlobalMatrix(target);
1862
1863 if (scrollProxy) {
1864 calculateBounds();
1865 startElementY = scrollProxy.top();
1866 startElementX = scrollProxy.left();
1867 } else {
1868 if (isTweening()) {
1869 syncXY(true, true);
1870 calculateBounds();
1871 } else {
1872 self.applyBounds();
1873 }
1874
1875 if (rotationMode) {
1876 parsedOrigin = target.ownerSVGElement ? [gsCache.xOrigin - target.getBBox().x, gsCache.yOrigin - target.getBBox().y] : (_getComputedStyle(target)[_transformOriginProp$1] || "0 0").split(" ");
1877 rotationOrigin = self.rotationOrigin = getGlobalMatrix(target).apply({
1878 x: parseFloat(parsedOrigin[0]) || 0,
1879 y: parseFloat(parsedOrigin[1]) || 0
1880 });
1881 syncXY(true, true);
1882 x = self.pointerX - rotationOrigin.x - offsetX;
1883 y = rotationOrigin.y - self.pointerY + offsetY;
1884 startElementX = self.x;
1885 startElementY = self.y = Math.atan2(y, x) * _RAD2DEG;
1886 } else {
1887 startElementY = getPropAsNum(yProp, "px");
1888 startElementX = getPropAsNum(xProp, "px");
1889 }
1890 }
1891
1892 if (hasBounds && edgeTolerance) {
1893 if (startElementX > maxX) {
1894 startElementX = maxX + (startElementX - maxX) / edgeTolerance;
1895 } else if (startElementX < minX) {
1896 startElementX = minX - (minX - startElementX) / edgeTolerance;
1897 }
1898
1899 if (!rotationMode) {
1900 if (startElementY > maxY) {
1901 startElementY = maxY + (startElementY - maxY) / edgeTolerance;
1902 } else if (startElementY < minY) {
1903 startElementY = minY - (minY - startElementY) / edgeTolerance;
1904 }
1905 }
1906 }
1907
1908 self.startX = startElementX = _round(startElementX);
1909 self.startY = startElementY = _round(startElementY);
1910 },
1911 isTweening = function isTweening() {
1912 return self.tween && self.tween.isActive();
1913 },
1914 removePlaceholder = function removePlaceholder() {
1915 if (_placeholderDiv.parentNode && !isTweening() && !self.isDragging) {
1916 _placeholderDiv.parentNode.removeChild(_placeholderDiv);
1917 }
1918 },
1919 onPress = function onPress(e, force) {
1920 var i;
1921
1922 if (!enabled || self.isPressed || !e || (e.type === "mousedown" || e.type === "pointerdown") && !force && _getTime() - clickTime < 30 && _touchEventLookup[self.pointerEvent.type]) {
1923 isPreventingDefault && e && enabled && _preventDefault(e);
1924 return;
1925 }
1926
1927 interrupted = isTweening();
1928 self.pointerEvent = e;
1929
1930 if (_touchEventLookup[e.type]) {
1931 touchEventTarget = ~e.type.indexOf("touch") ? e.currentTarget || e.target : ownerDoc;
1932
1933 _addListener(touchEventTarget, "touchend", onRelease);
1934
1935 _addListener(touchEventTarget, "touchmove", onMove);
1936
1937 _addListener(touchEventTarget, "touchcancel", onRelease);
1938
1939 _addListener(ownerDoc, "touchstart", _onMultiTouchDocument);
1940 } else {
1941 touchEventTarget = null;
1942
1943 _addListener(ownerDoc, "mousemove", onMove);
1944 }
1945
1946 touchDragAxis = null;
1947
1948 if (!_supportsPointer || !touchEventTarget) {
1949 _addListener(ownerDoc, "mouseup", onRelease);
1950
1951 e && e.target && _addListener(e.target, "mouseup", onRelease);
1952 }
1953
1954 isClicking = isClickable.call(self, e.target) && vars.dragClickables === false && !force;
1955
1956 if (isClicking) {
1957 _addListener(e.target, "change", onRelease);
1958
1959 _dispatchEvent(self, "pressInit", "onPressInit");
1960
1961 _dispatchEvent(self, "press", "onPress");
1962
1963 _setSelectable(triggers, true);
1964
1965 isPreventingDefault = false;
1966 return;
1967 }
1968
1969 allowNativeTouchScrolling = !touchEventTarget || allowX === allowY || self.vars.allowNativeTouchScrolling === false || self.vars.allowContextMenu && e && (e.ctrlKey || e.which > 2) ? false : allowX ? "y" : "x";
1970 isPreventingDefault = !allowNativeTouchScrolling && !self.allowEventDefault;
1971
1972 if (isPreventingDefault) {
1973 _preventDefault(e);
1974
1975 _addListener(_win$1, "touchforcechange", _preventDefault);
1976 }
1977
1978 if (e.changedTouches) {
1979 e = touch = e.changedTouches[0];
1980 touchID = e.identifier;
1981 } else if (e.pointerId) {
1982 touchID = e.pointerId;
1983 } else {
1984 touch = touchID = null;
1985 }
1986
1987 _dragCount++;
1988
1989 _addToRenderQueue(render);
1990
1991 startPointerY = self.pointerY = e.pageY;
1992 startPointerX = self.pointerX = e.pageX;
1993
1994 _dispatchEvent(self, "pressInit", "onPressInit");
1995
1996 if (allowNativeTouchScrolling || self.autoScroll) {
1997 _recordMaxScrolls(target.parentNode);
1998 }
1999
2000 if (target.parentNode && self.autoScroll && !scrollProxy && !rotationMode && target.parentNode._gsMaxScrollX && !_placeholderDiv.parentNode && !target.getBBox) {
2001 _placeholderDiv.style.width = target.parentNode.scrollWidth + "px";
2002 target.parentNode.appendChild(_placeholderDiv);
2003 }
2004
2005 recordStartPositions();
2006 self.tween && self.tween.kill();
2007 self.isThrowing = false;
2008 gsap.killTweensOf(scrollProxy || target, killProps, true);
2009 scrollProxy && gsap.killTweensOf(target, {
2010 scrollTo: 1
2011 }, true);
2012 self.tween = self.lockedAxis = null;
2013
2014 if (vars.zIndexBoost || !rotationMode && !scrollProxy && vars.zIndexBoost !== false) {
2015 target.style.zIndex = Draggable.zIndex++;
2016 }
2017
2018 self.isPressed = true;
2019 hasDragCallback = !!(vars.onDrag || self._listeners.drag);
2020 hasMoveCallback = !!(vars.onMove || self._listeners.move);
2021
2022 if (vars.cursor !== false || vars.activeCursor) {
2023 i = triggers.length;
2024
2025 while (--i > -1) {
2026 gsap.set(triggers[i], {
2027 cursor: vars.activeCursor || vars.cursor || (_defaultCursor === "grab" ? "grabbing" : _defaultCursor)
2028 });
2029 }
2030 }
2031
2032 _dispatchEvent(self, "press", "onPress");
2033 },
2034 onMove = function onMove(e) {
2035 var originalEvent = e,
2036 touches,
2037 pointerX,
2038 pointerY,
2039 i,
2040 dx,
2041 dy;
2042
2043 if (!enabled || _isMultiTouching || !self.isPressed || !e) {
2044 isPreventingDefault && e && enabled && _preventDefault(e);
2045 return;
2046 }
2047
2048 self.pointerEvent = e;
2049 touches = e.changedTouches;
2050
2051 if (touches) {
2052 e = touches[0];
2053
2054 if (e !== touch && e.identifier !== touchID) {
2055 i = touches.length;
2056
2057 while (--i > -1 && (e = touches[i]).identifier !== touchID && e.target !== target) {}
2058
2059 if (i < 0) {
2060 return;
2061 }
2062 }
2063 } else if (e.pointerId && touchID && e.pointerId !== touchID) {
2064 return;
2065 }
2066
2067 if (touchEventTarget && allowNativeTouchScrolling && !touchDragAxis) {
2068 _point1.x = e.pageX - (isFixed ? _getDocScrollLeft$1(ownerDoc) : 0);
2069 _point1.y = e.pageY - (isFixed ? _getDocScrollTop$1(ownerDoc) : 0);
2070 matrix && matrix.apply(_point1, _point1);
2071 pointerX = _point1.x;
2072 pointerY = _point1.y;
2073 dx = Math.abs(pointerX - startPointerX);
2074 dy = Math.abs(pointerY - startPointerY);
2075
2076 if (dx !== dy && (dx > minimumMovement || dy > minimumMovement) || _isAndroid && allowNativeTouchScrolling === touchDragAxis) {
2077 touchDragAxis = dx > dy && allowX ? "x" : "y";
2078
2079 if (allowNativeTouchScrolling && touchDragAxis !== allowNativeTouchScrolling) {
2080 _addListener(_win$1, "touchforcechange", _preventDefault);
2081 }
2082
2083 if (self.vars.lockAxisOnTouchScroll !== false && allowX && allowY) {
2084 self.lockedAxis = touchDragAxis === "x" ? "y" : "x";
2085 _isFunction(self.vars.onLockAxis) && self.vars.onLockAxis.call(self, originalEvent);
2086 }
2087
2088 if (_isAndroid && allowNativeTouchScrolling === touchDragAxis) {
2089 onRelease(originalEvent);
2090 return;
2091 }
2092 }
2093 }
2094
2095 if (!self.allowEventDefault && (!allowNativeTouchScrolling || touchDragAxis && allowNativeTouchScrolling !== touchDragAxis) && originalEvent.cancelable !== false) {
2096 _preventDefault(originalEvent);
2097
2098 isPreventingDefault = true;
2099 } else if (isPreventingDefault) {
2100 isPreventingDefault = false;
2101 }
2102
2103 if (self.autoScroll) {
2104 checkAutoScrollBounds = true;
2105 }
2106
2107 setPointerPosition(e.pageX, e.pageY, hasMoveCallback);
2108 },
2109 setPointerPosition = function setPointerPosition(pointerX, pointerY, invokeOnMove) {
2110 var dragTolerance = 1 - self.dragResistance,
2111 edgeTolerance = 1 - self.edgeResistance,
2112 prevPointerX = self.pointerX,
2113 prevPointerY = self.pointerY,
2114 prevStartElementY = startElementY,
2115 prevX = self.x,
2116 prevY = self.y,
2117 prevEndX = self.endX,
2118 prevEndY = self.endY,
2119 prevEndRotation = self.endRotation,
2120 prevDirty = dirty,
2121 xChange,
2122 yChange,
2123 x,
2124 y,
2125 dif,
2126 temp;
2127 self.pointerX = pointerX;
2128 self.pointerY = pointerY;
2129
2130 if (isFixed) {
2131 pointerX -= _getDocScrollLeft$1(ownerDoc);
2132 pointerY -= _getDocScrollTop$1(ownerDoc);
2133 }
2134
2135 if (rotationMode) {
2136 y = Math.atan2(rotationOrigin.y - pointerY, pointerX - rotationOrigin.x) * _RAD2DEG;
2137 dif = self.y - y;
2138
2139 if (dif > 180) {
2140 startElementY -= 360;
2141 self.y = y;
2142 } else if (dif < -180) {
2143 startElementY += 360;
2144 self.y = y;
2145 }
2146
2147 if (self.x !== startElementX || Math.abs(startElementY - y) > minimumMovement) {
2148 self.y = y;
2149 x = startElementX + (startElementY - y) * dragTolerance;
2150 } else {
2151 x = startElementX;
2152 }
2153 } else {
2154 if (matrix) {
2155 temp = pointerX * matrix.a + pointerY * matrix.c + matrix.e;
2156 pointerY = pointerX * matrix.b + pointerY * matrix.d + matrix.f;
2157 pointerX = temp;
2158 }
2159
2160 yChange = pointerY - startPointerY;
2161 xChange = pointerX - startPointerX;
2162
2163 if (yChange < minimumMovement && yChange > -minimumMovement) {
2164 yChange = 0;
2165 }
2166
2167 if (xChange < minimumMovement && xChange > -minimumMovement) {
2168 xChange = 0;
2169 }
2170
2171 if ((self.lockAxis || self.lockedAxis) && (xChange || yChange)) {
2172 temp = self.lockedAxis;
2173
2174 if (!temp) {
2175 self.lockedAxis = temp = allowX && Math.abs(xChange) > Math.abs(yChange) ? "y" : allowY ? "x" : null;
2176
2177 if (temp && _isFunction(self.vars.onLockAxis)) {
2178 self.vars.onLockAxis.call(self, self.pointerEvent);
2179 }
2180 }
2181
2182 if (temp === "y") {
2183 yChange = 0;
2184 } else if (temp === "x") {
2185 xChange = 0;
2186 }
2187 }
2188
2189 x = _round(startElementX + xChange * dragTolerance);
2190 y = _round(startElementY + yChange * dragTolerance);
2191 }
2192
2193 if ((snapX || snapY || snapXY) && (self.x !== x || self.y !== y && !rotationMode)) {
2194 if (snapXY) {
2195 _temp1.x = x;
2196 _temp1.y = y;
2197 temp = snapXY(_temp1);
2198 x = _round(temp.x);
2199 y = _round(temp.y);
2200 }
2201
2202 if (snapX) {
2203 x = _round(snapX(x));
2204 }
2205
2206 if (snapY) {
2207 y = _round(snapY(y));
2208 }
2209 }
2210
2211 if (hasBounds) {
2212 if (x > maxX) {
2213 x = maxX + Math.round((x - maxX) * edgeTolerance);
2214 } else if (x < minX) {
2215 x = minX + Math.round((x - minX) * edgeTolerance);
2216 }
2217
2218 if (!rotationMode) {
2219 if (y > maxY) {
2220 y = Math.round(maxY + (y - maxY) * edgeTolerance);
2221 } else if (y < minY) {
2222 y = Math.round(minY + (y - minY) * edgeTolerance);
2223 }
2224 }
2225 }
2226
2227 if (self.x !== x || self.y !== y && !rotationMode) {
2228 if (rotationMode) {
2229 self.endRotation = self.x = self.endX = x;
2230 dirty = true;
2231 } else {
2232 if (allowY) {
2233 self.y = self.endY = y;
2234 dirty = true;
2235 }
2236
2237 if (allowX) {
2238 self.x = self.endX = x;
2239 dirty = true;
2240 }
2241 }
2242
2243 if (!invokeOnMove || _dispatchEvent(self, "move", "onMove") !== false) {
2244 if (!self.isDragging && self.isPressed) {
2245 self.isDragging = true;
2246
2247 _dispatchEvent(self, "dragstart", "onDragStart");
2248 }
2249 } else {
2250 self.pointerX = prevPointerX;
2251 self.pointerY = prevPointerY;
2252 startElementY = prevStartElementY;
2253 self.x = prevX;
2254 self.y = prevY;
2255 self.endX = prevEndX;
2256 self.endY = prevEndY;
2257 self.endRotation = prevEndRotation;
2258 dirty = prevDirty;
2259 }
2260 }
2261 },
2262 onRelease = function onRelease(e, force) {
2263 if (!enabled || !self.isPressed || e && touchID != null && !force && (e.pointerId && e.pointerId !== touchID && e.target !== target || e.changedTouches && !_hasTouchID(e.changedTouches, touchID))) {
2264 isPreventingDefault && e && enabled && _preventDefault(e);
2265 return;
2266 }
2267
2268 self.isPressed = false;
2269 var originalEvent = e,
2270 wasDragging = self.isDragging,
2271 isContextMenuRelease = self.vars.allowContextMenu && e && (e.ctrlKey || e.which > 2),
2272 placeholderDelayedCall = gsap.delayedCall(0.001, removePlaceholder),
2273 touches,
2274 i,
2275 syntheticEvent,
2276 eventTarget,
2277 syntheticClick;
2278
2279 if (touchEventTarget) {
2280 _removeListener(touchEventTarget, "touchend", onRelease);
2281
2282 _removeListener(touchEventTarget, "touchmove", onMove);
2283
2284 _removeListener(touchEventTarget, "touchcancel", onRelease);
2285
2286 _removeListener(ownerDoc, "touchstart", _onMultiTouchDocument);
2287 } else {
2288 _removeListener(ownerDoc, "mousemove", onMove);
2289 }
2290
2291 _removeListener(_win$1, "touchforcechange", _preventDefault);
2292
2293 if (!_supportsPointer || !touchEventTarget) {
2294 _removeListener(ownerDoc, "mouseup", onRelease);
2295
2296 e && e.target && _removeListener(e.target, "mouseup", onRelease);
2297 }
2298
2299 dirty = false;
2300
2301 if (wasDragging) {
2302 dragEndTime = _lastDragTime = _getTime();
2303 self.isDragging = false;
2304 }
2305
2306 if (isClicking && !isContextMenuRelease) {
2307 if (e) {
2308 _removeListener(e.target, "change", onRelease);
2309
2310 self.pointerEvent = originalEvent;
2311 }
2312
2313 _setSelectable(triggers, false);
2314
2315 _dispatchEvent(self, "release", "onRelease");
2316
2317 _dispatchEvent(self, "click", "onClick");
2318
2319 isClicking = false;
2320 return;
2321 }
2322
2323 _removeFromRenderQueue(render);
2324
2325 i = triggers.length;
2326
2327 while (--i > -1) {
2328 _setStyle(triggers[i], "cursor", vars.cursor || (vars.cursor !== false ? _defaultCursor : null));
2329 }
2330
2331 _dragCount--;
2332
2333 if (e) {
2334 touches = e.changedTouches;
2335
2336 if (touches) {
2337 e = touches[0];
2338
2339 if (e !== touch && e.identifier !== touchID) {
2340 i = touches.length;
2341
2342 while (--i > -1 && (e = touches[i]).identifier !== touchID && e.target !== target) {}
2343
2344 if (i < 0) {
2345 return;
2346 }
2347 }
2348 }
2349
2350 self.pointerEvent = originalEvent;
2351 self.pointerX = e.pageX;
2352 self.pointerY = e.pageY;
2353 }
2354
2355 if (isContextMenuRelease && originalEvent) {
2356 _preventDefault(originalEvent);
2357
2358 isPreventingDefault = true;
2359
2360 _dispatchEvent(self, "release", "onRelease");
2361 } else if (originalEvent && !wasDragging) {
2362 isPreventingDefault = false;
2363
2364 if (interrupted && (vars.snap || vars.bounds)) {
2365 animate(vars.inertia || vars.throwProps);
2366 }
2367
2368 _dispatchEvent(self, "release", "onRelease");
2369
2370 if ((!_isAndroid || originalEvent.type !== "touchmove") && originalEvent.type.indexOf("cancel") === -1) {
2371 _dispatchEvent(self, "click", "onClick");
2372
2373 if (_getTime() - clickTime < 300) {
2374 _dispatchEvent(self, "doubleclick", "onDoubleClick");
2375 }
2376
2377 eventTarget = originalEvent.target || target;
2378 clickTime = _getTime();
2379
2380 syntheticClick = function syntheticClick() {
2381 if (clickTime !== clickDispatch && self.enabled() && !self.isPressed && !originalEvent.defaultPrevented) {
2382 if (eventTarget.click) {
2383 eventTarget.click();
2384 } else if (ownerDoc.createEvent) {
2385 syntheticEvent = ownerDoc.createEvent("MouseEvents");
2386 syntheticEvent.initMouseEvent("click", true, true, _win$1, 1, self.pointerEvent.screenX, self.pointerEvent.screenY, self.pointerX, self.pointerY, false, false, false, false, 0, null);
2387 eventTarget.dispatchEvent(syntheticEvent);
2388 }
2389 }
2390 };
2391
2392 if (!_isAndroid && !originalEvent.defaultPrevented) {
2393 gsap.delayedCall(0.05, syntheticClick);
2394 }
2395 }
2396 } else {
2397 animate(vars.inertia || vars.throwProps);
2398
2399 if (!self.allowEventDefault && originalEvent && (vars.dragClickables !== false || !isClickable.call(self, originalEvent.target)) && wasDragging && (!allowNativeTouchScrolling || touchDragAxis && allowNativeTouchScrolling === touchDragAxis) && originalEvent.cancelable !== false) {
2400 isPreventingDefault = true;
2401
2402 _preventDefault(originalEvent);
2403 } else {
2404 isPreventingDefault = false;
2405 }
2406
2407 _dispatchEvent(self, "release", "onRelease");
2408 }
2409
2410 isTweening() && placeholderDelayedCall.duration(self.tween.duration());
2411 wasDragging && _dispatchEvent(self, "dragend", "onDragEnd");
2412 return true;
2413 },
2414 updateScroll = function updateScroll(e) {
2415 if (e && self.isDragging && !scrollProxy) {
2416 var parent = e.target || target.parentNode,
2417 deltaX = parent.scrollLeft - parent._gsScrollX,
2418 deltaY = parent.scrollTop - parent._gsScrollY;
2419
2420 if (deltaX || deltaY) {
2421 if (matrix) {
2422 startPointerX -= deltaX * matrix.a + deltaY * matrix.c;
2423 startPointerY -= deltaY * matrix.d + deltaX * matrix.b;
2424 } else {
2425 startPointerX -= deltaX;
2426 startPointerY -= deltaY;
2427 }
2428
2429 parent._gsScrollX += deltaX;
2430 parent._gsScrollY += deltaY;
2431 setPointerPosition(self.pointerX, self.pointerY);
2432 }
2433 }
2434 },
2435 onClick = function onClick(e) {
2436 var time = _getTime(),
2437 recentlyClicked = time - clickTime < 100,
2438 recentlyDragged = time - dragEndTime < 50,
2439 alreadyDispatched = recentlyClicked && clickDispatch === clickTime,
2440 defaultPrevented = self.pointerEvent && self.pointerEvent.defaultPrevented,
2441 alreadyDispatchedTrusted = recentlyClicked && trustedClickDispatch === clickTime,
2442 trusted = e.isTrusted || e.isTrusted == null && recentlyClicked && alreadyDispatched;
2443
2444 if ((alreadyDispatched || recentlyDragged && self.vars.suppressClickOnDrag !== false) && e.stopImmediatePropagation) {
2445 e.stopImmediatePropagation();
2446 }
2447
2448 if (recentlyClicked && !(self.pointerEvent && self.pointerEvent.defaultPrevented) && (!alreadyDispatched || trusted && !alreadyDispatchedTrusted)) {
2449 if (trusted && alreadyDispatched) {
2450 trustedClickDispatch = clickTime;
2451 }
2452
2453 clickDispatch = clickTime;
2454 return;
2455 }
2456
2457 if (self.isPressed || recentlyDragged || recentlyClicked) {
2458 if (!trusted || !e.detail || !recentlyClicked || defaultPrevented) {
2459 _preventDefault(e);
2460 }
2461 }
2462
2463 if (!recentlyClicked && !recentlyDragged) {
2464 e && e.target && (self.pointerEvent = e);
2465
2466 _dispatchEvent(self, "click", "onClick");
2467 }
2468 },
2469 localizePoint = function localizePoint(p) {
2470 return matrix ? {
2471 x: p.x * matrix.a + p.y * matrix.c + matrix.e,
2472 y: p.x * matrix.b + p.y * matrix.d + matrix.f
2473 } : {
2474 x: p.x,
2475 y: p.y
2476 };
2477 };
2478
2479 old = Draggable.get(target);
2480 old && old.kill();
2481
2482 _this2.startDrag = function (event, align) {
2483 var r1, r2, p1, p2;
2484 onPress(event || self.pointerEvent, true);
2485
2486 if (align && !self.hitTest(event || self.pointerEvent)) {
2487 r1 = _parseRect(event || self.pointerEvent);
2488 r2 = _parseRect(target);
2489 p1 = localizePoint({
2490 x: r1.left + r1.width / 2,
2491 y: r1.top + r1.height / 2
2492 });
2493 p2 = localizePoint({
2494 x: r2.left + r2.width / 2,
2495 y: r2.top + r2.height / 2
2496 });
2497 startPointerX -= p1.x - p2.x;
2498 startPointerY -= p1.y - p2.y;
2499 }
2500
2501 if (!self.isDragging) {
2502 self.isDragging = true;
2503
2504 _dispatchEvent(self, "dragstart", "onDragStart");
2505 }
2506 };
2507
2508 _this2.drag = onMove;
2509
2510 _this2.endDrag = function (e) {
2511 return onRelease(e || self.pointerEvent, true);
2512 };
2513
2514 _this2.timeSinceDrag = function () {
2515 return self.isDragging ? 0 : (_getTime() - dragEndTime) / 1000;
2516 };
2517
2518 _this2.timeSinceClick = function () {
2519 return (_getTime() - clickTime) / 1000;
2520 };
2521
2522 _this2.hitTest = function (target, threshold) {
2523 return Draggable.hitTest(self.target, target, threshold);
2524 };
2525
2526 _this2.getDirection = function (from, diagonalThreshold) {
2527 var mode = from === "velocity" && InertiaPlugin ? from : _isObject(from) && !rotationMode ? "element" : "start",
2528 xChange,
2529 yChange,
2530 ratio,
2531 direction,
2532 r1,
2533 r2;
2534
2535 if (mode === "element") {
2536 r1 = _parseRect(self.target);
2537 r2 = _parseRect(from);
2538 }
2539
2540 xChange = mode === "start" ? self.x - startElementX : mode === "velocity" ? InertiaPlugin.getVelocity(target, xProp) : r1.left + r1.width / 2 - (r2.left + r2.width / 2);
2541
2542 if (rotationMode) {
2543 return xChange < 0 ? "counter-clockwise" : "clockwise";
2544 } else {
2545 diagonalThreshold = diagonalThreshold || 2;
2546 yChange = mode === "start" ? self.y - startElementY : mode === "velocity" ? InertiaPlugin.getVelocity(target, yProp) : r1.top + r1.height / 2 - (r2.top + r2.height / 2);
2547 ratio = Math.abs(xChange / yChange);
2548 direction = ratio < 1 / diagonalThreshold ? "" : xChange < 0 ? "left" : "right";
2549
2550 if (ratio < diagonalThreshold) {
2551 if (direction !== "") {
2552 direction += "-";
2553 }
2554
2555 direction += yChange < 0 ? "up" : "down";
2556 }
2557 }
2558
2559 return direction;
2560 };
2561
2562 _this2.applyBounds = function (newBounds, sticky) {
2563 var x, y, forceZeroVelocity, e, parent, isRoot;
2564
2565 if (newBounds && vars.bounds !== newBounds) {
2566 vars.bounds = newBounds;
2567 return self.update(true, sticky);
2568 }
2569
2570 syncXY(true);
2571 calculateBounds();
2572
2573 if (hasBounds && !isTweening()) {
2574 x = self.x;
2575 y = self.y;
2576
2577 if (x > maxX) {
2578 x = maxX;
2579 } else if (x < minX) {
2580 x = minX;
2581 }
2582
2583 if (y > maxY) {
2584 y = maxY;
2585 } else if (y < minY) {
2586 y = minY;
2587 }
2588
2589 if (self.x !== x || self.y !== y) {
2590 forceZeroVelocity = true;
2591 self.x = self.endX = x;
2592
2593 if (rotationMode) {
2594 self.endRotation = x;
2595 } else {
2596 self.y = self.endY = y;
2597 }
2598
2599 dirty = true;
2600 render(true);
2601
2602 if (self.autoScroll && !self.isDragging) {
2603 _recordMaxScrolls(target.parentNode);
2604
2605 e = target;
2606 _windowProxy.scrollTop = _win$1.pageYOffset != null ? _win$1.pageYOffset : ownerDoc.documentElement.scrollTop != null ? ownerDoc.documentElement.scrollTop : ownerDoc.body.scrollTop;
2607 _windowProxy.scrollLeft = _win$1.pageXOffset != null ? _win$1.pageXOffset : ownerDoc.documentElement.scrollLeft != null ? ownerDoc.documentElement.scrollLeft : ownerDoc.body.scrollLeft;
2608
2609 while (e && !isRoot) {
2610 isRoot = _isRoot(e.parentNode);
2611 parent = isRoot ? _windowProxy : e.parentNode;
2612
2613 if (allowY && parent.scrollTop > parent._gsMaxScrollY) {
2614 parent.scrollTop = parent._gsMaxScrollY;
2615 }
2616
2617 if (allowX && parent.scrollLeft > parent._gsMaxScrollX) {
2618 parent.scrollLeft = parent._gsMaxScrollX;
2619 }
2620
2621 e = parent;
2622 }
2623 }
2624 }
2625
2626 if (self.isThrowing && (forceZeroVelocity || self.endX > maxX || self.endX < minX || self.endY > maxY || self.endY < minY)) {
2627 animate(vars.inertia || vars.throwProps, forceZeroVelocity);
2628 }
2629 }
2630
2631 return self;
2632 };
2633
2634 _this2.update = function (applyBounds, sticky, ignoreExternalChanges) {
2635 if (sticky && self.isPressed) {
2636 var m = getGlobalMatrix(target),
2637 p = innerMatrix.apply({
2638 x: self.x - startElementX,
2639 y: self.y - startElementY
2640 }),
2641 m2 = getGlobalMatrix(target.parentNode, true);
2642 m2.apply({
2643 x: m.e - p.x,
2644 y: m.f - p.y
2645 }, p);
2646 self.x -= p.x - m2.e;
2647 self.y -= p.y - m2.f;
2648 render(true);
2649 recordStartPositions();
2650 }
2651
2652 var x = self.x,
2653 y = self.y;
2654 updateMatrix(!sticky);
2655
2656 if (applyBounds) {
2657 self.applyBounds();
2658 } else {
2659 dirty && ignoreExternalChanges && render(true);
2660 syncXY(true);
2661 }
2662
2663 if (sticky) {
2664 setPointerPosition(self.pointerX, self.pointerY);
2665 dirty && render(true);
2666 }
2667
2668 if (self.isPressed && !sticky && (allowX && Math.abs(x - self.x) > 0.01 || allowY && Math.abs(y - self.y) > 0.01 && !rotationMode)) {
2669 recordStartPositions();
2670 }
2671
2672 if (self.autoScroll) {
2673 _recordMaxScrolls(target.parentNode, self.isDragging);
2674
2675 checkAutoScrollBounds = self.isDragging;
2676 render(true);
2677
2678 _removeScrollListener(target, updateScroll);
2679
2680 _addScrollListener(target, updateScroll);
2681 }
2682
2683 return self;
2684 };
2685
2686 _this2.enable = function (type) {
2687 var setVars = {
2688 lazy: true
2689 },
2690 id,
2691 i,
2692 trigger;
2693
2694 if (vars.cursor !== false) {
2695 setVars.cursor = vars.cursor || _defaultCursor;
2696 }
2697
2698 if (gsap.utils.checkPrefix("touchCallout")) {
2699 setVars.touchCallout = "none";
2700 }
2701
2702 if (type !== "soft") {
2703 _setTouchActionForAllDescendants(triggers, allowX === allowY ? "none" : vars.allowNativeTouchScrolling && target.scrollHeight === target.clientHeight === (target.scrollWidth === target.clientHeight) || vars.allowEventDefault ? "manipulation" : allowX ? "pan-y" : "pan-x");
2704
2705 i = triggers.length;
2706
2707 while (--i > -1) {
2708 trigger = triggers[i];
2709 _supportsPointer || _addListener(trigger, "mousedown", onPress);
2710
2711 _addListener(trigger, "touchstart", onPress);
2712
2713 _addListener(trigger, "click", onClick, true);
2714
2715 gsap.set(trigger, setVars);
2716
2717 if (trigger.getBBox && trigger.ownerSVGElement) {
2718 gsap.set(trigger.ownerSVGElement, {
2719 touchAction: allowX === allowY ? "none" : vars.allowNativeTouchScrolling || vars.allowEventDefault ? "manipulation" : allowX ? "pan-y" : "pan-x"
2720 });
2721 }
2722
2723 vars.allowContextMenu || _addListener(trigger, "contextmenu", onContextMenu);
2724 }
2725
2726 _setSelectable(triggers, false);
2727 }
2728
2729 _addScrollListener(target, updateScroll);
2730
2731 enabled = true;
2732
2733 if (InertiaPlugin && type !== "soft") {
2734 InertiaPlugin.track(scrollProxy || target, xyMode ? "x,y" : rotationMode ? "rotation" : "top,left");
2735 }
2736
2737 target._gsDragID = id = "d" + _lookupCount++;
2738 _lookup[id] = self;
2739
2740 if (scrollProxy) {
2741 scrollProxy.enable();
2742 scrollProxy.element._gsDragID = id;
2743 }
2744
2745 (vars.bounds || rotationMode) && recordStartPositions();
2746 vars.bounds && self.applyBounds();
2747 return self;
2748 };
2749
2750 _this2.disable = function (type) {
2751 var dragging = self.isDragging,
2752 i = triggers.length,
2753 trigger;
2754
2755 while (--i > -1) {
2756 _setStyle(triggers[i], "cursor", null);
2757 }
2758
2759 if (type !== "soft") {
2760 _setTouchActionForAllDescendants(triggers, null);
2761
2762 i = triggers.length;
2763
2764 while (--i > -1) {
2765 trigger = triggers[i];
2766
2767 _setStyle(trigger, "touchCallout", null);
2768
2769 _removeListener(trigger, "mousedown", onPress);
2770
2771 _removeListener(trigger, "touchstart", onPress);
2772
2773 _removeListener(trigger, "click", onClick);
2774
2775 _removeListener(trigger, "contextmenu", onContextMenu);
2776 }
2777
2778 _setSelectable(triggers, true);
2779
2780 if (touchEventTarget) {
2781 _removeListener(touchEventTarget, "touchcancel", onRelease);
2782
2783 _removeListener(touchEventTarget, "touchend", onRelease);
2784
2785 _removeListener(touchEventTarget, "touchmove", onMove);
2786 }
2787
2788 _removeListener(ownerDoc, "mouseup", onRelease);
2789
2790 _removeListener(ownerDoc, "mousemove", onMove);
2791 }
2792
2793 _removeScrollListener(target, updateScroll);
2794
2795 enabled = false;
2796 InertiaPlugin && type !== "soft" && InertiaPlugin.untrack(scrollProxy || target, xyMode ? "x,y" : rotationMode ? "rotation" : "top,left");
2797 scrollProxy && scrollProxy.disable();
2798
2799 _removeFromRenderQueue(render);
2800
2801 self.isDragging = self.isPressed = isClicking = false;
2802 dragging && _dispatchEvent(self, "dragend", "onDragEnd");
2803 return self;
2804 };
2805
2806 _this2.enabled = function (value, type) {
2807 return arguments.length ? value ? self.enable(type) : self.disable(type) : enabled;
2808 };
2809
2810 _this2.kill = function () {
2811 self.isThrowing = false;
2812 self.tween && self.tween.kill();
2813 self.disable();
2814 gsap.set(triggers, {
2815 clearProps: "userSelect"
2816 });
2817 delete _lookup[target._gsDragID];
2818 return self;
2819 };
2820
2821 if (~type.indexOf("scroll")) {
2822 scrollProxy = _this2.scrollProxy = new ScrollProxy(target, _extend({
2823 onKill: function onKill() {
2824 self.isPressed && onRelease(null);
2825 }
2826 }, vars));
2827 target.style.overflowY = allowY && !_isTouchDevice ? "auto" : "hidden";
2828 target.style.overflowX = allowX && !_isTouchDevice ? "auto" : "hidden";
2829 target = scrollProxy.content;
2830 }
2831
2832 if (rotationMode) {
2833 killProps.rotation = 1;
2834 } else {
2835 if (allowX) {
2836 killProps[xProp] = 1;
2837 }
2838
2839 if (allowY) {
2840 killProps[yProp] = 1;
2841 }
2842 }
2843
2844 gsCache.force3D = "force3D" in vars ? vars.force3D : true;
2845
2846 _this2.enable();
2847
2848 return _this2;
2849 }
2850
2851 Draggable.register = function register(core) {
2852 gsap = core;
2853
2854 _initCore();
2855 };
2856
2857 Draggable.create = function create(targets, vars) {
2858 _coreInitted || _initCore(true);
2859 return _toArray(targets).map(function (target) {
2860 return new Draggable(target, vars);
2861 });
2862 };
2863
2864 Draggable.get = function get(target) {
2865 return _lookup[(_toArray(target)[0] || {})._gsDragID];
2866 };
2867
2868 Draggable.timeSinceDrag = function timeSinceDrag() {
2869 return (_getTime() - _lastDragTime) / 1000;
2870 };
2871
2872 Draggable.hitTest = function hitTest(obj1, obj2, threshold) {
2873 if (obj1 === obj2) {
2874 return false;
2875 }
2876
2877 var r1 = _parseRect(obj1),
2878 r2 = _parseRect(obj2),
2879 top = r1.top,
2880 left = r1.left,
2881 right = r1.right,
2882 bottom = r1.bottom,
2883 width = r1.width,
2884 height = r1.height,
2885 isOutside = r2.left > right || r2.right < left || r2.top > bottom || r2.bottom < top,
2886 overlap,
2887 area,
2888 isRatio;
2889
2890 if (isOutside || !threshold) {
2891 return !isOutside;
2892 }
2893
2894 isRatio = (threshold + "").indexOf("%") !== -1;
2895 threshold = parseFloat(threshold) || 0;
2896 overlap = {
2897 left: Math.max(left, r2.left),
2898 top: Math.max(top, r2.top)
2899 };
2900 overlap.width = Math.min(right, r2.right) - overlap.left;
2901 overlap.height = Math.min(bottom, r2.bottom) - overlap.top;
2902
2903 if (overlap.width < 0 || overlap.height < 0) {
2904 return false;
2905 }
2906
2907 if (isRatio) {
2908 threshold *= 0.01;
2909 area = overlap.width * overlap.height;
2910 return area >= width * height * threshold || area >= r2.width * r2.height * threshold;
2911 }
2912
2913 return overlap.width > threshold && overlap.height > threshold;
2914 };
2915
2916 return Draggable;
2917 }(EventDispatcher);
2918
2919 _setDefaults(Draggable.prototype, {
2920 pointerX: 0,
2921 pointerY: 0,
2922 startX: 0,
2923 startY: 0,
2924 deltaX: 0,
2925 deltaY: 0,
2926 isDragging: false,
2927 isPressed: false
2928 });
2929
2930 Draggable.zIndex = 1000;
2931 Draggable.version = "3.10.3";
2932 _getGSAP() && gsap.registerPlugin(Draggable);
2933
2934 exports.Draggable = Draggable;
2935 exports.default = Draggable;
2936
2937 if (typeof(window) === 'undefined' || window !== exports) {Object.defineProperty(exports, '__esModule', { value: true });} else {delete window.default;}
2938
2939})));