{"version":3,"sources":["webpack://ScrollBooster/webpack/universalModuleDefinition","webpack://ScrollBooster/webpack/bootstrap","webpack://ScrollBooster/./src/index.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","getFullHeight","elem","Math","max","offsetHeight","scrollHeight","ScrollBooster","options","defaults","content","viewport","children","direction","pointerMode","scrollMode","undefined","bounce","bounceForce","friction","textSelection","inputsFocus","emulateScroll","pointerDownPreventDefault","onClick","onUpdate","shouldScroll","props","Element","isDragging","isTargetScroll","isScrolling","isRunning","START_COORDINATES","x","y","position","velocity","dragStartPosition","dragOffset","dragPosition","targetPosition","scrollOffset","rafID","events","updateMetrics","handleEvents","console","error","getState","startAnimationLoop","width","clientWidth","height","clientHeight","offsetWidth","scrollWidth","edgeX","from","min","to","edgeY","cancelAnimationFrame","requestAnimationFrame","animate","updateScrollPosition","isMoving","state","setContentPosition","applyEdgeForce","applyDragForce","applyScrollForce","applyTargetForce","inverseFriction","force","beyondXFrom","beyondXTo","beyondYFrom","beyondYTo","beyondX","beyondY","edge","distanceToEdge","restPosition","applyForce","dragVelocity","abs","borderCollision","left","right","top","bottom","style","transform","scrollTop","scrollLeft","dragOrigin","wheelTimer","isTouch","setDragPosition","event","pageX","touches","pageY","pointerdown","eventData","clientX","clientY","rect","getBoundingClientRect","clientLeft","clientTop","button","indexOf","target","nodeName","toLowerCase","element","nodes","childNodes","range","document","createRange","length","node","nodeType","selectNodeContents","textNodeFromPoint","selection","window","getSelection","removeAllRanges","empty","preventDefault","pointermove","pointerup","wheel","deltaX","deltaY","clearTimeout","setTimeout","scroll","click","dragOffsetX","dragOffsetY","stopPropagation","contentLoad","resize","addEventListener","removeEventListener"],"mappings":"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","file":"scrollbooster.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"ScrollBooster\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ScrollBooster\"] = factory();\n\telse\n\t\troot[\"ScrollBooster\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","const getFullWidth = (elem) => Math.max(elem.offsetWidth, elem.scrollWidth);\nconst getFullHeight = (elem) => Math.max(elem.offsetHeight, elem.scrollHeight);\n\nconst textNodeFromPoint = (element, x, y) => {\n const nodes = element.childNodes;\n const range = document.createRange();\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node.nodeType !== 3) {\n continue;\n }\n range.selectNodeContents(node);\n const rect = range.getBoundingClientRect();\n if (x >= rect.left && y >= rect.top && x <= rect.right && y <= rect.bottom) {\n return node;\n }\n }\n return false;\n};\n\nconst clearTextSelection = () => {\n const selection = window.getSelection ? window.getSelection() : document.selection;\n if (!selection) {\n return;\n }\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n};\n\nconst CLICK_EVENT_THRESHOLD_PX = 5;\n\nexport default class ScrollBooster {\n /**\n * Create ScrollBooster instance\n * @param {Object} options - options object\n * @param {Element} options.viewport - container element\n * @param {Element} options.content - scrollable content element\n * @param {String} options.direction - scroll direction\n * @param {String} options.pointerMode - mouse or touch support\n * @param {String} options.scrollMode - predefined scrolling technique\n * @param {Boolean} options.bounce - bounce effect\n * @param {Number} options.bounceForce - bounce effect factor\n * @param {Number} options.friction - scroll friction factor\n * @param {Boolean} options.textSelection - enables text selection\n * @param {Boolean} options.inputsFocus - enables focus on input elements\n * @param {Boolean} options.emulateScroll - enables mousewheel emulation\n * @param {Function} options.onClick - click handler\n * @param {Function} options.onUpdate - state update handler\n * @param {Function} options.shouldScroll - predicate to allow or disable scroll\n */\n constructor(options = {}) {\n const defaults = {\n content: options.viewport.children[0],\n direction: 'all', // 'vertical', 'horizontal'\n pointerMode: 'all', // 'touch', 'mouse'\n scrollMode: undefined, // 'transform', 'native'\n bounce: true,\n bounceForce: 0.1,\n friction: 0.05,\n textSelection: false,\n inputsFocus: true,\n emulateScroll: false,\n pointerDownPreventDefault: true,\n onClick() {},\n onUpdate() {},\n shouldScroll() {\n return true;\n },\n };\n\n this.props = { ...defaults, ...options };\n\n if (!this.props.viewport || !(this.props.viewport instanceof Element)) {\n console.error(`ScrollBooster init error: \"viewport\" config property must be present and must be Element`);\n return;\n }\n\n if (!this.props.content) {\n console.error(`ScrollBooster init error: Viewport does not have any content`);\n return;\n }\n\n this.isDragging = false;\n this.isTargetScroll = false;\n this.isScrolling = false;\n this.isRunning = false;\n\n const START_COORDINATES = { x: 0, y: 0 };\n\n this.position = { ...START_COORDINATES };\n this.velocity = { ...START_COORDINATES };\n this.dragStartPosition = { ...START_COORDINATES };\n this.dragOffset = { ...START_COORDINATES };\n this.dragPosition = { ...START_COORDINATES };\n this.targetPosition = { ...START_COORDINATES };\n this.scrollOffset = { ...START_COORDINATES };\n\n this.rafID = null;\n this.events = {};\n\n this.updateMetrics();\n this.handleEvents();\n }\n\n /**\n * Update options object with new given values\n */\n updateOptions(options = {}) {\n this.props = { ...this.props, ...options };\n this.props.onUpdate(this.getState());\n this.startAnimationLoop();\n }\n\n /**\n * Update DOM container elements metrics (width and height)\n */\n updateMetrics() {\n this.viewport = {\n width: this.props.viewport.clientWidth,\n height: this.props.viewport.clientHeight,\n };\n this.content = {\n width: getFullWidth(this.props.content),\n height: getFullHeight(this.props.content),\n };\n this.edgeX = {\n from: Math.min(-this.content.width + this.viewport.width, 0),\n to: 0,\n };\n this.edgeY = {\n from: Math.min(-this.content.height + this.viewport.height, 0),\n to: 0,\n };\n\n this.props.onUpdate(this.getState());\n this.startAnimationLoop();\n }\n\n /**\n * Run animation loop\n */\n startAnimationLoop() {\n this.isRunning = true;\n cancelAnimationFrame(this.rafID);\n this.rafID = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Main animation loop\n */\n animate() {\n if (!this.isRunning) {\n return;\n }\n this.updateScrollPosition();\n // stop animation loop if nothing moves\n if (!this.isMoving()) {\n this.isRunning = false;\n this.isTargetScroll = false;\n }\n const state = this.getState();\n this.setContentPosition(state);\n this.props.onUpdate(state);\n this.rafID = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Calculate and set new scroll position\n */\n updateScrollPosition() {\n this.applyEdgeForce();\n this.applyDragForce();\n this.applyScrollForce();\n this.applyTargetForce();\n\n const inverseFriction = 1 - this.props.friction;\n this.velocity.x *= inverseFriction;\n this.velocity.y *= inverseFriction;\n\n if (this.props.direction !== 'vertical') {\n this.position.x += this.velocity.x;\n }\n if (this.props.direction !== 'horizontal') {\n this.position.y += this.velocity.y;\n }\n\n // disable bounce effect\n if ((!this.props.bounce || this.isScrolling) && !this.isTargetScroll) {\n this.position.x = Math.max(Math.min(this.position.x, this.edgeX.to), this.edgeX.from);\n this.position.y = Math.max(Math.min(this.position.y, this.edgeY.to), this.edgeY.from);\n }\n }\n\n /**\n * Increase general scroll velocity by given force amount\n */\n applyForce(force) {\n this.velocity.x += force.x;\n this.velocity.y += force.y;\n }\n\n /**\n * Apply force for bounce effect\n */\n applyEdgeForce() {\n if (!this.props.bounce || this.isDragging) {\n return;\n }\n\n // scrolled past viewport edges\n const beyondXFrom = this.position.x < this.edgeX.from;\n const beyondXTo = this.position.x > this.edgeX.to;\n const beyondYFrom = this.position.y < this.edgeY.from;\n const beyondYTo = this.position.y > this.edgeY.to;\n const beyondX = beyondXFrom || beyondXTo;\n const beyondY = beyondYFrom || beyondYTo;\n\n if (!beyondX && !beyondY) {\n return;\n }\n\n const edge = {\n x: beyondXFrom ? this.edgeX.from : this.edgeX.to,\n y: beyondYFrom ? this.edgeY.from : this.edgeY.to,\n };\n\n const distanceToEdge = {\n x: edge.x - this.position.x,\n y: edge.y - this.position.y,\n };\n\n const force = {\n x: distanceToEdge.x * this.props.bounceForce,\n y: distanceToEdge.y * this.props.bounceForce,\n };\n\n const restPosition = {\n x: this.position.x + (this.velocity.x + force.x) / this.props.friction,\n y: this.position.y + (this.velocity.y + force.y) / this.props.friction,\n };\n\n if ((beyondXFrom && restPosition.x >= this.edgeX.from) || (beyondXTo && restPosition.x <= this.edgeX.to)) {\n force.x = distanceToEdge.x * this.props.bounceForce - this.velocity.x;\n }\n\n if ((beyondYFrom && restPosition.y >= this.edgeY.from) || (beyondYTo && restPosition.y <= this.edgeY.to)) {\n force.y = distanceToEdge.y * this.props.bounceForce - this.velocity.y;\n }\n\n this.applyForce({\n x: beyondX ? force.x : 0,\n y: beyondY ? force.y : 0,\n });\n }\n\n /**\n * Apply force to move content while dragging with mouse/touch\n */\n applyDragForce() {\n if (!this.isDragging) {\n return;\n }\n\n const dragVelocity = {\n x: this.dragPosition.x - this.position.x,\n y: this.dragPosition.y - this.position.y,\n };\n\n this.applyForce({\n x: dragVelocity.x - this.velocity.x,\n y: dragVelocity.y - this.velocity.y,\n });\n }\n\n /**\n * Apply force to emulate mouse wheel or trackpad\n */\n applyScrollForce() {\n if (!this.isScrolling) {\n return;\n }\n\n this.applyForce({\n x: this.scrollOffset.x - this.velocity.x,\n y: this.scrollOffset.y - this.velocity.y,\n });\n\n this.scrollOffset.x = 0;\n this.scrollOffset.y = 0;\n }\n\n /**\n * Apply force to scroll to given target coordinate\n */\n applyTargetForce() {\n if (!this.isTargetScroll) {\n return;\n }\n\n this.applyForce({\n x: (this.targetPosition.x - this.position.x) * 0.08 - this.velocity.x,\n y: (this.targetPosition.y - this.position.y) * 0.08 - this.velocity.y,\n });\n }\n\n /**\n * Check if scrolling happening\n */\n isMoving() {\n return (\n this.isDragging ||\n this.isScrolling ||\n Math.abs(this.velocity.x) >= 0.01 ||\n Math.abs(this.velocity.y) >= 0.01\n );\n }\n\n /**\n * Set scroll target coordinate for smooth scroll\n */\n scrollTo(position = {}) {\n this.isTargetScroll = true;\n this.targetPosition.x = -position.x || 0;\n this.targetPosition.y = -position.y || 0;\n this.startAnimationLoop();\n }\n\n /**\n * Manual position setting\n */\n setPosition(position = {}) {\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.position.x = -position.x || 0;\n this.position.y = -position.y || 0;\n this.startAnimationLoop();\n }\n\n /**\n * Get latest metrics and coordinates\n */\n getState() {\n return {\n isMoving: this.isMoving(),\n isDragging: !!(this.dragOffset.x || this.dragOffset.y),\n position: { x: -this.position.x, y: -this.position.y },\n dragOffset: this.dragOffset,\n borderCollision: {\n left: this.position.x >= this.edgeX.to,\n right: this.position.x <= this.edgeX.from,\n top: this.position.y >= this.edgeY.to,\n bottom: this.position.y <= this.edgeY.from,\n },\n };\n }\n\n /**\n * Update DOM container elements metrics (width and height)\n */\n setContentPosition(state) {\n if (this.props.scrollMode === 'transform') {\n this.props.content.style.transform = `translate(${-state.position.x}px, ${-state.position.y}px)`;\n }\n if (this.props.scrollMode === 'native') {\n this.props.viewport.scrollTop = state.position.y;\n this.props.viewport.scrollLeft = state.position.x;\n }\n }\n\n /**\n * Register all DOM events\n */\n handleEvents() {\n const dragOrigin = { x: 0, y: 0 };\n let wheelTimer = null;\n let isTouch = false;\n\n const setDragPosition = (event) => {\n if (!this.isDragging) {\n return;\n }\n\n const pageX = isTouch ? event.touches[0].pageX : event.pageX;\n const pageY = isTouch ? event.touches[0].pageY : event.pageY;\n\n this.dragOffset.x = pageX - dragOrigin.x;\n this.dragOffset.y = pageY - dragOrigin.y;\n\n this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n };\n\n this.events.pointerdown = (event) => {\n isTouch = !!(event.touches && event.touches[0]);\n\n const eventData = isTouch ? event.touches[0] : event;\n const { pageX, pageY, clientX, clientY } = eventData;\n\n const { viewport } = this.props;\n const rect = viewport.getBoundingClientRect();\n\n // click on vertical scrollbar\n if (clientX - rect.left >= viewport.clientLeft + viewport.clientWidth) {\n return;\n }\n\n // click on horizontal scrollbar\n if (clientY - rect.top >= viewport.clientTop + viewport.clientHeight) {\n return;\n }\n\n // interaction disabled by user\n if (!this.props.shouldScroll(this.getState(), event)) {\n return;\n }\n\n // disable right mouse button scroll\n if (event.button === 2) {\n return;\n }\n\n // disable on mobile\n if (this.props.pointerMode === 'mouse' && isTouch) {\n return;\n }\n\n // disable on desktop\n if (this.props.pointerMode === 'touch' && !isTouch) {\n return;\n }\n\n // focus on form input elements\n const formNodes = ['input', 'textarea', 'button', 'select', 'label'];\n if (this.props.inputsFocus && formNodes.indexOf(event.target.nodeName.toLowerCase()) > -1) {\n return;\n }\n\n // handle text selection\n if (this.props.textSelection) {\n const textNode = textNodeFromPoint(event.target, clientX, clientY);\n if (textNode) {\n return;\n }\n clearTextSelection();\n }\n\n this.isDragging = true;\n\n dragOrigin.x = pageX;\n dragOrigin.y = pageY;\n this.dragStartPosition.x = this.position.x;\n this.dragStartPosition.y = this.position.y;\n\n setDragPosition(event);\n this.startAnimationLoop();\n if (this.props.pointerDownPreventDefault) {\n event.preventDefault();\n }\n };\n\n this.events.pointermove = (event) => {\n setDragPosition(event);\n };\n\n this.events.pointerup = () => {\n this.isDragging = false;\n };\n\n this.events.wheel = (event) => {\n if (!this.props.emulateScroll) {\n return;\n }\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.isScrolling = true;\n\n this.scrollOffset.x = -event.deltaX;\n this.scrollOffset.y = -event.deltaY;\n\n this.startAnimationLoop();\n\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(() => (this.isScrolling = false), 80);\n event.preventDefault();\n };\n\n this.events.scroll = () => {\n const { scrollLeft, scrollTop } = this.props.viewport;\n if (Math.abs(this.position.x + scrollLeft) > 3) {\n this.position.x = -scrollLeft;\n this.velocity.x = 0;\n }\n if (Math.abs(this.position.y + scrollTop) > 3) {\n this.position.y = -scrollTop;\n this.velocity.y = 0;\n }\n };\n\n this.events.click = (event) => {\n const state = this.getState();\n const dragOffsetX = this.props.direction !== 'vertical' ? state.dragOffset.x : 0;\n const dragOffsetY = this.props.direction !== 'horizontal' ? state.dragOffset.y : 0;\n if (Math.max(Math.abs(dragOffsetX), Math.abs(dragOffsetY)) > CLICK_EVENT_THRESHOLD_PX) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.props.onClick(state, event);\n };\n\n this.events.contentLoad = () => this.updateMetrics();\n this.events.resize = () => this.updateMetrics();\n\n this.props.viewport.addEventListener('mousedown', this.events.pointerdown);\n this.props.viewport.addEventListener('touchstart', this.events.pointerdown);\n this.props.viewport.addEventListener('click', this.events.click);\n this.props.viewport.addEventListener('wheel', this.events.wheel);\n this.props.viewport.addEventListener('scroll', this.events.scroll);\n this.props.content.addEventListener('load', this.events.contentLoad, true);\n window.addEventListener('mousemove', this.events.pointermove);\n window.addEventListener('touchmove', this.events.pointermove);\n window.addEventListener('mouseup', this.events.pointerup);\n window.addEventListener('touchend', this.events.pointerup);\n window.addEventListener('resize', this.events.resize);\n }\n\n /**\n * Unregister all DOM events\n */\n destroy() {\n this.props.viewport.removeEventListener('mousedown', this.events.pointerdown);\n this.props.viewport.removeEventListener('touchstart', this.events.pointerdown);\n this.props.viewport.removeEventListener('click', this.events.click);\n this.props.viewport.removeEventListener('wheel', this.events.wheel);\n this.props.viewport.removeEventListener('scroll', this.events.scroll);\n this.props.content.removeEventListener('load', this.events.contentLoad);\n window.removeEventListener('mousemove', this.events.pointermove);\n window.removeEventListener('touchmove', this.events.pointermove);\n window.removeEventListener('mouseup', this.events.pointerup);\n window.removeEventListener('touchend', this.events.pointerup);\n window.removeEventListener('resize', this.events.resize);\n }\n}\n"],"sourceRoot":""}