diff --git a/dist/docs/Interactable.html b/dist/docs/Interactable.html index 2bfc7b19d..d581177ea 100644 --- a/dist/docs/Interactable.html +++ b/dist/docs/Interactable.html @@ -97,7 +97,7 @@

new Inter
Source:
@@ -570,7 +570,7 @@

contextSource:
@@ -680,7 +680,7 @@

deltaSourc
Source:
@@ -1291,7 +1291,7 @@

fireSource:
@@ -1648,7 +1648,7 @@

getRectSource:
@@ -1821,7 +1821,7 @@

offSource:
@@ -2073,7 +2073,7 @@

onSource:
@@ -2326,7 +2326,7 @@

originSource:
@@ -2690,7 +2690,7 @@

rectChecke
Source:
@@ -3083,7 +3083,7 @@

setSource:
@@ -3422,7 +3422,7 @@

unsetSource:
diff --git a/dist/docs/doclets.json b/dist/docs/doclets.json index 62bd79ec1..c745b1f66 100644 --- a/dist/docs/doclets.json +++ b/dist/docs/doclets.json @@ -1 +1 @@ -[{"comment":"/** @article /home/taye/proj/interact.js/docs/index.md **/","meta":{"filename":"index.md","lineno":1,"columnno":0,"path":"/home/taye/proj/interact.js/docs","code":{},"shortpath":"docs/index.md"},"kind":"article","source":"\n\n","name":"index","filename":"index.md","title":"API Reference","longname":"article:index","description":"

","outfilename":"index.html","scope":"global","___id":"T000002R002594","___s":true,"attribs":"","id":"index","ancestors":[]},{"comment":"/**\n * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */","meta":{"range":[970,1228],"filename":"interact.js","lineno":37,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013366","name":"interact","type":"FunctionDeclaration","paramnames":["element","options"]},"vars":{"interactable":"module:interact~interactable","interactable.events.global":"module:interact~interactable.events.global"},"shortpath":"src/interact.js"},"description":"
interact('#draggable').draggable(true);\n\nvar rectables = interact('rect');\nrectables\n  .gesturable(true)\n  .on('gesturemove', function (event) {\n      // ...\n  });\n
\n

The methods of this variable can be used to set elements as interactables\nand also to change various default settings.

\n

Calling it as a function and passing an element or a valid CSS selector\nstring returns an Interactable object which has various methods to configure\nit.

","scope":"global","params":[{"type":{"names":["Element","string"]},"description":"

The HTML or SVG Element to interact with\nor CSS selector

","name":"element"}],"returns":[{"type":{"names":["Interactable"]}}],"name":"interact","longname":"interact","kind":"function","___id":"T000002R001319","___s":true,"attribs":"","id":"interact","signature":"(element) → {Interactable}","ancestors":[]},{"comment":"/** */","meta":{"range":[717,1239],"filename":"Interactable.js","lineno":25,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001127","name":"Interactable","type":"MethodDefinition","paramnames":["target","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"name":"Interactable","longname":"Interactable","kind":"class","scope":"global","params":[],"___id":"T000003R000002","___s":true,"attribs":"","id":"Interactable","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\n */","meta":{"range":[4614,4895],"filename":"InteractableMethods.js","lineno":143,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010184","name":"Interactable.prototype.actionChecker","type":"FunctionExpression","paramnames":["checker"]},"vars":{"this.options.actionChecker":"Interactable#actionChecker#options.actionChecker"},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
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
\n

Gets or sets the function used to check action to be performed on\npointerDown

","params":[{"type":{"names":["function","null"]},"optional":true,"description":"

A function which takes a pointer event,\ndefaultAction string, interactable, element and interaction as parameters\nand returns an object with name property 'drag' 'resize' or 'gesture' and\noptionally an edges object with boolean 'top', 'left', 'bottom' and right\nprops.

","name":"checker"}],"returns":[{"type":{"names":["function","Interactable"]},"description":"

The checker function or this Interactable

"}],"name":"actionChecker","longname":"Interactable#actionChecker","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001016","___s":true,"attribs":"","id":"actionChecker","signature":"(checkeropt) → {function|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */","meta":{"range":[2359,2582],"filename":"InteractableMethods.js","lineno":75,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010016","name":"Interactable.prototype.allowFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
","deprecated":"A drag/resize/gesture is started only If the target of the `mousedown`,\n`pointerdown` or `touchstart` event or any of it's parents match the given\nCSS selector or Element.\n\nDon't use this method. Instead set the `allowFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .resizable({\n allowFrom: '.resize-handle',\n .pointerEvents({\n allowFrom: '.handle',,\n });"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to allow from any element

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current allowFrom value or this\nInteractable

"}],"name":"allowFrom","longname":"Interactable#allowFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R001012","___s":true,"attribs":"","id":"allowFrom","ancestors":["Interactable#"],"signature":""},{"comment":"/**\n * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\n */","meta":{"range":[5369,5411],"filename":"Interactable.js","lineno":177,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001648","name":"Interactable#context","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Gets the selector context Node of the Interactable. The default is\nwindow.document.

","returns":[{"type":{"names":["Node"]},"description":"

The context Node of this Interactable

"}],"name":"context","longname":"Interactable#context","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000175","___s":true,"attribs":"","id":"context","signature":"() → {Node}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {string | object} The current deltaSource or this Interactable\n */","meta":{"range":[5003,5194],"filename":"Interactable.js","lineno":161,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001618","name":"Interactable#deltaSource","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Returns or sets the mouse coordinate types used to calculate the\nmovement of the pointer.

","params":[{"type":{"names":["string"]},"optional":true,"description":"

Use 'client' if you will be scrolling while\ninteracting; Use 'page' if you want autoScroll to work

","name":"newValue"}],"returns":[{"type":{"names":["string","object"]},"description":"

The current deltaSource or this Interactable

"}],"name":"deltaSource","longname":"Interactable#deltaSource","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000173","___s":true,"attribs":"","id":"deltaSource","signature":"(newValueopt) → {string|object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */","meta":{"range":[3787,4492],"filename":"drag.js","lineno":119,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100004831","name":"Interactable.prototype.draggable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.drag.enabled":"Interactable#draggable#options.drag.enabled","this.options.drag.lockAxis":"Interactable#draggable#options.drag.lockAxis","this.options.drag.startAxis":"Interactable#draggable#options.drag.startAxis","this.ondragstart":"Interactable#draggable#ondragstart","this.ondragend":"Interactable#draggable#ondragend"},"shortpath":"src/actions/drag.js"},"description":"
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\nvar isDraggable = interact('element').draggable(); // true\n
\n

Get or set whether drag actions can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on drag events (object makes the Interactable\ndraggable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

boolean indicating if this can be the\ntarget of drag events, or this Interctable

"}],"name":"draggable","longname":"Interactable#draggable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000499","___s":true,"attribs":"","id":"draggable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[10642,12201],"filename":"drop.js","lineno":327,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100006127","name":"Interactable.prototype.dropzone","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.drop.enabled":"Interactable#dropzone#options.drop.enabled","this.events.ondrop":"Interactable#dropzone#events.ondrop","this.events.ondropactivate":"Interactable#dropzone#events.ondropactivate","this.events.ondropdeactivate":"Interactable#dropzone#events.ondropdeactivate","this.events.ondragenter":"Interactable#dropzone#events.ondragenter","this.events.ondragleave":"Interactable#dropzone#events.ondragleave","this.events.ondropmove":"Interactable#dropzone#events.ondropmove","this.options.drop.overlap":"Interactable#dropzone#options.drop.overlap","this.options.drop.accept":"Interactable#dropzone#options.drop.accept","this.options.drop.checker":"Interactable#dropzone#options.drop.checker","this.ondragenter":"Interactable#dropzone#ondragenter","this.ondragleave":"Interactable#dropzone#ondragleave","this.ondrop":"Interactable#dropzone#ondrop","this.ondropactivate":"Interactable#dropzone#ondropactivate","this.ondropdeactivate":"Interactable#dropzone#ondropdeactivate"},"shortpath":"src/actions/drop.js"},"description":"
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
interact('.drop').dropzone({\n  accept: '.can-drop' || document.getElementById('single-drop'),\n  overlap: 'pointer' || 'center' || zeroToOne\n}\n
\n

Returns or sets whether draggables can be dropped onto this target to\ntrigger drop events

\n

Dropzones can receive the following events:

\n
    \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\nselector 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\nvalues 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).\ne.g. 0.5 for drop to happen when half of the area of the draggable is\nover the dropzone
  • \n
\n

Use the checker option to specify a function to check if a dragged element\nis over this Interactable.

","params":[{"type":{"names":["boolean","object","null"]},"optional":true,"description":"

The new options to be set.

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"dropzone","longname":"Interactable#dropzone","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000639","___s":true,"attribs":"","id":"dropzone","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */","meta":{"range":[5819,5886],"filename":"Interactable.js","lineno":194,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001676","name":"Interactable#fire","type":"MethodDefinition","paramnames":["iEvent"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Calls listeners for the given InteractEvent type bound globally\nand directly to this Interactable

","params":[{"type":{"names":["InteractEvent"]},"description":"

The InteractEvent object to be fired on this\nInteractable

","name":"iEvent"}],"returns":[{"type":{"names":["Interactable"]},"description":"

this Interactable

"}],"name":"fire","longname":"Interactable#fire","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000177","___s":true,"attribs":"","id":"fire","signature":"(iEvent) → {Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\n */","meta":{"range":[2228,2736],"filename":"gesture.js","lineno":79,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100007179","name":"Interactable.prototype.gesturable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.gesture.enabled":"Interactable#gesturable#options.gesture.enabled","this.ongesturestart":"Interactable#gesturable#ongesturestart","this.ongestureend":"Interactable#gesturable#ongestureend"},"shortpath":"src/actions/gesture.js"},"description":"
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 {@link Interactable.draggable} example\n    max: Infinity,\n    maxPerElement: 1,\n});\n\nvar isGestureable = interact(element).gesturable();\n
\n

Gets or sets whether multitouch gestures can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on gesture events (makes the Interactable gesturable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of gesture events, or this Interactable

"}],"name":"gesturable","longname":"Interactable#gesturable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000724","___s":true,"attribs":"","id":"gesturable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\n */","meta":{"range":[3078,3301],"filename":"Interactable.js","lineno":91,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001472","name":"Interactable#getRect","type":"MethodDefinition","paramnames":["element"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

The default function to get an Interactables bounding rect. Can be\noverridden using {@link Interactable.rectChecker}.

","params":[{"type":{"names":["Element"]},"optional":true,"description":"

The element to measure.

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

The object's bounding rectangle.

"}],"name":"getRect","longname":"Interactable#getRect","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000163","___s":true,"attribs":"","id":"getRect","signature":"(elementopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */","meta":{"range":[1442,1669],"filename":"InteractableMethods.js","lineno":47,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100009996","name":"Interactable.prototype.ignoreFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
interact(element, { ignoreFrom: document.getElementById('no-action') });\n// or\ninteract(element).ignoreFrom('input, textarea, a');\n
","deprecated":"If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\nof it's parents match the given CSS selector or Element, no\ndrag/resize/gesture is started.\n\nDon't use this method. Instead set the `ignoreFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .draggable({\n ignoreFrom: 'input, textarea, a[href]'',\n })\n .pointerEvents({\n ignoreFrom: '[no-pointer]',\n });"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to not ignore any elements

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current ignoreFrom value or this\nInteractable

"}],"name":"ignoreFrom","longname":"Interactable#ignoreFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R001011","___s":true,"attribs":"","id":"ignoreFrom","ancestors":["Interactable#"],"signature":""},{"comment":"/**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */","meta":{"range":[7712,8358],"filename":"Interactable.js","lineno":263,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001856","name":"Interactable#off","type":"MethodDefinition","paramnames":["eventType","listener","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Removes an InteractEvent, pointerEvent or DOM event listener

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were\nlistened for

","name":"eventType"},{"type":{"names":["function"]},"description":"

The listener function to be removed

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"off","longname":"Interactable#off","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000184","___s":true,"attribs":"","id":"off","signature":"(eventType, listener, optionsopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */","meta":{"range":[6759,7317],"filename":"Interactable.js","lineno":232,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001774","name":"Interactable#on","type":"MethodDefinition","paramnames":["eventType","listener","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Binds a listener for an InteractEvent, pointerEvent or DOM event.

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen\nfor

","name":"eventType"},{"type":{"names":["function"]},"description":"

The function event (s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag\nfor addEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"on","longname":"Interactable#on","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000182","___s":true,"attribs":"","id":"on","signature":"(eventType, listener, optionsopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */","meta":{"range":[4592,4670],"filename":"Interactable.js","lineno":149,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001606","name":"Interactable#origin","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Gets or sets the origin of the Interactable's element. The x and y\nof the origin will be subtracted from action event coordinates.

","params":[{"type":{"names":["Element","object","string"]},"optional":true,"description":"

An HTML or SVG Element whose\nrect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\nor any CSS selector

","name":"origin"}],"returns":[{"type":{"names":["object"]},"description":"

The current origin or this Interactable

"}],"name":"origin","longname":"Interactable#origin","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000172","___s":true,"attribs":"","id":"origin","signature":"(originopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */","meta":{"range":[752,1080],"filename":"interactablePreventDefault.js","lineno":20,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013951","name":"Interactable.prototype.preventDefault","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"this.options.preventDefault":"Interactable#preventDefault#options.preventDefault"},"shortpath":"src/interactablePreventDefault.js"},"description":"

Returns or sets whether to prevent the browser's default behaviour in\nresponse to pointer events. Can be set to:

\n
    \n
  • 'always' to always prevent
  • \n
  • 'never' to never prevent
  • \n
  • 'auto' to let interact.js try to determine what would be best
  • \n
","params":[{"type":{"names":["string"]},"optional":true,"description":"

true, false or 'auto'

","name":"newValue"}],"returns":[{"type":{"names":["string","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"preventDefault","longname":"Interactable#preventDefault","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001363","___s":true,"attribs":"","id":"preventDefault","signature":"(newValueopt) → {string|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {function | object} The checker function or this Interactable\n */","meta":{"range":[3629,3860],"filename":"Interactable.js","lineno":109,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001517","name":"Interactable#rectChecker","type":"MethodDefinition","paramnames":["checker"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Returns or sets the function used to calculate the interactable's\nelement's rectangle

","params":[{"type":{"names":["function"]},"optional":true,"description":"

A function which returns this Interactable's\nbounding rectangle. See {@link Interactable.getRect}

","name":"checker"}],"returns":[{"type":{"names":["function","object"]},"description":"

The checker function or this Interactable

"}],"name":"rectChecker","longname":"Interactable#rectChecker","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000166","___s":true,"attribs":"","id":"rectChecker","signature":"(checkeropt) → {function|object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\n */","meta":{"range":[10565,11507],"filename":"resize.js","lineno":317,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100008725","name":"Interactable.prototype.resizable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.resize.enabled":"Interactable#resizable#options.resize.enabled","this.options.resize.axis":"Interactable#resizable#options.resize.axis","this.options.resize.preserveAspectRatio":"Interactable#resizable#options.resize.preserveAspectRatio","this.options.resize.square":"Interactable#resizable#options.resize.square","this.onresizestart":"Interactable#resizable#onresizestart","this.onresizeend":"Interactable#resizable#onresizeend"},"shortpath":"src/actions/resize.js"},"description":"
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 {@link Interactable.draggable} example\n  max: Infinity,\n  maxPerElement: 1,\n});\n\nvar isResizeable = interact(element).resizable();\n
\n

Gets or sets whether resize actions can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on resize events (object makes the Interactable\nresizable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of resize elements, or this Interactable

"}],"name":"resizable","longname":"Interactable#resizable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000909","___s":true,"attribs":"","id":"resizable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */","meta":{"range":[8518,9271],"filename":"Interactable.js","lineno":292,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001938","name":"Interactable#set","type":"MethodDefinition","paramnames":["options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Reset the options of this Interactable

","params":[{"type":{"names":["object"]},"description":"

The new settings to apply

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"set","longname":"Interactable#set","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000186","___s":true,"attribs":"","id":"set","signature":"(options) → {object}","ancestors":["Interactable#"]},{"comment":"/**\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 * @param {boolean} [newValue]\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[5167,5440],"filename":"InteractableMethods.js","lineno":166,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010231","name":"Interactable.prototype.styleCursor","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"this.options.styleCursor":"Interactable#styleCursor#options.styleCursor"},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"

Returns or sets whether the the cursor should be changed depending on the\naction that would be performed if the mouse were pressed and dragged.

","params":[{"type":{"names":["boolean"]},"optional":true,"name":"newValue"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"styleCursor","longname":"Interactable#styleCursor","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001018","___s":true,"attribs":"","id":"styleCursor","signature":"(newValueopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {interact}\n */","meta":{"range":[9438,10683],"filename":"Interactable.js","lineno":333,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002065","name":"Interactable#unset","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Remove this interactable from the list of interactables and remove it's\naction capabilities and event listeners

","returns":[{"type":{"names":["interact"]}}],"name":"unset","longname":"Interactable#unset","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000197","___s":true,"attribs":"","id":"unset","signature":"() → {interact}","ancestors":["Interactable#"]},{"comment":"/** */","meta":{"range":[236,3017],"filename":"InteractEvent.js","lineno":8,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000236","name":"InteractEvent","type":"MethodDefinition","paramnames":["interaction","event","action","phase","element","related","preEnd"]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"InteractEvent","longname":"InteractEvent","kind":"class","scope":"global","params":[],"___id":"T000003R000003","___s":true,"attribs":"","id":"InteractEvent","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[3966,4070],"filename":"InteractEvent.js","lineno":136,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000911","name":"InteractEvent#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"stopImmediatePropagation","longname":"InteractEvent#stopImmediatePropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R000107","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":["InteractEvent#"]},{"comment":"/** */","meta":{"range":[4083,4143],"filename":"InteractEvent.js","lineno":141,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000925","name":"InteractEvent#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"stopPropagation","longname":"InteractEvent#stopPropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R000110","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":["InteractEvent#"]},{"comment":"/** */","meta":{"range":[629,2309],"filename":"Interaction.js","lineno":23,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002533","name":"Interaction","type":"MethodDefinition","paramnames":[""]},"vars":{"":null},"shortpath":"src/Interaction.js"},"name":"Interaction","longname":"Interaction","kind":"class","scope":"global","params":[],"___id":"T000003R000004","___s":true,"attribs":"","id":"Interaction","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\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 *\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 */","meta":{"range":[6432,6806],"filename":"Interaction.js","lineno":223,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003126","name":"Interaction#doMove","type":"MethodDefinition","paramnames":["signalArg"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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

Force a move of the current action at the same coordinates. Useful if\nsnap/restrict has been changed and you want a movement with the new\nsettings.

","name":"doMove","longname":"Interaction#doMove","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R000319","___s":true,"attribs":"","id":"doMove","signature":"()","ancestors":["Interaction#"]},{"comment":"/**\n * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */","meta":{"range":[7817,8065],"filename":"Interaction.js","lineno":280,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003253","name":"Interaction#end","type":"MethodDefinition","paramnames":["event"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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

Stop the current action and fire an end event. Inertial movement does\nnot happen.

","params":[{"type":{"names":["PointerEvent"]},"optional":true,"name":"event"}],"name":"end","longname":"Interaction#end","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R000335","___s":true,"attribs":"","id":"end","signature":"(eventopt)","ancestors":["Interaction#"]},{"comment":"/**\n * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\n */","meta":{"range":[3719,4294],"filename":"Interaction.js","lineno":129,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002789","name":"Interaction#start","type":"MethodDefinition","paramnames":["action","target","element"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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 an action with the given Interactable and Element as tartgets. The\naction must be enabled for the target Interactable and an appropriate\nnumber of pointers must be held down - 1 for drag/resize, 2 for gesture.

\n

Use it with interactable.<action>able({ manualStart: false }) to always\nstart actions manually

","params":[{"type":{"names":["object"]},"description":"

The action to be performed - drag, resize, etc.

","name":"action"},{"type":{"names":["Interactable"]},"description":"

The Interactable to target

","name":"target"},{"type":{"names":["Element"]},"description":"

The DOM Element to target

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"start","longname":"Interaction#start","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R000297","___s":true,"attribs":"","id":"start","signature":"(action, target, element) → {object}","ancestors":["Interaction#"]},{"comment":"/** */","meta":{"range":[8214,8563],"filename":"Interaction.js","lineno":305,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003323","name":"Interaction#stop","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interaction.js"},"name":"stop","longname":"Interaction#stop","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R000343","___s":true,"attribs":"","id":"stop","signature":"()","ancestors":["Interaction#"]},{"comment":"/** */","meta":{"range":[105,1150],"filename":"PointerEvent.js","lineno":5,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018122","name":"module.exports","type":"MethodDefinition","paramnames":["type","pointer","event","eventTarget","interaction"]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"exports","longname":"module.exports#module.exports","kind":"class","memberof":"module.exports#module","scope":"static","params":[],"___id":"T000003R000005","___s":true,"attribs":"","id":"exports","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1532,1596],"filename":"PointerEvent.js","lineno":57,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018366","name":"module.exports#preventDefault","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"preventDefault","longname":"module.exports#preventDefault","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001897","___s":true,"attribs":"","id":"preventDefault","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1682,1786],"filename":"PointerEvent.js","lineno":67,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018387","name":"module.exports#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"stopImmediatePropagation","longname":"module.exports#stopImmediatePropagation","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001900","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1609,1669],"filename":"PointerEvent.js","lineno":62,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018377","name":"module.exports#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"stopPropagation","longname":"module.exports#stopPropagation","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001898","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":[]},{"comment":"/** @module interact */","meta":{"filename":"interact.js","lineno":1,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{},"shortpath":"src/interact.js"},"kind":"module","name":"interact","longname":"module:interact","___id":"T000004R000002","___s":true,"attribs":"","id":"interact","ancestors":[],"modules":[]},{"comment":"/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * and expose internal functions and variables\n */","meta":{"range":[4308,4356],"filename":"interact.js","lineno":168,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013714","name":"interact.debug","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"description":"

Returns an object which exposes internal data

","alias":"module:interact.debug","returns":[{"type":{"names":["object"]},"description":"

An object with properties that outline the current state\nand expose internal functions and variables

"}],"name":"debug","longname":"module:interact.debug","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001336","___s":true,"attribs":"(static) ","id":".debug","signature":"() → {object}","ancestors":["interact."]},{"comment":"/**\n * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {boolean | interact} The current setting or interact\n */","meta":{"range":[15393,15650],"filename":"drop.js","lineno":454,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100006869","name":"interact.dynamicDrop","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"dynamicDrop":"module:interact.dynamicDrop~dynamicDrop"},"shortpath":"src/actions/drop.js"},"description":"

Returns or sets whether the dimensions of dropzone elements are calculated\non every dragmove or only on dragstart for the default dropChecker

","params":[{"type":{"names":["boolean"]},"optional":true,"description":"

True to check on each move. False to check only\nbefore start

","name":"newValue"}],"returns":[{"type":{"names":["boolean","interact"]},"description":"

The current setting or interact

"}],"name":"dynamicDrop","longname":"module:interact.dynamicDrop","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R000691","___s":true,"attribs":"(static) ","id":".dynamicDrop","signature":"(newValueopt) → {boolean|interact}","ancestors":["interact."]},{"comment":"/**\n * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/","meta":{"range":[1519,1656],"filename":"interact.js","lineno":58,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013404","name":"interact.isSet","type":"FunctionExpression","paramnames":["element","options"]},"shortpath":"src/interact.js"},"description":"

Check if an element or selector has been set with the {@link interact}\nfunction

","alias":"module:interact.isSet","params":[{"type":{"names":["Element"]},"description":"

The Element being searched for

","name":"element"}],"returns":[{"type":{"names":["boolean"]},"description":"

Indicates if the element or CSS selector was previously\npassed to interact

"}],"name":"isSet","longname":"module:interact.isSet","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001323","___s":true,"attribs":"(static) ","id":".isSet","signature":"(element) → {boolean}","ancestors":["interact."]},{"comment":"/**\n * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n */","meta":{"range":[6535,6725],"filename":"base.js","lineno":224,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100011194","name":"interact.maxInteractions","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"autoStart.maxInteractions":"autoStart.maxInteractions"},"shortpath":"src/autoStart/base.js"},"description":"

Returns or sets the maximum number of concurrent interactions allowed. By\ndefault only 1 interaction is allowed at a time (for backwards\ncompatibility). To allow multiple interactions on the same Interactables and\nelements, you need to enable it in the draggable, resizable and gesturable\n'max' and 'maxPerElement' options.

","alias":"module:interact.maxInteractions","params":[{"type":{"names":["number"]},"optional":true,"description":"

Any number. newValue <= 0 means no interactions.

","name":"newValue"}],"name":"maxInteractions","longname":"module:interact.maxInteractions","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001108","___s":true,"attribs":"(static) ","id":".maxInteractions","signature":"(newValueopt)","ancestors":["interact."]},{"comment":"/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */","meta":{"range":[3329,4088],"filename":"interact.js","lineno":124,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013568","name":"interact.off","type":"FunctionExpression","paramnames":["type","listener","options"]},"vars":{"type":"module:interact~type","eventType":"module:interact.off~eventType","prop":"module:interact.off~prop","index":"module:interact~index"},"shortpath":"src/interact.js"},"description":"

Removes a global InteractEvent listener or DOM event from document

","alias":"module:interact.off","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were listened\nfor

","name":"type"},{"type":{"names":["function"]},"description":"

The listener function to be removed

","name":"listener"},{"type":{"names":["object","boolean"]},"description":"

[options] object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"off","longname":"module:interact.off","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001330","___s":true,"attribs":"(static) ","id":".off","signature":"(type, listener, options) → {object}","ancestors":["interact."]},{"comment":"/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */","meta":{"range":[2028,2928],"filename":"interact.js","lineno":73,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013429","name":"interact.on","type":"FunctionExpression","paramnames":["type","listener","options"]},"vars":{"type":"module:interact~type","eventType":"module:interact.on~eventType","prop":"module:interact.on~prop","globalEvents[undefined]":"module:interact~globalEvents.undefined]"},"shortpath":"src/interact.js"},"description":"

Add a global listener for an InteractEvent or adds a DOM event to document

","alias":"module:interact.on","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen for

","name":"type"},{"type":{"names":["function"]},"description":"

The function event (s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

object or useCapture flag for\naddEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"on","longname":"module:interact.on","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001324","___s":true,"attribs":"(static) ","id":".on","signature":"(type, listener, optionsopt) → {object}","ancestors":["interact."]},{"comment":"/**\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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */","meta":{"range":[5942,6151],"filename":"interact.js","lineno":226,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013846","name":"interact.pointerMoveTolerance","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"Interaction.pointerMoveTolerance":"module:interact~Interaction.pointerMoveTolerance"},"shortpath":"src/interact.js"},"description":"

Returns or sets the distance the pointer must be moved before an action\nsequence occurs. This also affects tolerance for tap events.

","alias":"module:interact.pointerMoveTolerance","params":[{"type":{"names":["number"]},"optional":true,"description":"

The movement from the start position must be greater than this value

","name":"newValue"}],"returns":[{"type":{"names":["interact","number"]}}],"name":"pointerMoveTolerance","longname":"module:interact.pointerMoveTolerance","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001349","___s":true,"attribs":"(static) ","id":".pointerMoveTolerance","signature":"(newValueopt) → {interact|number}","ancestors":["interact."]},{"comment":"/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {object} interact\n */","meta":{"range":[5449,5609],"filename":"interact.js","lineno":209,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013809","name":"interact.stop","type":"FunctionExpression","paramnames":["event"]},"vars":{"i":"module:interact.stop~i"},"shortpath":"src/interact.js"},"description":"

Cancels all interactions (end events are not fired)

","alias":"module:interact.stop","params":[{"type":{"names":["Event"]},"description":"

An event on which to call preventDefault()

","name":"event"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"stop","longname":"module:interact.stop","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001347","___s":true,"attribs":"(static) ","id":".stop","signature":"(event) → {object}","ancestors":["interact."]},{"comment":"/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */","meta":{"range":[5164,5250],"filename":"interact.js","lineno":197,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013798","name":"interact.supportsPointerEvent","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"alias":"module:interact.supportsPointerEvent","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports PointerEvents

"}],"name":"supportsPointerEvent","longname":"module:interact.supportsPointerEvent","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001346","___s":true,"attribs":"(static) ","id":".supportsPointerEvent","signature":"() → {boolean}","ancestors":["interact."]},{"comment":"/**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */","meta":{"range":[4960,5032],"filename":"interact.js","lineno":188,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013787","name":"interact.supportsTouch","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"alias":"module:interact.supportsTouch","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports touch input

"}],"name":"supportsTouch","longname":"module:interact.supportsTouch","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001345","___s":true,"attribs":"(static) ","id":".supportsTouch","signature":"() → {boolean}","ancestors":["interact."]},{"kind":"package","longname":"package:undefined","files":["/home/taye/proj/interact.js/src/Eventable.js","/home/taye/proj/interact.js/src/InteractEvent.js","/home/taye/proj/interact.js/src/Interactable.js","/home/taye/proj/interact.js/src/Interaction.js","/home/taye/proj/interact.js/src/actions/base.js","/home/taye/proj/interact.js/src/actions/drag.js","/home/taye/proj/interact.js/src/actions/drop.js","/home/taye/proj/interact.js/src/actions/gesture.js","/home/taye/proj/interact.js/src/actions/resize.js","/home/taye/proj/interact.js/src/autoScroll.js","/home/taye/proj/interact.js/src/autoStart/InteractableMethods.js","/home/taye/proj/interact.js/src/autoStart/base.js","/home/taye/proj/interact.js/src/autoStart/drag.js","/home/taye/proj/interact.js/src/autoStart/gesture.js","/home/taye/proj/interact.js/src/autoStart/hold.js","/home/taye/proj/interact.js/src/autoStart/resize.js","/home/taye/proj/interact.js/src/defaultOptions.js","/home/taye/proj/interact.js/src/header.js","/home/taye/proj/interact.js/src/index.js","/home/taye/proj/interact.js/src/inertia.js","/home/taye/proj/interact.js/src/interact.js","/home/taye/proj/interact.js/src/interactablePreventDefault.js","/home/taye/proj/interact.js/src/minHeader.js","/home/taye/proj/interact.js/src/modifiers/base.js","/home/taye/proj/interact.js/src/modifiers/restrict.js","/home/taye/proj/interact.js/src/modifiers/restrictEdges.js","/home/taye/proj/interact.js/src/modifiers/restrictSize.js","/home/taye/proj/interact.js/src/modifiers/snap.js","/home/taye/proj/interact.js/src/modifiers/snapSize.js","/home/taye/proj/interact.js/src/pointerEvents/PointerEvent.js","/home/taye/proj/interact.js/src/pointerEvents/base.js","/home/taye/proj/interact.js/src/pointerEvents/holdRepeat.js","/home/taye/proj/interact.js/src/pointerEvents/interactableTargets.js","/home/taye/proj/interact.js/src/scope.js","/home/taye/proj/interact.js/src/utils/Signals.js","/home/taye/proj/interact.js/src/utils/arr.js","/home/taye/proj/interact.js/src/utils/browser.js","/home/taye/proj/interact.js/src/utils/domObjects.js","/home/taye/proj/interact.js/src/utils/domUtils.js","/home/taye/proj/interact.js/src/utils/events.js","/home/taye/proj/interact.js/src/utils/extend.js","/home/taye/proj/interact.js/src/utils/getOriginXY.js","/home/taye/proj/interact.js/src/utils/hypot.js","/home/taye/proj/interact.js/src/utils/index.js","/home/taye/proj/interact.js/src/utils/interactionFinder.js","/home/taye/proj/interact.js/src/utils/is.js","/home/taye/proj/interact.js/src/utils/isWindow.js","/home/taye/proj/interact.js/src/utils/pointerExtend.js","/home/taye/proj/interact.js/src/utils/pointerUtils.js","/home/taye/proj/interact.js/src/utils/raf.js","/home/taye/proj/interact.js/src/utils/rect.js","/home/taye/proj/interact.js/src/utils/window.js","/home/taye/proj/interact.js/docs/index.md"],"___id":"T000002R002595","___s":true,"attribs":"","id":"package:","ancestors":[]}] \ No newline at end of file +[{"comment":"/** @article /home/taye/proj/interact.js/docs/index.md **/","meta":{"filename":"index.md","lineno":1,"columnno":0,"path":"/home/taye/proj/interact.js/docs","code":{},"shortpath":"docs/index.md"},"kind":"article","source":"\n\n","name":"index","filename":"index.md","title":"API Reference","longname":"article:index","description":"

","outfilename":"index.html","scope":"global","___id":"T000002R002602","___s":true,"attribs":"","id":"index","ancestors":[]},{"comment":"/**\n * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */","meta":{"range":[970,1228],"filename":"interact.js","lineno":37,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013379","name":"interact","type":"FunctionDeclaration","paramnames":["element","options"]},"vars":{"interactable":"module:interact~interactable","interactable.events.global":"module:interact~interactable.events.global"},"shortpath":"src/interact.js"},"description":"
interact('#draggable').draggable(true);\n\nvar rectables = interact('rect');\nrectables\n  .gesturable(true)\n  .on('gesturemove', function (event) {\n      // ...\n  });\n
\n

The methods of this variable can be used to set elements as interactables\nand also to change various default settings.

\n

Calling it as a function and passing an element or a valid CSS selector\nstring returns an Interactable object which has various methods to configure\nit.

","scope":"global","params":[{"type":{"names":["Element","string"]},"description":"

The HTML or SVG Element to interact with\nor CSS selector

","name":"element"}],"returns":[{"type":{"names":["Interactable"]}}],"name":"interact","longname":"interact","kind":"function","___id":"T000002R001320","___s":true,"attribs":"","id":"interact","signature":"(element) → {Interactable}","ancestors":[]},{"comment":"/** */","meta":{"range":[761,1283],"filename":"Interactable.js","lineno":26,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001133","name":"Interactable","type":"MethodDefinition","paramnames":["target","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"name":"Interactable","longname":"Interactable","kind":"class","scope":"global","params":[],"___id":"T000003R000002","___s":true,"attribs":"","id":"Interactable","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\n */","meta":{"range":[4614,4895],"filename":"InteractableMethods.js","lineno":143,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010197","name":"Interactable.prototype.actionChecker","type":"FunctionExpression","paramnames":["checker"]},"vars":{"this.options.actionChecker":"Interactable#actionChecker#options.actionChecker"},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
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
\n

Gets or sets the function used to check action to be performed on\npointerDown

","params":[{"type":{"names":["function","null"]},"optional":true,"description":"

A function which takes a pointer event,\ndefaultAction string, interactable, element and interaction as parameters\nand returns an object with name property 'drag' 'resize' or 'gesture' and\noptionally an edges object with boolean 'top', 'left', 'bottom' and right\nprops.

","name":"checker"}],"returns":[{"type":{"names":["function","Interactable"]},"description":"

The checker function or this Interactable

"}],"name":"actionChecker","longname":"Interactable#actionChecker","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001017","___s":true,"attribs":"","id":"actionChecker","signature":"(checkeropt) → {function|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */","meta":{"range":[2359,2582],"filename":"InteractableMethods.js","lineno":75,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010029","name":"Interactable.prototype.allowFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
","deprecated":"A drag/resize/gesture is started only If the target of the `mousedown`,\n`pointerdown` or `touchstart` event or any of it's parents match the given\nCSS selector or Element.\n\nDon't use this method. Instead set the `allowFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .resizable({\n allowFrom: '.resize-handle',\n .pointerEvents({\n allowFrom: '.handle',,\n });"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to allow from any element

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current allowFrom value or this\nInteractable

"}],"name":"allowFrom","longname":"Interactable#allowFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R001013","___s":true,"attribs":"","id":"allowFrom","ancestors":["Interactable#"],"signature":""},{"comment":"/**\n * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\n */","meta":{"range":[5470,5512],"filename":"Interactable.js","lineno":179,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001664","name":"Interactable#context","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Gets the selector context Node of the Interactable. The default is\nwindow.document.

","returns":[{"type":{"names":["Node"]},"description":"

The context Node of this Interactable

"}],"name":"context","longname":"Interactable#context","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000176","___s":true,"attribs":"","id":"context","signature":"() → {Node}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {string | object} The current deltaSource or this Interactable\n */","meta":{"range":[5104,5295],"filename":"Interactable.js","lineno":163,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001634","name":"Interactable#deltaSource","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Returns or sets the mouse coordinate types used to calculate the\nmovement of the pointer.

","params":[{"type":{"names":["string"]},"optional":true,"description":"

Use 'client' if you will be scrolling while\ninteracting; Use 'page' if you want autoScroll to work

","name":"newValue"}],"returns":[{"type":{"names":["string","object"]},"description":"

The current deltaSource or this Interactable

"}],"name":"deltaSource","longname":"Interactable#deltaSource","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000174","___s":true,"attribs":"","id":"deltaSource","signature":"(newValueopt) → {string|object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */","meta":{"range":[3787,4492],"filename":"drag.js","lineno":119,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100004844","name":"Interactable.prototype.draggable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.drag.enabled":"Interactable#draggable#options.drag.enabled","this.options.drag.lockAxis":"Interactable#draggable#options.drag.lockAxis","this.options.drag.startAxis":"Interactable#draggable#options.drag.startAxis","this.ondragstart":"Interactable#draggable#ondragstart","this.ondragend":"Interactable#draggable#ondragend"},"shortpath":"src/actions/drag.js"},"description":"
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\nvar isDraggable = interact('element').draggable(); // true\n
\n

Get or set whether drag actions can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on drag events (object makes the Interactable\ndraggable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

boolean indicating if this can be the\ntarget of drag events, or this Interctable

"}],"name":"draggable","longname":"Interactable#draggable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000500","___s":true,"attribs":"","id":"draggable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[10642,12201],"filename":"drop.js","lineno":327,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100006140","name":"Interactable.prototype.dropzone","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.drop.enabled":"Interactable#dropzone#options.drop.enabled","this.events.ondrop":"Interactable#dropzone#events.ondrop","this.events.ondropactivate":"Interactable#dropzone#events.ondropactivate","this.events.ondropdeactivate":"Interactable#dropzone#events.ondropdeactivate","this.events.ondragenter":"Interactable#dropzone#events.ondragenter","this.events.ondragleave":"Interactable#dropzone#events.ondragleave","this.events.ondropmove":"Interactable#dropzone#events.ondropmove","this.options.drop.overlap":"Interactable#dropzone#options.drop.overlap","this.options.drop.accept":"Interactable#dropzone#options.drop.accept","this.options.drop.checker":"Interactable#dropzone#options.drop.checker","this.ondragenter":"Interactable#dropzone#ondragenter","this.ondragleave":"Interactable#dropzone#ondragleave","this.ondrop":"Interactable#dropzone#ondrop","this.ondropactivate":"Interactable#dropzone#ondropactivate","this.ondropdeactivate":"Interactable#dropzone#ondropdeactivate"},"shortpath":"src/actions/drop.js"},"description":"
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
interact('.drop').dropzone({\n  accept: '.can-drop' || document.getElementById('single-drop'),\n  overlap: 'pointer' || 'center' || zeroToOne\n}\n
\n

Returns or sets whether draggables can be dropped onto this target to\ntrigger drop events

\n

Dropzones can receive the following events:

\n
    \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\nselector 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\nvalues 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).\ne.g. 0.5 for drop to happen when half of the area of the draggable is\nover the dropzone
  • \n
\n

Use the checker option to specify a function to check if a dragged element\nis over this Interactable.

","params":[{"type":{"names":["boolean","object","null"]},"optional":true,"description":"

The new options to be set.

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"dropzone","longname":"Interactable#dropzone","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000640","___s":true,"attribs":"","id":"dropzone","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */","meta":{"range":[5920,5987],"filename":"Interactable.js","lineno":196,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001692","name":"Interactable#fire","type":"MethodDefinition","paramnames":["iEvent"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Calls listeners for the given InteractEvent type bound globally\nand directly to this Interactable

","params":[{"type":{"names":["InteractEvent"]},"description":"

The InteractEvent object to be fired on this\nInteractable

","name":"iEvent"}],"returns":[{"type":{"names":["Interactable"]},"description":"

this Interactable

"}],"name":"fire","longname":"Interactable#fire","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000178","___s":true,"attribs":"","id":"fire","signature":"(iEvent) → {Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\n */","meta":{"range":[2228,2736],"filename":"gesture.js","lineno":79,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100007192","name":"Interactable.prototype.gesturable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.gesture.enabled":"Interactable#gesturable#options.gesture.enabled","this.ongesturestart":"Interactable#gesturable#ongesturestart","this.ongestureend":"Interactable#gesturable#ongestureend"},"shortpath":"src/actions/gesture.js"},"description":"
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 {@link Interactable.draggable} example\n    max: Infinity,\n    maxPerElement: 1,\n});\n\nvar isGestureable = interact(element).gesturable();\n
\n

Gets or sets whether multitouch gestures can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on gesture events (makes the Interactable gesturable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of gesture events, or this Interactable

"}],"name":"gesturable","longname":"Interactable#gesturable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000725","___s":true,"attribs":"","id":"gesturable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\n */","meta":{"range":[3179,3402],"filename":"Interactable.js","lineno":93,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001488","name":"Interactable#getRect","type":"MethodDefinition","paramnames":["element"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

The default function to get an Interactables bounding rect. Can be\noverridden using {@link Interactable.rectChecker}.

","params":[{"type":{"names":["Element"]},"optional":true,"description":"

The element to measure.

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

The object's bounding rectangle.

"}],"name":"getRect","longname":"Interactable#getRect","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000164","___s":true,"attribs":"","id":"getRect","signature":"(elementopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */","meta":{"range":[1442,1669],"filename":"InteractableMethods.js","lineno":47,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010009","name":"Interactable.prototype.ignoreFrom","type":"CallExpression","value":"","paramnames":[]},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"
interact(element, { ignoreFrom: document.getElementById('no-action') });\n// or\ninteract(element).ignoreFrom('input, textarea, a');\n
","deprecated":"If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\nof it's parents match the given CSS selector or Element, no\ndrag/resize/gesture is started.\n\nDon't use this method. Instead set the `ignoreFrom` option for each action\nor for `pointerEvents`","examples":[{"caption":"","code":"interact(targett)\n .draggable({\n ignoreFrom: 'input, textarea, a[href]'',\n })\n .pointerEvents({\n ignoreFrom: '[no-pointer]',\n });"}],"params":[{"type":{"names":["string","Element","null"]},"optional":true,"description":"

a CSS selector string, an\nElement or null to not ignore any elements

","name":"newValue"}],"returns":[{"type":{"names":["string","Element","object"]},"description":"

The current ignoreFrom value or this\nInteractable

"}],"name":"ignoreFrom","longname":"Interactable#ignoreFrom","kind":"member","memberof":"Interactable","scope":"instance","___id":"T000002R001012","___s":true,"attribs":"","id":"ignoreFrom","ancestors":["Interactable#"],"signature":""},{"comment":"/**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */","meta":{"range":[7813,8459],"filename":"Interactable.js","lineno":265,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001872","name":"Interactable#off","type":"MethodDefinition","paramnames":["eventType","listener","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Removes an InteractEvent, pointerEvent or DOM event listener

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were\nlistened for

","name":"eventType"},{"type":{"names":["function"]},"description":"

The listener function to be removed

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"off","longname":"Interactable#off","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000185","___s":true,"attribs":"","id":"off","signature":"(eventType, listener, optionsopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */","meta":{"range":[6860,7418],"filename":"Interactable.js","lineno":234,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001790","name":"Interactable#on","type":"MethodDefinition","paramnames":["eventType","listener","options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Binds a listener for an InteractEvent, pointerEvent or DOM event.

","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen\nfor

","name":"eventType"},{"type":{"names":["function"]},"description":"

The function event (s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

options object or useCapture flag\nfor addEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"on","longname":"Interactable#on","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000183","___s":true,"attribs":"","id":"on","signature":"(eventType, listener, optionsopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */","meta":{"range":[4693,4771],"filename":"Interactable.js","lineno":151,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001622","name":"Interactable#origin","type":"MethodDefinition","paramnames":["newValue"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Gets or sets the origin of the Interactable's element. The x and y\nof the origin will be subtracted from action event coordinates.

","params":[{"type":{"names":["Element","object","string"]},"optional":true,"description":"

An HTML or SVG Element whose\nrect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\nor any CSS selector

","name":"origin"}],"returns":[{"type":{"names":["object"]},"description":"

The current origin or this Interactable

"}],"name":"origin","longname":"Interactable#origin","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000173","___s":true,"attribs":"","id":"origin","signature":"(originopt) → {object}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */","meta":{"range":[752,1080],"filename":"interactablePreventDefault.js","lineno":20,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013964","name":"Interactable.prototype.preventDefault","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"this.options.preventDefault":"Interactable#preventDefault#options.preventDefault"},"shortpath":"src/interactablePreventDefault.js"},"description":"

Returns or sets whether to prevent the browser's default behaviour in\nresponse to pointer events. Can be set to:

\n
    \n
  • 'always' to always prevent
  • \n
  • 'never' to never prevent
  • \n
  • 'auto' to let interact.js try to determine what would be best
  • \n
","params":[{"type":{"names":["string"]},"optional":true,"description":"

true, false or 'auto'

","name":"newValue"}],"returns":[{"type":{"names":["string","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"preventDefault","longname":"Interactable#preventDefault","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001364","___s":true,"attribs":"","id":"preventDefault","signature":"(newValueopt) → {string|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {function | object} The checker function or this Interactable\n */","meta":{"range":[3730,3961],"filename":"Interactable.js","lineno":111,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001533","name":"Interactable#rectChecker","type":"MethodDefinition","paramnames":["checker"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Returns or sets the function used to calculate the interactable's\nelement's rectangle

","params":[{"type":{"names":["function"]},"optional":true,"description":"

A function which returns this Interactable's\nbounding rectangle. See {@link Interactable.getRect}

","name":"checker"}],"returns":[{"type":{"names":["function","object"]},"description":"

The checker function or this Interactable

"}],"name":"rectChecker","longname":"Interactable#rectChecker","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000167","___s":true,"attribs":"","id":"rectChecker","signature":"(checkeropt) → {function|object}","ancestors":["Interactable#"]},{"comment":"/**\n * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\n */","meta":{"range":[10565,11507],"filename":"resize.js","lineno":317,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100008738","name":"Interactable.prototype.resizable","type":"FunctionExpression","paramnames":["options"]},"vars":{"this.options.resize.enabled":"Interactable#resizable#options.resize.enabled","this.options.resize.axis":"Interactable#resizable#options.resize.axis","this.options.resize.preserveAspectRatio":"Interactable#resizable#options.resize.preserveAspectRatio","this.options.resize.square":"Interactable#resizable#options.resize.square","this.onresizestart":"Interactable#resizable#onresizestart","this.onresizeend":"Interactable#resizable#onresizeend"},"shortpath":"src/actions/resize.js"},"description":"
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 {@link Interactable.draggable} example\n  max: Infinity,\n  maxPerElement: 1,\n});\n\nvar isResizeable = interact(element).resizable();\n
\n

Gets or sets whether resize actions can be performed on the target

","params":[{"type":{"names":["boolean","object"]},"optional":true,"description":"

true/false or An object with event\nlisteners to be fired on resize events (object makes the Interactable\nresizable)

","name":"options"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

A boolean indicating if this can be the\ntarget of resize elements, or this Interactable

"}],"name":"resizable","longname":"Interactable#resizable","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000910","___s":true,"attribs":"","id":"resizable","signature":"(optionsopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */","meta":{"range":[8619,9357],"filename":"Interactable.js","lineno":294,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100001954","name":"Interactable#set","type":"MethodDefinition","paramnames":["options"]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Reset the options of this Interactable

","params":[{"type":{"names":["object"]},"description":"

The new settings to apply

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

This Interactable

"}],"name":"set","longname":"Interactable#set","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R000187","___s":true,"attribs":"","id":"set","signature":"(options) → {object}","ancestors":["Interactable#"]},{"comment":"/**\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 * @param {boolean} [newValue]\n * @return {boolean | Interactable} The current setting or this Interactable\n */","meta":{"range":[5167,5440],"filename":"InteractableMethods.js","lineno":166,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100010244","name":"Interactable.prototype.styleCursor","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"this.options.styleCursor":"Interactable#styleCursor#options.styleCursor"},"shortpath":"src/autoStart/InteractableMethods.js"},"description":"

Returns or sets whether the the cursor should be changed depending on the\naction that would be performed if the mouse were pressed and dragged.

","params":[{"type":{"names":["boolean"]},"optional":true,"name":"newValue"}],"returns":[{"type":{"names":["boolean","Interactable"]},"description":"

The current setting or this Interactable

"}],"name":"styleCursor","longname":"Interactable#styleCursor","kind":"function","memberof":"Interactable","scope":"instance","___id":"T000002R001019","___s":true,"attribs":"","id":"styleCursor","signature":"(newValueopt) → {boolean|Interactable}","ancestors":["Interactable#"]},{"comment":"/**\n * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {interact}\n */","meta":{"range":[9524,10769],"filename":"Interactable.js","lineno":335,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002078","name":"Interactable#unset","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interactable.js"},"description":"

Remove this interactable from the list of interactables and remove it's\naction capabilities and event listeners

","returns":[{"type":{"names":["interact"]}}],"name":"unset","longname":"Interactable#unset","kind":"function","memberof":"Interactable","scope":"instance","params":[],"___id":"T000002R000198","___s":true,"attribs":"","id":"unset","signature":"() → {interact}","ancestors":["Interactable#"]},{"comment":"/** */","meta":{"range":[236,3017],"filename":"InteractEvent.js","lineno":8,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000236","name":"InteractEvent","type":"MethodDefinition","paramnames":["interaction","event","action","phase","element","related","preEnd"]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"InteractEvent","longname":"InteractEvent","kind":"class","scope":"global","params":[],"___id":"T000003R000003","___s":true,"attribs":"","id":"InteractEvent","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[3966,4070],"filename":"InteractEvent.js","lineno":136,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000911","name":"InteractEvent#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"stopImmediatePropagation","longname":"InteractEvent#stopImmediatePropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R000107","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":["InteractEvent#"]},{"comment":"/** */","meta":{"range":[4083,4143],"filename":"InteractEvent.js","lineno":141,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100000925","name":"InteractEvent#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/InteractEvent.js"},"name":"stopPropagation","longname":"InteractEvent#stopPropagation","kind":"function","memberof":"InteractEvent","scope":"instance","params":[],"___id":"T000002R000110","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":["InteractEvent#"]},{"comment":"/** */","meta":{"range":[629,2309],"filename":"Interaction.js","lineno":23,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002546","name":"Interaction","type":"MethodDefinition","paramnames":[""]},"vars":{"":null},"shortpath":"src/Interaction.js"},"name":"Interaction","longname":"Interaction","kind":"class","scope":"global","params":[],"___id":"T000003R000004","___s":true,"attribs":"","id":"Interaction","signature":"()","ancestors":[]},{"comment":"/**\n * ```js\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 *\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 */","meta":{"range":[6432,6806],"filename":"Interaction.js","lineno":223,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003139","name":"Interaction#doMove","type":"MethodDefinition","paramnames":["signalArg"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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

Force a move of the current action at the same coordinates. Useful if\nsnap/restrict has been changed and you want a movement with the new\nsettings.

","name":"doMove","longname":"Interaction#doMove","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R000320","___s":true,"attribs":"","id":"doMove","signature":"()","ancestors":["Interaction#"]},{"comment":"/**\n * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */","meta":{"range":[7817,8065],"filename":"Interaction.js","lineno":280,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003266","name":"Interaction#end","type":"MethodDefinition","paramnames":["event"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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

Stop the current action and fire an end event. Inertial movement does\nnot happen.

","params":[{"type":{"names":["PointerEvent"]},"optional":true,"name":"event"}],"name":"end","longname":"Interaction#end","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R000336","___s":true,"attribs":"","id":"end","signature":"(eventopt)","ancestors":["Interaction#"]},{"comment":"/**\n * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\n */","meta":{"range":[3719,4294],"filename":"Interaction.js","lineno":129,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100002802","name":"Interaction#start","type":"MethodDefinition","paramnames":["action","target","element"]},"vars":{"":null},"shortpath":"src/Interaction.js"},"description":"
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 an action with the given Interactable and Element as tartgets. The\naction must be enabled for the target Interactable and an appropriate\nnumber of pointers must be held down - 1 for drag/resize, 2 for gesture.

\n

Use it with interactable.<action>able({ manualStart: false }) to always\nstart actions manually

","params":[{"type":{"names":["object"]},"description":"

The action to be performed - drag, resize, etc.

","name":"action"},{"type":{"names":["Interactable"]},"description":"

The Interactable to target

","name":"target"},{"type":{"names":["Element"]},"description":"

The DOM Element to target

","name":"element"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"start","longname":"Interaction#start","kind":"function","memberof":"Interaction","scope":"instance","___id":"T000002R000298","___s":true,"attribs":"","id":"start","signature":"(action, target, element) → {object}","ancestors":["Interaction#"]},{"comment":"/** */","meta":{"range":[8214,8563],"filename":"Interaction.js","lineno":305,"columnno":2,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100003336","name":"Interaction#stop","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/Interaction.js"},"name":"stop","longname":"Interaction#stop","kind":"function","memberof":"Interaction","scope":"instance","params":[],"___id":"T000002R000344","___s":true,"attribs":"","id":"stop","signature":"()","ancestors":["Interaction#"]},{"comment":"/** */","meta":{"range":[105,1150],"filename":"PointerEvent.js","lineno":5,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018135","name":"module.exports","type":"MethodDefinition","paramnames":["type","pointer","event","eventTarget","interaction"]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"exports","longname":"module.exports#module.exports","kind":"class","memberof":"module.exports#module","scope":"static","params":[],"___id":"T000003R000005","___s":true,"attribs":"","id":"exports","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1532,1596],"filename":"PointerEvent.js","lineno":57,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018379","name":"module.exports#preventDefault","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"preventDefault","longname":"module.exports#preventDefault","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001898","___s":true,"attribs":"","id":"preventDefault","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1682,1786],"filename":"PointerEvent.js","lineno":67,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018400","name":"module.exports#stopImmediatePropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"stopImmediatePropagation","longname":"module.exports#stopImmediatePropagation","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001901","___s":true,"attribs":"","id":"stopImmediatePropagation","signature":"()","ancestors":[]},{"comment":"/** */","meta":{"range":[1609,1669],"filename":"PointerEvent.js","lineno":62,"columnno":2,"path":"/home/taye/proj/interact.js/src/pointerEvents","code":{"id":"astnode100018390","name":"module.exports#stopPropagation","type":"MethodDefinition","paramnames":[]},"vars":{"":null},"shortpath":"src/pointerEvents/PointerEvent.js"},"name":"stopPropagation","longname":"module.exports#stopPropagation","kind":"function","memberof":"module.exports","scope":"instance","params":[],"___id":"T000002R001899","___s":true,"attribs":"","id":"stopPropagation","signature":"()","ancestors":[]},{"comment":"/** @module interact */","meta":{"filename":"interact.js","lineno":1,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{},"shortpath":"src/interact.js"},"kind":"module","name":"interact","longname":"module:interact","___id":"T000004R000002","___s":true,"attribs":"","id":"interact","ancestors":[],"modules":[]},{"comment":"/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * and expose internal functions and variables\n */","meta":{"range":[4308,4356],"filename":"interact.js","lineno":168,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013727","name":"interact.debug","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"description":"

Returns an object which exposes internal data

","alias":"module:interact.debug","returns":[{"type":{"names":["object"]},"description":"

An object with properties that outline the current state\nand expose internal functions and variables

"}],"name":"debug","longname":"module:interact.debug","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001337","___s":true,"attribs":"(static) ","id":".debug","signature":"() → {object}","ancestors":["interact."]},{"comment":"/**\n * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {boolean | interact} The current setting or interact\n */","meta":{"range":[15393,15650],"filename":"drop.js","lineno":454,"columnno":0,"path":"/home/taye/proj/interact.js/src/actions","code":{"id":"astnode100006882","name":"interact.dynamicDrop","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"dynamicDrop":"module:interact.dynamicDrop~dynamicDrop"},"shortpath":"src/actions/drop.js"},"description":"

Returns or sets whether the dimensions of dropzone elements are calculated\non every dragmove or only on dragstart for the default dropChecker

","params":[{"type":{"names":["boolean"]},"optional":true,"description":"

True to check on each move. False to check only\nbefore start

","name":"newValue"}],"returns":[{"type":{"names":["boolean","interact"]},"description":"

The current setting or interact

"}],"name":"dynamicDrop","longname":"module:interact.dynamicDrop","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R000692","___s":true,"attribs":"(static) ","id":".dynamicDrop","signature":"(newValueopt) → {boolean|interact}","ancestors":["interact."]},{"comment":"/**\n * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/","meta":{"range":[1519,1656],"filename":"interact.js","lineno":58,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013417","name":"interact.isSet","type":"FunctionExpression","paramnames":["element","options"]},"shortpath":"src/interact.js"},"description":"

Check if an element or selector has been set with the {@link interact}\nfunction

","alias":"module:interact.isSet","params":[{"type":{"names":["Element"]},"description":"

The Element being searched for

","name":"element"}],"returns":[{"type":{"names":["boolean"]},"description":"

Indicates if the element or CSS selector was previously\npassed to interact

"}],"name":"isSet","longname":"module:interact.isSet","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001324","___s":true,"attribs":"(static) ","id":".isSet","signature":"(element) → {boolean}","ancestors":["interact."]},{"comment":"/**\n * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n */","meta":{"range":[6535,6725],"filename":"base.js","lineno":224,"columnno":0,"path":"/home/taye/proj/interact.js/src/autoStart","code":{"id":"astnode100011207","name":"interact.maxInteractions","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"autoStart.maxInteractions":"autoStart.maxInteractions"},"shortpath":"src/autoStart/base.js"},"description":"

Returns or sets the maximum number of concurrent interactions allowed. By\ndefault only 1 interaction is allowed at a time (for backwards\ncompatibility). To allow multiple interactions on the same Interactables and\nelements, you need to enable it in the draggable, resizable and gesturable\n'max' and 'maxPerElement' options.

","alias":"module:interact.maxInteractions","params":[{"type":{"names":["number"]},"optional":true,"description":"

Any number. newValue <= 0 means no interactions.

","name":"newValue"}],"name":"maxInteractions","longname":"module:interact.maxInteractions","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001109","___s":true,"attribs":"(static) ","id":".maxInteractions","signature":"(newValueopt)","ancestors":["interact."]},{"comment":"/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */","meta":{"range":[3329,4088],"filename":"interact.js","lineno":124,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013581","name":"interact.off","type":"FunctionExpression","paramnames":["type","listener","options"]},"vars":{"type":"module:interact~type","eventType":"module:interact.off~eventType","prop":"module:interact.off~prop","index":"module:interact~index"},"shortpath":"src/interact.js"},"description":"

