UNPKG

394 kBSource Map (JSON)View Raw
1{"version":3,"sources":["_header.js","node_modules/browser-pack-flat/_prelude","packages/@interactjs/utils/isWindow.ts","packages/@interactjs/utils/window.ts","packages/@interactjs/utils/is.ts","packages/@interactjs/actions/drag/plugin.ts","packages/@interactjs/utils/domObjects.ts","packages/@interactjs/utils/browser.ts","packages/@interactjs/utils/domUtils.ts","packages/@interactjs/utils/extend.ts","packages/@interactjs/utils/rect.ts","packages/@interactjs/utils/getOriginXY.ts","packages/@interactjs/utils/normalizeListeners.ts","packages/@interactjs/utils/hypot.ts","packages/@interactjs/utils/pointerExtend.ts","packages/@interactjs/utils/pointerUtils.ts","packages/@interactjs/core/BaseEvent.ts","packages/@interactjs/utils/arr.ts","packages/@interactjs/actions/drop/DropEvent.ts","packages/@interactjs/actions/drop/plugin.ts","packages/@interactjs/actions/gesture/plugin.ts","packages/@interactjs/actions/resize/plugin.ts","packages/@interactjs/actions/plugin.ts","packages/@interactjs/utils/raf.ts","packages/@interactjs/auto-scroll/plugin.ts","packages/@interactjs/utils/misc.ts","packages/@interactjs/auto-start/InteractableMethods.ts","packages/@interactjs/auto-start/base.ts","packages/@interactjs/auto-start/dragAxis.ts","packages/@interactjs/auto-start/hold.ts","packages/@interactjs/auto-start/plugin.ts","packages/@interactjs/core/interactablePreventDefault.ts","packages/@interactjs/dev-tools/visualizer/plugin.ts","packages/@interactjs/dev-tools/plugin.ts","packages/@interactjs/utils/clone.ts","packages/@interactjs/modifiers/Modification.ts","packages/@interactjs/modifiers/base.ts","packages/@interactjs/core/options.ts","packages/@interactjs/core/InteractEvent.ts","packages/@interactjs/core/PointerInfo.ts","packages/@interactjs/core/Interaction.ts","packages/@interactjs/offset/plugin.ts","packages/@interactjs/inertia/plugin.ts","packages/@interactjs/core/Eventable.ts","packages/@interactjs/core/isNonNativeEvent.ts","packages/@interactjs/core/InteractStatic.ts","packages/@interactjs/core/Interactable.ts","packages/@interactjs/core/InteractableSet.ts","packages/@interactjs/core/events.ts","packages/@interactjs/core/interactionFinder.ts","packages/@interactjs/core/interactions.ts","packages/@interactjs/core/scope.ts","packages/@interactjs/interact/index.ts","packages/@interactjs/snappers/edgeTarget.ts","packages/@interactjs/snappers/elements.ts","packages/@interactjs/snappers/grid.ts","packages/@interactjs/snappers/plugin.ts","packages/@interactjs/modifiers/aspectRatio.ts","packages/@interactjs/modifiers/noop.ts","packages/@interactjs/modifiers/restrict/pointer.ts","packages/@interactjs/modifiers/restrict/edges.ts","packages/@interactjs/modifiers/restrict/rect.ts","packages/@interactjs/modifiers/restrict/size.ts","packages/@interactjs/modifiers/snap/pointer.ts","packages/@interactjs/modifiers/snap/size.ts","packages/@interactjs/modifiers/snap/edges.ts","packages/@interactjs/modifiers/all.ts","packages/@interactjs/modifiers/plugin.ts","packages/@interactjs/pointer-events/PointerEvent.ts","packages/@interactjs/pointer-events/base.ts","packages/@interactjs/pointer-events/holdRepeat.ts","packages/@interactjs/pointer-events/interactableTargets.ts","packages/@interactjs/pointer-events/plugin.ts","packages/@interactjs/reflow/plugin.ts","packages/@interactjs/interactjs/index.ts","packages/interactjs/index.ts","node_modules/browser-pack-flat/_postlude"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js 1.10.11 | https://interactjs.io/license */\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports;\n","export default (thing: any) => !!(thing && thing.Window) && thing instanceof thing.Window\n","import isWindow from './isWindow'\n\nexport let realWindow = undefined as Window\n\nlet win = undefined as Window\nexport { win as window }\n\nexport function init (window: Window & { wrap?: (...args: any[]) => any }) {\n // get wrapped window if using Shadow DOM polyfill\n\n 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 && typeof window.wrap === 'function' && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window)\n }\n\n win = window\n}\n\nif (typeof window !== 'undefined' && !!window) {\n init(window)\n}\n\nexport function getWindow (node: any) {\n if (isWindow(node)) {\n return node\n }\n\n const rootNode = node.ownerDocument || node\n\n return rootNode.defaultView || win.window\n}\n","import type { Element } from '@interactjs/types/index'\n\nimport isWindow from './isWindow'\nimport * as win from './window'\n\nconst window = (thing: any): thing is Window => thing === win.window || isWindow(thing)\n\nconst docFrag = (thing: any): thing is DocumentFragment => object(thing) && thing.nodeType === 11\n\nconst object = (thing: any): thing is { [index: string]: any } => !!thing && typeof thing === 'object'\n\nconst func = (thing: any): thing is (...args: any[]) => any => typeof thing === 'function'\n\nconst number = (thing: any): thing is number => typeof thing === 'number'\n\nconst bool = (thing: any): thing is boolean => typeof thing === 'boolean'\n\nconst string = (thing: any): thing is string => typeof thing === 'string'\n\nconst element = (thing: any): thing is Element => {\n if (!thing || typeof thing !== 'object') {\n return false\n }\n\n // eslint-disable-next-line import/no-named-as-default-member\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\nconst plainObject: typeof object = (thing: any): thing is { [index: string]: any } =>\n object(thing) && !!thing.constructor && /function Object\\b/.test(thing.constructor.toString())\n\nconst array = <T extends unknown>(thing: any): thing is T[] =>\n object(thing) && typeof thing.length !== 'undefined' && func(thing.splice)\n\nexport default {\n window,\n docFrag,\n object,\n func,\n number,\n bool,\n string,\n element,\n plainObject,\n array,\n}\n","import type { InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { Interactable } from '@interactjs/core/Interactable'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type { ActionMethod, DraggableOptions, DropzoneOptions } from '@interactjs/types/index'\nimport is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n draggable: DraggableMethod\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface ActionDefaults {\n drag: DraggableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n drag?: typeof drag\n }\n}\n\nexport type DragEvent = InteractEvent<'drag'>\n\nexport type DraggableMethod = ActionMethod<DraggableOptions>\n\nfunction install (scope: Scope) {\n const { actions, Interactable, defaults } = scope\n\n Interactable.prototype.draggable = drag.draggable\n\n actions.map.drag = drag\n actions.methodDict.drag = 'draggable'\n\n defaults.actions.drag = drag.defaults\n}\n\nfunction beforeMove ({ interaction }) {\n if (interaction.prepared.name !== 'drag') return\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x') {\n interaction.coords.cur.page.y = interaction.coords.start.page.y\n interaction.coords.cur.client.y = interaction.coords.start.client.y\n\n interaction.coords.velocity.client.y = 0\n interaction.coords.velocity.page.y = 0\n } else if (axis === 'y') {\n interaction.coords.cur.page.x = interaction.coords.start.page.x\n interaction.coords.cur.client.x = interaction.coords.start.client.x\n\n interaction.coords.velocity.client.x = 0\n interaction.coords.velocity.page.x = 0\n }\n}\n\nfunction move ({ iEvent, interaction }) {\n if (interaction.prepared.name !== 'drag') return\n\n const axis = interaction.prepared.axis\n\n if (axis === 'x' || axis === 'y') {\n const opposite = axis === 'x' ? 'y' : 'x'\n\n iEvent.page[opposite] = interaction.coords.start.page[opposite]\n iEvent.client[opposite] = interaction.coords.start.client[opposite]\n iEvent.delta[opposite] = 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 * @alias Interactable.prototype.draggable\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 */\nconst draggable: DraggableMethod = function draggable (\n this: Interactable,\n options?: DraggableOptions | boolean,\n): any {\n if (is.object(options)) {\n this.options.drag.enabled = options.enabled !== false\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 (is.bool(options)) {\n this.options.drag.enabled = options\n\n return this\n }\n\n return this.options.drag\n}\n\nconst drag: Plugin = {\n id: 'actions/drag',\n install,\n listeners: {\n 'interactions:before-action-move': beforeMove,\n 'interactions:action-resume': beforeMove,\n\n // dragmove\n 'interactions:action-move': move,\n 'auto-start:check': (arg) => {\n const { interaction, interactable, buttons } = arg\n const dragOptions = interactable.options.drag\n\n if (\n !(dragOptions && dragOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & interactable.options.drag.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n arg.action = {\n name: 'drag',\n axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis,\n }\n\n return false\n },\n },\n draggable,\n beforeMove,\n move,\n defaults: {\n startAxis: 'xy',\n lockAxis: 'xy',\n } as DropzoneOptions,\n\n getCursor () {\n return 'move'\n },\n}\n\nexport default drag\n","const domObjects: {\n init: any\n document: Document\n DocumentFragment: typeof DocumentFragment\n SVGElement: typeof SVGElement\n SVGSVGElement: typeof SVGSVGElement\n SVGElementInstance: any\n Element: typeof Element\n HTMLElement: typeof HTMLElement\n Event: typeof Event\n Touch: typeof Touch\n PointerEvent: typeof PointerEvent\n} = {\n init,\n document: null,\n DocumentFragment: null,\n SVGElement: null,\n SVGSVGElement: null,\n SVGElementInstance: null,\n Element: null,\n HTMLElement: null,\n Event: null,\n Touch: null,\n PointerEvent: null,\n}\n\nfunction blank () {}\n\nexport default domObjects\n\nfunction init (window: Window) {\n const win = window as any\n\n domObjects.document = win.document\n domObjects.DocumentFragment = win.DocumentFragment || blank\n domObjects.SVGElement = win.SVGElement || blank\n domObjects.SVGSVGElement = win.SVGSVGElement || blank\n domObjects.SVGElementInstance = win.SVGElementInstance || blank\n domObjects.Element = win.Element || blank\n domObjects.HTMLElement = win.HTMLElement || domObjects.Element\n\n domObjects.Event = win.Event\n domObjects.Touch = win.Touch || blank\n domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent\n}\n","import domObjects from './domObjects'\nimport is from './is'\n\nconst browser = {\n init,\n supportsTouch: null as boolean,\n supportsPointerEvent: null as boolean,\n isIOS7: null as boolean,\n isIOS: null as boolean,\n isIe9: null as boolean,\n isOperaMobile: null as boolean,\n prefixedMatchesSelector: null as 'matches',\n pEventTypes: null as {\n up: string\n down: string\n over: string\n out: string\n move: string\n cancel: string\n },\n wheelEvent: null as string,\n}\n\nfunction init (window: any) {\n const Element = domObjects.Element\n const navigator: Partial<Navigator> = window.navigator || {}\n\n // Does the browser support touch input?\n browser.supportsTouch =\n 'ontouchstart' in window ||\n (is.func(window.DocumentTouch) && domObjects.document instanceof window.DocumentTouch)\n\n // Does the browser support PointerEvents\n browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!domObjects.PointerEvent\n\n browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform)\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\\d]/.test(navigator.appVersion)\n\n browser.isIe9 = /MSIE 9/.test(navigator.userAgent)\n\n // Opera Mobile must be handled differently\n browser.isOperaMobile =\n navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent)\n\n // prefix matchesSelector\n browser.prefixedMatchesSelector = ('matches' in Element.prototype\n ? 'matches'\n : 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector'\n : 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector'\n : 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector'\n : 'msMatchesSelector') as 'matches'\n\n browser.pEventTypes = browser.supportsPointerEvent\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 browser.wheelEvent = domObjects.document && 'onmousewheel' in domObjects.document ? 'mousewheel' : 'wheel'\n}\n\nexport default browser\n","import type { Rect, Target, Element } from '@interactjs/types/index'\n\nimport browser from './browser'\nimport domObjects from './domObjects'\nimport is from './is'\nimport * as win from './window'\n\nexport function nodeContains (parent: Node, child: Node) {\n if (parent.contains) {\n return parent.contains(child as Node)\n }\n\n while (child) {\n if (child === parent) {\n return true\n }\n\n child = (child as Node).parentNode\n }\n\n return false\n}\n\nexport function closest (element: Node, selector: string) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) {\n return element\n }\n\n element = parentNode(element)\n }\n\n return null\n}\n\nexport function parentNode (node: Node | Document) {\n let parent = node.parentNode\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n // tslint:disable-next-line\n while ((parent = (parent as any).host) && is.docFrag(parent)) {\n continue\n }\n\n return parent\n }\n\n return parent\n}\n\nexport function matchesSelector (element: Element, selector: string) {\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\nconst getParent = (el: Node | Document | ShadowRoot) => el.parentNode || (el as ShadowRoot).host\n\n// Test for the element that's \"above\" all other qualifiers\nexport function indexOfDeepestElement (elements: Element[] | NodeListOf<globalThis.Element>) {\n let deepestNodeParents: Node[] = []\n let deepestNodeIndex: number\n\n for (let i = 0; i < elements.length; i++) {\n const currentNode = elements[i]\n const deepestNode: Node = elements[deepestNodeIndex]\n\n // node may appear in elements array multiple times\n if (!currentNode || i === deepestNodeIndex) {\n continue\n }\n\n if (!deepestNode) {\n deepestNodeIndex = i\n continue\n }\n\n const currentNodeParent = getParent(currentNode)\n const deepestNodeParent = getParent(deepestNode)\n\n // check if the deepest or current are document.documentElement/rootElement\n // - if the current node is, do nothing and continue\n if (currentNodeParent === currentNode.ownerDocument) {\n continue\n }\n // - if deepest is, update with the current node and continue to next\n else if (deepestNodeParent === currentNode.ownerDocument) {\n deepestNodeIndex = i\n continue\n }\n\n // compare zIndex of siblings\n if (currentNodeParent === deepestNodeParent) {\n if (zIndexIsHigherThan(currentNode, deepestNode)) {\n deepestNodeIndex = i\n }\n\n continue\n }\n\n // populate the ancestry array for the latest deepest node\n deepestNodeParents = deepestNodeParents.length ? deepestNodeParents : getNodeParents(deepestNode)\n\n let ancestryStart: Node\n\n // if the deepest node is an HTMLElement and the current node is a non root svg element\n if (\n deepestNode instanceof domObjects.HTMLElement &&\n currentNode instanceof domObjects.SVGElement &&\n !(currentNode instanceof domObjects.SVGSVGElement)\n ) {\n // TODO: is this check necessary? Was this for HTML elements embedded in SVG?\n if (currentNode === deepestNodeParent) {\n continue\n }\n\n ancestryStart = currentNode.ownerSVGElement\n } else {\n ancestryStart = currentNode\n }\n\n const currentNodeParents = getNodeParents(ancestryStart, deepestNode.ownerDocument)\n let commonIndex = 0\n\n // get (position of closest common ancestor) + 1\n while (\n currentNodeParents[commonIndex] &&\n currentNodeParents[commonIndex] === deepestNodeParents[commonIndex]\n ) {\n commonIndex++\n }\n\n const parents = [\n currentNodeParents[commonIndex - 1],\n currentNodeParents[commonIndex],\n deepestNodeParents[commonIndex],\n ]\n\n if (parents[0]) {\n let child = parents[0].lastChild\n\n while (child) {\n if (child === parents[1]) {\n deepestNodeIndex = i\n deepestNodeParents = currentNodeParents\n\n break\n } else if (child === parents[2]) {\n break\n }\n\n child = child.previousSibling\n }\n }\n }\n\n return deepestNodeIndex\n}\n\nfunction getNodeParents (node: Node, limit?: Node) {\n const parents: Node[] = []\n let parent: Node = node\n let parentParent: Node\n\n while ((parentParent = getParent(parent)) && parent !== limit && parentParent !== parent.ownerDocument) {\n parents.unshift(parent)\n parent = parentParent\n }\n\n return parents\n}\n\nfunction zIndexIsHigherThan (higherNode: Node, lowerNode: Node) {\n const higherIndex = parseInt(win.getWindow(higherNode).getComputedStyle(higherNode).zIndex, 10) || 0\n const lowerIndex = parseInt(win.getWindow(lowerNode).getComputedStyle(lowerNode).zIndex, 10) || 0\n\n return higherIndex >= lowerIndex\n}\n\nexport function matchesUpTo (element: Element, selector: string, limit: Node) {\n while (is.element(element)) {\n if (matchesSelector(element, selector)) {\n return true\n }\n\n element = parentNode(element) as Element\n\n if (element === limit) {\n return matchesSelector(element, selector)\n }\n }\n\n return false\n}\n\nexport function getActualElement (element: Element) {\n return (element as SVGElement).correspondingUseElement || element\n}\n\nexport function getScrollXY (relevantWindow?: Window) {\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\nexport function getElementClientRect (element: Element): Required<Rect> {\n const clientRect =\n element instanceof domObjects.SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]\n\n return (\n 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\nexport function getElementRect (element: Element) {\n const clientRect = getElementClientRect(element)\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = 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\nexport function getPath (node: Node | Document) {\n const path = []\n\n while (node) {\n path.push(node)\n node = parentNode(node)\n }\n\n return path\n}\n\nexport function trySelector (value: Target) {\n if (!is.string(value)) {\n return false\n }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value)\n return true\n}\n","export default function extend<T, U extends object> (dest: U & Partial<T>, source: T): T & U {\n for (const prop in source) {\n ;((dest as unknown) as T)[prop] = source[prop]\n }\n\n const ret = dest as T & U\n\n return ret\n}\n","import type {\n HasGetRect,\n RectResolvable,\n Rect,\n Element,\n Point,\n FullRect,\n EdgeOptions,\n} from '@interactjs/types'\n\nimport { closest, getElementRect, parentNode } from './domUtils'\nimport extend from './extend'\nimport is from './is'\n\nexport function getStringOptionResult (value: any, target: HasGetRect, element: Node) {\n if (value === 'parent') {\n return parentNode(element)\n }\n\n if (value === 'self') {\n return target.getRect(element as Element)\n }\n\n return closest(element, value)\n}\n\nexport function resolveRectLike<T extends any[]> (\n value: RectResolvable<T>,\n target?: HasGetRect,\n element?: Node,\n functionArgs?: T,\n) {\n let returnValue: any = value\n if (is.string(returnValue)) {\n returnValue = getStringOptionResult(returnValue, target, element)\n } else if (is.func(returnValue)) {\n returnValue = returnValue(...functionArgs)\n }\n\n if (is.element(returnValue)) {\n returnValue = getElementRect(returnValue)\n }\n\n return returnValue as Rect\n}\n\nexport function rectToXY (rect: Rect | Point) {\n return (\n rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n }\n )\n}\n\nexport function xywhToTlbr<T extends Partial<Rect & Point>> (rect: T) {\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 as Rect & T\n}\n\nexport function tlbrToXywh (rect: Rect & Partial<Point>) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect)\n\n rect.x = rect.left || 0\n rect.y = rect.top || 0\n rect.width = rect.width || (rect.right || 0) - rect.x\n rect.height = rect.height || (rect.bottom || 0) - rect.y\n }\n\n return rect as FullRect & Point\n}\n\nexport function addEdges (edges: EdgeOptions, rect: Rect, delta: Point) {\n if (edges.left) {\n rect.left += delta.x\n }\n if (edges.right) {\n rect.right += delta.x\n }\n if (edges.top) {\n rect.top += delta.y\n }\n if (edges.bottom) {\n rect.bottom += delta.y\n }\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n}\n","import type { PerActionDefaults } from '@interactjs/core/options'\nimport type { ActionName } from '@interactjs/core/scope'\nimport type { HasGetRect } from '@interactjs/types/index'\n\nimport { rectToXY, resolveRectLike } from './rect'\n\nexport default function (\n target: HasGetRect & { options: PerActionDefaults },\n element: Node,\n actionName?: ActionName,\n) {\n const actionOptions = (target.options as any)[actionName]\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","import type { EventTypes, Listener, ListenersArg } from '@interactjs/types/index'\n\nimport extend from './extend'\nimport is from './is'\n\nexport interface NormalizedListeners {\n [type: string]: Listener[]\n}\n\nexport default function normalize (\n type: EventTypes,\n listeners?: ListenersArg | ListenersArg[],\n result?: NormalizedListeners,\n): NormalizedListeners {\n result = result || {}\n\n if (is.string(type) && type.search(' ') !== -1) {\n type = split(type)\n }\n\n if (is.array(type)) {\n return type.reduce<NormalizedListeners>((acc, t) => extend(acc, normalize(t, listeners, result)), result)\n }\n\n // ({ type: fn }) -> ('', { type: fn })\n if (is.object(type)) {\n listeners = type\n type = ''\n }\n\n if (is.func(listeners)) {\n result[type] = result[type] || []\n result[type].push(listeners)\n } else if (is.array(listeners)) {\n for (const l of listeners) {\n normalize(type, l, result)\n }\n } else if (is.object(listeners)) {\n for (const prefix in listeners) {\n const combinedTypes = split(prefix).map((p) => `${type}${p}`)\n\n normalize(combinedTypes, listeners[prefix], result)\n }\n }\n\n return result as NormalizedListeners\n}\n\nfunction split (type: string) {\n return type.trim().split(/ +/)\n}\n","export default (x: number, y: number) => Math.sqrt(x * x + y * y)\n","function pointerExtend<T> (dest: Partial<T>, source: T) {\n for (const prop in source) {\n const prefixedPropREs = pointerExtend.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 moz: /(Pressure)$/,\n} as { [prefix: string]: RegExp }\n\nexport default pointerExtend\n","import type { InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { CoordsSetMember, PointerType, Point, PointerEventType, Element } from '@interactjs/types/index'\n\nimport browser from './browser'\nimport dom from './domObjects'\nimport * as domUtils from './domUtils'\nimport hypot from './hypot'\nimport is from './is'\nimport pointerExtend from './pointerExtend'\n\nexport function copyCoords (dest: CoordsSetMember, src: CoordsSetMember) {\n dest.page = dest.page || ({} as any)\n dest.page.x = src.page.x\n dest.page.y = src.page.y\n\n dest.client = dest.client || ({} as any)\n dest.client.x = src.client.x\n dest.client.y = src.client.y\n\n dest.timeStamp = src.timeStamp\n}\n\nexport function setCoordDeltas (targetObj: CoordsSetMember, prev: CoordsSetMember, cur: CoordsSetMember) {\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\nexport function setCoordVelocity (targetObj: CoordsSetMember, delta: CoordsSetMember) {\n const dt = Math.max(delta.timeStamp / 1000, 0.001)\n\n targetObj.page.x = delta.page.x / dt\n targetObj.page.y = delta.page.y / dt\n targetObj.client.x = delta.client.x / dt\n targetObj.client.y = delta.client.y / dt\n targetObj.timeStamp = dt\n}\n\nexport function setZeroCoords (targetObj: CoordsSetMember) {\n targetObj.page.x = 0\n targetObj.page.y = 0\n targetObj.client.x = 0\n targetObj.client.y = 0\n}\n\nexport function isNativePointer (pointer: any) {\n return pointer instanceof dom.Event || pointer instanceof dom.Touch\n}\n\n// Get specified X/Y coords for mouse or event.touches[0]\nexport function getXY (type: string, pointer: PointerType | InteractEvent, xy: Point) {\n xy = xy || ({} as Point)\n type = type || 'page'\n\n xy.x = pointer[(type + 'X') as keyof PointerType]\n xy.y = pointer[(type + 'Y') as keyof PointerType]\n\n return xy\n}\n\nexport function getPageXY (pointer: PointerType | InteractEvent, page?: Point) {\n page = page || { x: 0, y: 0 }\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n getXY('screen', pointer, page)\n\n page.x += window.scrollX\n page.y += window.scrollY\n } else {\n getXY('page', pointer, page)\n }\n\n return page\n}\n\nexport function getClientXY (pointer: PointerType, client: Point) {\n client = client || ({} as any)\n\n if (browser.isOperaMobile && isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n getXY('screen', pointer, client)\n } else {\n getXY('client', pointer, client)\n }\n\n return client\n}\n\nexport function getPointerId (pointer: { pointerId?: number, identifier?: number, type?: string }) {\n return is.number(pointer.pointerId) ? pointer.pointerId! : pointer.identifier!\n}\n\nexport function setCoords (dest: CoordsSetMember, pointers: any[], timeStamp: number) {\n const pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0]\n\n getPageXY(pointer, dest.page)\n getClientXY(pointer, dest.client)\n\n dest.timeStamp = timeStamp\n}\n\nexport function getTouchPair (event: TouchEvent | PointerType[]) {\n const touches: PointerType[] = []\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 } else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0]\n touches[1] = event.changedTouches[1]\n }\n } else {\n touches[0] = event.touches[0]\n touches[1] = event.touches[1]\n }\n }\n\n return touches\n}\n\nexport function pointerAverage (pointers: PointerType[]) {\n const average = {\n pageX: 0,\n pageY: 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n }\n\n type CoordKeys = keyof typeof average\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop as CoordKeys] += pointer[prop as CoordKeys]\n }\n }\n for (const prop in average) {\n average[prop as CoordKeys] /= pointers.length\n }\n\n return average\n}\n\nexport function touchBBox (event: PointerType[]) {\n if (!event.length) {\n return null\n }\n\n const touches = 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 right: maxX,\n bottom: maxY,\n width: maxX - minX,\n height: maxY - minY,\n }\n}\n\nexport function touchDistance (event: PointerType[] | TouchEvent, deltaSource: string) {\n const sourceX = (deltaSource + 'X') as 'pageX'\n const sourceY = (deltaSource + 'Y') as 'pageY'\n const touches = getTouchPair(event)\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\nexport function touchAngle (event: PointerType[] | TouchEvent, deltaSource: string) {\n const sourceX = (deltaSource + 'X') as 'pageX'\n const sourceY = (deltaSource + 'Y') as 'pageY'\n const touches = 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\nexport function getPointerType (pointer: { pointerType?: string, identifier?: number, type?: string }) {\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 dom.Touch\n ? 'touch'\n : 'mouse'\n}\n\n// [ event.target, event.currentTarget ]\nexport function getEventTargets (event: Event) {\n const path = is.func(event.composedPath)\n ? (event.composedPath() as Element[])\n : ((event as unknown) as { path: Element[] }).path\n\n return [\n domUtils.getActualElement(path ? path[0] : (event.target as Element)),\n domUtils.getActualElement(event.currentTarget as Element),\n ]\n}\n\nexport function newCoords (): CoordsSetMember {\n return {\n page: { x: 0, y: 0 },\n client: { x: 0, y: 0 },\n timeStamp: 0,\n }\n}\n\nexport function coordsToEvent (coords: MockCoords) {\n const event = {\n coords,\n get page () {\n return this.coords.page\n },\n get client () {\n return this.coords.client\n },\n get timeStamp () {\n return this.coords.timeStamp\n },\n get pageX () {\n return this.coords.page.x\n },\n get pageY () {\n return this.coords.page.y\n },\n get clientX () {\n return this.coords.client.x\n },\n get clientY () {\n return this.coords.client.y\n },\n get pointerId () {\n return this.coords.pointerId\n },\n get target () {\n return this.coords.target\n },\n get type () {\n return this.coords.type\n },\n get pointerType () {\n return this.coords.pointerType\n },\n get buttons () {\n return this.coords.buttons\n },\n preventDefault () {},\n }\n\n return event as typeof event & PointerType & PointerEventType\n}\n\nexport interface MockCoords {\n page: Point\n client: Point\n timeStamp?: number\n pointerId?: any\n target?: any\n type?: string\n pointerType?: string\n buttons?: number\n}\n\nexport { pointerExtend }\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { Interaction, InteractionProxy } from '@interactjs/core/Interaction'\nimport type { ActionName } from '@interactjs/core/scope'\n\nexport class BaseEvent<T extends ActionName | null = never> {\n type: string\n target: EventTarget\n currentTarget: Node\n interactable: Interactable\n _interaction: Interaction<T>\n timeStamp: any\n immediatePropagationStopped = false\n propagationStopped = false\n\n constructor (interaction: Interaction<T>) {\n this._interaction = interaction\n }\n\n preventDefault () {}\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n\n /**\n * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n}\n\n// defined outside of class definition to avoid assignment of undefined during\n// construction\nexport interface BaseEvent<T extends ActionName> {\n interaction: InteractionProxy<T>\n}\n\n// getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\nObject.defineProperty(BaseEvent.prototype, 'interaction', {\n get (this: BaseEvent) {\n return this._interaction._proxy\n },\n set (this: BaseEvent) {},\n})\n","type Filter<T> = (element: T, index: number, array: T[]) => boolean\n\nexport const contains = <T>(array: T[], target: T) => array.indexOf(target) !== -1\n\nexport const remove = <T>(array: T[], target: T) => array.splice(array.indexOf(target), 1)\n\nexport const merge = <T, U>(target: Array<T | U>, source: U[]) => {\n for (const item of source) {\n target.push(item)\n }\n\n return target\n}\n\nexport const from = <T = any>(source: ArrayLike<T>) => merge([] as T[], source as T[])\n\nexport const findIndex = <T>(array: T[], func: Filter<T>) => {\n for (let i = 0; i < array.length; i++) {\n if (func(array[i], i, array)) {\n return i\n }\n }\n\n return -1\n}\n\nexport const find = <T = any>(array: T[], func: Filter<T>) => array[findIndex(array, func)]\n","import { BaseEvent } from '@interactjs/core/BaseEvent'\nimport type { InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { Interactable } from '@interactjs/core/Interactable'\nimport type { Element } from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\n\nimport type { DropState } from './plugin'\n\nexport class DropEvent extends BaseEvent<'drag'> {\n target: Element\n dropzone: Interactable\n dragEvent: InteractEvent<'drag'>\n relatedTarget: Element\n draggable: Interactable\n timeStamp: number\n propagationStopped = false\n immediatePropagationStopped = false\n\n /**\n * Class of events fired on dropzones during drags with acceptable targets.\n */\n constructor (dropState: DropState, dragEvent: InteractEvent<'drag'>, type: string) {\n super(dragEvent._interaction)\n\n const { element, dropzone } = type === 'dragleave' ? dropState.prev : dropState.cur\n\n this.type = type\n this.target = element\n this.currentTarget = element\n this.dropzone = dropzone\n this.dragEvent = dragEvent\n this.relatedTarget = dragEvent.target\n this.draggable = dragEvent.interactable\n this.timeStamp = dragEvent.timeStamp\n }\n\n /**\n * If this is a `dropactivate` event, the dropzone element will be\n * deactivated.\n *\n * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the\n * dropzone element and more.\n */\n reject () {\n const { dropState } = this._interaction\n\n if (\n this.type !== 'dropactivate' &&\n (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)\n ) {\n return\n }\n\n dropState.prev.dropzone = this.dropzone\n dropState.prev.element = this.target\n\n dropState.rejected = true\n dropState.events.enter = null\n\n this.stopImmediatePropagation()\n\n if (this.type === 'dropactivate') {\n const activeDrops = dropState.activeDrops\n const index = arr.findIndex(\n activeDrops,\n ({ dropzone, element }) => dropzone === this.dropzone && element === this.target,\n )\n\n dropState.activeDrops.splice(index, 1)\n\n const deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate')\n\n deactivateEvent.dropzone = this.dropzone\n deactivateEvent.target = this.target\n\n this.dropzone.fire(deactivateEvent)\n } else {\n this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave'))\n }\n }\n\n preventDefault () {}\n\n stopPropagation () {\n this.propagationStopped = true\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n}\n","import type { EventPhase, InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { Interactable } from '@interactjs/core/Interactable'\nimport type { Interaction, DoPhaseArg } from '@interactjs/core/Interaction'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type { DropzoneOptions, Element, PointerEventType, Rect } from '@interactjs/types/index'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\nimport is from '@interactjs/utils/is'\nimport normalizeListeners from '@interactjs/utils/normalizeListeners'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\nimport type { DragEvent } from '../drag/plugin'\nimport drag from '../drag/plugin'\n\nimport { DropEvent } from './DropEvent'\n\nexport interface DropzoneMethod {\n (this: Interactable, options: DropzoneOptions | boolean): Interactable\n (): DropzoneOptions\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n dropzone: DropzoneMethod\n dropCheck: (\n dragEvent: InteractEvent,\n event: PointerEventType,\n draggable: Interactable,\n draggableElement: Element,\n dropElemen: Element,\n rect: any,\n ) => boolean\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n dropState?: DropState\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface InteractEvent {\n prevDropzone?: Interactable\n dropzone?: Interactable\n dragEnter?: Element\n dragLeave?: Element\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface ActionDefaults {\n drop: DropzoneOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n drop?: typeof drop\n }\n\n interface Scope {\n dynamicDrop?: boolean\n }\n\n interface SignalArgs {\n 'actions/drop:start': DropSignalArg\n 'actions/drop:move': DropSignalArg\n 'actions/drop:end': DropSignalArg\n }\n}\n\ndeclare module '@interactjs/core/InteractStatic' {\n interface InteractStatic {\n dynamicDrop: (this: InteractStatic, newValue?: boolean) => boolean | this\n }\n}\n\ninterface DropSignalArg {\n interaction: Interaction<'drag'>\n dragEvent: DragEvent\n}\n\nexport interface ActiveDrop {\n dropzone: Interactable\n element: Element\n rect: Rect\n}\n\nexport interface DropState {\n cur: {\n // the dropzone a drag target might be dropped into\n dropzone: Interactable\n // the element at the time of checking\n element: Element\n }\n prev: {\n // the dropzone that was recently dragged away from\n dropzone: Interactable\n // the element at the time of checking\n element: Element\n }\n // wheather the potential drop was rejected from a listener\n rejected: boolean\n // the drop events related to the current drag event\n events: FiredDropEvents\n activeDrops: ActiveDrop[]\n}\n\nfunction install (scope: Scope) {\n const {\n actions,\n /** @lends module:interact */\n interactStatic: interact,\n /** @lends Interactable */\n Interactable,\n defaults,\n } = scope\n\n scope.usePlugin(drag)\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 {object | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.dropzone = function (this: Interactable, options?: DropzoneOptions | boolean) {\n return dropzoneMethod(this, options)\n } as Interactable['dropzone']\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 Interactable.prototype.dropCheck = function (\n this: Interactable,\n dragEvent,\n event,\n draggable,\n draggableElement,\n dropElement,\n rect,\n ) {\n return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect)\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 */\n interact.dynamicDrop = function (newValue?: boolean) {\n if (is.bool(newValue)) {\n // if (dragging && scope.dynamicDrop !== newValue && !newValue) {\n // calcRects(dropzones)\n // }\n\n scope.dynamicDrop = newValue\n\n return interact\n }\n return scope.dynamicDrop\n }\n\n extend(actions.phaselessTypes, {\n dragenter: true,\n dragleave: true,\n dropactivate: true,\n dropdeactivate: true,\n dropmove: true,\n drop: true,\n })\n actions.methodDict.drop = 'dropzone'\n\n scope.dynamicDrop = false\n\n defaults.actions.drop = drop.defaults\n}\n\nfunction collectDrops ({ interactables }: Scope, draggableElement: Element) {\n const drops: ActiveDrop[] = []\n\n // collect all dropzones and their elements which qualify for a drop\n for (const dropzone of interactables.list) {\n if (!dropzone.options.drop.enabled) {\n continue\n }\n\n const accept = dropzone.options.drop.accept\n\n // test the draggable draggableElement against the dropzone's accept setting\n if (\n (is.element(accept) && accept !== draggableElement) ||\n (is.string(accept) && !domUtils.matchesSelector(draggableElement, accept)) ||\n (is.func(accept) && !accept({ dropzone, draggableElement }))\n ) {\n continue\n }\n\n // query for new elements if necessary\n const dropElements = (is.string(dropzone.target)\n ? dropzone._context.querySelectorAll(dropzone.target)\n : is.array(dropzone.target)\n ? dropzone.target\n : [dropzone.target]) as Element[]\n\n for (const dropzoneElement of dropElements) {\n if (dropzoneElement !== draggableElement) {\n drops.push({\n dropzone,\n element: dropzoneElement,\n rect: dropzone.getRect(dropzoneElement),\n })\n }\n }\n }\n\n return drops\n}\n\nfunction fireActivationEvents (activeDrops: ActiveDrop[], event: DropEvent) {\n // loop through all active dropzones and trigger event\n for (const { dropzone, element } of activeDrops.slice()) {\n event.dropzone = dropzone\n\n // set current element as event target\n event.target = element\n dropzone.fire(event)\n event.propagationStopped = event.immediatePropagationStopped = false\n }\n}\n\n// return a new array of possible drops. getActiveDrops should always be\n// called when a drag has just started or a drag event happens while\n// dynamicDrop is true\nfunction getActiveDrops (scope: Scope, dragElement: Element) {\n // get dropzones and their elements that could receive the draggable\n const activeDrops = collectDrops(scope, dragElement)\n\n for (const activeDrop of activeDrops) {\n activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element)\n }\n\n return activeDrops\n}\n\nfunction getDrop (\n { dropState, interactable: draggable, element: dragElement }: Partial<Interaction>,\n dragEvent,\n pointerEvent,\n) {\n const validDrops = []\n\n // collect all dropzones and their elements which qualify for a drop\n for (const { dropzone, element: dropzoneElement, rect } of dropState.activeDrops) {\n validDrops.push(\n dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, rect)\n ? dropzoneElement\n : null,\n )\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = domUtils.indexOfDeepestElement(validDrops)\n\n return dropState.activeDrops[dropIndex] || null\n}\n\nfunction getDropEvents (interaction: Interaction, _pointerEvent, dragEvent: DragEvent) {\n const { dropState } = interaction\n const dropEvents = {\n enter: null,\n leave: null,\n activate: null,\n deactivate: null,\n move: null,\n drop: null,\n }\n\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = new DropEvent(dropState, dragEvent, 'dropactivate')\n\n dropEvents.activate.target = null\n dropEvents.activate.dropzone = null\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = new DropEvent(dropState, dragEvent, 'dropdeactivate')\n\n dropEvents.deactivate.target = null\n dropEvents.deactivate.dropzone = null\n }\n\n if (dropState.rejected) {\n return dropEvents\n }\n\n if (dropState.cur.element !== dropState.prev.element) {\n // if there was a previous dropzone, create a dragleave event\n if (dropState.prev.dropzone) {\n dropEvents.leave = new DropEvent(dropState, dragEvent, 'dragleave')\n\n dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element\n dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone\n }\n // if dropzone is not null, create a dragenter event\n if (dropState.cur.dropzone) {\n dropEvents.enter = new DropEvent(dropState, dragEvent, 'dragenter')\n\n dragEvent.dragEnter = dropState.cur.element\n dragEvent.dropzone = dropState.cur.dropzone\n }\n }\n\n if (dragEvent.type === 'dragend' && dropState.cur.dropzone) {\n dropEvents.drop = new DropEvent(dropState, dragEvent, 'drop')\n\n dragEvent.dropzone = dropState.cur.dropzone\n dragEvent.relatedTarget = dropState.cur.element\n }\n if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) {\n dropEvents.move = new DropEvent(dropState, dragEvent, 'dropmove')\n\n dropEvents.move.dragmove = dragEvent\n dragEvent.dropzone = dropState.cur.dropzone\n }\n\n return dropEvents\n}\n\ntype FiredDropEvents = Partial<\nRecord<'leave' | 'enter' | 'move' | 'drop' | 'activate' | 'deactivate', DropEvent>\n>\n\nfunction fireDropEvents (interaction: Interaction, events: FiredDropEvents) {\n const { dropState } = interaction\n const { activeDrops, cur, prev } = dropState\n\n if (events.leave) {\n prev.dropzone.fire(events.leave)\n }\n if (events.enter) {\n cur.dropzone.fire(events.enter)\n }\n if (events.move) {\n cur.dropzone.fire(events.move)\n }\n if (events.drop) {\n cur.dropzone.fire(events.drop)\n }\n\n if (events.deactivate) {\n fireActivationEvents(activeDrops, events.deactivate)\n }\n\n dropState.prev.dropzone = cur.dropzone\n dropState.prev.element = cur.element\n}\n\nfunction onEventCreated ({ interaction, iEvent, event }: DoPhaseArg<'drag', EventPhase>, scope: Scope) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') {\n return\n }\n\n const { dropState } = interaction\n\n if (scope.dynamicDrop) {\n dropState.activeDrops = getActiveDrops(scope, interaction.element)\n }\n\n const dragEvent = iEvent\n const dropResult = getDrop(interaction, dragEvent, event)\n\n // update rejected status\n dropState.rejected =\n dropState.rejected &&\n !!dropResult &&\n dropResult.dropzone === dropState.cur.dropzone &&\n dropResult.element === dropState.cur.element\n\n dropState.cur.dropzone = dropResult && dropResult.dropzone\n dropState.cur.element = dropResult && dropResult.element\n\n dropState.events = getDropEvents(interaction, event, dragEvent)\n}\n\nfunction dropzoneMethod(interactable: Interactable): DropzoneOptions\nfunction dropzoneMethod(interactable: Interactable, options: DropzoneOptions | boolean): Interactable\nfunction dropzoneMethod (interactable: Interactable, options?: DropzoneOptions | boolean) {\n if (is.object(options)) {\n interactable.options.drop.enabled = options.enabled !== false\n\n if (options.listeners) {\n const normalized = normalizeListeners(options.listeners)\n // rename 'drop' to '' as it will be prefixed with 'drop'\n const corrected = Object.keys(normalized).reduce((acc, type) => {\n const correctedType = /^(enter|leave)/.test(type)\n ? `drag${type}`\n : /^(activate|deactivate|move)/.test(type)\n ? `drop${type}`\n : type\n\n acc[correctedType] = normalized[type]\n\n return acc\n }, {})\n\n interactable.off(interactable.options.drop.listeners)\n interactable.on(corrected)\n interactable.options.drop.listeners = corrected\n }\n\n if (is.func(options.ondrop)) {\n interactable.on('drop', options.ondrop)\n }\n if (is.func(options.ondropactivate)) {\n interactable.on('dropactivate', options.ondropactivate)\n }\n if (is.func(options.ondropdeactivate)) {\n interactable.on('dropdeactivate', options.ondropdeactivate)\n }\n if (is.func(options.ondragenter)) {\n interactable.on('dragenter', options.ondragenter)\n }\n if (is.func(options.ondragleave)) {\n interactable.on('dragleave', options.ondragleave)\n }\n if (is.func(options.ondropmove)) {\n interactable.on('dropmove', options.ondropmove)\n }\n\n if (/^(pointer|center)$/.test(options.overlap as string)) {\n interactable.options.drop.overlap = options.overlap\n } else if (is.number(options.overlap)) {\n interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0)\n }\n if ('accept' in options) {\n interactable.options.drop.accept = options.accept\n }\n if ('checker' in options) {\n interactable.options.drop.checker = options.checker\n }\n\n return interactable\n }\n\n if (is.bool(options)) {\n interactable.options.drop.enabled = options\n\n return interactable\n }\n\n return interactable.options.drop\n}\n\nfunction dropCheckMethod (\n interactable: Interactable,\n dragEvent: InteractEvent,\n event: PointerEventType,\n draggable: Interactable,\n draggableElement: Element,\n dropElement: Element,\n rect: any,\n) {\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 || interactable.getRect(dropElement))) {\n return interactable.options.drop.checker\n ? interactable.options.drop.checker(\n dragEvent,\n event,\n dropped,\n interactable,\n dropElement,\n draggable,\n draggableElement,\n )\n : false\n }\n\n const dropOverlap = interactable.options.drop.overlap\n\n if (dropOverlap === 'pointer') {\n const origin = getOriginXY(draggable, draggableElement, 'drag')\n const page = pointerUtils.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 && is.number(dropOverlap)) {\n const overlapArea =\n 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 (interactable.options.drop.checker) {\n dropped = interactable.options.drop.checker(\n dragEvent,\n event,\n dropped,\n interactable,\n dropElement,\n draggable,\n draggableElement,\n )\n }\n\n return dropped\n}\n\nconst drop: Plugin = {\n id: 'actions/drop',\n install,\n listeners: {\n 'interactions:before-action-start': ({ interaction }) => {\n if (interaction.prepared.name !== 'drag') {\n return\n }\n\n interaction.dropState = {\n cur: {\n dropzone: null,\n element: null,\n },\n prev: {\n dropzone: null,\n element: null,\n },\n rejected: null,\n events: null,\n activeDrops: [],\n }\n },\n\n 'interactions:after-action-start': (\n { interaction, event, iEvent: dragEvent }: DoPhaseArg<'drag', EventPhase>,\n scope,\n ) => {\n if (interaction.prepared.name !== 'drag') {\n return\n }\n\n const { dropState } = interaction\n\n // reset active dropzones\n dropState.activeDrops = null\n dropState.events = null\n dropState.activeDrops = getActiveDrops(scope, interaction.element)\n dropState.events = getDropEvents(interaction, event, dragEvent)\n\n if (dropState.events.activate) {\n fireActivationEvents(dropState.activeDrops, dropState.events.activate)\n scope.fire('actions/drop:start', { interaction, dragEvent })\n }\n },\n\n 'interactions:action-move': onEventCreated,\n\n 'interactions:after-action-move': (\n { interaction, iEvent: dragEvent }: DoPhaseArg<'drag', EventPhase>,\n scope,\n ) => {\n if (interaction.prepared.name !== 'drag') {\n return\n }\n\n fireDropEvents(interaction, interaction.dropState.events)\n\n scope.fire('actions/drop:move', { interaction, dragEvent })\n interaction.dropState.events = {}\n },\n\n 'interactions:action-end': (arg: DoPhaseArg<'drag', EventPhase>, scope) => {\n if (arg.interaction.prepared.name !== 'drag') {\n return\n }\n\n const { interaction, iEvent: dragEvent } = arg\n\n onEventCreated(arg, scope)\n fireDropEvents(interaction, interaction.dropState.events)\n scope.fire('actions/drop:end', { interaction, dragEvent })\n },\n\n 'interactions:stop': ({ interaction }) => {\n if (interaction.prepared.name !== 'drag') {\n return\n }\n\n const { dropState } = interaction\n\n if (dropState) {\n dropState.activeDrops = null\n dropState.events = null\n dropState.cur.dropzone = null\n dropState.cur.element = null\n dropState.prev.dropzone = null\n dropState.prev.element = null\n dropState.rejected = false\n }\n },\n },\n getActiveDrops,\n getDrop,\n getDropEvents,\n fireDropEvents,\n defaults: {\n enabled: false,\n accept: null,\n overlap: 'pointer',\n } as DropzoneOptions,\n}\n\nexport default drop\n","import type { InteractEvent, EventPhase } from '@interactjs/core/InteractEvent'\nimport type { Interaction, DoPhaseArg } from '@interactjs/core/Interaction'\nimport type { Options } from '@interactjs/core/options'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type { ActionMethod, GesturableOptions, Rect, PointerType } from '@interactjs/types/index'\nimport is from '@interactjs/utils/is'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\nexport type GesturableMethod = ActionMethod<GesturableOptions>\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n gesture?: {\n angle: number // angle from first to second touch\n distance: number\n scale: number // gesture.distance / gesture.startDistance\n startAngle: number // angle of line joining two touches\n startDistance: number // distance between two touches of touchStart\n }\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n gesturable: GesturableMethod\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface ActionDefaults {\n gesture: GesturableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n gesture?: typeof gesture\n }\n}\n\nexport interface GestureEvent extends InteractEvent<'gesture'> {\n distance: number\n angle: number\n da: number // angle change\n scale: number // ratio of distance start to current event\n ds: number // scale change\n box: Rect // enclosing box of all points\n touches: PointerType[]\n}\n\nexport interface GestureSignalArg extends DoPhaseArg<'gesture', EventPhase> {\n iEvent: GestureEvent\n interaction: Interaction<'gesture'>\n}\n\nfunction install (scope: Scope) {\n const { actions, Interactable, defaults } = scope\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 */\n Interactable.prototype.gesturable = function (\n this: InstanceType<typeof Interactable>,\n options: GesturableOptions | boolean,\n ) {\n if (is.object(options)) {\n this.options.gesture.enabled = options.enabled !== false\n this.setPerAction('gesture', options)\n this.setOnEvents('gesture', options)\n\n return this\n }\n\n if (is.bool(options)) {\n this.options.gesture.enabled = options\n\n return this\n }\n\n return this.options.gesture as Options\n } as GesturableMethod\n\n actions.map.gesture = gesture\n actions.methodDict.gesture = 'gesturable'\n\n defaults.actions.gesture = gesture.defaults\n}\n\nfunction updateGestureProps ({ interaction, iEvent, phase }: GestureSignalArg) {\n if (interaction.prepared.name !== 'gesture') return\n\n const pointers = interaction.pointers.map((p) => p.pointer)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const deltaSource = interaction.interactable.options.deltaSource\n\n iEvent.touches = [pointers[0], pointers[1]]\n\n if (starting) {\n iEvent.distance = pointerUtils.touchDistance(pointers, deltaSource)\n iEvent.box = pointerUtils.touchBBox(pointers)\n iEvent.scale = 1\n iEvent.ds = 0\n iEvent.angle = pointerUtils.touchAngle(pointers, deltaSource)\n iEvent.da = 0\n\n interaction.gesture.startDistance = iEvent.distance\n interaction.gesture.startAngle = iEvent.angle\n } else if (ending) {\n const prevEvent = interaction.prevEvent as GestureEvent\n\n iEvent.distance = prevEvent.distance\n iEvent.box = prevEvent.box\n iEvent.scale = prevEvent.scale\n iEvent.ds = 0\n iEvent.angle = prevEvent.angle\n iEvent.da = 0\n } else {\n iEvent.distance = pointerUtils.touchDistance(pointers, deltaSource)\n iEvent.box = pointerUtils.touchBBox(pointers)\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance\n iEvent.angle = pointerUtils.touchAngle(pointers, deltaSource)\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale\n iEvent.da = iEvent.angle - interaction.gesture.angle\n }\n\n interaction.gesture.distance = iEvent.distance\n interaction.gesture.angle = iEvent.angle\n\n if (is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) {\n interaction.gesture.scale = iEvent.scale\n }\n}\n\nconst gesture: Plugin = {\n id: 'actions/gesture',\n before: ['actions/drag', 'actions/resize'],\n install,\n listeners: {\n 'interactions:action-start': updateGestureProps,\n 'interactions:action-move': updateGestureProps,\n 'interactions:action-end': updateGestureProps,\n\n 'interactions:new': ({ interaction }) => {\n interaction.gesture = {\n angle: 0,\n distance: 0,\n scale: 1,\n startAngle: 0,\n startDistance: 0,\n }\n },\n\n 'auto-start:check': (arg) => {\n if (arg.interaction.pointers.length < 2) {\n return undefined\n }\n\n const gestureOptions = arg.interactable.options.gesture\n\n if (!(gestureOptions && gestureOptions.enabled)) {\n return undefined\n }\n\n arg.action = { name: 'gesture' }\n\n return false\n },\n },\n\n defaults: {},\n\n getCursor () {\n return ''\n },\n}\n\nexport default gesture\n","import type { EventPhase, InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { Interactable } from '@interactjs/core/Interactable'\nimport type { ActionProps, Interaction } from '@interactjs/core/Interaction'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type {\n ActionMethod,\n ResizableOptions,\n FullRect,\n OrBoolean,\n Point,\n Rect,\n} from '@interactjs/types/index'\nimport * as dom from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\n\nexport type EdgeName = 'top' | 'left' | 'bottom' | 'right'\n\nexport type ResizableMethod = ActionMethod<ResizableOptions>\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n resizable: ResizableMethod\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n resizeAxes: 'x' | 'y' | 'xy'\n resizeStartAspectRatio: number\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface ActionDefaults {\n resize: ResizableOptions\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface ActionMap {\n resize?: typeof resize\n }\n}\n\nexport interface ResizeEvent<P extends EventPhase = EventPhase> extends InteractEvent<'resize', P> {\n deltaRect?: FullRect\n edges?: ActionProps['edges']\n}\n\nfunction install (scope: Scope) {\n const {\n actions,\n browser,\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n defaults,\n } = scope\n\n // Less Precision with touch input\n\n resize.cursors = initCursors(browser)\n resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10\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 */\n Interactable.prototype.resizable = function (this: Interactable, options: ResizableOptions | boolean) {\n return resizable(this, options, scope)\n } as ResizableMethod\n\n actions.map.resize = resize\n actions.methodDict.resize = 'resizable'\n\n defaults.actions.resize = resize.defaults\n}\n\nfunction resizeChecker (arg) {\n const { interaction, interactable, element, rect, buttons } = arg\n\n if (!rect) {\n return undefined\n }\n\n const page = extend({}, interaction.coords.cur.page)\n const resizeOptions = interactable.options.resize\n\n if (\n !(resizeOptions && resizeOptions.enabled) ||\n // check mouseButton setting if the pointer is down\n (interaction.pointerIsDown &&\n /mouse|pointer/.test(interaction.pointerType) &&\n (buttons & resizeOptions.mouseButtons) === 0)\n ) {\n return undefined\n }\n\n // if using resize.edges\n if (is.object(resizeOptions.edges)) {\n const resizeEdges = {\n left: false,\n right: false,\n top: false,\n bottom: false,\n }\n\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(\n edge,\n resizeOptions.edges[edge],\n page,\n interaction._latestPointer.eventTarget,\n element,\n rect,\n resizeOptions.margin || resize.defaultMargin,\n )\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 arg.action = {\n name: 'resize',\n edges: resizeEdges,\n }\n }\n } else {\n const right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin\n const bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin\n\n if (right || bottom) {\n arg.action = {\n name: 'resize',\n axes: (right ? 'x' : '') + (bottom ? 'y' : ''),\n }\n }\n }\n\n return arg.action ? false : undefined\n}\n\nfunction resizable (interactable: Interactable, options: OrBoolean<ResizableOptions> | boolean, scope: Scope) {\n if (is.object(options)) {\n interactable.options.resize.enabled = options.enabled !== false\n interactable.setPerAction('resize', options)\n interactable.setOnEvents('resize', options)\n\n if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {\n interactable.options.resize.axis = options.axis\n } else if (options.axis === null) {\n interactable.options.resize.axis = scope.defaults.actions.resize.axis\n }\n\n if (is.bool(options.preserveAspectRatio)) {\n interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio\n } else if (is.bool(options.square)) {\n interactable.options.resize.square = options.square\n }\n\n return interactable\n }\n if (is.bool(options)) {\n interactable.options.resize.enabled = options\n\n return interactable\n }\n return interactable.options.resize\n}\n\nfunction checkResizeEdge (\n name: string,\n value: any,\n page: Point,\n element: Node,\n interactableElement: Element,\n rect: Rect,\n margin: number,\n) {\n // false, '', undefined, null\n if (!value) {\n return false\n }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = is.number(rect.width) ? rect.width : rect.right - rect.left\n const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top\n\n // don't use margin greater than half the relevent dimension\n margin = Math.min(margin, Math.abs((name === 'left' || name === 'right' ? width : height) / 2))\n\n if (width < 0) {\n if (name === 'left') {\n name = 'right'\n } else if (name === 'right') {\n name = 'left'\n }\n }\n if (height < 0) {\n if (name === 'top') {\n name = 'bottom'\n } else if (name === 'bottom') {\n name = 'top'\n }\n }\n\n if (name === 'left') {\n return page.x < (width >= 0 ? rect.left : rect.right) + margin\n }\n if (name === 'top') {\n return page.y < (height >= 0 ? rect.top : rect.bottom) + margin\n }\n\n if (name === 'right') {\n return page.x > (width >= 0 ? rect.right : rect.left) - margin\n }\n if (name === 'bottom') {\n return page.y > (height >= 0 ? rect.bottom : rect.top) - margin\n }\n }\n\n // the remaining checks require an element\n if (!is.element(element)) {\n return false\n }\n\n return 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 dom.matchesUpTo(element, value, interactableElement)\n}\n\n/* eslint-disable multiline-ternary */\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nfunction initCursors (browser: typeof import('@interactjs/utils/browser').default) {\n return browser.isIe9\n ? {\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 : {\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/* eslint-enable multiline-ternary */\n\nfunction start ({ iEvent, interaction }: { iEvent: InteractEvent<any, any>, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n return\n }\n\n const resizeEvent = iEvent as ResizeEvent\n const rect = interaction.rect\n\n interaction._rects = {\n start: extend({}, rect),\n corrected: extend({}, rect),\n previous: extend({}, rect),\n delta: {\n left: 0,\n right: 0,\n width: 0,\n top: 0,\n bottom: 0,\n height: 0,\n },\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction move ({ iEvent, interaction }: { iEvent: InteractEvent<any, any>, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) return\n\n const resizeEvent = iEvent as ResizeEvent\n const resizeOptions = interaction.interactable.options.resize\n const invert = resizeOptions.invert\n const invertible = invert === 'reposition' || invert === 'negate'\n\n const current = interaction.rect\n const { start: startRect, corrected, delta: deltaRect, previous } = interaction._rects\n\n extend(previous, corrected)\n\n if (invertible) {\n // if invertible, copy the current rect\n extend(corrected, current)\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n if (corrected.top > corrected.bottom) {\n const swap = corrected.top\n\n corrected.top = corrected.bottom\n corrected.bottom = swap\n }\n if (corrected.left > corrected.right) {\n const swap = corrected.left\n\n corrected.left = corrected.right\n corrected.right = swap\n }\n }\n } else {\n // if not invertible, restrict to minimum of 0x0 rect\n corrected.top = Math.min(current.top, startRect.bottom)\n corrected.bottom = Math.max(current.bottom, startRect.top)\n corrected.left = Math.min(current.left, startRect.right)\n corrected.right = Math.max(current.right, startRect.left)\n }\n\n corrected.width = corrected.right - corrected.left\n corrected.height = corrected.bottom - corrected.top\n\n for (const edge in corrected) {\n deltaRect[edge] = corrected[edge] - previous[edge]\n }\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = corrected\n resizeEvent.deltaRect = deltaRect\n}\n\nfunction end ({ iEvent, interaction }: { iEvent: InteractEvent<any, any>, interaction: Interaction }) {\n if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) return\n\n const resizeEvent = iEvent as ResizeEvent\n\n resizeEvent.edges = interaction.prepared.edges\n resizeEvent.rect = interaction._rects.corrected\n resizeEvent.deltaRect = interaction._rects.delta\n}\n\nfunction updateEventAxes ({\n iEvent,\n interaction,\n}: {\n iEvent: InteractEvent<any, any>\n interaction: Interaction\n}) {\n if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) return\n\n const options = interaction.interactable.options\n const resizeEvent = iEvent as ResizeEvent\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = resizeEvent.delta.y\n } else {\n resizeEvent.delta.y = resizeEvent.delta.x\n }\n resizeEvent.axes = 'xy'\n } else {\n resizeEvent.axes = interaction.resizeAxes\n\n if (interaction.resizeAxes === 'x') {\n resizeEvent.delta.y = 0\n } else if (interaction.resizeAxes === 'y') {\n resizeEvent.delta.x = 0\n }\n }\n}\n\nconst resize: Plugin = {\n id: 'actions/resize',\n before: ['actions/drag'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.resizeAxes = 'xy'\n },\n\n 'interactions:action-start': (arg) => {\n start(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-move': (arg) => {\n move(arg)\n updateEventAxes(arg)\n },\n 'interactions:action-end': end,\n 'auto-start:check': resizeChecker,\n },\n\n defaults: {\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 } as ResizableOptions,\n\n cursors: null as ReturnType<typeof initCursors>,\n\n getCursor ({ edges, axis, name }: ActionProps) {\n const cursors = resize.cursors\n let result: string = null\n\n if (axis) {\n result = cursors[name + axis]\n } else if (edges) {\n let cursorKey = ''\n\n for (const edge of ['top', 'bottom', 'left', 'right']) {\n if (edges[edge]) {\n cursorKey += edge\n }\n }\n\n result = cursors[cursorKey]\n }\n\n return result\n },\n\n defaultMargin: null as number,\n}\n\nexport default resize\n","import type { Scope } from '@interactjs/core/scope'\n\nimport drag from './drag/plugin'\nimport drop from './drop/plugin'\nimport gesture from './gesture/plugin'\nimport resize from './resize/plugin'\n\nexport default {\n id: 'actions',\n install (scope: Scope) {\n scope.usePlugin(gesture)\n scope.usePlugin(resize)\n scope.usePlugin(drag)\n scope.usePlugin(drop)\n },\n}\n","let lastTime = 0\nlet request: typeof requestAnimationFrame\nlet cancel: typeof cancelAnimationFrame\n\nfunction init (global: Window | typeof globalThis) {\n request = global.requestAnimationFrame\n cancel = global.cancelAnimationFrame\n\n if (!request) {\n const vendors = ['ms', 'moz', 'webkit', 'o']\n\n for (const vendor of vendors) {\n request = global[`${vendor}RequestAnimationFrame` as 'requestAnimationFrame']\n cancel =\n global[`${vendor}CancelAnimationFrame` as 'cancelAnimationFrame'] ||\n global[`${vendor}CancelRequestAnimationFrame` as 'cancelAnimationFrame']\n }\n }\n\n request = request && request.bind(global)\n cancel = cancel && cancel.bind(global)\n\n if (!request) {\n request = (callback) => {\n const currTime = Date.now()\n const timeToCall = Math.max(0, 16 - (currTime - lastTime))\n const token = global.setTimeout(() => {\n // eslint-disable-next-line node/no-callback-literal\n callback(currTime + timeToCall)\n }, timeToCall)\n\n lastTime = currTime + timeToCall\n return token as any\n }\n\n cancel = (token) => clearTimeout(token)\n }\n}\n\nexport default {\n request: (callback: FrameRequestCallback) => request(callback),\n cancel: (token: number) => cancel(token),\n init,\n}\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type Interaction from '@interactjs/core/Interaction'\nimport type { ActionName, Scope, Plugin } from '@interactjs/core/scope'\nimport type { PointerType } from '@interactjs/types/index'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport is from '@interactjs/utils/is'\nimport raf from '@interactjs/utils/raf'\nimport { getStringOptionResult } from '@interactjs/utils/rect'\nimport { getWindow } from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoScroll: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoScroll?: typeof autoScroll\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface PerActionDefaults {\n autoScroll?: AutoScrollOptions\n }\n}\n\nexport interface AutoScrollOptions {\n container?: Window | HTMLElement\n margin?: number\n distance?: number\n interval?: number\n speed?: number\n enabled?: boolean\n}\n\nfunction install (scope: Scope) {\n const { defaults, actions } = scope\n\n scope.autoScroll = autoScroll\n autoScroll.now = () => scope.now()\n\n actions.phaselessTypes.autoscroll = true\n defaults.perAction.autoScroll = autoScroll.defaults\n}\n\nconst autoScroll = {\n defaults: {\n enabled: false,\n margin: 60,\n\n // the item that is scrolled (Window or HTMLElement)\n container: null as AutoScrollOptions['container'],\n\n // the scroll speed in pixels per second\n speed: 300,\n } as AutoScrollOptions,\n\n now: Date.now,\n\n interaction: null as Interaction,\n i: 0, // the handle returned by window.setInterval\n\n // Direction each pulse is to scroll in\n x: 0,\n y: 0,\n\n isScrolling: false,\n prevTime: 0,\n margin: 0,\n speed: 0,\n\n start (interaction: Interaction) {\n autoScroll.isScrolling = true\n raf.cancel(autoScroll.i)\n\n interaction.autoScroll = autoScroll\n autoScroll.interaction = interaction\n autoScroll.prevTime = autoScroll.now()\n autoScroll.i = raf.request(autoScroll.scroll)\n },\n\n stop () {\n autoScroll.isScrolling = false\n if (autoScroll.interaction) {\n autoScroll.interaction.autoScroll = null\n }\n raf.cancel(autoScroll.i)\n },\n\n // scroll the window by the values in scroll.x/y\n scroll () {\n const { interaction } = autoScroll\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, element)\n const now = autoScroll.now()\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 const scrollBy = {\n x: autoScroll.x * s,\n y: autoScroll.y * s,\n }\n\n if (scrollBy.x || scrollBy.y) {\n const prevScroll = getScroll(container)\n\n if (is.window(container)) {\n container.scrollBy(scrollBy.x, scrollBy.y)\n } else if (container) {\n container.scrollLeft += scrollBy.x\n container.scrollTop += scrollBy.y\n }\n\n const curScroll = getScroll(container)\n const delta = {\n x: curScroll.x - prevScroll.x,\n y: curScroll.y - prevScroll.y,\n }\n\n if (delta.x || delta.y) {\n interactable.fire({\n type: 'autoscroll',\n target: element,\n interactable,\n delta,\n interaction,\n container,\n })\n }\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 (interactable: Interactable, actionName: ActionName) {\n const options = interactable.options\n\n return options[actionName].autoScroll?.enabled\n },\n onInteractionMove<T extends ActionName> ({\n interaction,\n pointer,\n }: {\n interaction: Interaction<T>\n pointer: PointerType\n }) {\n if (\n !(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))\n ) {\n return\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0\n return\n }\n\n let top: boolean\n let right: boolean\n let bottom: boolean\n let left: boolean\n\n const { interactable, element } = interaction\n const actionName = interaction.prepared.name\n const options = interactable.options[actionName].autoScroll\n const container = getContainer(options.container, interactable, 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 } 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\nexport function getContainer (value: any, interactable: Interactable, element: Element) {\n return (\n (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element)\n )\n}\n\nexport function getScroll (container: any) {\n if (is.window(container)) {\n container = window.document.body\n }\n\n return { x: container.scrollLeft, y: container.scrollTop }\n}\n\nexport function getScrollSize (container: any) {\n if (is.window(container)) {\n container = window.document.body\n }\n\n return { x: container.scrollWidth, y: container.scrollHeight }\n}\n\nexport function getScrollSizeDelta<T extends ActionName> (\n {\n interaction,\n element,\n }: {\n interaction: Partial<Interaction<T>>\n element: Element\n },\n func: any,\n) {\n const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll\n\n if (!scrollOptions || !scrollOptions.enabled) {\n func()\n return { x: 0, y: 0 }\n }\n\n const scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element)\n\n const prevSize = getScroll(scrollContainer)\n func()\n const curSize = getScroll(scrollContainer)\n\n return {\n x: curSize.x - prevSize.x,\n y: curSize.y - prevSize.y,\n }\n}\n\nconst autoScrollPlugin: Plugin = {\n id: 'auto-scroll',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoScroll = null\n },\n\n 'interactions:destroy': ({ interaction }) => {\n interaction.autoScroll = null\n autoScroll.stop()\n if (autoScroll.interaction) {\n autoScroll.interaction = null\n }\n },\n\n 'interactions:stop': autoScroll.stop,\n\n 'interactions:action-move': (arg: any) => autoScroll.onInteractionMove(arg),\n },\n}\n\nexport default autoScrollPlugin\n","import type { ActionProps } from '@interactjs/core/Interaction'\nimport type { ActionName } from '@interactjs/core/scope'\n\nimport { window } from './window'\n\nexport function warnOnce<T> (this: T, method: (...args: any[]) => any, message: string) {\n let warned = false\n\n return function (this: T) {\n if (!warned) {\n ;(window as any).console.warn(message)\n warned = true\n }\n\n return method.apply(this, arguments)\n }\n}\n\nexport function copyAction<T extends ActionName> (dest: ActionProps<any>, src: ActionProps<T>) {\n dest.name = src.name\n dest.axis = src.axis\n dest.edges = src.edges\n\n return dest\n}\n\nexport const sign = (n: number) => (n >= 0 ? 1 : -1)\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { Interaction, ActionProps } from '@interactjs/core/Interaction'\nimport type { Scope } from '@interactjs/core/scope'\nimport type { PointerType, PointerEventType, Element } from '@interactjs/types/index'\nimport is from '@interactjs/utils/is'\nimport { warnOnce } from '@interactjs/utils/misc'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n getAction: (\n this: Interactable,\n pointer: PointerType,\n event: PointerEventType,\n interaction: Interaction,\n element: Element,\n ) => ActionProps | null\n styleCursor: typeof styleCursor\n actionChecker: typeof actionChecker\n ignoreFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n allowFrom: {\n (...args: any[]): Interactable\n (): boolean\n }\n }\n}\n\nfunction install (scope: Scope) {\n const {\n /** @lends Interactable */\n Interactable, // tslint:disable-line no-shadowed-variable\n } = scope\n\n Interactable.prototype.getAction = function getAction (\n this: Interactable,\n pointer: PointerType,\n event: PointerEventType,\n interaction: Interaction,\n element: Element,\n ): ActionProps {\n const action = defaultActionChecker(this, event, interaction, element, scope)\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 * 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 * @deprecated\n * Don't use this method. Instead set the `ignoreFrom` option for each action\n * or for `pointerEvents`\n *\n * ```js\n * interact(targett)\n * .draggable({\n * ignoreFrom: 'input, textarea, a[href]'',\n * })\n * .pointerEvents({\n * ignoreFrom: '[no-pointer]',\n * })\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 */\n Interactable.prototype.ignoreFrom = warnOnce(function (this: Interactable, newValue) {\n return this._backCompatOption('ignoreFrom', newValue)\n }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).')\n\n /**\n *\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 * @deprecated\n * Don't use this method. Instead set the `allowFrom` option for each action\n * or for `pointerEvents`\n *\n * ```js\n * interact(targett)\n * .resizable({\n * allowFrom: '.resize-handle',\n * .pointerEvents({\n * allowFrom: '.handle',,\n * })\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 */\n Interactable.prototype.allowFrom = warnOnce(function (this: Interactable, newValue) {\n return this._backCompatOption('allowFrom', newValue)\n }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).')\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 * Returns 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 */\n Interactable.prototype.actionChecker = actionChecker\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 */\n Interactable.prototype.styleCursor = styleCursor\n}\n\nfunction defaultActionChecker (\n interactable: Interactable,\n event: PointerEventType,\n interaction: Interaction,\n element: Element,\n scope: Scope,\n) {\n const rect = interactable.getRect(element)\n const buttons =\n (event as MouseEvent).buttons ||\n {\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n }[(event as MouseEvent).button as 0 | 1 | 3 | 4]\n const arg = {\n action: null,\n interactable,\n interaction,\n element,\n rect,\n buttons,\n }\n\n scope.fire('auto-start:check', arg)\n\n return arg.action\n}\n\nfunction styleCursor(this: Interactable): boolean\nfunction styleCursor(this: Interactable, newValue: boolean): typeof this\nfunction styleCursor (this: Interactable, newValue?: boolean) {\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\nfunction actionChecker (this: Interactable, checker: any) {\n if (is.func(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\nexport default {\n id: 'auto-start/interactableMethods',\n install,\n}\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { Interaction, ActionProps } from '@interactjs/core/Interaction'\nimport type { Scope, SignalArgs, ActionName, Plugin } from '@interactjs/core/scope'\nimport type { CursorChecker, PointerType, PointerEventType, Element } from '@interactjs/types/index'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport { copyAction } from '@interactjs/utils/misc'\n\nimport InteractableMethods from './InteractableMethods'\n\ndeclare module '@interactjs/core/InteractStatic' {\n export interface InteractStatic {\n maxInteractions: (newValue: any) => any\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n autoStart: AutoStart\n }\n\n interface SignalArgs {\n 'autoStart:before-start': Omit<SignalArgs['interactions:move'], 'interaction'> & {\n interaction: Interaction<ActionName>\n }\n 'autoStart:prepared': { interaction: Interaction }\n 'auto-start:check': CheckSignalArg\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface BaseDefaults {\n actionChecker?: any\n cursorChecker?: any\n styleCursor?: any\n }\n\n interface PerActionDefaults {\n manualStart?: boolean\n max?: number\n maxPerElement?: number\n allowFrom?: string | Element\n ignoreFrom?: string | Element\n cursorChecker?: CursorChecker\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n // TODO: docst\n mouseButtons?: 0 | 1 | 2 | 4 | 8 | 16\n }\n}\n\ninterface CheckSignalArg {\n interactable: Interactable\n interaction: Interaction\n element: Element\n action: ActionProps<ActionName>\n buttons: number\n}\n\nexport interface AutoStart {\n // Allow this many interactions to happen simultaneously\n maxInteractions: number\n withinInteractionLimit: typeof withinInteractionLimit\n cursorElement: Element\n}\n\nfunction install (scope: Scope) {\n const { interactStatic: interact, defaults } = scope\n\n scope.usePlugin(InteractableMethods)\n\n defaults.base.actionChecker = null\n defaults.base.styleCursor = true\n\n extend(defaults.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 /**\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 */\n interact.maxInteractions = (newValue: number) => maxInteractions(newValue, scope)\n\n scope.autoStart = {\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n withinInteractionLimit,\n cursorElement: null,\n }\n}\n\nfunction prepareOnDown (\n { interaction, pointer, event, eventTarget }: SignalArgs['interactions:down'],\n scope: Scope,\n) {\n if (interaction.interacting()) return\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction prepareOnMove (\n { interaction, pointer, event, eventTarget }: SignalArgs['interactions:move'],\n scope: Scope,\n) {\n if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) return\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget as Element, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction startOnMove (arg: SignalArgs['interactions:move'], scope: Scope) {\n const { interaction } = arg\n\n if (\n !interaction.pointerIsDown ||\n interaction.interacting() ||\n !interaction.pointerWasMoved ||\n !interaction.prepared.name\n ) {\n return\n }\n\n scope.fire('autoStart:before-start', arg)\n\n const { interactable } = interaction\n const actionName = (interaction as Interaction<ActionName>).prepared.name\n\n if (actionName && interactable) {\n // check manualStart and interaction limit\n if (\n interactable.options[actionName].manualStart ||\n !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)\n ) {\n interaction.stop()\n } else {\n interaction.start(interaction.prepared, interactable, interaction.element)\n setInteractionCursor(interaction, scope)\n }\n }\n}\n\nfunction clearCursorOnStop ({ interaction }: { interaction: Interaction }, scope: Scope) {\n const { interactable } = interaction\n\n if (interactable && interactable.options.styleCursor) {\n setCursor(interaction.element, '', scope)\n }\n}\n\n// Check if the current interactable supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction<T extends ActionName> (\n action: ActionProps<T>,\n interactable: Interactable,\n element: Element,\n eventTarget: Node,\n scope: Scope,\n) {\n if (\n interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) &&\n interactable.options[action.name].enabled &&\n withinInteractionLimit(interactable, element, action, scope)\n ) {\n return action\n }\n\n return null\n}\n\nfunction validateMatches (\n interaction: Interaction,\n pointer: PointerType,\n event: PointerEventType,\n matches: Interactable[],\n matchElements: Element[],\n eventTarget: Node,\n scope: Scope,\n) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i]\n const matchElement = matchElements[i]\n const matchAction = match.getAction(pointer, event, interaction, matchElement)\n\n if (!matchAction) {\n continue\n }\n\n const action = validateAction<ActionName>(matchAction, match, matchElement, eventTarget, scope)\n\n if (action) {\n return {\n action,\n interactable: match,\n element: matchElement,\n }\n }\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction getActionInfo (\n interaction: Interaction,\n pointer: PointerType,\n event: PointerEventType,\n eventTarget: Node,\n scope: Scope,\n) {\n let matches: Interactable[] = []\n let matchElements: Element[] = []\n\n let element = eventTarget as Element\n\n function pushMatches (interactable: Interactable) {\n matches.push(interactable)\n matchElements.push(element)\n }\n\n while (is.element(element)) {\n matches = []\n matchElements = []\n\n scope.interactables.forEachMatch(element, pushMatches)\n\n const actionInfo = validateMatches(\n interaction,\n pointer,\n event,\n matches,\n matchElements,\n eventTarget,\n scope,\n )\n\n if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) {\n return actionInfo\n }\n\n element = domUtils.parentNode(element) as Element\n }\n\n return { action: null, interactable: null, element: null }\n}\n\nfunction prepare (\n interaction: Interaction,\n {\n action,\n interactable,\n element,\n }: {\n action: ActionProps<any>\n interactable: Interactable\n element: Element\n },\n scope: Scope,\n) {\n action = action || { name: null }\n\n interaction.interactable = interactable\n interaction.element = element\n copyAction(interaction.prepared, action)\n\n interaction.rect = interactable && action.name ? interactable.getRect(element) : null\n\n setInteractionCursor(interaction, scope)\n\n scope.fire('autoStart:prepared', { interaction })\n}\n\nfunction withinInteractionLimit<T extends ActionName> (\n interactable: Interactable,\n element: Element,\n action: ActionProps<T>,\n scope: Scope,\n) {\n const options = interactable.options\n const maxActions = options[action.name].max\n const maxPerElement = options[action.name].maxPerElement\n const autoStartMax = scope.autoStart.maxInteractions\n let activeInteractions = 0\n let interactableCount = 0\n let elementCount = 0\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStartMax)) {\n return false\n }\n\n for (const interaction of scope.interactions.list) {\n const otherAction = interaction.prepared.name\n\n if (!interaction.interacting()) {\n continue\n }\n\n activeInteractions++\n\n if (activeInteractions >= autoStartMax) {\n return false\n }\n\n if (interaction.interactable !== interactable) {\n continue\n }\n\n interactableCount += otherAction === action.name ? 1 : 0\n\n if (interactableCount >= maxActions) {\n return false\n }\n\n if (interaction.element === element) {\n elementCount++\n\n if (otherAction === action.name && elementCount >= maxPerElement) {\n return false\n }\n }\n }\n\n return autoStartMax > 0\n}\n\nfunction maxInteractions (newValue: any, scope: Scope) {\n if (is.number(newValue)) {\n scope.autoStart.maxInteractions = newValue\n\n return this\n }\n\n return scope.autoStart.maxInteractions\n}\n\nfunction setCursor (element: Element, cursor: string, scope: Scope) {\n const { cursorElement: prevCursorElement } = scope.autoStart\n\n if (prevCursorElement && prevCursorElement !== element) {\n prevCursorElement.style.cursor = ''\n }\n\n element.ownerDocument.documentElement.style.cursor = cursor\n element.style.cursor = cursor\n scope.autoStart.cursorElement = cursor ? element : null\n}\n\nfunction setInteractionCursor<T extends ActionName> (interaction: Interaction<T>, scope: Scope) {\n const { interactable, element, prepared } = interaction\n\n if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {\n // clear previous target element cursor\n if (scope.autoStart.cursorElement) {\n setCursor(scope.autoStart.cursorElement, '', scope)\n }\n\n return\n }\n\n let cursor = ''\n\n if (prepared.name) {\n const cursorChecker = interactable.options[prepared.name].cursorChecker\n\n if (is.func(cursorChecker)) {\n cursor = cursorChecker(prepared, interactable, element, interaction._interacting)\n } else {\n cursor = scope.actions.map[prepared.name].getCursor(prepared)\n }\n }\n\n setCursor(interaction.element, cursor || '', scope)\n}\n\nconst autoStart: Plugin = {\n id: 'auto-start/base',\n before: ['actions'],\n install,\n listeners: {\n 'interactions:down': prepareOnDown,\n 'interactions:move': (arg, scope) => {\n prepareOnMove(arg, scope)\n startOnMove(arg, scope)\n },\n 'interactions:stop': clearCursorOnStop,\n },\n maxInteractions,\n withinInteractionLimit,\n validateAction,\n}\n\nexport default autoStart\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type Interaction from '@interactjs/core/Interaction'\nimport type { SignalArgs, Scope, ActionName } from '@interactjs/core/scope'\nimport type { Element } from '@interactjs/types/index'\nimport { parentNode } from '@interactjs/utils/domUtils'\nimport is from '@interactjs/utils/is'\n\nimport autoStart from './base'\n\nfunction beforeStart ({ interaction, eventTarget, dx, dy }: SignalArgs['interactions:move'], scope: Scope) {\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.interactable.options.drag\n const startAxis = targetOptions.startAxis\n const currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'\n\n interaction.prepared.axis =\n targetOptions.lockAxis === 'start'\n ? (currentAxis[0] as 'x' | 'y') // 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 as Interaction<ActionName>).prepared.name = null\n\n // then try to get a drag from another ineractable\n let element = eventTarget as Element\n\n const getDraggable = function (interactable: Interactable): Interactable | void {\n if (interactable === interaction.interactable) return\n\n const options = interaction.interactable.options.drag\n\n if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) {\n const action = interactable.getAction(\n interaction.downPointer,\n interaction.downEvent,\n interaction,\n element,\n )\n\n if (\n action &&\n action.name === 'drag' &&\n checkStartAxis(currentAxis, interactable) &&\n autoStart.validateAction(action, interactable, element, eventTarget, scope)\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 as Interaction<ActionName>).prepared.name = 'drag'\n interaction.interactable = interactable\n interaction.element = element\n break\n }\n\n element = parentNode(element) as Element\n }\n }\n}\n\nfunction checkStartAxis (startAxis: string, interactable: Interactable) {\n if (!interactable) {\n return false\n }\n\n const thisAxis = interactable.options.drag.startAxis\n\n return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis\n}\n\nexport default {\n id: 'auto-start/dragAxis',\n listeners: { 'autoStart:before-start': beforeStart },\n}\n","import type Interaction from '@interactjs/core/Interaction'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\n\nimport basePlugin from './base'\n\ndeclare module '@interactjs/core/options' {\n interface PerActionDefaults {\n hold?: number\n delay?: number\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n autoStartHoldTimer?: any\n }\n}\n\nfunction install (scope: Scope) {\n const { defaults } = scope\n\n scope.usePlugin(basePlugin)\n\n defaults.perAction.hold = 0\n defaults.perAction.delay = 0\n}\n\nfunction getHoldDuration (interaction: Interaction) {\n const actionName = interaction.prepared && interaction.prepared.name\n\n if (!actionName) {\n return null\n }\n\n const options = interaction.interactable.options\n\n return options[actionName].hold || options[actionName].delay\n}\n\nconst hold: Plugin = {\n id: 'auto-start/hold',\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.autoStartHoldTimer = null\n },\n\n 'autoStart:prepared': ({ interaction }) => {\n const hold = getHoldDuration(interaction)\n\n if (hold > 0) {\n interaction.autoStartHoldTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.interactable, interaction.element)\n }, hold)\n }\n },\n\n 'interactions:move': ({ interaction, duplicate }) => {\n if (interaction.autoStartHoldTimer && interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.autoStartHoldTimer)\n interaction.autoStartHoldTimer = null\n }\n },\n\n // prevent regular down->move autoStart\n 'autoStart:before-start': ({ interaction }) => {\n const holdDuration = getHoldDuration(interaction)\n\n if (holdDuration > 0) {\n interaction.prepared.name = null\n }\n },\n },\n getHoldDuration,\n}\nexport default hold\n","import type { Scope } from '@interactjs/core/scope'\n\nimport autoStart from './base'\nimport dragAxis from './dragAxis'\nimport hold from './hold'\n\nexport default {\n id: 'auto-start',\n install (scope: Scope) {\n scope.usePlugin(autoStart)\n scope.usePlugin(hold)\n scope.usePlugin(dragAxis)\n },\n}\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type Interaction from '@interactjs/core/Interaction'\nimport type { Scope } from '@interactjs/core/scope'\nimport type { PointerEventType } from '@interactjs/types/index'\nimport { matchesSelector, nodeContains } from '@interactjs/utils/domUtils'\nimport is from '@interactjs/utils/is'\nimport { getWindow } from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n preventDefault: typeof preventDefault\n checkAndPreventDefault: (event: Event) => void\n }\n}\n\ntype PreventDefaultValue = 'always' | 'never' | 'auto'\nfunction preventDefault(this: Interactable): PreventDefaultValue\nfunction preventDefault(this: Interactable, newValue: PreventDefaultValue): typeof this\nfunction preventDefault (this: Interactable, newValue?: PreventDefaultValue) {\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\nfunction checkAndPreventDefault (interactable: Interactable, scope: Scope, event: Event) {\n const setting = interactable.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 // if the browser supports passive event listeners and isn't running on iOS,\n // don't preventDefault of touch{start,move} events. CSS touch-action and\n // user-select should be used instead of calling event.preventDefault().\n if (scope.events.supportsPassive && /^touch(start|move)$/.test(event.type)) {\n const doc = getWindow(event.target).document\n const docOptions = scope.getDocOptions(doc)\n\n if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {\n return\n }\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 (\n is.element(event.target) &&\n matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')\n ) {\n return\n }\n\n event.preventDefault()\n}\n\nfunction onInteractionEvent ({ interaction, event }: { interaction: Interaction, event: PointerEventType }) {\n if (interaction.interactable) {\n interaction.interactable.checkAndPreventDefault(event as Event)\n }\n}\n\nexport function install (scope: Scope) {\n /** @lends Interactable */\n const { Interactable } = scope\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] `'always'`, `'never'` or `'auto'`\n * @return {string | Interactable} The current setting or this Interactable\n */\n Interactable.prototype.preventDefault = preventDefault\n\n Interactable.prototype.checkAndPreventDefault = function (event) {\n return checkAndPreventDefault(this, scope, event)\n }\n\n // prevent native HTML5 drag on interact.js target elements\n scope.interactions.docEvents.push({\n type: 'dragstart',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n if (\n interaction.element &&\n (interaction.element === event.target || nodeContains(interaction.element, event.target))\n ) {\n interaction.interactable.checkAndPreventDefault(event)\n return\n }\n }\n },\n })\n}\n\nexport default {\n id: 'core/interactablePreventDefault',\n install,\n listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {\n acc[`interactions:${eventType}`] = onInteractionEvent\n return acc\n }, {} as any),\n}\n","export default {}\n","import type Interaction from '@interactjs/core/Interaction'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport visualizer from '@interactjs/dev-tools/visualizer/plugin'\nimport type { Element, OptionMethod } from '@interactjs/types/index'\nimport domObjects from '@interactjs/utils/domObjects'\nimport { parentNode } from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport * as win from '@interactjs/utils/window'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n logger: Logger\n }\n}\n\ndeclare module '@interactjs/core/InteractStatic' {\n export interface InteractStatic {\n visializer: typeof visualizer\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface BaseDefaults {\n devTools?: DevToolsOptions\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n devTools: OptionMethod<DevToolsOptions>\n }\n}\n\nexport interface DevToolsOptions {\n ignore: { [P in keyof typeof CheckName]?: boolean }\n}\n\nexport interface Logger {\n warn: (...args: any[]) => void\n error: (...args: any[]) => void\n log: (...args: any[]) => void\n}\n\nexport interface Check {\n name: CheckName\n text: string\n perform: (interaction: Interaction) => boolean\n getInfo: (interaction: Interaction) => any[]\n}\n\nenum CheckName {\n touchAction = 'touchAction',\n boxSizing = 'boxSizing',\n noListeners = 'noListeners',\n}\n\nconst prefix = '[interact.js] '\nconst links = {\n touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',\n boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing',\n}\n\n// eslint-disable-next-line no-undef\nconst isProduction = process.env.NODE_ENV === 'production'\n\nfunction install (scope: Scope, { logger }: { logger?: Logger } = {}) {\n const { Interactable, defaults } = scope\n\n scope.logger = logger || console\n\n defaults.base.devTools = {\n ignore: {},\n }\n\n Interactable.prototype.devTools = function (options?: object) {\n if (options) {\n extend(this.options.devTools, options)\n return this\n }\n\n return this.options.devTools\n }\n\n scope.usePlugin(visualizer)\n}\n\nconst checks: Check[] = [\n {\n name: CheckName.touchAction,\n perform ({ element }) {\n return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/)\n },\n getInfo ({ element }) {\n return [element, links.touchAction]\n },\n text: 'Consider adding CSS \"touch-action: none\" to this element\\n',\n },\n\n {\n name: CheckName.boxSizing,\n perform (interaction) {\n const { element } = interaction\n\n return (\n interaction.prepared.name === 'resize' &&\n element instanceof domObjects.HTMLElement &&\n !hasStyle(element, 'boxSizing', /border-box/)\n )\n },\n text: 'Consider adding CSS \"box-sizing: border-box\" to this resizable element',\n getInfo ({ element }) {\n return [element, links.boxSizing]\n },\n },\n\n {\n name: CheckName.noListeners,\n perform (interaction) {\n const actionName = interaction.prepared.name\n const moveListeners = interaction.interactable.events.types[`${actionName}move`] || []\n\n return !moveListeners.length\n },\n getInfo (interaction) {\n return [interaction.prepared.name, interaction.interactable]\n },\n text: 'There are no listeners set for this action',\n },\n]\n\nfunction hasStyle (element: HTMLElement, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n const value = element.style[prop] || win.window.getComputedStyle(element)[prop]\n return styleRe.test((value || '').toString())\n}\n\nfunction parentHasStyle (element: Element, prop: keyof CSSStyleDeclaration, styleRe: RegExp) {\n let parent = element as HTMLElement\n\n while (is.element(parent)) {\n if (hasStyle(parent, prop, styleRe)) {\n return true\n }\n\n parent = parentNode(parent) as HTMLElement\n }\n\n return false\n}\n\nconst id = 'dev-tools'\nconst defaultExport: Plugin = isProduction\n ? { id, install: () => {} }\n : {\n id,\n install,\n listeners: {\n 'interactions:action-start': ({ interaction }, scope) => {\n for (const check of checks) {\n const options = interaction.interactable && interaction.interactable.options\n\n if (\n !(options && options.devTools && options.devTools.ignore[check.name]) &&\n check.perform(interaction)\n ) {\n scope.logger.warn(prefix + check.text, ...check.getInfo(interaction))\n }\n }\n },\n },\n checks,\n CheckName,\n links,\n prefix,\n }\n\nexport default defaultExport\n","import * as arr from './arr'\nimport is from './is'\n\n// tslint:disable-next-line ban-types\nexport default function clone<T extends Object> (source: T): Partial<T> {\n const dest = {} as Partial<T>\n\n for (const prop in source) {\n const value = source[prop]\n\n if (is.plainObject(value)) {\n dest[prop] = clone(value) as any\n } else if (is.array(value)) {\n dest[prop] = arr.from(value) as typeof value\n } else {\n dest[prop] = value\n }\n }\n\n return dest\n}\n","import type { EventPhase } from '@interactjs/core/InteractEvent'\nimport type { Interaction, DoAnyPhaseArg } from '@interactjs/core/Interaction'\nimport type { EdgeOptions, FullRect, Point, Rect } from '@interactjs/types/index'\nimport clone from '@interactjs/utils/clone'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport type { Modifier, ModifierArg, ModifierState } from './base'\n\nexport interface ModificationResult {\n delta: Point\n rectDelta: Rect\n coords: Point\n rect: FullRect\n eventProps: any[]\n changed: boolean\n}\n\ninterface MethodArg {\n phase: EventPhase\n pageCoords: Point\n rect: FullRect\n coords: Point\n preEnd?: boolean\n skipModifiers?: number\n}\n\nexport default class Modification {\n states: ModifierState[] = []\n startOffset: Rect = { left: 0, right: 0, top: 0, bottom: 0 }\n startDelta!: Point\n result!: ModificationResult\n endResult!: Point\n edges!: EdgeOptions\n readonly interaction: Readonly<Interaction>\n\n constructor (interaction: Interaction) {\n this.interaction = interaction\n this.result = createResult()\n }\n\n start ({ phase }: { phase: EventPhase }, pageCoords: Point) {\n const { interaction } = this\n const modifierList = getModifierList(interaction)\n this.prepareStates(modifierList)\n\n this.edges = extend({}, interaction.edges)\n this.startOffset = getRectOffset(interaction.rect, pageCoords)\n this.startDelta = { x: 0, y: 0 }\n\n const arg = this.fillArg({\n phase,\n pageCoords,\n preEnd: false,\n })\n\n this.result = createResult()\n this.startAll(arg)\n\n const result = (this.result = this.setAll(arg))\n\n return result\n }\n\n fillArg (arg: Partial<ModifierArg>) {\n const { interaction } = this\n\n arg.interaction = interaction\n arg.interactable = interaction.interactable\n arg.element = interaction.element\n arg.rect = arg.rect || interaction.rect\n arg.edges = this.edges\n arg.startOffset = this.startOffset\n\n return arg as ModifierArg\n }\n\n startAll (arg: MethodArg & Partial<ModifierArg>) {\n for (const state of this.states) {\n if (state.methods.start) {\n arg.state = state\n state.methods.start(arg as ModifierArg)\n }\n }\n }\n\n setAll (arg: MethodArg & Partial<ModifierArg>): ModificationResult {\n const { phase, preEnd, skipModifiers, rect: unmodifiedRect } = arg\n\n arg.coords = extend({}, arg.pageCoords)\n arg.rect = extend({}, unmodifiedRect)\n\n const states = skipModifiers ? this.states.slice(skipModifiers) : this.states\n\n const newResult = createResult(arg.coords, arg.rect)\n\n for (const state of states) {\n const { options } = state\n const lastModifierCoords = extend({}, arg.coords)\n let returnValue = null\n\n if (state.methods?.set && this.shouldDo(options, preEnd, phase)) {\n arg.state = state\n returnValue = state.methods.set(arg as ModifierArg<never>)\n\n rectUtils.addEdges(this.interaction.edges, arg.rect, {\n x: arg.coords.x - lastModifierCoords.x,\n y: arg.coords.y - lastModifierCoords.y,\n })\n }\n\n newResult.eventProps.push(returnValue)\n }\n\n newResult.delta.x = arg.coords.x - arg.pageCoords.x\n newResult.delta.y = arg.coords.y - arg.pageCoords.y\n\n newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left\n newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right\n newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top\n newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom\n\n const prevCoords = this.result.coords\n const prevRect = this.result.rect\n\n if (prevCoords && prevRect) {\n const rectChanged =\n newResult.rect.left !== prevRect.left ||\n newResult.rect.right !== prevRect.right ||\n newResult.rect.top !== prevRect.top ||\n newResult.rect.bottom !== prevRect.bottom\n\n newResult.changed =\n rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y\n }\n\n return newResult\n }\n\n applyToInteraction (arg: { phase: EventPhase, rect?: Rect }) {\n const { interaction } = this\n const { phase } = arg\n const curCoords = interaction.coords.cur\n const startCoords = interaction.coords.start\n const { result, startDelta } = this\n const curDelta = result.delta\n\n if (phase === 'start') {\n extend(this.startDelta, result.delta)\n }\n\n for (const [coordsSet, delta] of [\n [startCoords, startDelta],\n [curCoords, curDelta],\n ] as const) {\n coordsSet.page.x += delta.x\n coordsSet.page.y += delta.y\n coordsSet.client.x += delta.x\n coordsSet.client.y += delta.y\n }\n\n const { rectDelta } = this.result\n const rect = arg.rect || interaction.rect\n\n rect.left += rectDelta.left\n rect.right += rectDelta.right\n rect.top += rectDelta.top\n rect.bottom += rectDelta.bottom\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n setAndApply (\n arg: Partial<DoAnyPhaseArg> & {\n phase: EventPhase\n preEnd?: boolean\n skipModifiers?: number\n modifiedCoords?: Point\n },\n ): void | false {\n const { interaction } = this\n const { phase, preEnd, skipModifiers } = arg\n\n const result = this.setAll(\n this.fillArg({\n preEnd,\n phase,\n pageCoords: arg.modifiedCoords || interaction.coords.cur.page,\n }),\n )\n\n this.result = result\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (\n !result.changed &&\n (!skipModifiers || skipModifiers < this.states.length) &&\n interaction.interacting()\n ) {\n return false\n }\n\n if (arg.modifiedCoords) {\n const { page } = interaction.coords.cur\n const adjustment = {\n x: arg.modifiedCoords.x - page.x,\n y: arg.modifiedCoords.y - page.y,\n }\n\n result.coords.x += adjustment.x\n result.coords.y += adjustment.y\n result.delta.x += adjustment.x\n result.delta.y += adjustment.y\n }\n\n this.applyToInteraction(arg)\n }\n\n beforeEnd (arg: Omit<DoAnyPhaseArg, 'iEvent'> & { state?: ModifierState }): void | false {\n const { interaction, event } = arg\n const states = this.states\n\n if (!states || !states.length) {\n return\n }\n\n let doPreend = false\n\n for (const state of states) {\n arg.state = state\n const { options, methods } = state\n\n const endPosition = methods.beforeEnd && methods.beforeEnd((arg as unknown) as ModifierArg)\n\n if (endPosition) {\n this.endResult = endPosition\n return false\n }\n\n doPreend = doPreend || (!doPreend && this.shouldDo(options, true, arg.phase, true))\n }\n\n if (doPreend) {\n // trigger a final modified move before ending\n interaction.move({ event, preEnd: true })\n }\n }\n\n stop (arg: { interaction: Interaction }) {\n const { interaction } = arg\n\n if (!this.states || !this.states.length) {\n return\n }\n\n const modifierArg: Partial<ModifierArg> = extend(\n {\n states: this.states,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: null,\n },\n arg,\n )\n\n this.fillArg(modifierArg)\n\n for (const state of this.states) {\n modifierArg.state = state\n\n if (state.methods.stop) {\n state.methods.stop(modifierArg as ModifierArg)\n }\n }\n\n this.states = null\n this.endResult = null\n }\n\n prepareStates (modifierList: Modifier[]) {\n this.states = []\n\n for (let index = 0; index < modifierList.length; index++) {\n const { options, methods, name } = modifierList[index]\n\n this.states.push({\n options,\n methods,\n index,\n name,\n })\n }\n\n return this.states\n }\n\n restoreInteractionCoords ({ interaction: { coords, rect, modification } }: { interaction: Interaction }) {\n if (!modification.result) return\n\n const { startDelta } = modification\n const { delta: curDelta, rectDelta } = modification.result\n\n const coordsAndDeltas = [\n [coords.start, startDelta],\n [coords.cur, curDelta],\n ]\n\n for (const [coordsSet, delta] of coordsAndDeltas as any) {\n coordsSet.page.x -= delta.x\n coordsSet.page.y -= delta.y\n coordsSet.client.x -= delta.x\n coordsSet.client.y -= delta.y\n }\n\n rect.left -= rectDelta.left\n rect.right -= rectDelta.right\n rect.top -= rectDelta.top\n rect.bottom -= rectDelta.bottom\n }\n\n shouldDo (options, preEnd?: boolean, phase?: string, requireEndOnly?: boolean) {\n if (\n // ignore disabled modifiers\n !options ||\n options.enabled === false ||\n // check if we require endOnly option to fire move before end\n (requireEndOnly && !options.endOnly) ||\n // don't apply endOnly modifiers when not ending\n (options.endOnly && !preEnd) ||\n // check if modifier should run be applied on start\n (phase === 'start' && !options.setStart)\n ) {\n return false\n }\n\n return true\n }\n\n copyFrom (other: Modification) {\n this.startOffset = other.startOffset\n this.startDelta = other.startDelta\n this.edges = other.edges\n this.states = other.states.map((s) => clone(s) as ModifierState)\n this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect))\n }\n\n destroy () {\n for (const prop in this) {\n this[prop] = null\n }\n }\n}\n\nfunction createResult (coords?: Point, rect?: FullRect): ModificationResult {\n return {\n rect,\n coords,\n delta: { x: 0, y: 0 },\n rectDelta: {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n },\n eventProps: [],\n changed: true,\n }\n}\n\nfunction getModifierList (interaction) {\n const actionOptions = interaction.interactable.options[interaction.prepared.name]\n const actionModifiers = actionOptions.modifiers\n\n if (actionModifiers && actionModifiers.length) {\n return actionModifiers\n }\n\n return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize']\n .map((type) => {\n const options = actionOptions[type]\n\n return (\n options &&\n options.enabled && {\n options,\n methods: options._methods,\n }\n )\n })\n .filter((m) => !!m)\n}\n\nexport function getRectOffset (rect, coords) {\n return rect\n ? {\n left: coords.x - rect.left,\n top: coords.y - rect.top,\n right: rect.right - coords.x,\n bottom: rect.bottom - coords.y,\n }\n : {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n }\n}\n","import type { EventPhase, InteractEvent } from '@interactjs/core/InteractEvent'\nimport type { Interactable } from '@interactjs/core/Interactable'\nimport type Interaction from '@interactjs/core/Interaction'\nimport type { Plugin } from '@interactjs/core/scope'\nimport type { EdgeOptions, FullRect, Point, Rect } from '@interactjs/types/index'\n\nimport Modification from './Modification'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n modification?: Modification\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface InteractEvent {\n modifiers?: Array<{\n name: string\n [key: string]: any\n }>\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface PerActionDefaults {\n modifiers?: Modifier[]\n }\n}\n\nexport interface Modifier<\n Defaults = any,\n State extends ModifierState = any,\n Name extends string = any,\n Result = any\n> {\n options: Defaults\n methods: {\n start?: (arg: ModifierArg<State>) => void\n set?: (arg: ModifierArg<State>) => Result\n beforeEnd?: (arg: ModifierArg<State>) => Point | void\n stop?: (arg: ModifierArg<State>) => void\n }\n name?: Name\n enable: () => Modifier<Defaults, State, Name, Result>\n disable: () => Modifier<Defaults, State, Name, Result>\n}\n\nexport type ModifierState<Defaults = unknown, StateProps = unknown, Name extends string = any> = {\n options: Defaults\n methods?: Modifier<Defaults>['methods']\n index?: number\n name?: Name\n} & StateProps\n\nexport interface ModifierArg<State extends ModifierState = ModifierState> {\n interaction: Interaction\n interactable: Interactable\n phase: EventPhase\n rect: FullRect\n edges: EdgeOptions\n state: State\n element: Element\n pageCoords: Point\n prevCoords: Point\n prevRect?: FullRect\n coords: Point\n startOffset: Rect\n preEnd?: boolean\n}\n\nexport interface ModifierModule<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n Result = unknown\n> {\n defaults?: Defaults\n start?(arg: ModifierArg<State>): void\n set?(arg: ModifierArg<State>): Result\n beforeEnd?(arg: ModifierArg<State>): Point | void\n stop?(arg: ModifierArg<State>): void\n}\n\nexport interface ModifierFunction<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n Name extends string\n> {\n (_options?: Partial<Defaults>): Modifier<Defaults, State, Name>\n _defaults: Defaults\n _methods: ModifierModule<Defaults, State>\n}\n\nexport function makeModifier<\n Defaults extends { enabled?: boolean },\n State extends ModifierState,\n Name extends string,\n Result\n> (module: ModifierModule<Defaults, State, Result>, name?: Name) {\n const { defaults } = module\n const methods = {\n start: module.start,\n set: module.set,\n beforeEnd: module.beforeEnd,\n stop: module.stop,\n }\n\n const modifier = (_options?: Partial<Defaults>) => {\n const options = (_options || {}) as Defaults\n\n options.enabled = options.enabled !== false\n\n // add missing defaults to options\n for (const prop in defaults) {\n if (!(prop in options)) {\n ;(options as any)[prop] = defaults[prop]\n }\n }\n\n const m: Modifier<Defaults, State, Name, Result> = {\n options,\n methods,\n name,\n enable: () => {\n options.enabled = true\n return m\n },\n disable: () => {\n options.enabled = false\n return m\n },\n }\n\n return m\n }\n\n if (name && typeof name === 'string') {\n // for backwrads compatibility\n modifier._defaults = defaults\n modifier._methods = methods\n }\n\n return modifier\n}\n\nexport function addEventModifiers ({\n iEvent,\n interaction,\n}: {\n iEvent: InteractEvent<any>\n interaction: Interaction<any>\n}) {\n const result = interaction.modification!.result\n\n if (result) {\n iEvent.modifiers = result.eventProps\n }\n}\n\nconst modifiersBase: Plugin = {\n id: 'modifiers/base',\n before: ['actions'],\n install: (scope) => {\n scope.defaults.perAction.modifiers = []\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.modification = new Modification(interaction)\n },\n\n 'interactions:before-action-start': (arg) => {\n const modification = arg.interaction.modification!\n\n modification.start(arg, arg.interaction.coords.start.page)\n arg.interaction.edges = modification.edges\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-move': (arg) => arg.interaction.modification.setAndApply(arg),\n\n 'interactions:before-action-end': (arg) => arg.interaction.modification.beforeEnd(arg),\n\n 'interactions:action-start': addEventModifiers,\n 'interactions:action-move': addEventModifiers,\n 'interactions:action-end': addEventModifiers,\n\n 'interactions:after-action-start': (arg) => arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-move': (arg) => arg.interaction.modification.restoreInteractionCoords(arg),\n\n 'interactions:stop': (arg) => arg.interaction.modification.stop(arg),\n },\n}\n\nexport default modifiersBase\n","import type { Point, Listeners, OrBoolean, Element } from '@interactjs/types/index'\n\nexport interface Defaults {\n base: BaseDefaults\n perAction: PerActionDefaults\n actions: ActionDefaults\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionDefaults {}\n\nexport interface BaseDefaults {\n preventDefault?: 'auto' | 'never' | string\n deltaSource?: 'page' | 'client'\n context?: Node\n}\n\nexport interface PerActionDefaults {\n enabled?: boolean\n origin?: Point | string | Element\n listeners?: Listeners\n allowFrom?: string | Element\n ignoreFrom?: string | Element\n}\n\nexport type Options = Partial<BaseDefaults> &\nPartial<PerActionDefaults> &\n{\n [P in keyof ActionDefaults]?: Partial<ActionDefaults[P]>\n}\n\n// export interface Options extends BaseDefaults, PerActionDefaults {}\n\nexport interface OptionsArg extends BaseDefaults, OrBoolean<Partial<ActionDefaults>> {}\n\nexport const defaults: Defaults = {\n base: {\n preventDefault: 'auto',\n deltaSource: 'page',\n },\n\n perAction: {\n enabled: false,\n origin: { x: 0, y: 0 },\n },\n\n actions: {} as ActionDefaults,\n}\n","import type { ActionName } from '@interactjs/core/scope'\nimport type { Point, FullRect, PointerEventType, Element } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\nimport hypot from '@interactjs/utils/hypot'\n\nimport { BaseEvent } from './BaseEvent'\nimport type { Interaction } from './Interaction'\nimport { defaults } from './options'\n\nexport type EventPhase = keyof PhaseMap\n\nexport interface PhaseMap {\n start: true\n move: true\n end: true\n}\n\n// defined outside of class definition to avoid assignment of undefined during\n// construction\nexport interface InteractEvent {\n pageX: number\n pageY: number\n\n clientX: number\n clientY: number\n\n dx: number\n dy: number\n\n velocityX: number\n velocityY: number\n}\n\nexport class InteractEvent<\n T extends ActionName = never,\n P extends EventPhase = EventPhase\n> extends BaseEvent<T> {\n target: Element\n currentTarget: Element\n relatedTarget: Element | null = null\n screenX?: number\n screenY?: number\n button: number\n buttons: number\n ctrlKey: boolean\n shiftKey: boolean\n altKey: boolean\n metaKey: boolean\n page: Point\n client: Point\n delta: Point\n rect: FullRect\n x0: number\n y0: number\n t0: number\n dt: number\n duration: number\n clientX0: number\n clientY0: number\n velocity: Point\n speed: number\n swipe: ReturnType<InteractEvent<T>['getSwipe']>\n timeStamp: any\n // resize\n axes?: 'x' | 'y' | 'xy'\n preEnd?: boolean\n\n /** */\n constructor (\n interaction: Interaction<T>,\n event: PointerEventType,\n actionName: T,\n phase: P,\n element: Element,\n preEnd?: boolean,\n type?: string,\n ) {\n super(interaction)\n\n element = element || interaction.element\n\n const target = interaction.interactable\n const deltaSource = (((target && target.options) || defaults) as any).deltaSource as 'page' | 'client'\n const origin = getOriginXY(target, element, actionName)\n const starting = phase === 'start'\n const ending = phase === 'end'\n const prevEvent = starting ? this : interaction.prevEvent\n const coords = starting\n ? interaction.coords.start\n : ending\n ? { page: prevEvent.page, client: prevEvent.client, timeStamp: interaction.coords.cur.timeStamp }\n : interaction.coords.cur\n\n this.page = extend({}, coords.page)\n this.client = extend({}, coords.client)\n this.rect = extend({}, interaction.rect)\n this.timeStamp = coords.timeStamp\n\n if (!ending) {\n this.page.x -= origin.x\n this.page.y -= origin.y\n\n this.client.x -= origin.x\n this.client.y -= origin.y\n }\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 as MouseEvent).button\n this.buttons = (event as MouseEvent).buttons\n this.target = element\n this.currentTarget = element\n this.preEnd = preEnd\n this.type = type || actionName + (phase || '')\n this.interactable = target\n\n this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0\n\n this.x0 = interaction.coords.start.page.x - origin.x\n this.y0 = interaction.coords.start.page.y - origin.y\n this.clientX0 = interaction.coords.start.client.x - origin.x\n this.clientY0 = interaction.coords.start.client.y - origin.y\n\n if (starting || ending) {\n this.delta = { x: 0, y: 0 }\n } else {\n this.delta = {\n x: this[deltaSource].x - prevEvent[deltaSource].x,\n y: this[deltaSource].y - prevEvent[deltaSource].y,\n }\n }\n\n this.dt = interaction.coords.delta.timeStamp\n this.duration = this.timeStamp - this.t0\n\n // velocity and speed in pixels per second\n this.velocity = extend({}, interaction.coords.velocity[deltaSource])\n this.speed = hypot(this.velocity.x, this.velocity.y)\n\n this.swipe = ending || phase === 'inertiastart' ? this.getSwipe() : null\n }\n\n getSwipe () {\n const interaction = this._interaction\n\n if (interaction.prevEvent.speed < 600 || 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 * Don't call listeners on the remaining targets\n */\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true\n }\n\n /**\n * Don't call any other listeners (even on the current target)\n */\n stopPropagation () {\n this.propagationStopped = true\n }\n}\n\n// getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\nObject.defineProperties(InteractEvent.prototype, {\n pageX: {\n get () {\n return this.page.x\n },\n set (value) {\n this.page.x = value\n },\n },\n pageY: {\n get () {\n return this.page.y\n },\n set (value) {\n this.page.y = value\n },\n },\n\n clientX: {\n get () {\n return this.client.x\n },\n set (value) {\n this.client.x = value\n },\n },\n clientY: {\n get () {\n return this.client.y\n },\n set (value) {\n this.client.y = value\n },\n },\n\n dx: {\n get () {\n return this.delta.x\n },\n set (value) {\n this.delta.x = value\n },\n },\n dy: {\n get () {\n return this.delta.y\n },\n set (value) {\n this.delta.y = value\n },\n },\n\n velocityX: {\n get () {\n return this.velocity.x\n },\n set (value) {\n this.velocity.x = value\n },\n },\n velocityY: {\n get () {\n return this.velocity.y\n },\n set (value) {\n this.velocity.y = value\n },\n },\n})\n","import type { PointerEventType, PointerType } from '@interactjs/types/index'\n\nexport class PointerInfo {\n id: number\n pointer: PointerType\n event: PointerEventType\n downTime: number\n downTarget: Node\n\n constructor (id: number, pointer: PointerType, event: PointerEventType, downTime: number, downTarget: Node) {\n this.id = id\n this.pointer = pointer\n this.event = event\n this.downTime = downTime\n this.downTarget = downTarget\n }\n}\n","import type { ActionDefaults } from '@interactjs/core/options'\nimport type {\n Element,\n EdgeOptions,\n PointerEventType,\n PointerType,\n FullRect,\n CoordsSet,\n} from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport extend from '@interactjs/utils/extend'\nimport hypot from '@interactjs/utils/hypot'\nimport { warnOnce, copyAction } from '@interactjs/utils/misc'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport type { EventPhase } from './InteractEvent'\nimport { InteractEvent } from './InteractEvent'\nimport type { Interactable } from './Interactable'\nimport { PointerInfo } from './PointerInfo'\nimport type { ActionName, Scope } from './scope'\n\nexport interface ActionProps<T extends ActionName | null = never> {\n name: T\n axis?: 'x' | 'y' | 'xy' | null\n edges?: EdgeOptions | null\n}\n\nexport enum _ProxyValues {\n interactable = '',\n element = '',\n prepared = '',\n pointerIsDown = '',\n pointerWasMoved = '',\n _proxy = '',\n}\n\nexport enum _ProxyMethods {\n start = '',\n move = '',\n end = '',\n stop = '',\n interacting = '',\n}\n\nexport type PointerArgProps<T extends {} = {}> = {\n pointer: PointerType\n event: PointerEventType\n eventTarget: Node\n pointerIndex: number\n pointerInfo: PointerInfo\n interaction: Interaction<never>\n} & T\n\nexport interface DoPhaseArg<T extends ActionName, P extends EventPhase> {\n event: PointerEventType\n phase: EventPhase\n interaction: Interaction<T>\n iEvent: InteractEvent<T, P>\n preEnd?: boolean\n type?: string\n}\n\nexport type DoAnyPhaseArg = DoPhaseArg<ActionName, EventPhase>\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:new': { interaction: Interaction<ActionName> }\n 'interactions:down': PointerArgProps<{\n type: 'down'\n }>\n 'interactions:move': PointerArgProps<{\n type: 'move'\n dx: number\n dy: number\n duplicate: boolean\n }>\n 'interactions:up': PointerArgProps<{\n type: 'up'\n curEventTarget: EventTarget\n }>\n 'interactions:cancel': SignalArgs['interactions:up'] & {\n type: 'cancel'\n curEventTarget: EventTarget\n }\n 'interactions:update-pointer': PointerArgProps<{\n down: boolean\n }>\n 'interactions:remove-pointer': PointerArgProps\n 'interactions:blur': { interaction: Interaction<never>, event: Event, type: 'blur' }\n 'interactions:before-action-start': Omit<DoAnyPhaseArg, 'iEvent'>\n 'interactions:action-start': DoAnyPhaseArg\n 'interactions:after-action-start': DoAnyPhaseArg\n 'interactions:before-action-move': Omit<DoAnyPhaseArg, 'iEvent'>\n 'interactions:action-move': DoAnyPhaseArg\n 'interactions:after-action-move': DoAnyPhaseArg\n 'interactions:before-action-end': Omit<DoAnyPhaseArg, 'iEvent'>\n 'interactions:action-end': DoAnyPhaseArg\n 'interactions:after-action-end': DoAnyPhaseArg\n 'interactions:stop': { interaction: Interaction }\n }\n}\n\nexport type InteractionProxy<T extends ActionName | null = never> = Pick<\nInteraction<T>,\nkeyof typeof _ProxyValues | keyof typeof _ProxyMethods\n>\n\nlet idCounter = 0\n\nexport class Interaction<T extends ActionName | null = ActionName> {\n // current interactable being interacted with\n interactable: Interactable = null\n\n // the target element of the interactable\n element: Element = null\n rect: FullRect\n _rects?: {\n start: FullRect\n corrected: FullRect\n previous: FullRect\n delta: FullRect\n }\n edges: EdgeOptions\n\n _scopeFire: Scope['fire']\n\n // action that's ready to be fired on next move event\n prepared: ActionProps<T> = {\n name: null,\n axis: null,\n edges: null,\n }\n\n pointerType: string\n\n // keep track of added pointers\n pointers: PointerInfo[] = []\n\n // pointerdown/mousedown/touchstart event\n downEvent: PointerEventType = null\n\n downPointer: PointerType = {} as PointerType\n\n _latestPointer: {\n pointer: PointerType\n event: PointerEventType\n eventTarget: Node\n } = {\n pointer: null,\n event: null,\n eventTarget: null,\n }\n\n // previous action event\n prevEvent: InteractEvent<T, EventPhase> = null\n\n pointerIsDown = false\n pointerWasMoved = false\n _interacting = false\n _ending = false\n _stopped = true\n _proxy: InteractionProxy<T> = null\n\n simulation = null\n\n /** @internal */ get pointerMoveTolerance () {\n return 1\n }\n\n /**\n * @alias Interaction.prototype.move\n */\n doMove = warnOnce(function (this: Interaction, signalArg: any) {\n this.move(signalArg)\n }, 'The interaction.doMove() method has been renamed to interaction.move()')\n\n coords: CoordsSet = {\n // Starting InteractEvent pointer coordinates\n start: pointerUtils.newCoords(),\n // Previous native pointer move event coordinates\n prev: pointerUtils.newCoords(),\n // current native pointer move event coordinates\n cur: pointerUtils.newCoords(),\n // Change in coordinates and time of the pointer\n delta: pointerUtils.newCoords(),\n // pointer velocity\n velocity: pointerUtils.newCoords(),\n }\n\n readonly _id: number = idCounter++\n\n /** */\n constructor ({ pointerType, scopeFire }: { pointerType?: string, scopeFire: Scope['fire'] }) {\n this._scopeFire = scopeFire\n this.pointerType = pointerType\n\n const that = this\n\n this._proxy = {} as InteractionProxy<T>\n\n for (const key in _ProxyValues) {\n Object.defineProperty(this._proxy, key, {\n get () {\n return that[key]\n },\n })\n }\n\n for (const key in _ProxyMethods) {\n Object.defineProperty(this._proxy, key, {\n value: (...args: any[]) => that[key](...args),\n })\n }\n\n this._scopeFire('interactions:new', { interaction: this })\n }\n\n pointerDown (pointer: PointerType, event: PointerEventType, eventTarget: Node) {\n const pointerIndex = this.updatePointer(pointer, event, eventTarget, true)\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n pointerInfo,\n type: 'down',\n interaction: (this as unknown) as Interaction<never>,\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.<action>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 {Boolean} Whether the interaction was successfully started\n */\n start<A extends ActionName> (action: ActionProps<A>, interactable: Interactable, element: Element): boolean {\n if (\n this.interacting() ||\n !this.pointerIsDown ||\n this.pointers.length < (action.name === 'gesture' ? 2 : 1) ||\n !interactable.options[action.name as keyof ActionDefaults].enabled\n ) {\n return false\n }\n\n copyAction(this.prepared, action)\n\n this.interactable = interactable\n this.element = element\n this.rect = interactable.getRect(element)\n this.edges = this.prepared.edges\n ? extend({}, this.prepared.edges)\n : { left: true, right: true, top: true, bottom: true }\n this._stopped = false\n this._interacting =\n this._doPhase({\n interaction: this,\n event: this.downEvent,\n phase: 'start',\n }) && !this._stopped\n\n return this._interacting\n }\n\n pointerMove (pointer: PointerType, event: PointerEventType, eventTarget: Node) {\n if (!this.simulation && !(this.modification && this.modification.endResult)) {\n this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const duplicateMove =\n this.coords.cur.page.x === this.coords.prev.page.x &&\n this.coords.cur.page.y === this.coords.prev.page.y &&\n this.coords.cur.client.x === this.coords.prev.client.x &&\n this.coords.cur.client.y === this.coords.prev.client.y\n\n let dx: number\n let dy: number\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.coords.cur.client.x - this.coords.start.client.x\n dy = this.coords.cur.client.y - this.coords.start.client.y\n\n this.pointerWasMoved = hypot(dx, dy) > this.pointerMoveTolerance\n }\n\n const pointerIndex = this.getPointerIndex(pointer)\n const signalArg = {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n type: 'move' as const,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: (this as unknown) as Interaction<never>,\n }\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and velocity\n pointerUtils.setCoordVelocity(this.coords.velocity, this.coords.delta)\n }\n\n this._scopeFire('interactions:move', signalArg)\n\n if (!duplicateMove && !this.simulation) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n signalArg.type = null\n this.move(signalArg)\n }\n\n if (this.pointerWasMoved) {\n pointerUtils.copyCoords(this.coords.prev, this.coords.cur)\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.move()\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 move (signalArg?: any) {\n if (!signalArg || !signalArg.event) {\n pointerUtils.setZeroCoords(this.coords.delta)\n }\n\n signalArg = extend(\n {\n pointer: this._latestPointer.pointer,\n event: this._latestPointer.event,\n eventTarget: this._latestPointer.eventTarget,\n interaction: this,\n },\n signalArg || {},\n )\n\n signalArg.phase = 'move'\n\n this._doPhase(signalArg)\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer: PointerType, event: PointerEventType, eventTarget: Node, curEventTarget: EventTarget) {\n let pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) {\n pointerIndex = this.updatePointer(pointer, event, eventTarget, false)\n }\n\n const type = /cancel$/i.test(event.type) ? 'cancel' : 'up'\n\n this._scopeFire(`interactions:${type}` as 'interactions:up' | 'interactions:cancel', {\n pointer,\n pointerIndex,\n pointerInfo: this.pointers[pointerIndex],\n event,\n eventTarget,\n type: type as any,\n curEventTarget,\n interaction: (this as unknown) as Interaction<never>,\n })\n\n if (!this.simulation) {\n this.end(event)\n }\n\n this.removePointer(pointer, event)\n }\n\n documentBlur (event: Event) {\n this.end(event as any)\n this._scopeFire('interactions:blur', {\n event,\n type: 'blur',\n interaction: (this as unknown) as Interaction<never>,\n })\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 * @param {PointerEvent} [event]\n */\n end (event?: PointerEventType) {\n this._ending = true\n event = event || this._latestPointer.event\n let endPhaseResult: boolean\n\n if (this.interacting()) {\n endPhaseResult = this._doPhase({\n event,\n interaction: this,\n phase: 'end',\n })\n }\n\n this._ending = false\n\n if (endPhaseResult === true) {\n this.stop()\n }\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 this._scopeFire('interactions:stop', { interaction: this })\n\n this.interactable = this.element = null\n\n this._interacting = false\n this._stopped = true\n this.prepared.name = this.prevEvent = null\n }\n\n getPointerIndex (pointer: PointerType) {\n const pointerId = pointerUtils.getPointerId(pointer)\n\n // mouse and pen interactions may have only one pointer\n return this.pointerType === 'mouse' || this.pointerType === 'pen'\n ? this.pointers.length - 1\n : arr.findIndex(this.pointers, (curPointer) => curPointer.id === pointerId)\n }\n\n getPointerInfo (pointer: any) {\n return this.pointers[this.getPointerIndex(pointer)]\n }\n\n updatePointer (pointer: PointerType, event: PointerEventType, eventTarget: Node, down?: boolean) {\n const id = pointerUtils.getPointerId(pointer)\n let pointerIndex = this.getPointerIndex(pointer)\n let pointerInfo = this.pointers[pointerIndex]\n\n down = down === false ? false : down || /(down|start)$/i.test(event.type)\n\n if (!pointerInfo) {\n pointerInfo = new PointerInfo(id, pointer, event, null, null)\n\n pointerIndex = this.pointers.length\n this.pointers.push(pointerInfo)\n } else {\n pointerInfo.pointer = pointer\n }\n\n pointerUtils.setCoords(\n this.coords.cur,\n this.pointers.map((p) => p.pointer),\n this._now(),\n )\n pointerUtils.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur)\n\n if (down) {\n this.pointerIsDown = true\n\n pointerInfo.downTime = this.coords.cur.timeStamp\n pointerInfo.downTarget = eventTarget\n pointerUtils.pointerExtend(this.downPointer, pointer)\n\n if (!this.interacting()) {\n pointerUtils.copyCoords(this.coords.start, this.coords.cur)\n pointerUtils.copyCoords(this.coords.prev, this.coords.cur)\n\n this.downEvent = event\n this.pointerWasMoved = false\n }\n }\n\n this._updateLatestPointer(pointer, event, eventTarget)\n\n this._scopeFire('interactions:update-pointer', {\n pointer,\n event,\n eventTarget,\n down,\n pointerInfo,\n pointerIndex,\n interaction: (this as unknown) as Interaction<never>,\n })\n\n return pointerIndex\n }\n\n removePointer (pointer: PointerType, event: PointerEventType) {\n const pointerIndex = this.getPointerIndex(pointer)\n\n if (pointerIndex === -1) return\n\n const pointerInfo = this.pointers[pointerIndex]\n\n this._scopeFire('interactions:remove-pointer', {\n pointer,\n event,\n eventTarget: null,\n pointerIndex,\n pointerInfo,\n interaction: (this as unknown) as Interaction<never>,\n })\n\n this.pointers.splice(pointerIndex, 1)\n this.pointerIsDown = false\n }\n\n _updateLatestPointer (pointer: PointerType, event: PointerEventType, eventTarget: Node) {\n this._latestPointer.pointer = pointer\n this._latestPointer.event = event\n this._latestPointer.eventTarget = eventTarget\n }\n\n destroy () {\n this._latestPointer.pointer = null\n this._latestPointer.event = null\n this._latestPointer.eventTarget = null\n }\n\n _createPreparedEvent<P extends EventPhase> (\n event: PointerEventType,\n phase: P,\n preEnd?: boolean,\n type?: string,\n ) {\n return new InteractEvent<T, P>(this, event, this.prepared.name, phase, this.element, preEnd, type)\n }\n\n _fireEvent<P extends EventPhase> (iEvent: InteractEvent<T, P>) {\n this.interactable.fire(iEvent)\n\n if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {\n this.prevEvent = iEvent\n }\n }\n\n _doPhase<P extends EventPhase> (\n signalArg: Omit<DoPhaseArg<T, P>, 'iEvent'> & { iEvent?: InteractEvent<T, P> },\n ) {\n const { event, phase, preEnd, type } = signalArg\n const { rect } = this\n\n if (rect && phase === 'move') {\n // update the rect changes due to pointer move\n rectUtils.addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource])\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n const beforeResult = this._scopeFire(`interactions:before-action-${phase}` as any, signalArg)\n\n if (beforeResult === false) {\n return false\n }\n\n const iEvent = (signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type))\n\n this._scopeFire(`interactions:action-${phase}` as any, signalArg)\n\n if (phase === 'start') {\n this.prevEvent = iEvent\n }\n\n this._fireEvent(iEvent)\n\n this._scopeFire(`interactions:after-action-${phase}` as any, signalArg)\n\n return true\n }\n\n _now () {\n return Date.now()\n }\n}\n\nexport default Interaction\nexport { PointerInfo }\n","import type Interaction from '@interactjs/core/Interaction'\nimport { _ProxyMethods } from '@interactjs/core/Interaction'\nimport type { Plugin } from '@interactjs/core/scope'\nimport type { Point } from '@interactjs/types/index'\nimport * as rectUtils from '@interactjs/utils/rect'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n offsetBy?: typeof offsetBy\n offset: {\n total: Point\n pending: Point\n }\n }\n\n enum _ProxyMethods {\n offsetBy = '',\n }\n}\n\n;(_ProxyMethods as any).offsetBy = ''\n\nexport function addTotal (interaction: Interaction) {\n if (!interaction.pointerIsDown) {\n return\n }\n\n addToCoords(interaction.coords.cur, interaction.offset.total)\n\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nfunction beforeAction ({ interaction }: { interaction: Interaction }) {\n applyPending(interaction)\n}\n\nfunction beforeEnd ({ interaction }: { interaction: Interaction }): boolean | void {\n const hadPending = applyPending(interaction)\n\n if (!hadPending) return\n\n interaction.move({ offset: true })\n interaction.end()\n\n return false\n}\n\nfunction end ({ interaction }: { interaction: Interaction }) {\n interaction.offset.total.x = 0\n interaction.offset.total.y = 0\n interaction.offset.pending.x = 0\n interaction.offset.pending.y = 0\n}\n\nexport function applyPending (interaction: Interaction) {\n if (!hasPending(interaction)) {\n return false\n }\n\n const { pending } = interaction.offset\n\n addToCoords(interaction.coords.cur, pending)\n addToCoords(interaction.coords.delta, pending)\n rectUtils.addEdges(interaction.edges, interaction.rect, pending)\n\n pending.x = 0\n pending.y = 0\n\n return true\n}\n\nfunction offsetBy (this: Interaction, { x, y }: Point) {\n this.offset.pending.x += x\n this.offset.pending.y += y\n\n this.offset.total.x += x\n this.offset.total.y += y\n}\n\nfunction addToCoords ({ page, client }, { x, y }: Point) {\n page.x += x\n page.y += y\n client.x += x\n client.y += y\n}\n\nfunction hasPending (interaction: Interaction) {\n return !!(interaction.offset.pending.x || interaction.offset.pending.y)\n}\n\nconst offset: Plugin = {\n id: 'offset',\n before: ['modifiers', 'pointer-events', 'actions', 'inertia'],\n install (scope) {\n scope.Interaction.prototype.offsetBy = offsetBy\n },\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.offset = {\n total: { x: 0, y: 0 },\n pending: { x: 0, y: 0 },\n }\n },\n 'interactions:update-pointer': ({ interaction }) => addTotal(interaction),\n 'interactions:before-action-start': beforeAction,\n 'interactions:before-action-move': beforeAction,\n 'interactions:before-action-end': beforeEnd,\n 'interactions:stop': end,\n },\n}\n\nexport default offset\n","import type { Interaction, DoPhaseArg } from '@interactjs/core/Interaction'\nimport type { ActionName, Scope, SignalArgs, Plugin } from '@interactjs/core/scope'\nimport Modification from '@interactjs/modifiers/Modification'\nimport * as modifiers from '@interactjs/modifiers/base'\nimport offset from '@interactjs/offset/plugin'\nimport type { Point, PointerEventType } from '@interactjs/types/index'\nimport * as dom from '@interactjs/utils/domUtils'\nimport hypot from '@interactjs/utils/hypot'\nimport is from '@interactjs/utils/is'\nimport { copyCoords } from '@interactjs/utils/pointerUtils'\nimport raf from '@interactjs/utils/raf'\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface PhaseMap {\n resume?: true\n inertiastart?: true\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n inertia?: InertiaState\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface PerActionDefaults {\n inertia?: {\n enabled?: boolean\n resistance?: number // the lambda in exponential decay\n minSpeed?: number // target speed must be above this for inertia to start\n endSpeed?: number // the speed at which inertia is slow enough to stop\n allowResume?: true // allow resuming an action in inertia phase\n smoothEndDuration?: number // animate to snap/restrict endOnly if there's no inertia\n }\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:before-action-inertiastart': Omit<DoPhaseArg<ActionName, 'inertiastart'>, 'iEvent'>\n 'interactions:action-inertiastart': DoPhaseArg<ActionName, 'inertiastart'>\n 'interactions:after-action-inertiastart': DoPhaseArg<ActionName, 'inertiastart'>\n 'interactions:before-action-resume': Omit<DoPhaseArg<ActionName, 'resume'>, 'iEvent'>\n 'interactions:action-resume': DoPhaseArg<ActionName, 'resume'>\n 'interactions:after-action-resume': DoPhaseArg<ActionName, 'resume'>\n }\n}\n\nfunction install (scope: Scope) {\n const { defaults } = scope\n\n scope.usePlugin(offset)\n scope.usePlugin(modifiers.default)\n scope.actions.phases.inertiastart = true\n scope.actions.phases.resume = true\n\n defaults.perAction.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\nexport class InertiaState {\n active = false\n isModified = false\n smoothEnd = false\n allowResume = false\n\n modification!: Modification\n modifierCount = 0\n modifierArg!: modifiers.ModifierArg\n\n startCoords!: Point\n t0 = 0\n v0 = 0\n\n te = 0\n targetOffset!: Point\n modifiedOffset!: Point\n currentOffset!: Point\n\n lambda_v0? = 0 // eslint-disable-line camelcase\n one_ve_v0? = 0 // eslint-disable-line camelcase\n timeout!: number\n readonly interaction: Interaction\n\n constructor (interaction: Interaction) {\n this.interaction = interaction\n }\n\n start (event: PointerEventType) {\n const { interaction } = this\n const options = getOptions(interaction)\n\n if (!options || !options.enabled) {\n return false\n }\n\n const { client: velocityClient } = interaction.coords.velocity\n const pointerSpeed = hypot(velocityClient.x, velocityClient.y)\n const modification = this.modification || (this.modification = new Modification(interaction))\n\n modification.copyFrom(interaction.modification)\n\n this.t0 = interaction._now()\n this.allowResume = options.allowResume\n this.v0 = pointerSpeed\n this.currentOffset = { x: 0, y: 0 }\n this.startCoords = interaction.coords.cur.page\n\n this.modifierArg = modification.fillArg({\n pageCoords: this.startCoords,\n preEnd: true,\n phase: 'inertiastart',\n })\n\n const thrown =\n this.t0 - interaction.coords.cur.timeStamp < 50 &&\n pointerSpeed > options.minSpeed &&\n pointerSpeed > options.endSpeed\n\n if (thrown) {\n this.startInertia()\n } else {\n modification.result = modification.setAll(this.modifierArg)\n\n if (!modification.result.changed) {\n return false\n }\n\n this.startSmoothEnd()\n }\n\n // force modification change\n interaction.modification.result.rect = null\n\n // bring inertiastart event to the target coords\n interaction.offsetBy(this.targetOffset)\n interaction._doPhase({\n interaction,\n event,\n phase: 'inertiastart',\n })\n interaction.offsetBy({ x: -this.targetOffset.x, y: -this.targetOffset.y })\n // force modification change\n interaction.modification.result.rect = null\n\n this.active = true\n interaction.simulation = this\n\n return true\n }\n\n startInertia () {\n const startVelocity = this.interaction.coords.velocity.client\n const options = getOptions(this.interaction)\n const lambda = options.resistance\n const inertiaDur = -Math.log(options.endSpeed / this.v0) / lambda\n\n this.targetOffset = {\n x: (startVelocity.x - inertiaDur) / lambda,\n y: (startVelocity.y - inertiaDur) / lambda,\n }\n\n this.te = inertiaDur\n this.lambda_v0 = lambda / this.v0\n this.one_ve_v0 = 1 - options.endSpeed / this.v0\n\n const { modification, modifierArg } = this\n\n modifierArg.pageCoords = {\n x: this.startCoords.x + this.targetOffset.x,\n y: this.startCoords.y + this.targetOffset.y,\n }\n\n modification.result = modification.setAll(modifierArg)\n\n if (modification.result.changed) {\n this.isModified = true\n this.modifiedOffset = {\n x: this.targetOffset.x + modification.result.delta.x,\n y: this.targetOffset.y + modification.result.delta.y,\n }\n }\n\n this.onNextFrame(() => this.inertiaTick())\n }\n\n startSmoothEnd () {\n this.smoothEnd = true\n this.isModified = true\n this.targetOffset = {\n x: this.modification.result.delta.x,\n y: this.modification.result.delta.y,\n }\n\n this.onNextFrame(() => this.smoothEndTick())\n }\n\n onNextFrame (tickFn: () => void) {\n this.timeout = raf.request(() => {\n if (this.active) {\n tickFn()\n }\n })\n }\n\n inertiaTick () {\n const { interaction } = this\n const options = getOptions(interaction)\n const lambda = options.resistance\n const t = (interaction._now() - this.t0) / 1000\n\n if (t < this.te) {\n const progress = 1 - (Math.exp(-lambda * t) - this.lambda_v0) / this.one_ve_v0\n let newOffset: Point\n\n if (this.isModified) {\n newOffset = getQuadraticCurvePoint(\n 0,\n 0,\n this.targetOffset.x,\n this.targetOffset.y,\n this.modifiedOffset.x,\n this.modifiedOffset.y,\n progress,\n )\n } else {\n newOffset = {\n x: this.targetOffset.x * progress,\n y: this.targetOffset.y * progress,\n }\n }\n\n const delta = { x: newOffset.x - this.currentOffset.x, y: newOffset.y - this.currentOffset.y }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move()\n\n this.onNextFrame(() => this.inertiaTick())\n } else {\n interaction.offsetBy({\n x: this.modifiedOffset.x - this.currentOffset.x,\n y: this.modifiedOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n smoothEndTick () {\n const { interaction } = this\n const t = interaction._now() - this.t0\n const { smoothEndDuration: duration } = getOptions(interaction)\n\n if (t < duration) {\n const newOffset = {\n x: easeOutQuad(t, 0, this.targetOffset.x, duration),\n y: easeOutQuad(t, 0, this.targetOffset.y, duration),\n }\n const delta = {\n x: newOffset.x - this.currentOffset.x,\n y: newOffset.y - this.currentOffset.y,\n }\n\n this.currentOffset.x += delta.x\n this.currentOffset.y += delta.y\n\n interaction.offsetBy(delta)\n interaction.move({ skipModifiers: this.modifierCount })\n\n this.onNextFrame(() => this.smoothEndTick())\n } else {\n interaction.offsetBy({\n x: this.targetOffset.x - this.currentOffset.x,\n y: this.targetOffset.y - this.currentOffset.y,\n })\n\n this.end()\n }\n }\n\n resume ({ pointer, event, eventTarget }: SignalArgs['interactions:down']) {\n const { interaction } = this\n\n // undo inertia changes to interaction coords\n interaction.offsetBy({\n x: -this.currentOffset.x,\n y: -this.currentOffset.y,\n })\n\n // update pointer at pointer down position\n interaction.updatePointer(pointer, event, eventTarget, true)\n\n // fire resume signals and event\n interaction._doPhase({\n interaction,\n event,\n phase: 'resume',\n })\n copyCoords(interaction.coords.prev, interaction.coords.cur)\n\n this.stop()\n }\n\n end () {\n this.interaction.move()\n this.interaction.end()\n this.stop()\n }\n\n stop () {\n this.active = this.smoothEnd = false\n this.interaction.simulation = null\n raf.cancel(this.timeout)\n }\n}\n\nfunction start ({ interaction, event }: DoPhaseArg<ActionName, 'end'>) {\n if (!interaction._interacting || interaction.simulation) {\n return null\n }\n\n const started = interaction.inertia.start(event)\n\n // prevent action end if inertia or smoothEnd\n return started ? false : null\n}\n\n// Check if the down event hits the current inertia target\n// control should be return to the user\nfunction resume (arg: SignalArgs['interactions:down']) {\n const { interaction, eventTarget } = arg\n const state = interaction.inertia\n\n if (!state.active) return\n\n let element = eventTarget as Node\n\n // climb up the DOM tree from the event target\n while (is.element(element)) {\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n state.resume(arg)\n break\n }\n\n element = dom.parentNode(element)\n }\n}\n\nfunction stop ({ interaction }: { interaction: Interaction }) {\n const state = interaction.inertia\n\n if (state.active) {\n state.stop()\n }\n}\n\nfunction getOptions ({ interactable, prepared }: Interaction) {\n return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia\n}\n\nconst inertia: Plugin = {\n id: 'inertia',\n before: ['modifiers', 'actions'],\n install,\n listeners: {\n 'interactions:new': ({ interaction }) => {\n interaction.inertia = new InertiaState(interaction)\n },\n\n 'interactions:before-action-end': start,\n 'interactions:down': resume,\n 'interactions:stop': stop,\n\n 'interactions:before-action-resume': (arg) => {\n const { modification } = arg.interaction\n\n modification.stop(arg)\n modification.start(arg, arg.interaction.coords.cur.page)\n modification.applyToInteraction(arg)\n },\n\n 'interactions:before-action-inertiastart': (arg) => arg.interaction.modification.setAndApply(arg),\n 'interactions:action-resume': modifiers.addEventModifiers,\n 'interactions:action-inertiastart': modifiers.addEventModifiers,\n 'interactions:after-action-inertiastart': (arg) =>\n arg.interaction.modification.restoreInteractionCoords(arg),\n 'interactions:after-action-resume': (arg) => arg.interaction.modification.restoreInteractionCoords(arg),\n },\n}\n\n// http://stackoverflow.com/a/5634528/2280888\nfunction _getQBezierValue (t: number, p1: number, p2: number, p3: number) {\n const iT = 1 - t\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3\n}\n\nfunction getQuadraticCurvePoint (\n startX: number,\n startY: number,\n cpX: number,\n cpY: number,\n endX: number,\n endY: number,\n position: number,\n) {\n return {\n x: _getQBezierValue(position, startX, cpX, endX),\n y: _getQBezierValue(position, startY, cpY, endY),\n }\n}\n\n// http://gizma.com/easing/\nfunction easeOutQuad (t: number, b: number, c: number, d: number) {\n t /= d\n return -c * t * (t - 2) + b\n}\n\nexport default inertia\n","import type { Listener, ListenersArg, Rect } from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport extend from '@interactjs/utils/extend'\nimport type { NormalizedListeners } from '@interactjs/utils/normalizeListeners'\nimport normalize from '@interactjs/utils/normalizeListeners'\n\nfunction fireUntilImmediateStopped (event: any, listeners: Listener[]) {\n for (const listener of listeners) {\n if (event.immediatePropagationStopped) {\n break\n }\n\n listener(event)\n }\n}\n\nexport class Eventable {\n options: any\n types: NormalizedListeners = {}\n propagationStopped = false\n immediatePropagationStopped = false\n global: any\n\n constructor (options?: { [index: string]: any }) {\n this.options = extend({}, options || {})\n }\n\n fire<T extends { type: string, propagationStopped?: boolean }> (event: T) {\n let listeners: Listener[]\n const global = this.global\n\n // Interactable#on() listeners\n // tslint:disable no-conditional-assignment\n if ((listeners = this.types[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners)\n }\n }\n\n on (type: string, listener: ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n this.types[type] = arr.merge(this.types[type] || [], listeners[type])\n }\n }\n\n off (type: string, listener: ListenersArg) {\n const listeners = normalize(type, listener)\n\n for (type in listeners) {\n const eventList = this.types[type]\n\n if (!eventList || !eventList.length) {\n continue\n }\n\n for (const subListener of listeners[type]) {\n const index = eventList.indexOf(subListener)\n\n if (index !== -1) {\n eventList.splice(index, 1)\n }\n }\n }\n }\n\n getRect (_element: Element): Rect {\n return null\n }\n}\n","import type { Actions } from '@interactjs/core/scope'\n\nexport default function isNonNativeEvent (type: string, actions: Actions) {\n if (actions.phaselessTypes[type]) {\n return true\n }\n\n for (const name in actions.map) {\n if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) {\n return true\n }\n }\n\n return false\n}\n","/** @module interact */\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type { Context, EventTypes, Listener, ListenersArg, Target, Element } from '@interactjs/types/index'\nimport browser from '@interactjs/utils/browser'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport is from '@interactjs/utils/is'\nimport { warnOnce } from '@interactjs/utils/misc'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\nimport type { Interactable } from './Interactable'\nimport isNonNativeEvent from './isNonNativeEvent'\nimport type { Options } from './options'\n\ndeclare module '@interactjs/core/InteractStatic' {\n export interface InteractStatic {\n (target: Target, options?: Options): Interactable\n getPointerAverage: typeof pointerUtils.pointerAverage\n getTouchBBox: typeof pointerUtils.touchBBox\n getTouchDistance: typeof pointerUtils.touchDistance\n getTouchAngle: typeof pointerUtils.touchAngle\n getElementRect: typeof domUtils.getElementRect\n getElementClientRect: typeof domUtils.getElementClientRect\n matchesSelector: typeof domUtils.matchesSelector\n closest: typeof domUtils.closest\n /** @internal */ globalEvents: any\n version: string\n /** @internal */ scope: Scope\n use(\n plugin: Plugin,\n options?: {\n [key: string]: any\n },\n ): any\n isSet(target: Element, options?: any): boolean\n on(type: string | EventTypes, listener: ListenersArg, options?: object): any\n off(type: EventTypes, listener: any, options?: object): any\n debug(): any\n supportsTouch(): boolean\n supportsPointerEvent(): boolean\n stop(): any\n pointerMoveTolerance(newValue?: number): any\n addDocument(doc: Document, options?: object): void\n removeDocument(doc: Document): void\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype _InteractStatic = import('@interactjs/core/InteractStatic').InteractStatic\n\nexport function createInteractStatic (scope: Scope): _InteractStatic {\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} target The HTML or SVG Element to interact with\n * or CSS selector\n * @return {Interactable}\n */\n const interact = ((target: Target, options: Options) => {\n let interactable = scope.interactables.get(target, options)\n\n if (!interactable) {\n interactable = scope.interactables.new(target, options)\n interactable.events.global = interact.globalEvents\n }\n\n return interactable\n }) as _InteractStatic\n\n // expose the functions used to calculate multi-touch properties\n interact.getPointerAverage = pointerUtils.pointerAverage\n interact.getTouchBBox = pointerUtils.touchBBox\n interact.getTouchDistance = pointerUtils.touchDistance\n interact.getTouchAngle = pointerUtils.touchAngle\n\n interact.getElementRect = domUtils.getElementRect\n interact.getElementClientRect = domUtils.getElementClientRect\n interact.matchesSelector = domUtils.matchesSelector\n interact.closest = domUtils.closest\n\n interact.globalEvents = {} as any\n\n // eslint-disable-next-line no-undef\n interact.version = process.env.npm_package_version\n interact.scope = scope\n /**\n * Use a plugin\n *\n * @alias module:interact.use\n *\n */\n interact.use = function (plugin, options) {\n this.scope.usePlugin(plugin, options)\n\n return this\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 {Target} target The Element or string being searched for\n * @param {object} options\n * @return {boolean} Indicates if the element or CSS selector was previously\n * passed to interact\n */\n interact.isSet = function (target: Target, options?: { context?: Context }): boolean {\n return !!this.scope.interactables.get(target, options && options.context)\n }\n\n /**\n * @deprecated\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 */\n interact.on = warnOnce(function on (type: string | EventTypes, listener: ListenersArg, options?: object) {\n if (is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (is.array(type)) {\n for (const eventType of type as any[]) {\n this.on(eventType, listener, options)\n }\n\n return this\n }\n\n if (is.object(type)) {\n for (const prop in type) {\n this.on(prop, (type as any)[prop], listener)\n }\n\n return this\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (isNonNativeEvent(type, this.scope.actions)) {\n // if this type of event was never bound\n if (!this.globalEvents[type]) {\n this.globalEvents[type] = [listener]\n } else {\n this.globalEvents[type].push(listener)\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n this.scope.events.add(this.scope.document, type, listener as Listener, { options })\n }\n\n return this\n }, 'The interact.on() method is being deprecated')\n\n /**\n * @deprecated\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 */\n interact.off = warnOnce(function off (type: EventTypes, listener: any, options?: object) {\n if (is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/)\n }\n\n if (is.array(type)) {\n for (const eventType of type) {\n this.off(eventType, listener, options)\n }\n\n return this\n }\n\n if (is.object(type)) {\n for (const prop in type) {\n this.off(prop, type[prop], listener)\n }\n\n return this\n }\n\n if (isNonNativeEvent(type, this.scope.actions)) {\n let index: number\n\n if (type in this.globalEvents && (index = this.globalEvents[type].indexOf(listener)) !== -1) {\n this.globalEvents[type].splice(index, 1)\n }\n } else {\n this.scope.events.remove(this.scope.document, type, listener, options)\n }\n\n return this\n }, 'The interact.off() method is being deprecated')\n\n interact.debug = function () {\n return this.scope\n }\n\n /**\n * @alias module:interact.supportsTouch\n *\n * @return {boolean} Whether or not the browser supports touch input\n */\n interact.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 */\n interact.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 * @return {object} interact\n */\n interact.stop = function () {\n for (const interaction of this.scope.interactions.list) {\n interaction.stop()\n }\n\n return this\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 */\n interact.pointerMoveTolerance = function (newValue?: number) {\n if (is.number(newValue)) {\n this.scope.interactions.pointerMoveTolerance = newValue\n\n return this\n }\n\n return this.scope.interactions.pointerMoveTolerance\n }\n\n interact.addDocument = function (doc: Document, options?: object) {\n this.scope.addDocument(doc, options)\n }\n\n interact.removeDocument = function (doc: Document) {\n this.scope.removeDocument(doc)\n }\n\n return interact\n}\n","/* eslint-disable no-dupe-class-members */\nimport type { ActionMap, ActionName, Actions, Scope } from '@interactjs/core/scope'\nimport type {\n Context,\n Element,\n Target,\n Listeners,\n OrBoolean,\n EventTypes,\n ListenersArg,\n ActionMethod,\n} from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport browser from '@interactjs/utils/browser'\nimport clone from '@interactjs/utils/clone'\nimport { getElementRect, matchesUpTo, nodeContains, trySelector } from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport normalizeListeners from '@interactjs/utils/normalizeListeners'\nimport { getWindow } from '@interactjs/utils/window'\n\nimport { Eventable } from './Eventable'\nimport isNonNativeEvent from './isNonNativeEvent'\nimport type { ActionDefaults, Defaults, OptionsArg, PerActionDefaults } from './options'\nimport { Options } from './options'\n\ntype IgnoreValue = string | Element | boolean\ntype DeltaSource = 'page' | 'client'\n\n/** */\nexport class Interactable implements Partial<Eventable> {\n /** @internal */ get _defaults (): Defaults {\n return {\n base: {},\n perAction: {},\n actions: {} as ActionDefaults,\n }\n }\n\n readonly options!: Required<Options>\n readonly _actions: Actions\n readonly target: Target\n readonly events = new Eventable()\n readonly _context: Context\n readonly _win: Window\n readonly _doc: Document\n readonly _scopeEvents: Scope['events']\n\n /** @internal */ _rectChecker?: typeof Interactable.prototype.getRect\n\n /** */\n constructor (\n target: Target,\n options: any,\n defaultContext: Document | Element,\n scopeEvents: Scope['events'],\n ) {\n this._actions = options.actions\n this.target = target\n this._context = options.context || defaultContext\n this._win = getWindow(trySelector(target) ? this._context : target)\n this._doc = this._win.document\n this._scopeEvents = scopeEvents\n\n this.set(options)\n }\n\n setOnEvents (actionName: ActionName, phases: NonNullable<any>) {\n if (is.func(phases.onstart)) {\n this.on(`${actionName}start`, phases.onstart)\n }\n if (is.func(phases.onmove)) {\n this.on(`${actionName}move`, phases.onmove)\n }\n if (is.func(phases.onend)) {\n this.on(`${actionName}end`, phases.onend)\n }\n if (is.func(phases.oninertiastart)) {\n this.on(`${actionName}inertiastart`, phases.oninertiastart)\n }\n\n return this\n }\n\n updatePerActionListeners (actionName: ActionName, prev: Listeners, cur: Listeners) {\n if (is.array(prev) || is.object(prev)) {\n this.off(actionName, prev)\n }\n\n if (is.array(cur) || is.object(cur)) {\n this.on(actionName, cur)\n }\n }\n\n setPerAction (actionName: ActionName, options: OrBoolean<Options>) {\n const defaults = this._defaults\n\n // for all the default per-action options\n for (const optionName_ in options) {\n const optionName = optionName_ as keyof PerActionDefaults\n const actionOptions = this.options[actionName]\n const optionValue: any = options[optionName]\n\n // remove old event listeners and add new ones\n if (optionName === 'listeners') {\n this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue as Listeners)\n }\n\n // if the option value is an array\n if (is.array(optionValue)) {\n ;(actionOptions[optionName] as any) = arr.from(optionValue)\n }\n // if the option value is an object\n else if (is.plainObject(optionValue)) {\n // copy the object\n ;(actionOptions[optionName] as any) = extend(\n actionOptions[optionName] || ({} as any),\n clone(optionValue),\n )\n\n // set anabled field to true if it exists in the defaults\n if (\n is.object(defaults.perAction[optionName]) &&\n 'enabled' in (defaults.perAction[optionName] as any)\n ) {\n ;(actionOptions[optionName] as any).enabled = optionValue.enabled !== false\n }\n }\n // if the option value is a boolean and the default is an object\n else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {\n ;(actionOptions[optionName] as any).enabled = optionValue\n }\n // if it's anything else, do a plain assignment\n else {\n ;(actionOptions[optionName] as any) = optionValue\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 {Rect} The object's bounding rectangle.\n */\n getRect (element: Element) {\n element = element || (is.element(this.target) ? this.target : null)\n\n if (is.string(this.target)) {\n element = 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(): (element: Element) => any | null\n rectChecker(checker: (element: Element) => any): this\n rectChecker (checker?: (element: Element) => any) {\n if (is.func(checker)) {\n this._rectChecker = checker\n\n this.getRect = (element) => {\n const rect = extend({}, this._rectChecker(element))\n\n if (!(('width' in rect) as unknown)) {\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n return rect\n }\n\n return this\n }\n\n if (checker === null) {\n delete this.getRect\n delete this._rectChecker\n\n return this\n }\n\n return this.getRect\n }\n\n _backCompatOption (optionName: keyof Options, newValue: any) {\n if (trySelector(newValue) || is.object(newValue)) {\n ;(this.options[optionName] as any) = newValue\n\n for (const action in this._actions.map) {\n ;(this.options[action as keyof ActionMap] as any)[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: any) {\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(): DeltaSource\n deltaSource(newValue: DeltaSource): this\n deltaSource (newValue?: DeltaSource) {\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: Document | Node) {\n return this._context === element.ownerDocument || nodeContains(this._context, element)\n }\n\n testIgnoreAllow (\n this: Interactable,\n options: { ignoreFrom?: IgnoreValue, allowFrom?: IgnoreValue },\n targetNode: Node,\n eventTarget: Node,\n ) {\n return (\n !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) &&\n this.testAllow(options.allowFrom, targetNode, eventTarget)\n )\n }\n\n testAllow (this: Interactable, allowFrom: IgnoreValue, targetNode: Node, element: Node) {\n if (!allowFrom) {\n return true\n }\n\n if (!is.element(element)) {\n return false\n }\n\n if (is.string(allowFrom)) {\n return matchesUpTo(element, allowFrom, targetNode)\n } else if (is.element(allowFrom)) {\n return nodeContains(allowFrom, element)\n }\n\n return false\n }\n\n testIgnore (this: Interactable, ignoreFrom: IgnoreValue, targetNode: Node, element: Node) {\n if (!ignoreFrom || !is.element(element)) {\n return false\n }\n\n if (is.string(ignoreFrom)) {\n return matchesUpTo(element, ignoreFrom, targetNode)\n } else if (is.element(ignoreFrom)) {\n return nodeContains(ignoreFrom, element)\n }\n\n return false\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<E extends { type: string }> (iEvent: E) {\n this.events.fire(iEvent)\n\n return this\n }\n\n _onOff (method: 'on' | 'off', typeArg: EventTypes, listenerArg?: ListenersArg | null, options?: any) {\n if (is.object(typeArg) && !is.array(typeArg)) {\n options = listenerArg\n listenerArg = null\n }\n\n const addRemove = method === 'on' ? 'add' : 'remove'\n const listeners = normalizeListeners(typeArg, listenerArg)\n\n for (let type in listeners) {\n if (type === 'wheel') {\n type = browser.wheelEvent\n }\n\n for (const listener of listeners[type]) {\n // if it is an action event type\n if (isNonNativeEvent(type, this._actions)) {\n this.events[method](type, listener)\n }\n // delegated event\n else if (is.string(this.target)) {\n this._scopeEvents[`${addRemove}Delegate` as 'addDelegate' | 'removeDelegate'](\n this.target,\n this._context,\n type,\n listener,\n options,\n )\n }\n // remove listener from this Interactable's element\n else {\n this._scopeEvents[addRemove](this.target, type, listener, options)\n }\n }\n }\n\n return this\n }\n\n /**\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n * @param {string | array | object} types The types of events to listen\n * for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * addEventListener\n * @return {Interactable} This Interactable\n */\n on (types: EventTypes, listener?: ListenersArg, options?: any) {\n return this._onOff('on', types, listener, options)\n }\n\n /**\n * Removes an InteractEvent, pointerEvent or DOM event listener.\n *\n * @param {string | array | object} types The types of events that were\n * listened for\n * @param {function | array | object} [listener] The event listener function(s)\n * @param {object | boolean} [options] options object or useCapture flag for\n * removeEventListener\n * @return {Interactable} This Interactable\n */\n off (types: string | string[] | EventTypes, listener?: ListenersArg, options?: any) {\n return this._onOff('off', types, listener, options)\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: OptionsArg) {\n const defaults = this._defaults\n\n if (!is.object(options)) {\n options = {}\n }\n\n ;(this.options as Required<Options>) = clone(defaults.base) as Required<Options>\n\n for (const actionName_ in this._actions.methodDict) {\n const actionName = actionName_ as ActionName\n const methodName = this._actions.methodDict[actionName]\n\n this.options[actionName] = {}\n this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]))\n ;(this[methodName] as ActionMethod<unknown>)(options[actionName])\n }\n\n for (const setting in options) {\n if (is.func((this as any)[setting])) {\n ;(this as any)[setting](options[setting as keyof typeof options])\n }\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 unset () {\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in this._scopeEvents.delegatedEvents) {\n const delegated = this._scopeEvents.delegatedEvents[type]\n\n for (let i = delegated.length - 1; i >= 0; i--) {\n const { selector, context, listeners } = delegated[i]\n\n if (selector === this.target && context === this._context) {\n delegated.splice(i, 1)\n }\n\n for (let l = listeners.length - 1; l >= 0; l--) {\n this._scopeEvents.removeDelegate(\n this.target,\n this._context,\n type,\n listeners[l][0],\n listeners[l][1],\n )\n }\n }\n }\n } else {\n this._scopeEvents.remove(this.target as Node, 'all')\n }\n }\n}\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { OptionsArg, Options } from '@interactjs/core/options'\nimport type { Scope } from '@interactjs/core/scope'\nimport type { Target, Context } from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactable:new': {\n interactable: Interactable\n target: Target\n options: OptionsArg\n win: Window\n }\n }\n}\n\ninterface InteractableScopeProp {\n context: Context\n interactable: Interactable\n}\n\nexport class InteractableSet {\n // all set interactables\n list: Interactable[] = []\n\n selectorMap: {\n [selector: string]: InteractableScopeProp[]\n } = {}\n\n scope: Scope\n\n constructor (scope: Scope) {\n this.scope = scope\n scope.addListeners({\n 'interactable:unset': ({ interactable }) => {\n const { target, _context: context } = interactable\n const targetMappings: InteractableScopeProp[] = is.string(target)\n ? this.selectorMap[target]\n : (target as any)[this.scope.id]\n\n const targetIndex = arr.findIndex(targetMappings, (m) => m.context === context)\n if (targetMappings[targetIndex]) {\n // Destroying mappingInfo's context and interactable\n targetMappings[targetIndex].context = null\n targetMappings[targetIndex].interactable = null\n }\n targetMappings.splice(targetIndex, 1)\n },\n })\n }\n\n new (target: Target, options?: any): Interactable {\n options = extend(options || {}, {\n actions: this.scope.actions,\n })\n const interactable = new this.scope.Interactable(target, options, this.scope.document, this.scope.events)\n const mappingInfo = { context: interactable._context, interactable }\n\n this.scope.addDocument(interactable._doc)\n this.list.push(interactable)\n\n if (is.string(target)) {\n if (!this.selectorMap[target]) {\n this.selectorMap[target] = []\n }\n this.selectorMap[target].push(mappingInfo)\n } else {\n if (!(interactable.target as any)[this.scope.id]) {\n Object.defineProperty(target, this.scope.id, {\n value: [],\n configurable: true,\n })\n }\n\n ;(target as any)[this.scope.id].push(mappingInfo)\n }\n\n this.scope.fire('interactable:new', {\n target,\n options,\n interactable,\n win: this.scope._win,\n })\n\n return interactable\n }\n\n get (target: Target, options?: Options) {\n const context = (options && options.context) || this.scope.document\n const isSelector = is.string(target)\n const targetMappings: InteractableScopeProp[] = isSelector\n ? this.selectorMap[target as string]\n : (target as any)[this.scope.id]\n\n if (!targetMappings) {\n return null\n }\n\n const found = arr.find(\n targetMappings,\n (m) => m.context === context && (isSelector || m.interactable.inContext(target as any)),\n )\n\n return found && found.interactable\n }\n\n forEachMatch<T> (node: Node, callback: (interactable: Interactable) => T) {\n for (const interactable of this.list) {\n let ret: void | T\n\n if (\n (is.string(interactable.target)\n ? // target is a selector and the element matches\n is.element(node) && domUtils.matchesSelector(node, interactable.target)\n : // target is the element\n node === interactable.target) &&\n // the element is in context\n interactable.inContext(node)\n ) {\n ret = callback(interactable)\n }\n\n if (ret !== undefined) {\n return ret\n }\n }\n }\n}\n","import type { Scope } from '@interactjs/core/scope'\nimport type { Element } from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport pExtend from '@interactjs/utils/pointerExtend'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n events: ReturnType<typeof install>\n }\n}\n\ntype Listener = (event: Event | FakeEvent) => any\n\nfunction install (scope: Scope) {\n const targets: Array<{\n eventTarget: EventTarget\n events: { [type: string]: Listener[] }\n }> = []\n\n const delegatedEvents: {\n [type: string]: Array<{\n selector: string\n context: Node\n listeners: Array<[Listener, { capture: boolean, passive: boolean }]>\n }>\n } = {}\n const documents: Document[] = []\n\n const eventsMethods = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n targets,\n\n supportsOptions: false,\n supportsPassive: false,\n }\n\n // check if browser supports passive events and options arg\n scope.document?.createElement('div').addEventListener('test', null, {\n get capture () {\n return (eventsMethods.supportsOptions = true)\n },\n get passive () {\n return (eventsMethods.supportsPassive = true)\n },\n })\n\n scope.events = eventsMethods\n\n function add (eventTarget: EventTarget, type: string, listener: Listener, optionalArg?: boolean | any) {\n const options = getOptions(optionalArg)\n let target = arr.find(targets, (t) => t.eventTarget === eventTarget)\n\n if (!target) {\n target = {\n eventTarget,\n events: {},\n }\n\n targets.push(target)\n }\n\n if (!target.events[type]) {\n target.events[type] = []\n }\n\n if (eventTarget.addEventListener && !arr.contains(target.events[type], listener)) {\n eventTarget.addEventListener(\n type,\n listener as any,\n eventsMethods.supportsOptions ? options : options.capture,\n )\n target.events[type].push(listener)\n }\n }\n\n function remove (\n eventTarget: EventTarget,\n type: string,\n listener?: 'all' | Listener,\n optionalArg?: boolean | any,\n ) {\n const options = getOptions(optionalArg)\n const targetIndex = arr.findIndex(targets, (t) => t.eventTarget === eventTarget)\n const target = targets[targetIndex]\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(eventTarget, type, 'all')\n }\n }\n return\n }\n\n let typeIsEmpty = false\n const typeListeners = target.events[type]\n\n if (typeListeners) {\n if (listener === 'all') {\n for (let i = typeListeners.length - 1; i >= 0; i--) {\n remove(eventTarget, type, typeListeners[i], options)\n }\n return\n } else {\n for (let i = 0; i < typeListeners.length; i++) {\n if (typeListeners[i] === listener) {\n eventTarget.removeEventListener(\n type,\n listener as any,\n eventsMethods.supportsOptions ? options : options.capture,\n )\n typeListeners.splice(i, 1)\n\n if (typeListeners.length === 0) {\n delete target.events[type]\n typeIsEmpty = true\n }\n\n break\n }\n }\n }\n }\n\n if (typeIsEmpty && !Object.keys(target.events).length) {\n targets.splice(targetIndex, 1)\n }\n }\n\n function addDelegate (selector: string, context: Node, type: string, listener: Listener, optionalArg?: any) {\n const options = getOptions(optionalArg)\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = []\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 delegates = delegatedEvents[type]\n let delegate = arr.find(delegates, (d) => d.selector === selector && d.context === context)\n\n if (!delegate) {\n delegate = { selector, context, listeners: [] }\n delegates.push(delegate)\n }\n\n delegate.listeners.push([listener, options])\n }\n\n function removeDelegate (\n selector: string,\n context: Document | Element,\n type: string,\n listener?: Listener,\n optionalArg?: any,\n ) {\n const options = getOptions(optionalArg)\n const delegates = delegatedEvents[type]\n let matchFound = false\n let index: number\n\n if (!delegates) return\n\n // count from last index of delegated to 0\n for (index = delegates.length - 1; index >= 0; index--) {\n const cur = delegates[index]\n // look for matching selector and context Node\n if (cur.selector === selector && cur.context === context) {\n const { listeners } = cur\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 target have been removed\n // remove the target from the delegates array\n if (!listeners.length) {\n delegates.splice(index, 1)\n\n // remove delegate function from context\n remove(context, type, delegateListener)\n remove(context, type, delegateUseCapture, true)\n }\n\n // only remove one listener\n matchFound = true\n break\n }\n }\n\n if (matchFound) {\n break\n }\n }\n }\n }\n\n // bound to the interactable context when a DOM event\n // listener is added to a selector interactable\n function delegateListener (event: Event | FakeEvent, optionalArg?: any) {\n const options = getOptions(optionalArg)\n const fakeEvent = new FakeEvent(event as Event)\n const delegates = delegatedEvents[event.type]\n const [eventTarget] = pointerUtils.getEventTargets(event as Event)\n let element: Node = eventTarget\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegates.length; i++) {\n const cur = delegates[i]\n const { selector, context } = cur\n\n if (\n domUtils.matchesSelector(element, selector) &&\n domUtils.nodeContains(context, eventTarget) &&\n domUtils.nodeContains(context, element)\n ) {\n const { listeners } = cur\n\n fakeEvent.currentTarget = element\n\n for (const [fn, { capture, passive }] of listeners) {\n if (capture === options.capture && passive === options.passive) {\n fn(fakeEvent)\n }\n }\n }\n }\n\n element = domUtils.parentNode(element)\n }\n }\n\n function delegateUseCapture (this: Element, event: Event | FakeEvent) {\n return delegateListener.call(this, event, true)\n }\n\n // for type inferrence\n return eventsMethods\n}\n\nclass FakeEvent implements Partial<Event> {\n currentTarget: Node\n originalEvent: Event\n type: string\n\n constructor (originalEvent: Event) {\n this.originalEvent = originalEvent\n // duplicate the event so that currentTarget can be changed\n pExtend(this, originalEvent)\n }\n\n preventOriginalDefault () {\n this.originalEvent.preventDefault()\n }\n\n stopPropagation () {\n this.originalEvent.stopPropagation()\n }\n\n stopImmediatePropagation () {\n this.originalEvent.stopImmediatePropagation()\n }\n}\n\nfunction getOptions (param: { [index: string]: any } | boolean): { capture: boolean, passive: boolean } {\n if (!is.object(param)) {\n return { capture: !!param, passive: false }\n }\n\n const options = extend({}, param) as any\n\n options.capture = !!param.capture\n options.passive = !!param.passive\n\n return options\n}\n\nexport default {\n id: 'events',\n install,\n}\n","import type Interaction from '@interactjs/core/Interaction'\nimport type { Scope } from '@interactjs/core/scope'\nimport type { PointerType } from '@interactjs/types/index'\nimport * as dom from '@interactjs/utils/domUtils'\n\nexport interface SearchDetails {\n pointer: PointerType\n pointerId: number\n pointerType: string\n eventType: string\n eventTarget: EventTarget\n curEventTarget: EventTarget\n scope: Scope\n}\n\nconst finder = {\n methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'] as const,\n\n search (details: SearchDetails) {\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details)\n\n if (interaction) {\n return interaction\n }\n }\n\n return null\n },\n\n // try to resume simulation with a new pointer\n simulationResume ({ pointerType, eventType, eventTarget, scope }: SearchDetails) {\n if (!/down|start/i.test(eventType)) {\n return null\n }\n\n for (const interaction of scope.interactions.list) {\n let element = eventTarget as Node\n\n if (\n interaction.simulation &&\n interaction.simulation.allowResume &&\n interaction.pointerType === pointerType\n ) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction\n }\n element = dom.parentNode(element)\n }\n }\n }\n\n return null\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen ({ pointerId, pointerType, eventType, scope }: SearchDetails) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null\n }\n\n let firstNonActive\n\n for (const interaction of scope.interactions.list) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !hasPointerId(interaction, pointerId)) {\n continue\n }\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.list) {\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 ({ pointerId, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n if (hasPointerId(interaction, pointerId)) {\n return interaction\n }\n }\n\n return null\n },\n\n // get first idle interaction with a matching pointerType\n idle ({ pointerType, scope }: SearchDetails) {\n for (const interaction of scope.interactions.list) {\n // if there's already a pointer held down\n if (interaction.pointers.length === 1) {\n const target = interaction.interactable\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !(target.options.gesture && target.options.gesture.enabled)) {\n continue\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointers.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\nfunction hasPointerId (interaction: Interaction, pointerId: number) {\n return interaction.pointers.some(({ id }) => id === pointerId)\n}\n\nexport default finder\n","import type { Scope, ActionName, SignalArgs, Plugin } from '@interactjs/core/scope'\nimport type { Listener } from '@interactjs/types/index'\nimport browser from '@interactjs/utils/browser'\nimport domObjects from '@interactjs/utils/domObjects'\nimport { nodeContains } from '@interactjs/utils/domUtils'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\nimport InteractionBase from './Interaction'\nimport interactablePreventDefault from './interactablePreventDefault'\nimport type { SearchDetails } from './interactionFinder'\nimport finder from './interactionFinder'\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n Interaction: typeof InteractionBase\n interactions: {\n new: <T extends ActionName>(options: any) => InteractionBase<T>\n list: Array<InteractionBase<ActionName>>\n listeners: { [type: string]: Listener }\n docEvents: Array<{ type: string, listener: Listener }>\n pointerMoveTolerance: number\n }\n prevTouchTime: number\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:find': {\n interaction: InteractionBase\n searchDetails: SearchDetails\n }\n }\n}\n\nconst methodNames = [\n 'pointerDown',\n 'pointerMove',\n 'pointerUp',\n 'updatePointer',\n 'removePointer',\n 'windowBlur',\n]\n\nfunction install (scope: Scope) {\n const listeners = {} as any\n\n for (const method of methodNames) {\n listeners[method] = doOnInteractions(method, scope)\n }\n\n const pEventTypes = browser.pEventTypes\n let docEvents: typeof scope.interactions.docEvents\n\n if (domObjects.PointerEvent) {\n docEvents = [\n { type: pEventTypes.down, listener: releasePointersOnRemovedEls },\n { type: pEventTypes.down, listener: listeners.pointerDown },\n { type: pEventTypes.move, listener: listeners.pointerMove },\n { type: pEventTypes.up, listener: listeners.pointerUp },\n { type: pEventTypes.cancel, listener: listeners.pointerUp },\n ]\n } else {\n docEvents = [\n { type: 'mousedown', listener: listeners.pointerDown },\n { type: 'mousemove', listener: listeners.pointerMove },\n { type: 'mouseup', listener: listeners.pointerUp },\n\n { type: 'touchstart', listener: releasePointersOnRemovedEls },\n { type: 'touchstart', listener: listeners.pointerDown },\n { type: 'touchmove', listener: listeners.pointerMove },\n { type: 'touchend', listener: listeners.pointerUp },\n { type: 'touchcancel', listener: listeners.pointerUp },\n ]\n }\n\n docEvents.push({\n type: 'blur',\n listener (event) {\n for (const interaction of scope.interactions.list) {\n interaction.documentBlur(event)\n }\n },\n })\n\n // for ignoring browser's simulated mouse events\n scope.prevTouchTime = 0\n\n scope.Interaction = class <T extends ActionName> extends InteractionBase<T> {\n get pointerMoveTolerance () {\n return scope.interactions.pointerMoveTolerance\n }\n\n set pointerMoveTolerance (value) {\n scope.interactions.pointerMoveTolerance = value\n }\n\n _now () {\n return scope.now()\n }\n }\n\n scope.interactions = {\n // all active and idle interactions\n list: [],\n new<T extends ActionName> (options: { pointerType?: string, scopeFire?: Scope['fire'] }) {\n options.scopeFire = (name, arg) => scope.fire(name, arg)\n\n const interaction = new scope.Interaction<T>(options as Required<typeof options>)\n\n scope.interactions.list.push(interaction)\n return interaction\n },\n listeners,\n docEvents,\n pointerMoveTolerance: 1,\n }\n\n function releasePointersOnRemovedEls () {\n // for all inactive touch interactions with pointers down\n for (const interaction of scope.interactions.list) {\n if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) {\n continue\n }\n\n // if a pointer is down on an element that is no longer in the DOM tree\n for (const pointer of interaction.pointers) {\n if (!scope.documents.some(({ doc }) => nodeContains(doc, pointer.downTarget))) {\n // remove the pointer from the interaction\n interaction.removePointer(pointer.pointer, pointer.event)\n }\n }\n }\n }\n\n scope.usePlugin(interactablePreventDefault)\n}\n\nfunction doOnInteractions (method: string, scope: Scope) {\n return function (event: Event) {\n const interactions = scope.interactions.list\n\n const pointerType = pointerUtils.getPointerType(event)\n const [eventTarget, curEventTarget] = pointerUtils.getEventTargets(event)\n const matches: any[] = [] // [ [pointer, interaction], ...]\n\n if (/^touch/.test(event.type)) {\n scope.prevTouchTime = scope.now()\n\n // @ts-expect-error\n for (const changedTouch of event.changedTouches) {\n const pointer = changedTouch\n const pointerId = pointerUtils.getPointerId(pointer)\n const searchDetails: SearchDetails = {\n pointer,\n pointerId,\n pointerType,\n eventType: event.type,\n eventTarget,\n curEventTarget,\n scope,\n }\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n } else {\n let invalidPointer = false\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < interactions.length && !invalidPointer; i++) {\n invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer =\n invalidPointer ||\n scope.now() - scope.prevTouchTime < 500 ||\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n event.timeStamp === 0\n }\n\n if (!invalidPointer) {\n const searchDetails = {\n pointer: event as PointerEvent,\n pointerId: pointerUtils.getPointerId(event as PointerEvent),\n pointerType,\n eventType: event.type,\n curEventTarget,\n eventTarget,\n scope,\n }\n\n const interaction = getInteraction(searchDetails)\n\n matches.push([\n searchDetails.pointer,\n searchDetails.eventTarget,\n searchDetails.curEventTarget,\n interaction,\n ])\n }\n }\n\n // eslint-disable-next-line no-shadow\n for (const [pointer, eventTarget, curEventTarget, interaction] of matches) {\n interaction[method](pointer, event, eventTarget, curEventTarget)\n }\n }\n}\n\nfunction getInteraction (searchDetails: SearchDetails) {\n const { pointerType, scope } = searchDetails\n\n const foundInteraction = finder.search(searchDetails)\n const signalArg = { interaction: foundInteraction, searchDetails }\n\n scope.fire('interactions:find', signalArg)\n\n return signalArg.interaction || scope.interactions.new({ pointerType })\n}\n\nfunction onDocSignal<T extends 'scope:add-document' | 'scope:remove-document'> (\n { doc, scope, options }: SignalArgs[T],\n eventMethodName: 'add' | 'remove',\n) {\n const {\n interactions: { docEvents },\n events,\n } = scope\n const eventMethod = events[eventMethodName]\n\n if (scope.browser.isIOS && !options.events) {\n options.events = { passive: false }\n }\n\n // delegate event listener\n for (const eventType in events.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener)\n eventMethod(doc, eventType, events.delegateUseCapture, true)\n }\n\n const eventOptions = options && options.events\n\n for (const { type, listener } of docEvents) {\n eventMethod(doc, type, listener, eventOptions)\n }\n}\n\nconst interactions: Plugin = {\n id: 'core/interactions',\n install,\n listeners: {\n 'scope:add-document': (arg) => onDocSignal(arg, 'add'),\n 'scope:remove-document': (arg) => onDocSignal(arg, 'remove'),\n 'interactable:unset': ({ interactable }, scope) => {\n // Stop and destroy related interactions when an Interactable is unset\n for (let i = scope.interactions.list.length - 1; i >= 0; i--) {\n const interaction = scope.interactions.list[i]\n\n if (interaction.interactable !== interactable) {\n continue\n }\n\n interaction.stop()\n scope.fire('interactions:destroy', { interaction })\n interaction.destroy()\n\n if (scope.interactions.list.length > 2) {\n scope.interactions.list.splice(i, 1)\n }\n }\n },\n },\n onDocSignal,\n doOnInteractions,\n methodNames,\n}\n\nexport default interactions\n","import type Interaction from '@interactjs/core/Interaction'\nimport browser from '@interactjs/utils/browser'\nimport clone from '@interactjs/utils/clone'\nimport domObjects from '@interactjs/utils/domObjects'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport raf from '@interactjs/utils/raf'\nimport * as win from '@interactjs/utils/window'\n\nimport { Eventable } from './Eventable'\nimport type { PhaseMap } from './InteractEvent'\nimport { InteractEvent } from './InteractEvent'\nimport { createInteractStatic } from './InteractStatic'\nimport type { Interactable } from './Interactable'\nimport { Interactable as InteractableBase } from './Interactable'\nimport { InteractableSet } from './InteractableSet'\nimport events from './events'\nimport interactions from './interactions'\nimport type { OptionsArg } from './options'\nimport { defaults } from './options'\n\nexport interface SignalArgs {\n 'scope:add-document': DocSignalArg\n 'scope:remove-document': DocSignalArg\n 'interactable:unset': { interactable: InteractableBase }\n 'interactable:set': { interactable: InteractableBase, options: OptionsArg }\n 'interactions:destroy': { interaction: Interaction }\n}\n\nexport type ListenerName = keyof SignalArgs\n\nexport type ListenerMap = {\n [P in ListenerName]?: (arg: SignalArgs[P], scope: Scope, signalName: P) => void | boolean\n}\n\ninterface DocSignalArg {\n doc: Document\n window: Window\n scope: Scope\n options: Record<string, any>\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ActionMap {}\nexport type ActionName = keyof ActionMap\n\nexport interface Actions {\n map: ActionMap\n phases: PhaseMap\n methodDict: { [P in ActionName]?: keyof Interactable }\n phaselessTypes: { [type: string]: true }\n}\n\nexport interface Plugin {\n [key: string]: any\n id?: string\n listeners?: ListenerMap\n before?: string[]\n install?(scope: Scope, options?: any): void\n}\n\nexport class Scope {\n id = `__interact_scope_${Math.floor(Math.random() * 100)}`\n isInitialized = false\n listenerMaps: Array<{\n map: ListenerMap\n id: string\n }> = []\n\n browser = browser\n defaults = clone(defaults) as typeof defaults\n Eventable = Eventable\n actions: Actions = {\n map: {},\n phases: {\n start: true,\n move: true,\n end: true,\n },\n methodDict: {},\n phaselessTypes: {},\n }\n\n interactStatic = createInteractStatic(this)\n InteractEvent = InteractEvent\n Interactable: typeof InteractableBase\n interactables = new InteractableSet(this)\n\n // main window\n _win!: Window\n\n // main document\n document!: Document\n\n // main window\n window!: Window\n\n // all documents being listened to\n documents: Array<{ doc: Document, options: any }> = []\n\n _plugins: {\n list: Plugin[]\n map: { [id: string]: Plugin }\n } = {\n list: [],\n map: {},\n }\n\n constructor () {\n const scope = this\n\n this.Interactable = class extends InteractableBase {\n get _defaults () {\n return scope.defaults\n }\n\n set<T extends InteractableBase> (this: T, options: OptionsArg) {\n super.set(options)\n\n scope.fire('interactable:set', {\n options,\n interactable: this,\n })\n\n return this\n }\n\n unset (this: InteractableBase) {\n super.unset()\n scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1)\n\n scope.fire('interactable:unset', { interactable: this })\n }\n }\n }\n\n addListeners (map: ListenerMap, id?: string) {\n this.listenerMaps.push({ id, map })\n }\n\n fire<T extends ListenerName> (name: T, arg: SignalArgs[T]): void | false {\n for (const {\n map: { [name]: listener },\n } of this.listenerMaps) {\n if (!!listener && listener(arg as any, this, name as never) === false) {\n return false\n }\n }\n }\n\n onWindowUnload = (event: BeforeUnloadEvent) => this.removeDocument(event.target as Document)\n\n init (window: Window | typeof globalThis) {\n return this.isInitialized ? this : initScope(this, window)\n }\n\n pluginIsInstalled (plugin: Plugin) {\n return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1\n }\n\n usePlugin (plugin: Plugin, options?: { [key: string]: any }) {\n if (!this.isInitialized) {\n return this\n }\n\n if (this.pluginIsInstalled(plugin)) {\n return this\n }\n\n if (plugin.id) {\n this._plugins.map[plugin.id] = plugin\n }\n this._plugins.list.push(plugin)\n\n if (plugin.install) {\n plugin.install(this, options)\n }\n\n if (plugin.listeners && plugin.before) {\n let index = 0\n const len = this.listenerMaps.length\n const before = plugin.before.reduce((acc, id) => {\n acc[id] = true\n acc[pluginIdRoot(id)] = true\n return acc\n }, {})\n\n for (; index < len; index++) {\n const otherId = this.listenerMaps[index].id\n\n if (before[otherId] || before[pluginIdRoot(otherId)]) {\n break\n }\n }\n\n this.listenerMaps.splice(index, 0, { id: plugin.id, map: plugin.listeners })\n } else if (plugin.listeners) {\n this.listenerMaps.push({ id: plugin.id, map: plugin.listeners })\n }\n\n return this\n }\n\n addDocument (doc: Document, options?: any): void | false {\n // do nothing if document is already known\n if (this.getDocIndex(doc) !== -1) {\n return false\n }\n\n const window = win.getWindow(doc)\n\n options = options ? extend({}, options) : {}\n\n this.documents.push({ doc, options })\n this.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 !== this.document) {\n this.events.add(window, 'unload', this.onWindowUnload)\n }\n\n this.fire('scope:add-document', { doc, window, scope: this, options })\n }\n\n removeDocument (doc: Document) {\n const index = this.getDocIndex(doc)\n\n const window = win.getWindow(doc)\n const options = this.documents[index].options\n\n this.events.remove(window, 'unload', this.onWindowUnload)\n\n this.documents.splice(index, 1)\n this.events.documents.splice(index, 1)\n\n this.fire('scope:remove-document', { doc, window, scope: this, options })\n }\n\n getDocIndex (doc: Document) {\n for (let i = 0; i < this.documents.length; i++) {\n if (this.documents[i].doc === doc) {\n return i\n }\n }\n\n return -1\n }\n\n getDocOptions (doc: Document) {\n const docIndex = this.getDocIndex(doc)\n\n return docIndex === -1 ? null : this.documents[docIndex].options\n }\n\n now () {\n return (((this.window as any).Date as typeof Date) || Date).now()\n }\n}\n\nexport function initScope (scope: Scope, window: Window | typeof globalThis) {\n scope.isInitialized = true\n\n if (is.window(window)) {\n win.init(window)\n }\n\n domObjects.init(window)\n browser.init(window)\n raf.init(window)\n\n // @ts-expect-error\n scope.window = window\n scope.document = window.document\n\n scope.usePlugin(interactions)\n scope.usePlugin(events)\n\n return scope\n}\n\nfunction pluginIdRoot (id: string) {\n return id && id.replace(/\\/.*$/, '')\n}\n","import { Scope } from '@interactjs/core/scope'\n\nconst scope = new Scope()\n\nconst interact = scope.interactStatic\n\nexport default interact\n\nconst _global = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this\nscope.init(_global)\n","export default () => {}\n","export default () => {}\n","import type { SnapFunction, SnapTarget } from '@interactjs/modifiers/snap/pointer'\nimport type { Rect, Point } from '@interactjs/types/index'\n\nexport type GridOptions = (Partial<Rect> | Point) & {\n range?: number\n limits?: Rect\n offset?: Point\n}\n\nexport default (grid: GridOptions) => {\n const coordFields = ([\n ['x', 'y'],\n ['left', 'top'],\n ['right', 'bottom'],\n ['width', 'height'],\n ] as const).filter(([xField, yField]) => xField in grid || yField in grid)\n\n const gridFunc: SnapFunction & {\n grid: typeof grid\n coordFields: typeof coordFields\n } = (x, y) => {\n const {\n range,\n limits = {\n left: -Infinity,\n right: Infinity,\n top: -Infinity,\n bottom: Infinity,\n },\n offset = { x: 0, y: 0 },\n } = grid\n\n const result: SnapTarget & {\n grid: typeof grid\n } = { range, grid, x: null as number, y: null as number }\n\n for (const [xField, yField] of coordFields) {\n const gridx = Math.round((x - offset.x) / (grid as any)[xField])\n const gridy = Math.round((y - offset.y) / (grid as any)[yField])\n\n result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * (grid as any)[xField] + offset.x))\n result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * (grid as any)[yField] + offset.y))\n }\n\n return result\n }\n\n gridFunc.grid = grid\n gridFunc.coordFields = coordFields\n\n return gridFunc\n}\n","import type { Plugin } from '@interactjs/core/scope'\nimport extend from '@interactjs/utils/extend'\n\nimport * as allSnappers from './all'\n\ndeclare module '@interactjs/core/InteractStatic' {\n export interface InteractStatic {\n snappers: typeof allSnappers\n createSnapGrid: typeof allSnappers.grid\n }\n}\n\nconst snappersPlugin: Plugin = {\n id: 'snappers',\n install (scope) {\n const { interactStatic: interact } = scope\n\n interact.snappers = extend(interact.snappers || {}, allSnappers)\n interact.createSnapGrid = interact.snappers.grid\n },\n}\n\nexport default snappersPlugin\n","/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * ```js\n * interact(target).resizable({\n * modifiers: [\n * interact.modifiers.snapSize({\n * targets: [ interact.snappers.grid({ x: 20, y: 20 }) ],\n * }),\n * interact.aspectRatio({ ratio: 'preserve' }),\n * ],\n * });\n * ```\n */\n\nimport type { Point, Rect, EdgeOptions } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport { addEdges } from '@interactjs/utils/rect'\n\nimport Modification from './Modification'\nimport type { Modifier, ModifierModule, ModifierState } from './base'\nimport { makeModifier } from './base'\n\nexport interface AspectRatioOptions {\n ratio?: number | 'preserve'\n equalDelta?: boolean\n modifiers?: Modifier[]\n enabled?: boolean\n}\n\nexport type AspectRatioState = ModifierState<\nAspectRatioOptions,\n{\n startCoords: Point\n startRect: Rect\n linkedEdges: EdgeOptions\n ratio: number\n equalDelta: boolean\n xIsPrimaryAxis: boolean\n edgeSign: 1 | -1\n subModification: Modification\n}\n>\n\nconst aspectRatio: ModifierModule<AspectRatioOptions, AspectRatioState> = {\n start (arg) {\n const { state, rect, edges: originalEdges, pageCoords: coords } = arg\n let { ratio } = state.options\n const { equalDelta, modifiers } = state.options\n\n if (ratio === 'preserve') {\n ratio = rect.width / rect.height\n }\n\n state.startCoords = extend({}, coords)\n state.startRect = extend({}, rect)\n state.ratio = ratio\n state.equalDelta = equalDelta\n\n const linkedEdges = (state.linkedEdges = {\n top: originalEdges.top || (originalEdges.left && !originalEdges.bottom),\n left: originalEdges.left || (originalEdges.top && !originalEdges.right),\n bottom: originalEdges.bottom || (originalEdges.right && !originalEdges.top),\n right: originalEdges.right || (originalEdges.bottom && !originalEdges.left),\n })\n\n state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right)\n\n if (state.equalDelta) {\n state.edgeSign = ((linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1)) as 1 | -1\n } else {\n const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left\n state.edgeSign = negativeSecondaryEdge ? -1 : 1\n }\n\n extend(arg.edges, linkedEdges)\n\n if (!modifiers || !modifiers.length) return\n\n const subModification = new Modification(arg.interaction)\n\n subModification.copyFrom(arg.interaction.modification)\n subModification.prepareStates(modifiers)\n\n state.subModification = subModification\n subModification.startAll({ ...arg })\n },\n\n set (arg) {\n const { state, rect, coords } = arg\n const initialCoords = extend({}, coords)\n const aspectMethod = state.equalDelta ? setEqualDelta : setRatio\n\n aspectMethod(state, state.xIsPrimaryAxis, coords, rect)\n\n if (!state.subModification) {\n return null\n }\n\n const correctedRect = extend({}, rect)\n\n addEdges(state.linkedEdges, correctedRect, {\n x: coords.x - initialCoords.x,\n y: coords.y - initialCoords.y,\n })\n\n const result = state.subModification.setAll({\n ...arg,\n rect: correctedRect,\n edges: state.linkedEdges,\n pageCoords: coords,\n prevCoords: coords,\n prevRect: correctedRect,\n })\n\n const { delta } = result\n\n if (result.changed) {\n const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y)\n\n // do aspect modification again with critical edge axis as primary\n aspectMethod(state, xIsCriticalAxis, result.coords, result.rect)\n extend(coords, result.coords)\n }\n\n return result.eventProps\n },\n\n defaults: {\n ratio: 'preserve',\n equalDelta: false,\n modifiers: [],\n enabled: false,\n },\n}\n\nfunction setEqualDelta ({ startCoords, edgeSign }: AspectRatioState, xIsPrimaryAxis: boolean, coords: Point) {\n if (xIsPrimaryAxis) {\n coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign\n } else {\n coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign\n }\n}\n\nfunction setRatio (\n { startRect, startCoords, ratio, edgeSign }: AspectRatioState,\n xIsPrimaryAxis: boolean,\n coords: Point,\n rect: Rect,\n) {\n if (xIsPrimaryAxis) {\n const newHeight = rect.width / ratio\n\n coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign\n } else {\n const newWidth = rect.height * ratio\n\n coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign\n }\n}\n\nexport default makeModifier(aspectRatio, 'aspectRatio')\nexport { aspectRatio }\n","import type { ModifierFunction } from '@interactjs/modifiers/base'\n\nconst noop = ((() => {}) as unknown) as ModifierFunction<any, any, 'noop'>\n\nnoop._defaults = {}\n\nexport default noop\n","import type Interaction from '@interactjs/core/Interaction'\nimport type { RectResolvable, Rect, Point } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport type { ModifierArg, ModifierModule, ModifierState } from '../base'\nimport { makeModifier } from '../base'\n\nexport interface RestrictOptions {\n // where to drag over\n restriction: RectResolvable<[number, number, Interaction]>\n // what part of self is allowed to drag over\n elementRect: Rect\n offset: Rect\n // restrict just before the end drag\n endOnly: boolean\n enabled?: boolean\n}\n\nexport type RestrictState = ModifierState<\nRestrictOptions,\n{\n offset: Rect\n}\n>\n\nfunction start ({ rect, startOffset, state, interaction, pageCoords }: ModifierArg<RestrictState>) {\n const { options } = state\n const { elementRect } = options\n const offset: Rect = extend(\n {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n },\n options.offset || {},\n )\n\n if (rect && elementRect) {\n const restriction = getRestrictionRect(options.restriction, interaction, pageCoords)\n\n if (restriction) {\n const widthDiff = restriction.right - restriction.left - rect.width\n const heightDiff = restriction.bottom - restriction.top - rect.height\n\n if (widthDiff < 0) {\n offset.left += widthDiff\n offset.right += widthDiff\n }\n if (heightDiff < 0) {\n offset.top += heightDiff\n offset.bottom += heightDiff\n }\n }\n\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\n state.offset = offset\n}\n\nfunction set ({ coords, interaction, state }: ModifierArg<RestrictState>) {\n const { options, offset } = state\n\n const restriction = getRestrictionRect(options.restriction, interaction, coords)\n\n if (!restriction) return\n\n const rect = rectUtils.xywhToTlbr(restriction)\n\n coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left)\n coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top)\n}\n\nexport function getRestrictionRect (\n value: RectResolvable<[number, number, Interaction]>,\n interaction: Interaction,\n coords?: Point,\n) {\n if (is.func(value)) {\n return rectUtils.resolveRectLike(value, interaction.interactable, interaction.element, [\n coords.x,\n coords.y,\n interaction,\n ])\n } else {\n return rectUtils.resolveRectLike(value, interaction.interactable, interaction.element)\n }\n}\n\nconst defaults: RestrictOptions = {\n restriction: null,\n elementRect: null,\n offset: null,\n endOnly: false,\n enabled: false,\n}\n\nconst restrict: ModifierModule<RestrictOptions, RestrictState> = {\n start,\n set,\n defaults,\n}\n\nexport default makeModifier(restrict, 'restrict')\nexport { 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\nimport type { Point, Rect } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport type { ModifierArg, ModifierState } from '../base'\nimport { makeModifier } from '../base'\n\nimport type { RestrictOptions } from './pointer'\nimport { getRestrictionRect } from './pointer'\n\nexport interface RestrictEdgesOptions {\n inner: RestrictOptions['restriction']\n outer: RestrictOptions['restriction']\n offset?: RestrictOptions['offset']\n endOnly: boolean\n enabled?: boolean\n}\n\nexport type RestrictEdgesState = ModifierState<\nRestrictEdgesOptions,\n{\n inner: Rect\n outer: Rect\n offset: RestrictEdgesOptions['offset']\n}\n>\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity }\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity }\n\nfunction start ({ interaction, startOffset, state }: ModifierArg<RestrictEdgesState>) {\n const { options } = state\n let offset: Point\n\n if (options) {\n const offsetRect = getRestrictionRect(options.offset, interaction, interaction.coords.start.page)\n\n offset = rectUtils.rectToXY(offsetRect)\n }\n\n offset = offset || { x: 0, y: 0 }\n\n state.offset = {\n top: offset.y + startOffset.top,\n left: offset.x + startOffset.left,\n bottom: offset.y - startOffset.bottom,\n right: offset.x - startOffset.right,\n }\n}\n\nfunction set ({ coords, edges, interaction, state }: ModifierArg<RestrictEdgesState>) {\n const { offset, options } = state\n\n if (!edges) {\n return\n }\n\n const page = extend({}, coords)\n const inner = getRestrictionRect(options.inner, interaction, page) || ({} as Rect)\n const outer = getRestrictionRect(options.outer, interaction, page) || ({} as Rect)\n\n fixRect(inner, noInner)\n fixRect(outer, noOuter)\n\n if (edges.top) {\n coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top)\n } else if (edges.bottom) {\n coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom)\n }\n if (edges.left) {\n coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left)\n } else if (edges.right) {\n coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right)\n }\n}\n\nfunction fixRect (rect: Rect, defaults: Rect) {\n for (const edge of ['top', 'left', 'bottom', 'right']) {\n if (!(edge in rect)) {\n rect[edge] = defaults[edge]\n }\n }\n\n return rect\n}\n\nconst defaults: RestrictEdgesOptions = {\n inner: null,\n outer: null,\n offset: null,\n endOnly: false,\n enabled: false,\n}\n\nconst restrictEdges = {\n noInner,\n noOuter,\n start,\n set,\n defaults,\n}\n\nexport default makeModifier(restrictEdges, 'restrictEdges')\nexport { restrictEdges }\n","import extend from '@interactjs/utils/extend'\n\nimport { makeModifier } from '../base'\n\nimport { restrict } from './pointer'\n\nconst defaults = extend(\n {\n get elementRect () {\n return { top: 0, left: 0, bottom: 1, right: 1 }\n },\n set elementRect (_) {},\n },\n restrict.defaults,\n)\n\nconst restrictRect = {\n start: restrict.start,\n set: restrict.set,\n defaults,\n}\n\nexport default makeModifier(restrictRect, 'restrictRect')\nexport { restrictRect }\n","import type { Point, Rect, Size } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport type { ModifierArg, ModifierState } from '../base'\nimport { makeModifier } from '../base'\n\nimport type { RestrictEdgesState } from './edges'\nimport { restrictEdges } from './edges'\nimport type { RestrictOptions } from './pointer'\nimport { getRestrictionRect } from './pointer'\n\nconst noMin = { width: -Infinity, height: -Infinity }\nconst noMax = { width: +Infinity, height: +Infinity }\n\nexport interface RestrictSizeOptions {\n min?: Size | Point | RestrictOptions['restriction']\n max?: Size | Point | RestrictOptions['restriction']\n endOnly: boolean\n enabled?: boolean\n}\n\nfunction start (arg: ModifierArg<RestrictEdgesState>) {\n return restrictEdges.start(arg)\n}\n\nexport type RestrictSizeState = RestrictEdgesState &\nModifierState<\nRestrictSizeOptions & { inner: Rect, outer: Rect },\n{\n min: Rect\n max: Rect\n}\n>\n\nfunction set (arg: ModifierArg<RestrictSizeState>) {\n const { interaction, state, rect, edges } = arg\n const { options } = state\n\n if (!edges) {\n return\n }\n\n const minSize =\n rectUtils.tlbrToXywh(getRestrictionRect(options.min as any, interaction, arg.coords)) || noMin\n const maxSize =\n rectUtils.tlbrToXywh(getRestrictionRect(options.max as any, interaction, arg.coords)) || noMax\n\n state.options = {\n endOnly: options.endOnly,\n inner: extend({}, restrictEdges.noInner),\n outer: extend({}, restrictEdges.noOuter),\n }\n\n if (edges.top) {\n state.options.inner.top = rect.bottom - minSize.height\n state.options.outer.top = rect.bottom - maxSize.height\n } else if (edges.bottom) {\n state.options.inner.bottom = rect.top + minSize.height\n state.options.outer.bottom = rect.top + maxSize.height\n }\n if (edges.left) {\n state.options.inner.left = rect.right - minSize.width\n state.options.outer.left = rect.right - maxSize.width\n } else if (edges.right) {\n state.options.inner.right = rect.left + minSize.width\n state.options.outer.right = rect.left + maxSize.width\n }\n\n restrictEdges.set(arg)\n\n state.options = options\n}\n\nconst defaults: RestrictSizeOptions = {\n min: null,\n max: null,\n endOnly: false,\n enabled: false,\n}\n\nconst restrictSize = {\n start,\n set,\n defaults,\n}\n\nexport default makeModifier(restrictSize, 'restrictSize')\nexport { restrictSize }\n","import type { Interaction, InteractionProxy } from '@interactjs/core/Interaction'\nimport type { ActionName } from '@interactjs/core/scope'\nimport type { Point, RectResolvable, Element } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\nimport hypot from '@interactjs/utils/hypot'\nimport is from '@interactjs/utils/is'\nimport { resolveRectLike, rectToXY } from '@interactjs/utils/rect'\n\nimport type { ModifierArg, ModifierState } from '../base'\nimport { makeModifier } from '../base'\n\nexport interface Offset {\n x: number\n y: number\n index: number\n relativePoint?: Point | null\n}\n\nexport interface SnapPosition {\n x?: number\n y?: number\n range?: number\n offset?: Offset\n [index: string]: any\n}\n\nexport type SnapFunction = (\n x: number,\n y: number,\n interaction: InteractionProxy<ActionName>,\n offset: Offset,\n index: number,\n) => SnapPosition\nexport type SnapTarget = SnapPosition | SnapFunction\nexport interface SnapOptions {\n targets: SnapTarget[] | null\n // target range\n range: number\n // self points for snapping. [0,0] = top left, [1,1] = bottom right\n relativePoints: Point[] | null\n // startCoords = offset snapping from drag start page position\n offset: Point | RectResolvable<[Interaction]> | 'startCoords' | null\n offsetWithOrigin?: boolean\n origin: RectResolvable<[Element]> | Point | null\n endOnly?: boolean\n enabled?: boolean\n}\n\nexport type SnapState = ModifierState<\nSnapOptions,\n{\n offsets?: Offset[]\n closest?: any\n targetFields?: string[][]\n}\n>\n\nfunction start (arg: ModifierArg<SnapState>) {\n const { interaction, interactable, element, rect, state, startOffset } = arg\n const { options } = state\n const origin = options.offsetWithOrigin ? getOrigin(arg) : { x: 0, y: 0 }\n\n let snapOffset: Point\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.coords.start.page.x,\n y: interaction.coords.start.page.y,\n }\n } else {\n const offsetRect = resolveRectLike(options.offset as any, interactable, element, [interaction])\n\n snapOffset = rectToXY(offsetRect) || { x: 0, y: 0 }\n snapOffset.x += origin.x\n snapOffset.y += origin.y\n }\n\n const { relativePoints } = options\n\n state.offsets =\n rect && relativePoints && relativePoints.length\n ? relativePoints.map((relativePoint, index) => ({\n index,\n relativePoint,\n x: startOffset.left - rect.width * relativePoint.x + snapOffset.x,\n y: startOffset.top - rect.height * relativePoint.y + snapOffset.y,\n }))\n : [\n {\n index: 0,\n relativePoint: null,\n x: snapOffset.x,\n y: snapOffset.y,\n },\n ]\n}\n\nfunction set (arg: ModifierArg<SnapState>) {\n const { interaction, coords, state } = arg\n const { options, offsets } = state\n\n const origin = getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name)\n const page = extend({}, coords)\n const targets = []\n\n if (!options.offsetWithOrigin) {\n page.x -= origin.x\n page.y -= origin.y\n }\n\n for (const offset of offsets) {\n const relativeX = page.x - offset.x\n const relativeY = page.y - offset.y\n\n for (let index = 0, len = options.targets.length; index < len; index++) {\n const snapTarget = options.targets[index]\n let target: SnapPosition\n\n if (is.func(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction._proxy, offset, index)\n } else {\n target = snapTarget\n }\n\n if (!target) {\n continue\n }\n\n targets.push({\n x: (is.number(target.x) ? target.x : relativeX) + offset.x,\n y: (is.number(target.y) ? target.y : relativeY) + offset.y,\n\n range: is.number(target.range) ? target.range : options.range,\n source: snapTarget,\n index,\n offset,\n })\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n delta: { x: 0, y: 0 },\n }\n\n for (const target of targets) {\n const range = target.range\n const dx = target.x - page.x\n const dy = target.y - page.y\n const distance = 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 (\n !closest.target ||\n (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.delta.x = dx\n closest.delta.y = dy\n }\n }\n\n if (closest.inRange) {\n coords.x = closest.target.x\n coords.y = closest.target.y\n }\n\n state.closest = closest\n return closest\n}\n\nfunction getOrigin (arg: Partial<ModifierArg<SnapState>>) {\n const { element } = arg.interaction\n const optionsOrigin = rectToXY(resolveRectLike(arg.state.options.origin as any, null, null, [element]))\n const origin = optionsOrigin || getOriginXY(arg.interactable, element, arg.interaction.prepared.name)\n\n return origin\n}\n\nconst defaults: SnapOptions = {\n range: Infinity,\n targets: null,\n offset: null,\n offsetWithOrigin: true,\n origin: null,\n relativePoints: null,\n endOnly: false,\n enabled: false,\n}\nconst snap = {\n start,\n set,\n defaults,\n}\n\nexport default makeModifier(snap, 'snap')\nexport { snap }\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nimport extend from '@interactjs/utils/extend'\nimport is from '@interactjs/utils/is'\n\nimport type { ModifierArg } from '../base'\nimport { makeModifier } from '../base'\n\nimport type { SnapOptions, SnapState } from './pointer'\nimport { snap } from './pointer'\n\nexport type SnapSizeOptions = Pick<SnapOptions, 'targets' | 'offset' | 'endOnly' | 'range' | 'enabled'>\n\nfunction start (arg: ModifierArg<SnapState>) {\n const { state, edges } = arg\n const { options } = state\n\n if (!edges) {\n return null\n }\n\n arg.state = {\n options: {\n targets: null,\n relativePoints: [\n {\n x: edges.left ? 0 : 1,\n y: edges.top ? 0 : 1,\n },\n ],\n offset: options.offset || 'self',\n origin: { x: 0, y: 0 },\n range: options.range,\n },\n }\n\n state.targetFields = state.targetFields || [\n ['width', 'height'],\n ['x', 'y'],\n ]\n\n snap.start(arg)\n state.offsets = arg.state.offsets\n\n arg.state = state\n}\n\nfunction set (arg) {\n const { interaction, state, coords } = arg\n const { options, offsets } = state\n const relative = {\n x: coords.x - offsets[0].x,\n y: coords.y - offsets[0].y,\n }\n\n state.options = extend({}, options)\n state.options.targets = []\n\n for (const snapTarget of options.targets || []) {\n let target\n\n if (is.func(snapTarget)) {\n target = snapTarget(relative.x, relative.y, interaction)\n } else {\n target = snapTarget\n }\n\n if (!target) {\n continue\n }\n\n for (const [xField, yField] of state.targetFields) {\n if (xField in target || yField in target) {\n target.x = target[xField]\n target.y = target[yField]\n\n break\n }\n }\n\n state.options.targets.push(target)\n }\n\n const returnValue = snap.set(arg)\n\n state.options = options\n\n return returnValue\n}\n\nconst defaults: SnapSizeOptions = {\n range: Infinity,\n targets: null,\n offset: null,\n endOnly: false,\n enabled: false,\n}\n\nconst snapSize = {\n start,\n set,\n defaults,\n}\n\nexport default makeModifier(snapSize, 'snapSize')\nexport { snapSize }\n","/**\n * @module modifiers/snapEdges\n *\n * @description\n * WOW> This module allows snapping of the edges of targets during resize\n * interactions.\n *\n * ```js\n * interact(target).resizable({\n * snapEdges: {\n * targets: [interact.snappers.grid({ x: 100, y: 50 })],\n * },\n * })\n *\n * interact(target).resizable({\n * snapEdges: {\n * targets: [\n * interact.snappers.grid({\n * top: 50,\n * left: 50,\n * bottom: 100,\n * right: 100,\n * }),\n * ],\n * },\n * })\n * ```\n */\n\nimport clone from '@interactjs/utils/clone'\nimport extend from '@interactjs/utils/extend'\n\nimport type { ModifierArg, ModifierModule } from '../base'\nimport { makeModifier } from '../base'\n\nimport type { SnapOptions, SnapState } from './pointer'\nimport { snapSize } from './size'\n\nexport type SnapEdgesOptions = Pick<SnapOptions, 'targets' | 'range' | 'offset' | 'endOnly' | 'enabled'>\n\nfunction start (arg: ModifierArg<SnapState>) {\n const { edges } = arg\n\n if (!edges) {\n return null\n }\n\n arg.state.targetFields = arg.state.targetFields || [\n [edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom'],\n ]\n\n return snapSize.start(arg)\n}\n\nconst snapEdges: ModifierModule<SnapEdgesOptions, SnapState, ReturnType<typeof snapSize.set>> = {\n start,\n set: snapSize.set,\n defaults: extend(clone(snapSize.defaults), {\n targets: null,\n range: null,\n offset: { x: 0, y: 0 },\n } as const),\n}\n\nexport default makeModifier(snapEdges, 'snapEdges')\nexport { snapEdges }\n","/* eslint-disable node/no-extraneous-import, import/no-unresolved */\nimport aspectRatio from './aspectRatio'\nimport avoid from './avoid/avoid'\nimport restrictEdges from './restrict/edges'\nimport restrict from './restrict/pointer'\nimport restrictRect from './restrict/rect'\nimport restrictSize from './restrict/size'\nimport rubberband from './rubberband/rubberband'\nimport snapEdges from './snap/edges'\nimport snap from './snap/pointer'\nimport snapSize from './snap/size'\nimport spring from './spring/spring'\nimport transform from './transform/transform'\n\nexport default {\n aspectRatio,\n restrictEdges,\n restrict,\n restrictRect,\n restrictSize,\n snapEdges,\n snap,\n snapSize,\n\n spring,\n avoid,\n transform,\n rubberband,\n}\n","import type { Plugin } from '@interactjs/core/scope'\nimport snappers from '@interactjs/snappers/plugin'\n\nimport all from './all'\nimport base from './base'\n\ndeclare module '@interactjs/core/InteractStatic' {\n export interface InteractStatic {\n modifiers: typeof all\n }\n}\n\nconst modifiers: Plugin = {\n id: 'modifiers',\n install (scope) {\n const { interactStatic: interact } = scope\n\n scope.usePlugin(base)\n scope.usePlugin(snappers)\n\n interact.modifiers = all\n\n // for backwrads compatibility\n for (const type in all) {\n const { _defaults, _methods } = all[type as keyof typeof all]\n\n ;(_defaults as any)._methods = _methods\n ;(scope.defaults.perAction as any)[type] = _defaults\n }\n },\n}\n\nexport default modifiers\n","import { BaseEvent } from '@interactjs/core/BaseEvent'\nimport type Interaction from '@interactjs/core/Interaction'\nimport type { PointerEventType, PointerType, Point } from '@interactjs/types/index'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\n\nexport default class PointerEvent<T extends string = any> extends BaseEvent<never> {\n type: T\n originalEvent: PointerEventType\n pointerId: number\n pointerType: string\n double: boolean\n pageX: number\n pageY: number\n clientX: number\n clientY: number\n dt: number\n eventable: any;\n [key: string]: any\n\n /** */\n constructor (\n type: T,\n pointer: PointerType | PointerEvent<any>,\n event: PointerEventType,\n eventTarget: Node,\n interaction: Interaction<never>,\n timeStamp: number,\n ) {\n super(interaction)\n pointerUtils.pointerExtend(this, event)\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer)\n }\n\n this.timeStamp = timeStamp\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.pointers[pointerIndex].downTime\n\n const interval = this.timeStamp - interaction.tapTime\n\n this.double = !!(\n 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 as PointerEvent<'tap'>).timeStamp - interaction.tapTime\n }\n }\n\n _subtractOrigin ({ x: originX, y: originY }: Point) {\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 }: Point) {\n this.pageX += originX\n this.pageY += originY\n this.clientX += originX\n this.clientY += originY\n\n return this\n }\n\n /**\n * Prevent the default behaviour of the original Event\n */\n preventDefault () {\n this.originalEvent.preventDefault()\n }\n}\n\nexport { PointerEvent }\n","import type { Eventable } from '@interactjs/core/Eventable'\nimport type { Interaction } from '@interactjs/core/Interaction'\nimport type { PerActionDefaults } from '@interactjs/core/options'\nimport type { Scope, SignalArgs, Plugin } from '@interactjs/core/scope'\nimport type { Point, PointerType, PointerEventType, Element } from '@interactjs/types'\nimport * as domUtils from '@interactjs/utils/domUtils'\nimport extend from '@interactjs/utils/extend'\nimport getOriginXY from '@interactjs/utils/getOriginXY'\n\nimport { PointerEvent } from './PointerEvent'\n\nexport type EventTargetList = Array<{\n node: Node\n eventable: Eventable\n props: { [key: string]: any }\n}>\n\nexport interface PointerEventOptions extends PerActionDefaults {\n enabled?: undefined // not used\n holdDuration?: number\n ignoreFrom?: any\n allowFrom?: any\n origin?: Point | string | Element\n}\n\ndeclare module '@interactjs/core/scope' {\n interface Scope {\n pointerEvents: typeof pointerEvents\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n prevTap?: PointerEvent<string>\n tapTime?: number\n }\n}\n\ndeclare module '@interactjs/core/PointerInfo' {\n interface PointerInfo {\n hold?: {\n duration: number\n timeout: any\n }\n }\n}\n\ndeclare module '@interactjs/core/options' {\n interface ActionDefaults {\n pointerEvents: Options\n }\n}\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'pointerEvents:new': { pointerEvent: PointerEvent<any> }\n 'pointerEvents:fired': {\n interaction: Interaction<null>\n pointer: PointerType | PointerEvent<any>\n event: PointerEventType | PointerEvent<any>\n eventTarget: Node\n pointerEvent: PointerEvent<any>\n targets?: EventTargetList\n type: string\n }\n 'pointerEvents:collect-targets': {\n interaction: Interaction<any>\n pointer: PointerType | PointerEvent<any>\n event: PointerEventType | PointerEvent<any>\n eventTarget: Node\n targets?: EventTargetList\n type: string\n path: Node[]\n node: null\n }\n }\n}\n\nconst defaults: PointerEventOptions = {\n holdDuration: 600,\n ignoreFrom: null,\n allowFrom: null,\n origin: { x: 0, y: 0 },\n}\n\nconst pointerEvents: Plugin = {\n id: 'pointer-events/base',\n before: ['inertia', 'modifiers', 'auto-start', 'actions'],\n install,\n listeners: {\n 'interactions:new': addInteractionProps,\n 'interactions:update-pointer': addHoldInfo,\n 'interactions:move': moveAndClearHold,\n 'interactions:down': (arg, scope) => {\n downAndStartHold(arg, scope)\n fire(arg, scope)\n },\n 'interactions:up': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n tapAfterUp(arg, scope)\n },\n 'interactions:cancel': (arg, scope) => {\n clearHold(arg)\n fire(arg, scope)\n },\n },\n PointerEvent,\n fire,\n collectEventTargets,\n defaults,\n types: {\n down: true,\n move: true,\n up: true,\n cancel: true,\n tap: true,\n doubletap: true,\n hold: true,\n } as { [type: string]: true },\n}\n\nfunction fire<T extends string> (\n arg: {\n pointer: PointerType | PointerEvent<any>\n event: PointerEventType | PointerEvent<any>\n eventTarget: Node\n interaction: Interaction<never>\n type: T\n targets?: EventTargetList\n },\n scope: Scope,\n) {\n const { interaction, pointer, event, eventTarget, type, targets = collectEventTargets(arg, scope) } = arg\n\n const pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction, scope.now())\n\n scope.fire('pointerEvents:new', { pointerEvent })\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 as any)[prop] = target.props[prop]\n }\n\n const origin = getOriginXY(target.eventable, target.node)\n\n pointerEvent._subtractOrigin(origin)\n pointerEvent.eventable = target.eventable\n pointerEvent.currentTarget = target.node\n\n target.eventable.fire(pointerEvent)\n\n pointerEvent._addOrigin(origin)\n\n if (\n pointerEvent.immediatePropagationStopped ||\n (pointerEvent.propagationStopped &&\n i + 1 < targets.length &&\n targets[i + 1].node !== pointerEvent.currentTarget)\n ) {\n break\n }\n }\n\n scope.fire('pointerEvents: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 {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'doubletap',\n },\n scope,\n )\n : pointerEvent\n\n interaction.prevTap = prevTap\n interaction.tapTime = prevTap.timeStamp\n }\n\n return pointerEvent\n}\n\nfunction collectEventTargets<T extends string> (\n {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n }: {\n interaction: Interaction<any>\n pointer: PointerType | PointerEvent<any>\n event: PointerEventType | PointerEvent<any>\n eventTarget: Node\n type: T\n },\n scope: Scope,\n) {\n const pointerIndex = interaction.getPointerIndex(pointer)\n const pointerInfo = interaction.pointers[pointerIndex]\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (\n type === 'tap' &&\n (interaction.pointerWasMoved ||\n // or if the pointerup target is different to the pointerdown target\n !(pointerInfo && pointerInfo.downTarget === eventTarget))\n ) {\n return []\n }\n\n const path = domUtils.getPath(eventTarget as Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [] as EventTargetList,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents:collect-targets', signalArg)\n }\n\n if (type === 'hold') {\n signalArg.targets = signalArg.targets.filter(\n (target) => target.eventable.options.holdDuration === interaction.pointers[pointerIndex]?.hold.duration,\n )\n }\n\n return signalArg.targets\n}\n\nfunction addInteractionProps ({ 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}\n\nfunction addHoldInfo ({ down, pointerInfo }: SignalArgs['interactions:update-pointer']) {\n if (!down && pointerInfo.hold) {\n return\n }\n\n pointerInfo.hold = { duration: Infinity, timeout: null }\n}\n\nfunction clearHold ({ interaction, pointerIndex }) {\n const hold = interaction.pointers[pointerIndex].hold\n\n if (hold && hold.timeout) {\n clearTimeout(hold.timeout)\n hold.timeout = null\n }\n}\n\nfunction moveAndClearHold (arg: SignalArgs['interactions:move'], scope: Scope) {\n const { interaction, pointer, event, eventTarget, duplicate } = arg\n\n if (!duplicate && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearHold(arg)\n }\n\n fire(\n {\n interaction,\n pointer,\n event,\n eventTarget: eventTarget as Element,\n type: 'move',\n },\n scope,\n )\n }\n}\n\nfunction downAndStartHold (\n { interaction, pointer, event, eventTarget, pointerIndex }: SignalArgs['interactions:down'],\n scope: Scope,\n) {\n const timer = interaction.pointers[pointerIndex].hold\n const path = domUtils.getPath(eventTarget as Element | Document)\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [] as EventTargetList,\n path,\n node: null,\n }\n\n for (const node of path) {\n signalArg.node = node\n\n scope.fire('pointerEvents: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(() => {\n fire(\n {\n interaction,\n eventTarget,\n pointer,\n event,\n type: 'hold',\n },\n scope,\n )\n }, minDuration)\n}\n\nfunction tapAfterUp (\n { interaction, pointer, event, eventTarget }: SignalArgs['interactions:up'],\n scope: Scope,\n) {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' }, scope)\n }\n}\n\nfunction install (scope: Scope) {\n scope.pointerEvents = pointerEvents\n scope.defaults.actions.pointerEvents = pointerEvents.defaults\n extend(scope.actions.phaselessTypes, pointerEvents.types)\n}\n\nexport default pointerEvents\n","import type Interaction from '@interactjs/core/Interaction'\nimport type { ListenerMap, Scope, SignalArgs, Plugin } from '@interactjs/core/scope'\n\nimport type PointerEvent from './PointerEvent'\nimport basePlugin from './base'\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n holdIntervalHandle?: any\n }\n}\n\ndeclare module '@interactjs/pointer-events/PointerEvent' {\n interface PointerEvent<T extends string = any> {\n count?: number\n }\n}\n\ndeclare module '@interactjs/pointer-events/base' {\n interface PointerEventOptions {\n holdRepeatInterval?: number\n }\n}\n\nfunction install (scope: Scope) {\n scope.usePlugin(basePlugin)\n\n const { pointerEvents } = scope\n\n // don't repeat by default\n pointerEvents.defaults.holdRepeatInterval = 0\n pointerEvents.types.holdrepeat = scope.actions.phaselessTypes.holdrepeat = true\n}\n\nfunction onNew ({ pointerEvent }: { pointerEvent: PointerEvent<any> }) {\n if (pointerEvent.type !== 'hold') return\n\n pointerEvent.count = (pointerEvent.count || 0) + 1\n}\n\nfunction onFired (\n { interaction, pointerEvent, eventTarget, targets }: SignalArgs['pointerEvents:fired'],\n scope: Scope,\n) {\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(() => {\n scope.pointerEvents.fire(\n {\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n },\n scope,\n )\n }, interval)\n}\n\nfunction endHoldRepeat ({ interaction }: { interaction: 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\nconst holdRepeat: Plugin = {\n id: 'pointer-events/holdRepeat',\n install,\n listeners: ['move', 'up', 'cancel', 'endall'].reduce(\n (acc, enderTypes) => {\n ;(acc as any)[`pointerEvents:${enderTypes}`] = endHoldRepeat\n return acc\n },\n {\n 'pointerEvents:new': onNew,\n 'pointerEvents:fired': onFired,\n } as ListenerMap,\n ),\n}\n\nexport default holdRepeat\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { Scope, Plugin } from '@interactjs/core/scope'\nimport type { Element } from '@interactjs/types/index'\nimport extend from '@interactjs/utils/extend'\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n pointerEvents: typeof pointerEventsMethod\n __backCompatOption: (optionName: string, newValue: any) => any\n }\n}\n\nfunction install (scope: Scope) {\n const { Interactable } = scope\n\n Interactable.prototype.pointerEvents = pointerEventsMethod\n\n const __backCompatOption = Interactable.prototype._backCompatOption\n\n Interactable.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}\n\nfunction pointerEventsMethod (this: Interactable, options: any) {\n extend(this.events.options, options)\n\n return this\n}\n\nconst plugin: Plugin = {\n id: 'pointer-events/interactableTargets',\n install,\n listeners: {\n 'pointerEvents:collect-targets': ({ targets, node, type, eventTarget }, scope) => {\n scope.interactables.forEachMatch(node, (interactable: Interactable) => {\n const eventable = interactable.events\n const options = eventable.options\n\n if (\n eventable.types[type] &&\n eventable.types[type].length &&\n interactable.testIgnoreAllow(options, node, eventTarget)\n ) {\n targets.push({\n node,\n eventable,\n props: { interactable },\n })\n }\n })\n },\n\n 'interactable:new': ({ interactable }) => {\n interactable.events.getRect = function (element: Element) {\n return interactable.getRect(element)\n }\n },\n\n 'interactable:set': ({ interactable, options }, scope) => {\n extend(interactable.events.options, scope.pointerEvents.defaults)\n extend(interactable.events.options, options.pointerEvents || {})\n },\n },\n}\n\nexport default plugin\n","import type { Plugin } from '@interactjs/core/scope'\n\nimport * as pointerEvents from './base'\nimport holdRepeat from './holdRepeat'\nimport interactableTargets from './interactableTargets'\n\nconst plugin: Plugin = {\n id: 'pointer-events',\n install (scope) {\n scope.usePlugin(pointerEvents)\n scope.usePlugin(holdRepeat)\n scope.usePlugin(interactableTargets)\n },\n}\n\nexport default plugin\n","import type { Interactable } from '@interactjs/core/Interactable'\nimport type { ActionProps, DoAnyPhaseArg, Interaction } from '@interactjs/core/Interaction'\nimport type { ActionName, Scope, Plugin } from '@interactjs/core/scope'\nimport type { Element } from '@interactjs/types/index'\nimport * as arr from '@interactjs/utils/arr'\nimport is from '@interactjs/utils/is'\nimport { copyAction } from '@interactjs/utils/misc'\nimport * as pointerUtils from '@interactjs/utils/pointerUtils'\nimport { tlbrToXywh } from '@interactjs/utils/rect'\n\ndeclare module '@interactjs/core/scope' {\n interface SignalArgs {\n 'interactions:before-action-reflow': Omit<DoAnyPhaseArg, 'iEvent'>\n 'interactions:action-reflow': DoAnyPhaseArg\n 'interactions:after-action-reflow': DoAnyPhaseArg\n }\n}\n\ndeclare module '@interactjs/core/Interactable' {\n interface Interactable {\n reflow: <T extends ActionName>(action: ActionProps<T>) => ReturnType<typeof doReflow>\n }\n}\n\ndeclare module '@interactjs/core/Interaction' {\n interface Interaction {\n _reflowPromise: Promise<void>\n _reflowResolve: (...args: unknown[]) => void\n }\n}\n\ndeclare module '@interactjs/core/InteractEvent' {\n interface PhaseMap {\n reflow?: true\n }\n}\n\nexport function install (scope: Scope) {\n const {\n /** @lends Interactable */\n Interactable,\n } = scope\n\n scope.actions.phases.reflow = true\n\n /**\n * ```js\n * const interactable = interact(target)\n * const drag = { name: drag, axis: 'x' }\n * const resize = { name: resize, edges: { left: true, bottom: true }\n *\n * interactable.reflow(drag)\n * interactable.reflow(resize)\n * ```\n *\n * Start an action sequence to re-apply modifiers, check drops, etc.\n *\n * @param { Object } action The action to begin\n * @param { string } action.name The name of the action\n * @returns { Promise } A promise that resolves to the `Interactable` when actions on all targets have ended\n */\n Interactable.prototype.reflow = function (action: ActionProps) {\n return doReflow(this, action, scope)\n }\n}\n\nfunction doReflow<T extends ActionName> (\n interactable: Interactable,\n action: ActionProps<T>,\n scope: Scope,\n): Promise<Interactable> {\n const elements = (is.string(interactable.target)\n ? arr.from(interactable._context.querySelectorAll(interactable.target))\n : [interactable.target]) as Element[]\n\n // tslint:disable-next-line variable-name\n const Promise = (scope.window as any).Promise\n const promises: Array<Promise<null>> | null = Promise ? [] : null\n\n for (const element of elements) {\n const rect = interactable.getRect(element as HTMLElement | SVGElement)\n\n if (!rect) {\n break\n }\n\n const runningInteraction = arr.find(scope.interactions.list, (interaction: Interaction) => {\n return (\n interaction.interacting() &&\n interaction.interactable === interactable &&\n interaction.element === element &&\n interaction.prepared.name === action.name\n )\n })\n let reflowPromise: Promise<null>\n\n if (runningInteraction) {\n runningInteraction.move()\n\n if (promises) {\n reflowPromise =\n runningInteraction._reflowPromise ||\n new Promise((resolve: any) => {\n runningInteraction._reflowResolve = resolve\n })\n }\n } else {\n const xywh = tlbrToXywh(rect)\n const coords = {\n page: { x: xywh.x, y: xywh.y },\n client: { x: xywh.x, y: xywh.y },\n timeStamp: scope.now(),\n }\n\n const event = pointerUtils.coordsToEvent(coords)\n reflowPromise = startReflow<T>(scope, interactable, element, action, event)\n }\n\n if (promises) {\n promises.push(reflowPromise)\n }\n }\n\n return promises && Promise.all(promises).then(() => interactable)\n}\n\nfunction startReflow<T extends ActionName> (\n scope: Scope,\n interactable: Interactable,\n element: Element,\n action: ActionProps<T>,\n event: any,\n) {\n const interaction = scope.interactions.new({ pointerType: 'reflow' })\n const signalArg = {\n interaction,\n event,\n pointer: event,\n eventTarget: element,\n phase: 'reflow',\n } as const\n\n interaction.interactable = interactable\n interaction.element = element\n interaction.prevEvent = event\n interaction.updatePointer(event, event, element, true)\n pointerUtils.setZeroCoords(interaction.coords.delta)\n\n copyAction(interaction.prepared, action)\n interaction._doPhase(signalArg)\n\n const { Promise } = (scope.window as unknown) as { Promise: PromiseConstructor }\n const reflowPromise = Promise\n ? new Promise<undefined>((resolve) => {\n interaction._reflowResolve = resolve\n })\n : undefined\n\n interaction._reflowPromise = reflowPromise\n interaction.start(action, interactable, element)\n\n if (interaction._interacting) {\n interaction.move(signalArg)\n interaction.end(event)\n } else {\n interaction.stop()\n interaction._reflowResolve()\n }\n\n interaction.removePointer(event, event)\n\n return reflowPromise\n}\n\nconst reflow: Plugin = {\n id: 'reflow',\n install,\n listeners: {\n // remove completed reflow interactions\n 'interactions:stop': ({ interaction }, scope) => {\n if (interaction.pointerType === 'reflow') {\n if (interaction._reflowResolve) {\n interaction._reflowResolve()\n }\n\n arr.remove(scope.interactions.list, interaction)\n }\n },\n },\n}\n\nexport default reflow\n","import actions from '@interactjs/actions/plugin'\nimport autoScroll from '@interactjs/auto-scroll/plugin'\nimport autoStart from '@interactjs/auto-start/plugin'\nimport interactablePreventDefault from '@interactjs/core/interactablePreventDefault'\nimport devTools from '@interactjs/dev-tools/plugin'\nimport inertia from '@interactjs/inertia/plugin'\nimport interact from '@interactjs/interact'\nimport modifiers from '@interactjs/modifiers/plugin'\nimport offset from '@interactjs/offset/plugin'\nimport pointerEvents from '@interactjs/pointer-events/plugin'\nimport reflow from '@interactjs/reflow/plugin'\n\ninteract.use(interactablePreventDefault)\n\ninteract.use(offset)\n\n// pointerEvents\ninteract.use(pointerEvents)\n\n// inertia\ninteract.use(inertia)\n\n// snap, resize, etc.\ninteract.use(modifiers)\n\n// autoStart, hold\ninteract.use(autoStart)\n\n// drag and drop, resize, gesture\ninteract.use(actions)\n\n// autoScroll\ninteract.use(autoScroll)\n\n// reflow\ninteract.use(reflow)\n\n// eslint-disable-next-line no-undef\nif (process.env.NODE_ENV !== 'production') {\n interact.use(devTools)\n}\n\nexport default interact\n\nif (typeof module === 'object' && !!module) {\n try {\n module.exports = interact\n } catch {}\n}\n\n;(interact as any).default = interact\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport interact from '@interactjs/interactjs/index'\n\nexport default interact\n\nif (typeof module === 'object' && !!module) {\n try {\n module.exports = interact\n } catch {}\n}\n\n;(interact as any).default = interact\n","\nreturn _$index_79;\n\n});\n"]}
\No newline at end of file