{ "version": 3, "sources": ["../../src/slick.interactions.ts"], "sourcesContent": ["import type { DragItem, DragPosition, DraggableOption, MouseWheelOption, ResizableOption } from './models/index';\nimport { Utils as Utils_ } from './slick.core';\n\n// for (iife) load Slick methods from global Slick object, or use imports for (esm)\nconst Utils = IIFE_ONLY ? Slick.Utils : Utils_;\n\n/***\n * Interactions, add basic behaviors to any element.\n * All the packages are written in pure vanilla JS and supports both mouse & touch events.\n * @module Interactions\n * @namespace Slick\n */\n\n/**\n * Draggable Class, enables dragging functionality for any element for example cell & row selections.\n * Note that mouse/touch start is on the specified container element but all other events are on the document body.\n * code refs:\n * https://betterprogramming.pub/perfecting-drag-and-drop-in-pure-vanilla-javascript-a761184b797a\n * available optional options:\n * - containerElement: container DOM element, defaults to \"document\"\n * - allowDragFrom: when defined, only allow dragging from an element that matches a specific query selector\n * - allowDragFromClosest: when defined, only allow dragging from an element or its parent matching a specific .closest() query selector\n * - onDragInit: drag initialized callback\n * - onDragStart: drag started callback\n * - onDrag: drag callback\n * - onDragEnd: drag ended callback\n * @param {Object} options\n * @returns - Draggable instance which includes destroy method\n * @class Draggable\n */\nexport function Draggable(options: DraggableOption) {\n let { containerElement } = options;\n const { onDragInit, onDragStart, onDrag, onDragEnd } = options;\n let element: HTMLElement | null;\n let startX: number;\n let startY: number;\n let deltaX: number;\n let deltaY: number;\n let dragStarted: boolean;\n\n if (!containerElement) {\n containerElement = document.body;\n }\n\n let originaldd: Partial = {\n dragSource: containerElement,\n dragHandle: null,\n };\n\n function init() {\n if (containerElement) {\n containerElement.addEventListener('mousedown', userPressed as EventListener);\n containerElement.addEventListener('touchstart', userPressed as EventListener);\n }\n }\n\n function executeDragCallbackWhenDefined(callback?: (e: DragEvent, dd: DragItem) => boolean | void, evt?: MouseEvent | Touch | TouchEvent, dd?: DragItem) {\n if (typeof callback === 'function') {\n callback(evt as DragEvent, dd as DragItem);\n }\n }\n\n function destroy() {\n if (containerElement) {\n containerElement.removeEventListener('mousedown', userPressed as EventListener);\n containerElement.removeEventListener('touchstart', userPressed as EventListener);\n }\n }\n\n function userPressed(event: MouseEvent | TouchEvent) {\n element = event.target as HTMLElement;\n const targetEvent: MouseEvent | Touch = (event as TouchEvent)?.touches?.[0] ?? event;\n const { target } = targetEvent;\n\n if (!options.allowDragFrom || (options.allowDragFrom && (element.matches(options.allowDragFrom)) || (options.allowDragFromClosest && element.closest(options.allowDragFromClosest)))) {\n originaldd.dragHandle = element as HTMLElement;\n const winScrollPos = Utils.windowScrollPosition();\n startX = winScrollPos.left + targetEvent.clientX;\n startY = winScrollPos.top + targetEvent.clientY;\n deltaX = targetEvent.clientX - targetEvent.clientX;\n deltaY = targetEvent.clientY - targetEvent.clientY;\n originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });\n executeDragCallbackWhenDefined(onDragInit as (e: DragEvent, dd: DragPosition) => boolean | void, event, originaldd as DragItem);\n\n document.body.addEventListener('mousemove', userMoved);\n document.body.addEventListener('touchmove', userMoved);\n document.body.addEventListener('mouseup', userReleased);\n document.body.addEventListener('touchend', userReleased);\n document.body.addEventListener('touchcancel', userReleased);\n }\n }\n\n function userMoved(event: MouseEvent | TouchEvent) {\n const targetEvent: MouseEvent | Touch = (event as TouchEvent)?.touches?.[0] ?? event;\n deltaX = targetEvent.clientX - startX;\n deltaY = targetEvent.clientY - startY;\n const { target } = targetEvent;\n\n if (!dragStarted) {\n originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });\n executeDragCallbackWhenDefined(onDragStart, event, originaldd as DragItem);\n dragStarted = true;\n }\n\n originaldd = Object.assign(originaldd, { deltaX, deltaY, startX, startY, target });\n executeDragCallbackWhenDefined(onDrag, event, originaldd as DragItem);\n }\n\n function userReleased(event: MouseEvent | TouchEvent) {\n document.body.removeEventListener('mousemove', userMoved);\n document.body.removeEventListener('touchmove', userMoved);\n document.body.removeEventListener('mouseup', userReleased);\n document.body.removeEventListener('touchend', userReleased);\n document.body.removeEventListener('touchcancel', userReleased);\n\n // trigger a dragEnd event only after dragging started and stopped\n if (dragStarted) {\n const { target } = event;\n originaldd = Object.assign(originaldd, { target });\n executeDragCallbackWhenDefined(onDragEnd, event, originaldd as DragItem);\n dragStarted = false;\n }\n }\n\n // initialize Slick.MouseWheel by attaching mousewheel event\n init();\n\n // public API\n return { destroy };\n}\n\n/**\n * MouseWheel Class, add mousewheel listeners and calculate delta values and return them in the callback function.\n * available optional options:\n * - element: optional DOM element to attach mousewheel values, if undefined we'll attach it to the \"window\" object\n * - onMouseWheel: mousewheel callback\n * @param {Object} options\n * @returns - MouseWheel instance which includes destroy method\n * @class MouseWheel\n */\nexport function MouseWheel(options: MouseWheelOption) {\n const { element, onMouseWheel } = options;\n\n function destroy() {\n element.removeEventListener('wheel', wheelHandler as EventListener);\n element.removeEventListener('mousewheel', wheelHandler as EventListener);\n }\n\n function init() {\n element.addEventListener('wheel', wheelHandler as EventListener);\n element.addEventListener('mousewheel', wheelHandler as EventListener);\n }\n\n // copy over the same event handler code used in jquery.mousewheel\n function wheelHandler(event: WheelEvent & { axis: number; wheelDelta: number; wheelDeltaX: number; wheelDeltaY: number; HORIZONTAL_AXIS: number; }) {\n const orgEvent = event || window.event;\n let delta = 0;\n let deltaX = 0;\n let deltaY = 0;\n\n // Old school scrollwheel delta\n if (orgEvent.wheelDelta) {\n delta = orgEvent.wheelDelta / 120;\n }\n if (orgEvent.detail) {\n delta = -orgEvent.detail / 3;\n }\n\n // New school multidimensional scroll (touchpads) deltas\n deltaY = delta;\n\n // Gecko\n if (orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) {\n deltaY = 0;\n deltaX = -1 * delta;\n }\n\n // WebKit\n if (orgEvent.wheelDeltaY !== undefined) {\n deltaY = orgEvent.wheelDeltaY / 120;\n }\n if (orgEvent.wheelDeltaX !== undefined) {\n deltaX = -1 * orgEvent.wheelDeltaX / 120;\n }\n\n if (typeof onMouseWheel === 'function') {\n onMouseWheel(event, delta, deltaX, deltaY);\n }\n }\n\n // initialize Slick.MouseWheel by attaching mousewheel event\n init();\n\n // public API\n return { destroy };\n}\n\n/**\n * Resizable Class, enables resize functionality for any element\n * Code mostly comes from these 2 resources:\n * https://spin.atomicobject.com/2019/11/21/creating-a-resizable-html-element/\n * https://htmldom.dev/make-a-resizable-element/\n * available optional options:\n * - resizeableElement: resizable DOM element\n * - resizeableHandleElement: resizable DOM element\n * - onResizeStart: resize start callback\n * - onResize: resizing callback\n * - onResizeEnd: resize ended callback\n * @param {Object} options\n * @returns - Resizable instance which includes destroy method\n * @class Resizable\n */\nexport function Resizable(options: ResizableOption) {\n const { resizeableElement, resizeableHandleElement, onResizeStart, onResize, onResizeEnd } = options;\n if (!resizeableHandleElement || typeof resizeableHandleElement.addEventListener !== 'function') {\n throw new Error('[Slick.Resizable] You did not provide a valid html element that will be used for the handle to resize.');\n }\n\n function init() {\n // add event listeners on the draggable element\n resizeableHandleElement.addEventListener('mousedown', resizeStartHandler);\n resizeableHandleElement.addEventListener('touchstart', resizeStartHandler);\n }\n\n function destroy() {\n if (typeof resizeableHandleElement?.removeEventListener === 'function') {\n resizeableHandleElement.removeEventListener('mousedown', resizeStartHandler);\n resizeableHandleElement.removeEventListener('touchstart', resizeStartHandler);\n }\n }\n\n function executeResizeCallbackWhenDefined(callback?: Function, e?: MouseEvent | TouchEvent | Touch) {\n if (typeof callback === 'function') {\n callback(e, { resizeableElement, resizeableHandleElement });\n }\n }\n\n function resizeStartHandler(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n executeResizeCallbackWhenDefined(onResizeStart, event);\n document.body.addEventListener('mousemove', resizingHandler);\n document.body.addEventListener('mouseup', resizeEndHandler);\n document.body.addEventListener('touchmove', resizingHandler);\n document.body.addEventListener('touchend', resizeEndHandler);\n }\n\n function resizingHandler(e: MouseEvent | TouchEvent) {\n if (e.preventDefault && e.type !== 'touchmove') {\n e.preventDefault();\n }\n const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n if (typeof onResize === 'function') {\n onResize(event, { resizeableElement, resizeableHandleElement });\n }\n }\n\n /** Remove all mouse/touch handlers */\n function resizeEndHandler(e: MouseEvent | TouchEvent) {\n const event = (e as TouchEvent).touches ? (e as TouchEvent).changedTouches[0] : e;\n executeResizeCallbackWhenDefined(onResizeEnd, event);\n document.body.removeEventListener('mousemove', resizingHandler);\n document.body.removeEventListener('mouseup', resizeEndHandler);\n document.body.removeEventListener('touchmove', resizingHandler);\n document.body.removeEventListener('touchend', resizeEndHandler);\n }\n\n init();\n\n // public API\n return { destroy };\n}\n\n// extend Slick namespace on window object when building as iife\nif (IIFE_ONLY && window.Slick) {\n Utils.extend(Slick, {\n Draggable,\n MouseWheel,\n Resizable,\n });\n}\n"], "mappings": "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", "names": [] }