Removes a global InteractEvent listener or DOM event from document

","alias":"module:interact.off","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events that were listened\nfor

","name":"type"},{"type":{"names":["function"]},"description":"

The listener function to be removed

","name":"listener"},{"type":{"names":["object","boolean"]},"description":"

[options] object or useCapture flag for\nremoveEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"off","longname":"module:interact.off","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001331","___s":true,"attribs":"(static) ","id":".off","signature":"(type, listener, options) → {object}","ancestors":["interact."]},{"comment":"/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */","meta":{"range":[2028,2928],"filename":"interact.js","lineno":73,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013442","name":"interact.on","type":"FunctionExpression","paramnames":["type","listener","options"]},"vars":{"type":"module:interact~type","eventType":"module:interact.on~eventType","prop":"module:interact.on~prop","globalEvents[undefined]":"module:interact~globalEvents.undefined]"},"shortpath":"src/interact.js"},"description":"

Add a global listener for an InteractEvent or adds a DOM event to document

","alias":"module:interact.on","params":[{"type":{"names":["string","array","object"]},"description":"

The types of events to listen for

","name":"type"},{"type":{"names":["function"]},"description":"

The function event (s)

","name":"listener"},{"type":{"names":["object","boolean"]},"optional":true,"description":"

object or useCapture flag for\naddEventListener

","name":"options"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"on","longname":"module:interact.on","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001325","___s":true,"attribs":"(static) ","id":".on","signature":"(type, listener, optionsopt) → {object}","ancestors":["interact."]},{"comment":"/**\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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */","meta":{"range":[5942,6151],"filename":"interact.js","lineno":226,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013859","name":"interact.pointerMoveTolerance","type":"FunctionExpression","paramnames":["newValue"]},"vars":{"Interaction.pointerMoveTolerance":"module:interact~Interaction.pointerMoveTolerance"},"shortpath":"src/interact.js"},"description":"

