{"version":3,"file":"embla-carousel-wheel-gestures.cjs.production.min.js","sources":["../src/WheelGesturesPlugin.ts"],"sourcesContent":["import { EmblaCarouselType } from 'embla-carousel'\nimport { CreateOptionsType } from 'embla-carousel/components/Options'\nimport { OptionsHandlerType } from 'embla-carousel/components/OptionsHandler'\nimport { CreatePluginType } from 'embla-carousel/components/Plugins'\nimport WheelGestures, { WheelEventState } from 'wheel-gestures'\n\nexport type WheelGesturesPluginOptions = CreateOptionsType<{\n wheelDraggingClass: string\n forceWheelAxis?: 'x' | 'y'\n target?: Element\n}>\n\ntype WheelGesturesPluginType = CreatePluginType<{}, WheelGesturesPluginOptions>\n\nconst defaultOptions: WheelGesturesPluginOptions = {\n active: true,\n breakpoints: {},\n wheelDraggingClass: 'is-wheel-dragging',\n forceWheelAxis: undefined,\n target: undefined,\n}\n\nWheelGesturesPlugin.globalOptions = undefined as WheelGesturesPluginType['options'] | undefined\n\nconst __DEV__ = process.env.NODE_ENV !== 'production'\n\nexport function WheelGesturesPlugin(userOptions: WheelGesturesPluginType['options'] = {}): WheelGesturesPluginType {\n let options: WheelGesturesPluginOptions\n let cleanup = () => {}\n\n function init(embla: EmblaCarouselType, optionsHandler: OptionsHandlerType) {\n const { mergeOptions, optionsAtMedia } = optionsHandler\n const optionsBase = mergeOptions(defaultOptions, WheelGesturesPlugin.globalOptions)\n const allOptions = mergeOptions(optionsBase, userOptions)\n options = optionsAtMedia(allOptions)\n\n const engine = embla.internalEngine()\n const targetNode = options.target ?? (embla.containerNode().parentNode as Element)\n const wheelAxis = options.forceWheelAxis ?? engine.options.axis\n const wheelGestures = WheelGestures({\n preventWheelAction: wheelAxis,\n reverseSign: [true, true, false],\n })\n\n const unobserveTargetNode = wheelGestures.observe(targetNode)\n const offWheel = wheelGestures.on('wheel', handleWheel)\n\n let isStarted = false\n let startEvent: MouseEvent\n\n function wheelGestureStarted(state: WheelEventState) {\n try {\n startEvent = new MouseEvent('mousedown', state.event)\n dispatchEvent(startEvent)\n } catch (e) {\n // Legacy Browsers like IE 10 & 11 will throw when attempting to create the Event\n if (__DEV__) {\n console.warn(\n 'Legacy browser requires events-polyfill (https://github.com/xiel/embla-carousel-wheel-gestures#legacy-browsers)'\n )\n }\n return cleanup()\n }\n\n isStarted = true\n addNativeMouseEventListeners()\n\n if (options.wheelDraggingClass) {\n targetNode.classList.add(options.wheelDraggingClass)\n }\n }\n\n function wheelGestureEnded(state: WheelEventState) {\n isStarted = false\n dispatchEvent(createRelativeMouseEvent('mouseup', state))\n removeNativeMouseEventListeners()\n\n if (options.wheelDraggingClass) {\n targetNode.classList.remove(options.wheelDraggingClass)\n }\n }\n\n function addNativeMouseEventListeners() {\n document.documentElement.addEventListener('mousemove', preventNativeMouseHandler, true)\n document.documentElement.addEventListener('mouseup', preventNativeMouseHandler, true)\n document.documentElement.addEventListener('mousedown', preventNativeMouseHandler, true)\n }\n\n function removeNativeMouseEventListeners() {\n document.documentElement.removeEventListener('mousemove', preventNativeMouseHandler, true)\n document.documentElement.removeEventListener('mouseup', preventNativeMouseHandler, true)\n document.documentElement.removeEventListener('mousedown', preventNativeMouseHandler, true)\n }\n\n function preventNativeMouseHandler(e: MouseEvent) {\n if (isStarted && e.isTrusted) {\n e.stopImmediatePropagation()\n }\n }\n\n function createRelativeMouseEvent(type: 'mousedown' | 'mousemove' | 'mouseup', state: WheelEventState) {\n let moveX, moveY\n\n if (wheelAxis === engine.options.axis) {\n ;[moveX, moveY] = state.axisMovement\n } else {\n // if emblas axis and the wheelAxis don't match, swap the axes to match the right embla events\n ;[moveY, moveX] = state.axisMovement\n }\n\n // prevent skipping slides\n if (!engine.options.skipSnaps && !engine.options.dragFree) {\n const maxX = engine.containerRect.width\n const maxY = engine.containerRect.height\n\n moveX = moveX < 0 ? Math.max(moveX, -maxX) : Math.min(moveX, maxX)\n moveY = moveY < 0 ? Math.max(moveY, -maxY) : Math.min(moveY, maxY)\n }\n\n return new MouseEvent(type, {\n clientX: startEvent.clientX + moveX,\n clientY: startEvent.clientY + moveY,\n screenX: startEvent.screenX + moveX,\n screenY: startEvent.screenY + moveY,\n movementX: moveX,\n movementY: moveY,\n button: 0,\n bubbles: true,\n cancelable: true,\n composed: true,\n })\n }\n\n function dispatchEvent(event: UIEvent) {\n embla.containerNode().dispatchEvent(event)\n }\n\n function handleWheel(state: WheelEventState) {\n const {\n axisDelta: [deltaX, deltaY],\n } = state\n const primaryAxisDelta = wheelAxis === 'x' ? deltaX : deltaY\n const crossAxisDelta = wheelAxis === 'x' ? deltaY : deltaX\n const isRelease = state.isMomentum && state.previous && !state.previous.isMomentum\n const isEndingOrRelease = (state.isEnding && !state.isMomentum) || isRelease\n const primaryAxisDeltaIsDominant = Math.abs(primaryAxisDelta) > Math.abs(crossAxisDelta)\n\n if (primaryAxisDeltaIsDominant && !isStarted && !state.isMomentum) {\n wheelGestureStarted(state)\n }\n\n if (!isStarted) return\n if (isEndingOrRelease) {\n wheelGestureEnded(state)\n } else {\n dispatchEvent(createRelativeMouseEvent('mousemove', state))\n }\n }\n\n cleanup = () => {\n unobserveTargetNode()\n offWheel()\n removeNativeMouseEventListeners()\n }\n }\n\n const self: WheelGesturesPluginType = {\n name: 'wheelGestures',\n options: userOptions,\n init,\n destroy: () => cleanup(),\n }\n return self\n}\n\ndeclare module 'embla-carousel' {\n interface EmblaPluginsType {\n wheelGestures?: WheelGesturesPluginType\n }\n}\n"],"names":["defaultOptions","active","breakpoints","wheelDraggingClass","forceWheelAxis","undefined","target","WheelGesturesPlugin","userOptions","options","cleanup","name","init","embla","optionsHandler","mergeOptions","optionsAtMedia","optionsBase","globalOptions","allOptions","startEvent","engine","internalEngine","targetNode","containerNode","parentNode","wheelAxis","axis","wheelGestures","WheelGestures","preventWheelAction","reverseSign","unobserveTargetNode","observe","offWheel","on","state","axisDelta","deltaX","deltaY","crossAxisDelta","isEndingOrRelease","isEnding","isMomentum","previous","Math","abs","isStarted","dispatchEvent","MouseEvent","event","e","document","documentElement","addEventListener","preventNativeMouseHandler","classList","add","wheelGestureStarted","createRelativeMouseEvent","removeNativeMouseEventListeners","remove","wheelGestureEnded","removeEventListener","isTrusted","stopImmediatePropagation","type","moveX","moveY","axisMovement","skipSnaps","dragFree","maxX","containerRect","width","maxY","height","max","min","clientX","clientY","screenX","screenY","movementX","movementY","button","bubbles","cancelable","composed","destroy"],"mappings":"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"}