From 9addda824c4fa48db30b3870f2348281d881678a Mon Sep 17 00:00:00 2001 From: Taye Adeyemi Date: Sun, 9 Apr 2017 15:18:45 +0200 Subject: [PATCH] v1.3.0-alpha.0+sha.4c9dfbf --- dist/docs/index.html | 64 +- dist/interact.js | 9290 +++++++++++++++++++++++++++++++------- dist/interact.js.map | 2 +- dist/interact.min.js | 8 +- dist/interact.min.js.map | 2 +- package.json | 2 +- 6 files changed, 7652 insertions(+), 1716 deletions(-) diff --git a/dist/docs/index.html b/dist/docs/index.html index 75036f518..d8c25be9a 100644 --- a/dist/docs/index.html +++ b/dist/docs/index.html @@ -173,7 +173,7 @@

-

Interactable.draggable([options])

+

Interactable.draggable([options])

@@ -306,7 +306,7 @@

Parameters

-

Interactable.dropzone([options])

+

Interactable.dropzone([options])

@@ -433,7 +433,7 @@

Parameters

-

interact.dynamicDrop([newValue])

+

interact.dynamicDrop([newValue])

@@ -497,7 +497,7 @@

Parameters

-

Interactable.resizable([options])

+

Interactable.resizable([options])

@@ -638,7 +638,7 @@

Parameters

-

Interactable.gesturable([options])

+

Interactable.gesturable([options])

@@ -758,7 +758,7 @@

Parameters

-

Interactable

+

Interactable

@@ -783,7 +783,7 @@

Interactable
-

Interactable.getRect([element])

+

Interactable.getRect([element])

@@ -888,7 +888,7 @@

Parameters

-

Interactable.rectChecker([checker])

+

Interactable.rectChecker([checker])

@@ -951,7 +951,7 @@

Parameters

-

Interactable.origin(…)

+

Interactable.origin(…)

@@ -1041,7 +1041,7 @@

Parameters

-

Interactable.deltaSource([newValue])

+

Interactable.deltaSource([newValue])

@@ -1104,7 +1104,7 @@

Parameters

-

Interactable.context()

+

Interactable.context()

@@ -1146,7 +1146,7 @@

Interactable.context()
-

Interactable.fire(iEvent)

+

Interactable.fire(iEvent)

@@ -1207,7 +1207,7 @@

Parameters

-

Interactable.on(eventType, listener, [useCapture])

+

Interactable.on(eventType, listener, [useCapture])

@@ -1273,7 +1273,7 @@

Parameters

-

Interactable.off(eventType, listener, [useCapture])

+

Interactable.off(eventType, listener, [useCapture])

@@ -1339,7 +1339,7 @@

Parameters

-

Interactable.set(options)

+

Interactable.set(options)

@@ -1399,7 +1399,7 @@

Parameters

-

Interactable.unset()

+

Interactable.unset()

@@ -1442,7 +1442,7 @@

Interactable.unset()
-

Interactable.actionChecker([checker])

+

Interactable.actionChecker([checker])

@@ -1542,7 +1542,7 @@

Parameters

-

Interactable.styleCursor([newValue])

+

Interactable.styleCursor([newValue])

@@ -1605,7 +1605,7 @@

Parameters

-

interact.maxInteractions([newValue])

+

interact.maxInteractions([newValue])

@@ -1652,7 +1652,7 @@

Parameters

-

Interactable.preventDefault([newValue])

+

Interactable.preventDefault([newValue])

@@ -1718,7 +1718,7 @@

Parameters

-

interact(element)

+

interact(element)

@@ -1821,7 +1821,7 @@

Usage

-

interact.isSet(element)

+

interact.isSet(element)

@@ -1881,7 +1881,7 @@

Parameters

-

interact.on(type, listener, [useCapture])

+

interact.on(type, listener, [useCapture])

@@ -1948,7 +1948,7 @@

Parameters

-

interact.off(type, listener, [useCapture])

+

interact.off(type, listener, [useCapture])

@@ -2014,7 +2014,7 @@

Parameters

-

interact.debug()

+

interact.debug()

@@ -2056,7 +2056,7 @@

interact.debug()
-

interact.supportsTouch()

+

interact.supportsTouch()

@@ -2097,7 +2097,7 @@

interact.supportsTouch()
-

interact.supportsPointerEvent()

+

interact.supportsPointerEvent()

@@ -2138,7 +2138,7 @@

interact.supportsPointerEvent()
-

interact.stop(event)

+

interact.stop(event)

@@ -2198,7 +2198,7 @@

Parameters

-

interact.pointerMoveTolerance([newValue])

+

interact.pointerMoveTolerance([newValue])

@@ -2261,7 +2261,7 @@

Parameters

-

Interaction.start(action, target, element)

+

Interaction.start(action, target, element)

@@ -2356,7 +2356,7 @@

Parameters

-

Interaction.doMove()

+

Interaction.doMove()

@@ -2403,7 +2403,7 @@

Interaction.doMove()
-

Interaction.end([event])

+

Interaction.end([event])

diff --git a/dist/interact.js b/dist/interact.js index 6531ffdf6..74b68fe34 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,1716 +1,7652 @@ /** - * interact.js @41ef1c4 + * interact.js v1.3.0-alpha.0+sha.4c9dfbf * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. * https://raw.github.com/taye/interact.js/master/LICENSE */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 6 && arguments[6] !== undefined ? arguments[6] : false; + + _classCallCheck(this, InteractEvent); + + var target = interaction.target; + var deltaSource = (target && target.options || defaults).deltaSource; + var origin = getOriginXY(target, element, action); + var starting = phase === 'start'; + var ending = phase === 'end'; + var coords = starting ? interaction.startCoords : interaction.curCoords; + var prevEvent = interaction.prevEvent; + + element = element || interaction.element; + + var page = extend({}, coords.page); + var client = extend({}, coords.client); + + page.x -= origin.x; + page.y -= origin.y; + + client.x -= origin.x; + client.y -= origin.y; + + this.ctrlKey = event.ctrlKey; + this.altKey = event.altKey; + this.shiftKey = event.shiftKey; + this.metaKey = event.metaKey; + this.button = event.button; + this.buttons = event.buttons; + this.target = element; + this.currentTarget = element; + this.relatedTarget = related || null; + this.preEnd = preEnd; + this.type = action + (phase || ''); + this.interaction = interaction; + this.interactable = target; + + this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1] : prevEvent.t0; + + var signalArg = { + interaction: interaction, + event: event, + action: action, + phase: phase, + element: element, + related: related, + page: page, + client: client, + coords: coords, + starting: starting, + ending: ending, + deltaSource: deltaSource, + iEvent: this + }; + + signals.fire('set-xy', signalArg); + + if (ending) { + // use previous coords when ending + this.pageX = prevEvent.pageX; + this.pageY = prevEvent.pageY; + this.clientX = prevEvent.clientX; + this.clientY = prevEvent.clientY; + } else { + this.pageX = page.x; + this.pageY = page.y; + this.clientX = client.x; + this.clientY = client.y; + } + + this.x0 = interaction.startCoords.page.x - origin.x; + this.y0 = interaction.startCoords.page.y - origin.y; + this.clientX0 = interaction.startCoords.client.x - origin.x; + this.clientY0 = interaction.startCoords.client.y - origin.y; + + signals.fire('set-delta', signalArg); + + this.timeStamp = coords.timeStamp; + this.dt = interaction.pointerDelta.timeStamp; + this.duration = this.timeStamp - this.t0; + + // speed and velocity in pixels per second + this.speed = interaction.pointerDelta[deltaSource].speed; + this.velocityX = interaction.pointerDelta[deltaSource].vx; + this.velocityY = interaction.pointerDelta[deltaSource].vy; + + this.swipe = ending || phase === 'inertiastart' ? this.getSwipe() : null; + + signals.fire('new', signalArg); + } + + InteractEvent.prototype.getSwipe = function getSwipe() { + var interaction = this.interaction; + + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY + } + }; + }; + + InteractEvent.prototype.preventDefault = function preventDefault() {}; + + InteractEvent.prototype.stopImmediatePropagation = function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + }; + + InteractEvent.prototype.stopPropagation = function stopPropagation() { + this.propagationStopped = true; + }; + + return InteractEvent; +}(); + +signals.on('set-delta', function (_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction, + starting = _ref.starting, + deltaSource = _ref.deltaSource; + + var prevEvent = starting ? iEvent : interaction.prevEvent; + + if (deltaSource === 'client') { + iEvent.dx = iEvent.clientX - prevEvent.clientX; + iEvent.dy = iEvent.clientY - prevEvent.clientY; + } else { + iEvent.dx = iEvent.pageX - prevEvent.pageX; + iEvent.dy = iEvent.pageY - prevEvent.pageY; + } +}); + +InteractEvent.signals = signals; + +module.exports = InteractEvent; + +},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var is = require('./utils/is'); +var events = require('./utils/events'); +var extend = require('./utils/extend'); +var actions = require('./actions/base'); +var scope = require('./scope'); +var Eventable = require('./Eventable'); +var defaults = require('./defaultOptions'); +var signals = require('./utils/Signals').new(); + +var _require = require('./utils/domUtils'), + getElementRect = _require.getElementRect, + nodeContains = _require.nodeContains, + trySelector = _require.trySelector; + +var _require2 = require('./utils/window'), + getWindow = _require2.getWindow; + +var _require3 = require('./utils/arr'), + indexOf = _require3.indexOf, + contains = _require3.contains; + +var _require4 = require('./utils/browser'), + wheelEvent = _require4.wheelEvent; + +// all set interactables + + +scope.interactables = []; + +/*\ + * Interactable + [ property ] + ** + * Object type returned by @interact +\*/ + +var Interactable = function () { + function Interactable(target, options) { + _classCallCheck(this, Interactable); + + options = options || {}; + + this.target = target; + this.events = new Eventable(); + this._context = options.context || scope.document; + this._win = getWindow(trySelector(target) ? this._context : target); + this._doc = this._win.document; + + signals.fire('new', { + target: target, + options: options, + interactable: this, + win: this._win + }); + + scope.addDocument(this._doc, this._win); + + scope.interactables.push(this); + + this.set(options); + } + + Interactable.prototype.setOnEvents = function setOnEvents(action, phases) { + var onAction = 'on' + action; + + if (is.function(phases.onstart)) { + this.events[onAction + 'start'] = phases.onstart; + } + if (is.function(phases.onmove)) { + this.events[onAction + 'move'] = phases.onmove; + } + if (is.function(phases.onend)) { + this.events[onAction + 'end'] = phases.onend; + } + if (is.function(phases.oninertiastart)) { + this.events[onAction + 'inertiastart'] = phases.oninertiastart; + } + + return this; + }; + + Interactable.prototype.setPerAction = function setPerAction(action, options) { + // for all the default per-action options + for (var option in options) { + // if this option exists for this action + if (option in defaults[action]) { + // if the option in the options arg is an object value + if (is.object(options[option])) { + // duplicate the object + this.options[action][option] = extend(this.options[action][option] || {}, options[option]); + + if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) { + this.options[action][option].enabled = options[option].enabled === false ? false : true; + } + } else if (is.bool(options[option]) && is.object(defaults.perAction[option])) { + this.options[action][option].enabled = options[option]; + } else if (options[option] !== undefined) { + // or if it's not undefined, do a plain assignment + this.options[action][option] = options[option]; + } + } + } + }; + + /*\ + * Interactable.getRect + [ method ] + * + * The default function to get an Interactables bounding rect. Can be + * overridden using @Interactable.rectChecker. + * + - element (Element) #optional The element to measure. + = (object) The object's bounding rectangle. + o { + o top : 0, + o left : 0, + o bottom: 0, + o right : 0, + o width : 0, + o height: 0 + o } + \*/ + + + Interactable.prototype.getRect = function getRect(element) { + element = element || this.target; + + if (is.string(this.target) && !is.element(element)) { + element = this._context.querySelector(this.target); + } + + return getElementRect(element); + }; + + /*\ + * Interactable.rectChecker + [ method ] + * + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect + = (function | object) The checker function or this Interactable + \*/ + + + Interactable.prototype.rectChecker = function rectChecker(checker) { + if (is.function(checker)) { + this.getRect = checker; + + return this; + } + + if (checker === null) { + delete this.options.getRect; + + return this; + } + + return this.getRect; + }; + + Interactable.prototype._backCompatOption = function _backCompatOption(optionName, newValue) { + if (trySelector(newValue) || is.object(newValue)) { + this.options[optionName] = newValue; + + for (var _iterator = actions.names, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var action = _ref; + + this.options[action][optionName] = newValue; + } + + return this; + } + + return this.options[optionName]; + }; + + /*\ + * Interactable.origin + [ method ] + * + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector + * OR + - origin (Element) #optional An HTML or SVG Element whose rect will be used + ** + = (object) The current origin or this Interactable + \*/ + + + Interactable.prototype.origin = function origin(newValue) { + return this._backCompatOption('origin', newValue); + }; + + /*\ + * Interactable.deltaSource + [ method ] + * + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work + = (string | object) The current deltaSource or this Interactable + \*/ + + + Interactable.prototype.deltaSource = function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + + return this; + } + + return this.options.deltaSource; + }; + + /*\ + * Interactable.context + [ method ] + * + * Gets the selector context Node of the Interactable. The default is `window.document`. + * + = (Node) The context Node of this Interactable + ** + \*/ + + + Interactable.prototype.context = function context() { + return this._context; + }; + + Interactable.prototype.inContext = function inContext(element) { + return this._context === element.ownerDocument || nodeContains(this._context, element); + }; + + /*\ + * Interactable.fire + [ method ] + * + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable + = (Interactable) this Interactable + \*/ + + + Interactable.prototype.fire = function fire(iEvent) { + this.events.fire(iEvent); + + return this; + }; + + Interactable.prototype._onOffMultiple = function _onOffMultiple(method, eventType, listener, useCapture) { + if (is.string(eventType) && eventType.search(' ') !== -1) { + eventType = eventType.trim().split(/ +/); + } + + if (is.array(eventType)) { + for (var i = 0; i < eventType.length; i++) { + this[method](eventType[i], listener, useCapture); + } + + return true; + } + + if (is.object(eventType)) { + for (var prop in eventType) { + this[method](prop, eventType[prop], listener); + } + + return true; + } + }; + + /*\ + * Interactable.on + [ method ] + * + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + - eventType (string | array | object) The types of events to listen for + - listener (function) The function event (s) + - useCapture (boolean) #optional useCapture flag for addEventListener + = (object) This Interactable + \*/ + + + Interactable.prototype.on = function on(eventType, listener, useCapture) { + // convert to boolean + useCapture = !!useCapture; + + if (this._onOffMultiple('on', eventType, listener, useCapture)) { + return this; + } + + if (eventType === 'wheel') { + eventType = wheelEvent; + } + + if (contains(Interactable.eventTypes, eventType)) { + this.events.on(eventType, listener); + } + // delegated event for selector + else if (is.string(this.target)) { + events.addDelegate(this.target, this._context, eventType, listener, useCapture); + } else { + events.add(this.target, eventType, listener, useCapture); + } + + return this; + }; + + /*\ + * Interactable.off + [ method ] + * + * Removes an InteractEvent, pointerEvent or DOM event listener + * + - eventType (string | array | object) The types of events that were listened for + - listener (function) The listener function to be removed + - useCapture (boolean) #optional useCapture flag for removeEventListener + = (object) This Interactable + \*/ + + + Interactable.prototype.off = function off(eventType, listener, useCapture) { + // convert to boolean + useCapture = !!useCapture; + + if (this._onOffMultiple('off', eventType, listener, useCapture)) { + return this; + } + + if (eventType === 'wheel') { + eventType = wheelEvent; + } + + // if it is an action event type + if (contains(Interactable.eventTypes, eventType)) { + this.events.off(eventType, listener); + } + // delegated event + else if (is.string(this.target)) { + events.removeDelegate(this.target, this._context, eventType, listener, useCapture); + } + // remove listener from this Interatable's element + else { + events.remove(this.target, eventType, listener, useCapture); + } + + return this; + }; + + /*\ + * Interactable.set + [ method ] + * + * Reset the options of this Interactable + - options (object) The new settings to apply + = (object) This Interactable + \*/ + + + Interactable.prototype.set = function set(options) { + if (!is.object(options)) { + options = {}; + } + + this.options = extend({}, defaults.base); + + var perActions = extend({}, defaults.perAction); + + for (var actionName in actions.methodDict) { + var methodName = actions.methodDict[actionName]; + + this.options[actionName] = extend({}, defaults[actionName]); + + this.setPerAction(actionName, perActions); + + this[methodName](options[actionName]); + } + + for (var _iterator2 = Interactable.settingsMethods, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var setting = _ref2; + + this.options[setting] = defaults.base[setting]; + + if (setting in options) { + this[setting](options[setting]); + } + } + + signals.fire('set', { + options: options, + interactable: this + }); + + return this; + }; + + /*\ + * Interactable.unset + [ method ] + * + * Remove this interactable from the list of interactables and remove + * it's action capabilities and event listeners + * + = (object) @interact + \*/ + + + Interactable.prototype.unset = function unset() { + events.remove(this.target, 'all'); + + if (is.string(this.target)) { + // remove delegated events + for (var type in events.delegatedEvents) { + var delegated = events.delegatedEvents[type]; + + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); + + // remove the arrays if they are empty + if (!delegated.selectors.length) { + delegated[type] = null; + } + } + + events.remove(this._context, type, events.delegateListener); + events.remove(this._context, type, events.delegateUseCapture, true); + } + } else { + events.remove(this, 'all'); + } + + signals.fire('unset', { interactable: this }); + + scope.interactables.splice(indexOf(scope.interactables, this), 1); + + // Stop related interactions when an Interactable is unset + for (var _iterator3 = scope.interactions || [], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var interaction = _ref3; + + if (interaction.target === this && interaction.interacting()) { + interaction.stop(); + } + } + + return scope.interact; + }; + + return Interactable; +}(); + +scope.interactables.indexOfElement = function indexOfElement(target, context) { + context = context || scope.document; + + for (var i = 0; i < this.length; i++) { + var interactable = this[i]; + + if (interactable.target === target && interactable._context === context) { + return i; + } + } + return -1; +}; + +scope.interactables.get = function interactableGet(element, options, dontCheckInContext) { + var ret = this[this.indexOfElement(element, options && options.context)]; + + return ret && (is.string(element) || dontCheckInContext || ret.inContext(element)) ? ret : null; +}; + +scope.interactables.forEachSelector = function (callback, element) { + for (var i = 0; i < this.length; i++) { + var interactable = this[i]; + + // skip non CSS selector targets and out of context elements + if (!is.string(interactable.target) || element && !interactable.inContext(element)) { + continue; + } + + var ret = callback(interactable, interactable.target, interactable._context, i, this); + + if (ret !== undefined) { + return ret; + } + } +}; + +// all interact.js eventTypes +Interactable.eventTypes = scope.eventTypes = []; + +Interactable.signals = signals; + +Interactable.settingsMethods = ['deltaSource', 'origin', 'preventDefault', 'rectChecker']; + +module.exports = Interactable; + +},{"./Eventable":2,"./actions/base":6,"./defaultOptions":18,"./scope":34,"./utils/Signals":35,"./utils/arr":36,"./utils/browser":37,"./utils/domUtils":39,"./utils/events":40,"./utils/extend":41,"./utils/is":46,"./utils/window":52}],5:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var scope = require('./scope'); +var utils = require('./utils'); +var events = require('./utils/events'); +var browser = require('./utils/browser'); +var finder = require('./utils/interactionFinder'); +var signals = require('./utils/Signals').new(); + +var listeners = {}; +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer']; + +// for ignoring browser's simulated mouse events +var prevTouchTime = 0; + +// all active and idle interactions +scope.interactions = []; + +var Interaction = function () { + function Interaction() { + _classCallCheck(this, Interaction); + + this.target = null; // current interactable being interacted with + this.element = null; // the target element of the interactable + + this.prepared = { // action that's ready to be fired on next move event + name: null, + axis: null, + edges: null + }; + + // keep track of added pointers + this.pointers = []; + this.pointerIds = []; + this.downTargets = []; + this.downTimes = []; + + // Previous native pointer move event coordinates + this.prevCoords = { + page: { x: 0, y: 0 }, + client: { x: 0, y: 0 }, + timeStamp: 0 + }; + // current native pointer move event coordinates + this.curCoords = { + page: { x: 0, y: 0 }, + client: { x: 0, y: 0 }, + timeStamp: 0 + }; + + // Starting InteractEvent pointer coordinates + this.startCoords = { + page: { x: 0, y: 0 }, + client: { x: 0, y: 0 }, + timeStamp: 0 + }; + + // Change in coordinates and time of the pointer + this.pointerDelta = { + page: { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, + client: { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, + timeStamp: 0 + }; + + this.downEvent = null; // pointerdown/mousedown/touchstart event + this.downPointer = {}; + + this._eventTarget = null; + this._curEventTarget = null; + + this.prevEvent = null; // previous action event + + this.pointerIsDown = false; + this.pointerWasMoved = false; + this._interacting = false; + + this.mouse = false; + + signals.fire('new', this); + + scope.interactions.push(this); + } + + Interaction.prototype.pointerDown = function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, true); + + signals.fire('down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + interaction: this + }); + }; + + /*\ + * Interaction.start + [ method ] + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate number + * of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + - action (object) The action to be performed - drag, resize, etc. + - target (Interactable) The Interactable to target + - element (Element) The DOM Element to target + = (object) interact + ** + | interact(target) + | .draggable({ + | // disable the default drag start by down->move + | manualStart: true + | }) + | // start dragging after the user holds the pointer down + | .on('hold', function (event) { + | var interaction = event.interaction; + | + | if (!interaction.interacting()) { + | interaction.start({ name: 'drag' }, + | event.interactable, + | event.currentTarget); + | } + | }); + \*/ + + + Interaction.prototype.start = function start(action, target, element) { + if (this.interacting() || !this.pointerIsDown || this.pointerIds.length < (action.name === 'gesture' ? 2 : 1)) { + return; + } + + // if this interaction had been removed after stopping + // add it back + if (utils.indexOf(scope.interactions, this) === -1) { + scope.interactions.push(this); + } + + utils.copyAction(this.prepared, action); + this.target = target; + this.element = element; + + signals.fire('action-start', { + interaction: this, + event: this.downEvent + }); + }; + + Interaction.prototype.pointerMove = function pointerMove(pointer, event, eventTarget) { + if (!this.simulation) { + this.updatePointer(pointer); + utils.setCoords(this.curCoords, this.pointers); + } + + var duplicateMove = this.curCoords.page.x === this.prevCoords.page.x && this.curCoords.page.y === this.prevCoords.page.y && this.curCoords.client.x === this.prevCoords.client.x && this.curCoords.client.y === this.prevCoords.client.y; + + var dx = void 0; + var dy = void 0; + + // register movement greater than pointerMoveTolerance + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.curCoords.client.x - this.startCoords.client.x; + dy = this.curCoords.client.y - this.startCoords.client.y; + + this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance; + } + + var signalArg = { + pointer: pointer, + pointerIndex: this.getPointerIndex(pointer), + event: event, + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this, + interactingBeforeMove: this.interacting() + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and speeds + utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords); + } + + signals.fire('move', signalArg); + + if (!duplicateMove) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + this.doMove(signalArg); + } + + if (this.pointerWasMoved) { + utils.copyCoords(this.prevCoords, this.curCoords); + } + } + }; + + /*\ + * Interaction.doMove + [ method ] + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + * + ** + | interact(target) + | .draggable(true) + | .on('dragmove', function (event) { + | if (someCondition) { + | // change the snap settings + | event.interactable.draggable({ snap: { targets: [] }}); + | // fire another move event with re-calculated snap + | event.interaction.doMove(); + | } + | }); + \*/ + + + Interaction.prototype.doMove = function doMove(signalArg) { + signalArg = utils.extend({ + pointer: this.pointers[0], + event: this.prevEvent, + eventTarget: this._eventTarget, + interaction: this + }, signalArg || {}); + + signals.fire('before-action-move', signalArg); + + if (!this._dontFireMove) { + signals.fire('action-move', signalArg); + } + + this._dontFireMove = false; + }; + + // End interact move events and stop auto-scroll unless simulation is running + + + Interaction.prototype.pointerUp = function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + signals.fire(/cancel$/i.test(event.type) ? 'cancel' : 'up', { + pointer: pointer, + pointerIndex: pointerIndex, + event: event, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + }; + + /*\ + * Interaction.end + [ method ] + * + * Stop the current action and fire an end event. Inertial movement does + * not happen. + * + - event (PointerEvent) #optional + ** + | interact(target) + | .draggable(true) + | .on('move', function (event) { + | if (event.pageX > 1000) { + | // end the current action + | event.interaction.end(); + | // stop all further listeners from being called + | event.stopImmediatePropagation(); + | } + | }); + \*/ + + + Interaction.prototype.end = function end(event) { + event = event || this.prevEvent; + + if (this.interacting()) { + signals.fire('action-end', { + event: event, + interaction: this + }); + } + + this.stop(); + }; + + Interaction.prototype.currentAction = function currentAction() { + return this._interacting ? this.prepared.name : null; + }; + + Interaction.prototype.interacting = function interacting() { + return this._interacting; + }; + + Interaction.prototype.stop = function stop() { + signals.fire('stop', { interaction: this }); + + if (this._interacting) { + signals.fire('stop-active', { interaction: this }); + signals.fire('stop-' + this.prepared.name, { interaction: this }); + } + + this.target = this.element = null; + + this._interacting = false; + this.prepared.name = this.prevEvent = null; + }; + + Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); + }; + + Interaction.prototype.updatePointer = function updatePointer(pointer, event) { + var down = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : event && /(down|start)$/i.test(event.type); + + var id = utils.getPointerId(pointer); + var index = this.getPointerIndex(pointer); + + if (index === -1) { + index = this.pointerIds.length; + this.pointerIds[index] = id; + } + + if (down) { + signals.fire('update-pointer-down', { + pointer: pointer, + event: event, + down: down, + pointerId: id, + pointerIndex: index, + interaction: this + }); + } + + this.pointers[index] = pointer; + + return index; + }; + + Interaction.prototype.removePointer = function removePointer(pointer, event) { + var id = utils.getPointerId(pointer); + var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + + if (index === -1) { + return; + } + + signals.fire('remove-pointer', { + pointer: pointer, + event: event, + pointerIndex: index, + interaction: this + }); + + this.pointers.splice(index, 1); + this.pointerIds.splice(index, 1); + this.downTargets.splice(index, 1); + this.downTimes.splice(index, 1); + }; + + Interaction.prototype._updateEventTargets = function _updateEventTargets(target, currentTarget) { + this._eventTarget = target; + this._curEventTarget = currentTarget; + }; + + return Interaction; +}(); + +for (var i = 0, len = methodNames.length; i < len; i++) { + var method = methodNames[i]; + + listeners[method] = doOnInteractions(method); +} + +function doOnInteractions(method) { + return function (event) { + var _utils$getEventTarget = utils.getEventTargets(event), + eventTarget = _utils$getEventTarget[0], + curEventTarget = _utils$getEventTarget[1]; + + var matches = []; // [ [pointer, interaction], ...] + + if (browser.supportsTouch && /touch/.test(event.type)) { + prevTouchTime = new Date().getTime(); + + for (var _i = 0; _i < event.changedTouches.length; _i++) { + var pointer = event.changedTouches[_i]; + var interaction = finder.search(pointer, event.type, eventTarget); + + matches.push([pointer, interaction || new Interaction()]); + } + } else { + var invalidPointer = false; + + if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { + invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + } + + // try to ignore mouse events that are simulated by the browser + // after a touch event + invalidPointer = invalidPointer || new Date().getTime() - prevTouchTime < 500 + // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + || event.timeStamp === 0; + } + + if (!invalidPointer) { + var _interaction = finder.search(event, event.type, eventTarget); + + if (!_interaction) { + + _interaction = new Interaction(); + _interaction.mouse = /mouse/i.test(event.pointerType || event.type) + // MSPointerEvent.MSPOINTER_TYPE_MOUSE + || event.pointerType === 4 || !event.pointerType; + } + + matches.push([event, _interaction]); + } + } + + for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i3 >= _iterator.length) break; + _ref = _iterator[_i3++]; + } else { + _i3 = _iterator.next(); + if (_i3.done) break; + _ref = _i3.value; + } + + var _ref2 = _ref, + _pointer = _ref2[0], + _interaction2 = _ref2[1]; + + _interaction2._updateEventTargets(eventTarget, curEventTarget); + _interaction2[method](_pointer, event, eventTarget, curEventTarget); + } + }; +} + +function endAll(event) { + for (var _i4 = 0; _i4 < scope.interactions.length; _i4++) { + var interaction = scope.interactions[_i4]; + + interaction.end(event); + signals.fire('endall', { event: event, interaction: interaction }); + } +} + +var docEvents = {/* 'eventType': listenerFunc */}; +var pEventTypes = browser.pEventTypes; + +if (scope.PointerEvent) { + docEvents[pEventTypes.down] = listeners.pointerDown; + docEvents[pEventTypes.move] = listeners.pointerMove; + docEvents[pEventTypes.up] = listeners.pointerUp; + docEvents[pEventTypes.cancel] = listeners.pointerUp; +} else { + docEvents.mousedown = listeners.pointerDown; + docEvents.mousemove = listeners.pointerMove; + docEvents.mouseup = listeners.pointerUp; + + docEvents.touchstart = listeners.pointerDown; + docEvents.touchmove = listeners.pointerMove; + docEvents.touchend = listeners.pointerUp; + docEvents.touchcancel = listeners.pointerUp; +} + +docEvents.blur = endAll; + +function onDocSignal(_ref3, signalName) { + var doc = _ref3.doc; + + var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; + + // delegate event listener + for (var eventType in scope.delegatedEvents) { + eventMethod(doc, eventType, events.delegateListener); + eventMethod(doc, eventType, events.delegateUseCapture, true); + } + + for (var _eventType in docEvents) { + eventMethod(doc, _eventType, docEvents[_eventType]); + } +} + +signals.on('update-pointer-down', function (_ref4) { + var interaction = _ref4.interaction, + pointer = _ref4.pointer, + pointerId = _ref4.pointerId, + pointerIndex = _ref4.pointerIndex, + event = _ref4.event, + eventTarget = _ref4.eventTarget, + down = _ref4.down; + + interaction.pointerIds[pointerIndex] = pointerId; + interaction.pointers[pointerIndex] = pointer; + + if (down) { + interaction.pointerIsDown = true; + } + + if (!interaction.interacting()) { + utils.setCoords(interaction.startCoords, interaction.pointers); + + utils.copyCoords(interaction.curCoords, interaction.startCoords); + utils.copyCoords(interaction.prevCoords, interaction.startCoords); + + interaction.downEvent = event; + interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp; + interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0]; + interaction.pointerWasMoved = false; + + utils.pointerExtend(interaction.downPointer, pointer); + } +}); + +scope.signals.on('add-document', onDocSignal); +scope.signals.on('remove-document', onDocSignal); + +Interaction.pointerMoveTolerance = 1; +Interaction.doOnInteractions = doOnInteractions; +Interaction.endAll = endAll; +Interaction.signals = signals; +Interaction.docEvents = docEvents; + +scope.endAllInteractions = endAll; + +module.exports = Interaction; + +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +'use strict'; + +var Interaction = require('../Interaction'); +var InteractEvent = require('../InteractEvent'); + +var actions = { + firePrepared: firePrepared, + names: [], + methodDict: {} +}; + +Interaction.signals.on('action-start', function (_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + firePrepared(interaction, event, 'start'); + interaction._interacting = true; +}); + +Interaction.signals.on('action-move', function (_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event, + preEnd = _ref2.preEnd; + + firePrepared(interaction, event, 'move', preEnd); + + // if the action was ended in a listener + if (!interaction.interacting()) { + return false; + } +}); + +Interaction.signals.on('action-end', function (_ref3) { + var interaction = _ref3.interaction, + event = _ref3.event; + + firePrepared(interaction, event, 'end'); +}); + +function firePrepared(interaction, event, phase, preEnd) { + var actionName = interaction.prepared.name; + + var newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd); + + interaction.target.fire(newEvent); + interaction.prevEvent = newEvent; +} + +module.exports = actions; + +},{"../InteractEvent":3,"../Interaction":5}],7:[function(require,module,exports){ +'use strict'; + +var actions = require('./base'); +var utils = require('../utils'); +var InteractEvent = require('../InteractEvent'); +var Interactable = require('../Interactable'); +var Interaction = require('../Interaction'); +var defaultOptions = require('../defaultOptions'); + +var drag = { + defaults: { + enabled: false, + mouseButtons: null, + + origin: null, + snap: null, + restrict: null, + inertia: null, + autoScroll: null, + + startAxis: 'xy', + lockAxis: 'xy' + }, + + checker: function checker(pointer, event, interactable) { + var dragOptions = interactable.options.drag; + + return dragOptions.enabled ? { name: 'drag', axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis } : null; + }, + + getCursor: function getCursor() { + return 'move'; + } +}; + +Interaction.signals.on('before-action-move', function (_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.curCoords.page.y = interaction.startCoords.page.y; + interaction.curCoords.client.y = interaction.startCoords.client.y; + + interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx); + interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx); + interaction.pointerDelta.client.vy = 0; + interaction.pointerDelta.page.vy = 0; + } else if (axis === 'y') { + interaction.curCoords.page.x = interaction.startCoords.page.x; + interaction.curCoords.client.x = interaction.startCoords.client.x; + + interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy); + interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy); + interaction.pointerDelta.client.vx = 0; + interaction.pointerDelta.page.vx = 0; + } +}); + +// dragmove +InteractEvent.signals.on('new', function (_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (iEvent.type !== 'dragmove') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + iEvent.pageY = interaction.startCoords.page.y; + iEvent.clientY = interaction.startCoords.client.y; + iEvent.dy = 0; + } else if (axis === 'y') { + iEvent.pageX = interaction.startCoords.page.x; + iEvent.clientX = interaction.startCoords.client.x; + iEvent.dx = 0; + } +}); + +/*\ + * Interactable.draggable + [ method ] + * + * Gets or sets whether drag actions can be performed on the + * Interactable + * + = (boolean) Indicates if this can be the target of drag events + | var isDraggable = interact('ul li').draggable(); + * or + - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable) + = (object) This Interactable + | interact(element).draggable({ + | onstart: function (event) {}, + | onmove : function (event) {}, + | onend : function (event) {}, + | + | // the axis in which the first movement must be + | // for the drag sequence to start + | // 'xy' by default - any direction + | startAxis: 'x' || 'y' || 'xy', + | + | // 'xy' by default - don't restrict to one axis (move in any direction) + | // 'x' or 'y' to restrict movement to either axis + | // 'start' to restrict movement to the axis the drag started in + | lockAxis: 'x' || 'y' || 'xy' || 'start', + | + | // max number of drags that can happen concurrently + | // with elements of this Interactable. Infinity by default + | max: Infinity, + | + | // max number of drags that can target the same element+Interactable + | // 1 by default + | maxPerElement: 2 + | }); +\*/ +Interactable.prototype.draggable = function (options) { + if (utils.is.object(options)) { + this.options.drag.enabled = options.enabled === false ? false : true; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); + + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; + } + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } + + return this; + } + + if (utils.is.bool(options)) { + this.options.drag.enabled = options; + + if (!options) { + this.ondragstart = this.ondragstart = this.ondragend = null; + } + + return this; + } + + return this.options.drag; +}; + +actions.drag = drag; +actions.names.push('drag'); +utils.merge(Interactable.eventTypes, ['dragstart', 'dragmove', 'draginertiastart', 'draginertiaresume', 'dragend']); +actions.methodDict.drag = 'draggable'; + +defaultOptions.drag = drag.defaults; + +module.exports = drag; + +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],8:[function(require,module,exports){ +'use strict'; + +var actions = require('./base'); +var utils = require('../utils'); +var scope = require('../scope'); +var interact = require('../interact'); +var InteractEvent = require('../InteractEvent'); +var Interactable = require('../Interactable'); +var Interaction = require('../Interaction'); +var defaultOptions = require('../defaultOptions'); + +var drop = { + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; + +var dynamicDrop = false; + +Interaction.signals.on('action-start', function (_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.prepared.name !== 'drag') { + return; + } + + // reset active dropzones + interaction.activeDrops.dropzones = []; + interaction.activeDrops.elements = []; + interaction.activeDrops.rects = []; + + interaction.dropEvents = null; + + if (!interaction.dynamicDrop) { + setActiveDrops(interaction, interaction.element); + } + + var dragEvent = interaction.prevEvent; + var dropEvents = getDropEvents(interaction, event, dragEvent); + + if (dropEvents.activate) { + fireActiveDrops(interaction, dropEvents.activate); + } +}); + +InteractEvent.signals.on('new', function (_ref2) { + var interaction = _ref2.interaction, + iEvent = _ref2.iEvent, + event = _ref2.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var draggableElement = interaction.element; + var dragEvent = iEvent; + var dropResult = getDrop(dragEvent, event, draggableElement); + + interaction.dropTarget = dropResult.dropzone; + interaction.dropElement = dropResult.element; + + interaction.dropEvents = getDropEvents(interaction, event, dragEvent); +}); + +Interaction.signals.on('action-move', function (_ref3) { + var interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + fireDropEvents(interaction, interaction.dropEvents); +}); + +Interaction.signals.on('action-end', function (_ref4) { + var interaction = _ref4.interaction; + + if (interaction.prepared.name === 'drag') { + fireDropEvents(interaction, interaction.dropEvents); + } +}); + +Interaction.signals.on('stop-drag', function (_ref5) { + var interaction = _ref5.interaction; + + interaction.activeDrops.dropzones = interaction.activeDrops.elements = interaction.activeDrops.rects = interaction.dropEvents = null; +}); + +function collectDrops(interaction, element) { + var drops = []; + var elements = []; + + element = element || interaction.element; + + // collect all dropzones and their elements which qualify for a drop + for (var _iterator = scope.interactables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref6; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref6 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref6 = _i.value; + } + + var current = _ref6; + + if (!current.options.drop.enabled) { + continue; + } + + var accept = current.options.drop.accept; + + // test the draggable element against the dropzone's accept setting + if (utils.is.element(accept) && accept !== element || utils.is.string(accept) && !utils.matchesSelector(element, accept)) { + + continue; + } + + // query for new elements if necessary + var dropElements = utils.is.string(current.target) ? current._context.querySelectorAll(current.target) : [current.target]; + + for (var i = 0; i < dropElements.length; i++) { + var currentElement = dropElements[i]; + + if (currentElement !== element) { + drops.push(current); + elements.push(currentElement); + } + } + } + + return { + elements: elements, + dropzones: drops + }; +} + +function fireActiveDrops(interaction, event) { + var prevElement = void 0; + + // loop through all active dropzones and trigger event + for (var i = 0; i < interaction.activeDrops.dropzones.length; i++) { + var current = interaction.activeDrops.dropzones[i]; + var currentElement = interaction.activeDrops.elements[i]; + + // prevent trigger of duplicate events on same element + if (currentElement !== prevElement) { + // set current element as event target + event.target = currentElement; + current.fire(event); + } + prevElement = currentElement; + } +} + +// Collect a new set of possible drops and save them in activeDrops. +// setActiveDrops should always be called when a drag has just started or a +// drag event happens while dynamicDrop is true +function setActiveDrops(interaction, dragElement) { + // get dropzones and their elements that could receive the draggable + var possibleDrops = collectDrops(interaction, dragElement, true); + + interaction.activeDrops.dropzones = possibleDrops.dropzones; + interaction.activeDrops.elements = possibleDrops.elements; + interaction.activeDrops.rects = []; + + for (var i = 0; i < interaction.activeDrops.dropzones.length; i++) { + interaction.activeDrops.rects[i] = interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]); + } +} + +function getDrop(dragEvent, event, dragElement) { + var interaction = dragEvent.interaction; + var validDrops = []; + + if (dynamicDrop) { + setActiveDrops(interaction, dragElement); + } + + // collect all dropzones and their elements which qualify for a drop + for (var j = 0; j < interaction.activeDrops.dropzones.length; j++) { + var current = interaction.activeDrops.dropzones[j]; + var currentElement = interaction.activeDrops.elements[j]; + var rect = interaction.activeDrops.rects[j]; + + validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect) ? currentElement : null); + } + + // get the most appropriate dropzone based on DOM depth and order + var dropIndex = utils.indexOfDeepestElement(validDrops); + + return { + dropzone: interaction.activeDrops.dropzones[dropIndex] || null, + element: interaction.activeDrops.elements[dropIndex] || null + }; +} + +function getDropEvents(interaction, pointerEvent, dragEvent) { + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + var tmpl = { + dragEvent: dragEvent, + interaction: interaction, + target: interaction.dropElement, + dropzone: interaction.dropTarget, + relatedTarget: dragEvent.target, + draggable: dragEvent.interactable, + timeStamp: dragEvent.timeStamp + }; + + if (interaction.dropElement !== interaction.prevDropElement) { + // if there was a prevDropTarget, create a dragleave event + if (interaction.prevDropTarget) { + dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl); + + dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement; + dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget; + } + // if the dropTarget is not null, create a dragenter event + if (interaction.dropTarget) { + dropEvents.enter = { + dragEvent: dragEvent, + interaction: interaction, + target: interaction.dropElement, + dropzone: interaction.dropTarget, + relatedTarget: dragEvent.target, + draggable: dragEvent.interactable, + timeStamp: dragEvent.timeStamp, + type: 'dragenter' + }; + + dragEvent.dragEnter = interaction.dropElement; + dragEvent.dropzone = interaction.dropTarget; + } + } + + if (dragEvent.type === 'dragend' && interaction.dropTarget) { + dropEvents.drop = utils.extend({ type: 'drop' }, tmpl); + + dragEvent.dropzone = interaction.dropTarget; + dragEvent.relatedTarget = interaction.dropElement; + } + if (dragEvent.type === 'dragstart') { + dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl); + + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl); + + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + if (dragEvent.type === 'dragmove' && interaction.dropTarget) { + dropEvents.move = utils.extend({ + dragmove: dragEvent, + type: 'dropmove' + }, tmpl); + + dragEvent.dropzone = interaction.dropTarget; + } + + return dropEvents; +} + +function fireDropEvents(interaction, dropEvents) { + if (dropEvents.leave) { + interaction.prevDropTarget.fire(dropEvents.leave); + } + if (dropEvents.move) { + interaction.dropTarget.fire(dropEvents.move); + } + if (dropEvents.enter) { + interaction.dropTarget.fire(dropEvents.enter); + } + if (dropEvents.drop) { + interaction.dropTarget.fire(dropEvents.drop); + } + if (dropEvents.move) { + interaction.dropTarget.fire(dropEvents.move); + } + if (dropEvents.deactivate) { + fireActiveDrops(interaction, dropEvents.deactivate); + } + + interaction.prevDropTarget = interaction.dropTarget; + interaction.prevDropElement = interaction.dropElement; +} + +/*\ + * Interactable.dropzone + [ method ] + * + * Returns or sets whether elements can be dropped onto this + * Interactable to trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged + * element is over this Interactable. + * + | interact(target) + | .dropChecker(function(dragEvent, // related dragmove or dragend event + | event, // TouchEvent/PointerEvent/MouseEvent + | dropped, // bool result of the default checker + | dropzone, // dropzone Interactable + | dropElement, // dropzone elemnt + | draggable, // draggable Interactable + | draggableElement) {// draggable element + | + | return dropped && event.target.hasAttribute('allow-drop'); + | } + * + * + - options (boolean | object | null) #optional The new value to be set. + | interact('.drop').dropzone({ + | accept: '.can-drop' || document.getElementById('single-drop'), + | overlap: 'pointer' || 'center' || zeroToOne + | } + = (boolean | object) The current setting or this Interactable +\*/ +Interactable.prototype.dropzone = function (options) { + if (utils.is.object(options)) { + this.options.drop.enabled = options.enabled === false ? false : true; + + if (utils.is.function(options.ondrop)) { + this.events.ondrop = options.ondrop; + } + if (utils.is.function(options.ondropactivate)) { + this.events.ondropactivate = options.ondropactivate; + } + if (utils.is.function(options.ondropdeactivate)) { + this.events.ondropdeactivate = options.ondropdeactivate; + } + if (utils.is.function(options.ondragenter)) { + this.events.ondragenter = options.ondragenter; + } + if (utils.is.function(options.ondragleave)) { + this.events.ondragleave = options.ondragleave; + } + if (utils.is.function(options.ondropmove)) { + this.events.ondropmove = options.ondropmove; + } + + if (/^(pointer|center)$/.test(options.overlap)) { + this.options.drop.overlap = options.overlap; + } else if (utils.is.number(options.overlap)) { + this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } + if ('accept' in options) { + this.options.drop.accept = options.accept; + } + if ('checker' in options) { + this.options.drop.checker = options.checker; + } + + return this; + } + + if (utils.is.bool(options)) { + this.options.drop.enabled = options; + + if (!options) { + this.ondragenter = this.ondragleave = this.ondrop = this.ondropactivate = this.ondropdeactivate = null; + } + + return this; + } + + return this.options.drop; +}; + +Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; + + // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + if (!(rect = rect || this.getRect(dropElement))) { + return this.options.drop.checker ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = this.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = utils.getOriginXY(draggable, draggableElement, 'drag'); + var page = utils.getPageXY(dragEvent); + + page.x += origin.x; + page.y += origin.y; + + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && utils.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + + dropped = overlapRatio >= dropOverlap; + } + + if (this.options.drop.checker) { + dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement); + } + + return dropped; +}; + +Interactable.signals.on('unset', function (_ref7) { + var interactable = _ref7.interactable; + + interactable.dropzone(false); +}); + +Interactable.settingsMethods.push('dropChecker'); + +Interaction.signals.on('new', function (interaction) { + interaction.dropTarget = null; // the dropzone a drag target might be dropped into + interaction.dropElement = null; // the element at the time of checking + interaction.prevDropTarget = null; // the dropzone that was recently dragged away from + interaction.prevDropElement = null; // the element at the time of checking + interaction.dropEvents = null; // the dropEvents related to the current drag event + + interaction.activeDrops = { + dropzones: [], // the dropzones that are mentioned below + elements: [], // elements of dropzones that accept the target draggable + rects: [] }; +}); + +Interaction.signals.on('stop', function (_ref8) { + var interaction = _ref8.interaction; + + interaction.dropTarget = interaction.dropElement = interaction.prevDropTarget = interaction.prevDropElement = null; +}); + +/*\ + * interact.dynamicDrop + [ method ] + * + * Returns or sets whether the dimensions of dropzone elements are + * calculated on every dragmove or only on dragstart for the default + * dropChecker + * + - newValue (boolean) #optional True to check on each move. False to check only before start + = (boolean | interact) The current setting or interact +\*/ +interact.dynamicDrop = function (newValue) { + if (utils.is.bool(newValue)) { + //if (dragging && dynamicDrop !== newValue && !newValue) { + //calcRects(dropzones); + //} + + dynamicDrop = newValue; + + return interact; + } + return dynamicDrop; +}; + +utils.merge(Interactable.eventTypes, ['dragenter', 'dragleave', 'dropactivate', 'dropdeactivate', 'dropmove', 'drop']); +actions.methodDict.drop = 'dropzone'; + +defaultOptions.drop = drop.defaults; + +module.exports = drop; + +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(require,module,exports){ +'use strict'; + +var actions = require('./base'); +var utils = require('../utils'); +var InteractEvent = require('../InteractEvent'); +var Interactable = require('../Interactable'); +var Interaction = require('../Interaction'); +var defaultOptions = require('../defaultOptions'); + +var gesture = { + defaults: { + enabled: false, + origin: null, + restrict: null + }, + + checker: function checker(pointer, event, interactable, element, interaction) { + if (interaction.pointerIds.length >= 2) { + return { name: 'gesture' }; + } + + return null; + }, + + getCursor: function getCursor() { + return ''; + } +}; + +InteractEvent.signals.on('new', function (_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (iEvent.type !== 'gesturestart') { + return; + } + iEvent.ds = 0; + + interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance; + interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle; + interaction.gesture.scale = 1; +}); + +InteractEvent.signals.on('new', function (_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (iEvent.type !== 'gesturemove') { + return; + } + + iEvent.ds = iEvent.scale - interaction.gesture.scale; + + interaction.target.fire(iEvent); + + interaction.gesture.prevAngle = iEvent.angle; + interaction.gesture.prevDistance = iEvent.distance; + + if (iEvent.scale !== Infinity && iEvent.scale !== null && iEvent.scale !== undefined && !isNaN(iEvent.scale)) { + + interaction.gesture.scale = iEvent.scale; + } +}); + +/*\ + * Interactable.gesturable + [ method ] + * + * Gets or sets whether multitouch gestures can be performed on the + * Interactable's element + * + = (boolean) Indicates if this can be the target of gesture events + | var isGestureable = interact(element).gesturable(); + * or + - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable) + = (object) this Interactable + | interact(element).gesturable({ + | onstart: function (event) {}, + | onmove : function (event) {}, + | onend : function (event) {}, + | + | // limit multiple gestures. + | // See the explanation in @Interactable.draggable example + | max: Infinity, + | maxPerElement: 1, + | }); +\*/ +Interactable.prototype.gesturable = function (options) { + if (utils.is.object(options)) { + this.options.gesture.enabled = options.enabled === false ? false : true; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + + return this; + } + + if (utils.is.bool(options)) { + this.options.gesture.enabled = options; + + if (!options) { + this.ongesturestart = this.ongesturestart = this.ongestureend = null; + } + + return this; + } + + return this.options.gesture; +}; + +InteractEvent.signals.on('set-delta', function (_ref3) { + var interaction = _ref3.interaction, + iEvent = _ref3.iEvent, + action = _ref3.action, + event = _ref3.event, + starting = _ref3.starting, + ending = _ref3.ending, + deltaSource = _ref3.deltaSource; + + if (action !== 'gesture') { + return; + } + + var pointers = interaction.pointers; + + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = utils.touchDistance(pointers, deltaSource); + iEvent.box = utils.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource); + iEvent.da = 0; + } else if (ending || event instanceof InteractEvent) { + iEvent.distance = interaction.prevEvent.distance; + iEvent.box = interaction.prevEvent.box; + iEvent.scale = interaction.prevEvent.scale; + iEvent.ds = iEvent.scale - 1; + iEvent.angle = interaction.prevEvent.angle; + iEvent.da = iEvent.angle - interaction.gesture.startAngle; + } else { + iEvent.distance = utils.touchDistance(pointers, deltaSource); + iEvent.box = utils.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource); + + iEvent.ds = iEvent.scale - interaction.gesture.prevScale; + iEvent.da = iEvent.angle - interaction.gesture.prevAngle; + } +}); + +Interaction.signals.on('new', function (interaction) { + interaction.gesture = { + start: { x: 0, y: 0 }, + + startDistance: 0, // distance between two touches of touchStart + prevDistance: 0, + distance: 0, + + scale: 1, // gesture.distance / gesture.startDistance + + startAngle: 0, // angle of line joining two touches + prevAngle: 0 }; +}); + +actions.gesture = gesture; +actions.names.push('gesture'); +utils.merge(Interactable.eventTypes, ['gesturestart', 'gesturemove', 'gestureend']); +actions.methodDict.gesture = 'gesturable'; + +defaultOptions.gesture = gesture.defaults; + +module.exports = gesture; + +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(require,module,exports){ +'use strict'; + +var actions = require('./base'); +var utils = require('../utils'); +var browser = require('../utils/browser'); +var InteractEvent = require('../InteractEvent'); +var Interactable = require('../Interactable'); +var Interaction = require('../Interaction'); +var defaultOptions = require('../defaultOptions'); + +// Less Precision with touch input +var defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + +var resize = { + defaults: { + enabled: false, + mouseButtons: null, + + origin: null, + snap: null, + restrict: null, + inertia: null, + autoScroll: null, + + square: false, + preserveAspectRatio: false, + axis: 'xy', + + // use default margin + margin: NaN, + + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + + checker: function checker(pointer, event, interactable, element, interaction, rect) { + if (!rect) { + return null; + } + + var page = utils.extend({}, interaction.curCoords.page); + var options = interactable.options; + + if (options.resize.enabled) { + var resizeOptions = options.resize; + var resizeEdges = { left: false, right: false, top: false, bottom: false }; + + // if using resize.edges + if (utils.is.object(resizeOptions.edges)) { + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._eventTarget, element, rect, resizeOptions.margin || defaultMargin); + } + + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; + + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + return { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = options.resize.axis !== 'y' && page.x > rect.right - defaultMargin; + var bottom = options.resize.axis !== 'x' && page.y > rect.bottom - defaultMargin; + + if (right || bottom) { + return { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + } + + return null; + }, + + cursors: browser.isIe9OrOlder ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }, + + getCursor: function getCursor(action) { + if (action.axis) { + return resize.cursors[action.name + action.axis]; + } else if (action.edges) { + var cursorKey = ''; + var edgeNames = ['top', 'bottom', 'left', 'right']; + + for (var i = 0; i < 4; i++) { + if (action.edges[edgeNames[i]]) { + cursorKey += edgeNames[i]; + } + } + + return resize.cursors[cursorKey]; + } + } +}; + +// resizestart +InteractEvent.signals.on('new', function (_ref) { + var iEvent = _ref.iEvent, + interaction = _ref.interaction; + + if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) { + return; + } + + var startRect = interaction.target.getRect(interaction.element); + var resizeOptions = interaction.target.options.resize; + + /* + * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge + * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make + * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend + * on the active edges and the edge being interacted with. + */ + if (resizeOptions.square || resizeOptions.preserveAspectRatio) { + var linkedEdges = utils.extend({}, interaction.prepared.edges); + + linkedEdges.top = linkedEdges.top || linkedEdges.left && !linkedEdges.bottom; + linkedEdges.left = linkedEdges.left || linkedEdges.top && !linkedEdges.right; + linkedEdges.bottom = linkedEdges.bottom || linkedEdges.right && !linkedEdges.top; + linkedEdges.right = linkedEdges.right || linkedEdges.bottom && !linkedEdges.left; + + interaction.prepared._linkedEdges = linkedEdges; + } else { + interaction.prepared._linkedEdges = null; + } + + // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize + if (resizeOptions.preserveAspectRatio) { + interaction.resizeStartAspectRatio = startRect.width / startRect.height; + } + + interaction.resizeRects = { + start: startRect, + current: utils.extend({}, startRect), + inverted: utils.extend({}, startRect), + previous: utils.extend({}, startRect), + delta: { + left: 0, right: 0, width: 0, + top: 0, bottom: 0, height: 0 + } + }; + + iEvent.rect = interaction.resizeRects.inverted; + iEvent.deltaRect = interaction.resizeRects.delta; +}); + +// resizemove +InteractEvent.signals.on('new', function (_ref2) { + var iEvent = _ref2.iEvent, + phase = _ref2.phase, + interaction = _ref2.interaction; + + if (phase !== 'move' || !interaction.prepared.edges) { + return; + } + + var resizeOptions = interaction.target.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; + + var edges = interaction.prepared.edges; + + var start = interaction.resizeRects.start; + var current = interaction.resizeRects.current; + var inverted = interaction.resizeRects.inverted; + var delta = interaction.resizeRects.delta; + var previous = utils.extend(interaction.resizeRects.previous, inverted); + var originalEdges = edges; + + var dx = iEvent.dx; + var dy = iEvent.dy; + + if (resizeOptions.preserveAspectRatio || resizeOptions.square) { + // `resize.preserveAspectRatio` takes precedence over `resize.square` + var startAspectRatio = resizeOptions.preserveAspectRatio ? interaction.resizeStartAspectRatio : 1; + + edges = interaction.prepared._linkedEdges; + + if (originalEdges.left && originalEdges.bottom || originalEdges.right && originalEdges.top) { + dy = -dx / startAspectRatio; + } else if (originalEdges.left || originalEdges.right) { + dy = dx / startAspectRatio; + } else if (originalEdges.top || originalEdges.bottom) { + dx = dy * startAspectRatio; + } + } + + // update the 'current' rect without modifications + if (edges.top) { + current.top += dy; + } + if (edges.bottom) { + current.bottom += dy; + } + if (edges.left) { + current.left += dx; + } + if (edges.right) { + current.right += dx; + } + + if (invertible) { + // if invertible, copy the current rect + utils.extend(inverted, current); + + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + var swap = void 0; + + if (inverted.top > inverted.bottom) { + swap = inverted.top; + + inverted.top = inverted.bottom; + inverted.bottom = swap; + } + if (inverted.left > inverted.right) { + swap = inverted.left; + + inverted.left = inverted.right; + inverted.right = swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + inverted.top = Math.min(current.top, start.bottom); + inverted.bottom = Math.max(current.bottom, start.top); + inverted.left = Math.min(current.left, start.right); + inverted.right = Math.max(current.right, start.left); + } + + inverted.width = inverted.right - inverted.left; + inverted.height = inverted.bottom - inverted.top; + + for (var edge in inverted) { + delta[edge] = inverted[edge] - previous[edge]; + } + + iEvent.edges = interaction.prepared.edges; + iEvent.rect = inverted; + iEvent.deltaRect = delta; +}); + +/*\ + * Interactable.resizable + [ method ] + * + * Gets or sets whether resize actions can be performed on the + * Interactable + * + = (boolean) Indicates if this can be the target of resize elements + | var isResizeable = interact('input[type=text]').resizable(); + * or + - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable) + = (object) This Interactable + | interact(element).resizable({ + | onstart: function (event) {}, + | onmove : function (event) {}, + | onend : function (event) {}, + | + | edges: { + | top : true, // Use pointer coords to check for resize. + | left : false, // Disable resizing from left edge. + | bottom: '.resize-s',// Resize if pointer target matches selector + | right : handleEl // Resize if pointer target is the given Element + | }, + | + | // Width and height can be adjusted independently. When `true`, width and + | // height are adjusted at a 1:1 ratio. + | square: false, + | + | // Width and height can be adjusted independently. When `true`, width and + | // height maintain the aspect ratio they had when resizing started. + | preserveAspectRatio: false, + | + | // a value of 'none' will limit the resize rect to a minimum of 0x0 + | // 'negate' will allow the rect to have negative width/height + | // 'reposition' will keep the width/height positive by swapping + | // the top and bottom edges and/or swapping the left and right edges + | invert: 'none' || 'negate' || 'reposition' + | + | // limit multiple resizes. + | // See the explanation in the @Interactable.draggable example + | max: Infinity, + | maxPerElement: 1, + | }); + \*/ +Interactable.prototype.resizable = function (options) { + if (utils.is.object(options)) { + this.options.resize.enabled = options.enabled === false ? false : true; + this.setPerAction('resize', options); + this.setOnEvents('resize', options); + + if (/^x$|^y$|^xy$/.test(options.axis)) { + this.options.resize.axis = options.axis; + } else if (options.axis === null) { + this.options.resize.axis = defaultOptions.resize.axis; + } + + if (utils.is.bool(options.preserveAspectRatio)) { + this.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (utils.is.bool(options.square)) { + this.options.resize.square = options.square; + } + + return this; + } + if (utils.is.bool(options)) { + this.options.resize.enabled = options; + + if (!options) { + this.onresizestart = this.onresizestart = this.onresizeend = null; + } + + return this; + } + return this.options.resize; +}; + +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } + + // true value, use pointer coords and element rect + if (value === true) { + // if dimensions are negative, "switch" edges + var width = utils.is.number(rect.width) ? rect.width : rect.right - rect.left; + var height = utils.is.number(rect.height) ? rect.height : rect.bottom - rect.top; + + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } + + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } + + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } + + // the remaining checks require an element + if (!utils.is.element(element)) { + return false; + } + + return utils.is.element(value) + // the value is an element to use as a resize handle + ? value === element + // otherwise check if element matches value as selector + : utils.matchesUpTo(element, value, interactableElement); +} + +Interaction.signals.on('new', function (interaction) { + interaction.resizeAxes = 'xy'; +}); + +InteractEvent.signals.on('set-delta', function (_ref3) { + var interaction = _ref3.interaction, + iEvent = _ref3.iEvent, + action = _ref3.action; + + if (action !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.target.options; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + iEvent.dx = iEvent.dy; + } else { + iEvent.dy = iEvent.dx; + } + iEvent.axes = 'xy'; + } else { + iEvent.axes = interaction.resizeAxes; + + if (interaction.resizeAxes === 'x') { + iEvent.dy = 0; + } else if (interaction.resizeAxes === 'y') { + iEvent.dx = 0; + } + } +}); + +actions.resize = resize; +actions.names.push('resize'); +utils.merge(Interactable.eventTypes, ['resizestart', 'resizemove', 'resizeinertiastart', 'resizeinertiaresume', 'resizeend']); +actions.methodDict.resize = 'resizable'; + +defaultOptions.resize = resize.defaults; + +module.exports = resize; + +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(require,module,exports){ +'use strict'; + +var raf = require('./utils/raf'); +var getWindow = require('./utils/window').getWindow; +var is = require('./utils/is'); +var domUtils = require('./utils/domUtils'); +var Interaction = require('./Interaction'); +var defaultOptions = require('./defaultOptions'); + +var autoScroll = { + defaults: { + enabled: false, + container: null, // the item that is scrolled (Window or HTMLElement) + margin: 60, + speed: 300 }, + + interaction: null, + i: null, // the handle returned by window.setInterval + x: 0, y: 0, // Direction each pulse is to scroll in + + isScrolling: false, + prevTime: 0, + + start: function start(interaction) { + autoScroll.isScrolling = true; + raf.cancel(autoScroll.i); + + autoScroll.interaction = interaction; + autoScroll.prevTime = new Date().getTime(); + autoScroll.i = raf.request(autoScroll.scroll); + }, + + stop: function stop() { + autoScroll.isScrolling = false; + raf.cancel(autoScroll.i); + }, + + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll; + var container = options.container || getWindow(autoScroll.interaction.element); + var now = new Date().getTime(); + // change in time in seconds + var dt = (now - autoScroll.prevTime) / 1000; + // displacement + var s = options.speed * dt; + + if (s >= 1) { + if (is.window(container)) { + container.scrollBy(autoScroll.x * s, autoScroll.y * s); + } else if (container) { + container.scrollLeft += autoScroll.x * s; + container.scrollTop += autoScroll.y * s; + } + + autoScroll.prevTime = now; + } + + if (autoScroll.isScrolling) { + raf.cancel(autoScroll.i); + autoScroll.i = raf.request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.target, interaction.prepared.name))) { + return; + } + + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } + + var top = void 0; + var right = void 0; + var bottom = void 0; + var left = void 0; + + var options = interaction.target.options[interaction.prepared.name].autoScroll; + var container = options.container || getWindow(interaction.element); + + if (is.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = domUtils.getElementClientRect(container); + + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } + + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; + + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + + autoScroll.start(interaction); + } + } +}; + +Interaction.signals.on('stop-active', function () { + autoScroll.stop(); +}); + +Interaction.signals.on('action-move', autoScroll.onInteractionMove); + +defaultOptions.perAction.autoScroll = autoScroll.defaults; + +module.exports = autoScroll; + +},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(require,module,exports){ +'use strict'; + +var Interactable = require('../Interactable'); +var actions = require('../actions/base'); +var is = require('../utils/is'); +var domUtils = require('../utils/domUtils'); + +Interactable.prototype.getAction = function (pointer, event, interaction, element) { + var action = this.defaultActionChecker(pointer, event, interaction, element); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; +}; + +/*\ + * Interactable.ignoreFrom + [ method ] + * + * If the target of the `mousedown`, `pointerdown` or `touchstart` + * event or any of it's parents match the given CSS selector or + * Element, no drag/resize/gesture is started. + * + - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements + = (string | Element | object) The current ignoreFrom value or this Interactable + ** + | interact(element, { ignoreFrom: document.getElementById('no-action') }); + | // or + | interact(element).ignoreFrom('input, textarea, a'); +\*/ +Interactable.prototype.ignoreFrom = function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); +}; + +/*\ + * Interactable.allowFrom + [ method ] + * + * A drag/resize/gesture is started only If the target of the + * `mousedown`, `pointerdown` or `touchstart` event or any of it's + * parents match the given CSS selector or Element. + * + - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element + = (string | Element | object) The current allowFrom value or this Interactable + ** + | interact(element, { allowFrom: document.getElementById('drag-handle') }); + | // or + | interact(element).allowFrom('.handle'); +\*/ +Interactable.prototype.allowFrom = function (newValue) { + return this._backCompatOption('allowFrom', newValue); +}; + +Interactable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) { + if (!ignoreFrom || !is.element(element)) { + return false; + } + + if (is.string(ignoreFrom)) { + return domUtils.matchesUpTo(element, ignoreFrom, interactableElement); + } else if (is.element(ignoreFrom)) { + return domUtils.nodeContains(ignoreFrom, element); + } + + return false; +}; + +Interactable.prototype.testAllow = function (allowFrom, interactableElement, element) { + if (!allowFrom) { + return true; + } + + if (!is.element(element)) { + return false; + } + + if (is.string(allowFrom)) { + return domUtils.matchesUpTo(element, allowFrom, interactableElement); + } else if (is.element(allowFrom)) { + return domUtils.nodeContains(allowFrom, element); + } + + return false; +}; + +Interactable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) { + return !this.testIgnore(options.ignoreFrom, interactableElement, eventTarget) && this.testAllow(options.allowFrom, interactableElement, eventTarget); +}; + +/*\ + * Interactable.actionChecker + [ method ] + * + * Gets or sets the function used to check action to be performed on + * pointerDown + * + - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props. + = (Function | Interactable) The checker function or this Interactable + * + | interact('.resize-drag') + | .resizable(true) + | .draggable(true) + | .actionChecker(function (pointer, event, action, interactable, element, interaction) { + | + | if (interact.matchesSelector(event.target, '.drag-handle') { + | // force drag with handle target + | action.name = drag; + | } + | else { + | // resize from the top and right edges + | action.name = 'resize'; + | action.edges = { top: true, right: true }; + | } + | + | return action; + | }); +\*/ +Interactable.prototype.actionChecker = function (checker) { + if (is.function(checker)) { + this.options.actionChecker = checker; + + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + + return this; + } + + return this.options.actionChecker; +}; + +/*\ + * Interactable.styleCursor + [ method ] + * + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + - newValue (boolean) #optional + = (boolean | Interactable) The current setting or this Interactable +\*/ +Interactable.prototype.styleCursor = function (newValue) { + if (is.bool(newValue)) { + this.options.styleCursor = newValue; + + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + + return this; + } + + return this.options.styleCursor; +}; + +Interactable.prototype.defaultActionChecker = function (pointer, event, interaction, element) { + var rect = this.getRect(element); + var action = null; + + for (var _iterator = actions.names, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var actionName = _ref; + + // check mouseButton setting if the pointer is down + if (interaction.pointerIsDown && interaction.mouse && (event.buttons & this.options[actionName].mouseButtons) === 0) { + continue; + } + + action = actions[actionName].checker(pointer, event, this, element, interaction, rect); + + if (action) { + return action; + } + } +}; + +},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(require,module,exports){ +'use strict'; + +var interact = require('../interact'); +var Interactable = require('../Interactable'); +var Interaction = require('../Interaction'); +var actions = require('../actions/base'); +var defaultOptions = require('../defaultOptions'); +var browser = require('../utils/browser'); +var scope = require('../scope'); +var utils = require('../utils'); +var signals = require('../utils/Signals').new(); + +require('./InteractableMethods'); + +var autoStart = { + signals: signals, + withinInteractionLimit: withinInteractionLimit, + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + defaults: { + perAction: { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null + } + }, + setActionDefaults: function setActionDefaults(action) { + utils.extend(action.defaults, autoStart.defaults.perAction); + } +}; + +// set cursor style on mousedown +Interaction.signals.on('down', function (_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; + + if (interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget); + prepare(interaction, actionInfo); +}); + +// set cursor style on mousemove +Interaction.signals.on('move', function (_ref2) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; + + if (!interaction.mouse || interaction.pointerIsDown || interaction.interacting()) { + return; + } + + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget); + prepare(interaction, actionInfo); +}); + +Interaction.signals.on('move', function (arg) { + var interaction = arg.interaction, + event = arg.event; + + + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } + + signals.fire('before-start', arg); + + var target = interaction.target; + + if (interaction.prepared.name && target) { + // check manualStart and interaction limit + if (target.options[interaction.prepared.name].manualStart || !withinInteractionLimit(target, interaction.element, interaction.prepared)) { + interaction.stop(event); + } else { + interaction.start(interaction.prepared, target, interaction.element); + } + } +}); + +// Check if the current target supports the action. +// If so, return the validated action. Otherwise, return null +function validateAction(action, interactable, element, eventTarget) { + if (utils.is.object(action) && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action)) { + return action; + } + + return null; +} + +function validateSelector(interaction, pointer, event, matches, matchElements, eventTarget) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var action = validateAction(match.getAction(pointer, event, interaction, matchElement), match, matchElement, eventTarget); + + if (action) { + return { + action: action, + target: match, + element: matchElement + }; + } + } + + return {}; +} + +function getActionInfo(interaction, pointer, event, eventTarget) { + var matches = []; + var matchElements = []; + + var element = eventTarget; + var action = null; + + function pushMatches(interactable, selector, context) { + var elements = browser.useMatchesSelectorPolyfill ? context.querySelectorAll(selector) : undefined; + + if (utils.matchesSelector(element, selector, elements)) { + + matches.push(interactable); + matchElements.push(element); + } + } + + while (utils.is.element(element)) { + matches = []; + matchElements = []; + + var elementInteractable = scope.interactables.get(element); + + if (elementInteractable && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget), elementInteractable, element, eventTarget)) && !elementInteractable.options[action.name].manualStart) { + return { + element: element, + action: action, + target: elementInteractable + }; + } else { + scope.interactables.forEachSelector(pushMatches, element); + + var actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget); + + if (actionInfo.action && !actionInfo.target.options[actionInfo.action.name].manualStart) { + return actionInfo; + } + } + + element = utils.parentNode(element); + } + + return {}; +} + +function prepare(interaction, _ref3) { + var action = _ref3.action, + target = _ref3.target, + element = _ref3.element; + + action = action || {}; + + if (interaction.target && interaction.target.options.styleCursor) { + interaction.target._doc.documentElement.style.cursor = ''; + } + + interaction.target = target; + interaction.element = element; + utils.copyAction(interaction.prepared, action); + + if (target && target.options.styleCursor) { + var cursor = action ? actions[action.name].getCursor(action) : ''; + interaction.target._doc.documentElement.style.cursor = cursor; + } + + signals.fire('prepared', { interaction: interaction }); +} + +Interaction.signals.on('stop', function (_ref4) { + var interaction = _ref4.interaction; + + var target = interaction.target; + + if (target && target.options.styleCursor) { + target._doc.documentElement.style.cursor = ''; + } +}); + +Interactable.prototype.getAction = function (pointer, event, interaction, element) { + var action = this.defaultActionChecker(pointer, event, interaction, element); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; +}; + +/*\ + * Interactable.actionChecker + [ method ] + * + * Gets or sets the function used to check action to be performed on + * pointerDown + * + - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props. + = (Function | Interactable) The checker function or this Interactable + * + | interact('.resize-drag') + | .resizable(true) + | .draggable(true) + | .actionChecker(function (pointer, event, action, interactable, element, interaction) { + | + | if (interact.matchesSelector(event.target, '.drag-handle') { + | // force drag with handle target + | action.name = drag; + | } + | else { + | // resize from the top and right edges + | action.name = 'resize'; + | action.edges = { top: true, right: true }; + | } + | + | return action; + | }); +\*/ +Interactable.prototype.actionChecker = function (checker) { + if (utils.is.function(checker)) { + this.options.actionChecker = checker; + + return this; + } + + if (checker === null) { + delete this.options.actionChecker; + + return this; + } + + return this.options.actionChecker; +}; + +/*\ + * Interactable.styleCursor + [ method ] + * + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + - newValue (boolean) #optional + = (boolean | Interactable) The current setting or this Interactable +\*/ +Interactable.prototype.styleCursor = function (newValue) { + if (utils.is.bool(newValue)) { + this.options.styleCursor = newValue; + + return this; + } + + if (newValue === null) { + delete this.options.styleCursor; + + return this; + } + + return this.options.styleCursor; +}; + +Interactable.prototype.defaultActionChecker = function (pointer, event, interaction, element) { + var rect = this.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var action = null; + + for (var _iterator = actions.names, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref5; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref5 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref5 = _i.value; + } + + var actionName = _ref5; + + // check mouseButton setting if the pointer is down + if (interaction.pointerIsDown && interaction.mouse && (buttons & this.options[actionName].mouseButtons) === 0) { + continue; + } + + action = actions[actionName].checker(pointer, event, this, element, interaction, rect); + + if (action) { + return action; + } + } +}; + +function withinInteractionLimit(interactable, element, action) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var activeInteractions = 0; + var targetCount = 0; + var targetElementCount = 0; + + // no actions if any of these values == 0 + if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { + return; + } + + for (var i = 0, len = scope.interactions.length; i < len; i++) { + var interaction = scope.interactions[i]; + var otherAction = interaction.prepared.name; + + if (!interaction.interacting()) { + continue; + } + + activeInteractions++; + + if (activeInteractions >= autoStart.maxInteractions) { + return false; + } + + if (interaction.target !== interactable) { + continue; + } + + targetCount += otherAction === action.name | 0; + + if (targetCount >= maxActions) { + return false; + } + + if (interaction.element === element) { + targetElementCount++; + + if (otherAction !== action.name || targetElementCount >= maxPerElement) { + return false; + } + } + } + + return autoStart.maxInteractions > 0; +} + +/*\ + * interact.maxInteractions + [ method ] + ** + * Returns or sets the maximum number of concurrent interactions allowed. + * By default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables + * and elements, you need to enable it in the draggable, resizable and + * gesturable `'max'` and `'maxPerElement'` options. + ** + - newValue (number) #optional Any number. newValue <= 0 means no interactions. +\*/ +interact.maxInteractions = function (newValue) { + if (utils.is.number(newValue)) { + autoStart.maxInteractions = newValue; + + return this; + } + + return autoStart.maxInteractions; +}; + +Interactable.settingsMethods.push('styleCursor'); +Interactable.settingsMethods.push('actionChecker'); +Interactable.settingsMethods.push('ignoreFrom'); +Interactable.settingsMethods.push('allowFrom'); + +defaultOptions.base.actionChecker = null; +defaultOptions.base.styleCursor = true; + +utils.extend(defaultOptions.perAction, autoStart.defaults.perAction); + +module.exports = autoStart; + +},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(require,module,exports){ +'use strict'; + +var autoStart = require('./base'); +var Interaction = require('../Interaction'); + +Interaction.signals.on('new', function (interaction) { + interaction.delayTimer = null; +}); + +autoStart.signals.on('prepared', function (_ref) { + var interaction = _ref.interaction; + + var actionName = interaction.prepared.name; + + if (!actionName) { + return; + } + + var delay = interaction.target.options[actionName].delay; + + if (delay > 0) { + interaction.delayTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.target, interaction.element); + }, delay); + } +}); + +Interaction.signals.on('move', function (_ref2) { + var interaction = _ref2.interaction, + duplicate = _ref2.duplicate; + + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.delayTimer); + } +}); + +// prevent regular down->move autoStart +autoStart.signals.on('before-start', function (_ref3) { + var interaction = _ref3.interaction; + + var actionName = interaction.prepared.name; + + if (!actionName) { + return; + } + + var delay = interaction.target.options[actionName].delay; + + if (delay > 0) { + interaction.prepared.name = null; + } +}); + +},{"../Interaction":5,"./base":13}],15:[function(require,module,exports){ +'use strict'; + +var autoStart = require('./base'); +var scope = require('../scope'); +var browser = require('../utils/browser'); +var is = require('../utils/is'); + +var _require = require('../utils/domUtils'), + matchesSelector = _require.matchesSelector, + parentNode = _require.parentNode; + +autoStart.setActionDefaults(require('../actions/drag')); + +autoStart.signals.on('before-start', function (_ref) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; + + if (interaction.prepared.name !== 'drag') { + return; + } + + // check if a drag is in the correct axis + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var options = interaction.target.options.drag; + var startAxis = options.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + + interaction.prepared.axis = options.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : options.lockAxis; + + // if the movement isn't in the startAxis of the interactable + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; + + // then try to get a drag from another ineractable + + if (!interaction.prepared.name) { + + var element = eventTarget; + + var getDraggable = function getDraggable(interactable, selector, context) { + var elements = browser.useMatchesSelectorPolyfill ? context.querySelectorAll(selector) : undefined; + + if (interactable === interaction.target) { + return; + } + + if (!options.manualStart && !interactable.testIgnoreAllow(options, element, eventTarget) && matchesSelector(element, selector, elements)) { + + var _action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + + if (_action && _action.name === 'drag' && checkStartAxis(currentAxis, interactable) && autoStart.validateAction(_action, interactable, element, eventTarget)) { + + return interactable; + } + } + }; + + var action = null; + + // check all interactables + while (is.element(element)) { + var elementInteractable = scope.interactables.get(element); + + if (elementInteractable && elementInteractable !== interaction.target && !elementInteractable.options.drag.manualStart) { + + action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); + } + if (action && action.name === 'drag' && checkStartAxis(currentAxis, elementInteractable)) { + + interaction.prepared.name = 'drag'; + interaction.target = elementInteractable; + interaction.element = element; + break; + } + + var selectorInteractable = scope.interactables.forEachSelector(getDraggable, element); + + if (selectorInteractable) { + interaction.prepared.name = 'drag'; + interaction.target = selectorInteractable; + interaction.element = element; + break; + } + + element = parentNode(element); + } + } + } +}); + +function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } + + var thisAxis = interactable.options.drag.startAxis; + + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; +} + +},{"../actions/drag":7,"../scope":34,"../utils/browser":37,"../utils/domUtils":39,"../utils/is":46,"./base":13}],16:[function(require,module,exports){ +'use strict'; + +require('./base').setActionDefaults(require('../actions/gesture')); + +},{"../actions/gesture":9,"./base":13}],17:[function(require,module,exports){ +'use strict'; + +require('./base').setActionDefaults(require('../actions/resize')); + +},{"../actions/resize":10,"./base":13}],18:[function(require,module,exports){ +'use strict'; + +module.exports = { + base: { + accept: null, + preventDefault: 'auto', + deltaSource: 'page' + }, + + perAction: { + origin: { x: 0, y: 0 }, + + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1, + + inertia: { + enabled: false, + resistance: 10, // the lambda in exponential decay + minSpeed: 100, // target speed must be above this for inertia to start + endSpeed: 10, // the speed at which inertia is slow enough to stop + allowResume: true, // allow resuming an action in inertia phase + smoothEndDuration: 300 } + } +}; + +},{}],19:[function(require,module,exports){ +'use strict'; + +/* browser entry point */ + +// Legacy browser support +require('./legacyBrowsers'); + +// inertia +require('./inertia'); + +// modifiers +require('./modifiers/snap'); +require('./modifiers/restrict'); + +// pointerEvents +require('./pointerEvents/base'); +require('./pointerEvents/holdRepeat'); +require('./pointerEvents/interactableTargets'); + +// delay +require('./autoStart/delay'); + +// actions +require('./actions/gesture'); +require('./actions/resize'); +require('./actions/drag'); +require('./actions/drop'); + +// load these modifiers after resize is loaded +require('./modifiers/snapSize'); +require('./modifiers/restrictEdges'); +require('./modifiers/restrictSize'); + +// autoStart actions +require('./autoStart/gesture'); +require('./autoStart/resize'); +require('./autoStart/drag'); + +// Interactable preventDefault setting +require('./interactablePreventDefault.js'); + +// autoScroll +require('./autoScroll'); + +// export interact +module.exports = require('./interact'); + +},{"./actions/drag":7,"./actions/drop":8,"./actions/gesture":9,"./actions/resize":10,"./autoScroll":11,"./autoStart/delay":14,"./autoStart/drag":15,"./autoStart/gesture":16,"./autoStart/resize":17,"./inertia":20,"./interact":21,"./interactablePreventDefault.js":22,"./legacyBrowsers":23,"./modifiers/restrict":25,"./modifiers/restrictEdges":26,"./modifiers/restrictSize":27,"./modifiers/snap":28,"./modifiers/snapSize":29,"./pointerEvents/base":31,"./pointerEvents/holdRepeat":32,"./pointerEvents/interactableTargets":33}],20:[function(require,module,exports){ +'use strict'; + +var InteractEvent = require('./InteractEvent'); +var Interaction = require('./Interaction'); +var modifiers = require('./modifiers'); +var utils = require('./utils'); +var animationFrame = require('./utils/raf'); + +Interaction.signals.on('new', function (interaction) { + interaction.inertiaStatus = { + active: false, + smoothEnd: false, + allowResume: false, + + startEvent: null, + upCoords: {}, + + xe: 0, ye: 0, + sx: 0, sy: 0, + + t0: 0, + vx0: 0, vys: 0, + duration: 0, + + lambda_v0: 0, + one_ve_v0: 0, + i: null + }; + + interaction.boundInertiaFrame = function () { + return inertiaFrame.apply(interaction); + }; + interaction.boundSmoothEndFrame = function () { + return smoothEndFrame.apply(interaction); + }; +}); + +Interaction.signals.on('down', function (_ref) { + var interaction = _ref.interaction, + event = _ref.event, + pointer = _ref.pointer, + eventTarget = _ref.eventTarget; + + var status = interaction.inertiaStatus; + + // Check if the down event hits the current inertia target + if (status.active) { + var element = eventTarget; + + // climb up the DOM tree from the event target + while (utils.is.element(element)) { + + // if interaction element is the current inertia target element + if (element === interaction.element) { + // stop inertia + animationFrame.cancel(status.i); + status.active = false; + interaction.simulation = null; + + // update pointers to the down event's coordinates + interaction.updatePointer(pointer); + utils.setCoords(interaction.curCoords, interaction.pointers); + + // fire appropriate signals + var signalArg = { interaction: interaction }; + Interaction.signals.fire('before-action-move', signalArg); + Interaction.signals.fire('action-resume', signalArg); + + // fire a reume event + var resumeEvent = new InteractEvent(interaction, event, interaction.prepared.name, 'inertiaresume', interaction.element); + + interaction.target.fire(resumeEvent); + interaction.prevEvent = resumeEvent; + modifiers.resetStatuses(interaction.modifierStatuses); + + utils.copyCoords(interaction.prevCoords, interaction.curCoords); + break; + } + + element = utils.parentNode(element); + } + } +}); + +Interaction.signals.on('up', function (_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event; + + var status = interaction.inertiaStatus; + + if (!interaction.interacting() || status.active) { + return; + } + + var target = interaction.target; + var options = target && target.options; + var inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia; + + var now = new Date().getTime(); + var statuses = {}; + var page = utils.extend({}, interaction.curCoords.page); + var pointerSpeed = interaction.pointerDelta.client.speed; + var inertiaPossible = false; + var inertia = false; + var smoothEnd = false; + var modifierResult = void 0; + + // check if inertia should be started + inertiaPossible = inertiaOptions && inertiaOptions.enabled && interaction.prepared.name !== 'gesture' && event !== status.startEvent; + + inertia = inertiaPossible && now - interaction.curCoords.timeStamp < 50 && pointerSpeed > inertiaOptions.minSpeed && pointerSpeed > inertiaOptions.endSpeed; + + var modifierArg = { + interaction: interaction, + page: page, + statuses: statuses, + preEnd: true, + requireEndOnly: true + }; + + // smoothEnd + if (inertiaPossible && !inertia) { + modifiers.resetStatuses(statuses); + + modifierResult = modifiers.setAll(modifierArg); + + if (modifierResult.shouldMove && modifierResult.locked) { + smoothEnd = true; + } + } + + if (!(inertia || smoothEnd)) { + return; + } + + utils.copyCoords(status.upCoords, interaction.curCoords); + + interaction.pointers[0] = status.startEvent = new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element); + + status.t0 = now; + + status.active = true; + status.allowResume = inertiaOptions.allowResume; + interaction.simulation = status; + + target.fire(status.startEvent); + + if (inertia) { + status.vx0 = interaction.pointerDelta.client.vx; + status.vy0 = interaction.pointerDelta.client.vy; + status.v0 = pointerSpeed; + + calcInertia(interaction, status); + + utils.extend(page, interaction.curCoords.page); + + page.x += status.xe; + page.y += status.ye; + + modifiers.resetStatuses(statuses); + + modifierResult = modifiers.setAll(modifierArg); + + status.modifiedXe += modifierResult.dx; + status.modifiedYe += modifierResult.dy; + + status.i = animationFrame.request(interaction.boundInertiaFrame); + } else { + status.smoothEnd = true; + status.xe = modifierResult.dx; + status.ye = modifierResult.dy; + + status.sx = status.sy = 0; + + status.i = animationFrame.request(interaction.boundSmoothEndFrame); + } +}); + +Interaction.signals.on('stop-active', function (_ref3) { + var interaction = _ref3.interaction; + + var status = interaction.inertiaStatus; + + if (status.active) { + animationFrame.cancel(status.i); + status.active = false; + interaction.simulation = null; + } +}); + +function calcInertia(interaction, status) { + var inertiaOptions = interaction.target.options[interaction.prepared.name].inertia; + var lambda = inertiaOptions.resistance; + var inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda; + + status.x0 = interaction.prevEvent.pageX; + status.y0 = interaction.prevEvent.pageY; + status.t0 = status.startEvent.timeStamp / 1000; + status.sx = status.sy = 0; + + status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda; + status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda; + status.te = inertiaDur; + + status.lambda_v0 = lambda / status.v0; + status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0; +} + +function inertiaFrame() { + updateInertiaCoords(this); + utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords); + + var status = this.inertiaStatus; + var options = this.target.options[this.prepared.name].inertia; + var lambda = options.resistance; + var t = new Date().getTime() / 1000 - status.t0; + + if (t < status.te) { + + var progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0; + + if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) { + status.sx = status.xe * progress; + status.sy = status.ye * progress; + } else { + var quadPoint = utils.getQuadraticCurvePoint(0, 0, status.xe, status.ye, status.modifiedXe, status.modifiedYe, progress); + + status.sx = quadPoint.x; + status.sy = quadPoint.y; + } + + this.doMove(); + + status.i = animationFrame.request(this.boundInertiaFrame); + } else { + status.sx = status.modifiedXe; + status.sy = status.modifiedYe; + + this.doMove(); + this.end(status.startEvent); + status.active = false; + this.simulation = null; + } + + utils.copyCoords(this.prevCoords, this.curCoords); +} + +function smoothEndFrame() { + updateInertiaCoords(this); + + var status = this.inertiaStatus; + var t = new Date().getTime() - status.t0; + var duration = this.target.options[this.prepared.name].inertia.smoothEndDuration; + + if (t < duration) { + status.sx = utils.easeOutQuad(t, 0, status.xe, duration); + status.sy = utils.easeOutQuad(t, 0, status.ye, duration); + + this.pointerMove(status.startEvent, status.startEvent); + + status.i = animationFrame.request(this.boundSmoothEndFrame); + } else { + status.sx = status.xe; + status.sy = status.ye; + + this.pointerMove(status.startEvent, status.startEvent); + this.end(status.startEvent); + + status.smoothEnd = status.active = false; + this.simulation = null; + } +} + +function updateInertiaCoords(interaction) { + var status = interaction.inertiaStatus; + + // return if inertia isn't running + if (!status.active) { + return; + } + + var pageUp = status.upCoords.page; + var clientUp = status.upCoords.client; + + utils.setCoords(interaction.curCoords, [{ + pageX: pageUp.x + status.sx, + pageY: pageUp.y + status.sy, + clientX: clientUp.x + status.sx, + clientY: clientUp.y + status.sy + }]); +} + +},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(require,module,exports){ +'use strict'; + +var browser = require('./utils/browser'); +var events = require('./utils/events'); +var utils = require('./utils'); +var scope = require('./scope'); +var Interactable = require('./Interactable'); +var Interaction = require('./Interaction'); + +var globalEvents = {}; + +/*\ + * interact + [ method ] + * + * The methods of this variable can be used to set elements as + * interactables and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to + * configure it. + * + - element (Element | string) The HTML or SVG Element to interact with or CSS selector + = (object) An @Interactable + * + > Usage + | interact('#draggable').draggable(true); + | + | var rectables = interact('rect'); + | rectables + | .gesturable(true) + | .on('gesturemove', function (event) { + | // ... + | }); +\*/ +function interact(element, options) { + var interactable = scope.interactables.get(element, options); + + if (!interactable) { + interactable = new Interactable(element, options); + interactable.events.global = globalEvents; + } + + return interactable; +} + +/*\ + * interact.isSet + [ method ] + * + * Check if an element has been set + - element (Element) The Element being searched for + = (boolean) Indicates if the element or CSS selector was previously passed to interact +\*/ +interact.isSet = function (element, options) { + return scope.interactables.indexOfElement(element, options && options.context) !== -1; +}; + +/*\ + * interact.on + [ method ] + * + * Adds a global listener for an InteractEvent or adds a DOM event to + * `document` + * + - type (string | array | object) The types of events to listen for + - listener (function) The function event (s) + - useCapture (boolean) #optional useCapture flag for addEventListener + = (object) interact +\*/ +interact.on = function (type, listener, useCapture) { + if (utils.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (utils.is.array(type)) { + for (var _iterator = type, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var eventType = _ref; + + interact.on(eventType, listener, useCapture); + } + + return interact; + } + + if (utils.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); + } + + return interact; + } + + // if it is an InteractEvent type, add listener to globalEvents + if (utils.contains(Interactable.eventTypes, type)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } + // If non InteractEvent type, addEventListener to document + else { + events.add(scope.document, type, listener, useCapture); + } + + return interact; +}; + +/*\ + * interact.off + [ method ] + * + * Removes a global InteractEvent listener or DOM event from `document` + * + - type (string | array | object) The types of events that were listened for + - listener (function) The listener function to be removed + - useCapture (boolean) #optional useCapture flag for removeEventListener + = (object) interact + \*/ +interact.off = function (type, listener, useCapture) { + if (utils.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (utils.is.array(type)) { + for (var _iterator2 = type, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var eventType = _ref2; + + interact.off(eventType, listener, useCapture); + } + + return interact; + } + + if (utils.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } + + return interact; + } + + if (!utils.contains(Interactable.eventTypes, type)) { + events.remove(scope.document, type, listener, useCapture); + } else { + var index = void 0; + + if (type in globalEvents && (index = utils.indexOf(globalEvents[type], listener)) !== -1) { + globalEvents[type].splice(index, 1); + } + } + + return interact; +}; + +/*\ + * interact.debug + [ method ] + * + * Returns an object which exposes internal data + = (object) An object with properties that outline the current state and expose internal functions and variables +\*/ +interact.debug = function () { + return scope; +}; + +// expose the functions used to calculate multi-touch properties +interact.getPointerAverage = utils.pointerAverage; +interact.getTouchBBox = utils.touchBBox; +interact.getTouchDistance = utils.touchDistance; +interact.getTouchAngle = utils.touchAngle; + +interact.getElementRect = utils.getElementRect; +interact.getElementClientRect = utils.getElementClientRect; +interact.matchesSelector = utils.matchesSelector; +interact.closest = utils.closest; + +/*\ + * interact.supportsTouch + [ method ] + * + = (boolean) Whether or not the browser supports touch input +\*/ +interact.supportsTouch = function () { + return browser.supportsTouch; +}; + +/*\ + * interact.supportsPointerEvent + [ method ] + * + = (boolean) Whether or not the browser supports PointerEvents +\*/ +interact.supportsPointerEvent = function () { + return browser.supportsPointerEvent; +}; + +/*\ + * interact.stop + [ method ] + * + * Cancels all interactions (end events are not fired) + * + - event (Event) An event on which to call preventDefault() + = (object) interact +\*/ +interact.stop = function (event) { + for (var i = scope.interactions.length - 1; i >= 0; i--) { + scope.interactions[i].stop(event); + } + + return interact; +}; + +/*\ + * interact.pointerMoveTolerance + [ method ] + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + - newValue (number) #optional The movement from the start position must be greater than this value + = (number | Interactable) The current setting or interact +\*/ +interact.pointerMoveTolerance = function (newValue) { + if (utils.is.number(newValue)) { + Interaction.pointerMoveTolerance = newValue; + + return this; + } + + return Interaction.pointerMoveTolerance; +}; + +interact.addDocument = scope.addDocument; +interact.removeDocument = scope.removeDocument; + +scope.interact = interact; + +module.exports = interact; + +},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(require,module,exports){ +'use strict'; + +var Interactable = require('./Interactable'); +var Interaction = require('./Interaction'); +var scope = require('./scope'); +var is = require('./utils/is'); + +var _require = require('./utils/domUtils'), + nodeContains = _require.nodeContains, + matchesSelector = _require.matchesSelector; + +/*\ + * Interactable.preventDefault + [ method ] + * + * Returns or sets whether to prevent the browser's default behaviour + * in response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + - newValue (string) #optional `true`, `false` or `'auto'` + = (string | Interactable) The current setting or this Interactable +\*/ + + +Interactable.prototype.preventDefault = function (newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (is.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +}; + +Interactable.prototype.checkAndPreventDefault = function (event) { + var setting = this.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } + + // setting === 'auto' + + // don't preventDefault of pointerdown events + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } + + // don't preventDefault on editable elements + if (matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +}; + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.target) { + interaction.target.checkAndPreventDefault(event); + } +} + +var _arr = ['down', 'move', 'up', 'cancel']; +for (var _i = 0; _i < _arr.length; _i++) { + var eventSignal = _arr[_i]; + Interaction.signals.on(eventSignal, onInteractionEvent); +} + +// prevent native HTML5 drag on interact.js target elements +Interaction.docEvents.dragstart = function preventNativeDrag(event) { + for (var _iterator = scope.interactions, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref2; + + if (_isArray) { + if (_i2 >= _iterator.length) break; + _ref2 = _iterator[_i2++]; + } else { + _i2 = _iterator.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var interaction = _ref2; + + + if (interaction.element && (interaction.element === event.target || nodeContains(interaction.element, event.target))) { + + interaction.target.checkAndPreventDefault(event); + return; + } + } +}; + +},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/is":46}],23:[function(require,module,exports){ +'use strict'; + +var scope = require('./scope'); +var events = require('./utils/events'); +var browser = require('./utils/browser'); +var iFinder = require('./utils/interactionFinder'); +var pointerEvents = require('./pointerEvents/base'); + +var _require = require('./utils/window'), + window = _require.window; + +var toString = Object.prototype.toString; + +if (!window.Array.isArray) { + window.Array.isArray = function (obj) { + return toString.call(obj) === '[object Array]'; + }; +} + +if (!String.prototype.trim) { + String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; +} + +// http://www.quirksmode.org/dom/events/click.html +// >Events leading to dblclick +// +// IE8 doesn't fire down event before dblclick. +// This workaround tries to fire a tap and doubletap after dblclick +function onIE8Dblclick(event) { + var eventTarget = event.target; + var interaction = iFinder.search(event, event.type, eventTarget); + + if (!interaction) { + return; + } + + if (interaction.prevTap && event.clientX === interaction.prevTap.clientX && event.clientY === interaction.prevTap.clientY && eventTarget === interaction.prevTap.target) { + + interaction.downTargets[0] = eventTarget; + interaction.downTimes[0] = new Date().getTime(); + + pointerEvents.fire({ + interaction: interaction, + event: event, + eventTarget: eventTarget, + pointer: event, + type: 'tap' + }); + } +} + +if (browser.isIE8) { + var selectFix = function selectFix(event) { + for (var _iterator = scope.interactions, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var interaction = _ref; + + if (interaction.interacting()) { + interaction.target.checkAndPreventDefault(event); + } + } + }; + + var onDocIE8 = function onDocIE8(_ref2, signalName) { + var doc = _ref2.doc, + win = _ref2.win; + + var eventMethod = signalName.indexOf('listen') === 0 ? events.add : events.remove; + + // For IE's lack of Event#preventDefault + eventMethod(doc, 'selectstart', selectFix); + + if (pointerEvents) { + eventMethod(doc, 'dblclick', onIE8Dblclick); + } + }; + + scope.signals.on('add-document', onDocIE8); + scope.signals.on('remove-document', onDocIE8); +} + +module.exports = null; + +},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(require,module,exports){ +'use strict'; + +var InteractEvent = require('../InteractEvent'); +var Interaction = require('../Interaction'); +var extend = require('../utils/extend'); + +var modifiers = { + names: [], + + setOffsets: function setOffsets(arg) { + var interaction = arg.interaction, + page = arg.pageCoords; + var target = interaction.target, + element = interaction.element, + startOffset = interaction.startOffset; + + var rect = target.getRect(element); + + if (rect) { + startOffset.left = page.x - rect.left; + startOffset.top = page.y - rect.top; + + startOffset.right = rect.right - page.x; + startOffset.bottom = rect.bottom - page.y; + + if (!('width' in rect)) { + rect.width = rect.right - rect.left; + } + if (!('height' in rect)) { + rect.height = rect.bottom - rect.top; + } + } else { + startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0; + } + + arg.rect = rect; + arg.interactable = target; + arg.element = element; + + for (var i = 0; i < modifiers.names.length; i++) { + var modifierName = modifiers.names[i]; + + arg.options = target.options[interaction.prepared.name][modifierName]; + + if (!arg.options) { + continue; + } + + interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg); + } + }, + + setAll: function setAll(arg) { + var interaction = arg.interaction, + statuses = arg.statuses, + preEnd = arg.preEnd, + requireEndOnly = arg.requireEndOnly; + + var coords = extend({}, arg.pageCoords); + var result = { + dx: 0, + dy: 0, + changed: false, + locked: false, + shouldMove: true + }; + + for (var _iterator = modifiers.names, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var modifierName = _ref; + + var modifier = modifiers[modifierName]; + var options = interaction.target.options[interaction.prepared.name][modifierName]; + + if (!shouldDo(options, preEnd, requireEndOnly)) { + continue; + } + + arg.status = arg.status = statuses[modifierName]; + arg.options = options; + arg.offset = arg.interaction.modifierOffsets[modifierName]; + + modifier.set(arg); + + if (arg.status.locked) { + coords.x += arg.status.dx; + coords.y += arg.status.dy; + + result.dx += arg.status.dx; + result.dy += arg.status.dy; + + result.locked = true; + } + } + + // a move should be fired if: + // - there are no modifiers enabled, + // - no modifiers are "locked" i.e. have changed the pointer's coordinates, or + // - the locked coords have changed since the last pointer move + result.shouldMove = !arg.status || !result.locked || arg.status.changed; + + return result; + }, + + resetStatuses: function resetStatuses(statuses) { + for (var _iterator2 = modifiers.names, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var modifierName = _ref2; + + var status = statuses[modifierName] || {}; + + status.dx = status.dy = 0; + status.modifiedX = status.modifiedY = NaN; + status.locked = false; + status.changed = true; + + statuses[modifierName] = status; + } + + return statuses; + }, + + start: function start(_ref3, signalName) { + var interaction = _ref3.interaction; + + var arg = { + interaction: interaction, + pageCoords: (signalName === 'action-resume' ? interaction.curCoords : interaction.startCoords).page, + startOffset: interaction.startOffset, + statuses: interaction.modifierStatuses, + preEnd: false, + requireEndOnly: false + }; + + modifiers.setOffsets(arg); + modifiers.resetStatuses(arg.statuses); + + arg.pageCoords = extend({}, interaction.startCoords.page); + interaction.modifierResult = modifiers.setAll(arg); + } +}; + +Interaction.signals.on('new', function (interaction) { + interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 }; + interaction.modifierOffsets = {}; + interaction.modifierStatuses = modifiers.resetStatuses({}); + interaction.modifierResult = null; +}); + +Interaction.signals.on('action-start', modifiers.start); +Interaction.signals.on('action-resume', modifiers.start); + +Interaction.signals.on('before-action-move', function (_ref4) { + var interaction = _ref4.interaction, + preEnd = _ref4.preEnd, + interactingBeforeMove = _ref4.interactingBeforeMove; + + var modifierResult = modifiers.setAll({ + interaction: interaction, + preEnd: preEnd, + pageCoords: interaction.curCoords.page, + statuses: interaction.modifierStatuses, + requireEndOnly: false + }); + + // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + if (!modifierResult.shouldMove && interactingBeforeMove) { + interaction._dontFireMove = true; + } + + interaction.modifierResult = modifierResult; +}); + +Interaction.signals.on('action-end', function (_ref5) { + var interaction = _ref5.interaction, + event = _ref5.event; + + for (var i = 0; i < modifiers.names.length; i++) { + var options = interaction.target.options[interaction.prepared.name][modifiers.names[i]]; + + // if the endOnly option is true for any modifier + if (shouldDo(options, true, true)) { + // fire a move event at the modified coordinates + interaction.doMove({ event: event, preEnd: true }); + break; + } + } +}); + +InteractEvent.signals.on('set-xy', function (arg) { + var iEvent = arg.iEvent, + interaction = arg.interaction; + + var modifierArg = extend({}, arg); + + for (var i = 0; i < modifiers.names.length; i++) { + var modifierName = modifiers.names[i]; + modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName]; + + if (!modifierArg.options) { + continue; + } + + var modifier = modifiers[modifierName]; + + modifierArg.status = interaction.modifierStatuses[modifierName]; + + iEvent[modifierName] = modifier.modifyCoords(modifierArg); + } +}); + +function shouldDo(options, preEnd, requireEndOnly) { + return options && options.enabled && (preEnd || !options.endOnly) && (!requireEndOnly || options.endOnly); +} + +module.exports = modifiers; + +},{"../InteractEvent":3,"../Interaction":5,"../utils/extend":41}],25:[function(require,module,exports){ +'use strict'; + +var modifiers = require('./index'); +var utils = require('../utils'); +var defaultOptions = require('../defaultOptions'); + +var restrict = { + defaults: { + enabled: false, + endOnly: false, + restriction: null, + elementRect: null + }, + + setOffset: function setOffset(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + options = _ref.options; + + var elementRect = options && options.elementRect; + var offset = {}; + + if (rect && elementRect) { + offset.left = startOffset.left - rect.width * elementRect.left; + offset.top = startOffset.top - rect.height * elementRect.top; + + offset.right = startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom = startOffset.bottom - rect.height * (1 - elementRect.bottom); + } else { + offset.left = offset.top = offset.right = offset.bottom = 0; + } + + return offset; + }, + + set: function set(_ref2) { + var pageCoords = _ref2.pageCoords, + interaction = _ref2.interaction, + status = _ref2.status, + options = _ref2.options; + + if (!options) { + return status; + } + + var page = status.useStatusXY ? { x: status.x, y: status.y } : utils.extend({}, pageCoords); + + var restriction = getRestrictionRect(options.restriction, interaction, page); + + if (!restriction) { + return status; + } + + status.dx = 0; + status.dy = 0; + status.locked = false; + + var rect = restriction; + var modifiedX = page.x; + var modifiedY = page.y; + + var offset = interaction.modifierOffsets.restrict; + + // object is assumed to have + // x, y, width, height or + // left, top, right, bottom + if ('x' in restriction && 'y' in restriction) { + modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right, page.x), rect.x + offset.left); + modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top); + } else { + modifiedX = Math.max(Math.min(rect.right - offset.right, page.x), rect.left + offset.left); + modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top); + } + + status.dx = modifiedX - page.x; + status.dy = modifiedY - page.y; + + status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY; + status.locked = !!(status.dx || status.dy); + + status.modifiedX = modifiedX; + status.modifiedY = modifiedY; + }, + + modifyCoords: function modifyCoords(_ref3) { + var page = _ref3.page, + client = _ref3.client, + status = _ref3.status, + phase = _ref3.phase, + options = _ref3.options; + + var elementRect = options && options.elementRect; + + if (options && options.enabled && !(phase === 'start' && elementRect && status.locked)) { + + if (status.locked) { + page.x += status.dx; + page.y += status.dy; + client.x += status.dx; + client.y += status.dy; + + return { + dx: status.dx, + dy: status.dy + }; + } + } + }, + + getRestrictionRect: getRestrictionRect +}; + +function getRestrictionRect(value, interaction, page) { + value = utils.getStringOptionResult(value, interaction.target, interaction.element) || value; + + if (utils.is.function(value)) { + value = value(page.x, page.y, interaction); + } + + if (utils.is.element(value)) { + value = utils.getElementRect(value); + } + + return value; +} + +modifiers.restrict = restrict; +modifiers.names.push('restrict'); + +defaultOptions.perAction.restrict = restrict.defaults; + +module.exports = restrict; + +},{"../defaultOptions":18,"../utils":44,"./index":24}],26:[function(require,module,exports){ +'use strict'; + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }); + +var modifiers = require('./index'); +var utils = require('../utils'); +var rectUtils = require('../utils/rect'); +var defaultOptions = require('../defaultOptions'); +var resize = require('../actions/resize'); + +var _require = require('./restrict'), + getRestrictionRect = _require.getRestrictionRect; + +var noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity }; +var noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity }; + +var restrictEdges = { + defaults: { + enabled: false, + endOnly: false, + min: null, + max: null, + offset: null + }, + + setOffset: function setOffset(_ref) { + var interaction = _ref.interaction, + startOffset = _ref.startOffset, + options = _ref.options; + + if (!options) { + return utils.extend({}, startOffset); + } + + var offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page); + + if (offset) { + return { + top: startOffset.top + offset.y, + left: startOffset.left + offset.x, + bottom: startOffset.bottom + offset.y, + right: startOffset.right + offset.x + }; + } + + return startOffset; + }, + + set: function set(_ref2) { + var pageCoords = _ref2.pageCoords, + interaction = _ref2.interaction, + status = _ref2.status, + offset = _ref2.offset, + options = _ref2.options; + + var edges = interaction.prepared.linkedEdges || interaction.prepared.edges; + + if (!interaction.interacting() || !edges) { + return; + } + + var page = status.useStatusXY ? { x: status.x, y: status.y } : utils.extend({}, pageCoords); + var inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction), page) || noInner; + var outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction), page) || noOuter; + + var modifiedX = page.x; + var modifiedY = page.y; + + status.dx = 0; + status.dy = 0; + status.locked = false; + + if (edges.top) { + modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom); + } + if (edges.left) { + modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right); + } + + status.dx = modifiedX - page.x; + status.dy = modifiedY - page.y; + + status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY; + status.locked = !!(status.dx || status.dy); + + status.modifiedX = modifiedX; + status.modifiedY = modifiedY; + }, + + modifyCoords: function modifyCoords(_ref3) { + var page = _ref3.page, + client = _ref3.client, + status = _ref3.status, + phase = _ref3.phase, + options = _ref3.options; + + if (options && options.enabled && !(phase === 'start' && status.locked)) { + + if (status.locked) { + page.x += status.dx; + page.y += status.dy; + client.x += status.dx; + client.y += status.dy; + + return { + dx: status.dx, + dy: status.dy + }; + } + } + }, + + noInner: noInner, + noOuter: noOuter +}; + +modifiers.restrictEdges = restrictEdges; +modifiers.names.push('restrictEdges'); + +defaultOptions.perAction.restrictEdges = restrictEdges.defaults; +resize.defaults.restrictEdges = restrictEdges.defaults; + +module.exports = restrictEdges; + +},{"../actions/resize":10,"../defaultOptions":18,"../utils":44,"../utils/rect":51,"./index":24,"./restrict":25}],27:[function(require,module,exports){ +'use strict'; + +// This module adds the options.resize.restrictSize setting which sets min and +// max width and height for the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictSize: { +// min: { width: -600, height: -600 }, +// max: { width: 600, height: 600 }, +// }, +// }); + +var modifiers = require('./index'); +var restrictEdges = require('./restrictEdges'); +var utils = require('../utils'); +var rectUtils = require('../utils/rect'); +var defaultOptions = require('../defaultOptions'); +var resize = require('../actions/resize'); + +var noMin = { width: -Infinity, height: -Infinity }; +var noMax = { width: +Infinity, height: +Infinity }; + +var restrictSize = { + defaults: { + enabled: false, + endOnly: false, + min: null, + max: null + }, + + setOffset: function setOffset(_ref) { + var interaction = _ref.interaction; + + return interaction.startOffset; + }, + + set: function set(arg) { + var interaction = arg.interaction, + options = arg.options; + + var edges = interaction.prepared.linkedEdges || interaction.prepared.edges; + + if (!interaction.interacting() || !edges) { + return; + } + + var rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted); + + var minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin; + var maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax; + + arg.options = { + enabled: options.enabled, + endOnly: options.endOnly, + min: utils.extend({}, restrictEdges.noMin), + max: utils.extend({}, restrictEdges.noMax) + }; + + if (edges.top) { + arg.options.min.top = rect.bottom - maxSize.height; + arg.options.max.top = rect.bottom - minSize.height; + } else if (edges.bottom) { + arg.options.min.bottom = rect.top + minSize.height; + arg.options.max.bottom = rect.top + maxSize.height; + } + if (edges.left) { + arg.options.min.left = rect.right - maxSize.width; + arg.options.max.left = rect.right - minSize.width; + } else if (edges.right) { + arg.options.min.right = rect.left + minSize.width; + arg.options.max.right = rect.left + maxSize.width; + } + + return restrictEdges.set(arg); + }, + + modifyCoords: restrictEdges.modifyCoords +}; + +modifiers.restrictSize = restrictSize; +modifiers.names.push('restrictSize'); + +defaultOptions.perAction.restrictSize = restrictSize.defaults; +resize.defaults.restrictSize = restrictSize.defaults; + +module.exports = restrictSize; + +},{"../actions/resize":10,"../defaultOptions":18,"../utils":44,"../utils/rect":51,"./index":24,"./restrictEdges":26}],28:[function(require,module,exports){ +'use strict'; + +var modifiers = require('./index'); +var interact = require('../interact'); +var utils = require('../utils'); +var defaultOptions = require('../defaultOptions'); + +var snap = { + defaults: { + enabled: false, + endOnly: false, + range: Infinity, + targets: null, + offsets: null, + + relativePoints: null + }, + + setOffset: function setOffset(_ref) { + var interaction = _ref.interaction, + interactable = _ref.interactable, + element = _ref.element, + rect = _ref.rect, + startOffset = _ref.startOffset, + options = _ref.options; + + var offsets = []; + var origin = options.origin || utils.getOriginXY(interactable, element, interaction.prepared.name); + options = options || interactable.options[interaction.prepared.name].snap || {}; + + var snapOffset = void 0; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.startCoords.page.x - origin.x, + y: interaction.startCoords.page.y - origin.y + }; + } else if (options.offset === 'self') { + snapOffset = { + x: rect.left - origin.x, + y: rect.top - origin.y + }; + } else { + snapOffset = options.offset || { x: 0, y: 0 }; + } + + if (rect && options.relativePoints && options.relativePoints.length) { + for (var _iterator = options.relativePoints, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref2; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref2 = _i.value; + } + + var _ref3 = _ref2, + relativeX = _ref3.x, + relativeY = _ref3.y; + + offsets.push({ + x: startOffset.left - rect.width * relativeX + snapOffset.x, + y: startOffset.top - rect.height * relativeY + snapOffset.y + }); + } + } else { + offsets.push(snapOffset); + } + + return offsets; + }, + + set: function set(_ref4) { + var interaction = _ref4.interaction, + pageCoords = _ref4.pageCoords, + status = _ref4.status, + options = _ref4.options, + offsets = _ref4.offset; + + var targets = []; + var target = void 0; + var page = void 0; + var i = void 0; + + if (status.useStatusXY) { + page = { x: status.x, y: status.y }; + } else { + var origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name); + + page = utils.extend({}, pageCoords); + + page.x -= origin.x; + page.y -= origin.y; + } + + status.realX = page.x; + status.realY = page.y; + + var len = options.targets ? options.targets.length : 0; + + for (var _iterator2 = offsets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref5; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref5 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref5 = _i2.value; + } + + var _ref6 = _ref5, + offsetX = _ref6.x, + offsetY = _ref6.y; + + var relativeX = page.x - offsetX; + var relativeY = page.y - offsetY; + + for (var _iterator3 = options.targets, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref7; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref7 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref7 = _i3.value; + } + + var snapTarget = _ref7; + + if (utils.is.function(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: utils.is.number(target.x) ? target.x + offsetX : relativeX, + y: utils.is.number(target.y) ? target.y + offsetY : relativeY, + + range: utils.is.number(target.range) ? target.range : options.range + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + dx: 0, + dy: 0 + }; + + for (i = 0, len = targets.length; i < len; i++) { + target = targets[i]; + + var range = target.range; + var dx = target.x - page.x; + var dy = target.y - page.y; + var distance = utils.hypot(dx, dy); + var inRange = distance <= range; + + // Infinite targets count as being out of range + // compared to non infinite ones that are in range + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } + + if (!closest.target || (inRange + // is the closest target in range? + ? closest.inRange && range !== Infinity + // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range + // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || + // OR this target is closer that the previous closest + distance < closest.distance : + // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + + closest.target = target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.dx = dx; + closest.dy = dy; + + status.range = range; + } + } + + var snapChanged = void 0; + + if (closest.target) { + snapChanged = status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y; + + status.modifiedX = closest.target.x; + status.modifiedY = closest.target.y; + } else { + snapChanged = true; + + status.modifiedX = NaN; + status.modifiedY = NaN; + } + + status.dx = closest.dx; + status.dy = closest.dy; + + status.changed = snapChanged || closest.inRange && !status.locked; + status.locked = closest.inRange; + }, + + modifyCoords: function modifyCoords(_ref8) { + var page = _ref8.page, + client = _ref8.client, + status = _ref8.status, + phase = _ref8.phase, + options = _ref8.options; + + var relativePoints = options && options.relativePoints; + + if (options && options.enabled && !(phase === 'start' && relativePoints && relativePoints.length)) { + + if (status.locked) { + page.x += status.dx; + page.y += status.dy; + client.x += status.dx; + client.y += status.dy; + } + + return { + range: status.range, + locked: status.locked, + x: status.modifiedX, + y: status.modifiedY, + realX: status.realX, + realY: status.realY, + dx: status.dx, + dy: status.dy + }; + } + } +}; + +interact.createSnapGrid = function (grid) { + return function (x, y) { + var limits = grid.limits || { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + }; + var offsetX = 0; + var offsetY = 0; + + if (utils.is.object(grid.offset)) { + offsetX = grid.offset.x; + offsetY = grid.offset.y; + } + + var gridx = Math.round((x - offsetX) / grid.x); + var gridy = Math.round((y - offsetY) / grid.y); + + var newX = Math.max(limits.left, Math.min(limits.right, gridx * grid.x + offsetX)); + var newY = Math.max(limits.top, Math.min(limits.bottom, gridy * grid.y + offsetY)); + + return { + x: newX, + y: newY, + range: grid.range + }; + }; +}; + +modifiers.snap = snap; +modifiers.names.push('snap'); + +defaultOptions.perAction.snap = snap.defaults; + +module.exports = snap; + +},{"../defaultOptions":18,"../interact":21,"../utils":44,"./index":24}],29:[function(require,module,exports){ +'use strict'; + +// This module allows snapping of the size of targets during resize +// interactions. + +var modifiers = require('./index'); +var snap = require('./snap'); +var defaultOptions = require('../defaultOptions'); +var resize = require('../actions/resize'); +var utils = require('../utils/'); + +var snapSize = { + defaults: { + enabled: false, + endOnly: false, + range: Infinity, + targets: null, + offsets: null + }, + + setOffset: function setOffset(arg) { + var interaction = arg.interaction, + options = arg.options; + + var edges = interaction.prepared.edges; + + if (!edges) { + return; + } + + arg.options = { + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + origin: { x: 0, y: 0 }, + offset: 'self', + range: options.range + }; + + var offsets = snap.setOffset(arg); + arg.options = options; + + return offsets; + }, + + set: function set(arg) { + var interaction = arg.interaction, + options = arg.options, + offset = arg.offset, + pageCoords = arg.pageCoords; + + var page = utils.extend({}, pageCoords); + var relativeX = page.x - offset[0].x; + var relativeY = page.y - offset[0].y; + + arg.options = utils.extend({}, options); + arg.options.targets = []; + + for (var _iterator = options.targets, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var snapTarget = _ref; + + var target = void 0; + + if (utils.is.function(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + if ('width' in target && 'height' in target) { + target.x = target.width; + target.y = target.height; + } + + arg.options.targets.push(target); + } + + snap.set(arg); + }, + + modifyCoords: function modifyCoords(arg) { + var options = arg.options; + + + arg.options = utils.extend({}, options); + arg.options.enabled = options.enabled; + arg.options.relativePoints = [null]; + + snap.modifyCoords(arg); + } +}; + +modifiers.snapSize = snapSize; +modifiers.names.push('snapSize'); + +defaultOptions.perAction.snapSize = snapSize.defaults; +resize.defaults.snapSize = snapSize.defaults; + +module.exports = snapSize; + +},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var pointerUtils = require('../utils/pointerUtils'); + +module.exports = function () { + function PointerEvent(type, pointer, event, eventTarget, interaction) { + _classCallCheck(this, PointerEvent); + + pointerUtils.pointerExtend(this, event); + + if (event !== pointer) { + pointerUtils.pointerExtend(this, pointer); + } + + this.interaction = interaction; + + this.timeStamp = new Date().getTime(); + this.originalEvent = event; + this.type = type; + this.pointerId = pointerUtils.getPointerId(pointer); + this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.target = eventTarget; + this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + this.dt = this.timeStamp - interaction.downTimes[pointerIndex]; + + var interval = this.timeStamp - interaction.tapTime; + + this.double = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === this.target && interval < 500); + } else if (type === 'doubletap') { + this.dt = pointer.timeStamp - interaction.tapTime; + } + } + + PointerEvent.prototype.subtractOrigin = function subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + + return this; + }; + + PointerEvent.prototype.addOrigin = function addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + + return this; + }; + + PointerEvent.prototype.preventDefault = function preventDefault() { + this.originalEvent.preventDefault(); + }; + + PointerEvent.prototype.stopPropagation = function stopPropagation() { + this.propagationStopped = true; + }; + + PointerEvent.prototype.stopImmediatePropagation = function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + }; + + return PointerEvent; +}(); + +},{"../utils/pointerUtils":49}],31:[function(require,module,exports){ +'use strict'; + +var PointerEvent = require('./PointerEvent'); +var Interaction = require('../Interaction'); +var utils = require('../utils'); +var browser = require('../utils/browser'); +var defaults = require('../defaultOptions'); +var signals = require('../utils/Signals').new(); + +var _require = require('../utils/arr'), + filter = _require.filter; + +var simpleSignals = ['down', 'up', 'cancel']; +var simpleEvents = ['down', 'up', 'cancel']; + +var pointerEvents = { + PointerEvent: PointerEvent, + fire: fire, + collectEventTargets: collectEventTargets, + signals: signals, + defaults: { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { x: 0, y: 0 } + }, + types: ['down', 'move', 'up', 'cancel', 'tap', 'doubletap', 'hold'] +}; + +function fire(arg) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + _arg$type = arg.type, + type = _arg$type === undefined ? arg.pointerEvent.type : _arg$type, + _arg$targets = arg.targets, + targets = _arg$targets === undefined ? collectEventTargets(arg) : _arg$targets, + _arg$pointerEvent = arg.pointerEvent, + pointerEvent = _arg$pointerEvent === undefined ? new PointerEvent(type, pointer, event, eventTarget, interaction) : _arg$pointerEvent; + + + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = utils.getOriginXY(target.eventable, target.element); + + pointerEvent.subtractOrigin(origin); + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.element; + + target.eventable.fire(pointerEvent); + + pointerEvent.addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].element !== pointerEvent.currentTarget) { + break; + } + } + + signals.fire('fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent.double ? fire({ + interaction: interaction, pointer: pointer, event: event, eventTarget: eventTarget, + type: 'doubletap' + }) : pointerEvent; + + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + + var pointerIndex = interaction.getPointerIndex(pointer); + + // do not fire a tap event if the pointer was moved before being lifted + if (type === 'tap' && (interaction.pointerWasMoved + // or if the pointerup target is different to the pointerdown target + || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) { + return []; + } + + var path = utils.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + element: null + }; + + for (var _iterator = path, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref2; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref2 = _i.value; + } + + var element = _ref2; + + signalArg.element = element; + + signals.fire('collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = filter(signalArg.targets, function (target) { + return target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration; + }); + } + + return signalArg.targets; +} + +Interaction.signals.on('update-pointer-down', function (_ref3) { + var interaction = _ref3.interaction, + pointerIndex = _ref3.pointerIndex; + + interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null }; +}); + +Interaction.signals.on('remove-pointer', function (_ref4) { + var interaction = _ref4.interaction, + pointerIndex = _ref4.pointerIndex; + + interaction.holdTimers.splice(pointerIndex, 1); +}); + +Interaction.signals.on('move', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + duplicateMove = _ref5.duplicateMove; + + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.holdTimers[pointerIndex].timeout); + } + + fire({ + interaction: interaction, pointer: pointer, event: event, eventTarget: eventTarget, + type: 'move' + }); + } +}); + +Interaction.signals.on('down', function (_ref6) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + pointerIndex = _ref6.pointerIndex; + + // copy event to be used in timeout for IE8 + var eventCopy = browser.isIE8 ? utils.extend({}, event) : event; + + var timer = interaction.holdTimers[pointerIndex]; + var path = utils.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + element: null + }; + + for (var _iterator2 = path, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref7; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref7 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref7 = _i2.value; + } + + var element = _ref7; + + signalArg.element = element; + + signals.fire('collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var i = 0; i < signalArg.targets.length; i++) { + var target = signalArg.targets[i]; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + pointer: browser.isIE8 ? eventCopy : pointer, + type: 'hold' + }); + }, minDuration); +}); + +Interaction.signals.on('up', function (_ref8) { + var interaction = _ref8.interaction, + pointer = _ref8.pointer, + event = _ref8.event, + eventTarget = _ref8.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ interaction: interaction, eventTarget: eventTarget, pointer: pointer, event: event, type: 'tap' }); + } +}); + +['up', 'cancel'].forEach(function (signalName) { + Interaction.signals.on(signalName, function (_ref9) { + var interaction = _ref9.interaction, + pointerIndex = _ref9.pointerIndex; + + if (interaction.holdTimers[pointerIndex]) { + clearTimeout(interaction.holdTimers[pointerIndex].timeout); + } + }); +}); + +function createSignalListener(type) { + return function (_ref10) { + var interaction = _ref10.interaction, + pointer = _ref10.pointer, + event = _ref10.event, + eventTarget = _ref10.eventTarget; + + fire({ interaction: interaction, eventTarget: eventTarget, pointer: pointer, event: event, type: type }); + }; +} + +for (var i = 0; i < simpleSignals.length; i++) { + Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i])); +} + +Interaction.signals.on('new', function (interaction) { + interaction.prevTap = null; // the most recent tap event on this interaction + interaction.tapTime = 0; // time of the most recent tap event + interaction.holdTimers = []; // [{ duration, timeout }] +}); + +defaults.pointerEvents = pointerEvents.defaults; +module.exports = pointerEvents; + +},{"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/Signals":35,"../utils/arr":36,"../utils/browser":37,"./PointerEvent":30}],32:[function(require,module,exports){ +'use strict'; + +var pointerEvents = require('./base'); +var Interaction = require('../Interaction'); + +pointerEvents.signals.on('new', onNew); +pointerEvents.signals.on('fired', onFired); + +var _arr = ['move', 'up', 'cancel', 'endall']; +for (var _i = 0; _i < _arr.length; _i++) { + var signal = _arr[_i]; + Interaction.signals.on(signal, endHoldRepeat); +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } + + // get the repeat interval from the first eventable + var interval = targets[0].eventable.options.holdRepeatInterval; + + // don't repeat if the interval is 0 or less + if (interval <= 0) { + return; + } + + // set a timeout to fire the holdrepeat event + interaction.holdIntervalHandle = setTimeout(function () { + pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +// don't repeat by default +pointerEvents.defaults.holdRepeatInterval = 0; +pointerEvents.types.push('holdrepeat'); + +module.exports = { + onNew: onNew, + onFired: onFired, + endHoldRepeat: endHoldRepeat +}; + +},{"../Interaction":5,"./base":31}],33:[function(require,module,exports){ +'use strict'; + +var pointerEvents = require('./base'); +var Interactable = require('../Interactable'); +var browser = require('../utils/browser'); +var is = require('../utils/is'); +var domUtils = require('../utils/domUtils'); +var scope = require('../scope'); +var extend = require('../utils/extend'); + +var _require = require('../utils/arr'), + merge = _require.merge; + +pointerEvents.signals.on('collect-targets', function (_ref) { + var targets = _ref.targets, + element = _ref.element, + type = _ref.type, + eventTarget = _ref.eventTarget; + + function collectSelectors(interactable, selector, context) { + var els = browser.useMatchesSelectorPolyfill ? context.querySelectorAll(selector) : undefined; + + var eventable = interactable.events; + var options = eventable.options; + + if (eventable[type] && is.element(element) && domUtils.matchesSelector(element, selector, els) && interactable.testIgnoreAllow(options, element, eventTarget)) { + + targets.push({ + element: element, + eventable: eventable, + props: { interactable: interactable } + }); + } + } + + var interactable = scope.interactables.get(element); + + if (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable[type] && interactable.testIgnoreAllow(options, element, eventTarget)) { + targets.push({ + element: element, + eventable: eventable, + props: { interactable: interactable } + }); + } + } + + scope.interactables.forEachSelector(collectSelectors, element); +}); + +Interactable.signals.on('new', function (_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; +}); + +Interactable.signals.on('set', function (_ref3) { + var interactable = _ref3.interactable, + options = _ref3.options; + + extend(interactable.events.options, pointerEvents.defaults); + extend(interactable.events.options, options); +}); + +merge(Interactable.eventTypes, pointerEvents.types); + +Interactable.prototype.pointerEvents = function (options) { + extend(this.events.options, options); + + return this; +}; + +var __backCompatOption = Interactable.prototype._backCompatOption; + +Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } + + return ret; +}; + +Interactable.settingsMethods.push('pointerEvents'); + +},{"../Interactable":4,"../scope":34,"../utils/arr":36,"../utils/browser":37,"../utils/domUtils":39,"../utils/extend":41,"../utils/is":46,"./base":31}],34:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var events = require('./utils/events'); +var signals = require('./utils/Signals').new(); + +var scope = { + signals: signals, + events: events, + utils: utils, + + // main document + document: require('./utils/domObjects').document, + // all documents being listened to + documents: [], + + addDocument: function addDocument(doc, win) { + // do nothing if document is already known + if (utils.contains(scope.documents, doc)) { + return false; + } + + win = win || scope.getWindow(doc); + + scope.documents.push(doc); + events.documents.push(doc); + + // don't add an unload event for the main document + // so that the page may be cached in browser history + if (doc !== scope.document) { + events.add(win, 'unload', scope.onWindowUnload); + } + + signals.fire('add-document', { doc: doc, win: win }); + }, + + removeDocument: function removeDocument(doc, win) { + var index = utils.indexOf(scope.documents, doc); + + win = win || scope.getWindow(doc); + + events.remove(win, 'unload', scope.onWindowUnload); + + scope.documents.splice(index, 1); + events.documents.splice(index, 1); + + signals.fire('remove-document', { win: win, doc: doc }); + }, + + onWindowUnload: function onWindowUnload() { + scope.removeDocument(this.document, this); + } +}; + +module.exports = scope; + +},{"./utils":44,"./utils/Signals":35,"./utils/domObjects":38,"./utils/events":40}],35:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _require = require('./arr'), + indexOf = _require.indexOf; + +var Signals = function () { + function Signals() { + _classCallCheck(this, Signals); + + this.listeners = { + // signalName: [listeners], + }; + } + + Signals.prototype.on = function on(name, listener) { + if (!this.listeners[name]) { + this.listeners[name] = [listener]; + return; + } + + this.listeners[name].push(listener); + }; + + Signals.prototype.off = function off(name, listener) { + if (!this.listeners[name]) { + return; + } + + var index = indexOf(this.listeners[name], listener); + + if (index !== -1) { + this.listeners[name].splice(index, 1); + } + }; + + Signals.prototype.fire = function fire(name, arg) { + var targetListeners = this.listeners[name]; + + if (!targetListeners) { + return; + } + + for (var i = 0; i < targetListeners.length; i++) { + if (targetListeners[i](arg, name) === false) { + return; + } + } + }; + + return Signals; +}(); + +Signals.new = function () { + return new Signals(); +}; + +module.exports = Signals; + +},{"./arr":36}],36:[function(require,module,exports){ "use strict"; -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; +function indexOf(array, target) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === target) { + return i; + } + } -/* interact.js @332e9a2-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function (e) { - if ("object" == (typeof exports === "undefined" ? "undefined" : _typeof(exports)) && "undefined" != typeof module) module.exports = e();else if ("function" == typeof define && define.amd) define([], e);else { - var t;t = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this, t.interact = e(); - } -}(function () { - return function e(t, n, r) { - function i(s, a) { - if (!n[s]) { - if (!t[s]) { - var l = "function" == typeof require && require;if (!a && l) return l(s, !0);if (o) return o(s, !0);var c = new Error("Cannot find module '" + s + "'");throw c.code = "MODULE_NOT_FOUND", c; - }var p = n[s] = { exports: {} };t[s][0].call(p.exports, function (e) { - var n = t[s][1][e];return i(n ? n : e); - }, p, p.exports, e, t, n, r); - }return n[s].exports; - }for (var o = "function" == typeof require && require, s = 0; s < r.length; s++) { - i(r[s]); - }return i; - }({ 1: [function (e, t, n) { - "use strict"; - "undefined" == typeof window ? t.exports = function (t) { - return e("./src/utils/window").init(t), e("./src/index"); - } : t.exports = e("./src/index"); - }, { "./src/index": 19, "./src/utils/window": 48 }], 2: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }function i(e, t) { - for (var n = 0, r = t.length; n < r && !e.immediatePropagationStopped; n++) { - t[n](e); - } - }var o = e("./utils/arr"), - s = o.indexOf, - a = e("./utils/extend.js"), - l = function () { - function e(t) { - r(this, e), this.options = a({}, t || {}); - }return e.prototype.fire = function (e) { - var t = void 0, - n = "on" + e.type, - r = this.global;(t = this[e.type]) && i(e, t), this[n] && this[n](e), !e.propagationStopped && r && (t = r[e.type]) && i(e, t); - }, e.prototype.on = function (e, t) { - this[e] ? this[e].push(t) : this[e] = [t]; - }, e.prototype.off = function (e, t) { - var n = this[e], - r = n ? s(n, t) : -1;r !== -1 && n.splice(r, 1), (n && 0 === n.length || !t) && (this[e] = t); - }, e; - }();t.exports = l; - }, { "./utils/arr": 33, "./utils/extend.js": 38 }], 3: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }var i = e("./utils/extend"), - o = e("./utils/getOriginXY"), - s = e("./defaultOptions"), - a = e("./utils/Signals").new(), - l = function () { - function e(t, n, l, c, p, u) { - var d = arguments.length > 6 && void 0 !== arguments[6] && arguments[6];r(this, e);var f = t.target, - v = (f && f.options || s).deltaSource, - g = o(f, p, l), - h = "start" === c, - m = "end" === c, - y = h ? t.startCoords : t.curCoords, - x = t.prevEvent;p = p || t.element;var b = i({}, y.page), - w = i({}, y.client);b.x -= g.x, b.y -= g.y, w.x -= g.x, w.y -= g.y, this.ctrlKey = n.ctrlKey, this.altKey = n.altKey, this.shiftKey = n.shiftKey, this.metaKey = n.metaKey, this.button = n.button, this.buttons = n.buttons, this.target = p, this.currentTarget = p, this.relatedTarget = u || null, this.preEnd = d, this.type = l + (c || ""), this.interaction = t, this.interactable = f, this.t0 = h ? t.downTimes[t.downTimes.length - 1] : x.t0;var E = { interaction: t, event: n, action: l, phase: c, element: p, related: u, page: b, client: w, coords: y, starting: h, ending: m, deltaSource: v, iEvent: this };a.fire("set-xy", E), m ? (this.pageX = x.pageX, this.pageY = x.pageY, this.clientX = x.clientX, this.clientY = x.clientY) : (this.pageX = b.x, this.pageY = b.y, this.clientX = w.x, this.clientY = w.y), this.x0 = t.startCoords.page.x - g.x, this.y0 = t.startCoords.page.y - g.y, this.clientX0 = t.startCoords.client.x - g.x, this.clientY0 = t.startCoords.client.y - g.y, a.fire("set-delta", E), this.timeStamp = y.timeStamp, this.dt = t.pointerDelta.timeStamp, this.duration = this.timeStamp - this.t0, this.speed = t.pointerDelta[v].speed, this.velocityX = t.pointerDelta[v].vx, this.velocityY = t.pointerDelta[v].vy, this.swipe = m || "inertiastart" === c ? this.getSwipe() : null, a.fire("new", E); - }return e.prototype.getSwipe = function () { - var e = this.interaction;if (e.prevEvent.speed < 600 || this.timeStamp - e.prevEvent.timeStamp > 150) return null;var t = 180 * Math.atan2(e.prevEvent.velocityY, e.prevEvent.velocityX) / Math.PI;t < 0 && (t += 360);var n = 112.5 <= t && t < 247.5, - r = 202.5 <= t && t < 337.5, - i = !n && (292.5 <= t || t < 67.5);return { up: r, down: !r && 22.5 <= t && t < 157.5, left: n, right: i, angle: t, speed: e.prevEvent.speed, velocity: { x: e.prevEvent.velocityX, y: e.prevEvent.velocityY } }; - }, e.prototype.preventDefault = function () {}, e.prototype.stopImmediatePropagation = function () { - this.immediatePropagationStopped = this.propagationStopped = !0; - }, e.prototype.stopPropagation = function () { - this.propagationStopped = !0; - }, e; - }();a.on("set-delta", function (e) { - var t = e.iEvent, - n = e.interaction, - r = e.starting, - i = e.deltaSource, - o = r ? t : n.prevEvent;"client" === i ? (t.dx = t.clientX - o.clientX, t.dy = t.clientY - o.clientY) : (t.dx = t.pageX - o.pageX, t.dy = t.pageY - o.pageY); - }), l.signals = a, t.exports = l; - }, { "./defaultOptions": 18, "./utils/Signals": 32, "./utils/extend": 38, "./utils/getOriginXY": 39 }], 4: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }var i = e("./utils/is"), - o = e("./utils/events"), - s = e("./utils/extend"), - a = e("./actions/base"), - l = e("./scope"), - c = e("./Eventable"), - p = e("./defaultOptions"), - u = e("./utils/Signals").new(), - d = e("./utils/domUtils"), - f = d.getElementRect, - v = d.nodeContains, - g = d.trySelector, - h = e("./utils/window"), - m = h.getWindow, - y = e("./utils/arr"), - x = y.indexOf, - b = y.contains, - w = e("./utils/browser"), - E = w.wheelEvent;l.interactables = [];var S = function () { - function e(t, n) { - r(this, e), n = n || {}, this.target = t, this.events = new c(), this._context = n.context || l.document, this._win = m(g(t) ? this._context : t), this._doc = this._win.document, u.fire("new", { target: t, options: n, interactable: this, win: this._win }), l.addDocument(this._doc, this._win), l.interactables.push(this), this.set(n); - }return e.prototype.setOnEvents = function (e, t) { - var n = "on" + e;return i.function(t.onstart) && (this.events[n + "start"] = t.onstart), i.function(t.onmove) && (this.events[n + "move"] = t.onmove), i.function(t.onend) && (this.events[n + "end"] = t.onend), i.function(t.oninertiastart) && (this.events[n + "inertiastart"] = t.oninertiastart), this; - }, e.prototype.setPerAction = function (e, t) { - for (var n in t) { - n in p[e] && (i.object(t[n]) ? (this.options[e][n] = s(this.options[e][n] || {}, t[n]), i.object(p.perAction[n]) && "enabled" in p.perAction[n] && (this.options[e][n].enabled = t[n].enabled !== !1)) : i.bool(t[n]) && i.object(p.perAction[n]) ? this.options[e][n].enabled = t[n] : void 0 !== t[n] && (this.options[e][n] = t[n])); - } - }, e.prototype.getRect = function (e) { - return e = e || this.target, i.string(this.target) && !i.element(e) && (e = this._context.querySelector(this.target)), f(e); - }, e.prototype.rectChecker = function (e) { - return i.function(e) ? (this.getRect = e, this) : null === e ? (delete this.options.getRect, this) : this.getRect; - }, e.prototype._backCompatOption = function (e, t) { - if (g(t) || i.object(t)) { - this.options[e] = t;for (var n = a.names, r = Array.isArray(n), o = 0, n = r ? n : n[Symbol.iterator]();;) { - var s;if (r) { - if (o >= n.length) break;s = n[o++]; - } else { - if (o = n.next(), o.done) break;s = o.value; - }var l = s;this.options[l][e] = t; - }return this; - }return this.options[e]; - }, e.prototype.origin = function (e) { - return this._backCompatOption("origin", e); - }, e.prototype.deltaSource = function (e) { - return "page" === e || "client" === e ? (this.options.deltaSource = e, this) : this.options.deltaSource; - }, e.prototype.context = function () { - return this._context; - }, e.prototype.inContext = function (e) { - return this._context === e.ownerDocument || v(this._context, e); - }, e.prototype.fire = function (e) { - return this.events.fire(e), this; - }, e.prototype._onOffMultiple = function (e, t, n, r) { - if (i.string(t) && t.search(" ") !== -1 && (t = t.trim().split(/ +/)), i.array(t)) { - for (var o = 0; o < t.length; o++) { - this[e](t[o], n, r); - }return !0; - }if (i.object(t)) { - for (var s in t) { - this[e](s, t[s], n); - }return !0; - } - }, e.prototype.on = function (t, n, r) { - return r = !!r, this._onOffMultiple("on", t, n, r) ? this : ("wheel" === t && (t = E), b(e.eventTypes, t) ? this.events.on(t, n) : i.string(this.target) ? o.addDelegate(this.target, this._context, t, n, r) : o.add(this.target, t, n, r), this); - }, e.prototype.off = function (t, n, r) { - return r = !!r, this._onOffMultiple("off", t, n, r) ? this : ("wheel" === t && (t = E), b(e.eventTypes, t) ? this.events.off(t, n) : i.string(this.target) ? o.removeDelegate(this.target, this._context, t, n, r) : o.remove(this.target, t, n, r), this); - }, e.prototype.set = function (t) { - i.object(t) || (t = {}), this.options = s({}, p.base);var n = s({}, p.perAction);for (var r in a.methodDict) { - var o = a.methodDict[r];this.options[r] = s({}, p[r]), this.setPerAction(r, n), this[o](t[r]); - }for (var l = e.settingsMethods, c = Array.isArray(l), d = 0, l = c ? l : l[Symbol.iterator]();;) { - var f;if (c) { - if (d >= l.length) break;f = l[d++]; - } else { - if (d = l.next(), d.done) break;f = d.value; - }var v = f;this.options[v] = p.base[v], v in t && this[v](t[v]); - }return u.fire("set", { options: t, interactable: this }), this; - }, e.prototype.unset = function () { - if (o.remove(this.target, "all"), i.string(this.target)) for (var e in o.delegatedEvents) { - var t = o.delegatedEvents[e];t.selectors[0] === this.target && t.contexts[0] === this._context && (t.selectors.splice(0, 1), t.contexts.splice(0, 1), t.listeners.splice(0, 1), t.selectors.length || (t[e] = null)), o.remove(this._context, e, o.delegateListener), o.remove(this._context, e, o.delegateUseCapture, !0); - } else o.remove(this, "all");u.fire("unset", { interactable: this }), l.interactables.splice(x(l.interactables, this), 1);for (var n = l.interactions || [], r = Array.isArray(n), s = 0, n = r ? n : n[Symbol.iterator]();;) { - var a;if (r) { - if (s >= n.length) break;a = n[s++]; - } else { - if (s = n.next(), s.done) break;a = s.value; - }var c = a;c.target === this && c.interacting() && c.stop(); - }return l.interact; - }, e; - }();l.interactables.indexOfElement = function (e, t) { - t = t || l.document;for (var n = 0; n < this.length; n++) { - var r = this[n];if (r.target === e && (!i.string(e) || r._context === t)) return n; - }return -1; - }, l.interactables.get = function (e, t, n) { - var r = this[this.indexOfElement(e, t && t.context)];return r && (n || r.inContext(e)) ? r : null; - }, l.interactables.forEachSelector = function (e, t) { - for (var n = 0; n < this.length; n++) { - var r = this[n];if (i.string(r.target) && (!t || r.inContext(t))) { - var o = e(r, r.target, r._context, n, this);if (void 0 !== o) return o; - } - } - }, S.eventTypes = l.eventTypes = [], S.signals = u, S.settingsMethods = ["deltaSource", "origin", "preventDefault", "rectChecker"], t.exports = S; - }, { "./Eventable": 2, "./actions/base": 6, "./defaultOptions": 18, "./scope": 31, "./utils/Signals": 32, "./utils/arr": 33, "./utils/browser": 34, "./utils/domUtils": 36, "./utils/events": 37, "./utils/extend": 38, "./utils/is": 43, "./utils/window": 48 }], 5: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }function i(e) { - return function (t) { - var n = l.getEventTargets(t), - r = n[0], - i = n[1], - o = [];if (p.supportsTouch && /touch/.test(t.type)) { - g = new Date().getTime();for (var s = 0; s < t.changedTouches.length; s++) { - var c = t.changedTouches[s], - d = u.search(c, t.type, r);o.push([c, d || new h()]); - } - } else { - var f = !1;if (!p.supportsPointerEvent && /mouse/.test(t.type)) { - for (var v = 0; v < a.interactions.length && !f; v++) { - f = !a.interactions[v].mouse && a.interactions[v].pointerIsDown; - }f = f || new Date().getTime() - g < 500 || 0 === t.timeStamp; - }if (!f) { - var m = u.search(t, t.type, r);m || (m = new h(), m.mouse = /mouse/i.test(t.pointerType || t.type) || 4 === t.pointerType || !t.pointerType), o.push([t, m]); - } - }for (var y = o, x = Array.isArray(y), b = 0, y = x ? y : y[Symbol.iterator]();;) { - var w;if (x) { - if (b >= y.length) break;w = y[b++]; - } else { - if (b = y.next(), b.done) break;w = b.value; - }var E = w, - S = E[0], - T = E[1];T._updateEventTargets(r, i), T[e](S, t, r, i); - } - }; - }function o(e) { - for (var t = 0; t < a.interactions.length; t++) { - var n = a.interactions[t];n.end(e), d.fire("endall", { event: e, interaction: n }); - } - }function s(e, t) { - var n = e.doc, - r = 0 === t.indexOf("add") ? c.add : c.remove;for (var i in a.delegatedEvents) { - r(n, i, c.delegateListener), r(n, i, c.delegateUseCapture, !0); - }for (var o in b) { - r(n, o, b[o]); - } - }var a = e("./scope"), - l = e("./utils"), - c = e("./utils/events"), - p = e("./utils/browser"), - u = e("./utils/interactionFinder"), - d = e("./utils/Signals").new(), - f = {}, - v = ["pointerDown", "pointerMove", "pointerUp", "updatePointer", "removePointer"], - g = 0;a.interactions = [];for (var h = function () { - function e() { - r(this, e), this.target = null, this.element = null, this.prepared = { name: null, axis: null, edges: null }, this.pointers = [], this.pointerIds = [], this.downTargets = [], this.downTimes = [], this.prevCoords = { page: { x: 0, y: 0 }, client: { x: 0, y: 0 }, timeStamp: 0 }, this.curCoords = { page: { x: 0, y: 0 }, client: { x: 0, y: 0 }, timeStamp: 0 }, this.startCoords = { page: { x: 0, y: 0 }, client: { x: 0, y: 0 }, timeStamp: 0 }, this.pointerDelta = { page: { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, client: { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, timeStamp: 0 }, this.downEvent = null, this.downPointer = {}, this._eventTarget = null, this._curEventTarget = null, this.prevEvent = null, this.pointerIsDown = !1, this.pointerWasMoved = !1, this._interacting = !1, this.mouse = !1, d.fire("new", this), a.interactions.push(this); - }return e.prototype.pointerDown = function (e, t, n) { - var r = this.updatePointer(e, t, !0);d.fire("down", { pointer: e, event: t, eventTarget: n, pointerIndex: r, interaction: this }); - }, e.prototype.start = function (e, t, n) { - this.interacting() || !this.pointerIsDown || this.pointerIds.length < ("gesture" === e.name ? 2 : 1) || (l.indexOf(a.interactions, this) === -1 && a.interactions.push(this), l.copyAction(this.prepared, e), this.target = t, this.element = n, d.fire("action-start", { interaction: this, event: this.downEvent })); - }, e.prototype.pointerMove = function (t, n, r) { - this.simulation || (this.updatePointer(t), l.setCoords(this.curCoords, this.pointers));var i = this.curCoords.page.x === this.prevCoords.page.x && this.curCoords.page.y === this.prevCoords.page.y && this.curCoords.client.x === this.prevCoords.client.x && this.curCoords.client.y === this.prevCoords.client.y, - o = void 0, - s = void 0;this.pointerIsDown && !this.pointerWasMoved && (o = this.curCoords.client.x - this.startCoords.client.x, s = this.curCoords.client.y - this.startCoords.client.y, this.pointerWasMoved = l.hypot(o, s) > e.pointerMoveTolerance);var a = { pointer: t, pointerIndex: this.getPointerIndex(t), event: n, eventTarget: r, dx: o, dy: s, duplicate: i, interaction: this, interactingBeforeMove: this.interacting() };i || l.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords), d.fire("move", a), i || (this.interacting() && this.doMove(a), this.pointerWasMoved && l.copyCoords(this.prevCoords, this.curCoords)); - }, e.prototype.doMove = function (e) { - e = l.extend({ pointer: this.pointers[0], event: this.prevEvent, eventTarget: this._eventTarget, interaction: this }, e || {}), d.fire("before-action-move", e), this._dontFireMove || d.fire("action-move", e), this._dontFireMove = !1; - }, e.prototype.pointerUp = function (e, t, n, r) { - var i = this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type) ? "cancel" : "up", { pointer: e, pointerIndex: i, event: t, eventTarget: n, curEventTarget: r, interaction: this }), this.simulation || this.end(t), this.pointerIsDown = !1, this.removePointer(e, t); - }, e.prototype.end = function (e) { - e = e || this.prevEvent, this.interacting() && d.fire("action-end", { event: e, interaction: this }), this.stop(); - }, e.prototype.currentAction = function () { - return this._interacting ? this.prepared.name : null; - }, e.prototype.interacting = function () { - return this._interacting; - }, e.prototype.stop = function () { - d.fire("stop", { interaction: this }), this._interacting && (d.fire("stop-active", { interaction: this }), d.fire("stop-" + this.prepared.name, { interaction: this })), this.target = this.element = null, this._interacting = !1, this.prepared.name = this.prevEvent = null; - }, e.prototype.getPointerIndex = function (e) { - return l.indexOf(this.pointerIds, l.getPointerId(e)); - }, e.prototype.updatePointer = function (e, t) { - var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : t && /(down|start)$/i.test(t.type), - r = l.getPointerId(e), - i = this.getPointerIndex(e);return i === -1 && (i = this.pointerIds.length, this.pointerIds[i] = r), n && d.fire("update-pointer-down", { pointer: e, event: t, down: n, pointerId: r, pointerIndex: i, interaction: this }), this.pointers[i] = e, i; - }, e.prototype.removePointer = function (e, t) { - var n = l.getPointerId(e), - r = this.mouse ? 0 : l.indexOf(this.pointerIds, n);r !== -1 && (d.fire("remove-pointer", { pointer: e, event: t, pointerIndex: r, interaction: this }), this.pointers.splice(r, 1), this.pointerIds.splice(r, 1), this.downTargets.splice(r, 1), this.downTimes.splice(r, 1)); - }, e.prototype._updateEventTargets = function (e, t) { - this._eventTarget = e, this._curEventTarget = t; - }, e; - }(), m = 0, y = v.length; m < y; m++) { - var x = v[m];f[x] = i(x); - }var b = {}, - w = p.pEventTypes;a.PointerEvent ? (b[w.down] = f.pointerDown, b[w.move] = f.pointerMove, b[w.up] = f.pointerUp, b[w.cancel] = f.pointerUp) : (b.mousedown = f.pointerDown, b.mousemove = f.pointerMove, b.mouseup = f.pointerUp, b.touchstart = f.pointerDown, b.touchmove = f.pointerMove, b.touchend = f.pointerUp, b.touchcancel = f.pointerUp), b.blur = o, d.on("update-pointer-down", function (e) { - var t = e.interaction, - n = e.pointer, - r = e.pointerId, - i = e.pointerIndex, - o = e.event, - s = e.eventTarget, - a = e.down;t.pointerIds[i] = r, t.pointers[i] = n, a && (t.pointerIsDown = !0), t.interacting() || (l.setCoords(t.startCoords, t.pointers), l.copyCoords(t.curCoords, t.startCoords), l.copyCoords(t.prevCoords, t.startCoords), t.downEvent = o, t.downTimes[i] = t.curCoords.timeStamp, t.downTargets[i] = s || o && l.getEventTargets(o)[0], t.pointerWasMoved = !1, l.pointerExtend(t.downPointer, n)); - }), a.signals.on("add-document", s), a.signals.on("remove-document", s), h.pointerMoveTolerance = 1, h.doOnInteractions = i, h.endAll = o, h.signals = d, h.docEvents = b, a.endAllInteractions = o, t.exports = h; - }, { "./scope": 31, "./utils": 41, "./utils/Signals": 32, "./utils/browser": 34, "./utils/events": 37, "./utils/interactionFinder": 42 }], 6: [function (e, t, n) { - "use strict"; - function r(e, t, n, r) { - var i = e.prepared.name, - s = new o(e, t, i, n, e.element, null, r);e.target.fire(s), e.prevEvent = s; - }var i = e("../Interaction"), - o = e("../InteractEvent"), - s = { firePrepared: r, names: [], methodDict: {} };i.signals.on("action-start", function (e) { - var t = e.interaction;r(t, e.event, "start"), t._interacting = !0; - }), i.signals.on("action-move", function (e) { - var t = e.interaction;if (r(t, e.event, "move", e.preEnd), !t.interacting()) return !1; - }), i.signals.on("action-end", function (e) { - r(e.interaction, e.event, "end"); - }), t.exports = s; - }, { "../InteractEvent": 3, "../Interaction": 5 }], 7: [function (e, t, n) { - "use strict"; - var r = e("./base"), - i = e("../utils"), - o = e("../InteractEvent"), - s = e("../Interactable"), - a = e("../Interaction"), - l = e("../defaultOptions"), - c = { defaults: { enabled: !1, mouseButtons: null, origin: null, snap: null, restrict: null, inertia: null, autoScroll: null, startAxis: "xy", lockAxis: "xy" }, checker: function checker(e, t, n) { - var r = n.options.drag;return r.enabled ? { name: "drag", axis: "start" === r.lockAxis ? r.startAxis : r.lockAxis } : null; - }, getCursor: function getCursor() { - return "move"; - } };a.signals.on("before-action-move", function (e) { - var t = e.interaction;if ("drag" === t.prepared.name) { - var n = t.prepared.axis;"x" === n ? (t.curCoords.page.y = t.startCoords.page.y, t.curCoords.client.y = t.startCoords.client.y, t.pointerDelta.page.speed = Math.abs(t.pointerDelta.page.vx), t.pointerDelta.client.speed = Math.abs(t.pointerDelta.client.vx), t.pointerDelta.client.vy = 0, t.pointerDelta.page.vy = 0) : "y" === n && (t.curCoords.page.x = t.startCoords.page.x, t.curCoords.client.x = t.startCoords.client.x, t.pointerDelta.page.speed = Math.abs(t.pointerDelta.page.vy), t.pointerDelta.client.speed = Math.abs(t.pointerDelta.client.vy), t.pointerDelta.client.vx = 0, t.pointerDelta.page.vx = 0); - } - }), o.signals.on("new", function (e) { - var t = e.iEvent, - n = e.interaction;if ("dragmove" === t.type) { - var r = n.prepared.axis;"x" === r ? (t.pageY = n.startCoords.page.y, t.clientY = n.startCoords.client.y, t.dy = 0) : "y" === r && (t.pageX = n.startCoords.page.x, t.clientX = n.startCoords.client.x, t.dx = 0); - } - }), s.prototype.draggable = function (e) { - return i.is.object(e) ? (this.options.drag.enabled = e.enabled !== !1, this.setPerAction("drag", e), this.setOnEvents("drag", e), /^(xy|x|y|start)$/.test(e.lockAxis) && (this.options.drag.lockAxis = e.lockAxis), /^(xy|x|y)$/.test(e.startAxis) && (this.options.drag.startAxis = e.startAxis), this) : i.is.bool(e) ? (this.options.drag.enabled = e, e || (this.ondragstart = this.ondragstart = this.ondragend = null), this) : this.options.drag; - }, r.drag = c, r.names.push("drag"), i.merge(s.eventTypes, ["dragstart", "dragmove", "draginertiastart", "draginertiaresume", "dragend"]), r.methodDict.drag = "draggable", l.drag = c.defaults, t.exports = c; - }, { "../InteractEvent": 3, "../Interactable": 4, "../Interaction": 5, "../defaultOptions": 18, "../utils": 41, "./base": 6 }], 8: [function (e, t, n) { - "use strict"; - function r(e, t) { - var n = [], - r = [];t = t || e.element;for (var i = u.interactables, o = Array.isArray(i), s = 0, i = o ? i : i[Symbol.iterator]();;) { - var a;if (o) { - if (s >= i.length) break;a = i[s++]; - } else { - if (s = i.next(), s.done) break;a = s.value; - }var l = a;if (l.options.drop.enabled) { - var c = l.options.drop.accept;if (!(p.is.element(c) && c !== t || p.is.string(c) && !p.matchesSelector(t, c))) for (var d = p.is.string(l.target) ? l._context.querySelectorAll(l.target) : [l.target], f = 0; f < d.length; f++) { - var v = d[f];v !== t && (n.push(l), r.push(v)); - } - } - }return { elements: r, dropzones: n }; - }function i(e, t) { - for (var n = void 0, r = 0; r < e.activeDrops.dropzones.length; r++) { - var i = e.activeDrops.dropzones[r], - o = e.activeDrops.elements[r];o !== n && (t.target = o, i.fire(t)), n = o; - } - }function o(e, t) { - var n = r(e, t, !0);e.activeDrops.dropzones = n.dropzones, e.activeDrops.elements = n.elements, e.activeDrops.rects = [];for (var i = 0; i < e.activeDrops.dropzones.length; i++) { - e.activeDrops.rects[i] = e.activeDrops.dropzones[i].getRect(e.activeDrops.elements[i]); - } - }function s(e, t, n) { - var r = e.interaction, - i = [];y && o(r, n);for (var s = 0; s < r.activeDrops.dropzones.length; s++) { - var a = r.activeDrops.dropzones[s], - l = r.activeDrops.elements[s], - c = r.activeDrops.rects[s];i.push(a.dropCheck(e, t, r.target, n, l, c) ? l : null); - }var u = p.indexOfDeepestElement(i);return { dropzone: r.activeDrops.dropzones[u] || null, element: r.activeDrops.elements[u] || null }; - }function a(e, t, n) { - var r = { enter: null, leave: null, activate: null, deactivate: null, move: null, drop: null }, - i = { dragEvent: n, interaction: e, target: e.dropElement, dropzone: e.dropTarget, relatedTarget: n.target, draggable: n.interactable, timeStamp: n.timeStamp };return e.dropElement !== e.prevDropElement && (e.prevDropTarget && (r.leave = p.extend({ type: "dragleave" }, i), n.dragLeave = r.leave.target = e.prevDropElement, n.prevDropzone = r.leave.dropzone = e.prevDropTarget), e.dropTarget && (r.enter = { dragEvent: n, interaction: e, target: e.dropElement, dropzone: e.dropTarget, relatedTarget: n.target, draggable: n.interactable, timeStamp: n.timeStamp, type: "dragenter" }, n.dragEnter = e.dropElement, n.dropzone = e.dropTarget)), "dragend" === n.type && e.dropTarget && (r.drop = p.extend({ type: "drop" }, i), n.dropzone = e.dropTarget, n.relatedTarget = e.dropElement), "dragstart" === n.type && (r.activate = p.extend({ type: "dropactivate" }, i), r.activate.target = null, r.activate.dropzone = null), "dragend" === n.type && (r.deactivate = p.extend({ type: "dropdeactivate" }, i), r.deactivate.target = null, r.deactivate.dropzone = null), "dragmove" === n.type && e.dropTarget && (r.move = p.extend({ dragmove: n, type: "dropmove" }, i), n.dropzone = e.dropTarget), r; - }function l(e, t) { - t.leave && e.prevDropTarget.fire(t.leave), t.move && e.dropTarget.fire(t.move), t.enter && e.dropTarget.fire(t.enter), t.drop && e.dropTarget.fire(t.drop), t.move && e.dropTarget.fire(t.move), t.deactivate && i(e, t.deactivate), e.prevDropTarget = e.dropTarget, e.prevDropElement = e.dropElement; - }var c = e("./base"), - p = e("../utils"), - u = e("../scope"), - d = e("../interact"), - f = e("../InteractEvent"), - v = e("../Interactable"), - g = e("../Interaction"), - h = e("../defaultOptions"), - m = { defaults: { enabled: !1, accept: null, overlap: "pointer" } }, - y = !1;g.signals.on("action-start", function (e) { - var t = e.interaction, - n = e.event;if ("drag" === t.prepared.name) { - t.activeDrops.dropzones = [], t.activeDrops.elements = [], t.activeDrops.rects = [], t.dropEvents = null, t.dynamicDrop || o(t, t.element);var r = t.prevEvent, - s = a(t, n, r);s.activate && i(t, s.activate); - } - }), f.signals.on("new", function (e) { - var t = e.interaction, - n = e.iEvent, - r = e.event;if ("dragmove" === n.type || "dragend" === n.type) { - var i = t.element, - o = n, - l = s(o, r, i);t.dropTarget = l.dropzone, t.dropElement = l.element, t.dropEvents = a(t, r, o); + return -1; +} + +function contains(array, target) { + return indexOf(array, target) !== -1; +} + +function merge(target, source) { + for (var i = 0; i < source.length; i++) { + target.push(source[i]); + } + + return target; +} + +function filter(array, test) { + var result = []; + + for (var i = 0; i < array.length; i++) { + if (test(array[i])) { + result.push(array[i]); + } + } + + return result; +} + +module.exports = { + indexOf: indexOf, + contains: contains, + merge: merge, + filter: filter +}; + +},{}],37:[function(require,module,exports){ +'use strict'; + +var _require = require('./window'), + window = _require.window; + +var is = require('./is'); +var domObjects = require('./domObjects'); + +var Element = domObjects.Element; +var navigator = window.navigator; + +var browser = { + // Does the browser support touch input? + supportsTouch: !!('ontouchstart' in window || is.function(window.DocumentTouch) && domObjects.document instanceof window.DocumentTouch), + + // Does the browser support PointerEvents + supportsPointerEvent: !!domObjects.PointerEvent, + + isIE8: 'attachEvent' in window && !('addEventListener' in window), + + // Opera Mobile must be handled differently + isOperaMobile: navigator.appName === 'Opera' && browser.supportsTouch && navigator.userAgent.match('Presto'), + + // scrolling doesn't change the result of getClientRects on iOS 7 + isIOS7: /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion), + + isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent), + + // prefix matchesSelector + prefixedMatchesSelector: 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector', + + useMatchesSelectorPolyfill: false, + + pEventTypes: domObjects.PointerEvent ? domObjects.PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null, + + // because Webkit and Opera still use 'mousewheel' event type + wheelEvent: 'onmousewheel' in domObjects.document ? 'mousewheel' : 'wheel' + +}; + +browser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]); + +module.exports = browser; + +},{"./domObjects":38,"./is":46,"./window":52}],38:[function(require,module,exports){ +'use strict'; + +var domObjects = {}; +var win = require('./window').window; + +function blank() {} + +domObjects.document = win.document; +domObjects.DocumentFragment = win.DocumentFragment || blank; +domObjects.SVGElement = win.SVGElement || blank; +domObjects.SVGSVGElement = win.SVGSVGElement || blank; +domObjects.SVGElementInstance = win.SVGElementInstance || blank; +domObjects.Element = win.Element || blank; +domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + +domObjects.Event = win.Event; +domObjects.Touch = win.Touch || blank; +domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; + +module.exports = domObjects; + +},{"./window":52}],39:[function(require,module,exports){ +'use strict'; + +var win = require('./window'); +var browser = require('./browser'); +var is = require('./is'); +var domObjects = require('./domObjects'); + +var domUtils = { + nodeContains: function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } + + child = child.parentNode; + } + + return false; + }, + + closest: function closest(element, selector) { + while (is.element(element)) { + if (domUtils.matchesSelector(element, selector)) { + return element; + } + + element = domUtils.parentNode(element); + } + + return null; + }, + + parentNode: function parentNode(node) { + var parent = node.parentNode; + + if (is.docFrag(parent)) { + // skip past #shado-root fragments + while ((parent = parent.host) && is.docFrag(parent)) { + continue; + } + + return parent; + } + + return parent; + }, + + // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified + matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill ? function (element, selector, elems) { + elems = elems || element.parentNode.querySelectorAll(selector); + + for (var i = 0, len = elems.length; i < len; i++) { + if (elems[i] === element) { + return true; + } + } + + return false; + } : null, + + matchesSelector: function matchesSelector(element, selector, nodeList) { + if (browser.useMatchesSelectorPolyfill) { + return domUtils.matchesSelectorPolyfill(element, selector, nodeList); + } + + // remove /deep/ from selectors if shadowDOM polyfill is used + if (win.window !== win.realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } + + return element[browser.prefixedMatchesSelector](selector); + }, + + // Test for the element that's "above" all other qualifiers + indexOfDeepestElement: function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var dropzoneParents = []; + var dropzone = void 0; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var parent = void 0; + var child = void 0; + var i = void 0; + var n = void 0; + + for (i = 1; i < elements.length; i++) { + dropzone = elements[i]; + + // an element might belong to multiple selector dropzones + if (!dropzone || dropzone === deepestZone) { + continue; + } + + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } + + // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } + // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; } - }), g.signals.on("action-move", function (e) { - var t = e.interaction;"drag" === t.prepared.name && l(t, t.dropEvents); - }), g.signals.on("action-end", function (e) { - var t = e.interaction;"drag" === t.prepared.name && l(t, t.dropEvents); - }), g.signals.on("stop-drag", function (e) { - var t = e.interaction;t.activeDrops.dropzones = t.activeDrops.elements = t.activeDrops.rects = t.dropEvents = null; - }), v.prototype.dropzone = function (e) { - return p.is.object(e) ? (this.options.drop.enabled = e.enabled !== !1, p.is.function(e.ondrop) && (this.events.ondrop = e.ondrop), p.is.function(e.ondropactivate) && (this.events.ondropactivate = e.ondropactivate), p.is.function(e.ondropdeactivate) && (this.events.ondropdeactivate = e.ondropdeactivate), p.is.function(e.ondragenter) && (this.events.ondragenter = e.ondragenter), p.is.function(e.ondragleave) && (this.events.ondragleave = e.ondragleave), p.is.function(e.ondropmove) && (this.events.ondropmove = e.ondropmove), /^(pointer|center)$/.test(e.overlap) ? this.options.drop.overlap = e.overlap : p.is.number(e.overlap) && (this.options.drop.overlap = Math.max(Math.min(1, e.overlap), 0)), "accept" in e && (this.options.drop.accept = e.accept), "checker" in e && (this.options.drop.checker = e.checker), this) : p.is.bool(e) ? (this.options.drop.enabled = e, e || (this.ondragenter = this.ondragleave = this.ondrop = this.ondropactivate = this.ondropdeactivate = null), this) : this.options.drop; - }, v.prototype.dropCheck = function (e, t, n, r, i, o) { - var s = !1;if (!(o = o || this.getRect(i))) return !!this.options.drop.checker && this.options.drop.checker(e, t, s, this, i, n, r);var a = this.options.drop.overlap;if ("pointer" === a) { - var l = p.getOriginXY(n, r, "drag"), - c = p.getPageXY(e);c.x += l.x, c.y += l.y;var u = c.x > o.left && c.x < o.right, - d = c.y > o.top && c.y < o.bottom;s = u && d; - }var f = n.getRect(r);if (f && "center" === a) { - var v = f.left + f.width / 2, - g = f.top + f.height / 2;s = v >= o.left && v <= o.right && g >= o.top && g <= o.bottom; - }if (f && p.is.number(a)) { - s = Math.max(0, Math.min(o.right, f.right) - Math.max(o.left, f.left)) * Math.max(0, Math.min(o.bottom, f.bottom) - Math.max(o.top, f.top)) / (f.width * f.height) >= a; - }return this.options.drop.checker && (s = this.options.drop.checker(e, t, s, this, i, n, r)), s; - }, v.signals.on("unset", function (e) { - e.interactable.dropzone(!1); - }), v.settingsMethods.push("dropChecker"), g.signals.on("new", function (e) { - e.dropTarget = null, e.dropElement = null, e.prevDropTarget = null, e.prevDropElement = null, e.dropEvents = null, e.activeDrops = { dropzones: [], elements: [], rects: [] }; - }), g.signals.on("stop", function (e) { - var t = e.interaction;t.dropTarget = t.dropElement = t.prevDropTarget = t.prevDropElement = null; - }), d.dynamicDrop = function (e) { - return p.is.bool(e) ? (y = e, d) : y; - }, p.merge(v.eventTypes, ["dragenter", "dragleave", "dropactivate", "dropdeactivate", "dropmove", "drop"]), c.methodDict.drop = "dropzone", h.drop = m.defaults, t.exports = m; - }, { "../InteractEvent": 3, "../Interactable": 4, "../Interaction": 5, "../defaultOptions": 18, "../interact": 21, "../scope": 31, "../utils": 41, "./base": 6 }], 9: [function (e, t, n) { - "use strict"; - var r = e("./base"), - i = e("../utils"), - o = e("../InteractEvent"), - s = e("../Interactable"), - a = e("../Interaction"), - l = e("../defaultOptions"), - c = { defaults: { enabled: !1, origin: null, restrict: null }, checker: function checker(e, t, n, r, i) { - return i.pointerIds.length >= 2 ? { name: "gesture" } : null; - }, getCursor: function getCursor() { - return ""; - } };o.signals.on("new", function (e) { - var t = e.iEvent, - n = e.interaction;"gesturestart" === t.type && (t.ds = 0, n.gesture.startDistance = n.gesture.prevDistance = t.distance, n.gesture.startAngle = n.gesture.prevAngle = t.angle, n.gesture.scale = 1); - }), o.signals.on("new", function (e) { - var t = e.iEvent, - n = e.interaction;"gesturemove" === t.type && (t.ds = t.scale - n.gesture.scale, n.target.fire(t), n.gesture.prevAngle = t.angle, n.gesture.prevDistance = t.distance, t.scale === 1 / 0 || null === t.scale || void 0 === t.scale || isNaN(t.scale) || (n.gesture.scale = t.scale)); - }), s.prototype.gesturable = function (e) { - return i.is.object(e) ? (this.options.gesture.enabled = e.enabled !== !1, this.setPerAction("gesture", e), this.setOnEvents("gesture", e), this) : i.is.bool(e) ? (this.options.gesture.enabled = e, e || (this.ongesturestart = this.ongesturestart = this.ongestureend = null), this) : this.options.gesture; - }, o.signals.on("set-delta", function (e) { - var t = e.interaction, - n = e.iEvent, - r = e.action, - s = e.event, - a = e.starting, - l = e.ending, - c = e.deltaSource;if ("gesture" === r) { - var p = t.pointers;n.touches = [p[0], p[1]], a ? (n.distance = i.touchDistance(p, c), n.box = i.touchBBox(p), n.scale = 1, n.ds = 0, n.angle = i.touchAngle(p, void 0, c), n.da = 0) : l || s instanceof o ? (n.distance = t.prevEvent.distance, n.box = t.prevEvent.box, n.scale = t.prevEvent.scale, n.ds = n.scale - 1, n.angle = t.prevEvent.angle, n.da = n.angle - t.gesture.startAngle) : (n.distance = i.touchDistance(p, c), n.box = i.touchBBox(p), n.scale = n.distance / t.gesture.startDistance, n.angle = i.touchAngle(p, t.gesture.prevAngle, c), n.ds = n.scale - t.gesture.prevScale, n.da = n.angle - t.gesture.prevAngle); + + if (!deepestZoneParents.length) { + parent = deepestZone; + while (parent.parentNode && parent.parentNode !== parent.ownerDocument) { + deepestZoneParents.unshift(parent); + parent = parent.parentNode; } - }), a.signals.on("new", function (e) { - e.gesture = { start: { x: 0, y: 0 }, startDistance: 0, prevDistance: 0, distance: 0, scale: 1, startAngle: 0, prevAngle: 0 }; - }), r.gesture = c, r.names.push("gesture"), i.merge(s.eventTypes, ["gesturestart", "gesturemove", "gestureend"]), r.methodDict.gesture = "gesturable", l.gesture = c.defaults, t.exports = c; - }, { "../InteractEvent": 3, "../Interactable": 4, "../Interaction": 5, "../defaultOptions": 18, "../utils": 41, "./base": 6 }], 10: [function (e, t, n) { - "use strict"; - function r(e, t, n, r, i, s, a) { - if (!t) return !1;if (t === !0) { - var l = o.is.number(s.width) ? s.width : s.right - s.left, - c = o.is.number(s.height) ? s.height : s.bottom - s.top;if (l < 0 && ("left" === e ? e = "right" : "right" === e && (e = "left")), c < 0 && ("top" === e ? e = "bottom" : "bottom" === e && (e = "top")), "left" === e) return n.x < (l >= 0 ? s.left : s.right) + a;if ("top" === e) return n.y < (c >= 0 ? s.top : s.bottom) + a;if ("right" === e) return n.x > (l >= 0 ? s.right : s.left) - a;if ("bottom" === e) return n.y > (c >= 0 ? s.bottom : s.top) - a; - }return !!o.is.element(r) && (o.is.element(t) ? t === r : o.matchesUpTo(r, t, i)); - }var i = e("./base"), - o = e("../utils"), - s = e("../utils/browser"), - a = e("../InteractEvent"), - l = e("../Interactable"), - c = e("../Interaction"), - p = e("../defaultOptions"), - u = s.supportsTouch || s.supportsPointerEvent ? 20 : 10, - d = { defaults: { enabled: !1, mouseButtons: null, origin: null, snap: null, restrict: null, inertia: null, autoScroll: null, square: !1, preserveAspectRatio: !1, axis: "xy", margin: NaN, edges: null, invert: "none" }, checker: function checker(e, t, n, i, s, a) { - if (!a) return null;var l = o.extend({}, s.curCoords.page), - c = n.options;if (c.resize.enabled) { - var p = c.resize, - d = { left: !1, right: !1, top: !1, bottom: !1 };if (o.is.object(p.edges)) { - for (var f in d) { - d[f] = r(f, p.edges[f], l, s._eventTarget, i, a, p.margin || u); - }if (d.left = d.left && !d.right, d.top = d.top && !d.bottom, d.left || d.right || d.top || d.bottom) return { name: "resize", edges: d }; - } else { - var v = "y" !== c.resize.axis && l.x > a.right - u, - g = "x" !== c.resize.axis && l.y > a.bottom - u;if (v || g) return { name: "resize", axes: (v ? "x" : "") + (g ? "y" : "") }; - } - }return null; - }, cursors: s.isIe9OrOlder ? { x: "e-resize", y: "s-resize", xy: "se-resize", top: "n-resize", left: "w-resize", bottom: "s-resize", right: "e-resize", topleft: "se-resize", bottomright: "se-resize", topright: "ne-resize", bottomleft: "ne-resize" } : { x: "ew-resize", y: "ns-resize", xy: "nwse-resize", top: "ns-resize", left: "ew-resize", bottom: "ns-resize", right: "ew-resize", topleft: "nwse-resize", bottomright: "nwse-resize", topright: "nesw-resize", bottomleft: "nesw-resize" }, getCursor: function getCursor(e) { - if (e.axis) return d.cursors[e.name + e.axis];if (e.edges) { - for (var t = "", n = ["top", "bottom", "left", "right"], r = 0; r < 4; r++) { - e.edges[n[r]] && (t += n[r]); - }return d.cursors[t]; - } - } };a.signals.on("new", function (e) { - var t = e.iEvent, - n = e.interaction;if ("resizestart" === t.type && n.prepared.edges) { - var r = n.target.getRect(n.element), - i = n.target.options.resize;if (i.square || i.preserveAspectRatio) { - var s = o.extend({}, n.prepared.edges);s.top = s.top || s.left && !s.bottom, s.left = s.left || s.top && !s.right, s.bottom = s.bottom || s.right && !s.top, s.right = s.right || s.bottom && !s.left, n.prepared._linkedEdges = s; - } else n.prepared._linkedEdges = null;i.preserveAspectRatio && (n.resizeStartAspectRatio = r.width / r.height), n.resizeRects = { start: r, current: o.extend({}, r), restricted: o.extend({}, r), previous: o.extend({}, r), delta: { left: 0, right: 0, width: 0, top: 0, bottom: 0, height: 0 } }, t.rect = n.resizeRects.restricted, t.deltaRect = n.resizeRects.delta; + } + + // if this element is an svg element and the current deepest is + // an HTMLElement + if (deepestZone instanceof domObjects.HTMLElement && dropzone instanceof domObjects.SVGElement && !(dropzone instanceof domObjects.SVGSVGElement)) { + + if (dropzone === deepestZone.parentNode) { + continue; } - }), a.signals.on("new", function (e) { - var t = e.iEvent, - n = e.phase, - r = e.interaction;if ("move" === n && r.prepared.edges) { - var i = r.target.options.resize, - s = i.invert, - a = "reposition" === s || "negate" === s, - l = r.prepared.edges, - c = r.resizeRects.start, - p = r.resizeRects.current, - u = r.resizeRects.restricted, - d = r.resizeRects.delta, - f = o.extend(r.resizeRects.previous, u), - v = l, - g = t.dx, - h = t.dy;if (i.preserveAspectRatio || i.square) { - var m = i.preserveAspectRatio ? r.resizeStartAspectRatio : 1;l = r.prepared._linkedEdges, v.left && v.bottom || v.right && v.top ? h = -g / m : v.left || v.right ? h = g / m : (v.top || v.bottom) && (g = h * m); - }if (l.top && (p.top += h), l.bottom && (p.bottom += h), l.left && (p.left += g), l.right && (p.right += g), a) { - if (o.extend(u, p), "reposition" === s) { - var y = void 0;u.top > u.bottom && (y = u.top, u.top = u.bottom, u.bottom = y), u.left > u.right && (y = u.left, u.left = u.right, u.right = y); - } - } else u.top = Math.min(p.top, c.bottom), u.bottom = Math.max(p.bottom, c.top), u.left = Math.min(p.left, c.right), u.right = Math.max(p.right, c.left);u.width = u.right - u.left, u.height = u.bottom - u.top;for (var x in u) { - d[x] = u[x] - f[x]; - }t.edges = r.prepared.edges, t.rect = u, t.deltaRect = d; + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } + + dropzoneParents = []; + + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = parent.parentNode; + } + + n = 0; + + // get (position of last common ancestor) + 1 + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } + + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + + child = parents[0].lastChild; + + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = []; + + break; + } else if (child === parents[2]) { + break; } - }), l.prototype.resizable = function (e) { - return o.is.object(e) ? (this.options.resize.enabled = e.enabled !== !1, this.setPerAction("resize", e), this.setOnEvents("resize", e), /^x$|^y$|^xy$/.test(e.axis) ? this.options.resize.axis = e.axis : null === e.axis && (this.options.resize.axis = p.resize.axis), o.is.bool(e.preserveAspectRatio) ? this.options.resize.preserveAspectRatio = e.preserveAspectRatio : o.is.bool(e.square) && (this.options.resize.square = e.square), this) : o.is.bool(e) ? (this.options.resize.enabled = e, e || (this.onresizestart = this.onresizestart = this.onresizeend = null), this) : this.options.resize; - }, c.signals.on("new", function (e) { - e.resizeAxes = "xy"; - }), a.signals.on("set-delta", function (e) { - var t = e.interaction, - n = e.iEvent;"resize" === e.action && t.resizeAxes && (t.target.options.resize.square ? ("y" === t.resizeAxes ? n.dx = n.dy : n.dy = n.dx, n.axes = "xy") : (n.axes = t.resizeAxes, "x" === t.resizeAxes ? n.dy = 0 : "y" === t.resizeAxes && (n.dx = 0))); - }), i.resize = d, i.names.push("resize"), o.merge(l.eventTypes, ["resizestart", "resizemove", "resizeinertiastart", "resizeinertiaresume", "resizeend"]), i.methodDict.resize = "resizable", p.resize = d.defaults, t.exports = d; - }, { "../InteractEvent": 3, "../Interactable": 4, "../Interaction": 5, "../defaultOptions": 18, "../utils": 41, "../utils/browser": 34, "./base": 6 }], 11: [function (e, t, n) { - "use strict"; - var r = e("./utils/raf"), - i = e("./utils/window").getWindow, - o = e("./utils/is"), - s = e("./utils/domUtils"), - a = e("./Interaction"), - l = e("./defaultOptions"), - c = { defaults: { enabled: !1, container: null, margin: 60, speed: 300 }, interaction: null, i: null, x: 0, y: 0, isScrolling: !1, prevTime: 0, start: function start(e) { - c.isScrolling = !0, r.cancel(c.i), c.interaction = e, c.prevTime = new Date().getTime(), c.i = r.request(c.scroll); - }, stop: function stop() { - c.isScrolling = !1, r.cancel(c.i); - }, scroll: function scroll() { - var e = c.interaction.target.options[c.interaction.prepared.name].autoScroll, - t = e.container || i(c.interaction.element), - n = new Date().getTime(), - s = (n - c.prevTime) / 1e3, - a = e.speed * s;a >= 1 && (o.window(t) ? t.scrollBy(c.x * a, c.y * a) : t && (t.scrollLeft += c.x * a, t.scrollTop += c.y * a), c.prevTime = n), c.isScrolling && (r.cancel(c.i), c.i = r.request(c.scroll)); - }, check: function check(e, t) { - var n = e.options;return n[t].autoScroll && n[t].autoScroll.enabled; - }, onInteractionMove: function onInteractionMove(e) { - var t = e.interaction, - n = e.pointer;if (t.interacting() && c.check(t.target, t.prepared.name)) { - if (t.simulation) return void (c.x = c.y = 0);var r = void 0, - a = void 0, - l = void 0, - p = void 0, - u = t.target.options[t.prepared.name].autoScroll, - d = u.container || i(t.element);if (o.window(d)) p = n.clientX < c.margin, r = n.clientY < c.margin, a = n.clientX > d.innerWidth - c.margin, l = n.clientY > d.innerHeight - c.margin;else { - var f = s.getElementClientRect(d);p = n.clientX < f.left + c.margin, r = n.clientY < f.top + c.margin, a = n.clientX > f.right - c.margin, l = n.clientY > f.bottom - c.margin; - }c.x = a ? 1 : p ? -1 : 0, c.y = l ? 1 : r ? -1 : 0, c.isScrolling || (c.margin = u.margin, c.speed = u.speed, c.start(t)); + + child = child.previousSibling; + } + } + + return index; + }, + + matchesUpTo: function matchesUpTo(element, selector, limit) { + while (is.element(element)) { + if (domUtils.matchesSelector(element, selector)) { + return true; + } + + element = domUtils.parentNode(element); + + if (element === limit) { + return domUtils.matchesSelector(element, selector); + } + } + + return false; + }, + + getActualElement: function getActualElement(element) { + return element instanceof domObjects.SVGElementInstance ? element.correspondingUseElement : element; + }, + + getScrollXY: function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || win.window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; + }, + + getElementClientRect: function getElementClientRect(element) { + var clientRect = element instanceof domObjects.SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; + }, + + getElementRect: function getElementRect(element) { + var clientRect = domUtils.getElementClientRect(element); + + if (!browser.isIOS7 && clientRect) { + var scroll = domUtils.getScrollXY(win.getWindow(element)); + + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } + + return clientRect; + }, + + getPath: function getPath(element) { + var path = []; + + while (element) { + path.push(element); + element = domUtils.parentNode(element); + } + + return path; + }, + + trySelector: function trySelector(value) { + if (!is.string(value)) { + return false; + } + + // an exception will be raised if it is invalid + domObjects.document.querySelector(value); + return true; + } +}; + +module.exports = domUtils; + +},{"./browser":37,"./domObjects":38,"./is":46,"./window":52}],40:[function(require,module,exports){ +'use strict'; + +var is = require('./is'); +var domUtils = require('./domUtils'); +var pExtend = require('./pointerExtend'); + +var _require = require('./window'), + window = _require.window, + getWindow = _require.getWindow; + +var _require2 = require('./arr'), + indexOf = _require2.indexOf, + contains = _require2.contains; + +var useAttachEvent = 'attachEvent' in window && !('addEventListener' in window); +var addEvent = useAttachEvent ? 'attachEvent' : 'addEventListener'; +var removeEvent = useAttachEvent ? 'detachEvent' : 'removeEventListener'; +var on = useAttachEvent ? 'on' : ''; + +var elements = []; +var targets = []; +var attachedListeners = []; + +// { +// type: { +// selectors: ['selector', ...], +// contexts : [document, ...], +// listeners: [[listener, capture, passive], ...] +// } +// } +var delegatedEvents = {}; + +var documents = []; + +var supportsOptions = !useAttachEvent && function () { + var supported = false; + + window.document.createElement('div').addEventListener('test', null, { + get capture() { + supported = true; + } + }); + + return supported; +}(); + +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = indexOf(elements, element); + var target = targets[elementIndex]; + + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + + elementIndex = elements.push(element) - 1; + targets.push(target); + + attachedListeners.push(useAttachEvent ? { + supplied: [], + wrapped: [], + useCount: [] + } : null); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (!contains(target.events[type], listener)) { + var ret = void 0; + + if (useAttachEvent) { + var _attachedListeners$el = attachedListeners[elementIndex], + supplied = _attachedListeners$el.supplied, + wrapped = _attachedListeners$el.wrapped, + useCount = _attachedListeners$el.useCount; + + var listenerIndex = indexOf(supplied, listener); + + var wrappedListener = wrapped[listenerIndex] || function (event) { + if (!event.immediatePropagationStopped) { + event.target = event.srcElement; + event.currentTarget = element; + + event.preventDefault = event.preventDefault || preventDef; + event.stopPropagation = event.stopPropagation || stopProp; + event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp; + + if (/mouse|click/.test(event.type)) { + event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft; + event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop; } - } };a.signals.on("stop-active", function () { - c.stop(); - }), a.signals.on("action-move", c.onInteractionMove), l.perAction.autoScroll = c.defaults, t.exports = c; - }, { "./Interaction": 5, "./defaultOptions": 18, "./utils/domUtils": 36, "./utils/is": 43, "./utils/raf": 47, "./utils/window": 48 }], 12: [function (e, t, n) { - "use strict"; - var r = e("../Interactable"), - i = e("../actions/base"), - o = e("../utils/is"), - s = e("../utils/domUtils");r.prototype.getAction = function (e, t, n, r) { - var i = this.defaultActionChecker(e, t, n, r);return this.options.actionChecker ? this.options.actionChecker(e, t, i, this, r, n) : i; - }, r.prototype.ignoreFrom = function (e) { - return this._backCompatOption("ignoreFrom", e); - }, r.prototype.allowFrom = function (e) { - return this._backCompatOption("allowFrom", e); - }, r.prototype.testIgnore = function (e, t, n) { - return !(!e || !o.element(n)) && (o.string(e) ? s.matchesUpTo(n, e, t) : !!o.element(e) && s.nodeContains(e, n)); - }, r.prototype.testAllow = function (e, t, n) { - return !e || !!o.element(n) && (o.string(e) ? s.matchesUpTo(n, e, t) : !!o.element(e) && s.nodeContains(e, n)); - }, r.prototype.testIgnoreAllow = function (e, t, n) { - return !this.testIgnore(e.ignoreFrom, t, n) && this.testAllow(e.allowFrom, t, n); - }, r.prototype.actionChecker = function (e) { - return o.function(e) ? (this.options.actionChecker = e, this) : null === e ? (delete this.options.actionChecker, this) : this.options.actionChecker; - }, r.prototype.styleCursor = function (e) { - return o.bool(e) ? (this.options.styleCursor = e, this) : null === e ? (delete this.options.styleCursor, this) : this.options.styleCursor; - }, r.prototype.defaultActionChecker = function (e, t, n, r) { - for (var o = this.getRect(r), s = null, a = i.names, l = Array.isArray(a), c = 0, a = l ? a : a[Symbol.iterator]();;) { - var p;if (l) { - if (c >= a.length) break;p = a[c++]; - } else { - if (c = a.next(), c.done) break;p = c.value; - }var u = p;if ((!n.pointerIsDown || !n.mouse || 0 != (t.buttons & this.options[u].mouseButtons)) && (s = i[u].checker(e, t, this, r, n, o))) return s; + + listener(event); } }; - }, { "../Interactable": 4, "../actions/base": 6, "../utils/domUtils": 36, "../utils/is": 43 }], 13: [function (e, t, n) { - "use strict"; - function r(e, t, n, r) { - return g.is.object(e) && t.testIgnoreAllow(t.options[e.name], n, r) && t.options[e.name].enabled && a(t, n, e) ? e : null; - }function i(e, t, n, i, o, s) { - for (var a = 0, l = i.length; a < l; a++) { - var c = i[a], - p = o[a], - u = r(c.getAction(t, n, e, p), c, p, s);if (u) return { action: u, target: c, element: p }; - }return {}; - }function o(e, t, n, o) { - function s(e, t, n) { - var r = f.useMatchesSelectorPolyfill ? n.querySelectorAll(t) : void 0;g.matchesSelector(c, t, r) && (a.push(e), l.push(c)); - }for (var a = [], l = [], c = o, p = null; g.is.element(c);) { - a = [], l = [];var u = v.interactables.get(c);if (u && (p = r(u.getAction(t, n, e, c, o), u, c, o)) && !u.options[p.name].manualStart) return { element: c, action: p, target: u };v.interactables.forEachSelector(s, c);var d = i(e, t, n, a, l, o);if (d.action && !d.target.options[d.action.name].manualStart) return d;c = g.parentNode(c); - }return {}; - }function s(e, t) { - var n = t.action, - r = t.target, - i = t.element;if (n = n || {}, e.target && e.target.options.styleCursor && (e.target._doc.documentElement.style.cursor = ""), e.target = r, e.element = i, g.copyAction(e.prepared, n), r && r.options.styleCursor) { - var o = n ? u[n.name].getCursor(n) : "";e.target._doc.documentElement.style.cursor = o; - }h.fire("prepared", { interaction: e }); - }function a(e, t, n) { - var r = e.options, - i = r[n.name].max, - o = r[n.name].maxPerElement, - s = 0, - a = 0, - l = 0;if (i && o && m.maxInteractions) { - for (var c = 0, p = v.interactions.length; c < p; c++) { - var u = v.interactions[c], - d = u.prepared.name;if (u.interacting()) { - if (++s >= m.maxInteractions) return !1;if (u.target === e) { - if ((a += d === n.name | 0) >= i) return !1;if (u.element === t && (l++, d !== n.name || l >= o)) return !1; - } + + ret = element[addEvent](on + type, wrappedListener, !!options.capture); + + if (listenerIndex === -1) { + supplied.push(listener); + wrapped.push(wrappedListener); + useCount.push(1); + } else { + useCount[listenerIndex]++; + } + } else { + ret = element[addEvent](type, listener, supportsOptions ? options : !!options.capture); + } + target.events[type].push(listener); + + return ret; + } +} + +function remove(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = indexOf(elements, element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + var wrappedListener = listener; + var listeners = void 0; + var listenerIndex = void 0; + + if (useAttachEvent) { + listeners = attachedListeners[elementIndex]; + listenerIndex = indexOf(listeners.supplied, listener); + wrappedListener = listeners.wrapped[listenerIndex]; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + remove(element, type, 'all'); + } + } + return; + } + + if (target.events[type]) { + var len = target.events[type].length; + + if (listener === 'all') { + for (var i = 0; i < len; i++) { + remove(element, type, target.events[type][i], options); + } + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (target.events[type][_i] === listener) { + element[removeEvent](on + type, wrappedListener, supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + + if (useAttachEvent && listeners) { + listeners.useCount[listenerIndex]--; + if (listeners.useCount[listenerIndex] === 0) { + listeners.supplied.splice(listenerIndex, 1); + listeners.wrapped.splice(listenerIndex, 1); + listeners.useCount.splice(listenerIndex, 1); } - }return m.maxInteractions > 0; - } - }var l = e("../interact"), - c = e("../Interactable"), - p = e("../Interaction"), - u = e("../actions/base"), - d = e("../defaultOptions"), - f = e("../utils/browser"), - v = e("../scope"), - g = e("../utils"), - h = e("../utils/Signals").new();e("./InteractableMethods");var m = { signals: h, withinInteractionLimit: a, maxInteractions: 1 / 0, defaults: { perAction: { manualStart: !1, max: 1 / 0, maxPerElement: 1, allowFrom: null, ignoreFrom: null } }, setActionDefaults: function setActionDefaults(e) { - g.extend(e.defaults, m.defaults.perAction); - } };p.signals.on("down", function (e) { - var t = e.interaction, - n = e.pointer, - r = e.event, - i = e.eventTarget;if (!t.interacting()) { - s(t, o(t, n, r, i)); - } - }), p.signals.on("move", function (e) { - var t = e.interaction, - n = e.pointer, - r = e.event, - i = e.eventTarget;if (t.mouse && !t.pointerIsDown && !t.interacting()) { - s(t, o(t, n, r, i)); - } - }), p.signals.on("move", function (e) { - var t = e.interaction, - n = e.event;if (t.pointerIsDown && !t.interacting() && t.pointerWasMoved && t.prepared.name) { - h.fire("before-start", e);var r = t.target;t.prepared.name && r && (r.options[t.prepared.name].manualStart || !a(r, t.element, t.prepared) ? t.stop(n) : t.start(t.prepared, r, t.element)); - } - }), p.signals.on("stop", function (e) { - var t = e.interaction, - n = t.target;n && n.options.styleCursor && (n._doc.documentElement.style.cursor = ""); - }), c.prototype.getAction = function (e, t, n, r) { - var i = this.defaultActionChecker(e, t, n, r);return this.options.actionChecker ? this.options.actionChecker(e, t, i, this, r, n) : i; - }, c.prototype.actionChecker = function (e) { - return g.is.function(e) ? (this.options.actionChecker = e, this) : null === e ? (delete this.options.actionChecker, this) : this.options.actionChecker; - }, c.prototype.styleCursor = function (e) { - return g.is.bool(e) ? (this.options.styleCursor = e, this) : null === e ? (delete this.options.styleCursor, this) : this.options.styleCursor; - }, c.prototype.defaultActionChecker = function (e, t, n, r) { - for (var i = this.getRect(r), o = t.buttons || { 0: 1, 1: 4, 3: 8, 4: 16 }[t.button], s = null, a = u.names, l = Array.isArray(a), c = 0, a = l ? a : a[Symbol.iterator]();;) { - var p;if (l) { - if (c >= a.length) break;p = a[c++]; - } else { - if (c = a.next(), c.done) break;p = c.value; - }var d = p;if ((!n.pointerIsDown || !n.mouse || 0 != (o & this.options[d].mouseButtons)) && (s = u[d].checker(e, t, this, r, n, i))) return s; - } - }, l.maxInteractions = function (e) { - return g.is.number(e) ? (m.maxInteractions = e, this) : m.maxInteractions; - }, c.settingsMethods.push("styleCursor"), c.settingsMethods.push("actionChecker"), c.settingsMethods.push("ignoreFrom"), c.settingsMethods.push("allowFrom"), d.base.actionChecker = null, d.base.styleCursor = !0, g.extend(d.perAction, m.defaults.perAction), t.exports = m; - }, { "../Interactable": 4, "../Interaction": 5, "../actions/base": 6, "../defaultOptions": 18, "../interact": 21, "../scope": 31, "../utils": 41, "../utils/Signals": 32, "../utils/browser": 34, "./InteractableMethods": 12 }], 14: [function (e, t, n) { - "use strict"; - var r = e("./base"), - i = e("../Interaction");i.signals.on("new", function (e) { - e.delayTimer = null; - }), r.signals.on("prepared", function (e) { - var t = e.interaction, - n = t.prepared.name;if (n) { - var r = t.target.options[n].delay;r > 0 && (t.delayTimer = setTimeout(function () { - t.start(t.prepared, t.target, t.element); - }, r)); - } - }), i.signals.on("move", function (e) { - var t = e.interaction, - n = e.duplicate;t.pointerWasMoved && !n && clearTimeout(t.delayTimer); - }), r.signals.on("before-start", function (e) { - var t = e.interaction, - n = t.prepared.name;if (n) { - t.target.options[n].delay > 0 && (t.prepared.name = null); + } + + break; } - }); - }, { "../Interaction": 5, "./base": 13 }], 15: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!t) return !1;var n = t.options.drag.startAxis;return "xy" === e || "xy" === n || n === e; - }var i = e("./base"), - o = e("../scope"), - s = e("../utils/browser"), - a = e("../utils/is"), - l = e("../utils/domUtils"), - c = l.matchesSelector, - p = l.parentNode;i.setActionDefaults(e("../actions/drag")), i.signals.on("before-start", function (e) { - var t = e.interaction, - n = e.eventTarget, - l = e.dx, - u = e.dy;if ("drag" === t.prepared.name) { - var d = Math.abs(l), - f = Math.abs(u), - v = t.target.options.drag, - g = v.startAxis, - h = d > f ? "x" : d < f ? "y" : "xy";if (t.prepared.axis = "start" === v.lockAxis ? h[0] : v.lockAxis, "xy" !== h && "xy" !== g && g !== h && (t.prepared.name = null, !t.prepared.name)) for (var m = n, y = function y(e, o, a) { - var l = s.useMatchesSelectorPolyfill ? a.querySelectorAll(o) : void 0;if (e !== t.target && !v.manualStart && !e.testIgnoreAllow(v, m, n) && c(m, o, l)) { - var p = e.getAction(t.downPointer, t.downEvent, t, m);if (p && "drag" === p.name && r(h, e) && i.validateAction(p, e, m, n)) return e; + } + } + + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + attachedListeners.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + selectors: [], + contexts: [], + listeners: [] + }; + + // add delegate listener functions + for (var i = 0; i < documents.length; i++) { + add(documents[i], type, delegateListener); + add(documents[i], type, delegateUseCapture, true); + } + } + + var delegated = delegatedEvents[type]; + var index = void 0; + + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } + + if (index === -1) { + index = delegated.selectors.length; + + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } + + // keep listener and capture and passive flags + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} + +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index = void 0; + + if (!delegated) { + return; + } + + // count from last index of delegated to 0 + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + + var listeners = delegated.listeners[index]; + + // each item of the listeners array is an array: [function, capture, passive] + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = listeners[i], + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; + + // check if the listener functions and capture and passive flags match + + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); + + // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); + + // remove delegate function from context + remove(context, type, delegateListener); + remove(context, type, delegateUseCapture, true); + + // remove the arrays if they are empty + if (!delegated.selectors.length) { + delegatedEvents[type] = null; } - }, x = null; a.element(m);) { - var b = o.interactables.get(m);if (b && b !== t.target && !b.options.drag.manualStart && (x = b.getAction(t.downPointer, t.downEvent, t, m)), x && "drag" === x.name && r(h, b)) { - t.prepared.name = "drag", t.target = b, t.element = m;break; - }var w = o.interactables.forEachSelector(y, m);if (w) { - t.prepared.name = "drag", t.target = w, t.element = m;break; - }m = p(m); } + + // only remove one listener + matchFound = true; + break; } - }); - }, { "../actions/drag": 7, "../scope": 31, "../utils/browser": 34, "../utils/domUtils": 36, "../utils/is": 43, "./base": 13 }], 16: [function (e, t, n) { - "use strict"; - e("./base").setActionDefaults(e("../actions/gesture")); - }, { "../actions/gesture": 9, "./base": 13 }], 17: [function (e, t, n) { - "use strict"; - e("./base").setActionDefaults(e("../actions/resize")); - }, { "../actions/resize": 10, "./base": 13 }], 18: [function (e, t, n) { - "use strict"; - t.exports = { base: { accept: null, preventDefault: "auto", deltaSource: "page" }, perAction: { origin: { x: 0, y: 0 }, mouseButtons: 1, inertia: { enabled: !1, resistance: 10, minSpeed: 100, endSpeed: 10, allowResume: !0, smoothEndDuration: 300 } } }; - }, {}], 19: [function (e, t, n) { - "use strict"; - e("./legacyBrowsers"), e("./inertia"), e("./modifiers/snap"), e("./modifiers/restrict"), e("./pointerEvents/base"), e("./pointerEvents/holdRepeat"), e("./pointerEvents/interactableTargets"), e("./autoStart/delay"), e("./actions/gesture"), e("./actions/resize"), e("./actions/drag"), e("./actions/drop"), e("./autoStart/gesture"), e("./autoStart/resize"), e("./autoStart/drag"), e("./interactablePreventDefault.js"), e("./autoScroll"), t.exports = e("./interact"); - }, { "./actions/drag": 7, "./actions/drop": 8, "./actions/gesture": 9, "./actions/resize": 10, "./autoScroll": 11, "./autoStart/delay": 14, "./autoStart/drag": 15, "./autoStart/gesture": 16, "./autoStart/resize": 17, "./inertia": 20, "./interact": 21, "./interactablePreventDefault.js": 22, "./legacyBrowsers": 23, "./modifiers/restrict": 25, "./modifiers/snap": 26, "./pointerEvents/base": 28, "./pointerEvents/holdRepeat": 29, "./pointerEvents/interactableTargets": 30 }], 20: [function (e, t, n) { - "use strict"; - function r(e, t) { - var n = e.target.options[e.prepared.name].inertia, - r = n.resistance, - i = -Math.log(n.endSpeed / t.v0) / r;t.x0 = e.prevEvent.pageX, t.y0 = e.prevEvent.pageY, t.t0 = t.startEvent.timeStamp / 1e3, t.sx = t.sy = 0, t.modifiedXe = t.xe = (t.vx0 - i) / r, t.modifiedYe = t.ye = (t.vy0 - i) / r, t.te = i, t.lambda_v0 = r / t.v0, t.one_ve_v0 = 1 - n.endSpeed / t.v0; - }function i() { - s(this), p.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);var e = this.inertiaStatus, - t = this.target.options[this.prepared.name].inertia, - n = t.resistance, - r = new Date().getTime() / 1e3 - e.t0;if (r < e.te) { - var i = 1 - (Math.exp(-n * r) - e.lambda_v0) / e.one_ve_v0;if (e.modifiedXe === e.xe && e.modifiedYe === e.ye) e.sx = e.xe * i, e.sy = e.ye * i;else { - var o = p.getQuadraticCurvePoint(0, 0, e.xe, e.ye, e.modifiedXe, e.modifiedYe, i);e.sx = o.x, e.sy = o.y; - }this.doMove(), e.i = u.request(this.boundInertiaFrame); - } else e.sx = e.modifiedXe, e.sy = e.modifiedYe, this.doMove(), this.end(e.startEvent), e.active = !1, this.simulation = null;p.copyCoords(this.prevCoords, this.curCoords); - }function o() { - s(this);var e = this.inertiaStatus, - t = new Date().getTime() - e.t0, - n = this.target.options[this.prepared.name].inertia.smoothEndDuration;t < n ? (e.sx = p.easeOutQuad(t, 0, e.xe, n), e.sy = p.easeOutQuad(t, 0, e.ye, n), this.pointerMove(e.startEvent, e.startEvent), e.i = u.request(this.boundSmoothEndFrame)) : (e.sx = e.xe, e.sy = e.ye, this.pointerMove(e.startEvent, e.startEvent), this.end(e.startEvent), e.smoothEnd = e.active = !1, this.simulation = null); - }function s(e) { - var t = e.inertiaStatus;if (t.active) { - var n = t.upCoords.page, - r = t.upCoords.client;p.setCoords(e.curCoords, [{ pageX: n.x + t.sx, pageY: n.y + t.sy, clientX: r.x + t.sx, clientY: r.y + t.sy }]); - } - }var a = e("./InteractEvent"), - l = e("./Interaction"), - c = e("./modifiers"), - p = e("./utils"), - u = e("./utils/raf");l.signals.on("new", function (e) { - e.inertiaStatus = { active: !1, smoothEnd: !1, allowResume: !1, startEvent: null, upCoords: {}, xe: 0, ye: 0, sx: 0, sy: 0, t0: 0, vx0: 0, vys: 0, duration: 0, lambda_v0: 0, one_ve_v0: 0, i: null }, e.boundInertiaFrame = function () { - return i.apply(e); - }, e.boundSmoothEndFrame = function () { - return o.apply(e); - }; - }), l.signals.on("down", function (e) { - var t = e.interaction, - n = e.event, - r = e.pointer, - i = e.eventTarget, - o = t.inertiaStatus;if (o.active) for (var s = i; p.is.element(s);) { - if (s === t.element) { - u.cancel(o.i), o.active = !1, t.simulation = null, t.updatePointer(r), p.setCoords(t.curCoords, t.pointers);var d = { interaction: t };l.signals.fire("before-action-move", d), l.signals.fire("action-resume", d);var f = new a(t, n, t.prepared.name, "inertiaresume", t.element);t.target.fire(f), t.prevEvent = f, c.resetStatuses(t.modifierStatuses), p.copyCoords(t.prevCoords, t.curCoords);break; - }s = p.parentNode(s); - } - }), l.signals.on("up", function (e) { - var t = e.interaction, - n = e.event, - i = t.inertiaStatus;if (t.interacting() && !i.active) { - var o = t.target, - s = o && o.options, - l = s && t.prepared.name && s[t.prepared.name].inertia, - d = new Date().getTime(), - f = {}, - v = p.extend({}, t.curCoords.page), - g = t.pointerDelta.client.speed, - h = !1, - m = !1, - y = !1, - x = void 0;h = l && l.enabled && "gesture" !== t.prepared.name && n !== i.startEvent, m = h && d - t.curCoords.timeStamp < 50 && g > l.minSpeed && g > l.endSpeed, h && !m && (c.resetStatuses(f), x = c.setAll(t, v, f, !0, !0), x.shouldMove && x.locked && (y = !0)), (m || y) && (p.copyCoords(i.upCoords, t.curCoords), t.pointers[0] = i.startEvent = new a(t, n, t.prepared.name, "inertiastart", t.element), i.t0 = d, i.active = !0, i.allowResume = l.allowResume, t.simulation = i, o.fire(i.startEvent), m ? (i.vx0 = t.pointerDelta.client.vx, i.vy0 = t.pointerDelta.client.vy, i.v0 = g, r(t, i), p.extend(v, t.curCoords.page), v.x += i.xe, v.y += i.ye, c.resetStatuses(f), x = c.setAll(t, v, f, !0, !0), i.modifiedXe += x.dx, i.modifiedYe += x.dy, i.i = u.request(t.boundInertiaFrame)) : (i.smoothEnd = !0, i.xe = x.dx, i.ye = x.dy, i.sx = i.sy = 0, i.i = u.request(t.boundSmoothEndFrame))); - } - }), l.signals.on("stop-active", function (e) { - var t = e.interaction, - n = t.inertiaStatus;n.active && (u.cancel(n.i), n.active = !1, t.simulation = null); - }); - }, { "./InteractEvent": 3, "./Interaction": 5, "./modifiers": 24, "./utils": 41, "./utils/raf": 47 }], 21: [function (e, t, n) { - "use strict"; - function r(e, t) { - var n = a.interactables.get(e, t);return n || (n = new l(e, t), n.events.global = p), n; - }var i = e("./utils/browser"), - o = e("./utils/events"), - s = e("./utils"), - a = e("./scope"), - l = e("./Interactable"), - c = e("./Interaction"), - p = {};r.isSet = function (e, t) { - return a.interactables.indexOfElement(e, t && t.context) !== -1; - }, r.on = function (e, t, n) { - if (s.is.string(e) && e.search(" ") !== -1 && (e = e.trim().split(/ +/)), s.is.array(e)) { - for (var i = e, c = Array.isArray(i), u = 0, i = c ? i : i[Symbol.iterator]();;) { - var d;if (c) { - if (u >= i.length) break;d = i[u++]; - } else { - if (u = i.next(), u.done) break;d = u.value; - }var f = d;r.on(f, t, n); - }return r; - }if (s.is.object(e)) { - for (var v in e) { - r.on(v, e[v], t); - }return r; - }return s.contains(l.eventTypes, e) ? p[e] ? p[e].push(t) : p[e] = [t] : o.add(a.document, e, t, n), r; - }, r.off = function (e, t, n) { - if (s.is.string(e) && e.search(" ") !== -1 && (e = e.trim().split(/ +/)), s.is.array(e)) { - for (var i = e, c = Array.isArray(i), u = 0, i = c ? i : i[Symbol.iterator]();;) { - var d;if (c) { - if (u >= i.length) break;d = i[u++]; - } else { - if (u = i.next(), u.done) break;d = u.value; - }var f = d;r.off(f, t, n); - }return r; - }if (s.is.object(e)) { - for (var v in e) { - r.off(v, e[v], t); - }return r; - }if (s.contains(l.eventTypes, e)) { - var g = void 0;e in p && (g = s.indexOf(p[e], t)) !== -1 && p[e].splice(g, 1); - } else o.remove(a.document, e, t, n);return r; - }, r.debug = function () { - return a; - }, r.getPointerAverage = s.pointerAverage, r.getTouchBBox = s.touchBBox, r.getTouchDistance = s.touchDistance, r.getTouchAngle = s.touchAngle, r.getElementRect = s.getElementRect, r.getElementClientRect = s.getElementClientRect, r.matchesSelector = s.matchesSelector, r.closest = s.closest, r.supportsTouch = function () { - return i.supportsTouch; - }, r.supportsPointerEvent = function () { - return i.supportsPointerEvent; - }, r.stop = function (e) { - for (var t = a.interactions.length - 1; t >= 0; t--) { - a.interactions[t].stop(e); - }return r; - }, r.pointerMoveTolerance = function (e) { - return s.is.number(e) ? (c.pointerMoveTolerance = e, this) : c.pointerMoveTolerance; - }, r.addDocument = a.addDocument, r.removeDocument = a.removeDocument, a.interact = r, t.exports = r; - }, { "./Interactable": 4, "./Interaction": 5, "./scope": 31, "./utils": 41, "./utils/browser": 34, "./utils/events": 37 }], 22: [function (e, t, n) { - "use strict"; - function r(e) { - var t = e.interaction, - n = e.event;t.target && t.target.checkAndPreventDefault(n); - }var i = e("./Interactable"), - o = e("./Interaction"), - s = e("./scope"), - a = e("./utils/is"), - l = e("./utils/domUtils"), - c = l.nodeContains, - p = l.matchesSelector;i.prototype.preventDefault = function (e) { - return (/^(always|never|auto)$/.test(e) ? (this.options.preventDefault = e, this) : a.bool(e) ? (this.options.preventDefault = e ? "always" : "never", this) : this.options.preventDefault - ); - }, i.prototype.checkAndPreventDefault = function (e) { - var t = this.options.preventDefault;if ("never" !== t) return "always" === t ? void e.preventDefault() : void (/^(mouse|pointer|touch)*(down|start)/i.test(e.type) || p(e.target, "input,select,textarea,[contenteditable=true],[contenteditable=true] *") || e.preventDefault()); - };for (var u = ["down", "move", "up", "cancel"], d = 0; d < u.length; d++) { - var f = u[d];o.signals.on(f, r); - }o.docEvents.dragstart = function (e) { - for (var t = s.interactions, n = Array.isArray(t), r = 0, t = n ? t : t[Symbol.iterator]();;) { - var i;if (n) { - if (r >= t.length) break;i = t[r++]; - } else { - if (r = t.next(), r.done) break;i = r.value; - }var o = i;if (o.element && (o.element === e.target || c(o.element, e.target))) return void o.target.checkAndPreventDefault(e); - } - }; - }, { "./Interactable": 4, "./Interaction": 5, "./scope": 31, "./utils/domUtils": 36, "./utils/is": 43 }], 23: [function (e, t, n) { - "use strict"; - function r(e) { - var t = e.target, - n = a.search(e, e.type, t);n && n.prevTap && e.clientX === n.prevTap.clientX && e.clientY === n.prevTap.clientY && t === n.prevTap.target && (n.downTargets[0] = t, n.downTimes[0] = new Date().getTime(), l.fire({ interaction: n, event: e, eventTarget: t, pointer: e, type: "tap" })); - }var i = e("./scope"), - o = e("./utils/events"), - s = e("./utils/browser"), - a = e("./utils/interactionFinder"), - l = e("./pointerEvents/base"), - c = e("./utils/window"), - p = c.window, - u = Object.prototype.toString;if (p.Array.isArray || (p.Array.isArray = function (e) { - return "[object Array]" === u.call(e); - }), String.prototype.trim || (String.prototype.trim = function () { - return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); - }), s.isIE8) { - var d = function d(e) { - for (var t = i.interactions, n = Array.isArray(t), r = 0, t = n ? t : t[Symbol.iterator]();;) { - var o;if (n) { - if (r >= t.length) break;o = t[r++]; - } else { - if (r = t.next(), r.done) break;o = r.value; - }var s = o;s.interacting() && s.target.checkAndPreventDefault(e); - } - }, - f = function f(e, t) { - var n = e.doc, - i = (e.win, 0 === t.indexOf("listen") ? o.add : o.remove);i(n, "selectstart", d), l && i(n, "dblclick", r); - };i.signals.on("add-document", f), i.signals.on("remove-document", f); - }t.exports = null; - }, { "./pointerEvents/base": 28, "./scope": 31, "./utils/browser": 34, "./utils/events": 37, "./utils/interactionFinder": 42, "./utils/window": 48 }], 24: [function (e, t, n) { - "use strict"; - var r = e("../InteractEvent"), - i = e("../Interaction"), - o = e("../utils/extend"), - s = { names: [], setOffsets: function setOffsets(e, t) { - var n = e.target, - r = e.element, - i = n.getRect(r);i ? (e.startOffset.left = t.page.x - i.left, e.startOffset.top = t.page.y - i.top, e.startOffset.right = i.right - t.page.x, e.startOffset.bottom = i.bottom - t.page.y, "width" in i || (i.width = i.right - i.left), "height" in i || (i.height = i.bottom - i.top)) : e.startOffset.left = e.startOffset.top = e.startOffset.right = e.startOffset.bottom = 0, s.setModifierOffsets(e, n, r, i, e.modifierOffsets); - }, setModifierOffsets: function setModifierOffsets(e, t, n, r, i) { - for (var o = 0; o < s.names.length; o++) { - var a = s.names[o];i[a] = s[a].setOffset(e, t, n, r, e.startOffset); - } - }, setAll: function setAll(e, t, n, r, i) { - for (var a = { dx: 0, dy: 0, changed: !1, locked: !1, shouldMove: !0 }, l = e.target, c = o({}, t), p = void 0, u = s.names, d = Array.isArray(u), f = 0, u = d ? u : u[Symbol.iterator]();;) { - var v;if (d) { - if (f >= u.length) break;v = u[f++]; - } else { - if (f = u.next(), f.done) break;v = f.value; - }var g = v, - h = s[g];h.shouldDo(l, e.prepared.name, r, i) && (p = h.set(c, e, n[g]), p.locked && (c.x += p.dx, c.y += p.dy, a.dx += p.dx, a.dy += p.dy, a.locked = !0)); - }return a.shouldMove = !p || p.changed, a; - }, resetStatuses: function resetStatuses(e) { - for (var t = s.names, n = Array.isArray(t), r = 0, t = n ? t : t[Symbol.iterator]();;) { - var i;if (n) { - if (r >= t.length) break;i = t[r++]; - } else { - if (r = t.next(), r.done) break;i = r.value; - }var o = i;e[o] = s[o].reset(e[o] || {}); - }return e; - }, start: function start(e, t) { - var n = e.interaction;s.setOffsets(n, "action-resume" === t ? n.curCoords : n.startCoords), s.resetStatuses(n.modifierStatuses), n.modifierResult = s.setAll(n, n.startCoords.page, n.modifierStatuses); - } };i.signals.on("new", function (e) { - e.startOffset = { left: 0, right: 0, top: 0, bottom: 0 }, e.modifierOffsets = {}, e.modifierStatuses = s.resetStatuses({}), e.modifierResult = null; - }), i.signals.on("action-start", s.start), i.signals.on("action-resume", s.start), i.signals.on("before-action-move", function (e) { - var t = e.interaction, - n = e.preEnd, - r = e.interactingBeforeMove, - i = s.setAll(t, t.curCoords.page, t.modifierStatuses, n);!i.shouldMove && r && (t._dontFireMove = !0), t.modifierResult = i; - }), i.signals.on("action-end", function (e) { - for (var t = e.interaction, n = e.event, r = 0; r < s.names.length; r++) { - if (s[s.names[r]].shouldDo(t.target, t.prepared.name, !0, !0)) { - t.doMove({ event: n, preEnd: !0 });break; + } + + if (matchFound) { + break; + } + } + } +} + +// bound to the interactable context when a DOM event +// listener is added to a selector interactable +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = {}; + var delegated = delegatedEvents[event.type]; + var eventTarget = domUtils.getActualElement(event.path ? event.path[0] : event.target); + var element = eventTarget; + + // duplicate the event so that currentTarget can be changed + pExtend(fakeEvent, event); + + fakeEvent.originalEvent = event; + fakeEvent.preventDefault = preventOriginalDefault; + + // climb up document tree looking for selector matches + while (is.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; + + if (domUtils.matchesSelector(element, selector) && domUtils.nodeContains(context, eventTarget) && domUtils.nodeContains(context, element)) { + + var listeners = delegated.listeners[i]; + + fakeEvent.currentTarget = element; + + for (var j = 0; j < listeners.length; j++) { + var _listeners$j = listeners[j], + fn = _listeners$j[0], + capture = _listeners$j[1], + passive = _listeners$j[2]; + + + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); } } - }), r.signals.on("set-xy", function (e) { - for (var t = e.iEvent, n = e.interaction, r = e.page, i = e.client, o = e.phase, a = e.action, l = n.target, c = 0; c < s.names.length; c++) { - var p = s.names[c], - u = s[p];t[p] = u.modifyCoords(r, i, l, n.modifierStatuses[p], a, o); + } + } + + element = domUtils.parentNode(element); + } +} + +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} + +function preventDef() { + this.returnValue = false; +} + +function preventOriginalDefault() { + this.originalEvent.preventDefault(); +} + +function stopProp() { + this.cancelBubble = true; +} + +function stopImmProp() { + this.cancelBubble = true; + this.immediatePropagationStopped = true; +} + +function getOptions(param) { + return is.object(param) ? param : { capture: param }; +} + +module.exports = { + add: add, + remove: remove, + + addDelegate: addDelegate, + removeDelegate: removeDelegate, + + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + + useAttachEvent: useAttachEvent, + supportsOptions: supportsOptions, + + _elements: elements, + _targets: targets, + _attachedListeners: attachedListeners +}; + +},{"./arr":36,"./domUtils":39,"./is":46,"./pointerExtend":48,"./window":52}],41:[function(require,module,exports){ +"use strict"; + +module.exports = function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + return dest; +}; + +},{}],42:[function(require,module,exports){ +'use strict'; + +var is = require('./is'); + +var _require = require('./domUtils'), + closest = _require.closest, + parentNode = _require.parentNode, + getElementRect = _require.getElementRect, + trySelector = _require.trySelector; + +module.exports = function (target, element, action) { + var actionOptions = target.options[action]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + + if (origin === 'parent') { + origin = parentNode(element); + } else if (origin === 'self') { + origin = target.getRect(element); + } else if (trySelector(origin)) { + origin = closest(element, origin) || { x: 0, y: 0 }; + } + + if (is.function(origin)) { + origin = origin(target && element); + } + + if (is.element(origin)) { + origin = getElementRect(origin); + } + + origin.x = 'x' in origin ? origin.x : origin.left; + origin.y = 'y' in origin ? origin.y : origin.top; + + return origin; +}; + +},{"./domUtils":39,"./is":46}],43:[function(require,module,exports){ +"use strict"; + +module.exports = function (x, y) { + return Math.sqrt(x * x + y * y); +}; + +},{}],44:[function(require,module,exports){ +'use strict'; + +var extend = require('./extend'); +var win = require('./window'); + +var utils = { + warnOnce: function warnOnce(method, message) { + var warned = false; + + return function () { + if (!warned) { + win.window.console.warn(message); + warned = true; + } + + return method.apply(this, arguments); + }; + }, + + // http://stackoverflow.com/a/5634528/2280888 + _getQBezierValue: function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; + }, + + getQuadraticCurvePoint: function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: utils._getQBezierValue(position, startX, cpX, endX), + y: utils._getQBezierValue(position, startY, cpY, endY) + }; + }, + + // http://gizma.com/easing/ + easeOutQuad: function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; + }, + + copyAction: function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + + return dest; + }, + + getStringOptionResult: function getStringOptionResult(value, interactable, element) { + if (!utils.is.string(value)) { + return null; + } + + if (value === 'parent') { + value = utils.parentNode(element); + } else if (value === 'self') { + value = interactable.getRect(element); + } else { + value = utils.closest(element, value); + } + + return value; + }, + + is: require('./is'), + extend: extend, + hypot: require('./hypot'), + getOriginXY: require('./getOriginXY') +}; + +extend(utils, require('./arr')); +extend(utils, require('./domUtils')); +extend(utils, require('./pointerUtils')); + +module.exports = utils; + +},{"./arr":36,"./domUtils":39,"./extend":41,"./getOriginXY":42,"./hypot":43,"./is":46,"./pointerUtils":49,"./window":52}],45:[function(require,module,exports){ +'use strict'; + +var scope = require('../scope'); +var utils = require('./index'); +var browser = require('./browser'); + +var finder = { + methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + + search: function search(pointer, eventType, eventTarget) { + var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) + // MSPointerEvent.MSPOINTER_TYPE_MOUSE + || pointer.pointerType === 4; + var pointerId = utils.getPointerId(pointer); + var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + + for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var method = _ref; + + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + }, + + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var mouseEvent = _ref2.mouseEvent, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget; + + if (!/down|start/i.test(eventType)) { + return null; + } + + for (var _iterator2 = scope.interactions, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref3; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref3 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref3 = _i2.value; + } + + var interaction = _ref3; + + var element = eventTarget; + + if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } + element = utils.parentNode(element); } - }), t.exports = s; - }, { "../InteractEvent": 3, "../Interaction": 5, "../utils/extend": 38 }], 25: [function (e, t, n) { - "use strict"; - var r = e("./index"), - i = e("../utils"), - o = e("../defaultOptions"), - s = { defaults: { enabled: !1, endOnly: !1, restriction: null, elementRect: null }, shouldDo: function shouldDo(e, t, n, r) { - var i = e.options[t].restrict;return i && i.enabled && (n || !i.endOnly) && (!r || i.endOnly); - }, setOffset: function setOffset(e, t, n, r, i) { - var o = t.options[e.prepared.name].restrict.elementRect, - s = {};return r && o ? (s.left = i.left - r.width * o.left, s.top = i.top - r.height * o.top, s.right = i.right - r.width * (1 - o.right), s.bottom = i.bottom - r.height * (1 - o.bottom)) : s.left = s.top = s.right = s.bottom = 0, s; - }, set: function set(e, t, n) { - var r = t.target, - o = r && r.options[t.prepared.name].restrict, - s = o && o.restriction;if (!s) return n;var a = n.useStatusXY ? { x: n.x, y: n.y } : i.extend({}, e);if (n.dx = 0, n.dy = 0, n.locked = !1, i.is.string(s) && !(s = "parent" === s ? i.parentNode(t.element) : "self" === s ? r.getRect(t.element) : i.closest(t.element, s))) return n;i.is.function(s) && (s = s(a.x, a.y, t.element)), i.is.element(s) && (s = i.getElementRect(s));var l = s, - c = void 0, - p = void 0, - u = t.modifierOffsets.restrict;return s ? "x" in s && "y" in s ? (c = Math.max(Math.min(l.x + l.width - u.right, a.x), l.x + u.left), p = Math.max(Math.min(l.y + l.height - u.bottom, a.y), l.y + u.top)) : (c = Math.max(Math.min(l.right - u.right, a.x), l.left + u.left), p = Math.max(Math.min(l.bottom - u.bottom, a.y), l.top + u.top)) : (c = a.x, p = a.y), n.dx = c - a.x, n.dy = p - a.y, n.changed = n.restrictedX !== c || n.restrictedY !== p, n.locked = !(!n.dx && !n.dy), n.restrictedX = c, n.restrictedY = p, n; - }, reset: function reset(e) { - return e.dx = e.dy = 0, e.modifiedX = e.modifiedY = NaN, e.locked = !1, e.changed = !0, e; - }, modifyCoords: function modifyCoords(e, t, n, r, i, o) { - var s = n.options[i].restrict, - a = s && s.elementRect;if (s && s.enabled && ("start" !== o || !a || !r.locked) && r.locked) return e.x += r.dx, e.y += r.dy, t.x += r.dx, t.y += r.dy, { dx: r.dx, dy: r.dy }; - } };r.restrict = s, r.names.push("restrict"), o.perAction.restrict = s.defaults, t.exports = s; - }, { "../defaultOptions": 18, "../utils": 41, "./index": 24 }], 26: [function (e, t, n) { - "use strict"; - var r = e("./index"), - i = e("../interact"), - o = e("../utils"), - s = e("../defaultOptions"), - a = { defaults: { enabled: !1, endOnly: !1, range: 1 / 0, targets: null, offsets: null, relativePoints: null }, shouldDo: function shouldDo(e, t, n, r) { - var i = e.options[t].snap;return i && i.enabled && (n || !i.endOnly) && (!r || i.endOnly); - }, setOffset: function setOffset(e, t, n, r, i) { - var s = [], - a = o.getOriginXY(t, n, e.prepared.name), - l = t.options[e.prepared.name].snap || {}, - c = void 0;if (c = "startCoords" === l.offset ? { x: e.startCoords.page.x - a.x, y: e.startCoords.page.y - a.y } : "self" === l.offset ? { x: r.left - a.x, y: r.top - a.y } : l.offset || { x: 0, y: 0 }, r && l.relativePoints && l.relativePoints.length) for (var p = l.relativePoints, u = Array.isArray(p), d = 0, p = u ? p : p[Symbol.iterator]();;) { - var f;if (u) { - if (d >= p.length) break;f = p[d++]; - } else { - if (d = p.next(), d.done) break;f = d.value; - }var v = f, - g = v.x, - h = v.y;s.push({ x: i.left - r.width * g + c.x, y: i.top - r.height * h + c.y }); - } else s.push(c);return s; - }, set: function set(e, t, n) { - var r = t.target.options[t.prepared.name].snap, - i = [], - s = void 0, - a = void 0, - l = void 0;if (n.useStatusXY) a = { x: n.x, y: n.y };else { - var c = o.getOriginXY(t.target, t.element, t.prepared.name);a = o.extend({}, e), a.x -= c.x, a.y -= c.y; - }n.realX = a.x, n.realY = a.y;for (var p = t.modifierOffsets.snap, u = r.targets ? r.targets.length : 0, d = p, f = Array.isArray(d), v = 0, d = f ? d : d[Symbol.iterator]();;) { - var g;if (f) { - if (v >= d.length) break;g = d[v++]; - } else { - if (v = d.next(), v.done) break;g = v.value; - }for (var h = g, m = h.x, y = h.y, x = a.x - m, b = a.y - y, w = r.targets, E = Array.isArray(w), S = 0, w = E ? w : w[Symbol.iterator]();;) { - var T;if (E) { - if (S >= w.length) break;T = w[S++]; - } else { - if (S = w.next(), S.done) break;T = S.value; - }var A = T;s = o.is.function(A) ? A(x, b, t) : A, s && i.push({ x: o.is.number(s.x) ? s.x + m : x, y: o.is.number(s.y) ? s.y + y : b, range: o.is.number(s.range) ? s.range : r.range }); - } - }var C = { target: null, inRange: !1, distance: 0, range: 0, dx: 0, dy: 0 };for (l = 0, u = i.length; l < u; l++) { - s = i[l];var D = s.range, - I = s.x - a.x, - k = s.y - a.y, - M = o.hypot(I, k), - O = M <= D;D === 1 / 0 && C.inRange && C.range !== 1 / 0 && (O = !1), C.target && !(O ? C.inRange && D !== 1 / 0 ? M / D < C.distance / C.range : D === 1 / 0 && C.range !== 1 / 0 || M < C.distance : !C.inRange && M < C.distance) || (C.target = s, C.distance = M, C.range = D, C.inRange = O, C.dx = I, C.dy = k, n.range = D); - }var P = void 0;return C.target ? (P = n.snappedX !== C.target.x || n.snappedY !== C.target.y, n.snappedX = C.target.x, n.snappedY = C.target.y) : (P = !0, n.snappedX = NaN, n.snappedY = NaN), n.dx = C.dx, n.dy = C.dy, n.changed = P || C.inRange && !n.locked, n.locked = C.inRange, n; - }, reset: function reset(e) { - return e.dx = e.dy = 0, e.snappedX = e.snappedY = NaN, e.locked = !1, e.changed = !0, e; - }, modifyCoords: function modifyCoords(e, t, n, r, i, o) { - var s = n.options[i].snap, - a = s && s.relativePoints;if (s && s.enabled && ("start" !== o || !a || !a.length)) return r.locked && (e.x += r.dx, e.y += r.dy, t.x += r.dx, t.y += r.dy), { range: r.range, locked: r.locked, x: r.snappedX, y: r.snappedY, realX: r.realX, realY: r.realY, dx: r.dx, dy: r.dy }; - } };i.createSnapGrid = function (e) { - return function (t, n) { - var r = e.limits || { left: -(1 / 0), right: 1 / 0, top: -(1 / 0), bottom: 1 / 0 }, - i = 0, - s = 0;o.is.object(e.offset) && (i = e.offset.x, s = e.offset.y);var a = Math.round((t - i) / e.x), - l = Math.round((n - s) / e.y);return { x: Math.max(r.left, Math.min(r.right, a * e.x + i)), y: Math.max(r.top, Math.min(r.bottom, l * e.y + s)), range: e.range }; - }; - }, r.snap = a, r.names.push("snap"), s.perAction.snap = a.defaults, t.exports = a; - }, { "../defaultOptions": 18, "../interact": 21, "../utils": 41, "./index": 24 }], 27: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }var i = e("../utils/pointerUtils");t.exports = function () { - function e(t, n, o, s, a) { - if (r(this, e), i.pointerExtend(this, o), o !== n && i.pointerExtend(this, n), this.interaction = a, this.timeStamp = new Date().getTime(), this.originalEvent = o, this.type = t, this.pointerId = i.getPointerId(n), this.pointerType = i.getPointerType(n, a), this.target = s, this.currentTarget = null, "tap" === t) { - var l = a.getPointerIndex(n);this.dt = this.timeStamp - a.downTimes[l];var c = this.timeStamp - a.tapTime;this.double = !!(a.prevTap && "doubletap" !== a.prevTap.type && a.prevTap.target === this.target && c < 500); - } else "doubletap" === t && (this.dt = n.timeStamp - a.tapTime); - }return e.prototype.subtractOrigin = function (e) { - var t = e.x, - n = e.y;return this.pageX -= t, this.pageY -= n, this.clientX -= t, this.clientY -= n, this; - }, e.prototype.addOrigin = function (e) { - var t = e.x, - n = e.y;return this.pageX += t, this.pageY += n, this.clientX += t, this.clientY += n, this; - }, e.prototype.preventDefault = function () { - this.originalEvent.preventDefault(); - }, e.prototype.stopPropagation = function () { - this.propagationStopped = !0; - }, e.prototype.stopImmediatePropagation = function () { - this.immediatePropagationStopped = this.propagationStopped = !0; - }, e; - }(); - }, { "../utils/pointerUtils": 46 }], 28: [function (e, t, n) { - "use strict"; - function r(e) { - for (var t = e.interaction, n = e.pointer, s = e.event, l = e.eventTarget, c = e.type, u = void 0 === c ? e.pointerEvent.type : c, d = e.targets, f = void 0 === d ? i(e) : d, v = e.pointerEvent, g = void 0 === v ? new o(u, n, s, l, t) : v, h = { interaction: t, pointer: n, event: s, eventTarget: l, targets: f, type: u, pointerEvent: g }, m = 0; m < f.length; m++) { - var y = f[m];for (var x in y.props || {}) { - g[x] = y.props[x]; - }var b = a.getOriginXY(y.eventable, y.element);if (g.subtractOrigin(b), g.eventable = y.eventable, g.currentTarget = y.element, y.eventable.fire(g), g.addOrigin(b), g.immediatePropagationStopped || g.propagationStopped && m + 1 < f.length && f[m + 1].element !== g.currentTarget) break; - }if (p.fire("fired", h), "tap" === u) { - var w = g.double ? r({ interaction: t, pointer: n, event: s, eventTarget: l, type: "doubletap" }) : g;t.prevTap = w, t.tapTime = w.timeStamp; - }return g; - }function i(e) { - var t = e.interaction, - n = e.pointer, - r = e.event, - i = e.eventTarget, - o = e.type, - s = t.getPointerIndex(n);if ("tap" === o && (t.pointerWasMoved || !t.downTargets[s] || t.downTargets[s] !== i)) return [];for (var l = a.getPath(i), c = { interaction: t, pointer: n, event: r, eventTarget: i, type: o, path: l, targets: [], element: null }, u = l, f = Array.isArray(u), v = 0, u = f ? u : u[Symbol.iterator]();;) { - var g;if (f) { - if (v >= u.length) break;g = u[v++]; - } else { - if (v = u.next(), v.done) break;g = v.value; - }var h = g;c.element = h, p.fire("collect-targets", c); - }return "hold" === o && (c.targets = d(c.targets, function (e) { - return e.eventable.options.holdDuration === t.holdTimers[s].duration; - })), c.targets; - }var o = e("./PointerEvent"), - s = e("../Interaction"), - a = e("../utils"), - l = e("../utils/browser"), - c = e("../defaultOptions"), - p = e("../utils/Signals").new(), - u = e("../utils/arr"), - d = u.filter, - f = ["down", "up", "cancel"], - v = ["down", "up", "cancel"], - g = { PointerEvent: o, fire: r, collectEventTargets: i, signals: p, defaults: { holdDuration: 600, ignoreFrom: null, allowFrom: null, origin: { x: 0, y: 0 } }, types: ["down", "move", "up", "cancel", "tap", "doubletap", "hold"] };s.signals.on("update-pointer-down", function (e) { - var t = e.interaction, - n = e.pointerIndex;t.holdTimers[n] = { duration: 1 / 0, timeout: null }; - }), s.signals.on("remove-pointer", function (e) { - var t = e.interaction, - n = e.pointerIndex;t.holdTimers.splice(n, 1); - }), s.signals.on("move", function (e) { - var t = e.interaction, - n = e.pointer, - i = e.event, - o = e.eventTarget, - s = e.duplicateMove, - a = t.getPointerIndex(n);s || t.pointerIsDown && !t.pointerWasMoved || (t.pointerIsDown && clearTimeout(t.holdTimers[a].timeout), r({ interaction: t, pointer: n, event: i, eventTarget: o, type: "move" })); - }), s.signals.on("down", function (e) { - for (var t = e.interaction, n = e.pointer, i = e.event, o = e.eventTarget, s = e.pointerIndex, c = l.isIE8 ? a.extend({}, i) : i, u = t.holdTimers[s], d = a.getPath(o), f = { interaction: t, pointer: n, event: i, eventTarget: o, type: "hold", targets: [], path: d, element: null }, v = d, g = Array.isArray(v), h = 0, v = g ? v : v[Symbol.iterator]();;) { - var m;if (g) { - if (h >= v.length) break;m = v[h++]; - } else { - if (h = v.next(), h.done) break;m = h.value; - }var y = m;f.element = y, p.fire("collect-targets", f); - }if (f.targets.length) { - for (var x = 1 / 0, b = 0; b < f.targets.length; b++) { - var w = f.targets[b], - E = w.eventable.options.holdDuration;E < x && (x = E); - }u.duration = x, u.timeout = setTimeout(function () { - r({ interaction: t, eventCopy: c, eventTarget: o, pointer: l.isIE8 ? c : n, type: "hold" }); - }, x); + } + } + + return null; + }, + + // if it's a mouse interaction + mouse: function mouse(_ref4) { + var pointerId = _ref4.pointerId, + mouseEvent = _ref4.mouseEvent, + eventType = _ref4.eventType; + + if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + return null; + } + + var firstNonActive = void 0; + + for (var _iterator3 = scope.interactions, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref5; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref5 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref5 = _i3.value; + } + + var interaction = _ref5; + + if (interaction.mouse) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { + continue; } - }), s.signals.on("up", function (e) { - var t = e.interaction, - n = e.pointer, - i = e.event, - o = e.eventTarget;t.pointerWasMoved || r({ interaction: t, eventTarget: o, pointer: n, event: i, type: "tap" }); - }), ["up", "cancel"].forEach(function (e) { - s.signals.on(e, function (e) { - var t = e.interaction, - n = e.pointerIndex;t.holdTimers[n] && clearTimeout(t.holdTimers[n].timeout); - }); - });for (var h = 0; h < f.length; h++) { - s.signals.on(f[h], function (e) { - return function (t) { - var n = t.interaction, - i = t.pointer, - o = t.event;r({ interaction: n, eventTarget: t.eventTarget, pointer: i, event: o, type: e }); - }; - }(v[h])); - }s.signals.on("new", function (e) { - e.prevTap = null, e.tapTime = 0, e.holdTimers = []; - }), c.pointerEvents = g.defaults, t.exports = g; - }, { "../Interaction": 5, "../defaultOptions": 18, "../utils": 41, "../utils/Signals": 32, "../utils/arr": 33, "../utils/browser": 34, "./PointerEvent": 27 }], 29: [function (e, t, n) { - "use strict"; - function r(e) { - var t = e.pointerEvent;"hold" === t.type && (t.count = (t.count || 0) + 1); - }function i(e) { - var t = e.interaction, - n = e.pointerEvent, - r = e.eventTarget, - i = e.targets;if ("hold" === n.type && i.length) { - var o = i[0].eventable.options.holdRepeatInterval;o <= 0 || (t.holdIntervalHandle = setTimeout(function () { - s.fire({ interaction: t, eventTarget: r, type: "hold", pointer: n, event: n }); - }, o)); + + // if the interaction is active, return it immediately + if (interaction.interacting()) { + return interaction; } - }function o(e) { - var t = e.interaction;t.holdIntervalHandle && (clearInterval(t.holdIntervalHandle), t.holdIntervalHandle = null); - }var s = e("./base"), - a = e("../Interaction");s.signals.on("new", r), s.signals.on("fired", i);for (var l = ["move", "up", "cancel", "endall"], c = 0; c < l.length; c++) { - var p = l[c];a.signals.on(p, o); - }s.defaults.holdRepeatInterval = 0, s.types.push("holdrepeat"), t.exports = { onNew: r, onFired: i, endHoldRepeat: o }; - }, { "../Interaction": 5, "./base": 28 }], 30: [function (e, t, n) { - "use strict"; - var r = e("./base"), - i = e("../Interactable"), - o = e("../utils/browser"), - s = e("../utils/is"), - a = e("../utils/domUtils"), - l = e("../scope"), - c = e("../utils/extend"), - p = e("../utils/arr"), - u = p.merge;r.signals.on("collect-targets", function (e) { - function t(e, t, l) { - var p = o.useMatchesSelectorPolyfill ? l.querySelectorAll(t) : void 0, - u = e.events, - d = u.options;u[i] && s.element(r) && a.matchesSelector(r, t, p) && e.testIgnoreAllow(d, r, c) && n.push({ element: r, eventable: u, props: { interactable: e } }); - }var n = e.targets, - r = e.element, - i = e.type, - c = e.eventTarget, - p = l.interactables.get(r);if (p) { - var u = p.events, - d = u.options;u[i] && p.testIgnoreAllow(d, r, c) && n.push({ element: r, eventable: u, props: { interactable: p } }); - }l.interactables.forEachSelector(t, r); - }), i.signals.on("new", function (e) { - var t = e.interactable;t.events.getRect = function (e) { - return t.getRect(e); - }; - }), i.signals.on("set", function (e) { - var t = e.interactable, - n = e.options;c(t.events.options, r.defaults), c(t.events.options, n); - }), u(i.eventTypes, r.types), i.prototype.pointerEvents = function (e) { - return c(this.events.options, e), this; - };var d = i.prototype._backCompatOption;i.prototype._backCompatOption = function (e, t) { - var n = d.call(this, e, t);return n === this && (this.events.options[e] = t), n; - }, i.settingsMethods.push("pointerEvents"); - }, { "../Interactable": 4, "../scope": 31, "../utils/arr": 33, "../utils/browser": 34, "../utils/domUtils": 36, "../utils/extend": 38, "../utils/is": 43, "./base": 28 }], 31: [function (e, t, n) { - "use strict"; - var r = e("./utils"), - i = e("./utils/events"), - o = e("./utils/Signals").new(), - s = { signals: o, events: i, utils: r, document: e("./utils/domObjects").document, documents: [], addDocument: function addDocument(e, t) { - if (r.contains(s.documents, e)) return !1;t = t || s.getWindow(e), s.documents.push(e), i.documents.push(e), e !== s.document && i.add(t, "unload", s.onWindowUnload), o.fire("add-document", { doc: e, win: t }); - }, removeDocument: function removeDocument(e, t) { - var n = r.indexOf(s.documents, e);t = t || s.getWindow(e), i.remove(t, "unload", s.onWindowUnload), s.documents.splice(n, 1), i.documents.splice(n, 1), o.fire("remove-document", { win: t, doc: e }); - }, onWindowUnload: function onWindowUnload() { - s.removeDocument(this.document, this); - } };t.exports = s; - }, { "./utils": 41, "./utils/Signals": 32, "./utils/domObjects": 35, "./utils/events": 37 }], 32: [function (e, t, n) { - "use strict"; - function r(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); - }var i = e("./arr"), - o = i.indexOf, - s = function () { - function e() { - r(this, e), this.listeners = {}; - }return e.prototype.on = function (e, t) { - if (!this.listeners[e]) return void (this.listeners[e] = [t]);this.listeners[e].push(t); - }, e.prototype.off = function (e, t) { - if (this.listeners[e]) { - var n = o(this.listeners[e], t);n !== -1 && this.listeners[e].splice(n, 1); - } - }, e.prototype.fire = function (e, t) { - var n = this.listeners[e];if (n) for (var r = 0; r < n.length; r++) { - if (n[r](t, e) === !1) return; + // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; } - }, e; - }();s.new = function () { - return new s(); - }, t.exports = s; - }, { "./arr": 33 }], 33: [function (e, t, n) { - "use strict"; - function r(e, t) { - for (var n = 0, r = e.length; n < r; n++) { - if (e[n] === t) return n; - }return -1; - }function i(e, t) { - return r(e, t) !== -1; - }function o(e, t) { - for (var n = 0; n < t.length; n++) { - e.push(t[n]); - }return e; - }function s(e, t) { - for (var n = [], r = 0; r < e.length; r++) { - t(e[r]) && n.push(e[r]); - }return n; - }t.exports = { indexOf: r, contains: i, merge: o, filter: s }; - }, {}], 34: [function (e, t, n) { - "use strict"; - var r = e("./window"), - i = r.window, - o = e("./is"), - s = e("./domObjects"), - a = s.Element, - l = i.navigator, - c = { supportsTouch: !!("ontouchstart" in i || o.function(i.DocumentTouch) && s.document instanceof i.DocumentTouch), supportsPointerEvent: !!s.PointerEvent, isIE8: "attachEvent" in i && !("addEventListener" in i), isOperaMobile: "Opera" === l.appName && c.supportsTouch && l.userAgent.match("Presto"), isIOS7: /iP(hone|od|ad)/.test(l.platform) && /OS 7[^\d]/.test(l.appVersion), isIe9OrOlder: /MSIE (8|9)/.test(l.userAgent), prefixedMatchesSelector: "matches" in a.prototype ? "matches" : "webkitMatchesSelector" in a.prototype ? "webkitMatchesSelector" : "mozMatchesSelector" in a.prototype ? "mozMatchesSelector" : "oMatchesSelector" in a.prototype ? "oMatchesSelector" : "msMatchesSelector", useMatchesSelectorPolyfill: !1, pEventTypes: s.PointerEvent ? s.PointerEvent === i.MSPointerEvent ? { up: "MSPointerUp", down: "MSPointerDown", over: "mouseover", out: "mouseout", move: "MSPointerMove", cancel: "MSPointerCancel" } : { up: "pointerup", down: "pointerdown", over: "pointerover", out: "pointerout", move: "pointermove", cancel: "pointercancel" } : null, wheelEvent: "onmousewheel" in s.document ? "mousewheel" : "wheel" };c.useMatchesSelectorPolyfill = !o.function(a.prototype[c.prefixedMatchesSelector]), t.exports = c; - }, { "./domObjects": 35, "./is": 43, "./window": 48 }], 35: [function (e, t, n) { - "use strict"; - function r() {}var i = {}, - o = e("./window").window;i.document = o.document, i.DocumentFragment = o.DocumentFragment || r, i.SVGElement = o.SVGElement || r, i.SVGSVGElement = o.SVGSVGElement || r, i.SVGElementInstance = o.SVGElementInstance || r, i.Element = o.Element || r, i.HTMLElement = o.HTMLElement || i.Element, i.Event = o.Event, i.Touch = o.Touch || r, i.PointerEvent = o.PointerEvent || o.MSPointerEvent, t.exports = i; - }, { "./window": 48 }], 36: [function (e, t, n) { - "use strict"; - var r = e("./window"), - i = e("./browser"), - o = e("./is"), - s = e("./domObjects"), - a = { nodeContains: function nodeContains(e, t) { - for (; t;) { - if (t === e) return !0;t = t.parentNode; - }return !1; - }, closest: function closest(e, t) { - for (; o.element(e);) { - if (a.matchesSelector(e, t)) return e;e = a.parentNode(e); - }return null; - }, parentNode: function parentNode(e) { - var t = e.parentNode;if (o.docFrag(t)) { - for (; (t = t.host) && o.docFrag(t);) {}return t; - }return t; - }, matchesSelectorPolyfill: i.useMatchesSelectorPolyfill ? function (e, t, n) { - n = n || e.parentNode.querySelectorAll(t);for (var r = 0, i = n.length; r < i; r++) { - if (n[r] === e) return !0; - }return !1; - } : null, matchesSelector: function matchesSelector(e, t, n) { - return i.useMatchesSelectorPolyfill ? a.matchesSelectorPolyfill(e, t, n) : (r.window !== r.realWindow && (t = t.replace(/\/deep\//g, " ")), e[i.prefixedMatchesSelector](t)); - }, indexOfDeepestElement: function indexOfDeepestElement(e) { - var t = [], - n = [], - r = void 0, - i = e[0], - o = i ? 0 : -1, - a = void 0, - l = void 0, - c = void 0, - p = void 0;for (c = 1; c < e.length; c++) { - if ((r = e[c]) && r !== i) if (i) { - if (r.parentNode !== r.ownerDocument) if (i.parentNode !== r.ownerDocument) { - if (!t.length) for (a = i; a.parentNode && a.parentNode !== a.ownerDocument;) { - t.unshift(a), a = a.parentNode; - }if (i instanceof s.HTMLElement && r instanceof s.SVGElement && !(r instanceof s.SVGSVGElement)) { - if (r === i.parentNode) continue;a = r.ownerSVGElement; - } else a = r;for (n = []; a.parentNode !== a.ownerDocument;) { - n.unshift(a), a = a.parentNode; - }for (p = 0; n[p] && n[p] === t[p];) { - p++; - }var u = [n[p - 1], n[p], t[p]];for (l = u[0].lastChild; l;) { - if (l === u[1]) { - i = r, o = c, t = [];break; - }if (l === u[2]) break;l = l.previousSibling; - } - } else i = r, o = c; - } else i = r, o = c; - }return o; - }, matchesUpTo: function matchesUpTo(e, t, n) { - for (; o.element(e);) { - if (a.matchesSelector(e, t)) return !0;if ((e = a.parentNode(e)) === n) return a.matchesSelector(e, t); - }return !1; - }, getActualElement: function getActualElement(e) { - return e instanceof s.SVGElementInstance ? e.correspondingUseElement : e; - }, getScrollXY: function getScrollXY(e) { - return e = e || r.window, { x: e.scrollX || e.document.documentElement.scrollLeft, y: e.scrollY || e.document.documentElement.scrollTop }; - }, getElementClientRect: function getElementClientRect(e) { - var t = e instanceof s.SVGElement ? e.getBoundingClientRect() : e.getClientRects()[0];return t && { left: t.left, right: t.right, top: t.top, bottom: t.bottom, width: t.width || t.right - t.left, height: t.height || t.bottom - t.top }; - }, getElementRect: function getElementRect(e) { - var t = a.getElementClientRect(e);if (!i.isIOS7 && t) { - var n = a.getScrollXY(r.getWindow(e));t.left += n.x, t.right += n.x, t.top += n.y, t.bottom += n.y; - }return t; - }, getPath: function getPath(e) { - for (var t = []; e;) { - t.push(e), e = a.parentNode(e); - }return t; - }, trySelector: function trySelector(e) { - return !!o.string(e) && (s.document.querySelector(e), !0); - } };t.exports = a; - }, { "./browser": 34, "./domObjects": 35, "./is": 43, "./window": 48 }], 37: [function (e, t, n) { - "use strict"; - function r(e, t, n, r) { - var i = f(r), - o = w(D, e), - s = I[o];if (s || (s = { events: {}, typeCount: 0 }, o = D.push(e) - 1, I.push(s), k.push(S ? { supplied: [], wrapped: [], useCount: [] } : null)), s.events[t] || (s.events[t] = [], s.typeCount++), !E(s.events[t], n)) { - var a = void 0;if (S) { - var l = k[o], - p = l.supplied, - v = l.wrapped, - g = l.useCount, - h = w(p, n), - m = v[h] || function (t) { - t.immediatePropagationStopped || (t.target = t.srcElement, t.currentTarget = e, t.preventDefault = t.preventDefault || c, t.stopPropagation = t.stopPropagation || u, t.stopImmediatePropagation = t.stopImmediatePropagation || d, /mouse|click/.test(t.type) && (t.pageX = t.clientX + x(e).document.documentElement.scrollLeft, t.pageY = t.clientY + x(e).document.documentElement.scrollTop), n(t)); - };a = e[T](C + t, m, !!i.capture), h === -1 ? (p.push(n), v.push(m), g.push(1)) : g[h]++; - } else a = e[T](t, n, P ? i : !!i.capture);return s.events[t].push(n), a; + } + } + + // if no active mouse interaction was found use the first inactive mouse + // interaction + if (firstNonActive) { + return firstNonActive; + } + + // Find any interaction specifically for mouse. + // ignore the interaction if the eventType is a mousedown, and a simulation + // is active + for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref6; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref6 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref6 = _i4.value; + } + + var _interaction = _ref6; + + if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + return _interaction; + } + } + + return null; + }, + + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId; + + for (var _iterator5 = scope.interactions, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref8; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref8 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref8 = _i5.value; + } + + var interaction = _ref8; + + if (utils.contains(interaction.pointerIds, pointerId)) { + return interaction; + } + } + }, + + // get first idle interaction + idle: function idle(_ref9) { + var mouseEvent = _ref9.mouseEvent; + + for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref10; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref10 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref10 = _i6.value; + } + + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointerIds.length === 1) { + var target = interaction.target; + // don't add this pointer if there is a target interactable and it + // isn't gesturable + if (target && !target.options.gesture.enabled) { + continue; } - }function i(e, t, n, r) { - var o = f(r), - s = w(D, e), - a = I[s];if (a && a.events) { - var l = n, - c = void 0, - p = void 0;if (S && (c = k[s], p = w(c.supplied, n), l = c.wrapped[p]), "all" !== t) { - if (a.events[t]) { - var u = a.events[t].length;if ("all" === n) { - for (var d = 0; d < u; d++) { - i(e, t, a.events[t][d], o); - }return; - }for (var v = 0; v < u; v++) { - if (a.events[t][v] === n) { - e[A](C + t, l, P ? o : !!o.capture), a.events[t].splice(v, 1), S && c && 0 === --c.useCount[p] && (c.supplied.splice(p, 1), c.wrapped.splice(p, 1), c.useCount.splice(p, 1));break; - } - }a.events[t] && 0 === a.events[t].length && (a.events[t] = null, a.typeCount--); - }a.typeCount || (I.splice(s, 1), D.splice(s, 1), k.splice(s, 1)); - } else for (t in a.events) { - a.events.hasOwnProperty(t) && i(e, t, "all"); - } + } + // maximum of 2 pointers per interaction + else if (interaction.pointerIds.length >= 2) { + continue; } - }function o(e, t, n, i, o) { - var s = f(o);if (!M[n]) { - M[n] = { selectors: [], contexts: [], listeners: [] };for (var c = 0; c < O.length; c++) { - r(O[c], n, a), r(O[c], n, l, !0); - } - }var p = M[n], - u = void 0;for (u = p.selectors.length - 1; u >= 0 && (p.selectors[u] !== e || p.contexts[u] !== t); u--) {}u === -1 && (u = p.selectors.length, p.selectors.push(e), p.contexts.push(t), p.listeners.push([])), p.listeners[u].push([i, !!s.capture, s.passive]); - }function s(e, t, n, r, o) { - var s = f(o), - c = M[n], - p = !1, - u = void 0;if (c) for (u = c.selectors.length - 1; u >= 0; u--) { - if (c.selectors[u] === e && c.contexts[u] === t) { - for (var d = c.listeners[u], v = d.length - 1; v >= 0; v--) { - var g = d[v], - h = g[0], - m = g[1], - y = g[2];if (h === r && m === !!s.capture && y === s.passive) { - d.splice(v, 1), d.length || (c.selectors.splice(u, 1), c.contexts.splice(u, 1), c.listeners.splice(u, 1), i(t, n, a), i(t, n, l, !0), c.selectors.length || (M[n] = null)), p = !0;break; - } - }if (p) break; + + if (!interaction.interacting() && mouseEvent === interaction.mouse) { + return interaction; + } + } + + return null; + } +}; + +module.exports = finder; + +},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var win = require('./window'); +var isWindow = require('./isWindow'); + +var is = { + array: function array() {}, + + window: function window(thing) { + return thing === win.window || isWindow(thing); + }, + + docFrag: function docFrag(thing) { + return is.object(thing) && thing.nodeType === 11; + }, + + object: function object(thing) { + return !!thing && (typeof thing === 'undefined' ? 'undefined' : _typeof(thing)) === 'object'; + }, + + function: function _function(thing) { + return typeof thing === 'function'; + }, + + number: function number(thing) { + return typeof thing === 'number'; + }, + + bool: function bool(thing) { + return typeof thing === 'boolean'; + }, + + string: function string(thing) { + return typeof thing === 'string'; + }, + + element: function element(thing) { + if (!thing || (typeof thing === 'undefined' ? 'undefined' : _typeof(thing)) !== 'object') { + return false; + } + + var _window = win.getWindow(thing) || win.window; + + return (/object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element //DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string' + ); + } +}; + +is.array = function (thing) { + return is.object(thing) && typeof thing.length !== 'undefined' && is.function(thing.splice); +}; + +module.exports = is; + +},{"./isWindow":47,"./window":52}],47:[function(require,module,exports){ +"use strict"; + +module.exports = function (thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +},{}],48:[function(require,module,exports){ +'use strict'; + +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = module.exports.prefixedPropREs; + var deprecated = false; + + // skip deprecated prefixed properties + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } + + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/ +}; + +module.exports = pointerExtend; + +},{}],49:[function(require,module,exports){ +'use strict'; + +var hypot = require('./hypot'); +var browser = require('./browser'); +var dom = require('./domObjects'); +var domUtils = require('./domUtils'); +var is = require('./is'); +var pointerExtend = require('./pointerExtend'); + +var pointerUtils = { + copyCoords: function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + + dest.timeStamp = src.timeStamp; + }, + + setCoordDeltas: function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; + + // set pointer velocity + var dt = Math.max(targetObj.timeStamp / 1000, 0.001); + + targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt; + targetObj.page.vx = targetObj.page.x / dt; + targetObj.page.vy = targetObj.page.y / dt; + + targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt; + targetObj.client.vx = targetObj.client.x / dt; + targetObj.client.vy = targetObj.client.y / dt; + }, + + isNativePointer: function isNativePointer(pointer) { + return pointer instanceof dom.Event || pointer instanceof dom.Touch; + }, + + // Get specified X/Y coords for mouse or event.touches[0] + getXY: function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + + return xy; + }, + + getPageXY: function getPageXY(pointer, page) { + page = page || {}; + + // Opera Mobile handles the viewport and scrolling oddly + if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) { + pointerUtils.getXY('screen', pointer, page); + + page.x += window.scrollX; + page.y += window.scrollY; + } else { + pointerUtils.getXY('page', pointer, page); + } + + return page; + }, + + getClientXY: function getClientXY(pointer, client) { + client = client || {}; + + if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + pointerUtils.getXY('screen', pointer, client); + } else { + pointerUtils.getXY('client', pointer, client); + } + + return client; + }, + + getPointerId: function getPointerId(pointer) { + return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; + }, + + setCoords: function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerUtils.pointerAverage(pointers) : pointers[0]; + + var tmpXY = {}; + + pointerUtils.getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + + pointerUtils.getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + + targetObj.timeStamp = is.number(timeStamp) ? timeStamp : new Date().getTime(); + }, + + pointerExtend: pointerExtend, + + getTouchPair: function getTouchPair(event) { + var touches = []; + + // array of touches is supplied + if (is.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } + // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; } - }function a(e, t) { - var n = f(t), - r = {}, - i = M[e.type], - o = g.getActualElement(e.path ? e.path[0] : e.target), - s = o;for (h(r, e), r.originalEvent = e, r.preventDefault = p; v.element(s);) { - for (var a = 0; a < i.selectors.length; a++) { - var l = i.selectors[a], - c = i.contexts[a];if (g.matchesSelector(s, l) && g.nodeContains(c, o) && g.nodeContains(c, s)) { - var u = i.listeners[a];r.currentTarget = s;for (var d = 0; d < u.length; d++) { - var m = u[d], - y = m[0], - x = m[1], - b = m[2];x === !!n.capture && b === n.passive && y(r); - } - } - }s = g.parentNode(s); - } - }function l(e) { - return a.call(this, e, !0); - }function c() { - this.returnValue = !1; - }function p() { - this.originalEvent.preventDefault(); - }function u() { - this.cancelBubble = !0; - }function d() { - this.cancelBubble = !0, this.immediatePropagationStopped = !0; - }function f(e) { - return v.object(e) ? e : { capture: e }; - }var v = e("./is"), - g = e("./domUtils"), - h = e("./pointerExtend"), - m = e("./window"), - y = m.window, - x = m.getWindow, - b = e("./arr"), - w = b.indexOf, - E = b.contains, - S = "attachEvent" in y && !("addEventListener" in y), - T = S ? "attachEvent" : "addEventListener", - A = S ? "detachEvent" : "removeEventListener", - C = S ? "on" : "", - D = [], - I = [], - k = [], - M = {}, - O = [], - P = !S && function () { - var e = !1;return y.document.createElement("div").addEventListener("test", null, { get capture() { - e = !0; - } }), e; - }();t.exports = { add: r, remove: i, addDelegate: o, removeDelegate: s, delegateListener: a, delegateUseCapture: l, delegatedEvents: M, documents: O, useAttachEvent: S, supportsOptions: P, _elements: D, _targets: I, _attachedListeners: k }; - }, { "./arr": 33, "./domUtils": 36, "./is": 43, "./pointerExtend": 45, "./window": 48 }], 38: [function (e, t, n) { - "use strict"; - t.exports = function (e, t) { - for (var n in t) { - e[n] = t[n]; - }return e; - }; - }, {}], 39: [function (e, t, n) { - "use strict"; - var r = e("./is"), - i = e("./domUtils"), - o = i.closest, - s = i.parentNode, - a = i.getElementRect, - l = i.trySelector;t.exports = function (e, t, n) { - var i = e.options[n], - c = i && i.origin, - p = c || e.options.origin;return "parent" === p ? p = s(t) : "self" === p ? p = e.getRect(t) : l(p) && (p = o(t, p) || { x: 0, y: 0 }), r.function(p) && (p = p(e && t)), r.element(p) && (p = a(p)), p.x = "x" in p ? p.x : p.left, p.y = "y" in p ? p.y : p.top, p; - }; - }, { "./domUtils": 36, "./is": 43 }], 40: [function (e, t, n) { - "use strict"; - t.exports = function (e, t) { - return Math.sqrt(e * e + t * t); - }; - }, {}], 41: [function (e, t, n) { - "use strict"; - var r = e("./extend"), - i = e("./window"), - o = { warnOnce: function warnOnce(e, t) { - var n = !1;return function () { - return n || (i.window.console.warn(t), n = !0), e.apply(this, arguments); - }; - }, _getQBezierValue: function _getQBezierValue(e, t, n, r) { - var i = 1 - e;return i * i * t + 2 * i * e * n + e * e * r; - }, getQuadraticCurvePoint: function getQuadraticCurvePoint(e, t, n, r, i, s, a) { - return { x: o._getQBezierValue(a, e, n, i), y: o._getQBezierValue(a, t, r, s) }; - }, easeOutQuad: function easeOutQuad(e, t, n, r) { - return e /= r, -n * e * (e - 2) + t; - }, copyAction: function copyAction(e, t) { - return e.name = t.name, e.axis = t.axis, e.edges = t.edges, e; - }, getStringOptionResult: function getStringOptionResult(e, t, n) { - return o.is.string(e) ? e = "parent" === e ? o.parentNode(n) : "self" === e ? t.getRect(n) : o.closest(n, e) : null; - }, is: e("./is"), extend: r, hypot: e("./hypot"), getOriginXY: e("./getOriginXY") };r(o, e("./arr")), r(o, e("./domUtils")), r(o, e("./pointerUtils")), t.exports = o; - }, { "./arr": 33, "./domUtils": 36, "./extend": 38, "./getOriginXY": 39, "./hypot": 40, "./is": 43, "./pointerUtils": 46, "./window": 48 }], 42: [function (e, t, n) { - "use strict"; - var r = e("../scope"), - i = e("./index"), - o = e("./browser"), - s = { methodOrder: ["simulationResume", "mouse", "hasPointer", "idle"], search: function search(e, t, n) { - for (var r = /mouse/i.test(e.pointerType || t) || 4 === e.pointerType, o = i.getPointerId(e), a = { pointer: e, pointerId: o, mouseEvent: r, eventType: t, eventTarget: n }, l = s.methodOrder, c = Array.isArray(l), p = 0, l = c ? l : l[Symbol.iterator]();;) { - var u;if (c) { - if (p >= l.length) break;u = l[p++]; - } else { - if (p = l.next(), p.done) break;u = p.value; - }var d = u, - f = s[d](a);if (f) return f; - } - }, simulationResume: function simulationResume(e) { - var t = e.mouseEvent, - n = e.eventType, - o = e.eventTarget;if (!/down|start/i.test(n)) return null;for (var s = r.interactions, a = Array.isArray(s), l = 0, s = a ? s : s[Symbol.iterator]();;) { - var c;if (a) { - if (l >= s.length) break;c = s[l++]; - } else { - if (l = s.next(), l.done) break;c = l.value; - }var p = c, - u = o;if (p.simulation && p.simulation.allowResume && p.mouse === t) for (; u;) { - if (u === p.element) return p;u = i.parentNode(u); - } - }return null; - }, mouse: function mouse(e) { - var t = e.pointerId, - n = e.mouseEvent, - s = e.eventType;if (!n && (o.supportsTouch || o.supportsPointerEvent)) return null;for (var a = void 0, l = r.interactions, c = Array.isArray(l), p = 0, l = c ? l : l[Symbol.iterator]();;) { - var u;if (c) { - if (p >= l.length) break;u = l[p++]; - } else { - if (p = l.next(), p.done) break;u = p.value; - }var d = u;if (d.mouse) { - if (d.simulation && !i.contains(d.pointerIds, t)) continue;if (d.interacting()) return d;a || (a = d); - } - }if (a) return a;for (var f = r.interactions, v = Array.isArray(f), g = 0, f = v ? f : f[Symbol.iterator]();;) { - var h;if (v) { - if (g >= f.length) break;h = f[g++]; - } else { - if (g = f.next(), g.done) break;h = g.value; - }var m = h;if (m.mouse && (!/down/.test(s) || !m.simulation)) return m; - }return null; - }, hasPointer: function hasPointer(e) { - for (var t = e.pointerId, n = r.interactions, o = Array.isArray(n), s = 0, n = o ? n : n[Symbol.iterator]();;) { - var a;if (o) { - if (s >= n.length) break;a = n[s++]; - } else { - if (s = n.next(), s.done) break;a = s.value; - }var l = a;if (i.contains(l.pointerIds, t)) return l; - } - }, idle: function idle(e) { - for (var t = e.mouseEvent, n = r.interactions, i = Array.isArray(n), o = 0, n = i ? n : n[Symbol.iterator]();;) { - var s;if (i) { - if (o >= n.length) break;s = n[o++]; - } else { - if (o = n.next(), o.done) break;s = o.value; - }var a = s;if (1 === a.pointerIds.length) { - var l = a.target;if (l && !l.options.gesture.enabled) continue; - } else if (a.pointerIds.length >= 2) continue;if (!a.interacting() && t === a.mouse) return a; - }return null; - } };t.exports = s; - }, { "../scope": 31, "./browser": 34, "./index": 41 }], 43: [function (e, t, n) { - "use strict"; - var r = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (e) { - return typeof e === "undefined" ? "undefined" : _typeof(e); - } : function (e) { - return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e === "undefined" ? "undefined" : _typeof(e); - }, - i = e("./window"), - o = e("./isWindow"), - s = { array: function array() {}, window: function window(e) { - return e === i.window || o(e); - }, docFrag: function docFrag(e) { - return s.object(e) && 11 === e.nodeType; - }, object: function object(e) { - return !!e && "object" === (void 0 === e ? "undefined" : r(e)); - }, function: function _function(e) { - return "function" == typeof e; - }, number: function number(e) { - return "number" == typeof e; - }, bool: function bool(e) { - return "boolean" == typeof e; - }, string: function string(e) { - return "string" == typeof e; - }, element: function element(e) { - if (!e || "object" !== (void 0 === e ? "undefined" : r(e))) return !1;var t = i.getWindow(e) || i.window;return (/object|function/.test(r(t.Element)) ? e instanceof t.Element : 1 === e.nodeType && "string" == typeof e.nodeName - ); - } };s.array = function (e) { - return s.object(e) && void 0 !== e.length && s.function(e.splice); - }, t.exports = s; - }, { "./isWindow": 44, "./window": 48 }], 44: [function (e, t, n) { - "use strict"; - t.exports = function (e) { - return !(!e || !e.Window) && e instanceof e.Window; - }; - }, {}], 45: [function (e, t, n) { - "use strict"; - function r(e, n) { - for (var r in n) { - var i = t.exports.prefixedPropREs, - o = !1;for (var s in i) { - if (0 === r.indexOf(s) && i[s].test(r)) { - o = !0;break; - } - }o || "function" == typeof n[r] || (e[r] = n[r]); - }return e; - }r.prefixedPropREs = { webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/ }, t.exports = r; - }, {}], 46: [function (e, t, n) { - "use strict"; - var r = e("./hypot"), - i = e("./browser"), - o = e("./domObjects"), - s = e("./domUtils"), - a = e("./is"), - l = e("./pointerExtend"), - c = { copyCoords: function copyCoords(e, t) { - e.page = e.page || {}, e.page.x = t.page.x, e.page.y = t.page.y, e.client = e.client || {}, e.client.x = t.client.x, e.client.y = t.client.y, e.timeStamp = t.timeStamp; - }, setCoordDeltas: function setCoordDeltas(e, t, n) { - e.page.x = n.page.x - t.page.x, e.page.y = n.page.y - t.page.y, e.client.x = n.client.x - t.client.x, e.client.y = n.client.y - t.client.y, e.timeStamp = n.timeStamp - t.timeStamp;var i = Math.max(e.timeStamp / 1e3, .001);e.page.speed = r(e.page.x, e.page.y) / i, e.page.vx = e.page.x / i, e.page.vy = e.page.y / i, e.client.speed = r(e.client.x, e.page.y) / i, e.client.vx = e.client.x / i, e.client.vy = e.client.y / i; - }, isNativePointer: function isNativePointer(e) { - return e instanceof o.Event || e instanceof o.Touch; - }, getXY: function getXY(e, t, n) { - return n = n || {}, e = e || "page", n.x = t[e + "X"], n.y = t[e + "Y"], n; - }, getPageXY: function getPageXY(e, t) { - return t = t || {}, i.isOperaMobile && c.isNativePointer(e) ? (c.getXY("screen", e, t), t.x += window.scrollX, t.y += window.scrollY) : c.getXY("page", e, t), t; - }, getClientXY: function getClientXY(e, t) { - return t = t || {}, i.isOperaMobile && c.isNativePointer(e) ? c.getXY("screen", e, t) : c.getXY("client", e, t), t; - }, getPointerId: function getPointerId(e) { - return a.number(e.pointerId) ? e.pointerId : e.identifier; - }, setCoords: function setCoords(e, t, n) { - var r = t.length > 1 ? c.pointerAverage(t) : t[0], - i = {};c.getPageXY(r, i), e.page.x = i.x, e.page.y = i.y, c.getClientXY(r, i), e.client.x = i.x, e.client.y = i.y, e.timeStamp = a.number(n) ? n : new Date().getTime(); - }, pointerExtend: l, getTouchPair: function getTouchPair(e) { - var t = [];return a.array(e) ? (t[0] = e[0], t[1] = e[1]) : "touchend" === e.type ? 1 === e.touches.length ? (t[0] = e.touches[0], t[1] = e.changedTouches[0]) : 0 === e.touches.length && (t[0] = e.changedTouches[0], t[1] = e.changedTouches[1]) : (t[0] = e.touches[0], t[1] = e.touches[1]), t; - }, pointerAverage: function pointerAverage(e) { - for (var t = { pageX: 0, pageY: 0, clientX: 0, clientY: 0, screenX: 0, screenY: 0 }, n = e, r = Array.isArray(n), i = 0, n = r ? n : n[Symbol.iterator]();;) { - var o;if (r) { - if (i >= n.length) break;o = n[i++]; - } else { - if (i = n.next(), i.done) break;o = i.value; - }var s = o;for (var a in t) { - t[a] += s[a]; - } - }for (var l in t) { - t[l] /= e.length; - }return t; - }, touchBBox: function touchBBox(e) { - if (e.length || e.touches && e.touches.length > 1) { - var t = c.getTouchPair(e), - n = Math.min(t[0].pageX, t[1].pageX), - r = Math.min(t[0].pageY, t[1].pageY);return { x: n, y: r, left: n, top: r, width: Math.max(t[0].pageX, t[1].pageX) - n, height: Math.max(t[0].pageY, t[1].pageY) - r }; - } - }, touchDistance: function touchDistance(e, t) { - var n = t + "X", - i = t + "Y", - o = c.getTouchPair(e);return r(o[0][n] - o[1][n], o[0][i] - o[1][i]); - }, touchAngle: function touchAngle(e, t, n) { - var r = n + "X", - i = n + "Y", - o = c.getTouchPair(e), - s = o[1][r] - o[0][r], - a = o[1][i] - o[0][i];return 180 * Math.atan2(a, s) / Math.PI; - }, getPointerType: function getPointerType(e, t) { - return t.mouse ? "mouse" : i.supportsPointerEvent ? a.string(e.pointerType) ? e.pointerType : [void 0, void 0, "touch", "pen", "mouse"][e.pointerType] : "touch"; - }, getEventTargets: function getEventTargets(e) { - return [s.getActualElement(e.path ? e.path[0] : e.target), s.getActualElement(e.currentTarget)]; - } };t.exports = c; - }, { "./browser": 34, "./domObjects": 35, "./domUtils": 36, "./hypot": 40, "./is": 43, "./pointerExtend": 45 }], 47: [function (e, t, n) { - "use strict"; - for (var r = e("./window"), i = r.window, o = ["ms", "moz", "webkit", "o"], s = 0, a = void 0, l = void 0, c = 0; c < o.length && !i.requestAnimationFrame; c++) { - a = i[o[c] + "RequestAnimationFrame"], l = i[o[c] + "CancelAnimationFrame"] || i[o[c] + "CancelRequestAnimationFrame"]; - }a || (a = function a(e) { - var t = new Date().getTime(), - n = Math.max(0, 16 - (t - s)), - r = setTimeout(function () { - e(t + n); - }, n);return s = t + n, r; - }), l || (l = function l(e) { - clearTimeout(e); - }), t.exports = { request: a, cancel: l }; - }, { "./window": 48 }], 48: [function (e, t, n) { - "use strict"; - function r(e) { - i.realWindow = e;var t = e.document.createTextNode("");t.ownerDocument !== e.document && "function" == typeof e.wrap && e.wrap(t) === t && (e = e.wrap(e)), i.window = e; - }var i = t.exports, - o = e("./isWindow");"undefined" == typeof window ? (i.window = void 0, i.realWindow = void 0) : r(window), i.getWindow = function (e) { - if (o(e)) return e;var t = e.ownerDocument || e;return t.defaultView || t.parentWindow || i.window; - }, i.init = r; - }, { "./isWindow": 44 }] }, {}, [1])(1); -}); + } + + return touches; + }, + + pointerAverage: function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; + + for (var _iterator = pointers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var pointer = _ref; + + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } + for (var prop in average) { + average[prop] /= pointers.length; + } + + return average; + }, + + touchBBox: function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return; + } + + var touches = pointerUtils.getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + + return { + x: minX, + y: minY, + left: minX, + top: minY, + width: maxX - minX, + height: maxY - minY + }; + }, + + touchDistance: function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = pointerUtils.getTouchPair(event); + + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + + return hypot(dx, dy); + }, + + touchAngle: function touchAngle(event, prevAngle, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = pointerUtils.getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + + return angle; + }, + + getPointerType: function getPointerType(pointer, interaction) { + // if the PointerEvent API isn't available, then the pointer must be ither + // a MouseEvent or TouchEvent + if (interaction.mouse) { + return 'mouse'; + } + if (!browser.supportsPointerEvent) { + return 'touch'; + } + + return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + }, + + // [ event.target, event.currentTarget ] + getEventTargets: function getEventTargets(event) { + return [domUtils.getActualElement(event.path ? event.path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; + } +}; + +module.exports = pointerUtils; + +},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(require,module,exports){ +'use strict'; + +var _require = require('./window'), + window = _require.window; + +var vendors = ['ms', 'moz', 'webkit', 'o']; +var lastTime = 0; +var request = void 0; +var cancel = void 0; + +for (var x = 0; x < vendors.length && !window.requestAnimationFrame; x++) { + request = window[vendors[x] + 'RequestAnimationFrame']; + cancel = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; +} + +if (!request) { + request = function request(callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + + lastTime = currTime + timeToCall; + return id; + }; +} + +if (!cancel) { + cancel = function cancel(id) { + clearTimeout(id); + }; +} + +module.exports = { + request: request, + cancel: cancel +}; + +},{"./window":52}],51:[function(require,module,exports){ +'use strict'; + +var extend = require('./extend'); + +module.exports = { + xywhToTlbr: function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = extend({}, rect); + + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; + }, + + tlbrToXywh: function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = extend({}, rect); + + rect.x = rect.left || 0; + rect.top = rect.top || 0; + rect.width = rect.width || rect.right - rect.x; + rect.height = rect.height || rect.bottom - rect.y; + } + + return rect; + } +}; + +},{"./extend":41}],52:[function(require,module,exports){ +'use strict'; + +var win = module.exports; +var isWindow = require('./isWindow'); + +function init(window) { + // get wrapped window if using Shadow DOM polyfill + + win.realWindow = window; + + // create a TextNode + var el = window.document.createTextNode(''); + + // check if it's wrapped by a polyfill + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } + + win.window = window; +} + +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + init(window); +} + +win.getWindow = function getWindow(node) { + if (isWindow(node)) { + return node; + } + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || rootNode.parentWindow || win.window; +}; -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +win.init = init; -},{}]},{},[1])(1) +},{"./isWindow":47}]},{},[1])(1) }); diff --git a/dist/interact.js.map b/dist/interact.js.map index 2aec53786..abdf38d1b 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","dist/interact.min.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js @41ef1c4\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h=\"start\"===c,m=\"end\"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||\"\"),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire(\"set-xy\",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire(\"set-delta\",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||\"inertiastart\"===c?this.getSwipe():null,a.fire(\"new\",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on(\"set-delta\",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;\"client\"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{\"./defaultOptions\":18,\"./utils/Signals\":32,\"./utils/extend\":38,\"./utils/getOriginXY\":39}],4:[function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var i=e(\"./utils/is\"),o=e(\"./utils/events\"),s=e(\"./utils/extend\"),a=e(\"./actions/base\"),l=e(\"./scope\"),c=e(\"./Eventable\"),p=e(\"./defaultOptions\"),u=e(\"./utils/Signals\").new(),d=e(\"./utils/domUtils\"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e(\"./utils/window\"),m=h.getWindow,y=e(\"./utils/arr\"),x=y.indexOf,b=y.contains,w=e(\"./utils/browser\"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire(\"new\",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n=\"on\"+e;return i.function(t.onstart)&&(this.events[n+\"start\"]=t.onstart),i.function(t.onmove)&&(this.events[n+\"move\"]=t.onmove),i.function(t.onend)&&(this.events[n+\"end\"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+\"inertiastart\"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&\"enabled\"in p.perAction[n]&&(this.options[e][n].enabled=t[n].enabled!==!1)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption(\"origin\",e)},e.prototype.deltaSource=function(e){return\"page\"===e||\"client\"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&t.search(\" \")!==-1&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire(\"set\",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,\"all\"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,\"all\");u.fire(\"unset\",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire(\"move\",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire(\"before-action-move\",e),this._dontFireMove||d.fire(\"action-move\",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?\"cancel\":\"up\",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire(\"action-end\",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire(\"stop\",{interaction:this}),this._interacting&&(d.fire(\"stop-active\",{interaction:this}),d.fire(\"stop-\"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return i===-1&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire(\"update-pointer-down\",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);r!==-1&&(d.fire(\"remove-pointer\",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on(\"unset\",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push(\"dropChecker\"),g.signals.on(\"new\",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on(\"stop\",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,[\"dragenter\",\"dragleave\",\"dropactivate\",\"dropdeactivate\",\"dropmove\",\"drop\"]),c.methodDict.drop=\"dropzone\",h.drop=m.defaults,t.exports=m},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../interact\":21,\"../scope\":31,\"../utils\":41,\"./base\":6}],9:[function(e,t,n){\"use strict\";var r=e(\"./base\"),i=e(\"../utils\"),o=e(\"../InteractEvent\"),s=e(\"../Interactable\"),a=e(\"../Interaction\"),l=e(\"../defaultOptions\"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:\"gesture\"}:null},getCursor:function(){return\"\"}};o.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;\"gesturestart\"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;\"gesturemove\"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=e.enabled!==!1,this.setPerAction(\"gesture\",e),this.setOnEvents(\"gesture\",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on(\"set-delta\",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if(\"gesture\"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on(\"new\",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push(\"gesture\"),i.merge(s.eventTypes,[\"gesturestart\",\"gesturemove\",\"gestureend\"]),r.methodDict.gesture=\"gesturable\",l.gesture=c.defaults,t.exports=c},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../utils\":41,\"./base\":6}],10:[function(e,t,n){\"use strict\";function r(e,t,n,r,i,s,a){if(!t)return!1;if(t===!0){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&(\"left\"===e?e=\"right\":\"right\"===e&&(e=\"left\")),c<0&&(\"top\"===e?e=\"bottom\":\"bottom\"===e&&(e=\"top\")),\"left\"===e)return n.x<(l>=0?s.left:s.right)+a;if(\"top\"===e)return n.y<(c>=0?s.top:s.bottom)+a;if(\"right\"===e)return n.x>(l>=0?s.right:s.left)-a;if(\"bottom\"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e(\"./base\"),o=e(\"../utils\"),s=e(\"../utils/browser\"),a=e(\"../InteractEvent\"),l=e(\"../Interactable\"),c=e(\"../Interaction\"),p=e(\"../defaultOptions\"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:\"xy\",margin:NaN,edges:null,invert:\"none\"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:\"resize\",edges:d}}else{var v=\"y\"!==c.resize.axis&&l.x>a.right-u,g=\"x\"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:\"resize\",axes:(v?\"x\":\"\")+(g?\"y\":\"\")}}}return null},cursors:s.isIe9OrOlder?{x:\"e-resize\",y:\"s-resize\",xy:\"se-resize\",top:\"n-resize\",left:\"w-resize\",bottom:\"s-resize\",right:\"e-resize\",topleft:\"se-resize\",bottomright:\"se-resize\",topright:\"ne-resize\",bottomleft:\"ne-resize\"}:{x:\"ew-resize\",y:\"ns-resize\",xy:\"nwse-resize\",top:\"ns-resize\",left:\"ew-resize\",bottom:\"ns-resize\",right:\"ew-resize\",topleft:\"nwse-resize\",bottomright:\"nwse-resize\",topright:\"nesw-resize\",bottomleft:\"nesw-resize\"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t=\"\",n=[\"top\",\"bottom\",\"left\",\"right\"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;if(\"resizestart\"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),restricted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.restricted,t.deltaRect=n.resizeRects.delta}}),a.signals.on(\"new\",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if(\"move\"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a=\"reposition\"===s||\"negate\"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.restricted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),\"reposition\"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=e.enabled!==!1,this.setPerAction(\"resize\",e),this.setOnEvents(\"resize\",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),\nthis):this.options.resize},c.signals.on(\"new\",function(e){e.resizeAxes=\"xy\"}),a.signals.on(\"set-delta\",function(e){var t=e.interaction,n=e.iEvent;\"resize\"===e.action&&t.resizeAxes&&(t.target.options.resize.square?(\"y\"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes=\"xy\"):(n.axes=t.resizeAxes,\"x\"===t.resizeAxes?n.dy=0:\"y\"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push(\"resize\"),o.merge(l.eventTypes,[\"resizestart\",\"resizemove\",\"resizeinertiastart\",\"resizeinertiaresume\",\"resizeend\"]),i.methodDict.resize=\"resizable\",p.resize=d.defaults,t.exports=d},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../utils\":41,\"../utils/browser\":34,\"./base\":6}],11:[function(e,t,n){\"use strict\";var r=e(\"./utils/raf\"),i=e(\"./utils/window\").getWindow,o=e(\"./utils/is\"),s=e(\"./utils/domUtils\"),a=e(\"./Interaction\"),l=e(\"./defaultOptions\"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on(\"stop-active\",function(){c.stop()}),a.signals.on(\"action-move\",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{\"./Interaction\":5,\"./defaultOptions\":18,\"./utils/domUtils\":36,\"./utils/is\":43,\"./utils/raf\":47,\"./utils/window\":48}],12:[function(e,t,n){\"use strict\";var r=e(\"../Interactable\"),i=e(\"../actions/base\"),o=e(\"../utils/is\"),s=e(\"../utils/domUtils\");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption(\"ignoreFrom\",e)},r.prototype.allowFrom=function(e){return this._backCompatOption(\"allowFrom\",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{\"../Interactable\":4,\"../actions/base\":6,\"../utils/domUtils\":36,\"../utils/is\":43}],13:[function(e,t,n){\"use strict\";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e(\"../interact\"),c=e(\"../Interactable\"),p=e(\"../Interaction\"),u=e(\"../actions/base\"),d=e(\"../defaultOptions\"),f=e(\"../utils/browser\"),v=e(\"../scope\"),g=e(\"../utils\"),h=e(\"../utils/Signals\").new();e(\"./InteractableMethods\");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on(\"down\",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on(\"move\",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on(\"move\",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire(\"before-start\",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on(\"stop\",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor=\"\")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push(\"styleCursor\"),c.settingsMethods.push(\"actionChecker\"),c.settingsMethods.push(\"ignoreFrom\"),c.settingsMethods.push(\"allowFrom\"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{\"../Interactable\":4,\"../Interaction\":5,\"../actions/base\":6,\"../defaultOptions\":18,\"../interact\":21,\"../scope\":31,\"../utils\":41,\"../utils/Signals\":32,\"../utils/browser\":34,\"./InteractableMethods\":12}],14:[function(e,t,n){\"use strict\";var r=e(\"./base\"),i=e(\"../Interaction\");i.signals.on(\"new\",function(e){e.delayTimer=null}),r.signals.on(\"prepared\",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on(\"move\",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on(\"before-start\",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{\"../Interaction\":5,\"./base\":13}],15:[function(e,t,n){\"use strict\";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return\"xy\"===e||\"xy\"===n||n===e}var i=e(\"./base\"),o=e(\"../scope\"),s=e(\"../utils/browser\"),a=e(\"../utils/is\"),l=e(\"../utils/domUtils\"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e(\"../actions/drag\")),i.signals.on(\"before-start\",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if(\"drag\"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?\"x\":dl.minSpeed&&g>l.endSpeed,h&&!m&&(c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),x.shouldMove&&x.locked&&(y=!0)),(m||y)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,\"inertiastart\",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),m?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),i.modifiedXe+=x.dx,i.modifiedYe+=x.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=x.dx,i.ye=x.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on(\"stop-active\",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{\"./InteractEvent\":3,\"./Interaction\":5,\"./modifiers\":24,\"./utils\":41,\"./utils/raf\":47}],21:[function(e,t,n){\"use strict\";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e(\"./utils/browser\"),o=e(\"./utils/events\"),s=e(\"./utils\"),a=e(\"./scope\"),l=e(\"./Interactable\"),c=e(\"./Interaction\"),p={};r.isSet=function(e,t){return a.interactables.indexOfElement(e,t&&t.context)!==-1},r.on=function(e,t,n){if(s.is.string(e)&&e.search(\" \")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,n),r},r.off=function(e,t,n){if(s.is.string(e)&&e.search(\" \")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&(g=s.indexOf(p[e],t))!==-1&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{\"./Interactable\":4,\"./Interaction\":5,\"./scope\":31,\"./utils\":41,\"./utils/browser\":34,\"./utils/events\":37}],22:[function(e,t,n){\"use strict\";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e(\"./Interactable\"),o=e(\"./Interaction\"),s=e(\"./scope\"),a=e(\"./utils/is\"),l=e(\"./utils/domUtils\"),c=l.nodeContains,p=l.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?\"always\":\"never\",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if(\"never\"!==t)return\"always\"===t?void e.preventDefault():void(/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||p(e.target,\"input,select,textarea,[contenteditable=true],[contenteditable=true] *\")||e.preventDefault())};for(var u=[\"down\",\"move\",\"up\",\"cancel\"],d=0;d=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||c(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{\"./Interactable\":4,\"./Interaction\":5,\"./scope\":31,\"./utils/domUtils\":36,\"./utils/is\":43}],23:[function(e,t,n){\"use strict\";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:\"tap\"}))}var i=e(\"./scope\"),o=e(\"./utils/events\"),s=e(\"./utils/browser\"),a=e(\"./utils/interactionFinder\"),l=e(\"./pointerEvents/base\"),c=e(\"./utils/window\"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return\"[object Array]\"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf(\"listen\")?o.add:o.remove);i(n,\"selectstart\",d),l&&i(n,\"dblclick\",r)};i.signals.on(\"add-document\",f),i.signals.on(\"remove-document\",f)}t.exports=null},{\"./pointerEvents/base\":28,\"./scope\":31,\"./utils/browser\":34,\"./utils/events\":37,\"./utils/interactionFinder\":42,\"./utils/window\":48}],24:[function(e,t,n){\"use strict\";var r=e(\"../InteractEvent\"),i=e(\"../Interaction\"),o=e(\"../utils/extend\"),s={names:[],setOffsets:function(e,t){var n=e.target,r=e.element,i=n.getRect(r);i?(e.startOffset.left=t.page.x-i.left,e.startOffset.top=t.page.y-i.top,e.startOffset.right=i.right-t.page.x,e.startOffset.bottom=i.bottom-t.page.y,\"width\"in i||(i.width=i.right-i.left),\"height\"in i||(i.height=i.bottom-i.top)):e.startOffset.left=e.startOffset.top=e.startOffset.right=e.startOffset.bottom=0,s.setModifierOffsets(e,n,r,i,e.modifierOffsets)},setModifierOffsets:function(e,t,n,r,i){for(var o=0;o=u.length)break;v=u[f++]}else{if(f=u.next(),f.done)break;v=f.value}var g=v,h=s[g];h.shouldDo(l,e.prepared.name,r,i)&&(p=h.set(c,e,n[g]),p.locked&&(c.x+=p.dx,c.y+=p.dy,a.dx+=p.dx,a.dy+=p.dy,a.locked=!0))}return a.shouldMove=!p||p.changed,a},resetStatuses:function(e){for(var t=s.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;e[o]=s[o].reset(e[o]||{})}return e},start:function(e,t){var n=e.interaction;s.setOffsets(n,\"action-resume\"===t?n.curCoords:n.startCoords),s.resetStatuses(n.modifierStatuses),n.modifierResult=s.setAll(n,n.startCoords.page,n.modifierStatuses)}};i.signals.on(\"new\",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=s.resetStatuses({}),e.modifierResult=null}),i.signals.on(\"action-start\",s.start),i.signals.on(\"action-resume\",s.start),i.signals.on(\"before-action-move\",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=s.setAll(t,t.curCoords.page,t.modifierStatuses,n);!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),i.signals.on(\"action-end\",function(e){for(var t=e.interaction,n=e.event,r=0;r=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=v.x,h=v.y;s.push({x:i.left-r.width*g+c.x,y:i.top-r.height*h+c.y})}else s.push(c);return s},set:function(e,t,n){var r=t.target.options[t.prepared.name].snap,i=[],s=void 0,a=void 0,l=void 0;if(n.useStatusXY)a={x:n.x,y:n.y};else{var c=o.getOriginXY(t.target,t.element,t.prepared.name);a=o.extend({},e),a.x-=c.x,a.y-=c.y}n.realX=a.x,n.realY=a.y;for(var p=t.modifierOffsets.snap,u=r.targets?r.targets.length:0,d=p,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}for(var h=g,m=h.x,y=h.y,x=a.x-m,b=a.y-y,w=r.targets,E=Array.isArray(w),S=0,w=E?w:w[Symbol.iterator]();;){var T;if(E){if(S>=w.length)break;T=w[S++]}else{if(S=w.next(),S.done)break;T=S.value}var A=T;s=o.is.function(A)?A(x,b,t):A,s&&i.push({x:o.is.number(s.x)?s.x+m:x,y:o.is.number(s.y)?s.y+y:b,range:o.is.number(s.range)?s.range:r.range})}}var C={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(l=0,u=i.length;l=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire(\"collect-targets\",c)}return\"hold\"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e(\"./PointerEvent\"),s=e(\"../Interaction\"),a=e(\"../utils\"),l=e(\"../utils/browser\"),c=e(\"../defaultOptions\"),p=e(\"../utils/Signals\").new(),u=e(\"../utils/arr\"),d=u.filter,f=[\"down\",\"up\",\"cancel\"],v=[\"down\",\"up\",\"cancel\"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:[\"down\",\"move\",\"up\",\"cancel\",\"tap\",\"doubletap\",\"hold\"]};s.signals.on(\"update-pointer-down\",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on(\"remove-pointer\",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on(\"move\",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:\"move\"}))}),s.signals.on(\"down\",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:\"hold\",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire(\"collect-targets\",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);u===-1&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=M[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(M[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=M[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{\"../scope\":31,\"./browser\":34,\"./index\":41}],43:[function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=e(\"./window\"),o=e(\"./isWindow\"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&\"object\"===(void 0===e?\"undefined\":r(e))},function:function(e){return\"function\"==typeof e},number:function(e){return\"number\"==typeof e},bool:function(e){return\"boolean\"==typeof e},string:function(e){return\"string\"==typeof e},element:function(e){if(!e||\"object\"!==(void 0===e?\"undefined\":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&\"string\"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{\"./isWindow\":44,\"./window\":48}],44:[function(e,t,n){\"use strict\";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],45:[function(e,t,n){\"use strict\";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||\"function\"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],46:[function(e,t,n){\"use strict\";var r=e(\"./hypot\"),i=e(\"./browser\"),o=e(\"./domObjects\"),s=e(\"./domUtils\"),a=e(\"./is\"),l=e(\"./pointerExtend\"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||\"page\",n.x=t[e+\"X\"],n.y=t[e+\"Y\"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY(\"screen\",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY(\"page\",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY(\"screen\",e,t):c.getXY(\"client\",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):\"touchend\"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+\"X\",i=t+\"Y\",o=c.getTouchPair(e);return r(o[0][n]-o[1][n],o[0][i]-o[1][i])},touchAngle:function(e,t,n){var r=n+\"X\",i=n+\"Y\",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?\"mouse\":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,\"touch\",\"pen\",\"mouse\"][e.pointerType]:\"touch\"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{\"./browser\":34,\"./domObjects\":35,\"./domUtils\":36,\"./hypot\":40,\"./is\":43,\"./pointerExtend\":45}],47:[function(e,t,n){\"use strict\";for(var r=e(\"./window\"),i=r.window,o=[\"ms\",\"moz\",\"webkit\",\"o\"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, useCapture) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, useCapture);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - useCapture (boolean) #optional useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, useCapture) {\n // convert to boolean\n useCapture = !!useCapture;\n\n if (this._onOffMultiple('on', eventType, listener, useCapture)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, useCapture);\n }\n else {\n events.add(this.target, eventType, listener, useCapture);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - useCapture (boolean) #optional useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, useCapture) {\n // convert to boolean\n useCapture = !!useCapture;\n\n if (this._onOffMultiple('off', eventType, listener, useCapture)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, useCapture);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, useCapture);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n firePrepared(interaction, event, 'start');\n interaction._interacting = true;\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n let inertiaPossible = false;\n let inertia = false;\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - useCapture (boolean) #optional useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, useCapture) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, useCapture);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, useCapture);\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - useCapture (boolean) #optional useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, useCapture) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, useCapture);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, useCapture);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n value = utils.getStringOptionResult(value, interaction.target, interaction.element) || value;\n\n if (utils.is.function(value)) {\n value = value(page.x, page.y, interaction);\n }\n\n if (utils.is.element(value)) {\n value = utils.getElementRect(value);\n }\n\n return value;\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction), page) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction), page) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n min: utils.extend({}, restrictEdges.noMin),\n max: utils.extend({}, restrictEdges.noMax),\n };\n\n if (edges.top) {\n arg.options.min.top = rect.bottom - maxSize.height;\n arg.options.max.top = rect.bottom - minSize.height;\n }\n else if (edges.bottom) {\n arg.options.min.bottom = rect.top + minSize.height;\n arg.options.max.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.min.left = rect.right - maxSize.width;\n arg.options.max.left = rect.right - minSize.width;\n }\n else if (edges.right) {\n arg.options.min.right = rect.left + minSize.width;\n arg.options.max.right = rect.left + maxSize.width;\n }\n\n return restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const origin = options.origin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else if (options.offset === 'self') {\n snapOffset = {\n x: rect.left - origin.x,\n y: rect.top - origin.y,\n };\n }\n else {\n snapOffset = options.offset || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n trySelector,\n} = require('./domUtils');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n let origin = actionOrigin || target.options.origin;\n\n if (origin === 'parent') {\n origin = parentNode(element);\n }\n else if (origin === 'self') {\n origin = target.getRect(element);\n }\n else if (trySelector(origin)) {\n origin = closest(element, origin) || { x: 0, y: 0 };\n }\n\n if (is.function(origin)) {\n origin = origin(target && element);\n }\n\n if (is.element(origin)) {\n origin = getElementRect(origin);\n }\n\n origin.x = ('x' in origin)? origin.x : origin.left;\n origin.y = ('y' in origin)? origin.y : origin.top;\n\n return origin;\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n getStringOptionResult: function (value, interactable, element) {\n if (!utils.is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = utils.parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = utils.closest(element, value);\n }\n\n return value;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\n\nmodule.exports = {\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index b44c66000..d0e191c23 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js @41ef1c4 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){var e;return function e(t,n,r){function i(a,s){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[a]={exports:{}};t[a][0].call(p.exports,function(e){var n=t[a][1][e];return i(n?n:e)},p,p.exports,e,t,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||a).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};s.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,s.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,s.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();s.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=s,t.exports=l},{"./defaultOptions":18,"./utils/Signals":32,"./utils/extend":38,"./utils/getOriginXY":39}],4:[function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),a=e("./utils/extend"),s=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=a(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=t[n].enabled!==!1)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=s.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(o>=n.length)break;a=n[o++]}else{if(o=n.next(),o.done)break;a=o.value}var l=a;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&t.search(" ")!==-1&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),a=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(a>=n.length)break;s=n[a++]}else{if(a=n.next(),a.done)break;s=a.value}var c=s;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var s={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:a,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",s),i||(this.interacting()&&this.doMove(s),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return i===-1&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);r!==-1&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;s=i[a++]}else{if(a=i.next(),a.done)break;s=a.value}var l=s;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}return f&&p.is.number(s)&&(a=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=s),this.options.drop.checker&&(a=this.options.drop.checker(e,t,a,this,i,n,r)),a},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":31,"../utils":41,"./base":6}],9:[function(e,t,n){var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),a=e("../Interactable"),s=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),a.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=e.enabled!==!1,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,a=e.event,s=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],s?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||a instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),s.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(a.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":41,"./base":6}],10:[function(e,t,n){function r(e,t,n,r,i,a,s){if(!t)return!1;if(t===!0){var l=o.is.number(a.width)?a.width:a.right-a.left,c=o.is.number(a.height)?a.height:a.bottom-a.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?a.left:a.right)+s;if("top"===e)return n.y<(c>=0?a.top:a.bottom)+s;if("right"===e)return n.x>(l>=0?a.right:a.left)-s;if("bottom"===e)return n.y>(c>=0?a.bottom:a.top)-s}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),a=e("../utils/browser"),s=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=a.supportsTouch||a.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,a,s){if(!s)return null;var l=o.extend({},a.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,a._eventTarget,i,s,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>s.right-u,g="x"!==c.resize.axis&&l.y>s.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:a.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};s.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var a=o.extend({},n.prepared.edges);a.top=a.top||a.left&&!a.bottom,a.left=a.left||a.top&&!a.right,a.bottom=a.bottom||a.right&&!a.top,a.right=a.right||a.bottom&&!a.left,n.prepared._linkedEdges=a}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),restricted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.restricted,t.deltaRect=n.resizeRects.delta}}),s.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,a=i.invert,s="reposition"===a||"negate"===a,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.restricted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),s){if(o.extend(u,p),"reposition"===a){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)} -}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=e.enabled!==!1,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),s.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":41,"../utils/browser":34,"./base":6}],11:[function(e,t,n){var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),a=e("./utils/domUtils"),s=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),a=(n-c.prevTime)/1e3,s=e.speed*a;s>=1&&(o.window(t)?t.scrollBy(c.x*s,c.y*s):t&&(t.scrollLeft+=c.x*s,t.scrollTop+=c.y*s),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,s=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=a.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=s?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};s.signals.on("stop-active",function(){c.stop()}),s.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":36,"./utils/is":43,"./utils/raf":47,"./utils/window":48}],12:[function(e,t,n){var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),a=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?a.matchesUpTo(n,e,t):!!o.element(e)&&a.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?a.matchesUpTo(n,e,t):!!o.element(e)&&a.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),a=null,s=i.names,l=Array.isArray(s),c=0,s=l?s:s[Symbol.iterator]();;){var p;if(l){if(c>=s.length)break;p=s[c++]}else{if(c=s.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(a=i[u].checker(e,t,this,r,n,o)))return a}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":36,"../utils/is":43}],13:[function(e,t,n){function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&s(t,n,e)?e:null}function i(e,t,n,i,o,a){for(var s=0,l=i.length;s=m.maxInteractions)return!1;if(u.target===e){if((s+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:s,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;t.interacting()||a(t,o(t,n,r,i))}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;!t.mouse||t.pointerIsDown||t.interacting()||a(t,o(t,n,r,i))}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!s(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],a=null,s=u.names,l=Array.isArray(s),c=0,s=l?s:s[Symbol.iterator]();;){var p;if(l){if(c>=s.length)break;p=s[c++]}else{if(c=s.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(a=u[d].checker(e,t,this,r,n,i)))return a}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":31,"../utils":41,"../utils/Signals":32,"../utils/browser":34,"./InteractableMethods":12}],14:[function(e,t,n){var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;n&&t.target.options[n].delay>0&&(t.prepared.name=null)})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),a=e("../utils/browser"),s=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,h&&!m&&(c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),x.shouldMove&&x.locked&&(y=!0)),(m||y)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new s(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),m?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),i.modifiedXe+=x.dx,i.modifiedYe+=x.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=x.dx,i.ye=x.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":41,"./utils/raf":47}],21:[function(e,t,n){function r(e,t){var n=s.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),a=e("./utils"),s=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return s.interactables.indexOfElement(e,t&&t.context)!==-1},r.on=function(e,t,n){if(a.is.string(e)&&e.search(" ")!==-1&&(e=e.trim().split(/ +/)),a.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(a.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return a.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(s.document,e,t,n),r},r.off=function(e,t,n){if(a.is.string(e)&&e.search(" ")!==-1&&(e=e.trim().split(/ +/)),a.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(a.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(a.contains(l.eventTypes,e)){var g=void 0;e in p&&(g=a.indexOf(p[e],t))!==-1&&p[e].splice(g,1)}else o.remove(s.document,e,t,n);return r},r.debug=function(){return s},r.getPointerAverage=a.pointerAverage,r.getTouchBBox=a.touchBBox,r.getTouchDistance=a.touchDistance,r.getTouchAngle=a.touchAngle,r.getElementRect=a.getElementRect,r.getElementClientRect=a.getElementClientRect,r.matchesSelector=a.matchesSelector,r.closest=a.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=s.interactions.length-1;t>=0;t--)s.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return a.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=s.addDocument,r.removeDocument=s.removeDocument,s.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":31,"./utils":41,"./utils/browser":34,"./utils/events":37}],22:[function(e,t,n){function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),a=e("./scope"),s=e("./utils/is"),l=e("./utils/domUtils"),c=l.nodeContains,p=l.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):s.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||p(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var u=["down","move","up","cancel"],d=0;d=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||c(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":31,"./utils/domUtils":36,"./utils/is":43}],23:[function(e,t,n){function r(e){var t=e.target,n=s.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),a=e("./utils/browser"),s=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),a.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var a=o;a.interacting()&&a.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":28,"./scope":31,"./utils/browser":34,"./utils/events":37,"./utils/interactionFinder":42,"./utils/window":48}],24:[function(e,t,n){var r=e("../InteractEvent"),i=e("../Interaction"),o=e("../utils/extend"),a={names:[],setOffsets:function(e,t){var n=e.target,r=e.element,i=n.getRect(r);i?(e.startOffset.left=t.page.x-i.left,e.startOffset.top=t.page.y-i.top,e.startOffset.right=i.right-t.page.x,e.startOffset.bottom=i.bottom-t.page.y,"width"in i||(i.width=i.right-i.left),"height"in i||(i.height=i.bottom-i.top)):e.startOffset.left=e.startOffset.top=e.startOffset.right=e.startOffset.bottom=0,a.setModifierOffsets(e,n,r,i,e.modifierOffsets)},setModifierOffsets:function(e,t,n,r,i){for(var o=0;o=u.length)break;v=u[f++]}else{if(f=u.next(),f.done)break;v=f.value}var g=v,h=a[g];h.shouldDo(l,e.prepared.name,r,i)&&(p=h.set(c,e,n[g]),p.locked&&(c.x+=p.dx,c.y+=p.dy,s.dx+=p.dx,s.dy+=p.dy,s.locked=!0))}return s.shouldMove=!p||p.changed,s},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;e[o]=a[o].reset(e[o]||{})}return e},start:function(e,t){var n=e.interaction;a.setOffsets(n,"action-resume"===t?n.curCoords:n.startCoords),a.resetStatuses(n.modifierStatuses),n.modifierResult=a.setAll(n,n.startCoords.page,n.modifierStatuses)}};i.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),i.signals.on("action-start",a.start),i.signals.on("action-resume",a.start),i.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll(t,t.curCoords.page,t.modifierStatuses,n);!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),i.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,r=0;r=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=v.x,h=v.y;a.push({x:i.left-r.width*g+c.x,y:i.top-r.height*h+c.y})}else a.push(c);return a},set:function(e,t,n){var r=t.target.options[t.prepared.name].snap,i=[],a=void 0,s=void 0,l=void 0;if(n.useStatusXY)s={x:n.x,y:n.y};else{var c=o.getOriginXY(t.target,t.element,t.prepared.name);s=o.extend({},e),s.x-=c.x,s.y-=c.y}n.realX=s.x,n.realY=s.y;for(var p=t.modifierOffsets.snap,u=r.targets?r.targets.length:0,d=p,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}for(var h=g,m=h.x,y=h.y,x=s.x-m,b=s.y-y,w=r.targets,E=Array.isArray(w),S=0,w=E?w:w[Symbol.iterator]();;){var T;if(E){if(S>=w.length)break;T=w[S++]}else{if(S=w.next(),S.done)break;T=S.value}var C=T;(a=o.is.function(C)?C(x,b,t):C)&&i.push({x:o.is.number(a.x)?a.x+m:x,y:o.is.number(a.y)?a.y+y:b,range:o.is.number(a.range)?a.range:r.range})}}var A={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(l=0,u=i.length;l=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[a].duration})),c.targets}var o=e("./PointerEvent"),a=e("../Interaction"),s=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};a.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),a.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),a.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,a=e.duplicateMove,s=t.getPointerIndex(n);a||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[s].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),a.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,a=e.pointerIndex,c=l.isIE8?s.extend({},i):i,u=t.holdTimers[a],d=s.getPath(o),f={ -interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);u===-1&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!a.capture,a.passive])}function a(e,t,n,r,o){var a=f(o),c=M[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!a.capture&&y===a.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,s),i(t,n,l,!0),c.selectors.length||(M[n]=null)),p=!0;break}}if(p)break}}function s(e,t){var n=f(t),r={},i=M[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),a=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(a);){for(var s=0;s=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=a[d](s);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var a=r.interactions,s=Array.isArray(a),l=0,a=s?a:a[Symbol.iterator]();;){var c;if(s){if(l>=a.length)break;c=a[l++]}else{if(l=a.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,a=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var s=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;s||(s=d)}}if(s)return s;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(a)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),a=0,n=o?n:n[Symbol.iterator]();;){var s;if(o){if(a>=n.length)break;s=n[a++]}else{if(a=n.next(),a.done)break;s=a.value}var l=s;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var a;if(i){if(o>=n.length)break;a=n[o++]}else{if(o=n.next(),o.done)break;a=o.value}var s=a;if(1===s.pointerIds.length){var l=s.target;if(l&&!l.options.gesture.enabled)continue}else if(s.pointerIds.length>=2)continue;if(!s.interacting()&&t===s.mouse)return s}return null}};t.exports=a},{"../scope":31,"./browser":34,"./index":41}],43:[function(e,t,n){var r="function"==typeof Symbol&&"symbol"==o(Symbol.iterator)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":o(e)},i=e("./window"),a=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||a(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":44,"./window":48}],44:[function(e,t,n){t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],45:[function(e,t,n){function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var a in i)if(0===r.indexOf(a)&&i[a].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],46:[function(e,t,n){var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),a=e("./domUtils"),s=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return s.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=s.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return s.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var a=o;for(var s in t)t[s]+=a[s]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e);return r(o[0][n]-o[1][n],o[0][i]-o[1][i])},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),a=o[1][r]-o[0][r],s=o[1][i]-o[0][i];return 180*Math.atan2(s,a)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?s.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[a.getActualElement(e.path?e.path[0]:e.target),a.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":34,"./domObjects":35,"./domUtils":36,"./hypot":40,"./is":43,"./pointerExtend":45}],47:[function(e,t,n){for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],a=0,s=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=t[n].enabled!==!1)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&t.search(" ")!==-1&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return i===-1&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);r!==-1&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=e.enabled!==!1,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(t===!0){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=e.enabled!==!1,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null), +this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed;var b={interaction:t,page:v,statuses:f,preEnd:!0,requireEndOnly:!0};h&&!m&&(c.resetStatuses(f),x=c.setAll(b),x.shouldMove&&x.locked&&(y=!0)),(m||y)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),m?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),x=c.setAll(b),i.modifiedXe+=x.dx,i.modifiedYe+=x.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=x.dx,i.ye=x.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return a.interactables.indexOfElement(e,t&&t.context)!==-1},r.on=function(e,t,n){if(s.is.string(e)&&e.search(" ")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,n),r},r.off=function(e,t,n){if(s.is.string(e)&&e.search(" ")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&(g=s.indexOf(p[e],t))!==-1&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/domUtils"),c=l.nodeContains,p=l.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||p(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var u=["down","move","up","cancel"],d=0;d=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||c(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=u.length)break;v=u[f++]}else{if(f=u.next(),f.done)break;v=f.value}var g=v,h=g.x,m=g.y;l.push({x:s.left-i.width*h+p.x,y:s.top-i.height*m+p.y})}else l.push(p);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null], +i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);u===-1&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e);return r(o[0][n]-o[1][n],o[0][i]-o[1][i])},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/* interact.js @332e9a2-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var t;t=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l=\"function\"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o=\"function\"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h=\"start\"===c,m=\"end\"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||\"\"),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire(\"set-xy\",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire(\"set-delta\",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||\"inertiastart\"===c?this.getSwipe():null,a.fire(\"new\",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on(\"set-delta\",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;\"client\"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{\"./defaultOptions\":18,\"./utils/Signals\":32,\"./utils/extend\":38,\"./utils/getOriginXY\":39}],4:[function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var i=e(\"./utils/is\"),o=e(\"./utils/events\"),s=e(\"./utils/extend\"),a=e(\"./actions/base\"),l=e(\"./scope\"),c=e(\"./Eventable\"),p=e(\"./defaultOptions\"),u=e(\"./utils/Signals\").new(),d=e(\"./utils/domUtils\"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e(\"./utils/window\"),m=h.getWindow,y=e(\"./utils/arr\"),x=y.indexOf,b=y.contains,w=e(\"./utils/browser\"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire(\"new\",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n=\"on\"+e;return i.function(t.onstart)&&(this.events[n+\"start\"]=t.onstart),i.function(t.onmove)&&(this.events[n+\"move\"]=t.onmove),i.function(t.onend)&&(this.events[n+\"end\"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+\"inertiastart\"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&\"enabled\"in p.perAction[n]&&(this.options[e][n].enabled=t[n].enabled!==!1)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption(\"origin\",e)},e.prototype.deltaSource=function(e){return\"page\"===e||\"client\"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&t.search(\" \")!==-1&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire(\"set\",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,\"all\"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,\"all\");u.fire(\"unset\",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire(\"move\",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire(\"before-action-move\",e),this._dontFireMove||d.fire(\"action-move\",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?\"cancel\":\"up\",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire(\"action-end\",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire(\"stop\",{interaction:this}),this._interacting&&(d.fire(\"stop-active\",{interaction:this}),d.fire(\"stop-\"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return i===-1&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire(\"update-pointer-down\",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);r!==-1&&(d.fire(\"remove-pointer\",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on(\"unset\",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push(\"dropChecker\"),g.signals.on(\"new\",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on(\"stop\",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,[\"dragenter\",\"dragleave\",\"dropactivate\",\"dropdeactivate\",\"dropmove\",\"drop\"]),c.methodDict.drop=\"dropzone\",h.drop=m.defaults,t.exports=m},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../interact\":21,\"../scope\":31,\"../utils\":41,\"./base\":6}],9:[function(e,t,n){\"use strict\";var r=e(\"./base\"),i=e(\"../utils\"),o=e(\"../InteractEvent\"),s=e(\"../Interactable\"),a=e(\"../Interaction\"),l=e(\"../defaultOptions\"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:\"gesture\"}:null},getCursor:function(){return\"\"}};o.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;\"gesturestart\"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;\"gesturemove\"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=e.enabled!==!1,this.setPerAction(\"gesture\",e),this.setOnEvents(\"gesture\",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on(\"set-delta\",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if(\"gesture\"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on(\"new\",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push(\"gesture\"),i.merge(s.eventTypes,[\"gesturestart\",\"gesturemove\",\"gestureend\"]),r.methodDict.gesture=\"gesturable\",l.gesture=c.defaults,t.exports=c},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../utils\":41,\"./base\":6}],10:[function(e,t,n){\"use strict\";function r(e,t,n,r,i,s,a){if(!t)return!1;if(t===!0){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&(\"left\"===e?e=\"right\":\"right\"===e&&(e=\"left\")),c<0&&(\"top\"===e?e=\"bottom\":\"bottom\"===e&&(e=\"top\")),\"left\"===e)return n.x<(l>=0?s.left:s.right)+a;if(\"top\"===e)return n.y<(c>=0?s.top:s.bottom)+a;if(\"right\"===e)return n.x>(l>=0?s.right:s.left)-a;if(\"bottom\"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e(\"./base\"),o=e(\"../utils\"),s=e(\"../utils/browser\"),a=e(\"../InteractEvent\"),l=e(\"../Interactable\"),c=e(\"../Interaction\"),p=e(\"../defaultOptions\"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:\"xy\",margin:NaN,edges:null,invert:\"none\"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:\"resize\",edges:d}}else{var v=\"y\"!==c.resize.axis&&l.x>a.right-u,g=\"x\"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:\"resize\",axes:(v?\"x\":\"\")+(g?\"y\":\"\")}}}return null},cursors:s.isIe9OrOlder?{x:\"e-resize\",y:\"s-resize\",xy:\"se-resize\",top:\"n-resize\",left:\"w-resize\",bottom:\"s-resize\",right:\"e-resize\",topleft:\"se-resize\",bottomright:\"se-resize\",topright:\"ne-resize\",bottomleft:\"ne-resize\"}:{x:\"ew-resize\",y:\"ns-resize\",xy:\"nwse-resize\",top:\"ns-resize\",left:\"ew-resize\",bottom:\"ns-resize\",right:\"ew-resize\",topleft:\"nwse-resize\",bottomright:\"nwse-resize\",topright:\"nesw-resize\",bottomleft:\"nesw-resize\"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t=\"\",n=[\"top\",\"bottom\",\"left\",\"right\"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on(\"new\",function(e){var t=e.iEvent,n=e.interaction;if(\"resizestart\"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),restricted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.restricted,t.deltaRect=n.resizeRects.delta}}),a.signals.on(\"new\",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if(\"move\"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a=\"reposition\"===s||\"negate\"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.restricted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),\"reposition\"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=e.enabled!==!1,this.setPerAction(\"resize\",e),this.setOnEvents(\"resize\",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),\nthis):this.options.resize},c.signals.on(\"new\",function(e){e.resizeAxes=\"xy\"}),a.signals.on(\"set-delta\",function(e){var t=e.interaction,n=e.iEvent;\"resize\"===e.action&&t.resizeAxes&&(t.target.options.resize.square?(\"y\"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes=\"xy\"):(n.axes=t.resizeAxes,\"x\"===t.resizeAxes?n.dy=0:\"y\"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push(\"resize\"),o.merge(l.eventTypes,[\"resizestart\",\"resizemove\",\"resizeinertiastart\",\"resizeinertiaresume\",\"resizeend\"]),i.methodDict.resize=\"resizable\",p.resize=d.defaults,t.exports=d},{\"../InteractEvent\":3,\"../Interactable\":4,\"../Interaction\":5,\"../defaultOptions\":18,\"../utils\":41,\"../utils/browser\":34,\"./base\":6}],11:[function(e,t,n){\"use strict\";var r=e(\"./utils/raf\"),i=e(\"./utils/window\").getWindow,o=e(\"./utils/is\"),s=e(\"./utils/domUtils\"),a=e(\"./Interaction\"),l=e(\"./defaultOptions\"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on(\"stop-active\",function(){c.stop()}),a.signals.on(\"action-move\",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{\"./Interaction\":5,\"./defaultOptions\":18,\"./utils/domUtils\":36,\"./utils/is\":43,\"./utils/raf\":47,\"./utils/window\":48}],12:[function(e,t,n){\"use strict\";var r=e(\"../Interactable\"),i=e(\"../actions/base\"),o=e(\"../utils/is\"),s=e(\"../utils/domUtils\");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption(\"ignoreFrom\",e)},r.prototype.allowFrom=function(e){return this._backCompatOption(\"allowFrom\",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{\"../Interactable\":4,\"../actions/base\":6,\"../utils/domUtils\":36,\"../utils/is\":43}],13:[function(e,t,n){\"use strict\";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e(\"../interact\"),c=e(\"../Interactable\"),p=e(\"../Interaction\"),u=e(\"../actions/base\"),d=e(\"../defaultOptions\"),f=e(\"../utils/browser\"),v=e(\"../scope\"),g=e(\"../utils\"),h=e(\"../utils/Signals\").new();e(\"./InteractableMethods\");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on(\"down\",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on(\"move\",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on(\"move\",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire(\"before-start\",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on(\"stop\",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor=\"\")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push(\"styleCursor\"),c.settingsMethods.push(\"actionChecker\"),c.settingsMethods.push(\"ignoreFrom\"),c.settingsMethods.push(\"allowFrom\"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{\"../Interactable\":4,\"../Interaction\":5,\"../actions/base\":6,\"../defaultOptions\":18,\"../interact\":21,\"../scope\":31,\"../utils\":41,\"../utils/Signals\":32,\"../utils/browser\":34,\"./InteractableMethods\":12}],14:[function(e,t,n){\"use strict\";var r=e(\"./base\"),i=e(\"../Interaction\");i.signals.on(\"new\",function(e){e.delayTimer=null}),r.signals.on(\"prepared\",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on(\"move\",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on(\"before-start\",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{\"../Interaction\":5,\"./base\":13}],15:[function(e,t,n){\"use strict\";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return\"xy\"===e||\"xy\"===n||n===e}var i=e(\"./base\"),o=e(\"../scope\"),s=e(\"../utils/browser\"),a=e(\"../utils/is\"),l=e(\"../utils/domUtils\"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e(\"../actions/drag\")),i.signals.on(\"before-start\",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if(\"drag\"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?\"x\":dl.minSpeed&&g>l.endSpeed,h&&!m&&(c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),x.shouldMove&&x.locked&&(y=!0)),(m||y)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,\"inertiastart\",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),m?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),x=c.setAll(t,v,f,!0,!0),i.modifiedXe+=x.dx,i.modifiedYe+=x.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=x.dx,i.ye=x.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on(\"stop-active\",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{\"./InteractEvent\":3,\"./Interaction\":5,\"./modifiers\":24,\"./utils\":41,\"./utils/raf\":47}],21:[function(e,t,n){\"use strict\";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e(\"./utils/browser\"),o=e(\"./utils/events\"),s=e(\"./utils\"),a=e(\"./scope\"),l=e(\"./Interactable\"),c=e(\"./Interaction\"),p={};r.isSet=function(e,t){return a.interactables.indexOfElement(e,t&&t.context)!==-1},r.on=function(e,t,n){if(s.is.string(e)&&e.search(\" \")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,n),r},r.off=function(e,t,n){if(s.is.string(e)&&e.search(\" \")!==-1&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&(g=s.indexOf(p[e],t))!==-1&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{\"./Interactable\":4,\"./Interaction\":5,\"./scope\":31,\"./utils\":41,\"./utils/browser\":34,\"./utils/events\":37}],22:[function(e,t,n){\"use strict\";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e(\"./Interactable\"),o=e(\"./Interaction\"),s=e(\"./scope\"),a=e(\"./utils/is\"),l=e(\"./utils/domUtils\"),c=l.nodeContains,p=l.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?\"always\":\"never\",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if(\"never\"!==t)return\"always\"===t?void e.preventDefault():void(/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||p(e.target,\"input,select,textarea,[contenteditable=true],[contenteditable=true] *\")||e.preventDefault())};for(var u=[\"down\",\"move\",\"up\",\"cancel\"],d=0;d=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||c(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{\"./Interactable\":4,\"./Interaction\":5,\"./scope\":31,\"./utils/domUtils\":36,\"./utils/is\":43}],23:[function(e,t,n){\"use strict\";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:\"tap\"}))}var i=e(\"./scope\"),o=e(\"./utils/events\"),s=e(\"./utils/browser\"),a=e(\"./utils/interactionFinder\"),l=e(\"./pointerEvents/base\"),c=e(\"./utils/window\"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return\"[object Array]\"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf(\"listen\")?o.add:o.remove);i(n,\"selectstart\",d),l&&i(n,\"dblclick\",r)};i.signals.on(\"add-document\",f),i.signals.on(\"remove-document\",f)}t.exports=null},{\"./pointerEvents/base\":28,\"./scope\":31,\"./utils/browser\":34,\"./utils/events\":37,\"./utils/interactionFinder\":42,\"./utils/window\":48}],24:[function(e,t,n){\"use strict\";var r=e(\"../InteractEvent\"),i=e(\"../Interaction\"),o=e(\"../utils/extend\"),s={names:[],setOffsets:function(e,t){var n=e.target,r=e.element,i=n.getRect(r);i?(e.startOffset.left=t.page.x-i.left,e.startOffset.top=t.page.y-i.top,e.startOffset.right=i.right-t.page.x,e.startOffset.bottom=i.bottom-t.page.y,\"width\"in i||(i.width=i.right-i.left),\"height\"in i||(i.height=i.bottom-i.top)):e.startOffset.left=e.startOffset.top=e.startOffset.right=e.startOffset.bottom=0,s.setModifierOffsets(e,n,r,i,e.modifierOffsets)},setModifierOffsets:function(e,t,n,r,i){for(var o=0;o=u.length)break;v=u[f++]}else{if(f=u.next(),f.done)break;v=f.value}var g=v,h=s[g];h.shouldDo(l,e.prepared.name,r,i)&&(p=h.set(c,e,n[g]),p.locked&&(c.x+=p.dx,c.y+=p.dy,a.dx+=p.dx,a.dy+=p.dy,a.locked=!0))}return a.shouldMove=!p||p.changed,a},resetStatuses:function(e){for(var t=s.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;e[o]=s[o].reset(e[o]||{})}return e},start:function(e,t){var n=e.interaction;s.setOffsets(n,\"action-resume\"===t?n.curCoords:n.startCoords),s.resetStatuses(n.modifierStatuses),n.modifierResult=s.setAll(n,n.startCoords.page,n.modifierStatuses)}};i.signals.on(\"new\",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=s.resetStatuses({}),e.modifierResult=null}),i.signals.on(\"action-start\",s.start),i.signals.on(\"action-resume\",s.start),i.signals.on(\"before-action-move\",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=s.setAll(t,t.curCoords.page,t.modifierStatuses,n);!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),i.signals.on(\"action-end\",function(e){for(var t=e.interaction,n=e.event,r=0;r=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=v.x,h=v.y;s.push({x:i.left-r.width*g+c.x,y:i.top-r.height*h+c.y})}else s.push(c);return s},set:function(e,t,n){var r=t.target.options[t.prepared.name].snap,i=[],s=void 0,a=void 0,l=void 0;if(n.useStatusXY)a={x:n.x,y:n.y};else{var c=o.getOriginXY(t.target,t.element,t.prepared.name);a=o.extend({},e),a.x-=c.x,a.y-=c.y}n.realX=a.x,n.realY=a.y;for(var p=t.modifierOffsets.snap,u=r.targets?r.targets.length:0,d=p,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}for(var h=g,m=h.x,y=h.y,x=a.x-m,b=a.y-y,w=r.targets,E=Array.isArray(w),S=0,w=E?w:w[Symbol.iterator]();;){var T;if(E){if(S>=w.length)break;T=w[S++]}else{if(S=w.next(),S.done)break;T=S.value}var A=T;s=o.is.function(A)?A(x,b,t):A,s&&i.push({x:o.is.number(s.x)?s.x+m:x,y:o.is.number(s.y)?s.y+y:b,range:o.is.number(s.range)?s.range:r.range})}}var C={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(l=0,u=i.length;l=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire(\"collect-targets\",c)}return\"hold\"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e(\"./PointerEvent\"),s=e(\"../Interaction\"),a=e(\"../utils\"),l=e(\"../utils/browser\"),c=e(\"../defaultOptions\"),p=e(\"../utils/Signals\").new(),u=e(\"../utils/arr\"),d=u.filter,f=[\"down\",\"up\",\"cancel\"],v=[\"down\",\"up\",\"cancel\"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:[\"down\",\"move\",\"up\",\"cancel\",\"tap\",\"doubletap\",\"hold\"]};s.signals.on(\"update-pointer-down\",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on(\"remove-pointer\",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on(\"move\",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:\"move\"}))}),s.signals.on(\"down\",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:\"hold\",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire(\"collect-targets\",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);u===-1&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=M[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(M[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=M[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{\"../scope\":31,\"./browser\":34,\"./index\":41}],43:[function(e,t,n){\"use strict\";var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=e(\"./window\"),o=e(\"./isWindow\"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&\"object\"===(void 0===e?\"undefined\":r(e))},function:function(e){return\"function\"==typeof e},number:function(e){return\"number\"==typeof e},bool:function(e){return\"boolean\"==typeof e},string:function(e){return\"string\"==typeof e},element:function(e){if(!e||\"object\"!==(void 0===e?\"undefined\":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&\"string\"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{\"./isWindow\":44,\"./window\":48}],44:[function(e,t,n){\"use strict\";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],45:[function(e,t,n){\"use strict\";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||\"function\"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],46:[function(e,t,n){\"use strict\";var r=e(\"./hypot\"),i=e(\"./browser\"),o=e(\"./domObjects\"),s=e(\"./domUtils\"),a=e(\"./is\"),l=e(\"./pointerExtend\"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||\"page\",n.x=t[e+\"X\"],n.y=t[e+\"Y\"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY(\"screen\",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY(\"page\",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY(\"screen\",e,t):c.getXY(\"client\",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):\"touchend\"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+\"X\",i=t+\"Y\",o=c.getTouchPair(e);return r(o[0][n]-o[1][n],o[0][i]-o[1][i])},touchAngle:function(e,t,n){var r=n+\"X\",i=n+\"Y\",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?\"mouse\":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,\"touch\",\"pen\",\"mouse\"][e.pointerType]:\"touch\"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{\"./browser\":34,\"./domObjects\":35,\"./domUtils\":36,\"./hypot\":40,\"./is\":43,\"./pointerExtend\":45}],47:[function(e,t,n){\"use strict\";for(var r=e(\"./window\"),i=r.window,o=[\"ms\",\"moz\",\"webkit\",\"o\"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, useCapture) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, useCapture);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - useCapture (boolean) #optional useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, useCapture) {\n // convert to boolean\n useCapture = !!useCapture;\n\n if (this._onOffMultiple('on', eventType, listener, useCapture)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, useCapture);\n }\n else {\n events.add(this.target, eventType, listener, useCapture);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - useCapture (boolean) #optional useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, useCapture) {\n // convert to boolean\n useCapture = !!useCapture;\n\n if (this._onOffMultiple('off', eventType, listener, useCapture)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, useCapture);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, useCapture);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n firePrepared(interaction, event, 'start');\n interaction._interacting = true;\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n let inertiaPossible = false;\n let inertia = false;\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - useCapture (boolean) #optional useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, useCapture) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, useCapture);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, useCapture);\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - useCapture (boolean) #optional useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, useCapture) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, useCapture);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, useCapture);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n value = utils.getStringOptionResult(value, interaction.target, interaction.element) || value;\n\n if (utils.is.function(value)) {\n value = value(page.x, page.y, interaction);\n }\n\n if (utils.is.element(value)) {\n value = utils.getElementRect(value);\n }\n\n return value;\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction), page) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction), page) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n min: utils.extend({}, restrictEdges.noMin),\n max: utils.extend({}, restrictEdges.noMax),\n };\n\n if (edges.top) {\n arg.options.min.top = rect.bottom - maxSize.height;\n arg.options.max.top = rect.bottom - minSize.height;\n }\n else if (edges.bottom) {\n arg.options.min.bottom = rect.top + minSize.height;\n arg.options.max.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.min.left = rect.right - maxSize.width;\n arg.options.max.left = rect.right - minSize.width;\n }\n else if (edges.right) {\n arg.options.min.right = rect.left + minSize.width;\n arg.options.max.right = rect.left + maxSize.width;\n }\n\n return restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const origin = options.origin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else if (options.offset === 'self') {\n snapOffset = {\n x: rect.left - origin.x,\n y: rect.top - origin.y,\n };\n }\n else {\n snapOffset = options.offset || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n trySelector,\n} = require('./domUtils');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n let origin = actionOrigin || target.options.origin;\n\n if (origin === 'parent') {\n origin = parentNode(element);\n }\n else if (origin === 'self') {\n origin = target.getRect(element);\n }\n else if (trySelector(origin)) {\n origin = closest(element, origin) || { x: 0, y: 0 };\n }\n\n if (is.function(origin)) {\n origin = origin(target && element);\n }\n\n if (is.element(origin)) {\n origin = getElementRect(origin);\n }\n\n origin.x = ('x' in origin)? origin.x : origin.left;\n origin.y = ('y' in origin)? origin.y : origin.top;\n\n return origin;\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n getStringOptionResult: function (value, interactable, element) {\n if (!utils.is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = utils.parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = utils.closest(element, value);\n }\n\n return value;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\n\nmodule.exports = {\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 2382b4052..3563161a7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha", + "version": "1.3.0-alpha.0+sha.4c9dfbf", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"