Returns or sets the distance the pointer must be moved before an action\nsequence occurs. This also affects tolerance for tap events.

","alias":"module:interact.pointerMoveTolerance","params":[{"type":{"names":["number"]},"optional":true,"description":"

The movement from the start position must be greater than this value

","name":"newValue"}],"returns":[{"type":{"names":["interact","number"]}}],"name":"pointerMoveTolerance","longname":"module:interact.pointerMoveTolerance","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001350","___s":true,"attribs":"(static) ","id":".pointerMoveTolerance","signature":"(newValueopt) → {interact|number}","ancestors":["interact."]},{"comment":"/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {object} interact\n */","meta":{"range":[5449,5609],"filename":"interact.js","lineno":209,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013822","name":"interact.stop","type":"FunctionExpression","paramnames":["event"]},"vars":{"i":"module:interact.stop~i"},"shortpath":"src/interact.js"},"description":"

Cancels all interactions (end events are not fired)

","alias":"module:interact.stop","params":[{"type":{"names":["Event"]},"description":"

An event on which to call preventDefault()

","name":"event"}],"returns":[{"type":{"names":["object"]},"description":"

interact

"}],"name":"stop","longname":"module:interact.stop","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001348","___s":true,"attribs":"(static) ","id":".stop","signature":"(event) → {object}","ancestors":["interact."]},{"comment":"/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */","meta":{"range":[5164,5250],"filename":"interact.js","lineno":197,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013811","name":"interact.supportsPointerEvent","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"alias":"module:interact.supportsPointerEvent","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports PointerEvents

"}],"name":"supportsPointerEvent","longname":"module:interact.supportsPointerEvent","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001347","___s":true,"attribs":"(static) ","id":".supportsPointerEvent","signature":"() → {boolean}","ancestors":["interact."]},{"comment":"/**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */","meta":{"range":[4960,5032],"filename":"interact.js","lineno":188,"columnno":0,"path":"/home/taye/proj/interact.js/src","code":{"id":"astnode100013800","name":"interact.supportsTouch","type":"FunctionExpression","paramnames":[]},"shortpath":"src/interact.js"},"alias":"module:interact.supportsTouch","returns":[{"type":{"names":["boolean"]},"description":"

Whether or not the browser supports touch input

"}],"name":"supportsTouch","longname":"module:interact.supportsTouch","kind":"function","memberof":"module:interact","scope":"static","___id":"T000002R001346","___s":true,"attribs":"(static) ","id":".supportsTouch","signature":"() → {boolean}","ancestors":["interact."]},{"kind":"package","longname":"package:undefined","files":["/home/taye/proj/interact.js/src/Eventable.js","/home/taye/proj/interact.js/src/InteractEvent.js","/home/taye/proj/interact.js/src/Interactable.js","/home/taye/proj/interact.js/src/Interaction.js","/home/taye/proj/interact.js/src/actions/base.js","/home/taye/proj/interact.js/src/actions/drag.js","/home/taye/proj/interact.js/src/actions/drop.js","/home/taye/proj/interact.js/src/actions/gesture.js","/home/taye/proj/interact.js/src/actions/resize.js","/home/taye/proj/interact.js/src/autoScroll.js","/home/taye/proj/interact.js/src/autoStart/InteractableMethods.js","/home/taye/proj/interact.js/src/autoStart/base.js","/home/taye/proj/interact.js/src/autoStart/drag.js","/home/taye/proj/interact.js/src/autoStart/gesture.js","/home/taye/proj/interact.js/src/autoStart/hold.js","/home/taye/proj/interact.js/src/autoStart/resize.js","/home/taye/proj/interact.js/src/defaultOptions.js","/home/taye/proj/interact.js/src/header.js","/home/taye/proj/interact.js/src/index.js","/home/taye/proj/interact.js/src/inertia.js","/home/taye/proj/interact.js/src/interact.js","/home/taye/proj/interact.js/src/interactablePreventDefault.js","/home/taye/proj/interact.js/src/minHeader.js","/home/taye/proj/interact.js/src/modifiers/base.js","/home/taye/proj/interact.js/src/modifiers/restrict.js","/home/taye/proj/interact.js/src/modifiers/restrictEdges.js","/home/taye/proj/interact.js/src/modifiers/restrictSize.js","/home/taye/proj/interact.js/src/modifiers/snap.js","/home/taye/proj/interact.js/src/modifiers/snapSize.js","/home/taye/proj/interact.js/src/pointerEvents/PointerEvent.js","/home/taye/proj/interact.js/src/pointerEvents/base.js","/home/taye/proj/interact.js/src/pointerEvents/holdRepeat.js","/home/taye/proj/interact.js/src/pointerEvents/interactableTargets.js","/home/taye/proj/interact.js/src/scope.js","/home/taye/proj/interact.js/src/utils/Signals.js","/home/taye/proj/interact.js/src/utils/arr.js","/home/taye/proj/interact.js/src/utils/browser.js","/home/taye/proj/interact.js/src/utils/clone.js","/home/taye/proj/interact.js/src/utils/domObjects.js","/home/taye/proj/interact.js/src/utils/domUtils.js","/home/taye/proj/interact.js/src/utils/events.js","/home/taye/proj/interact.js/src/utils/extend.js","/home/taye/proj/interact.js/src/utils/getOriginXY.js","/home/taye/proj/interact.js/src/utils/hypot.js","/home/taye/proj/interact.js/src/utils/index.js","/home/taye/proj/interact.js/src/utils/interactionFinder.js","/home/taye/proj/interact.js/src/utils/is.js","/home/taye/proj/interact.js/src/utils/isWindow.js","/home/taye/proj/interact.js/src/utils/pointerExtend.js","/home/taye/proj/interact.js/src/utils/pointerUtils.js","/home/taye/proj/interact.js/src/utils/raf.js","/home/taye/proj/interact.js/src/utils/rect.js","/home/taye/proj/interact.js/src/utils/window.js","/home/taye/proj/interact.js/docs/index.md"],"___id":"T000002R002603","___s":true,"attribs":"","id":"package:","ancestors":[]}] \ No newline at end of file diff --git a/dist/docs/src_Interactable.js.html b/dist/docs/src_Interactable.js.html index 124de258e..2cc9641a3 100644 --- a/dist/docs/src_Interactable.js.html +++ b/dist/docs/src_Interactable.js.html @@ -41,7 +41,8 @@

src/Interactable.js

-
const is        = require('./utils/is');
+            
const clone     = require('./utils/clone');
+const is        = require('./utils/is');
 const events    = require('./utils/events');
 const extend    = require('./utils/extend');
 const actions   = require('./actions/base');
@@ -106,8 +107,9 @@ 

src/Interactable.js

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]); + // duplicate the object and merge + this.options[action][option] = clone(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; @@ -337,14 +339,14 @@

src/Interactable.js

