{"version":3,"file":"onscroll-detection.modern.mjs","sources":["../src/index.js"],"sourcesContent":["/**\n * Written by Elliott Mangham at Code Resolution.\n * Maintained by Code Resolution.\n * made@coderesolution.com\n */\nexport default class OnscrollDetection {\n\tconstructor(options = {}, gsap = null, ScrollTrigger = null) {\n\t\t// Set dependencies\n\t\tthis._gsap = gsap\n\t\tthis._ScrollTrigger = ScrollTrigger\n\n\t\t// Initialise class properties with default values or provided options\n\t\tthis.elements = options.elements || '[data-onscroll]'\n\t\tthis.screen = options.screen || '(min-width: 1025px)'\n\t\tthis.triggers = new Map()\n\t\tthis.debug = options.debug || false\n\t\tthis.endPosition = options.end || 'bottom top'\n\t\tthis.startPosition = options.start || 'top bottom'\n\n\t\t// Set class names to defaults or provided options\n\t\tthis.scrollingClass = options.scrollingClass || 'is-scrolling'\n\t\tthis.scrolledClass = options.scrolledClass || 'has-scrolled'\n\t\tthis.stickyClass = options.stickyClass || 'is-sticky'\n\t\tthis.stuckClass = options.stuckClass || 'has-stuck'\n\n\t\t// Initialise event handlers\n\t\tthis.eventHandlers = {}\n\n\t\t// Set autoStart to true by default, or use provided value\n\t\tthis.autoStart = options.autoStart !== undefined ? options.autoStart : true\n\n\t\t// Initialise the class\n\t\tif (this.autoStart) {\n\t\t\tthis.init()\n\t\t}\n\t}\n\n\t// Register GSAP and plugins\n\tregister(gsap, ScrollTrigger) {\n\t\tthis._gsap = gsap\n\t\tthis._ScrollTrigger = ScrollTrigger\n\t}\n\n\t// Initialisation function\n\tinit() {\n\t\t// Check if gsap is registered\n\t\tif (this._gsap === null || this._gsap === undefined) {\n\t\t\tconsole.log('GSAP is not registered. Exiting')\n\t\t\treturn\n\t\t}\n\n\t\t// Check if ScrollTrigger is registered\n\t\tif (this._ScrollTrigger === null || this._ScrollTrigger === undefined) {\n\t\t\tconsole.log('ScrollTrigger is not registered. Exiting')\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert elements to an array and loop through each\n\t\t\tthis._gsap.utils.toArray(this.elements).forEach((element, index) => {\n\t\t\t\t// Get the trigger element\n\t\t\t\tconst trigger = this.getTrigger(element)\n\n\t\t\t\t// Get the screen media query\n\t\t\t\tconst screen = this.getScreen(element)\n\n\t\t\t\t// Create a matchMedia instance\n\t\t\t\tconst matchMedia = this._gsap.matchMedia()\n\n\t\t\t\t// Get the animation properties for 'from' state\n\t\t\t\tconst fromProperties = this.getFromProperties(element)\n\n\t\t\t\tfromProperties.startAt = { backgroundColor: 'red' }\n\t\t\t\tfromProperties.immediateRender = true\n\n\t\t\t\t// Get the animation properties for 'to' state\n\t\t\t\tconst toProperties = this.getToProperties(element, index, trigger)\n\n\t\t\t\t// Add the animation to the matchMedia instance and store the ScrollTrigger instance\n\t\t\t\tmatchMedia.add(screen, () => {\n\t\t\t\t\tconst gsapAnimation = this._gsap.fromTo(element, fromProperties, toProperties)\n\n\t\t\t\t\tthis.triggers.set(gsapAnimation.scrollTrigger, {\n\t\t\t\t\t\telement,\n\t\t\t\t\t\tfromProperties,\n\t\t\t\t\t\ttoProperties,\n\t\t\t\t\t\tgsapAnimation,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\t// Enable debug mode for logging\n\t\t\t\tthis.debugMode(element, index)\n\t\t\t})\n\t\t} catch (error) {\n\t\t\t// Catch and log any errors\n\t\t\tconsole.error('Error initialising OnscrollDetection:', error)\n\t\t}\n\t}\n\n\t// Function to load and initialize the class\n\tstart() {\n\t\t// Initialize the class\n\t\tthis.init()\n\t}\n\n\t// Events\n\ton(event, handler) {\n\t\tif (!this.eventHandlers[event]) {\n\t\t\tthis.eventHandlers[event] = []\n\t\t}\n\t\tthis.eventHandlers[event].push(handler)\n\t}\n\n\temit(event, ...args) {\n\t\tif (this.eventHandlers[event]) {\n\t\t\tthis.eventHandlers[event].forEach((handler) => handler(...args))\n\t\t}\n\t}\n\n\t// Get the trigger element for ScrollTrigger\n\tgetTrigger(element) {\n\t\tif (this.hasAttributes(element, ['data-onscroll-auto']) && !element.hasAttribute('data-onscroll-trigger')) {\n\t\t\t// If data-onscroll-auto is present and data-onscroll-trigger is not, use the parent element as the trigger\n\t\t\treturn element.parentElement\n\t\t} else if (element.hasAttribute('data-onscroll-trigger')) {\n\t\t\t// If data-onscroll-trigger is present, try to find the DOM element specified by the attribute\n\t\t\tlet triggerElement = document.querySelector(element.dataset.onscrollTrigger)\n\t\t\tif (triggerElement) {\n\t\t\t\treturn triggerElement\n\t\t\t} else {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Element specified by data-onscroll-trigger not found: ${element.dataset.onscrollTrigger}`\n\t\t\t\t)\n\t\t\t\treturn element\n\t\t\t}\n\t\t} else {\n\t\t\t// Otherwise, use the element itself as the trigger\n\t\t\treturn element\n\t\t}\n\t}\n\n\t// Get the screen media query\n\tgetScreen(element) {\n\t\treturn element.hasAttribute('data-onscroll-screen') ? element.dataset.onscrollScreen : this.screen\n\t}\n\n\t// Get the animation properties for 'from' state\n\tgetFromProperties(element) {\n\t\tconst animateFrom = this.getAnimateFrom(element)\n\t\tconst { offset } = this.getOffsetAndDistance(element)\n\n\t\treturn {\n\t\t\t...animateFrom,\n\t\t\tbottom: this.hasAttributes(element, ['data-onscroll-auto', 'data-onscroll-reverse']) ? 'auto' : null,\n\t\t\ttop:\n\t\t\t\tthis.hasAttributes(element, ['data-onscroll-auto']) &&\n\t\t\t\t!this.hasAttributes(element, ['data-onscroll-reverse'])\n\t\t\t\t\t? 'auto'\n\t\t\t\t\t: null,\n\t\t\tx:\n\t\t\t\tthis.hasAttributes(element, ['data-onscroll-direction']) &&\n\t\t\t\t(this.getDirection(element) === 'x' || this.getDirection(element) === 'xy')\n\t\t\t\t\t? offset\n\t\t\t\t\t: null,\n\t\t\ty:\n\t\t\t\t!this.hasAttributes(element, ['data-onscroll-direction']) ||\n\t\t\t\t(this.hasAttributes(element, ['data-onscroll-direction']) &&\n\t\t\t\t\t(this.getDirection(element) === 'y' || this.getDirection(element) === 'xy'))\n\t\t\t\t\t? offset\n\t\t\t\t\t: null,\n\t\t}\n\t}\n\n\t// Get the animation properties for 'to' state\n\tgetToProperties(element, index, trigger) {\n\t\tconst animateTo = this.getAnimateTo(element)\n\t\tconst stickyProperties = this.getStickyProperties(element)\n\t\tconst isSticky = this.hasAttributes(element, ['data-onscroll-sticky'])\n\t\tconst customEventName = element.getAttribute('data-onscroll-call')\n\t\tconst progressEventName = element.getAttribute('data-onscroll-progress')\n\n\t\t// Helper function to dispatch the custom event\n\t\tconst dispatchCustomEvent = (when, direction) => {\n\t\t\tif (customEventName) {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(customEventName, {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\ttarget: element,\n\t\t\t\t\t\t\tdirection: direction === 1 ? 'down' : 'up',\n\t\t\t\t\t\t\twhen,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Helper function to dispatch progress event\n\t\tconst dispatchProgressEvent = (progress, direction) => {\n\t\t\tif (progressEventName) {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(progressEventName, {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\telement: element,\n\t\t\t\t\t\t\tprogress: progress,\n\t\t\t\t\t\t\tdirection: direction === 1 ? 'down' : 'up',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...animateTo,\n\t\t\tx: this.getX(element),\n\t\t\ty: this.getY(element),\n\t\t\tease: 'none',\n\t\t\tscrollTrigger: {\n\t\t\t\ttrigger: isSticky ? element : trigger,\n\t\t\t\tstart: this.getStart(element),\n\t\t\t\tend: this.getEnd(element),\n\t\t\t\tinvalidateOnRefresh: true,\n\t\t\t\tpin: stickyProperties.pin,\n\t\t\t\tpinSpacing: stickyProperties.pinSpacing,\n\t\t\t\tscrub: this.getScrub(element),\n\t\t\t\tmarkers: this.hasAttributes(element, ['data-onscroll-debug']),\n\t\t\t\tonUpdate: (self) => {\n\t\t\t\t\tif (progressEventName) {\n\t\t\t\t\t\tlet progress = self.progress.toFixed(2)\n\t\t\t\t\t\telement.style.setProperty('--onscrollProgress', progress)\n\t\t\t\t\t\tdispatchProgressEvent(progress, self.direction)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonToggle: (self) => {\n\t\t\t\t\tif (!self.isActive && progressEventName) {\n\t\t\t\t\t\telement.style.setProperty('--onscrollProgress', 0)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonEnter: ({ direction }) => {\n\t\t\t\t\telement.classList.add(this.scrollingClass, this.scrolledClass)\n\t\t\t\t\tif (isSticky) {\n\t\t\t\t\t\telement.classList.add(this.stickyClass, this.stuckClass)\n\t\t\t\t\t}\n\t\t\t\t\tdispatchCustomEvent('onEnter', direction)\n\t\t\t\t\tthis.emit('onEnter', element)\n\t\t\t\t},\n\t\t\t\tonLeave: ({ direction }) => {\n\t\t\t\t\telement.classList.remove(this.scrollingClass)\n\t\t\t\t\tif (isSticky) {\n\t\t\t\t\t\telement.classList.remove(this.stickyClass)\n\t\t\t\t\t}\n\t\t\t\t\tdispatchCustomEvent('onLeave', direction)\n\t\t\t\t\tthis.emit('onLeave', element)\n\t\t\t\t},\n\t\t\t\tonEnterBack: ({ direction }) => {\n\t\t\t\t\telement.classList.add(this.scrollingClass)\n\t\t\t\t\tif (isSticky) {\n\t\t\t\t\t\telement.classList.add(this.stickyClass)\n\t\t\t\t\t}\n\t\t\t\t\tdispatchCustomEvent('onEnterBack', direction)\n\t\t\t\t\tthis.emit('onEnterBack', element)\n\t\t\t\t},\n\t\t\t\tonLeaveBack: ({ direction }) => {\n\t\t\t\t\telement.classList.remove(this.scrollingClass)\n\t\t\t\t\tif (isSticky) {\n\t\t\t\t\t\telement.classList.remove(this.stickyClass)\n\t\t\t\t\t}\n\t\t\t\t\tdispatchCustomEvent('onLeaveBack', direction)\n\t\t\t\t\tthis.emit('onLeaveBack', element)\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t}\n\n\t// Get the sticky properties for ScrollTrigger animation\n\tgetStickyProperties(element) {\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\treturn { pin: true, pinSpacing: false }\n\t\t} else {\n\t\t\treturn { pin: false, pinSpacing: true }\n\t\t}\n\t}\n\n\t// Check if an element has all the specified attributes\n\thasAttributes(element, attrs) {\n\t\treturn attrs.every((attr) => element.hasAttribute(attr))\n\t}\n\n\t// Get the animation properties for 'from' state\n\tgetAnimateFrom(element) {\n\t\treturn element.hasAttribute('data-onscroll-from') ? JSON.parse(element.dataset.onscrollFrom) : []\n\t}\n\n\t// Get the animation properties for 'to' state\n\tgetAnimateTo(element) {\n\t\treturn element.hasAttribute('data-onscroll-to') ? JSON.parse(element.dataset.onscrollTo) : []\n\t}\n\n\t// Get the offset value\n\tgetOffset(element) {\n\t\treturn element.hasAttribute('data-onscroll-offset') ? parseInt(element.dataset.onscrollOffset) : null\n\t}\n\n\t// Get the scroll direction\n\tgetDirection(element) {\n\t\treturn element.dataset.onscrollDirection ? element.dataset.onscrollDirection : 'y'\n\t}\n\n\t// Get the 'x' value for ScrollTrigger animation\n\tgetX(element) {\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\treturn null\n\t\t}\n\t\tif (\n\t\t\tthis.hasAttributes(element, ['data-onscroll-direction']) &&\n\t\t\t(this.getDirection(element) === 'x' || this.getDirection(element) === 'xy')\n\t\t) {\n\t\t\treturn this.getDistanceOrSpeed(element)\n\t\t}\n\t}\n\n\t// Get the 'y' value for ScrollTrigger animation\n\tgetY(element) {\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\treturn null\n\t\t}\n\t\tif (\n\t\t\t!this.hasAttributes(element, ['data-onscroll-direction']) ||\n\t\t\t(this.hasAttributes(element, ['data-onscroll-direction']) &&\n\t\t\t\t(this.getDirection(element) === 'y' || this.getDirection(element) === 'xy'))\n\t\t) {\n\t\t\treturn this.getDistanceOrSpeed(element)\n\t\t}\n\t}\n\n\t// Get the offset and distance values\n\tgetOffsetAndDistance(element) {\n\t\t// Check if the element has the data-onscroll-sticky attribute\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\treturn { offset: null, distance: null }\n\t\t}\n\n\t\tlet offset = null\n\t\tlet distance = null\n\t\tconst triggerElement = this.getTrigger(element)\n\t\tconst triggerHeight = triggerElement.offsetHeight\n\n\t\tif (element.hasAttribute('data-onscroll-offset')) {\n\t\t\tconst [offsetValue, distanceValue] = element.dataset.onscrollOffset.split(',')\n\n\t\t\t// If the offset value ends with a '%', calculate it as a percentage of the trigger height\n\t\t\tif (offsetValue.trim().endsWith('%')) {\n\t\t\t\tconst offsetPercentage = parseFloat(offsetValue) / 100\n\t\t\t\toffset = offsetPercentage * triggerHeight\n\t\t\t} else {\n\t\t\t\toffset = parseFloat(offsetValue)\n\t\t\t}\n\n\t\t\t// If the distance value ends with a '%', calculate it as a percentage of the trigger height\n\t\t\tif (distanceValue.trim().endsWith('%')) {\n\t\t\t\tconst distancePercentage = parseFloat(distanceValue) / 100\n\t\t\t\tdistance = distancePercentage * triggerHeight\n\t\t\t} else {\n\t\t\t\tdistance = parseFloat(distanceValue)\n\t\t\t}\n\t\t}\n\n\t\treturn { offset, distance }\n\t}\n\n\t// Get the distance or speed value for ScrollTrigger animation\n\tgetDistanceOrSpeed(element) {\n\t\tconst { distance } = this.getOffsetAndDistance(element)\n\t\tconst viewportHeight = window.innerHeight\n\t\tlet scrollSpeed = element.dataset.onscrollSpeed\n\t\tlet additionalDistance = 0\n\n\t\t// Check if there are two values\n\t\tif (scrollSpeed && scrollSpeed.includes(',')) {\n\t\t\tconst [speed, percentage] = scrollSpeed.split(',').map(parseFloat)\n\n\t\t\t// Update the scrollSpeed and calculate the additional distance\n\t\t\tscrollSpeed = speed\n\t\t\tadditionalDistance = (percentage / 100) * viewportHeight\n\n\t\t\t// If scrollSpeed is negative, subtract the additional distance\n\t\t\tif (scrollSpeed < 0) {\n\t\t\t\tadditionalDistance *= -1\n\t\t\t}\n\t\t} else {\n\t\t\tscrollSpeed = parseFloat(scrollSpeed || '0')\n\t\t}\n\n\t\tif (this.hasAttributes(element, ['data-onscroll-auto'])) {\n\t\t\tconst triggerElement = this.getTrigger(element)\n\t\t\tconst autoDistance = Math.abs(triggerElement.offsetHeight - element.offsetHeight)\n\t\t\treturn this.hasAttributes(element, ['data-onscroll-reverse']) ? -autoDistance : autoDistance\n\t\t} else if (this.hasAttributes(element, ['data-onscroll-speed'])) {\n\t\t\tconst elementHeight = element.offsetHeight\n\t\t\tconst scrollDistance = scrollSpeed * elementHeight + additionalDistance\n\t\t\treturn scrollDistance\n\t\t} else if (distance !== null) {\n\t\t\treturn distance\n\t\t}\n\t}\n\n\t// Get the delay value which controls the scrub setting\n\tgetScrub(element) {\n\t\tif (this.hasAttributes(element, ['data-onscroll-delay'])) {\n\t\t\treturn parseInt(element.dataset.onscrollDelay)\n\t\t} else {\n\t\t\treturn true // Default scrub value if no 'data-onscroll-delay' attribute is present\n\t\t}\n\t}\n\n\t// Get the start value for ScrollTrigger animation\n\tgetStart(element) {\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\tlet stickyOffset = 0\n\n\t\t\tif (element.hasAttribute('data-onscroll-offset')) {\n\t\t\t\tconst [offsetValue] = element.dataset.onscrollOffset.split(',')\n\t\t\t\tstickyOffset = parseFloat(offsetValue)\n\t\t\t}\n\n\t\t\treturn (element.dataset.onscrollStart ? element.dataset.onscrollStart : 'top top') + '+=' + stickyOffset\n\t\t} else if (\n\t\t\tthis.hasAttributes(element, ['data-onscroll-preset', 'data-onscroll-offset']) &&\n\t\t\tthis.getDirection(element) !== 'x' &&\n\t\t\t!this.hasAttributes(element, ['data-onscroll-start', 'data-onscroll-sticky'])\n\t\t) {\n\t\t\tconst [offsetValue] = element.dataset.onscrollOffset.split(',')\n\t\t\tlet positionElement = parseFloat(offsetValue) < 0 ? 'top+=' + offsetValue : 'top+=0'\n\t\t\tlet positionMarker = 'bottom'\n\n\t\t\treturn positionElement + ' ' + positionMarker\n\t\t} else {\n\t\t\treturn element.dataset.onscrollStart ? element.dataset.onscrollStart : this.startPosition\n\t\t}\n\t}\n\n\t// Get the end value for ScrollTrigger animation\n\tgetEnd(element) {\n\t\tif (element.hasAttribute('data-onscroll-sticky')) {\n\t\t\tconst trigger = this.getTrigger(element)\n\t\t\tlet stickyOffset = 0\n\n\t\t\tif (element.hasAttribute('data-onscroll-offset')) {\n\t\t\t\tconst [, distanceValue] = element.dataset.onscrollOffset.split(',')\n\t\t\t\tstickyOffset = parseFloat(distanceValue)\n\t\t\t}\n\n\t\t\tconst stickyDistance = trigger.clientHeight - element.clientHeight - stickyOffset\n\n\t\t\treturn element.dataset.onscrollEnd ? element.dataset.onscrollEnd : '+=' + stickyDistance\n\t\t} else if (this.hasAttributes(element, ['data-onscroll-speed']) && !element.hasAttribute('data-onscroll-end')) {\n\t\t\tconst scrollDistance = this.getDistanceOrSpeed(element)\n\n\t\t\treturn `bottom${scrollDistance >= 0 ? '+=' : '-='}${Math.abs(scrollDistance)} top`\n\t\t} else if (\n\t\t\tthis.hasAttributes(element, ['data-onscroll-preset', 'data-onscroll-offset']) &&\n\t\t\tthis.getDirection(element) !== 'x' &&\n\t\t\t!this.hasAttributes(element, ['data-onscroll-end', 'data-onscroll-sticky'])\n\t\t) {\n\t\t\tconst [, distanceValue] = element.dataset.onscrollOffset.split(',')\n\t\t\tlet positionElement = 'bottom+=' + distanceValue\n\t\t\tlet positionMarker = 'top'\n\n\t\t\treturn positionElement + ' ' + positionMarker\n\t\t} else {\n\t\t\treturn element.dataset.onscrollEnd ? element.dataset.onscrollEnd : this.endPosition\n\t\t}\n\t}\n\n\t// Enable debug mode for logging\n\tdebugMode(element, index) {\n\t\tif (!this.debug && !this.hasAttributes(element, ['data-onscroll-debug'])) return\n\n\t\tconst { offset /*, distance*/ } = this.getOffsetAndDistance(element)\n\t\tlet speedMultiplier = 0\n\t\tlet speedViewportPercentage = 0\n\n\t\tif (this.hasAttributes(element, ['data-onscroll-speed'])) {\n\t\t\tconst speedValues = element.dataset.onscrollSpeed.split(',')\n\n\t\t\tspeedMultiplier = parseFloat(speedValues[0])\n\t\t\tspeedViewportPercentage = parseFloat(speedValues[1])\n\n\t\t\t// Provide defaults in case parsing failed\n\t\t\tspeedMultiplier = isNaN(speedMultiplier) ? 0 : speedMultiplier\n\t\t\tspeedViewportPercentage = isNaN(speedViewportPercentage) ? 0 : speedViewportPercentage\n\t\t}\n\n\t\tconst attrs = element.dataset\n\t\tconst hasSpeed = this.hasAttributes(element, ['data-onscroll-speed'])\n\t\tconst hasPreset = this.hasAttributes(element, ['data-onscroll-preset'])\n\t\tconst hasSticky = this.hasAttributes(element, ['data-onscroll-sticky'])\n\t\tconst hasReverse = this.hasAttributes(element, ['data-onscroll-reverse'])\n\n\t\tconsole.group(`OnscrollDetection() debug instance (#${index + 1})`)\n\t\tconsole.log({\n\t\t\telement: element,\n\t\t\ttrigger: this.getTrigger(element),\n\t\t\ttriggerStart: this.getStart(element),\n\t\t\ttriggerEnd: this.getEnd(element),\n\t\t\tauto: this.hasAttributes(element, ['data-onscroll-auto']),\n\t\t\toffsetBefore: offset,\n\t\t\toffsetAfter: this.getDistanceOrSpeed(element),\n\t\t\tdelay: this.getScrub(element),\n\t\t\tscreen: this.getScreen(element),\n\t\t\tspeed: hasSpeed\n\t\t\t\t? `${parseFloat(\n\t\t\t\t\t\tspeedMultiplier * element.clientHeight + (speedViewportPercentage / 100) * window.innerHeight\n\t\t\t\t  )} (${parseFloat(speedMultiplier)}x element height + ${parseFloat(\n\t\t\t\t\t\tspeedViewportPercentage\n\t\t\t\t  )}% of the viewport height)`\n\t\t\t\t: null,\n\t\t\tdirection: this.hasAttributes(element, ['data-onscroll-direction']) ? attrs.onscrollDirection : 'y',\n\t\t\tpreset: hasPreset,\n\t\t\treverse: hasReverse,\n\t\t\tsticky: hasSticky,\n\t\t\tanimateFrom: this.getAnimateFrom(element),\n\t\t\tanimateTo: this.getAnimateTo(element),\n\t\t\tcustomEvent: this.hasAttributes(element, ['data-onscroll-call']) ? attrs.onscrollCall : null,\n\t\t})\n\n\t\tconst warnings = [\n\t\t\t{\n\t\t\t\tcondition: this.hasAttributes(element, ['data-onscroll-offset']) && hasSpeed,\n\t\t\t\tmessage: '`offset` and `speed` should not be used together',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcondition:\n\t\t\t\t\thasPreset &&\n\t\t\t\t\t(this.hasAttributes(element, ['data-onscroll-start']) ||\n\t\t\t\t\t\tthis.hasAttributes(element, ['data-onscroll-end'])),\n\t\t\t\tmessage: '`preset` should not be used in conjunction with `start` or `end` settings',\n\t\t\t},\n\t\t\t{ condition: hasSticky && hasSpeed, message: '`sticky` should not be used in conjunction with `speed`' },\n\t\t\t{\n\t\t\t\tcondition:\n\t\t\t\t\thasSticky &&\n\t\t\t\t\tthis.hasAttributes(element, ['data-onscroll-offset']) &&\n\t\t\t\t\tthis.hasAttributes(element, ['data-onscroll-end']),\n\t\t\t\tmessage: 'Your bottom `offset` will be ignored due to custom `end` on the `sticky` element',\n\t\t\t},\n\t\t\t{\n\t\t\t\tcondition:\n\t\t\t\t\thasReverse &&\n\t\t\t\t\t(!this.hasAttributes(element, ['data-onscroll-auto']) ||\n\t\t\t\t\t\tthis.hasAttributes(element, ['data-onscroll-offset']) ||\n\t\t\t\t\t\thasSticky ||\n\t\t\t\t\t\thasSpeed),\n\t\t\t\tmessage:\n\t\t\t\t\t'`reverse` is not compatible with `offset`, `speed` or `sticky` and should only be used in conjunction with `auto`',\n\t\t\t},\n\t\t\t{ condition: hasSpeed && hasPreset, message: '`preset` has no effect in conjunction with `speed` setting' },\n\t\t\t{\n\t\t\t\tcondition: this.getDirection(element) === 'x' && hasPreset,\n\t\t\t\tmessage: '`preset` has no effect in conjunction with `x` direction',\n\t\t\t},\n\t\t]\n\n\t\twarnings.forEach((warning) => warning.condition && console.warn(warning.message))\n\t\tconsole.groupEnd()\n\t}\n\n\t// Fetch a trigger\n\tfetch(elementOrIndex) {\n\t\tif (typeof elementOrIndex === 'number') {\n\t\t\t// Treat argument as an index\n\t\t\tconst keys = Array.from(this.triggers.keys())\n\t\t\treturn keys[elementOrIndex]\n\t\t} else {\n\t\t\t// Assume argument is a DOM element\n\t\t\tlet trigger = null\n\t\t\tthis.triggers.forEach((value, key) => {\n\t\t\t\tif (value.element === elementOrIndex) {\n\t\t\t\t\ttrigger = key\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn trigger\n\t\t}\n\t}\n\n\t// Refresh ScrollTrigger instances\n\trefresh() {\n\t\tthis._ScrollTrigger.refresh()\n\n\t\t// Emit event after refresh is done\n\t\tthis.emit('refresh')\n\t}\n\n\t// Restart the animations and reinitialize the ScrollTrigger instances\n\trestart() {\n\t\t// Stop the current animations and remove ScrollTriggers\n\t\tthis.stop()\n\n\t\t// Kill all existing ScrollTrigger instances\n\t\tthis._ScrollTrigger.getAll().forEach((trigger) => trigger.kill())\n\n\t\t// Refresh ScrollTrigger\n\t\tthis._ScrollTrigger.refresh()\n\n\t\t// Reapply animations and initialize ScrollTrigger\n\t\tthis.init()\n\n\t\t// Emit event after restart is done\n\t\tthis.emit('restart')\n\t}\n\n\t// Stop animations and ScrollTriggers\n\tstop(target = null) {\n\t\tif (target) {\n\t\t\t// Stop animation and remove the ScrollTrigger for a specific target\n\t\t\tconst animationData = this.triggers.get(target)\n\t\t\tif (animationData) {\n\t\t\t\tanimationData.gsapAnimation.kill()\n\t\t\t\tthis.triggers.delete(target)\n\t\t\t}\n\t\t} else {\n\t\t\t// Stop all animations and clear the ScrollTrigger instances\n\t\t\tthis.triggers.forEach(({ gsapAnimation }) => {\n\t\t\t\tgsapAnimation.kill()\n\t\t\t})\n\t\t\tthis.triggers.clear()\n\t\t}\n\n\t\t// Emit event after stop is done\n\t\tthis.emit('stop', target)\n\t}\n\n\t// Update animation for a specific target with new fromProperties and toProperties\n\tupdate(target, fromProperties, toProperties) {\n\t\tconst animationData = this.triggers.get(target)\n\n\t\tif (animationData) {\n\t\t\t// Stop the existing animation\n\t\t\tanimationData.gsapAnimation.kill()\n\n\t\t\t// Reinitialize the animation with updated properties\n\t\t\tconst gsapAnimation = this._gsap.fromTo(animationData.element, fromProperties, toProperties)\n\n\t\t\t// Create new ScrollTrigger for the updated animation\n\t\t\tconst trigger = this._ScrollTrigger.create({\n\t\t\t\tanimation: gsapAnimation,\n\t\t\t\ttrigger: this.getTrigger(animationData.element),\n\t\t\t\tstart: this.getStart(animationData.element),\n\t\t\t\tend: this.getEnd(animationData.element),\n\t\t\t\tscrub: this.getScrub(animationData.element),\n\t\t\t})\n\n\t\t\t// Save the updated animation data\n\t\t\tthis.triggers.set(target, {\n\t\t\t\t...animationData,\n\t\t\t\tfromProperties,\n\t\t\t\ttoProperties,\n\t\t\t\tgsapAnimation,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\t// Destroy the OnscrollDetection instance\n\tdestroy() {\n\t\t// Stop all animations and clear the ScrollTrigger instances\n\t\tthis.stop()\n\t\tthis.triggers = null\n\t}\n}\n\nwindow.OnscrollDetection = OnscrollDetection;"],"names":["OnscrollDetection","constructor","options","gsap","ScrollTrigger","this","_gsap","_ScrollTrigger","elements","screen","triggers","Map","debug","endPosition","end","startPosition","start","scrollingClass","scrolledClass","stickyClass","stuckClass","eventHandlers","autoStart","undefined","init","register","utils","toArray","forEach","element","index","trigger","getTrigger","getScreen","matchMedia","fromProperties","getFromProperties","startAt","backgroundColor","immediateRender","toProperties","getToProperties","add","gsapAnimation","fromTo","set","scrollTrigger","debugMode","error","console","log","on","event","handler","push","emit","args","hasAttributes","hasAttribute","parentElement","document","querySelector","dataset","onscrollTrigger","onscrollScreen","animateFrom","getAnimateFrom","offset","getOffsetAndDistance","_extends","bottom","top","x","getDirection","y","animateTo","getAnimateTo","stickyProperties","getStickyProperties","isSticky","customEventName","getAttribute","progressEventName","dispatchCustomEvent","when","direction","window","dispatchEvent","CustomEvent","detail","target","getX","getY","ease","getStart","getEnd","invalidateOnRefresh","pin","pinSpacing","scrub","getScrub","markers","onUpdate","self","progress","toFixed","style","setProperty","dispatchProgressEvent","onToggle","isActive","onEnter","classList","onLeave","remove","onEnterBack","onLeaveBack","attrs","every","attr","JSON","parse","onscrollFrom","onscrollTo","getOffset","parseInt","onscrollOffset","onscrollDirection","getDistanceOrSpeed","distance","triggerHeight","offsetHeight","offsetValue","distanceValue","split","trim","endsWith","parseFloat","viewportHeight","innerHeight","scrollSpeed","onscrollSpeed","additionalDistance","includes","speed","percentage","map","triggerElement","autoDistance","Math","abs","onscrollDelay","stickyOffset","onscrollStart","positionElement","onscrollEnd","clientHeight","scrollDistance","speedMultiplier","speedViewportPercentage","speedValues","isNaN","hasSpeed","hasPreset","hasSticky","hasReverse","group","triggerStart","triggerEnd","auto","offsetBefore","offsetAfter","delay","preset","reverse","sticky","customEvent","onscrollCall","condition","message","warning","warn","groupEnd","fetch","elementOrIndex","Array","from","keys","value","key","refresh","restart","stop","getAll","kill","animationData","get","delete","clear","update","create","animation","destroy"],"mappings":"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"}