{ "version": 3, "sources": [ "base.ts" ], "names": [ "Scope", "SignalArgs", "domUtils", "extend", "is", "copyAction", "InteractableMethods", "validateAction", "action", "interactable", "element", "eventTarget", "scope", "testIgnoreAllow", "options", "name", "enabled", "withinInteractionLimit", "validateMatches", "interaction", "pointer", "event", "matches", "matchElements", "i", "len", "length", "match", "matchElement", "matchAction", "getAction", "getActionInfo", "pushMatches", "push", "interactables", "forEachMatch", "actionInfo", "manualStart", "parentNode", "prepare", "prepared", "rect", "getRect", "setInteractionCursor", "fire", "maxActions", "max", "maxPerElement", "autoStartMax", "autoStart", "maxInteractions", "activeInteractions", "interactableCount", "elementCount", "interactions", "list", "otherAction", "interacting", "newValue", "number", "this", "setCursor", "cursor", "cursorElement", "prevCursorElement", "style", "ownerDocument", "documentElement", "pointerType", "styleCursor", "cursorChecker", "func", "_interacting", "actions", "map", "getCursor", "id", "before", "install", "interactStatic", "interact", "defaults", "usePlugin", "base", "actionChecker", "perAction", "Infinity", "allowFrom", "ignoreFrom", "mouseButtons", "listeners", "[object Object]", "arg", "pointerIsDown", "prepareOnMove", "pointerWasMoved", "actionName", "stop", "start", "startOnMove" ], "mappings": "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", "sourcesContent": [ "import { Interactable } from '@interactjs/core/Interactable'\nimport Interaction, { ActionProps } from '@interactjs/core/Interaction'\nimport { Scope, SignalArgs, ActionName, Plugin } from '@interactjs/core/scope'\nimport { 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': SignalArgs['interactions:move']\n 'autoStart:prepared': { interaction: Interaction }\n 'auto-start:check': CheckSignalArg\n }\n}\n\ndeclare module '@interactjs/core/defaultOptions' {\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\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 {\n interactStatic: interact,\n defaults,\n } = 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 ({ interaction, pointer, event, eventTarget }: SignalArgs['interactions:down'], scope: Scope) {\n if (interaction.interacting()) { return }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope)\n prepare(interaction, actionInfo, scope)\n}\n\nfunction prepareOnMove ({ interaction, pointer, event, eventTarget }: SignalArgs['interactions:move'], scope: Scope) {\n if (interaction.pointerType !== 'mouse' ||\n interaction.pointerIsDown ||\n 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 (!interaction.pointerIsDown ||\n interaction.interacting() ||\n !interaction.pointerWasMoved ||\n !interaction.prepared.name) {\n return\n }\n\n scope.fire('autoStart:before-start', arg)\n\n const { interactable } = interaction\n const actionName = (interaction as Interaction).prepared.name\n\n if (actionName && interactable) {\n // check manualStart and interaction limit\n if (interactable.options[actionName].manualStart ||\n !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {\n interaction.stop()\n }\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 (\n action: ActionProps,\n interactable: Interactable,\n element: Element,\n eventTarget: Node,\n scope: Scope,\n) {\n if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) &&\n interactable.options[action.name].enabled &&\n withinInteractionLimit(interactable, element, action, scope)) {\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) { continue }\n\n const action = validateAction(\n matchAction,\n match,\n matchElement,\n eventTarget,\n 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(interaction, pointer, event, matches, matchElements, eventTarget, scope)\n\n if (actionInfo.action &&\n !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 { action, interactable, element }: {\n action: ActionProps\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\n ? interactable.getRect(element)\n : null\n\n setInteractionCursor(interaction, scope)\n\n scope.fire('autoStart:prepared', { interaction })\n}\n\nfunction withinInteractionLimit (\n interactable: Interactable,\n element: Element,\n action: ActionProps,\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)) { return false }\n\n for (const interaction of scope.interactions.list) {\n const otherAction = interaction.prepared.name\n\n if (!interaction.interacting()) { continue }\n\n activeInteractions++\n\n if (activeInteractions >= autoStartMax) {\n return false\n }\n\n if (interaction.interactable !== interactable) { continue }\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 (interaction: Interaction, 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 }\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" ] }