options = {}; } - this.options = extend({}, defaults.base); + this.options = clone(defaults.base); - const perActions = extend({}, defaults.perAction); + const perActions = clone(defaults.perAction); for (const actionName in actions.methodDict) { const methodName = actions.methodDict[actionName]; - this.options[actionName] = extend({}, defaults[actionName]); + this.options[actionName] = clone(defaults[actionName]); this.setPerAction(actionName, perActions); diff --git a/dist/interact.js b/dist/interact.js index 6b89bac1b..86c0ce1b5 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,7 +1,7 @@ /** - * interact.js v1.3.2 + * interact.js v1.3.3 * - * Copyright (c) 2012-2017 Taye Adeyemi + * Copyright (c) 2012-2018 Taye Adeyemi * Released under the MIT License. * https://raw.github.com/taye/interact.js/master/LICENSE */ @@ -26,7 +26,7 @@ if (typeof window === 'undefined') { module.exports = require('./src/index'); } -},{"./src/index":19,"./src/utils/window":51}],2:[function(require,module,exports){ +},{"./src/index":19,"./src/utils/window":52}],2:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -104,7 +104,7 @@ var Eventable = function () { module.exports = Eventable; -},{"./utils/extend.js":40}],3:[function(require,module,exports){ +},{"./utils/extend.js":41}],3:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -282,11 +282,12 @@ InteractEvent.signals = signals; module.exports = InteractEvent; -},{"./defaultOptions":18,"./utils/Signals":34,"./utils/extend":40,"./utils/getOriginXY":41}],4:[function(require,module,exports){ +},{"./defaultOptions":18,"./utils/Signals":34,"./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 clone = require('./utils/clone'); var is = require('./utils/is'); var events = require('./utils/events'); var extend = require('./utils/extend'); @@ -369,8 +370,9 @@ var Interactable = function () { 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]); + // duplicate the object and merge + this.options[action][option] = clone(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; @@ -628,14 +630,14 @@ var Interactable = function () { options = {}; } - this.options = extend({}, defaults.base); + this.options = clone(defaults.base); - var perActions = extend({}, defaults.perAction); + var perActions = clone(defaults.perAction); for (var actionName in actions.methodDict) { var methodName = actions.methodDict[actionName]; - this.options[actionName] = extend({}, defaults[actionName]); + this.options[actionName] = clone(defaults[actionName]); this.setPerAction(actionName, perActions); @@ -773,7 +775,7 @@ Interactable.settingsMethods = ['deltaSource', 'origin', 'preventDefault', 'rect module.exports = Interactable; -},{"./Eventable":2,"./actions/base":6,"./defaultOptions":18,"./scope":33,"./utils/Signals":34,"./utils/arr":35,"./utils/browser":36,"./utils/domUtils":38,"./utils/events":39,"./utils/extend":40,"./utils/is":45,"./utils/window":51}],5:[function(require,module,exports){ +},{"./Eventable":2,"./actions/base":6,"./defaultOptions":18,"./scope":33,"./utils/Signals":34,"./utils/arr":35,"./utils/browser":36,"./utils/clone":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"); } } @@ -1326,7 +1328,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":33,"./utils":43,"./utils/Signals":34,"./utils/browser":36,"./utils/domObjects":37,"./utils/events":39,"./utils/interactionFinder":44}],6:[function(require,module,exports){ +},{"./scope":33,"./utils":44,"./utils/Signals":34,"./utils/browser":36,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -1539,7 +1541,7 @@ defaultOptions.drag = drag.defaults; module.exports = drag; -},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":43,"./base":6}],8:[function(require,module,exports){ +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],8:[function(require,module,exports){ 'use strict'; var actions = require('./base'); @@ -2055,7 +2057,7 @@ defaultOptions.drop = drop.defaults; module.exports = drop; -},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":43,"./base":6}],9:[function(require,module,exports){ +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":44,"./base":6}],9:[function(require,module,exports){ 'use strict'; var actions = require('./base'); @@ -2231,7 +2233,7 @@ defaultOptions.gesture = gesture.defaults; module.exports = gesture; -},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":43,"./base":6}],10:[function(require,module,exports){ +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(require,module,exports){ 'use strict'; var actions = require('./base'); @@ -2686,7 +2688,7 @@ defaultOptions.resize = resize.defaults; module.exports = resize; -},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":43,"../utils/browser":36,"./base":6}],11:[function(require,module,exports){ +},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":36,"./base":6}],11:[function(require,module,exports){ 'use strict'; var raf = require('./utils/raf'); @@ -2814,7 +2816,7 @@ defaultOptions.perAction.autoScroll = autoScroll.defaults; module.exports = autoScroll; -},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":38,"./utils/is":45,"./utils/raf":49,"./utils/window":51}],12:[function(require,module,exports){ +},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(require,module,exports){ 'use strict'; /** @lends Interactable */ @@ -3031,7 +3033,7 @@ Interactable.prototype.defaultActionChecker = function (pointer, event, interact } }; -},{"../Interactable":4,"../actions/base":6,"../utils":43,"../utils/domUtils":38,"../utils/is":45}],13:[function(require,module,exports){ +},{"../Interactable":4,"../actions/base":6,"../utils":44,"../utils/domUtils":39,"../utils/is":46}],13:[function(require,module,exports){ 'use strict'; var interact = require('../interact'); @@ -3298,7 +3300,7 @@ utils.extend(defaultOptions.perAction, autoStart.defaults.perAction); module.exports = autoStart; -},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":43,"../utils/Signals":34,"./InteractableMethods":12}],14:[function(require,module,exports){ +},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":44,"../utils/Signals":34,"./InteractableMethods":12}],14:[function(require,module,exports){ 'use strict'; var autoStart = require('./base'); @@ -3382,7 +3384,7 @@ function checkStartAxis(startAxis, interactable) { return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; } -},{"../actions/drag":7,"../scope":33,"../utils/domUtils":38,"../utils/is":45,"./base":13}],15:[function(require,module,exports){ +},{"../actions/drag":7,"../scope":33,"../utils/domUtils":39,"../utils/is":46,"./base":13}],15:[function(require,module,exports){ 'use strict'; require('./base').setActionDefaults(require('../actions/gesture')); @@ -3814,7 +3816,7 @@ function updateInertiaCoords(interaction) { }]); } -},{"./InteractEvent":3,"./Interaction":5,"./modifiers/base":23,"./utils":43,"./utils/raf":49}],21:[function(require,module,exports){ +},{"./InteractEvent":3,"./Interaction":5,"./modifiers/base":23,"./utils":44,"./utils/raf":50}],21:[function(require,module,exports){ 'use strict'; /** @module interact */ @@ -4066,7 +4068,7 @@ scope.interact = interact; module.exports = interact; -},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils":43,"./utils/browser":36,"./utils/events":39}],22:[function(require,module,exports){ +},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils":44,"./utils/browser":36,"./utils/events":40}],22:[function(require,module,exports){ 'use strict'; var Interactable = require('./Interactable'); @@ -4171,7 +4173,7 @@ Interaction.docEvents.dragstart = function preventNativeDrag(event) { } }; -},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils/browser":36,"./utils/domUtils":38,"./utils/events":39,"./utils/is":45}],23:[function(require,module,exports){ +},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils/browser":36,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(require,module,exports){ 'use strict'; var InteractEvent = require('../InteractEvent'); @@ -4407,7 +4409,7 @@ function shouldDo(options, preEnd, requireEndOnly) { module.exports = modifiers; -},{"../InteractEvent":3,"../Interaction":5,"../utils/extend":40}],24:[function(require,module,exports){ +},{"../InteractEvent":3,"../Interaction":5,"../utils/extend":41}],24:[function(require,module,exports){ 'use strict'; var modifiers = require('./base'); @@ -4535,7 +4537,7 @@ defaultOptions.perAction.restrict = restrict.defaults; module.exports = restrict; -},{"../defaultOptions":18,"../utils":43,"./base":23}],25:[function(require,module,exports){ +},{"../defaultOptions":18,"../utils":44,"./base":23}],25:[function(require,module,exports){ 'use strict'; // This module adds the options.resize.restrictEdges setting which sets min and @@ -4674,7 +4676,7 @@ resize.defaults.restrictEdges = restrictEdges.defaults; module.exports = restrictEdges; -},{"../actions/resize":10,"../defaultOptions":18,"../utils":43,"../utils/rect":50,"./base":23,"./restrict":24}],26:[function(require,module,exports){ +},{"../actions/resize":10,"../defaultOptions":18,"../utils":44,"../utils/rect":51,"./base":23,"./restrict":24}],26:[function(require,module,exports){ 'use strict'; // This module adds the options.resize.restrictSize setting which sets min and @@ -4763,7 +4765,7 @@ resize.defaults.restrictSize = restrictSize.defaults; module.exports = restrictSize; -},{"../actions/resize":10,"../defaultOptions":18,"../utils":43,"../utils/rect":50,"./base":23,"./restrictEdges":25}],27:[function(require,module,exports){ +},{"../actions/resize":10,"../defaultOptions":18,"../utils":44,"../utils/rect":51,"./base":23,"./restrictEdges":25}],27:[function(require,module,exports){ 'use strict'; var modifiers = require('./base'); @@ -5030,7 +5032,7 @@ defaultOptions.perAction.snap = snap.defaults; module.exports = snap; -},{"../defaultOptions":18,"../interact":21,"../utils":43,"./base":23}],28:[function(require,module,exports){ +},{"../defaultOptions":18,"../interact":21,"../utils":44,"./base":23}],28:[function(require,module,exports){ 'use strict'; // This module allows snapping of the size of targets during resize @@ -5139,7 +5141,7 @@ resize.defaults.snapSize = snapSize.defaults; module.exports = snapSize; -},{"../actions/resize":10,"../defaultOptions":18,"../utils/":43,"./base":23,"./snap":27}],29:[function(require,module,exports){ +},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./base":23,"./snap":27}],29:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -5227,7 +5229,7 @@ module.exports = function () { return PointerEvent; }(); -},{"../utils/pointerUtils":48}],30:[function(require,module,exports){ +},{"../utils/pointerUtils":49}],30:[function(require,module,exports){ 'use strict'; var PointerEvent = require('./PointerEvent'); @@ -5508,7 +5510,7 @@ Interaction.signals.on('new', function (interaction) { defaults.pointerEvents = pointerEvents.defaults; module.exports = pointerEvents; -},{"../Interaction":5,"../defaultOptions":18,"../utils":43,"../utils/Signals":34,"./PointerEvent":29}],31:[function(require,module,exports){ +},{"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/Signals":34,"./PointerEvent":29}],31:[function(require,module,exports){ 'use strict'; var pointerEvents = require('./base'); @@ -5655,7 +5657,7 @@ Interactable.prototype._backCompatOption = function (optionName, newValue) { Interactable.settingsMethods.push('pointerEvents'); -},{"../Interactable":4,"../scope":33,"../utils/arr":35,"../utils/extend":40,"../utils/is":45,"./base":30}],33:[function(require,module,exports){ +},{"../Interactable":4,"../scope":33,"../utils/arr":35,"../utils/extend":41,"../utils/is":46,"./base":30}],33:[function(require,module,exports){ 'use strict'; var utils = require('./utils'); @@ -5715,7 +5717,7 @@ var scope = { module.exports = scope; -},{"./utils":43,"./utils/Signals":34,"./utils/domObjects":37,"./utils/events":39,"./utils/window":51}],34:[function(require,module,exports){ +},{"./utils":44,"./utils/Signals":34,"./utils/domObjects":38,"./utils/events":40,"./utils/window":52}],34:[function(require,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -5858,7 +5860,24 @@ browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch & module.exports = browser; -},{"./domObjects":37,"./is":45,"./window":51}],37:[function(require,module,exports){ +},{"./domObjects":38,"./is":46,"./window":52}],37:[function(require,module,exports){ +'use strict'; + +var is = require('./is'); + +module.exports = function clone(source) { + var dest = {}; + for (var prop in source) { + if (is.plainObject(source[prop])) { + dest[prop] = clone(source[prop]); + } else { + dest[prop] = source[prop]; + } + } + return dest; +}; + +},{"./is":46}],38:[function(require,module,exports){ 'use strict'; var domObjects = {}; @@ -5880,7 +5899,7 @@ domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; module.exports = domObjects; -},{"./window":51}],38:[function(require,module,exports){ +},{"./window":52}],39:[function(require,module,exports){ 'use strict'; var win = require('./window'); @@ -6112,7 +6131,7 @@ var domUtils = { module.exports = domUtils; -},{"./browser":36,"./domObjects":37,"./is":45,"./window":51}],39:[function(require,module,exports){ +},{"./browser":36,"./domObjects":38,"./is":46,"./window":52}],40:[function(require,module,exports){ 'use strict'; var is = require('./is'); @@ -6402,7 +6421,7 @@ module.exports = { _targets: targets }; -},{"./arr":35,"./domUtils":38,"./is":45,"./pointerExtend":47,"./pointerUtils":48,"./window":51}],40:[function(require,module,exports){ +},{"./arr":35,"./domUtils":39,"./is":46,"./pointerExtend":48,"./pointerUtils":49,"./window":52}],41:[function(require,module,exports){ "use strict"; module.exports = function extend(dest, source) { @@ -6412,7 +6431,7 @@ module.exports = function extend(dest, source) { return dest; }; -},{}],41:[function(require,module,exports){ +},{}],42:[function(require,module,exports){ 'use strict'; var _require = require('./rect'), @@ -6429,14 +6448,14 @@ module.exports = function (target, element, action) { return rectToXY(originRect) || { x: 0, y: 0 }; }; -},{"./rect":50}],42:[function(require,module,exports){ +},{"./rect":51}],43:[function(require,module,exports){ "use strict"; module.exports = function (x, y) { return Math.sqrt(x * x + y * y); }; -},{}],43:[function(require,module,exports){ +},{}],44:[function(require,module,exports){ 'use strict'; var extend = require('./extend'); @@ -6496,7 +6515,7 @@ extend(utils, require('./rect')); module.exports = utils; -},{"./arr":35,"./domUtils":38,"./extend":40,"./getOriginXY":41,"./hypot":42,"./is":45,"./pointerUtils":48,"./rect":50,"./window":51}],44:[function(require,module,exports){ +},{"./arr":35,"./domUtils":39,"./extend":41,"./getOriginXY":42,"./hypot":43,"./is":46,"./pointerUtils":49,"./rect":51,"./window":52}],45:[function(require,module,exports){ 'use strict'; var scope = require('../scope'); @@ -6665,7 +6684,7 @@ var finder = { module.exports = finder; -},{"../scope":33,"./index":43}],45:[function(require,module,exports){ +},{"../scope":33,"./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; }; @@ -6714,6 +6733,10 @@ var is = { return (/object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element //DOM2 : thing.nodeType === 1 && typeof thing.nodeName === 'string' ); + }, + + plainObject: function plainObject(thing) { + return is.object(thing) && thing.constructor.name === 'Object'; } }; @@ -6723,14 +6746,14 @@ is.array = function (thing) { module.exports = is; -},{"./isWindow":46,"./window":51}],46:[function(require,module,exports){ +},{"./isWindow":47,"./window":52}],47:[function(require,module,exports){ "use strict"; module.exports = function (thing) { return !!(thing && thing.Window) && thing instanceof thing.Window; }; -},{}],47:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ 'use strict'; function pointerExtend(dest, source) { @@ -6759,7 +6782,7 @@ pointerExtend.prefixedPropREs = { module.exports = pointerExtend; -},{}],48:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ 'use strict'; var hypot = require('./hypot'); @@ -6982,7 +7005,7 @@ var pointerUtils = { module.exports = pointerUtils; -},{"./browser":36,"./domObjects":37,"./domUtils":38,"./hypot":42,"./is":45,"./pointerExtend":47}],49:[function(require,module,exports){ +},{"./browser":36,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(require,module,exports){ 'use strict'; var _require = require('./window'), @@ -7022,7 +7045,7 @@ module.exports = { cancel: cancel }; -},{"./window":51}],50:[function(require,module,exports){ +},{"./window":52}],51:[function(require,module,exports){ 'use strict'; var extend = require('./extend'); @@ -7100,7 +7123,7 @@ var rectUtils = { module.exports = rectUtils; -},{"./domUtils":38,"./extend":40,"./is":45}],51:[function(require,module,exports){ +},{"./domUtils":39,"./extend":41,"./is":46}],52:[function(require,module,exports){ 'use strict'; var win = module.exports; @@ -7142,7 +7165,7 @@ win.getWindow = function getWindow(node) { win.init = init; -},{"./isWindow":46}]},{},[1])(1) +},{"./isWindow":47}]},{},[1])(1) }); diff --git a/dist/interact.js.map b/dist/interact.js.map index 7cb885bf5..b6dfe0fe3 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","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/hold.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/modifiers/base.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.2\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Released 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 /** */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\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 matchesSelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\nclass Interactable {\n /** */\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 * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\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 * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {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 * 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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {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 * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\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 * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (const type of eventType) {\n this[method](type, listener, options);\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 * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\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, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\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, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {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 * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {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(scope.interactables.indexOf(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() && !interaction._ending) {\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.forEachMatch = function (element, callback) {\n for (const interactable of this) {\n let ret;\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(element) && matchesSelector(element, interactable.target))\n // target is the element\n : element === interactable.target)\n // the element is in context\n && (interactable.inContext(element))) {\n ret = callback(interactable);\n }\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 domObjects = require('./utils/domObjects');\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 /** */\n constructor ({ pointerType }) {\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 this._ending = false;\n\n this.pointerType = pointerType;\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 * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\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 (scope.interactions.indexOf(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 * ```js\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 *\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 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 * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */\n end (event) {\n this._ending = true;\n\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 this._ending = false;\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\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 // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return this.pointerIds.indexOf(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 index = this.getPointerIndex(pointer);\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 (const method of methodNames) {\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(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 (const changedTouch of event.changedTouches) {\n const pointer = changedTouch;\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\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].pointerType !== '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 interaction = new Interaction({ 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 (const interaction of scope.interactions) {\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.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 interaction._interacting = true;\n firePrepared(interaction, event, 'start');\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');\n/** @lends Interactable */\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 * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\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');\n/** @lends module:interact */\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\n/** @lends Interactable */\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.activeDrops, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction.activeDrops, 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 = {\n dropzones: null,\n elements: null,\n rects: null,\n };\n\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (activeDrops, element) {\n const drops = [];\n const elements = [];\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 (const currentElement of dropElements) {\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 (activeDrops, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n const current = activeDrops.dropzones[i];\n const currentElement = 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 (activeDrops, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(activeDrops, dragElement);\n\n activeDrops.dropzones = possibleDrops.dropzones;\n activeDrops.elements = possibleDrops.elements;\n activeDrops.rects = [];\n\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n activeDrops.rects[i] = activeDrops.dropzones[i].getRect(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.activeDrops, 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 const {\n activeDrops,\n prevDropTarget,\n dropTarget,\n dropElement,\n } = interaction;\n\n if (dropEvents.leave) { prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(activeDrops, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = dropTarget;\n interaction.prevDropElement = dropElement;\n}\n\n/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} 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 * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\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');\n/** @lends Interactable */\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.isIe9 ? {\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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\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","/** @lends Interactable */\nconst Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nconst { warnOnce } = require('../utils');\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 * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\nInteractable.prototype.ignoreFrom = warnOnce(function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n}, 'Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n\n/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\nInteractable.prototype.allowFrom = warnOnce(function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n}, 'Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\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 * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\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 * 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 * @param {boolean} [newValue]\n * @return {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 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 && /mouse|pointer/.test(interaction.pointerType)\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\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\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 // 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 },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n validateAction,\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.pointerType !== '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\n function pushMatches (interactable) {\n matches.push(interactable);\n matchElements.push(element);\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n scope.interactables.forEachMatch(element, pushMatches);\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 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\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 (const interaction of scope.interactions) {\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 * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] 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 interact;\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 scope = require('../scope');\nconst is = require('../utils/is');\n\nconst { 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 targetOptions = interaction.target.options.drag;\n const startAxis = targetOptions.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.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 let element = eventTarget;\n\n const getDraggable = function (interactable) {\n if (interactable === interaction.target) { return; }\n\n const options = interaction.target.options.drag;\n\n if (!options.manualStart\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, 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 // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n if (interactable) {\n interaction.prepared.name = 'drag';\n interaction.target = interactable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\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","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nautoStart.defaults.perAction.hold = 0;\nautoStart.defaults.perAction.delay = 0;\n\nInteraction.signals.on('new', function (interaction) {\n interaction.autoStartHoldTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, hold);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.prepared.name = null;\n }\n});\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name;\n\n if (!actionName) { return null; }\n\n const options = interaction.target.options;\n\n return options[actionName].hold || options[actionName].delay;\n}\n\nmodule.exports = {\n getHoldDuration,\n};\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 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// 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// autoStart hold\nrequire('./autoStart/hold');\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/base');\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\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: 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","/** @module interact */\n\nconst 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 * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\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 * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = function (type, listener, options) {\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, options);\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, { options });\n }\n\n return interact;\n};\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = function (type, listener, options) {\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, options);\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, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * 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 * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {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 * 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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return interact;\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');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {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 touch{start,move} events if the browser supports passive\n // events listeners. CSS touch-action and user-selecct should be used instead\n if (events.supportsPassive\n && /^touch(start|move)$/.test(event.type)\n && !browser.isIOS) {\n return;\n }\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 (is.element(event.target)\n && 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 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 (const modifierName of modifiers.names) {\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 result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n arg.modifiedCoords = extend({}, arg.pageCoords);\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 arg.modifiedCoords.x += arg.status.dx;\n arg.modifiedCoords.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 beforeMove: 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\n end: function ({ interaction, event }) {\n for (const modifierName of modifiers.names) {\n const options = interaction.target.options[interaction.prepared.name][modifierName];\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\n setXY: 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};\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);\nInteraction.signals.on('before-action-move', modifiers.beforeMove);\nInteraction.signals.on('action-end', modifiers.end);\n\nInteractEvent.signals.on('set-xy', modifiers.setXY);\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('./base');\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 ({ modifiedCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, modifiedCoords);\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 if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\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('./base');\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 ({ modifiedCoords, 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({}, modifiedCoords);\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 getRestrictionRect,\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('./base');\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 inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n 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('./base');\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 optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || 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 {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { 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, modifiedCoords, 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({}, modifiedCoords);\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('./base');\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, modifiedCoords } = arg;\n const page = utils.extend({}, modifiedCoords);\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 /** */\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);\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 /** */\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n /** */\n stopPropagation () {\n this.propagationStopped = true;\n }\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 defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\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 = signalArg.targets.filter(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 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 (const target of signalArg.targets) {\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,\n eventTarget,\n pointer,\n event,\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\nfor (const signalName of ['up', 'cancel']) {\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 is = require('../utils/is');\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 scope.interactables.forEachMatch(element, interactable => {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n });\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 { getWindow } = require('./utils/window');\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 || 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 = scope.documents.indexOf(doc);\n\n win = win || 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","class 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 = this.listeners[name].indexOf(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 (const listener of targetListeners) {\n if (listener(arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function contains (array, target) {\n return array.indexOf(target) !== -1;\n}\n\nfunction merge (target, source) {\n for (const item of source) {\n target.push(item);\n }\n\n return target;\n}\n\nmodule.exports = {\n contains,\n merge,\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 isIOS: (/iP(hone|od|ad)/.test(navigator.platform)),\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 isIe9: /MSIE 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 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\n// Opera Mobile must be handled differently\nbrowser.isOperaMobile = (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto'));\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 matchesSelector: function (element, selector) {\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 pointerUtils = require('./pointerUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window } = require('./window');\nconst { contains } = require('./arr');\n\nconst elements = [];\nconst targets = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\nconst documents = [];\n\nconst supportsOptions = (() => {\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 = elements.indexOf(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\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n element.addEventListener(type, listener, supportsOptions? options : !!options.capture);\n target.events[type].push(listener);\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = elements.indexOf(element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\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.removeEventListener(`on${type}`, listener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\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 }\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 (const doc of documents) {\n add(doc, type, delegateListener);\n add(doc, 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] = (pointerUtils.getEventTargets(event));\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 preventOriginalDefault () {\n this.originalEvent.preventDefault();\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 supportsOptions,\n\n _elements: elements,\n _targets: targets,\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 {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\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 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'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, 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 ({ pointerType, 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.pointerType === pointerType)) {\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 or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\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 mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.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 with a matching pointerType\n idle: function ({ pointerType }) {\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() && (pointerType === interaction.pointerType)) {\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 domObjects = require('./domObjects');\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) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n const path = is.function(event.composedPath) ? event.composedPath() : event.path;\n\n return [\n domUtils.getActualElement(path ? 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');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\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\nmodule.exports = rectUtils;\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 +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/hold.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/modifiers/base.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/clone.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.3\n *\n * Copyright (c) 2012-2018 Taye Adeyemi \n * Released 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 /** */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\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 clone = require('./utils/clone');\nconst 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 matchesSelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\nclass Interactable {\n /** */\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 and merge\n this.options[action][option] = clone(this.options[action][option] || {});\n 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 * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\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 * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {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 * 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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {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 * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\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 * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (const type of eventType) {\n this[method](type, listener, options);\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 * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\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, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\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, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = clone(defaults.base);\n\n const perActions = clone(defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = clone(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 * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {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(scope.interactables.indexOf(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() && !interaction._ending) {\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.forEachMatch = function (element, callback) {\n for (const interactable of this) {\n let ret;\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(element) && matchesSelector(element, interactable.target))\n // target is the element\n : element === interactable.target)\n // the element is in context\n && (interactable.inContext(element))) {\n ret = callback(interactable);\n }\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 domObjects = require('./utils/domObjects');\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 /** */\n constructor ({ pointerType }) {\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 this._ending = false;\n\n this.pointerType = pointerType;\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 * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\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 (scope.interactions.indexOf(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 * ```js\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 *\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 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 * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */\n end (event) {\n this._ending = true;\n\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 this._ending = false;\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\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 // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return this.pointerIds.indexOf(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 index = this.getPointerIndex(pointer);\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 (const method of methodNames) {\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(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 (const changedTouch of event.changedTouches) {\n const pointer = changedTouch;\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\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].pointerType !== '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 interaction = new Interaction({ 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 (const interaction of scope.interactions) {\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.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 interaction._interacting = true;\n firePrepared(interaction, event, 'start');\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');\n/** @lends Interactable */\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 * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\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');\n/** @lends module:interact */\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\n/** @lends Interactable */\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.activeDrops, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction.activeDrops, 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 = {\n dropzones: null,\n elements: null,\n rects: null,\n };\n\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (activeDrops, element) {\n const drops = [];\n const elements = [];\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 (const currentElement of dropElements) {\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 (activeDrops, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n const current = activeDrops.dropzones[i];\n const currentElement = 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 (activeDrops, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(activeDrops, dragElement);\n\n activeDrops.dropzones = possibleDrops.dropzones;\n activeDrops.elements = possibleDrops.elements;\n activeDrops.rects = [];\n\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n activeDrops.rects[i] = activeDrops.dropzones[i].getRect(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.activeDrops, 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 const {\n activeDrops,\n prevDropTarget,\n dropTarget,\n dropElement,\n } = interaction;\n\n if (dropEvents.leave) { prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(activeDrops, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = dropTarget;\n interaction.prevDropElement = dropElement;\n}\n\n/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} 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 * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\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');\n/** @lends Interactable */\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.isIe9 ? {\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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\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","/** @lends Interactable */\nconst Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nconst { warnOnce } = require('../utils');\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 * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\nInteractable.prototype.ignoreFrom = warnOnce(function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n}, 'Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n\n/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\nInteractable.prototype.allowFrom = warnOnce(function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n}, 'Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\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 * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\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 * 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 * @param {boolean} [newValue]\n * @return {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 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 && /mouse|pointer/.test(interaction.pointerType)\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\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\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 // 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 },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n validateAction,\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.pointerType !== '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\n function pushMatches (interactable) {\n matches.push(interactable);\n matchElements.push(element);\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n scope.interactables.forEachMatch(element, pushMatches);\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 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\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 (const interaction of scope.interactions) {\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 * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] 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 interact;\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 scope = require('../scope');\nconst is = require('../utils/is');\n\nconst { 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 targetOptions = interaction.target.options.drag;\n const startAxis = targetOptions.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.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 let element = eventTarget;\n\n const getDraggable = function (interactable) {\n if (interactable === interaction.target) { return; }\n\n const options = interaction.target.options.drag;\n\n if (!options.manualStart\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, 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 // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n if (interactable) {\n interaction.prepared.name = 'drag';\n interaction.target = interactable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\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","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nautoStart.defaults.perAction.hold = 0;\nautoStart.defaults.perAction.delay = 0;\n\nInteraction.signals.on('new', function (interaction) {\n interaction.autoStartHoldTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, hold);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.prepared.name = null;\n }\n});\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name;\n\n if (!actionName) { return null; }\n\n const options = interaction.target.options;\n\n return options[actionName].hold || options[actionName].delay;\n}\n\nmodule.exports = {\n getHoldDuration,\n};\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 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// 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// autoStart hold\nrequire('./autoStart/hold');\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/base');\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\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: 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","/** @module interact */\n\nconst 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 * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\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 * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = function (type, listener, options) {\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, options);\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, { options });\n }\n\n return interact;\n};\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = function (type, listener, options) {\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, options);\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, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * 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 * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {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 * 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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return interact;\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');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {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 touch{start,move} events if the browser supports passive\n // events listeners. CSS touch-action and user-selecct should be used instead\n if (events.supportsPassive\n && /^touch(start|move)$/.test(event.type)\n && !browser.isIOS) {\n return;\n }\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 (is.element(event.target)\n && 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 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 (const modifierName of modifiers.names) {\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 result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n arg.modifiedCoords = extend({}, arg.pageCoords);\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 arg.modifiedCoords.x += arg.status.dx;\n arg.modifiedCoords.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 beforeMove: 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\n end: function ({ interaction, event }) {\n for (const modifierName of modifiers.names) {\n const options = interaction.target.options[interaction.prepared.name][modifierName];\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\n setXY: 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};\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);\nInteraction.signals.on('before-action-move', modifiers.beforeMove);\nInteraction.signals.on('action-end', modifiers.end);\n\nInteractEvent.signals.on('set-xy', modifiers.setXY);\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('./base');\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 ({ modifiedCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, modifiedCoords);\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 if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\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('./base');\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 ({ modifiedCoords, 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({}, modifiedCoords);\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 getRestrictionRect,\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('./base');\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 inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n 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('./base');\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 optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || 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 {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { 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, modifiedCoords, 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({}, modifiedCoords);\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('./base');\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, modifiedCoords } = arg;\n const page = utils.extend({}, modifiedCoords);\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 /** */\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);\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 /** */\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n /** */\n stopPropagation () {\n this.propagationStopped = true;\n }\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 defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\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 = signalArg.targets.filter(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 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 (const target of signalArg.targets) {\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,\n eventTarget,\n pointer,\n event,\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\nfor (const signalName of ['up', 'cancel']) {\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 is = require('../utils/is');\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 scope.interactables.forEachMatch(element, interactable => {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n });\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 { getWindow } = require('./utils/window');\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 || 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 = scope.documents.indexOf(doc);\n\n win = win || 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","class 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 = this.listeners[name].indexOf(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 (const listener of targetListeners) {\n if (listener(arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function contains (array, target) {\n return array.indexOf(target) !== -1;\n}\n\nfunction merge (target, source) {\n for (const item of source) {\n target.push(item);\n }\n\n return target;\n}\n\nmodule.exports = {\n contains,\n merge,\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 isIOS: (/iP(hone|od|ad)/.test(navigator.platform)),\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 isIe9: /MSIE 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 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\n// Opera Mobile must be handled differently\nbrowser.isOperaMobile = (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto'));\n\nmodule.exports = browser;\n","const is = require('./is');\n\nmodule.exports = function clone (source) {\n const dest = {};\n for (const prop in source) {\n if (is.plainObject(source[prop])) {\n dest[prop] = clone(source[prop]);\n } else {\n dest[prop] = source[prop];\n }\n }\n return dest;\n};\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 matchesSelector: function (element, selector) {\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 pointerUtils = require('./pointerUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window } = require('./window');\nconst { contains } = require('./arr');\n\nconst elements = [];\nconst targets = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\nconst documents = [];\n\nconst supportsOptions = (() => {\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 = elements.indexOf(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\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n element.addEventListener(type, listener, supportsOptions? options : !!options.capture);\n target.events[type].push(listener);\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = elements.indexOf(element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\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.removeEventListener(`on${type}`, listener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\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 }\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 (const doc of documents) {\n add(doc, type, delegateListener);\n add(doc, 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] = (pointerUtils.getEventTargets(event));\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 preventOriginalDefault () {\n this.originalEvent.preventDefault();\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 supportsOptions,\n\n _elements: elements,\n _targets: targets,\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 {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\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 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'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, 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 ({ pointerType, 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.pointerType === pointerType)) {\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 or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\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 mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.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 with a matching pointerType\n idle: function ({ pointerType }) {\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() && (pointerType === interaction.pointerType)) {\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 plainObject: thing => is.object(thing) && thing.constructor.name === 'Object',\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 domObjects = require('./domObjects');\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) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n const path = is.function(event.composedPath) ? event.composedPath() : event.path;\n\n return [\n domUtils.getActualElement(path ? 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');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\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\nmodule.exports = rectUtils;\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 6fa2a0f19..74845ed69 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.2 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.interact=t()}}(function(){return function t(e,n,r){function i(s,a){if(!n[s]){if(!e[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var p=n[s]={exports:{}};e[s][0].call(p.exports,function(t){var n=e[s][1][t];return i(n||t)},p,p.exports,t,e,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,t);var f=e.target,v=(f&&f.options||s).deltaSource,g=o(f,p,c),h="start"===l,m="end"===l,y=h?e.startCoords:e.curCoords,x=e.prevEvent;p=p||e.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=c+(l||""),this.interaction=e,this.interactable=f,this.t0=h?e.downTimes[e.downTimes.length-1]:x.t0;var E={interaction:e,event:n,action:c,phase:l,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=e.startCoords.page.x-g.x,this.y0=e.startCoords.page.y-g.y,this.clientX0=e.startCoords.client.x-g.x,this.clientY0=e.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=e.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=e.pointerDelta[v].speed,this.velocityX=e.pointerDelta[v].vx,this.velocityY=e.pointerDelta[v].vy,this.swipe=m||"inertiastart"===l?this.getSwipe():null,a.fire("new",E)}return t.prototype.getSwipe=function(){var t=this.interaction;if(t.prevEvent.speed<600||this.timeStamp-t.prevEvent.timeStamp>150)return null;var e=180*Math.atan2(t.prevEvent.velocityY,t.prevEvent.velocityX)/Math.PI;e<0&&(e+=360);var n=112.5<=e&&e<247.5,r=202.5<=e&&e<337.5,i=!n&&(292.5<=e||e<67.5);return{up:r,down:!r&&22.5<=e&&e<157.5,left:n,right:i,angle:e,speed:t.prevEvent.speed,velocity:{x:t.prevEvent.velocityX,y:t.prevEvent.velocityY}}},t.prototype.preventDefault=function(){},t.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},t.prototype.stopPropagation=function(){this.propagationStopped=!0},t}();a.on("set-delta",function(t){var e=t.iEvent,n=t.interaction,r=t.starting,i=t.deltaSource,o=r?e:n.prevEvent;"client"===i?(e.dx=e.clientX-o.clientX,e.dy=e.clientY-o.clientY):(e.dx=e.pageX-o.pageX,e.dy=e.pageY-o.pageY)}),c.signals=a,e.exports=c},{"./defaultOptions":18,"./utils/Signals":34,"./utils/extend":40,"./utils/getOriginXY":41}],4:[function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=t("./utils/is"),o=t("./utils/events"),s=t("./utils/extend"),a=t("./actions/base"),c=t("./scope"),l=t("./Eventable"),p=t("./defaultOptions"),u=t("./utils/Signals").new(),d=t("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=d.matchesSelector,m=t("./utils/window"),y=m.getWindow,x=t("./utils/arr"),b=x.contains,w=t("./utils/browser"),E=w.wheelEvent;c.interactables=[];var T=function(){function t(e,n){r(this,t),n=n||{},this.target=e,this.events=new l,this._context=n.context||c.document,this._win=y(g(e)?this._context:e),this._doc=this._win.document,u.fire("new",{target:e,options:n,interactable:this,win:this._win}),c.addDocument(this._doc,this._win),c.interactables.push(this),this.set(n)}return t.prototype.setOnEvents=function(t,e){var n="on"+t;return i.function(e.onstart)&&(this.events[n+"start"]=e.onstart),i.function(e.onmove)&&(this.events[n+"move"]=e.onmove),i.function(e.onend)&&(this.events[n+"end"]=e.onend),i.function(e.oninertiastart)&&(this.events[n+"inertiastart"]=e.oninertiastart),this},t.prototype.setPerAction=function(t,e){for(var n in e)n in p[t]&&(i.object(e[n])?(this.options[t][n]=s(this.options[t][n]||{},e[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[t][n].enabled=!1!==e[n].enabled)):i.bool(e[n])&&i.object(p.perAction[n])?this.options[t][n].enabled=e[n]:void 0!==e[n]&&(this.options[t][n]=e[n]))},t.prototype.getRect=function(t){return t=t||this.target,i.string(this.target)&&!i.element(t)&&(t=this._context.querySelector(this.target)),f(t)},t.prototype.rectChecker=function(t){return i.function(t)?(this.getRect=t,this):null===t?(delete this.options.getRect,this):this.getRect},t.prototype._backCompatOption=function(t,e){if(g(e)||i.object(e)){this.options[t]=e;for(var n=0;nt.pointerMoveTolerance);var a={pointer:e,pointerIndex:this.getPointerIndex(e),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||c.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&c.copyCoords(this.prevCoords,this.curCoords))},t.prototype.doMove=function(t){t=c.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},t||{}),f.fire("before-action-move",t),this._dontFireMove||f.fire("action-move",t),this._dontFireMove=!1},t.prototype.pointerUp=function(t,e,n,r){var i=this.getPointerIndex(t);f.fire(/cancel$/i.test(e.type)?"cancel":"up",{pointer:t,pointerIndex:i,event:e,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(e),this.pointerIsDown=!1,this.removePointer(t,e)},t.prototype.end=function(t){this._ending=!0,t=t||this.prevEvent,this.interacting()&&f.fire("action-end",{event:t,interaction:this}),this.stop(),this._ending=!1},t.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},t.prototype.interacting=function(){return this._interacting},t.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},t.prototype.getPointerIndex=function(t){return"mouse"===this.pointerType||"pen"===this.pointerType?0:this.pointerIds.indexOf(c.getPointerId(t))},t.prototype.updatePointer=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e&&/(down|start)$/i.test(e.type),r=c.getPointerId(t),i=this.getPointerIndex(t);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:t,event:e,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=t,i},t.prototype.removePointer=function(t,e){var n=this.getPointerIndex(t);-1!==n&&(f.fire("remove-pointer",{pointer:t,event:e,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},t.prototype._updateEventTargets=function(t,e){this._eventTarget=t,this._curEventTarget=e},t}(),y=0;yo.left&&l.xo.top&&l.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(t,e,s,this,i,n,r)),s},v.signals.on("unset",function(t){t.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(t){t.dropTarget=null,t.dropElement=null,t.prevDropTarget=null,t.prevDropElement=null,t.dropEvents=null,t.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(t){var e=t.interaction;e.dropTarget=e.dropElement=e.prevDropTarget=e.prevDropElement=null}),d.dynamicDrop=function(t){return p.is.bool(t)?(y=t,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),l.methodDict.drop="dropzone",h.drop=m.defaults,e.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":43,"./base":6}],9:[function(t,e,n){"use strict";var r=t("./base"),i=t("../utils"),o=t("../InteractEvent"),s=t("../Interactable"),a=t("../Interaction"),c=t("../defaultOptions"),l={defaults:{enabled:!1,origin:null,restrict:null},checker:function(t,e,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;"gesturestart"===e.type&&(e.ds=0,n.gesture.startDistance=n.gesture.prevDistance=e.distance,n.gesture.startAngle=n.gesture.prevAngle=e.angle,n.gesture.scale=1)}),o.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;"gesturemove"===e.type&&(e.ds=e.scale-n.gesture.scale,n.target.fire(e),n.gesture.prevAngle=e.angle,n.gesture.prevDistance=e.distance,e.scale===1/0||null===e.scale||void 0===e.scale||isNaN(e.scale)||(n.gesture.scale=e.scale))}),s.prototype.gesturable=function(t){return i.is.object(t)?(this.options.gesture.enabled=!1!==t.enabled,this.setPerAction("gesture",t),this.setOnEvents("gesture",t),this):i.is.bool(t)?(this.options.gesture.enabled=t,t||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(t){var e=t.interaction,n=t.iEvent,r=t.action,s=t.event,a=t.starting,c=t.ending,l=t.deltaSource;if("gesture"===r){var p=e.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,l),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,l),n.da=0):c||s instanceof o?(n.distance=e.prevEvent.distance,n.box=e.prevEvent.box,n.scale=e.prevEvent.scale,n.ds=n.scale-1,n.angle=e.prevEvent.angle,n.da=n.angle-e.gesture.startAngle):(n.distance=i.touchDistance(p,l),n.box=i.touchBBox(p),n.scale=n.distance/e.gesture.startDistance,n.angle=i.touchAngle(p,e.gesture.prevAngle,l),n.ds=n.scale-e.gesture.prevScale,n.da=n.angle-e.gesture.prevAngle)}}),a.signals.on("new",function(t){t.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=l,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",c.gesture=l.defaults,e.exports=l},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":43,"./base":6}],10:[function(t,e,n){"use strict";function r(t,e,n,r,i,s,a){if(!e)return!1;if(!0===e){var c=o.is.number(s.width)?s.width:s.right-s.left,l=o.is.number(s.height)?s.height:s.bottom-s.top;if(c<0&&("left"===t?t="right":"right"===t&&(t="left")),l<0&&("top"===t?t="bottom":"bottom"===t&&(t="top")),"left"===t)return n.x<(c>=0?s.left:s.right)+a;if("top"===t)return n.y<(l>=0?s.top:s.bottom)+a;if("right"===t)return n.x>(c>=0?s.right:s.left)-a;if("bottom"===t)return n.y>(l>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(e)?e===r:o.matchesUpTo(r,e,i))}var i=t("./base"),o=t("../utils"),s=t("../utils/browser"),a=t("../InteractEvent"),c=t("../Interactable"),l=t("../Interaction"),p=t("../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(t,e,n,i,s,a){if(!a)return null;var c=o.extend({},s.curCoords.page),l=n.options;if(l.resize.enabled){var p=l.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],c,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"!==l.resize.axis&&c.x>a.right-u,g="x"!==l.resize.axis&&c.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9?{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(t){if(t.axis)return d.cursors[t.name+t.axis];if(t.edges){for(var e="",n=["top","bottom","left","right"],r=0;r<4;r++)t.edges[n[r]]&&(e+=n[r]);return d.cursors[e]}}};a.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;if("resizestart"===e.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}},e.rect=n.resizeRects.inverted,e.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(t){var e=t.iEvent,n=t.phase,r=t.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,c=r.prepared.edges,l=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=c,g=e.dx,h=e.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;c=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(c.top&&(p.top+=h),c.bottom&&(p.bottom+=h),c.left&&(p.left+=g),c.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,l.bottom),u.bottom=Math.max(p.bottom,l.top),u.left=Math.min(p.left,l.right),u.right=Math.max(p.right,l.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];e.edges=r.prepared.edges,e.rect=u,e.deltaRect=d}}),c.prototype.resizable=function(t){return o.is.object(t)?(this.options.resize.enabled=!1!==t.enabled,this.setPerAction("resize",t),this.setOnEvents("resize",t),/^x$|^y$|^xy$/.test(t.axis)?this.options.resize.axis=t.axis:null===t.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(t.preserveAspectRatio)?this.options.resize.preserveAspectRatio=t.preserveAspectRatio:o.is.bool(t.square)&&(this.options.resize.square=t.square),this):o.is.bool(t)?(this.options.resize.enabled=t,t||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},l.signals.on("new",function(t){t.resizeAxes="xy"}),a.signals.on("set-delta",function(t){var e=t.interaction,n=t.iEvent;"resize"===t.action&&e.resizeAxes&&(e.target.options.resize.square?("y"===e.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=e.resizeAxes,"x"===e.resizeAxes?n.dy=0:"y"===e.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"), -o.merge(c.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,e.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":43,"../utils/browser":36,"./base":6}],11:[function(t,e,n){"use strict";var r=t("./utils/raf"),i=t("./utils/window").getWindow,o=t("./utils/is"),s=t("./utils/domUtils"),a=t("./Interaction"),c=t("./defaultOptions"),l={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(t){l.isScrolling=!0,r.cancel(l.i),l.interaction=t,l.prevTime=(new Date).getTime(),l.i=r.request(l.scroll)},stop:function(){l.isScrolling=!1,r.cancel(l.i)},scroll:function(){var t=l.interaction.target.options[l.interaction.prepared.name].autoScroll,e=t.container||i(l.interaction.element),n=(new Date).getTime(),s=(n-l.prevTime)/1e3,a=t.speed*s;a>=1&&(o.window(e)?e.scrollBy(l.x*a,l.y*a):e&&(e.scrollLeft+=l.x*a,e.scrollTop+=l.y*a),l.prevTime=n),l.isScrolling&&(r.cancel(l.i),l.i=r.request(l.scroll))},check:function(t,e){var n=t.options;return n[e].autoScroll&&n[e].autoScroll.enabled},onInteractionMove:function(t){var e=t.interaction,n=t.pointer;if(e.interacting()&&l.check(e.target,e.prepared.name)){if(e.simulation)return void(l.x=l.y=0);var r=void 0,a=void 0,c=void 0,p=void 0,u=e.target.options[e.prepared.name].autoScroll,d=u.container||i(e.element);if(o.window(d))p=n.clientXd.innerWidth-l.margin,c=n.clientY>d.innerHeight-l.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-l.margin,c=n.clientY>f.bottom-l.margin}l.x=a?1:p?-1:0,l.y=c?1:r?-1:0,l.isScrolling||(l.margin=u.margin,l.speed=u.speed,l.start(e))}}};a.signals.on("stop-active",function(){l.stop()}),a.signals.on("action-move",l.onInteractionMove),c.perAction.autoScroll=l.defaults,e.exports=l},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":38,"./utils/is":45,"./utils/raf":49,"./utils/window":51}],12:[function(t,e,n){"use strict";var r=t("../Interactable"),i=t("../actions/base"),o=t("../utils/is"),s=t("../utils/domUtils"),a=t("../utils"),c=a.warnOnce;r.prototype.getAction=function(t,e,n,r){var i=this.defaultActionChecker(t,e,n,r);return this.options.actionChecker?this.options.actionChecker(t,e,i,this,r,n):i},r.prototype.ignoreFrom=c(function(t){return this._backCompatOption("ignoreFrom",t)},"Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue})."),r.prototype.allowFrom=c(function(t){return this._backCompatOption("allowFrom",t)},"Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue})."),r.prototype.testIgnore=function(t,e,n){return!(!t||!o.element(n))&&(o.string(t)?s.matchesUpTo(n,t,e):!!o.element(t)&&s.nodeContains(t,n))},r.prototype.testAllow=function(t,e,n){return!t||!!o.element(n)&&(o.string(t)?s.matchesUpTo(n,t,e):!!o.element(t)&&s.nodeContains(t,n))},r.prototype.testIgnoreAllow=function(t,e,n){return!this.testIgnore(t.ignoreFrom,e,n)&&this.testAllow(t.allowFrom,e,n)},r.prototype.actionChecker=function(t){return o.function(t)?(this.options.actionChecker=t,this):null===t?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(t){return o.bool(t)?(this.options.styleCursor=t,this):null===t?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(t,e,n,r){for(var o=this.getRect(r),s=e.buttons||{0:1,1:4,3:8,4:16}[e.button],a=null,c=0;c=h.maxInteractions)return!1;if(u.target===t){if((a+=d===n.name|0)>=i)return!1;if(u.element===e&&(c++,d!==n.name||c>=o))return!1}}}return h.maxInteractions>0}}var c=t("../interact"),l=t("../Interactable"),p=t("../Interaction"),u=t("../actions/base"),d=t("../defaultOptions"),f=t("../scope"),v=t("../utils"),g=t("../utils/Signals").new();t("./InteractableMethods");var h={signals:g,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null,mouseButtons:1}},setActionDefaults:function(t){v.extend(t.defaults,h.defaults.perAction)},validateAction:r};p.signals.on("down",function(t){var e=t.interaction,n=t.pointer,r=t.event,i=t.eventTarget;if(!e.interacting()){s(e,o(e,n,r,i))}}),p.signals.on("move",function(t){var e=t.interaction,n=t.pointer,r=t.event,i=t.eventTarget;if("mouse"===e.pointerType&&!e.pointerIsDown&&!e.interacting()){s(e,o(e,n,r,i))}}),p.signals.on("move",function(t){var e=t.interaction,n=t.event;if(e.pointerIsDown&&!e.interacting()&&e.pointerWasMoved&&e.prepared.name){g.fire("before-start",t);var r=e.target;e.prepared.name&&r&&(r.options[e.prepared.name].manualStart||!a(r,e.element,e.prepared)?e.stop(n):e.start(e.prepared,r,e.element))}}),p.signals.on("stop",function(t){var e=t.interaction,n=e.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.maxInteractions=function(t){return v.is.number(t)?(h.maxInteractions=t,c):h.maxInteractions},l.settingsMethods.push("styleCursor"),l.settingsMethods.push("actionChecker"),l.settingsMethods.push("ignoreFrom"),l.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,v.extend(d.perAction,h.defaults.perAction),e.exports=h},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":43,"../utils/Signals":34,"./InteractableMethods":12}],14:[function(t,e,n){"use strict";function r(t,e){if(!e)return!1;var n=e.options.drag.startAxis;return"xy"===t||"xy"===n||n===t}var i=t("./base"),o=t("../scope"),s=t("../utils/is"),a=t("../utils/domUtils"),c=a.parentNode;i.setActionDefaults(t("../actions/drag")),i.signals.on("before-start",function(t){var e=t.interaction,n=t.eventTarget,a=t.dx,l=t.dy;if("drag"===e.prepared.name){var p=Math.abs(a),u=Math.abs(l),d=e.target.options.drag,f=d.startAxis,v=p>u?"x":p0&&(e.autoStartHoldTimer=setTimeout(function(){e.start(e.prepared,e.target,e.element)},n))}),o.signals.on("move",function(t){var e=t.interaction,n=t.duplicate;e.pointerWasMoved&&!n&&clearTimeout(e.autoStartHoldTimer)}),i.signals.on("before-start",function(t){var e=t.interaction;r(e)>0&&(e.prepared.name=null)}),e.exports={getHoldDuration:r}},{"../Interaction":5,"./base":13}],17:[function(t,e,n){"use strict";t("./base").setActionDefaults(t("../actions/resize"))},{"../actions/resize":10,"./base":13}],18:[function(t,e,n){"use strict";e.exports={base:{accept:null,preventDefault:"auto",deltaSource:"page"},perAction:{origin:{x:0,y:0},inertia:{enabled:!1,resistance:10,minSpeed:100,endSpeed:10,allowResume:!0,smoothEndDuration:300}}}},{}],19:[function(t,e,n){"use strict";t("./inertia"),t("./modifiers/snap"),t("./modifiers/restrict"),t("./pointerEvents/base"),t("./pointerEvents/holdRepeat"),t("./pointerEvents/interactableTargets"),t("./autoStart/hold"),t("./actions/gesture"),t("./actions/resize"),t("./actions/drag"),t("./actions/drop"),t("./modifiers/snapSize"),t("./modifiers/restrictEdges"),t("./modifiers/restrictSize"),t("./autoStart/gesture"),t("./autoStart/resize"),t("./autoStart/drag"),t("./interactablePreventDefault.js"),t("./autoScroll"),e.exports=t("./interact")},{"./actions/drag":7,"./actions/drop":8,"./actions/gesture":9,"./actions/resize":10,"./autoScroll":11,"./autoStart/drag":14,"./autoStart/gesture":15,"./autoStart/hold":16,"./autoStart/resize":17,"./inertia":20,"./interact":21,"./interactablePreventDefault.js":22,"./modifiers/restrict":24,"./modifiers/restrictEdges":25,"./modifiers/restrictSize":26,"./modifiers/snap":27,"./modifiers/snapSize":28,"./pointerEvents/base":30,"./pointerEvents/holdRepeat":31,"./pointerEvents/interactableTargets":32}],20:[function(t,e,n){"use strict";function r(t,e){var n=t.target.options[t.prepared.name].inertia,r=n.resistance,i=-Math.log(n.endSpeed/e.v0)/r;e.x0=t.prevEvent.pageX,e.y0=t.prevEvent.pageY,e.t0=e.startEvent.timeStamp/1e3,e.sx=e.sy=0,e.modifiedXe=e.xe=(e.vx0-i)/r,e.modifiedYe=e.ye=(e.vy0-i)/r,e.te=i,e.lambda_v0=r/e.v0,e.one_ve_v0=1-n.endSpeed/e.v0}function i(){s(this),p.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords);var t=this.inertiaStatus,e=this.target.options[this.prepared.name].inertia,n=e.resistance,r=(new Date).getTime()/1e3-t.t0;if(rc.minSpeed&&g>c.endSpeed,b={interaction:e,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(l.resetStatuses(f),m=l.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,e.curCoords),e.pointers[0]=i.startEvent=new a(e,n,e.prepared.name,"inertiastart",e.element),i.t0=d,i.active=!0,i.allowResume=c.allowResume,e.simulation=i,o.fire(i.startEvent),x?(i.vx0=e.pointerDelta.client.vx,i.vy0=e.pointerDelta.client.vy,i.v0=g,r(e,i),p.extend(v,e.curCoords.page),v.x+=i.xe,v.y+=i.ye,l.resetStatuses(f),m=l.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(e.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(e.boundSmoothEndFrame)))}}),c.signals.on("stop-active",function(t){var e=t.interaction,n=e.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,e.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers/base":23,"./utils":43,"./utils/raf":49}],21:[function(t,e,n){"use strict";function r(t,e){var n=a.interactables.get(t,e);return n||(n=new c(t,e),n.events.global=p),n}var i=t("./utils/browser"),o=t("./utils/events"),s=t("./utils"),a=t("./scope"),c=t("./Interactable"),l=t("./Interaction"),p={};r.isSet=function(t,e){return-1!==a.interactables.indexOfElement(t,e&&e.context)},r.on=function(t,e,n){if(s.is.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),s.is.array(t)){for(var i=0;i=0;e--)a.interactions[e].stop(t);return r},r.pointerMoveTolerance=function(t){return s.is.number(t)?(l.pointerMoveTolerance=t,r):l.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,e.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils":43,"./utils/browser":36,"./utils/events":39}],22:[function(t,e,n){"use strict";function r(t){var e=t.interaction,n=t.event;e.target&&e.target.checkAndPreventDefault(n)}var i=t("./Interactable"),o=t("./Interaction"),s=t("./scope"),a=t("./utils/is"),c=t("./utils/events"),l=t("./utils/browser"),p=t("./utils/domUtils"),u=p.nodeContains,d=p.matchesSelector;i.prototype.preventDefault=function(t){return/^(always|never|auto)$/.test(t)?(this.options.preventDefault=t,this):a.bool(t)?(this.options.preventDefault=t?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(t){var e=this.options.preventDefault;if("never"!==e)return"always"===e?void t.preventDefault():void(c.supportsPassive&&/^touch(start|move)$/.test(t.type)&&!l.isIOS||/^(mouse|pointer|touch)*(down|start)/i.test(t.type)||a.element(t.target)&&d(t.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||t.preventDefault())};for(var f=["down","move","up","cancel"],v=0;v=0&&(d.selectors[f]!==t||d.contexts[f]!==e);f--);-1===f&&(f=d.selectors.length,d.selectors.push(t),d.contexts.push(e),d.listeners.push([])),d.listeners[f].push([i,!!s.capture,s.passive])}function s(t,e,n,r,o){var s=p(o),l=w[n],u=!1,d=void 0;if(l)for(d=l.selectors.length-1;d>=0;d--)if(l.selectors[d]===t&&l.contexts[d]===e){for(var f=l.listeners[d],v=f.length-1;v>=0;v--){var g=f[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){f.splice(v,1),f.length||(l.selectors.splice(d,1),l.contexts.splice(d,1),l.listeners.splice(d,1),i(e,n,a),i(e,n,c,!0),l.selectors.length||(w[n]=null)),u=!0;break}}if(u)break}}function a(t,e){var n=p(e),r={},i=w[t.type],o=f.getEventTargets(t),s=o[0],a=s;for(v(r,t),r.originalEvent=t,r.preventDefault=l;u.element(a);){for(var c=0;c=2)continue;if(!o.interacting()&&e===o.pointerType)return o}return null}};e.exports=o},{"../scope":33,"./index":43}],45:[function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=t("./window"),o=t("./isWindow"),s={array:function(){},window:function(t){return t===i.window||o(t)},docFrag:function(t){return s.object(t)&&11===t.nodeType},object:function(t){return!!t&&"object"===(void 0===t?"undefined":r(t))},function:function(t){return"function"==typeof t},number:function(t){return"number"==typeof t},bool:function(t){return"boolean"==typeof t},string:function(t){return"string"==typeof t},element:function(t){if(!t||"object"!==(void 0===t?"undefined":r(t)))return!1;var e=i.getWindow(t)||i.window;return/object|function/.test(r(e.Element))?t instanceof e.Element:1===t.nodeType&&"string"==typeof t.nodeName}};s.array=function(t){return s.object(t)&&void 0!==t.length&&s.function(t.splice)},e.exports=s},{"./isWindow":46,"./window":51}],46:[function(t,e,n){"use strict";e.exports=function(t){return!(!t||!t.Window)&&t instanceof t.Window}},{}],47:[function(t,e,n){"use strict";function r(t,n){for(var r in n){var i=e.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]||(t[r]=n[r])}return t}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},e.exports=r},{}],48:[function(t,e,n){"use strict";var r=t("./hypot"),i=t("./browser"),o=t("./domObjects"),s=t("./domUtils"),a=t("./domObjects"),c=t("./is"),l=t("./pointerExtend"),p={copyCoords:function(t,e){t.page=t.page||{},t.page.x=e.page.x,t.page.y=e.page.y,t.client=t.client||{},t.client.x=e.client.x,t.client.y=e.client.y,t.timeStamp=e.timeStamp},setCoordDeltas:function(t,e,n){t.page.x=n.page.x-e.page.x,t.page.y=n.page.y-e.page.y,t.client.x=n.client.x-e.client.x,t.client.y=n.client.y-e.client.y,t.timeStamp=n.timeStamp-e.timeStamp;var i=Math.max(t.timeStamp/1e3,.001);t.page.speed=r(t.page.x,t.page.y)/i,t.page.vx=t.page.x/i,t.page.vy=t.page.y/i,t.client.speed=r(t.client.x,t.page.y)/i,t.client.vx=t.client.x/i,t.client.vy=t.client.y/i},isNativePointer:function(t){return t instanceof o.Event||t instanceof o.Touch},getXY:function(t,e,n){return n=n||{},t=t||"page",n.x=e[t+"X"],n.y=e[t+"Y"],n},getPageXY:function(t,e){return e=e||{},i.isOperaMobile&&p.isNativePointer(t)?(p.getXY("screen",t,e),e.x+=window.scrollX,e.y+=window.scrollY):p.getXY("page",t,e),e},getClientXY:function(t,e){return e=e||{},i.isOperaMobile&&p.isNativePointer(t)?p.getXY("screen",t,e):p.getXY("client",t,e),e},getPointerId:function(t){return c.number(t.pointerId)?t.pointerId:t.identifier},setCoords:function(t,e,n){var r=e.length>1?p.pointerAverage(e):e[0],i={};p.getPageXY(r,i),t.page.x=i.x,t.page.y=i.y,p.getClientXY(r,i),t.client.x=i.x,t.client.y=i.y,t.timeStamp=c.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(t){var e=[];return c.array(t)?(e[0]=t[0],e[1]=t[1]):"touchend"===t.type?1===t.touches.length?(e[0]=t.touches[0],e[1]=t.changedTouches[0]):0===t.touches.length&&(e[0]=t.changedTouches[0],e[1]=t.changedTouches[1]):(e[0]=t.touches[0],e[1]=t.touches[1]),e},pointerAverage:function(t){for(var e={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=0;n1){var e=p.getTouchPair(t),n=Math.min(e[0].pageX,e[1].pageX),r=Math.min(e[0].pageY,e[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(e[0].pageX,e[1].pageX)-n,height:Math.max(e[0].pageY,e[1].pageY)-r}}},touchDistance:function(t,e){var n=e+"X",i=e+"Y",o=p.getTouchPair(t),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(t,e,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(t),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(t){return c.string(t.pointerType)?t.pointerType:c.number(t.pointerType)?[void 0,void 0,"touch","pen","mouse"][t.pointerType]:/touch/.test(t.type)||t instanceof a.Touch?"touch":"mouse"},getEventTargets:function(t){var e=c.function(t.composedPath)?t.composedPath():t.path;return[s.getActualElement(e?e[0]:t.target),s.getActualElement(t.currentTarget)]}};e.exports=p},{"./browser":36,"./domObjects":37,"./domUtils":38,"./hypot":42,"./is":45,"./pointerExtend":47}],49:[function(t,e,n){"use strict";for(var r=t("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,c=void 0,l=0;l6&&void 0!==arguments[6]&&arguments[6];r(this,t);var f=e.target,v=(f&&f.options||s).deltaSource,g=o(f,p,c),h="start"===l,m="end"===l,y=h?e.startCoords:e.curCoords,x=e.prevEvent;p=p||e.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=c+(l||""),this.interaction=e,this.interactable=f,this.t0=h?e.downTimes[e.downTimes.length-1]:x.t0;var E={interaction:e,event:n,action:c,phase:l,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=e.startCoords.page.x-g.x,this.y0=e.startCoords.page.y-g.y,this.clientX0=e.startCoords.client.x-g.x,this.clientY0=e.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=e.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=e.pointerDelta[v].speed,this.velocityX=e.pointerDelta[v].vx,this.velocityY=e.pointerDelta[v].vy,this.swipe=m||"inertiastart"===l?this.getSwipe():null,a.fire("new",E)}return t.prototype.getSwipe=function(){var t=this.interaction;if(t.prevEvent.speed<600||this.timeStamp-t.prevEvent.timeStamp>150)return null;var e=180*Math.atan2(t.prevEvent.velocityY,t.prevEvent.velocityX)/Math.PI;e<0&&(e+=360);var n=112.5<=e&&e<247.5,r=202.5<=e&&e<337.5,i=!n&&(292.5<=e||e<67.5);return{up:r,down:!r&&22.5<=e&&e<157.5,left:n,right:i,angle:e,speed:t.prevEvent.speed,velocity:{x:t.prevEvent.velocityX,y:t.prevEvent.velocityY}}},t.prototype.preventDefault=function(){},t.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},t.prototype.stopPropagation=function(){this.propagationStopped=!0},t}();a.on("set-delta",function(t){var e=t.iEvent,n=t.interaction,r=t.starting,i=t.deltaSource,o=r?e:n.prevEvent;"client"===i?(e.dx=e.clientX-o.clientX,e.dy=e.clientY-o.clientY):(e.dx=e.pageX-o.pageX,e.dy=e.pageY-o.pageY)}),c.signals=a,e.exports=c},{"./defaultOptions":18,"./utils/Signals":34,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=t("./utils/clone"),o=t("./utils/is"),s=t("./utils/events"),a=t("./utils/extend"),c=t("./actions/base"),l=t("./scope"),p=t("./Eventable"),u=t("./defaultOptions"),d=t("./utils/Signals").new(),f=t("./utils/domUtils"),v=f.getElementRect,g=f.nodeContains,h=f.trySelector,m=f.matchesSelector,y=t("./utils/window"),x=y.getWindow,b=t("./utils/arr"),w=b.contains,E=t("./utils/browser"),T=E.wheelEvent;l.interactables=[];var S=function(){function t(e,n){r(this,t),n=n||{},this.target=e,this.events=new p,this._context=n.context||l.document,this._win=x(h(e)?this._context:e),this._doc=this._win.document,d.fire("new",{target:e,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return t.prototype.setOnEvents=function(t,e){var n="on"+t;return o.function(e.onstart)&&(this.events[n+"start"]=e.onstart),o.function(e.onmove)&&(this.events[n+"move"]=e.onmove),o.function(e.onend)&&(this.events[n+"end"]=e.onend),o.function(e.oninertiastart)&&(this.events[n+"inertiastart"]=e.oninertiastart),this},t.prototype.setPerAction=function(t,e){for(var n in e)n in u[t]&&(o.object(e[n])?(this.options[t][n]=i(this.options[t][n]||{}),a(this.options[t][n],e[n]),o.object(u.perAction[n])&&"enabled"in u.perAction[n]&&(this.options[t][n].enabled=!1!==e[n].enabled)):o.bool(e[n])&&o.object(u.perAction[n])?this.options[t][n].enabled=e[n]:void 0!==e[n]&&(this.options[t][n]=e[n]))},t.prototype.getRect=function(t){return t=t||this.target,o.string(this.target)&&!o.element(t)&&(t=this._context.querySelector(this.target)),v(t)},t.prototype.rectChecker=function(t){return o.function(t)?(this.getRect=t,this):null===t?(delete this.options.getRect,this):this.getRect},t.prototype._backCompatOption=function(t,e){if(h(e)||o.object(e)){this.options[t]=e;for(var n=0;nt.pointerMoveTolerance);var a={pointer:e,pointerIndex:this.getPointerIndex(e),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||c.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&c.copyCoords(this.prevCoords,this.curCoords))},t.prototype.doMove=function(t){t=c.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},t||{}),f.fire("before-action-move",t),this._dontFireMove||f.fire("action-move",t),this._dontFireMove=!1},t.prototype.pointerUp=function(t,e,n,r){var i=this.getPointerIndex(t);f.fire(/cancel$/i.test(e.type)?"cancel":"up",{pointer:t,pointerIndex:i,event:e,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(e),this.pointerIsDown=!1,this.removePointer(t,e)},t.prototype.end=function(t){this._ending=!0,t=t||this.prevEvent,this.interacting()&&f.fire("action-end",{event:t,interaction:this}),this.stop(),this._ending=!1},t.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},t.prototype.interacting=function(){return this._interacting},t.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},t.prototype.getPointerIndex=function(t){return"mouse"===this.pointerType||"pen"===this.pointerType?0:this.pointerIds.indexOf(c.getPointerId(t))},t.prototype.updatePointer=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e&&/(down|start)$/i.test(e.type),r=c.getPointerId(t),i=this.getPointerIndex(t);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:t,event:e,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=t,i},t.prototype.removePointer=function(t,e){var n=this.getPointerIndex(t);-1!==n&&(f.fire("remove-pointer",{pointer:t,event:e,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},t.prototype._updateEventTargets=function(t,e){this._eventTarget=t,this._curEventTarget=e},t}(),y=0;yo.left&&l.xo.top&&l.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(t,e,s,this,i,n,r)),s},v.signals.on("unset",function(t){t.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(t){t.dropTarget=null,t.dropElement=null,t.prevDropTarget=null,t.prevDropElement=null,t.dropEvents=null,t.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(t){var e=t.interaction;e.dropTarget=e.dropElement=e.prevDropTarget=e.prevDropElement=null}),d.dynamicDrop=function(t){return p.is.bool(t)?(y=t,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),l.methodDict.drop="dropzone",h.drop=m.defaults,e.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":44,"./base":6}],9:[function(t,e,n){"use strict";var r=t("./base"),i=t("../utils"),o=t("../InteractEvent"),s=t("../Interactable"),a=t("../Interaction"),c=t("../defaultOptions"),l={defaults:{enabled:!1,origin:null,restrict:null},checker:function(t,e,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;"gesturestart"===e.type&&(e.ds=0,n.gesture.startDistance=n.gesture.prevDistance=e.distance,n.gesture.startAngle=n.gesture.prevAngle=e.angle,n.gesture.scale=1)}),o.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;"gesturemove"===e.type&&(e.ds=e.scale-n.gesture.scale,n.target.fire(e),n.gesture.prevAngle=e.angle,n.gesture.prevDistance=e.distance,e.scale===1/0||null===e.scale||void 0===e.scale||isNaN(e.scale)||(n.gesture.scale=e.scale))}),s.prototype.gesturable=function(t){return i.is.object(t)?(this.options.gesture.enabled=!1!==t.enabled,this.setPerAction("gesture",t),this.setOnEvents("gesture",t),this):i.is.bool(t)?(this.options.gesture.enabled=t,t||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(t){var e=t.interaction,n=t.iEvent,r=t.action,s=t.event,a=t.starting,c=t.ending,l=t.deltaSource;if("gesture"===r){var p=e.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,l),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,l),n.da=0):c||s instanceof o?(n.distance=e.prevEvent.distance,n.box=e.prevEvent.box,n.scale=e.prevEvent.scale,n.ds=n.scale-1,n.angle=e.prevEvent.angle,n.da=n.angle-e.gesture.startAngle):(n.distance=i.touchDistance(p,l),n.box=i.touchBBox(p),n.scale=n.distance/e.gesture.startDistance,n.angle=i.touchAngle(p,e.gesture.prevAngle,l),n.ds=n.scale-e.gesture.prevScale,n.da=n.angle-e.gesture.prevAngle)}}),a.signals.on("new",function(t){t.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=l,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",c.gesture=l.defaults,e.exports=l},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(t,e,n){"use strict";function r(t,e,n,r,i,s,a){if(!e)return!1;if(!0===e){var c=o.is.number(s.width)?s.width:s.right-s.left,l=o.is.number(s.height)?s.height:s.bottom-s.top;if(c<0&&("left"===t?t="right":"right"===t&&(t="left")),l<0&&("top"===t?t="bottom":"bottom"===t&&(t="top")),"left"===t)return n.x<(c>=0?s.left:s.right)+a;if("top"===t)return n.y<(l>=0?s.top:s.bottom)+a;if("right"===t)return n.x>(c>=0?s.right:s.left)-a;if("bottom"===t)return n.y>(l>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(e)?e===r:o.matchesUpTo(r,e,i))}var i=t("./base"),o=t("../utils"),s=t("../utils/browser"),a=t("../InteractEvent"),c=t("../Interactable"),l=t("../Interaction"),p=t("../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(t,e,n,i,s,a){if(!a)return null;var c=o.extend({},s.curCoords.page),l=n.options;if(l.resize.enabled){var p=l.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],c,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"!==l.resize.axis&&c.x>a.right-u,g="x"!==l.resize.axis&&c.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9?{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(t){if(t.axis)return d.cursors[t.name+t.axis];if(t.edges){for(var e="",n=["top","bottom","left","right"],r=0;r<4;r++)t.edges[n[r]]&&(e+=n[r]);return d.cursors[e]}}};a.signals.on("new",function(t){var e=t.iEvent,n=t.interaction;if("resizestart"===e.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}},e.rect=n.resizeRects.inverted,e.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(t){var e=t.iEvent,n=t.phase,r=t.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,c=r.prepared.edges,l=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=c,g=e.dx,h=e.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;c=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(c.top&&(p.top+=h),c.bottom&&(p.bottom+=h),c.left&&(p.left+=g),c.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,l.bottom),u.bottom=Math.max(p.bottom,l.top),u.left=Math.min(p.left,l.right),u.right=Math.max(p.right,l.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];e.edges=r.prepared.edges,e.rect=u,e.deltaRect=d}}),c.prototype.resizable=function(t){return o.is.object(t)?(this.options.resize.enabled=!1!==t.enabled,this.setPerAction("resize",t),this.setOnEvents("resize",t),/^x$|^y$|^xy$/.test(t.axis)?this.options.resize.axis=t.axis:null===t.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(t.preserveAspectRatio)?this.options.resize.preserveAspectRatio=t.preserveAspectRatio:o.is.bool(t.square)&&(this.options.resize.square=t.square),this):o.is.bool(t)?(this.options.resize.enabled=t,t||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},l.signals.on("new",function(t){t.resizeAxes="xy"}),a.signals.on("set-delta",function(t){var e=t.interaction,n=t.iEvent;"resize"===t.action&&e.resizeAxes&&(e.target.options.resize.square?("y"===e.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=e.resizeAxes,"x"===e.resizeAxes?n.dy=0:"y"===e.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"), +o.merge(c.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,e.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":36,"./base":6}],11:[function(t,e,n){"use strict";var r=t("./utils/raf"),i=t("./utils/window").getWindow,o=t("./utils/is"),s=t("./utils/domUtils"),a=t("./Interaction"),c=t("./defaultOptions"),l={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(t){l.isScrolling=!0,r.cancel(l.i),l.interaction=t,l.prevTime=(new Date).getTime(),l.i=r.request(l.scroll)},stop:function(){l.isScrolling=!1,r.cancel(l.i)},scroll:function(){var t=l.interaction.target.options[l.interaction.prepared.name].autoScroll,e=t.container||i(l.interaction.element),n=(new Date).getTime(),s=(n-l.prevTime)/1e3,a=t.speed*s;a>=1&&(o.window(e)?e.scrollBy(l.x*a,l.y*a):e&&(e.scrollLeft+=l.x*a,e.scrollTop+=l.y*a),l.prevTime=n),l.isScrolling&&(r.cancel(l.i),l.i=r.request(l.scroll))},check:function(t,e){var n=t.options;return n[e].autoScroll&&n[e].autoScroll.enabled},onInteractionMove:function(t){var e=t.interaction,n=t.pointer;if(e.interacting()&&l.check(e.target,e.prepared.name)){if(e.simulation)return void(l.x=l.y=0);var r=void 0,a=void 0,c=void 0,p=void 0,u=e.target.options[e.prepared.name].autoScroll,d=u.container||i(e.element);if(o.window(d))p=n.clientXd.innerWidth-l.margin,c=n.clientY>d.innerHeight-l.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-l.margin,c=n.clientY>f.bottom-l.margin}l.x=a?1:p?-1:0,l.y=c?1:r?-1:0,l.isScrolling||(l.margin=u.margin,l.speed=u.speed,l.start(e))}}};a.signals.on("stop-active",function(){l.stop()}),a.signals.on("action-move",l.onInteractionMove),c.perAction.autoScroll=l.defaults,e.exports=l},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(t,e,n){"use strict";var r=t("../Interactable"),i=t("../actions/base"),o=t("../utils/is"),s=t("../utils/domUtils"),a=t("../utils"),c=a.warnOnce;r.prototype.getAction=function(t,e,n,r){var i=this.defaultActionChecker(t,e,n,r);return this.options.actionChecker?this.options.actionChecker(t,e,i,this,r,n):i},r.prototype.ignoreFrom=c(function(t){return this._backCompatOption("ignoreFrom",t)},"Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue})."),r.prototype.allowFrom=c(function(t){return this._backCompatOption("allowFrom",t)},"Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue})."),r.prototype.testIgnore=function(t,e,n){return!(!t||!o.element(n))&&(o.string(t)?s.matchesUpTo(n,t,e):!!o.element(t)&&s.nodeContains(t,n))},r.prototype.testAllow=function(t,e,n){return!t||!!o.element(n)&&(o.string(t)?s.matchesUpTo(n,t,e):!!o.element(t)&&s.nodeContains(t,n))},r.prototype.testIgnoreAllow=function(t,e,n){return!this.testIgnore(t.ignoreFrom,e,n)&&this.testAllow(t.allowFrom,e,n)},r.prototype.actionChecker=function(t){return o.function(t)?(this.options.actionChecker=t,this):null===t?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(t){return o.bool(t)?(this.options.styleCursor=t,this):null===t?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(t,e,n,r){for(var o=this.getRect(r),s=e.buttons||{0:1,1:4,3:8,4:16}[e.button],a=null,c=0;c=h.maxInteractions)return!1;if(u.target===t){if((a+=d===n.name|0)>=i)return!1;if(u.element===e&&(c++,d!==n.name||c>=o))return!1}}}return h.maxInteractions>0}}var c=t("../interact"),l=t("../Interactable"),p=t("../Interaction"),u=t("../actions/base"),d=t("../defaultOptions"),f=t("../scope"),v=t("../utils"),g=t("../utils/Signals").new();t("./InteractableMethods");var h={signals:g,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null,mouseButtons:1}},setActionDefaults:function(t){v.extend(t.defaults,h.defaults.perAction)},validateAction:r};p.signals.on("down",function(t){var e=t.interaction,n=t.pointer,r=t.event,i=t.eventTarget;if(!e.interacting()){s(e,o(e,n,r,i))}}),p.signals.on("move",function(t){var e=t.interaction,n=t.pointer,r=t.event,i=t.eventTarget;if("mouse"===e.pointerType&&!e.pointerIsDown&&!e.interacting()){s(e,o(e,n,r,i))}}),p.signals.on("move",function(t){var e=t.interaction,n=t.event;if(e.pointerIsDown&&!e.interacting()&&e.pointerWasMoved&&e.prepared.name){g.fire("before-start",t);var r=e.target;e.prepared.name&&r&&(r.options[e.prepared.name].manualStart||!a(r,e.element,e.prepared)?e.stop(n):e.start(e.prepared,r,e.element))}}),p.signals.on("stop",function(t){var e=t.interaction,n=e.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.maxInteractions=function(t){return v.is.number(t)?(h.maxInteractions=t,c):h.maxInteractions},l.settingsMethods.push("styleCursor"),l.settingsMethods.push("actionChecker"),l.settingsMethods.push("ignoreFrom"),l.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,v.extend(d.perAction,h.defaults.perAction),e.exports=h},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":33,"../utils":44,"../utils/Signals":34,"./InteractableMethods":12}],14:[function(t,e,n){"use strict";function r(t,e){if(!e)return!1;var n=e.options.drag.startAxis;return"xy"===t||"xy"===n||n===t}var i=t("./base"),o=t("../scope"),s=t("../utils/is"),a=t("../utils/domUtils"),c=a.parentNode;i.setActionDefaults(t("../actions/drag")),i.signals.on("before-start",function(t){var e=t.interaction,n=t.eventTarget,a=t.dx,l=t.dy;if("drag"===e.prepared.name){var p=Math.abs(a),u=Math.abs(l),d=e.target.options.drag,f=d.startAxis,v=p>u?"x":p0&&(e.autoStartHoldTimer=setTimeout(function(){e.start(e.prepared,e.target,e.element)},n))}),o.signals.on("move",function(t){var e=t.interaction,n=t.duplicate;e.pointerWasMoved&&!n&&clearTimeout(e.autoStartHoldTimer)}),i.signals.on("before-start",function(t){var e=t.interaction;r(e)>0&&(e.prepared.name=null)}),e.exports={getHoldDuration:r}},{"../Interaction":5,"./base":13}],17:[function(t,e,n){"use strict";t("./base").setActionDefaults(t("../actions/resize"))},{"../actions/resize":10,"./base":13}],18:[function(t,e,n){"use strict";e.exports={base:{accept:null,preventDefault:"auto",deltaSource:"page"},perAction:{origin:{x:0,y:0},inertia:{enabled:!1,resistance:10,minSpeed:100,endSpeed:10,allowResume:!0,smoothEndDuration:300}}}},{}],19:[function(t,e,n){"use strict";t("./inertia"),t("./modifiers/snap"),t("./modifiers/restrict"),t("./pointerEvents/base"),t("./pointerEvents/holdRepeat"),t("./pointerEvents/interactableTargets"),t("./autoStart/hold"),t("./actions/gesture"),t("./actions/resize"),t("./actions/drag"),t("./actions/drop"),t("./modifiers/snapSize"),t("./modifiers/restrictEdges"),t("./modifiers/restrictSize"),t("./autoStart/gesture"),t("./autoStart/resize"),t("./autoStart/drag"),t("./interactablePreventDefault.js"),t("./autoScroll"),e.exports=t("./interact")},{"./actions/drag":7,"./actions/drop":8,"./actions/gesture":9,"./actions/resize":10,"./autoScroll":11,"./autoStart/drag":14,"./autoStart/gesture":15,"./autoStart/hold":16,"./autoStart/resize":17,"./inertia":20,"./interact":21,"./interactablePreventDefault.js":22,"./modifiers/restrict":24,"./modifiers/restrictEdges":25,"./modifiers/restrictSize":26,"./modifiers/snap":27,"./modifiers/snapSize":28,"./pointerEvents/base":30,"./pointerEvents/holdRepeat":31,"./pointerEvents/interactableTargets":32}],20:[function(t,e,n){"use strict";function r(t,e){var n=t.target.options[t.prepared.name].inertia,r=n.resistance,i=-Math.log(n.endSpeed/e.v0)/r;e.x0=t.prevEvent.pageX,e.y0=t.prevEvent.pageY,e.t0=e.startEvent.timeStamp/1e3,e.sx=e.sy=0,e.modifiedXe=e.xe=(e.vx0-i)/r,e.modifiedYe=e.ye=(e.vy0-i)/r,e.te=i,e.lambda_v0=r/e.v0,e.one_ve_v0=1-n.endSpeed/e.v0}function i(){s(this),p.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords);var t=this.inertiaStatus,e=this.target.options[this.prepared.name].inertia,n=e.resistance,r=(new Date).getTime()/1e3-t.t0;if(rc.minSpeed&&g>c.endSpeed,b={interaction:e,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(l.resetStatuses(f),m=l.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,e.curCoords),e.pointers[0]=i.startEvent=new a(e,n,e.prepared.name,"inertiastart",e.element),i.t0=d,i.active=!0,i.allowResume=c.allowResume,e.simulation=i,o.fire(i.startEvent),x?(i.vx0=e.pointerDelta.client.vx,i.vy0=e.pointerDelta.client.vy,i.v0=g,r(e,i),p.extend(v,e.curCoords.page),v.x+=i.xe,v.y+=i.ye,l.resetStatuses(f),m=l.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(e.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(e.boundSmoothEndFrame)))}}),c.signals.on("stop-active",function(t){var e=t.interaction,n=e.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,e.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers/base":23,"./utils":44,"./utils/raf":50}],21:[function(t,e,n){"use strict";function r(t,e){var n=a.interactables.get(t,e);return n||(n=new c(t,e),n.events.global=p),n}var i=t("./utils/browser"),o=t("./utils/events"),s=t("./utils"),a=t("./scope"),c=t("./Interactable"),l=t("./Interaction"),p={};r.isSet=function(t,e){return-1!==a.interactables.indexOfElement(t,e&&e.context)},r.on=function(t,e,n){if(s.is.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),s.is.array(t)){for(var i=0;i=0;e--)a.interactions[e].stop(t);return r},r.pointerMoveTolerance=function(t){return s.is.number(t)?(l.pointerMoveTolerance=t,r):l.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,e.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":33,"./utils":44,"./utils/browser":36,"./utils/events":40}],22:[function(t,e,n){"use strict";function r(t){var e=t.interaction,n=t.event;e.target&&e.target.checkAndPreventDefault(n)}var i=t("./Interactable"),o=t("./Interaction"),s=t("./scope"),a=t("./utils/is"),c=t("./utils/events"),l=t("./utils/browser"),p=t("./utils/domUtils"),u=p.nodeContains,d=p.matchesSelector;i.prototype.preventDefault=function(t){return/^(always|never|auto)$/.test(t)?(this.options.preventDefault=t,this):a.bool(t)?(this.options.preventDefault=t?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(t){var e=this.options.preventDefault;if("never"!==e)return"always"===e?void t.preventDefault():void(c.supportsPassive&&/^touch(start|move)$/.test(t.type)&&!l.isIOS||/^(mouse|pointer|touch)*(down|start)/i.test(t.type)||a.element(t.target)&&d(t.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||t.preventDefault())};for(var f=["down","move","up","cancel"],v=0;v=0&&(d.selectors[f]!==t||d.contexts[f]!==e);f--);-1===f&&(f=d.selectors.length,d.selectors.push(t),d.contexts.push(e),d.listeners.push([])),d.listeners[f].push([i,!!s.capture,s.passive])}function s(t,e,n,r,o){var s=p(o),l=w[n],u=!1,d=void 0;if(l)for(d=l.selectors.length-1;d>=0;d--)if(l.selectors[d]===t&&l.contexts[d]===e){for(var f=l.listeners[d],v=f.length-1;v>=0;v--){var g=f[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){f.splice(v,1),f.length||(l.selectors.splice(d,1),l.contexts.splice(d,1),l.listeners.splice(d,1),i(e,n,a),i(e,n,c,!0),l.selectors.length||(w[n]=null)),u=!0;break}}if(u)break}}function a(t,e){var n=p(e),r={},i=w[t.type],o=f.getEventTargets(t),s=o[0],a=s;for(v(r,t),r.originalEvent=t,r.preventDefault=l;u.element(a);){for(var c=0;c=2)continue;if(!o.interacting()&&e===o.pointerType)return o}return null}};e.exports=o},{"../scope":33,"./index":44}],46:[function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=t("./window"),o=t("./isWindow"),s={array:function(){},window:function(t){return t===i.window||o(t)},docFrag:function(t){return s.object(t)&&11===t.nodeType},object:function(t){return!!t&&"object"===(void 0===t?"undefined":r(t))},function:function(t){return"function"==typeof t},number:function(t){return"number"==typeof t},bool:function(t){return"boolean"==typeof t},string:function(t){return"string"==typeof t},element:function(t){if(!t||"object"!==(void 0===t?"undefined":r(t)))return!1;var e=i.getWindow(t)||i.window;return/object|function/.test(r(e.Element))?t instanceof e.Element:1===t.nodeType&&"string"==typeof t.nodeName},plainObject:function(t){return s.object(t)&&"Object"===t.constructor.name}};s.array=function(t){return s.object(t)&&void 0!==t.length&&s.function(t.splice)},e.exports=s},{"./isWindow":47,"./window":52}],47:[function(t,e,n){"use strict";e.exports=function(t){return!(!t||!t.Window)&&t instanceof t.Window}},{}],48:[function(t,e,n){"use strict";function r(t,n){for(var r in n){var i=e.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]||(t[r]=n[r])}return t}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},e.exports=r},{}],49:[function(t,e,n){"use strict";var r=t("./hypot"),i=t("./browser"),o=t("./domObjects"),s=t("./domUtils"),a=t("./domObjects"),c=t("./is"),l=t("./pointerExtend"),p={copyCoords:function(t,e){t.page=t.page||{},t.page.x=e.page.x,t.page.y=e.page.y,t.client=t.client||{},t.client.x=e.client.x,t.client.y=e.client.y,t.timeStamp=e.timeStamp},setCoordDeltas:function(t,e,n){t.page.x=n.page.x-e.page.x,t.page.y=n.page.y-e.page.y,t.client.x=n.client.x-e.client.x,t.client.y=n.client.y-e.client.y,t.timeStamp=n.timeStamp-e.timeStamp;var i=Math.max(t.timeStamp/1e3,.001);t.page.speed=r(t.page.x,t.page.y)/i,t.page.vx=t.page.x/i,t.page.vy=t.page.y/i,t.client.speed=r(t.client.x,t.page.y)/i,t.client.vx=t.client.x/i,t.client.vy=t.client.y/i},isNativePointer:function(t){return t instanceof o.Event||t instanceof o.Touch},getXY:function(t,e,n){return n=n||{},t=t||"page",n.x=e[t+"X"],n.y=e[t+"Y"],n},getPageXY:function(t,e){return e=e||{},i.isOperaMobile&&p.isNativePointer(t)?(p.getXY("screen",t,e),e.x+=window.scrollX,e.y+=window.scrollY):p.getXY("page",t,e),e},getClientXY:function(t,e){return e=e||{},i.isOperaMobile&&p.isNativePointer(t)?p.getXY("screen",t,e):p.getXY("client",t,e),e},getPointerId:function(t){return c.number(t.pointerId)?t.pointerId:t.identifier},setCoords:function(t,e,n){var r=e.length>1?p.pointerAverage(e):e[0],i={};p.getPageXY(r,i),t.page.x=i.x,t.page.y=i.y,p.getClientXY(r,i),t.client.x=i.x,t.client.y=i.y,t.timeStamp=c.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(t){var e=[];return c.array(t)?(e[0]=t[0],e[1]=t[1]):"touchend"===t.type?1===t.touches.length?(e[0]=t.touches[0],e[1]=t.changedTouches[0]):0===t.touches.length&&(e[0]=t.changedTouches[0],e[1]=t.changedTouches[1]):(e[0]=t.touches[0],e[1]=t.touches[1]),e},pointerAverage:function(t){for(var e={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=0;n1){var e=p.getTouchPair(t),n=Math.min(e[0].pageX,e[1].pageX),r=Math.min(e[0].pageY,e[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(e[0].pageX,e[1].pageX)-n,height:Math.max(e[0].pageY,e[1].pageY)-r}}},touchDistance:function(t,e){var n=e+"X",i=e+"Y",o=p.getTouchPair(t),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(t,e,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(t),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(t){return c.string(t.pointerType)?t.pointerType:c.number(t.pointerType)?[void 0,void 0,"touch","pen","mouse"][t.pointerType]:/touch/.test(t.type)||t instanceof a.Touch?"touch":"mouse"},getEventTargets:function(t){var e=c.function(t.composedPath)?t.composedPath():t.path;return[s.getActualElement(e?e[0]:t.target),s.getActualElement(t.currentTarget)]}};e.exports=p},{"./browser":36,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(t,e,n){"use strict";for(var r=t("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,c=void 0,l=0;l\n * Released 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 extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (const listener of listeners) {\n if (event.immediatePropagationStopped) { break; }\n\n listener(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? eventList.indexOf(listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = undefined;\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 /** */\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 /** */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\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 matchesSelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\nclass Interactable {\n /** */\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 * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\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 * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {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 * 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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {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 * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\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 * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (const type of eventType) {\n this[method](type, listener, options);\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 * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\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, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\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, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {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 * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {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(scope.interactables.indexOf(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() && !interaction._ending) {\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.forEachMatch = function (element, callback) {\n for (const interactable of this) {\n let ret;\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(element) && matchesSelector(element, interactable.target))\n // target is the element\n : element === interactable.target)\n // the element is in context\n && (interactable.inContext(element))) {\n ret = callback(interactable);\n }\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 domObjects = require('./utils/domObjects');\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 /** */\n constructor ({ pointerType }) {\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 this._ending = false;\n\n this.pointerType = pointerType;\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 * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\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 (scope.interactions.indexOf(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 * ```js\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 *\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 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 * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */\n end (event) {\n this._ending = true;\n\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 this._ending = false;\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\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 // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return this.pointerIds.indexOf(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 index = this.getPointerIndex(pointer);\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 (const method of methodNames) {\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(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 (const changedTouch of event.changedTouches) {\n const pointer = changedTouch;\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\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].pointerType !== '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 interaction = new Interaction({ 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 (const interaction of scope.interactions) {\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.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 interaction._interacting = true;\n firePrepared(interaction, event, 'start');\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');\n/** @lends Interactable */\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 * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\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');\n/** @lends module:interact */\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\n/** @lends Interactable */\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.activeDrops, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction.activeDrops, 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 = {\n dropzones: null,\n elements: null,\n rects: null,\n };\n\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (activeDrops, element) {\n const drops = [];\n const elements = [];\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 (const currentElement of dropElements) {\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 (activeDrops, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n const current = activeDrops.dropzones[i];\n const currentElement = 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 (activeDrops, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(activeDrops, dragElement);\n\n activeDrops.dropzones = possibleDrops.dropzones;\n activeDrops.elements = possibleDrops.elements;\n activeDrops.rects = [];\n\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n activeDrops.rects[i] = activeDrops.dropzones[i].getRect(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.activeDrops, 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 const {\n activeDrops,\n prevDropTarget,\n dropTarget,\n dropElement,\n } = interaction;\n\n if (dropEvents.leave) { prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(activeDrops, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = dropTarget;\n interaction.prevDropElement = dropElement;\n}\n\n/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} 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 * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\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');\n/** @lends Interactable */\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.isIe9 ? {\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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\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","/** @lends Interactable */\nconst Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nconst { warnOnce } = require('../utils');\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 * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\nInteractable.prototype.ignoreFrom = warnOnce(function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n}, 'Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n\n/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\nInteractable.prototype.allowFrom = warnOnce(function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n}, 'Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\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 * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\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 * 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 * @param {boolean} [newValue]\n * @return {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 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 && /mouse|pointer/.test(interaction.pointerType)\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\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\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 // 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 },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n validateAction,\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.pointerType !== '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\n function pushMatches (interactable) {\n matches.push(interactable);\n matchElements.push(element);\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n scope.interactables.forEachMatch(element, pushMatches);\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 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\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 (const interaction of scope.interactions) {\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 * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] 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 interact;\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 scope = require('../scope');\nconst is = require('../utils/is');\n\nconst { 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 targetOptions = interaction.target.options.drag;\n const startAxis = targetOptions.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.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 let element = eventTarget;\n\n const getDraggable = function (interactable) {\n if (interactable === interaction.target) { return; }\n\n const options = interaction.target.options.drag;\n\n if (!options.manualStart\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, 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 // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n if (interactable) {\n interaction.prepared.name = 'drag';\n interaction.target = interactable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\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","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nautoStart.defaults.perAction.hold = 0;\nautoStart.defaults.perAction.delay = 0;\n\nInteraction.signals.on('new', function (interaction) {\n interaction.autoStartHoldTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, hold);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.prepared.name = null;\n }\n});\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name;\n\n if (!actionName) { return null; }\n\n const options = interaction.target.options;\n\n return options[actionName].hold || options[actionName].delay;\n}\n\nmodule.exports = {\n getHoldDuration,\n};\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 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// 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// autoStart hold\nrequire('./autoStart/hold');\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/base');\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\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: 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","/** @module interact */\n\nconst 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 * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\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 * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = function (type, listener, options) {\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, options);\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, { options });\n }\n\n return interact;\n};\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = function (type, listener, options) {\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, options);\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, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * 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 * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {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 * 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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return interact;\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');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {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 touch{start,move} events if the browser supports passive\n // events listeners. CSS touch-action and user-selecct should be used instead\n if (events.supportsPassive\n && /^touch(start|move)$/.test(event.type)\n && !browser.isIOS) {\n return;\n }\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 (is.element(event.target)\n && 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 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 (const modifierName of modifiers.names) {\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 result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n arg.modifiedCoords = extend({}, arg.pageCoords);\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 arg.modifiedCoords.x += arg.status.dx;\n arg.modifiedCoords.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 beforeMove: 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\n end: function ({ interaction, event }) {\n for (const modifierName of modifiers.names) {\n const options = interaction.target.options[interaction.prepared.name][modifierName];\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\n setXY: 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};\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);\nInteraction.signals.on('before-action-move', modifiers.beforeMove);\nInteraction.signals.on('action-end', modifiers.end);\n\nInteractEvent.signals.on('set-xy', modifiers.setXY);\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('./base');\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 ({ modifiedCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, modifiedCoords);\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 if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\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('./base');\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 ({ modifiedCoords, 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({}, modifiedCoords);\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 getRestrictionRect,\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('./base');\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 inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n 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('./base');\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 optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || 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 {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { 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, modifiedCoords, 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({}, modifiedCoords);\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('./base');\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, modifiedCoords } = arg;\n const page = utils.extend({}, modifiedCoords);\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 /** */\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);\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 /** */\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n /** */\n stopPropagation () {\n this.propagationStopped = true;\n }\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 defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\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 = signalArg.targets.filter(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 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 (const target of signalArg.targets) {\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,\n eventTarget,\n pointer,\n event,\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\nfor (const signalName of ['up', 'cancel']) {\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 is = require('../utils/is');\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 scope.interactables.forEachMatch(element, interactable => {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n });\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 { getWindow } = require('./utils/window');\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 || 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 = scope.documents.indexOf(doc);\n\n win = win || 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","class 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 = this.listeners[name].indexOf(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 (const listener of targetListeners) {\n if (listener(arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function contains (array, target) {\n return array.indexOf(target) !== -1;\n}\n\nfunction merge (target, source) {\n for (const item of source) {\n target.push(item);\n }\n\n return target;\n}\n\nmodule.exports = {\n contains,\n merge,\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 isIOS: (/iP(hone|od|ad)/.test(navigator.platform)),\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 isIe9: /MSIE 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 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\n// Opera Mobile must be handled differently\nbrowser.isOperaMobile = (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto'));\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 matchesSelector: function (element, selector) {\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 pointerUtils = require('./pointerUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window } = require('./window');\nconst { contains } = require('./arr');\n\nconst elements = [];\nconst targets = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\nconst documents = [];\n\nconst supportsOptions = (() => {\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 = elements.indexOf(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\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n element.addEventListener(type, listener, supportsOptions? options : !!options.capture);\n target.events[type].push(listener);\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = elements.indexOf(element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\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.removeEventListener(`on${type}`, listener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\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 }\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 (const doc of documents) {\n add(doc, type, delegateListener);\n add(doc, 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] = (pointerUtils.getEventTargets(event));\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 preventOriginalDefault () {\n this.originalEvent.preventDefault();\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 supportsOptions,\n\n _elements: elements,\n _targets: targets,\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 {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\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 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'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, 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 ({ pointerType, 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.pointerType === pointerType)) {\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 or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\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 mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.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 with a matching pointerType\n idle: function ({ pointerType }) {\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() && (pointerType === interaction.pointerType)) {\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 domObjects = require('./domObjects');\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) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n const path = is.function(event.composedPath) ? event.composedPath() : event.path;\n\n return [\n domUtils.getActualElement(path ? 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');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\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\nmodule.exports = rectUtils;\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 +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/hold.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/modifiers/base.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/clone.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.3 | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.3\n *\n * Copyright (c) 2012-2018 Taye Adeyemi \n * Released 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 extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (const listener of listeners) {\n if (event.immediatePropagationStopped) { break; }\n\n listener(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? eventList.indexOf(listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = undefined;\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 /** */\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 /** */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\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 clone = require('./utils/clone');\nconst 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 matchesSelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\nclass Interactable {\n /** */\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 and merge\n this.options[action][option] = clone(this.options[action][option] || {});\n 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 * The default function to get an Interactables bounding rect. Can be\n * overridden using {@link Interactable.rectChecker}.\n *\n * @param {Element} [element] The element to measure.\n * @return {object} The object's bounding rectangle.\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 * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n * @param {function} [checker] A function which returns this Interactable's\n * bounding rectangle. See {@link Interactable.getRect}\n * @return {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 * 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 * @param {Element | object | string} [origin] An HTML or SVG Element whose\n * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n * or any CSS selector\n *\n * @return {object} The current origin or this Interactable\n */\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /**\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n * @param {string} [newValue] Use 'client' if you will be scrolling while\n * interacting; Use 'page' if you want autoScroll to work\n * @return {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 * Gets the selector context Node of the Interactable. The default is\n * `window.document`.\n *\n * @return {Node} The context Node of this Interactable\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 * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n * Interactable\n * @return {Interactable} this Interactable\n */\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (const type of eventType) {\n this[method](type, listener, options);\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 * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} eventType The types of events to listen\n * for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] options object or useCapture flag\n * for addEventListener\n * @return {object} This Interactable\n */\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\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, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n * @param {string | array | object} eventType The types of events that were\n * listened for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {object} This Interactable\n */\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\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, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /**\n * Reset the options of this Interactable\n *\n * @param {object} options The new settings to apply\n * @return {object} This Interactable\n */\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = clone(defaults.base);\n\n const perActions = clone(defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = clone(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 * Remove this interactable from the list of interactables and remove it's\n * action capabilities and event listeners\n *\n * @return {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(scope.interactables.indexOf(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() && !interaction._ending) {\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.forEachMatch = function (element, callback) {\n for (const interactable of this) {\n let ret;\n\n if ((is.string(interactable.target)\n // target is a selector and the element matches\n ? (is.element(element) && matchesSelector(element, interactable.target))\n // target is the element\n : element === interactable.target)\n // the element is in context\n && (interactable.inContext(element))) {\n ret = callback(interactable);\n }\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 domObjects = require('./utils/domObjects');\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 /** */\n constructor ({ pointerType }) {\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 this._ending = false;\n\n this.pointerType = pointerType;\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 * ```js\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 *\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\n * number 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 * @param {object} action The action to be performed - drag, resize, etc.\n * @param {Interactable} target The Interactable to target\n * @param {Element} element The DOM Element to target\n * @return {object} interact\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 (scope.interactions.indexOf(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 * ```js\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 *\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 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 * ```js\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 *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n * @param {PointerEvent} [event]\n */\n end (event) {\n this._ending = true;\n\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 this._ending = false;\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\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 // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return this.pointerIds.indexOf(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 index = this.getPointerIndex(pointer);\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 (const method of methodNames) {\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(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 (const changedTouch of event.changedTouches) {\n const pointer = changedTouch;\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\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].pointerType !== '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 interaction = new Interaction({ 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 (const interaction of scope.interactions) {\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.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 interaction._interacting = true;\n firePrepared(interaction, event, 'start');\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');\n/** @lends Interactable */\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 * ```js\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 *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\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');\n/** @lends module:interact */\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\n/** @lends Interactable */\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.activeDrops, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction.activeDrops, 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 = {\n dropzones: null,\n elements: null,\n rects: null,\n };\n\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (activeDrops, element) {\n const drops = [];\n const elements = [];\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 (const currentElement of dropElements) {\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 (activeDrops, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n const current = activeDrops.dropzones[i];\n const currentElement = 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 (activeDrops, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(activeDrops, dragElement);\n\n activeDrops.dropzones = possibleDrops.dropzones;\n activeDrops.elements = possibleDrops.elements;\n activeDrops.rects = [];\n\n for (let i = 0; i < activeDrops.dropzones.length; i++) {\n activeDrops.rects[i] = activeDrops.dropzones[i].getRect(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.activeDrops, 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 const {\n activeDrops,\n prevDropTarget,\n dropTarget,\n dropElement,\n } = interaction;\n\n if (dropEvents.leave) { prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(activeDrops, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = dropTarget;\n interaction.prevDropElement = dropElement;\n}\n\n/**\n * ```js\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 * ```js\n * interact('.drop').dropzone({\n * accept: '.can-drop' || document.getElementById('single-drop'),\n * overlap: 'pointer' || 'center' || zeroToOne\n * }\n * ```\n *\n * Returns or sets whether draggables can be dropped onto this target to\n * 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 element\n * is over this Interactable.\n *\n * @param {boolean | object | null} [options] The new options to be set.\n * @return {boolean | Interactable} 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 * Returns or sets whether the dimensions of dropzone elements are calculated\n * on every dragmove or only on dragstart for the default dropChecker\n *\n * @param {boolean} [newValue] True to check on each move. False to check only\n * before start\n * @return {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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isGestureable = interact(element).gesturable();\n * ```\n *\n * Gets or sets whether multitouch gestures can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on gesture events (makes the Interactable gesturable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of gesture events, or this Interactable\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');\n/** @lends Interactable */\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.isIe9 ? {\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 * ```js\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 {@link Interactable.draggable} example\n * max: Infinity,\n * maxPerElement: 1,\n * });\n *\n * var isResizeable = interact(element).resizable();\n * ```\n *\n * Gets or sets whether resize actions can be performed on the target\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on resize events (object makes the Interactable\n * resizable)\n * @return {boolean | Interactable} A boolean indicating if this can be the\n * target of resize elements, or this Interactable\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","/** @lends Interactable */\nconst Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nconst { warnOnce } = require('../utils');\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 * ```js\n * interact(element, { ignoreFrom: document.getElementById('no-action') });\n * // or\n * interact(element).ignoreFrom('input, textarea, a');\n * ```\n * @deprecated\n * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n * of it's parents match the given CSS selector or Element, no\n * drag/resize/gesture is started.\n *\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to not ignore any elements\n * @return {string | Element | object} The current ignoreFrom value or this\n * Interactable\n */\nInteractable.prototype.ignoreFrom = warnOnce(function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n}, 'Interactable.ignoreForm() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n\n/**\n * ```js\n *\n * @deprecated\n * A drag/resize/gesture is started only If the target of the `mousedown`,\n * `pointerdown` or `touchstart` event or any of it's parents match the given\n * CSS selector or Element.\n *\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * @example\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * });\n *\n * @param {string | Element | null} [newValue] a CSS selector string, an\n * Element or `null` to allow from any element\n * @return {string | Element | object} The current allowFrom value or this\n * Interactable\n */\nInteractable.prototype.allowFrom = warnOnce(function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n}, 'Interactable.allowForm() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\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 * ```js\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 * ```\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n * @param {function | null} [checker] A function which takes a pointer event,\n * defaultAction string, interactable, element and interaction as parameters\n * and returns an object with name property 'drag' 'resize' or 'gesture' and\n * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n * props.\n * @return {Function | Interactable} The checker function or this Interactable\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 * 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 * @param {boolean} [newValue]\n * @return {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 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 && /mouse|pointer/.test(interaction.pointerType)\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\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\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 // 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 },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n validateAction,\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.pointerType !== '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\n function pushMatches (interactable) {\n matches.push(interactable);\n matchElements.push(element);\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n scope.interactables.forEachMatch(element, pushMatches);\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 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\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 (const interaction of scope.interactions) {\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 * Returns or sets the maximum number of concurrent interactions allowed. By\n * default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables and\n * elements, you need to enable it in the draggable, resizable and gesturable\n * `'max'` and `'maxPerElement'` options.\n *\n * @alias module:interact.maxInteractions\n *\n * @param {number} [newValue] 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 interact;\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 scope = require('../scope');\nconst is = require('../utils/is');\n\nconst { 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 targetOptions = interaction.target.options.drag;\n const startAxis = targetOptions.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = targetOptions.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : targetOptions.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 let element = eventTarget;\n\n const getDraggable = function (interactable) {\n if (interactable === interaction.target) { return; }\n\n const options = interaction.target.options.drag;\n\n if (!options.manualStart\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n const action = interactable.getAction(\n interaction.downPointer, interaction.downEvent, interaction, 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 // check all interactables\n while (is.element(element)) {\n const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n if (interactable) {\n interaction.prepared.name = 'drag';\n interaction.target = interactable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\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","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nautoStart.defaults.perAction.hold = 0;\nautoStart.defaults.perAction.delay = 0;\n\nInteraction.signals.on('new', function (interaction) {\n interaction.autoStartHoldTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, hold);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const hold = getHoldDuration(interaction);\n\n if (hold > 0) {\n interaction.prepared.name = null;\n }\n});\n\nfunction getHoldDuration (interaction) {\n const actionName = interaction.prepared && interaction.prepared.name;\n\n if (!actionName) { return null; }\n\n const options = interaction.target.options;\n\n return options[actionName].hold || options[actionName].delay;\n}\n\nmodule.exports = {\n getHoldDuration,\n};\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 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// 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// autoStart hold\nrequire('./autoStart/hold');\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/base');\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\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: 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","/** @module interact */\n\nconst 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 * ```js\n * interact('#draggable').draggable(true);\n *\n * var rectables = interact('rect');\n * rectables\n * .gesturable(true)\n * .on('gesturemove', function (event) {\n * // ...\n * });\n * ```\n *\n * The methods of this variable can be used to set elements as interactables\n * 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 configure\n * it.\n *\n * @global\n *\n * @param {Element | string} element The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\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 * Check if an element or selector has been set with the {@link interact}\n * function\n *\n * @alias module:interact.isSet\n *\n * @param {Element} element The Element being searched for\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/**\n * Add a global listener for an InteractEvent or adds a DOM event to `document`\n *\n * @alias module:interact.on\n *\n * @param {string | array | object} type The types of events to listen for\n * @param {function} listener The function event (s)\n * @param {object | boolean} [options] object or useCapture flag for\n * addEventListener\n * @return {object} interact\n */\ninteract.on = function (type, listener, options) {\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, options);\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, { options });\n }\n\n return interact;\n};\n\n/**\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n * @alias module:interact.off\n *\n * @param {string | array | object} type The types of events that were listened\n * for\n * @param {function} listener The listener function to be removed\n * @param {object | boolean} options [options] object or useCapture flag for\n * removeEventListener\n * @return {object} interact\n */\ninteract.off = function (type, listener, options) {\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, options);\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, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = globalEvents[type].indexOf(listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/**\n * Returns an object which exposes internal data\n\n * @alias module:interact.debug\n *\n * @return {object} An object with properties that outline the current state\n * 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 * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/**\n * @alias module:interact.supportsPointerEvent\n *\n * @return {boolean} Whether or not the browser supports PointerEvents\n */\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/**\n * Cancels all interactions (end events are not fired)\n *\n * @alias module:interact.stop\n *\n * @param {Event} event An event on which to call preventDefault()\n * @return {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 * 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 * @alias module:interact.pointerMoveTolerance\n *\n * @param {number} [newValue] The movement from the start position must be greater than this value\n * @return {interact | number}\n */\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return interact;\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');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/**\n * Returns or sets whether to prevent the browser's default behaviour in\n * 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 * @param {string} [newValue] `true`, `false` or `'auto'`\n * @return {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 touch{start,move} events if the browser supports passive\n // events listeners. CSS touch-action and user-selecct should be used instead\n if (events.supportsPassive\n && /^touch(start|move)$/.test(event.type)\n && !browser.isIOS) {\n return;\n }\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 (is.element(event.target)\n && 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 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 (const modifierName of modifiers.names) {\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 result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n arg.modifiedCoords = extend({}, arg.pageCoords);\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 arg.modifiedCoords.x += arg.status.dx;\n arg.modifiedCoords.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 beforeMove: 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\n end: function ({ interaction, event }) {\n for (const modifierName of modifiers.names) {\n const options = interaction.target.options[interaction.prepared.name][modifierName];\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\n setXY: 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};\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);\nInteraction.signals.on('before-action-move', modifiers.beforeMove);\nInteraction.signals.on('action-end', modifiers.end);\n\nInteractEvent.signals.on('set-xy', modifiers.setXY);\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('./base');\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 ({ modifiedCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, modifiedCoords);\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 if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\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('./base');\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 ({ modifiedCoords, 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({}, modifiedCoords);\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 getRestrictionRect,\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('./base');\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 inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n 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('./base');\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 optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || 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 {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { 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, modifiedCoords, 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({}, modifiedCoords);\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('./base');\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, modifiedCoords } = arg;\n const page = utils.extend({}, modifiedCoords);\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 /** */\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);\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 /** */\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n /** */\n stopPropagation () {\n this.propagationStopped = true;\n }\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 defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\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 = signalArg.targets.filter(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 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 (const target of signalArg.targets) {\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,\n eventTarget,\n pointer,\n event,\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\nfor (const signalName of ['up', 'cancel']) {\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 is = require('../utils/is');\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 scope.interactables.forEachMatch(element, interactable => {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n });\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 { getWindow } = require('./utils/window');\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 || 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 = scope.documents.indexOf(doc);\n\n win = win || 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","class 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 = this.listeners[name].indexOf(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 (const listener of targetListeners) {\n if (listener(arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function contains (array, target) {\n return array.indexOf(target) !== -1;\n}\n\nfunction merge (target, source) {\n for (const item of source) {\n target.push(item);\n }\n\n return target;\n}\n\nmodule.exports = {\n contains,\n merge,\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 isIOS: (/iP(hone|od|ad)/.test(navigator.platform)),\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 isIe9: /MSIE 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 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\n// Opera Mobile must be handled differently\nbrowser.isOperaMobile = (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto'));\n\nmodule.exports = browser;\n","const is = require('./is');\n\nmodule.exports = function clone (source) {\n const dest = {};\n for (const prop in source) {\n if (is.plainObject(source[prop])) {\n dest[prop] = clone(source[prop]);\n } else {\n dest[prop] = source[prop];\n }\n }\n return dest;\n};\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 matchesSelector: function (element, selector) {\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 pointerUtils = require('./pointerUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window } = require('./window');\nconst { contains } = require('./arr');\n\nconst elements = [];\nconst targets = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\nconst documents = [];\n\nconst supportsOptions = (() => {\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 = elements.indexOf(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\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n element.addEventListener(type, listener, supportsOptions? options : !!options.capture);\n target.events[type].push(listener);\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = elements.indexOf(element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\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.removeEventListener(`on${type}`, listener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\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 }\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 (const doc of documents) {\n add(doc, type, delegateListener);\n add(doc, 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] = (pointerUtils.getEventTargets(event));\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 preventOriginalDefault () {\n this.originalEvent.preventDefault();\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 supportsOptions,\n\n _elements: elements,\n _targets: targets,\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 {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\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 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'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, 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 ({ pointerType, 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.pointerType === pointerType)) {\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 or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\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 mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.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 with a matching pointerType\n idle: function ({ pointerType }) {\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() && (pointerType === interaction.pointerType)) {\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 plainObject: thing => is.object(thing) && thing.constructor.name === 'Object',\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 domObjects = require('./domObjects');\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) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n const path = is.function(event.composedPath) ? event.composedPath() : event.path;\n\n return [\n domUtils.getActualElement(path ? 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');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\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\nmodule.exports = rectUtils;\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 ea423d95a..663b6a3f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.2", + "version": "1.3.3", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"