{"version":3,"file":"smooth-scroll-polyfill.min.js","sources":["https:\/\/www.feeacademy.global\/theme\/norse\/amd\/src\/smooth-scroll-polyfill.js"],"sourcesContent":["\/**\n * Polyfill implementation for smooth page scrolling.\n *\n * This module only wraps the code taken from here - https:\/\/github.com\/iamdustan\/smoothscroll\/blob\/master\/src\/smoothscroll.js -\n * to make the code be importable in other modules.\n *\n * @module theme_norse\/smooth-scroll-polyfill\n * @copyright 2023 Titus Learning\n * @author Vitaly Potenko \n *\/\n\nconst init = () => {\n\n \/\/ aliases\n var w = window;\n var d = document;\n\n \/\/ globals\n var Element = w.HTMLElement || w.Element;\n var SCROLL_TIME = 468;\n\n \/\/ object gathering original scroll methods\n var original = {\n scroll: w.scroll || w.scrollTo,\n scrollBy: w.scrollBy,\n elementScroll: Element.prototype.scroll || scrollElement,\n scrollIntoView: Element.prototype.scrollIntoView\n };\n\n \/\/ define timing method\n var now =\n w.performance && w.performance.now\n ? w.performance.now.bind(w.performance)\n : Date.now;\n\n \/**\n * indicates if a the current browser is made by Microsoft\n * @method isMicrosoftBrowser\n * @param {String} userAgent\n * @returns {Boolean}\n *\/\n function isMicrosoftBrowser(userAgent) {\n var userAgentPatterns = ['MSIE ', 'Trident\/', 'Edge\/'];\n\n return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n }\n\n \/*\n * IE has rounding bug rounding down clientHeight and clientWidth and\n * rounding up scrollHeight and scrollWidth causing false positives\n * on hasScrollableSpace\n *\/\n var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n \/**\n * changes scroll position inside an element\n * @method scrollElement\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n *\/\n function scrollElement(x, y) {\n this.scrollLeft = x;\n this.scrollTop = y;\n }\n\n \/**\n * returns result of applying ease math function to a number\n * @method ease\n * @param {Number} k\n * @returns {Number}\n *\/\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n\n \/**\n * indicates if a smooth behavior should be applied\n * @method shouldBailOut\n * @param {Number|Object} firstArg\n * @returns {Boolean}\n *\/\n function shouldBailOut(firstArg) {\n if (\n firstArg === null ||\n typeof firstArg !== 'object' ||\n firstArg.behavior === undefined ||\n firstArg.behavior === 'auto' ||\n firstArg.behavior === 'instant'\n ) {\n \/\/ first argument is not an object\/null\n \/\/ or behavior is auto, instant or undefined\n return true;\n }\n\n if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n \/\/ first argument is an object and behavior is smooth\n return false;\n }\n\n \/\/ throw error when behavior is not supported\n throw new TypeError(\n 'behavior member of ScrollOptions ' +\n firstArg.behavior +\n ' is not a valid value for enumeration ScrollBehavior.'\n );\n }\n\n \/**\n * indicates if an element has scrollable space in the provided axis\n * @method hasScrollableSpace\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n *\/\n function hasScrollableSpace(el, axis) {\n if (axis === 'Y') {\n return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n }\n\n if (axis === 'X') {\n return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n }\n }\n\n \/**\n * indicates if an element has a scrollable overflow property in the axis\n * @method canOverflow\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n *\/\n function canOverflow(el, axis) {\n var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n\n return overflowValue === 'auto' || overflowValue === 'scroll';\n }\n\n \/**\n * indicates if an element can be scrolled in either axis\n * @method isScrollable\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n *\/\n function isScrollable(el) {\n var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n\n return isScrollableY || isScrollableX;\n }\n\n \/**\n * finds scrollable parent of an element\n * @method findScrollableParent\n * @param {Node} el\n * @returns {Node} el\n *\/\n function findScrollableParent(el) {\n while (el !== d.body && isScrollable(el) === false) {\n el = el.parentNode || el.host;\n }\n\n return el;\n }\n\n \/**\n * self invoked function that, given a context, steps through scrolling\n * @method step\n * @param {Object} context\n * @returns {undefined}\n *\/\n function step(context) {\n var time = now();\n var value;\n var currentX;\n var currentY;\n var elapsed = (time - context.startTime) \/ SCROLL_TIME;\n\n \/\/ avoid elapsed times higher than one\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n \/\/ apply easing to elapsed time\n value = ease(elapsed);\n\n currentX = context.startX + (context.x - context.startX) * value;\n currentY = context.startY + (context.y - context.startY) * value;\n\n context.method.call(context.scrollable, currentX, currentY);\n\n \/\/ scroll more if we have not reached our destination\n if (currentX !== context.x || currentY !== context.y) {\n w.requestAnimationFrame(step.bind(w, context));\n }\n }\n\n \/**\n * scrolls window or element with a smooth behavior\n * @method smoothScroll\n * @param {Object|Node} el\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n *\/\n function smoothScroll(el, x, y) {\n var scrollable;\n var startX;\n var startY;\n var method;\n var startTime = now();\n\n \/\/ define scroll context\n if (el === d.body) {\n scrollable = w;\n startX = w.scrollX || w.pageXOffset;\n startY = w.scrollY || w.pageYOffset;\n method = original.scroll;\n } else {\n scrollable = el;\n startX = el.scrollLeft;\n startY = el.scrollTop;\n method = scrollElement;\n }\n\n \/\/ scroll looping over a frame\n step({\n scrollable: scrollable,\n method: method,\n startTime: startTime,\n startX: startX,\n startY: startY,\n x: x,\n y: y\n });\n }\n\n \/\/ ORIGINAL METHODS OVERRIDES\n \/\/ w.scroll and w.scrollTo\n w.scroll = w.scrollTo = function() {\n \/\/ avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n \/\/ avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scroll.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object'\n ? arguments[0]\n : w.scrollX || w.pageXOffset,\n \/\/ use top prop, second argument if present or fallback to scrollY\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined\n ? arguments[1]\n : w.scrollY || w.pageYOffset\n );\n\n return;\n }\n\n \/\/ LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : w.scrollX || w.pageXOffset,\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : w.scrollY || w.pageYOffset\n );\n };\n\n \/\/ w.scrollBy\n w.scrollBy = function() {\n \/\/ avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n \/\/ avoid smooth behavior if not required\n if (shouldBailOut(arguments[0])) {\n original.scrollBy.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object' ? arguments[0] : 0,\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined ? arguments[1] : 0\n );\n\n return;\n }\n\n \/\/ LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n );\n };\n\n \/\/ Element.prototype.scroll and Element.prototype.scrollTo\n Element.prototype.scroll = Element.prototype.scrollTo = function() {\n \/\/ avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n \/\/ avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n \/\/ if one number is passed, throw error to match Firefox implementation\n if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n throw new SyntaxError('Value could not be converted');\n }\n\n original.elementScroll.call(\n this,\n \/\/ use left prop, first number argument or fallback to scrollLeft\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n \/\/ use top prop, second argument or fallback to scrollTop\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop\n );\n\n return;\n }\n\n var left = arguments[0].left;\n var top = arguments[0].top;\n\n \/\/ LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n this,\n this,\n typeof left === 'undefined' ? this.scrollLeft : ~~left,\n typeof top === 'undefined' ? this.scrollTop : ~~top\n );\n };\n\n \/\/ Element.prototype.scrollBy\n Element.prototype.scrollBy = function() {\n \/\/ avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n \/\/ avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.elementScroll.call(\n this,\n arguments[0].left !== undefined\n ? ~~arguments[0].left + this.scrollLeft\n : ~~arguments[0] + this.scrollLeft,\n arguments[0].top !== undefined\n ? ~~arguments[0].top + this.scrollTop\n : ~~arguments[1] + this.scrollTop\n );\n\n return;\n }\n\n this.scroll({\n left: ~~arguments[0].left + this.scrollLeft,\n top: ~~arguments[0].top + this.scrollTop,\n behavior: arguments[0].behavior\n });\n };\n\n \/\/ Element.prototype.scrollIntoView\n Element.prototype.scrollIntoView = function() {\n \/\/ avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scrollIntoView.call(\n this,\n arguments[0] === undefined ? true : arguments[0]\n );\n\n return;\n }\n\n \/\/ LET THE SMOOTHNESS BEGIN!\n var scrollableParent = findScrollableParent(this);\n var parentRects = scrollableParent.getBoundingClientRect();\n var clientRects = this.getBoundingClientRect();\n\n if (scrollableParent !== d.body) {\n \/\/ reveal element inside parent\n smoothScroll.call(\n this,\n scrollableParent,\n scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n scrollableParent.scrollTop + clientRects.top - parentRects.top\n );\n\n \/\/ reveal parent in viewport unless is fixed\n if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n w.scrollBy({\n left: parentRects.left,\n top: parentRects.top,\n behavior: 'smooth'\n });\n }\n } else {\n \/\/ reveal element in viewport\n w.scrollBy({\n left: clientRects.left,\n top: clientRects.top,\n behavior: 'smooth'\n });\n }\n };\n};\n\nexport default { init };\n"],"names":["init","w","window","d","document","Element","HTMLElement","original","scroll","scrollTo","scrollBy","elementScroll","prototype","scrollElement","scrollIntoView","now","performance","bind","Date","userAgent","ROUNDING_TOLERANCE","navigator","RegExp","join","test","x","y","scrollLeft","scrollTop","shouldBailOut","firstArg","undefined","behavior","TypeError","hasScrollableSpace","el","axis","clientHeight","scrollHeight","clientWidth","scrollWidth","canOverflow","overflowValue","getComputedStyle","isScrollable","isScrollableY","isScrollableX","findScrollableParent","body","parentNode","host","step","context","value","currentX","currentY","k","elapsed","startTime","Math","cos","PI","startX","startY","method","call","scrollable","requestAnimationFrame","smoothScroll","scrollX","pageXOffset","scrollY","pageYOffset","arguments","left","top","this","SyntaxError","scrollableParent","parentRects","getBoundingClientRect","clientRects","position"],"mappings":"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\/B,qBAAqB6B,MACxCG,YAAcD,iBAAiBE,wBAC\/BC,YAAcL,KAAKI,wBAEnBF,mBAAqB3E,EAAE6C,MAEvBoB,aAAaH,KACTW,KACAE,iBACAA,iBAAiBnD,WAAasD,YAAYP,KAAOK,YAAYL,KAC7DI,iBAAiBlD,UAAYqD,YAAYN,IAAMI,YAAYJ,KAIT,UAAlD1E,EAAE0C,iBAAiBmC,kBAAkBI,UACrCjF,EAAES,SAAS,CACPgE,KAAMK,YAAYL,KAClBC,IAAKI,YAAYJ,IACjB3C,SAAU,YAKlB\/B,EAAES,SAAS,CACPgE,KAAMO,YAAYP,KAClBC,IAAKM,YAAYN,IACjB3C,SAAU,gBAnCdzB,SAASO,eAAemD,KACpBW,UACiB7C,IAAjB0C,UAAU,IAA0BA,UAAU"}