{ "version": 3, "sources": [ "plugin.ts" ], "names": [ "InteractEvent", "Interactable", "Interaction", "Scope", "domUtils", "extend", "getOriginXY", "is", "normalizeListeners", "pointerUtils", "drag", "DropEvent", "fireActivationEvents", "activeDrops", "event", "dropzone", "element", "slice", "target", "fire", "propagationStopped", "immediatePropagationStopped", "getActiveDrops", "scope", "dragElement", "interactables", "draggableElement", "drops", "list", "options", "drop", "enabled", "accept", "string", "matchesSelector", "func", "dropElements", "_context", "querySelectorAll", "array", "dropzoneElement", "push", "rect", "getRect", "collectDrops", "activeDrop", "getDrop", "dropState", "interactable", "draggable", "dragEvent", "pointerEvent", "validDrops", "dropCheck", "dropIndex", "indexOfDeepestElement", "getDropEvents", "interaction", "_pointerEvent", "dropEvents", "enter", "leave", "activate", "deactivate", "move", "type", "rejected", "cur", "prev", "dragLeave", "prevDropzone", "dragEnter", "relatedTarget", "dragmove", "fireDropEvents", "events", "onEventCreated", "iEvent", "dynamicDrop", "dropResult", "id", "install", "actions", "interactStatic", "interact", "defaults", "usePlugin", "prototype", "object", "listeners", "normalized", "corrected", "Object", "keys", "reduce", "acc", "test", "off", "on", "ondrop", "ondropactivate", "ondropdeactivate", "ondragenter", "ondragleave", "ondropmove", "overlap", "number", "Math", "max", "min", "checker", "bool", "dropzoneMethod", "this", "dropElement", "dropped", "dropOverlap", "origin", "page", "getPageXY", "x", "y", "horizontal", "left", "right", "vertical", "top", "bottom", "dragRect", "cx", "width", "cy", "height", "dropCheckMethod", "newValue", "phaselessTypes", "dragenter", "dragleave", "dropactivate", "dropdeactivate", "dropmove", "methodDict", "[object Object]", "prepared", "name", "interactions:action-move", "arg" ], "mappings": "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", "sourcesContent": [ "import { EventPhase, InteractEvent } from '@interactjs/core/InteractEvent'\nimport { Interactable } from '@interactjs/core/Interactable'\nimport Interaction, { DoPhaseArg } from '@interactjs/core/Interaction'\nimport { Scope, Plugin } from '@interactjs/core/scope'\nimport { 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 drag, { DragEvent } 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/defaultOptions' {\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 export 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 (this: Interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) {\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) { continue }\n\n const accept = dropzone.options.drop.accept\n\n // test the draggable draggableElement against the dropzone's accept setting\n if ((is.element(accept) && accept !== draggableElement) ||\n (is.string(accept) &&\n !domUtils.matchesSelector(draggableElement, accept)) ||\n (is.func(accept) && !accept({ dropzone, draggableElement }))) {\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) ? dropzone.target : [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 ({ dropState, interactable: draggable, element: dragElement }: Partial, dragEvent, pointerEvent) {\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(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, rect)\n ? dropzoneElement\n : null)\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>\n\nfunction fireDropEvents (interaction: Interaction, events: FiredDropEvents) {\n const { dropState } = interaction\n const {\n activeDrops,\n cur,\n prev,\n } = dropState\n\n if (events.leave) { prev.dropzone.fire(events.leave) }\n if (events.enter) { cur.dropzone.fire(events.enter) }\n if (events.move) { cur.dropzone.fire(events.move) }\n if (events.drop) { cur.dropzone.fire(events.drop) }\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') { return }\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 = 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)) { interactable.on('drop', options.ondrop) }\n if (is.func(options.ondropactivate)) { interactable.on('dropactivate', options.ondropactivate) }\n if (is.func(options.ondropdeactivate)) { interactable.on('dropdeactivate', options.ondropdeactivate) }\n if (is.func(options.ondragenter)) { interactable.on('dragenter', options.ondragenter) }\n if (is.func(options.ondragleave)) { interactable.on('dragleave', options.ondragleave) }\n if (is.func(options.ondropmove)) { interactable.on('dropmove', options.ondropmove) }\n\n if (/^(pointer|center)$/.test(options.overlap as string)) {\n interactable.options.drop.overlap = options.overlap\n }\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(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement)\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 = (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(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement)\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') { return }\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': ({ interaction, event, iEvent: dragEvent }: DoPhaseArg<'drag', EventPhase>, scope) => {\n if (interaction.prepared.name !== 'drag') { return }\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': ({ interaction, iEvent: dragEvent }: DoPhaseArg<'drag', EventPhase>, scope) => {\n if (interaction.prepared.name !== 'drag') { return }\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') { return }\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') { return }\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" ] }