Designer/js/plugins/locomotive-scroll.js

5028 lines
181 KiB
JavaScript
Raw Permalink Normal View History

2024-09-11 06:56:02 +00:00
/* locomotive-scroll v4.1.1 | MIT License | https://github.com/locomotivemtl/locomotive-scroll */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.LocomotiveScroll = factory());
}(this, (function () { 'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
}
return target;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (typeof call === "object" || typeof call === "function")) {
return call;
}
return _assertThisInitialized(self);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct();
return function _createSuperInternal() {
var Super = _getPrototypeOf(Derived),
result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
}
function _get(target, property, receiver) {
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get;
} else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(receiver);
}
return desc.value;
};
}
return _get(target, property, receiver || target);
}
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
}
function _iterableToArrayLimit(arr, i) {
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var defaults = {
el: document,
name: 'scroll',
offset: [0, 0],
repeat: false,
smooth: false,
initPosition: {
x: 0,
y: 0
},
direction: 'vertical',
gestureDirection: 'vertical',
reloadOnContextChange: false,
lerp: 0.1,
"class": 'trm-active-el',
scrollbarContainer: false,
scrollbarClass: 'c-scrollbar',
scrollingClass: 'has-scroll-scrolling',
draggingClass: 'has-scroll-dragging',
smoothClass: 'has-scroll-smooth',
initClass: 'has-scroll-init',
getSpeed: false,
getDirection: false,
scrollFromAnywhere: false,
multiplier: 1,
firefoxMultiplier: 50,
touchMultiplier: 2,
resetNativeScroll: true,
tablet: {
smooth: false,
direction: 'vertical',
gestureDirection: 'vertical',
breakpoint: 1024
},
smartphone: {
smooth: false,
direction: 'vertical',
gestureDirection: 'vertical'
}
};
var _default = /*#__PURE__*/function () {
function _default() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, _default);
Object.assign(this, defaults, options);
this.smartphone = defaults.smartphone;
if (options.smartphone) Object.assign(this.smartphone, options.smartphone);
this.tablet = defaults.tablet;
if (options.tablet) Object.assign(this.tablet, options.tablet);
this.namespace = 'locomotive';
this.html = document.documentElement;
this.windowHeight = window.innerHeight;
this.windowWidth = window.innerWidth;
this.windowMiddle = {
x: this.windowWidth / 2,
y: this.windowHeight / 2
};
this.els = {};
this.currentElements = {};
this.listeners = {};
this.hasScrollTicking = false;
this.hasCallEventSet = false;
this.checkScroll = this.checkScroll.bind(this);
this.checkResize = this.checkResize.bind(this);
this.checkEvent = this.checkEvent.bind(this);
this.instance = {
scroll: {
x: 0,
y: 0
},
limit: {
x: this.html.offsetWidth,
y: this.html.offsetHeight
},
currentElements: this.currentElements
};
if (this.isMobile) {
if (this.isTablet) {
this.context = 'tablet';
} else {
this.context = 'smartphone';
}
} else {
this.context = 'desktop';
}
if (this.isMobile) this.direction = this[this.context].direction;
if (this.direction === 'horizontal') {
this.directionAxis = 'x';
} else {
this.directionAxis = 'y';
}
if (this.getDirection) {
this.instance.direction = null;
}
if (this.getDirection) {
this.instance.speed = 0;
}
this.html.classList.add(this.initClass);
window.addEventListener('resize', this.checkResize, false);
}
_createClass(_default, [{
key: "init",
value: function init() {
this.initEvents();
}
}, {
key: "checkScroll",
value: function checkScroll() {
this.dispatchScroll();
}
}, {
key: "checkResize",
value: function checkResize() {
var _this = this;
if (!this.resizeTick) {
this.resizeTick = true;
requestAnimationFrame(function () {
_this.resize();
_this.resizeTick = false;
});
}
}
}, {
key: "resize",
value: function resize() {}
}, {
key: "checkContext",
value: function checkContext() {
if (!this.reloadOnContextChange) return;
this.isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 || this.windowWidth < this.tablet.breakpoint;
this.isTablet = this.isMobile && this.windowWidth >= this.tablet.breakpoint;
var oldContext = this.context;
if (this.isMobile) {
if (this.isTablet) {
this.context = 'tablet';
} else {
this.context = 'smartphone';
}
} else {
this.context = 'desktop';
}
if (oldContext != this.context) {
var oldSmooth = oldContext == 'desktop' ? this.smooth : this[oldContext].smooth;
var newSmooth = this.context == 'desktop' ? this.smooth : this[this.context].smooth;
if (oldSmooth != newSmooth) window.location.reload();
}
}
}, {
key: "initEvents",
value: function initEvents() {
var _this2 = this;
this.scrollToEls = this.el.querySelectorAll("[data-".concat(this.name, "-to]"));
this.setScrollTo = this.setScrollTo.bind(this);
this.scrollToEls.forEach(function (el) {
el.addEventListener('click', _this2.setScrollTo, false);
});
}
}, {
key: "setScrollTo",
value: function setScrollTo(event) {
event.preventDefault();
this.scrollTo(event.currentTarget.getAttribute("data-".concat(this.name, "-href")) || event.currentTarget.getAttribute('href'), {
offset: event.currentTarget.getAttribute("data-".concat(this.name, "-offset"))
});
}
}, {
key: "addElements",
value: function addElements() {}
}, {
key: "detectElements",
value: function detectElements(hasCallEventSet) {
var _this3 = this;
var scrollTop = this.instance.scroll.y;
var scrollBottom = scrollTop + this.windowHeight;
var scrollLeft = this.instance.scroll.x;
var scrollRight = scrollLeft + this.windowWidth;
Object.entries(this.els).forEach(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
i = _ref2[0],
el = _ref2[1];
if (el && (!el.inView || hasCallEventSet)) {
if (_this3.direction === 'horizontal') {
if (scrollRight >= el.left && scrollLeft < el.right) {
_this3.setInView(el, i);
}
} else {
if (scrollBottom >= el.top && scrollTop < el.bottom) {
_this3.setInView(el, i);
}
}
}
if (el && el.inView) {
if (_this3.direction === 'horizontal') {
var width = el.right - el.left;
el.progress = (_this3.instance.scroll.x - (el.left - _this3.windowWidth)) / (width + _this3.windowWidth);
if (scrollRight < el.left || scrollLeft > el.right) {
_this3.setOutOfView(el, i);
}
} else {
var height = el.bottom - el.top;
el.progress = (_this3.instance.scroll.y - (el.top - _this3.windowHeight)) / (height + _this3.windowHeight);
if (scrollBottom < el.top || scrollTop > el.bottom) {
_this3.setOutOfView(el, i);
}
}
}
}); // this.els = this.els.filter((current, i) => {
// return current !== null;
// });
this.hasScrollTicking = false;
}
}, {
key: "setInView",
value: function setInView(current, i) {
this.els[i].inView = true;
current.el.classList.add(current["class"]);
this.currentElements[i] = current;
if (current.call && this.hasCallEventSet) {
this.dispatchCall(current, 'enter');
if (!current.repeat) {
this.els[i].call = false;
}
} // if (!current.repeat && !current.speed && !current.sticky) {
// if (!current.call || current.call && this.hasCallEventSet) {
// this.els[i] = null
// }
// }
if ($('#home-triger').hasClass('trm-active-el')) {
$('.trm-menu nav ul li').removeClass('current-item');
$('#home-link').addClass('current-item');
}
if ($('#about-triger').hasClass('trm-active-el')) {
$('.trm-menu nav ul li').removeClass('current-item');
$('#about-link').addClass('current-item');
}
if ($('#portfolio-triger').hasClass('trm-active-el')) {
$('.trm-menu nav ul li').removeClass('current-item');
$('#portfolio-link').addClass('current-item');
}
if ($('#resume-triger').hasClass('trm-active-el')) {
$('.trm-menu nav ul li').removeClass('current-item');
$('#resume-link').addClass('current-item');
}
if ($('#contact-triger').hasClass('trm-active-el')) {
$('.trm-menu nav ul li').removeClass('current-item');
$('#contact-link').addClass('current-item');
}
}
}, {
key: "setOutOfView",
value: function setOutOfView(current, i) {
var _this4 = this;
// if (current.repeat || current.speed !== undefined) {
this.els[i].inView = false; // }
Object.keys(this.currentElements).forEach(function (el) {
el === i && delete _this4.currentElements[el];
});
if (current.call && this.hasCallEventSet) {
this.dispatchCall(current, 'exit');
}
if (current.repeat) {
current.el.classList.remove(current["class"]);
}
}
}, {
key: "dispatchCall",
value: function dispatchCall(current, way) {
this.callWay = way;
this.callValue = current.call.split(',').map(function (item) {
return item.trim();
});
this.callObj = current;
if (this.callValue.length == 1) this.callValue = this.callValue[0];
var callEvent = new Event(this.namespace + 'call');
this.el.dispatchEvent(callEvent);
}
}, {
key: "dispatchScroll",
value: function dispatchScroll() {
var scrollEvent = new Event(this.namespace + 'scroll');
this.el.dispatchEvent(scrollEvent);
}
}, {
key: "setEvents",
value: function setEvents(event, func) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
var list = this.listeners[event];
list.push(func);
if (list.length === 1) {
this.el.addEventListener(this.namespace + event, this.checkEvent, false);
}
if (event === 'call') {
this.hasCallEventSet = true;
this.detectElements(true);
}
}
}, {
key: "unsetEvents",
value: function unsetEvents(event, func) {
if (!this.listeners[event]) return;
var list = this.listeners[event];
var index = list.indexOf(func);
if (index < 0) return;
list.splice(index, 1);
if (list.index === 0) {
this.el.removeEventListener(this.namespace + event, this.checkEvent, false);
}
}
}, {
key: "checkEvent",
value: function checkEvent(event) {
var _this5 = this;
var name = event.type.replace(this.namespace, '');
var list = this.listeners[name];
if (!list || list.length === 0) return;
list.forEach(function (func) {
switch (name) {
case 'scroll':
return func(_this5.instance);
case 'call':
return func(_this5.callValue, _this5.callWay, _this5.callObj);
default:
return func();
}
});
}
}, {
key: "startScroll",
value: function startScroll() {}
}, {
key: "stopScroll",
value: function stopScroll() {}
}, {
key: "setScroll",
value: function setScroll(x, y) {
this.instance.scroll = {
x: 0,
y: 0
};
}
}, {
key: "destroy",
value: function destroy() {
var _this6 = this;
window.removeEventListener('resize', this.checkResize, false);
Object.keys(this.listeners).forEach(function (event) {
_this6.el.removeEventListener(_this6.namespace + event, _this6.checkEvent, false);
});
this.listeners = {};
this.scrollToEls.forEach(function (el) {
el.removeEventListener('click', _this6.setScrollTo, false);
});
this.html.classList.remove(this.initClass);
}
}]);
return _default;
}();
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var smoothscroll = createCommonjsModule(function (module, exports) {
/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */
(function () {
// polyfill
function polyfill() {
// aliases
var w = window;
var d = document;
// return if scroll behavior is supported and polyfill is not forced
if (
'scrollBehavior' in d.documentElement.style &&
w.__forceSmoothScrollPolyfill__ !== true
) {
return;
}
// globals
var Element = w.HTMLElement || w.Element;
var SCROLL_TIME = 468;
// object gathering original scroll methods
var original = {
scroll: w.scroll || w.scrollTo,
scrollBy: w.scrollBy,
elementScroll: Element.prototype.scroll || scrollElement,
scrollIntoView: Element.prototype.scrollIntoView
};
// define timing method
var now =
w.performance && w.performance.now
? w.performance.now.bind(w.performance)
: Date.now;
/**
* indicates if a the current browser is made by Microsoft
* @method isMicrosoftBrowser
* @param {String} userAgent
* @returns {Boolean}
*/
function isMicrosoftBrowser(userAgent) {
var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];
return new RegExp(userAgentPatterns.join('|')).test(userAgent);
}
/*
* IE has rounding bug rounding down clientHeight and clientWidth and
* rounding up scrollHeight and scrollWidth causing false positives
* on hasScrollableSpace
*/
var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;
/**
* changes scroll position inside an element
* @method scrollElement
* @param {Number} x
* @param {Number} y
* @returns {undefined}
*/
function scrollElement(x, y) {
this.scrollLeft = x;
this.scrollTop = y;
}
/**
* returns result of applying ease math function to a number
* @method ease
* @param {Number} k
* @returns {Number}
*/
function ease(k) {
return 0.5 * (1 - Math.cos(Math.PI * k));
}
/**
* indicates if a smooth behavior should be applied
* @method shouldBailOut
* @param {Number|Object} firstArg
* @returns {Boolean}
*/
function shouldBailOut(firstArg) {
if (
firstArg === null ||
typeof firstArg !== 'object' ||
firstArg.behavior === undefined ||
firstArg.behavior === 'auto' ||
firstArg.behavior === 'instant'
) {
// first argument is not an object/null
// or behavior is auto, instant or undefined
return true;
}
if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {
// first argument is an object and behavior is smooth
return false;
}
// throw error when behavior is not supported
throw new TypeError(
'behavior member of ScrollOptions ' +
firstArg.behavior +
' is not a valid value for enumeration ScrollBehavior.'
);
}
/**
* indicates if an element has scrollable space in the provided axis
* @method hasScrollableSpace
* @param {Node} el
* @param {String} axis
* @returns {Boolean}
*/
function hasScrollableSpace(el, axis) {
if (axis === 'Y') {
return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;
}
if (axis === 'X') {
return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;
}
}
/**
* indicates if an element has a scrollable overflow property in the axis
* @method canOverflow
* @param {Node} el
* @param {String} axis
* @returns {Boolean}
*/
function canOverflow(el, axis) {
var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];
return overflowValue === 'auto' || overflowValue === 'scroll';
}
/**
* indicates if an element can be scrolled in either axis
* @method isScrollable
* @param {Node} el
* @param {String} axis
* @returns {Boolean}
*/
function isScrollable(el) {
var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');
var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');
return isScrollableY || isScrollableX;
}
/**
* finds scrollable parent of an element
* @method findScrollableParent
* @param {Node} el
* @returns {Node} el
*/
function findScrollableParent(el) {
while (el !== d.body && isScrollable(el) === false) {
el = el.parentNode || el.host;
}
return el;
}
/**
* self invoked function that, given a context, steps through scrolling
* @method step
* @param {Object} context
* @returns {undefined}
*/
function step(context) {
var time = now();
var value;
var currentX;
var currentY;
var elapsed = (time - context.startTime) / SCROLL_TIME;
// avoid elapsed times higher than one
elapsed = elapsed > 1 ? 1 : elapsed;
// apply easing to elapsed time
value = ease(elapsed);
currentX = context.startX + (context.x - context.startX) * value;
currentY = context.startY + (context.y - context.startY) * value;
context.method.call(context.scrollable, currentX, currentY);
// scroll more if we have not reached our destination
if (currentX !== context.x || currentY !== context.y) {
w.requestAnimationFrame(step.bind(w, context));
}
}
/**
* scrolls window or element with a smooth behavior
* @method smoothScroll
* @param {Object|Node} el
* @param {Number} x
* @param {Number} y
* @returns {undefined}
*/
function smoothScroll(el, x, y) {
var scrollable;
var startX;
var startY;
var method;
var startTime = now();
// define scroll context
if (el === d.body) {
scrollable = w;
startX = w.scrollX || w.pageXOffset;
startY = w.scrollY || w.pageYOffset;
method = original.scroll;
} else {
scrollable = el;
startX = el.scrollLeft;
startY = el.scrollTop;
method = scrollElement;
}
// scroll looping over a frame
step({
scrollable: scrollable,
method: method,
startTime: startTime,
startX: startX,
startY: startY,
x: x,
y: y
});
}
// ORIGINAL METHODS OVERRIDES
// w.scroll and w.scrollTo
w.scroll = w.scrollTo = function() {
// avoid action when no arguments are passed
if (arguments[0] === undefined) {
return;
}
// avoid smooth behavior if not required
if (shouldBailOut(arguments[0]) === true) {
original.scroll.call(
w,
arguments[0].left !== undefined
? arguments[0].left
: typeof arguments[0] !== 'object'
? arguments[0]
: w.scrollX || w.pageXOffset,
// use top prop, second argument if present or fallback to scrollY
arguments[0].top !== undefined
? arguments[0].top
: arguments[1] !== undefined
? arguments[1]
: w.scrollY || w.pageYOffset
);
return;
}
// LET THE SMOOTHNESS BEGIN!
smoothScroll.call(
w,
d.body,
arguments[0].left !== undefined
? ~~arguments[0].left
: w.scrollX || w.pageXOffset,
arguments[0].top !== undefined
? ~~arguments[0].top
: w.scrollY || w.pageYOffset
);
};
// w.scrollBy
w.scrollBy = function() {
// avoid action when no arguments are passed
if (arguments[0] === undefined) {
return;
}
// avoid smooth behavior if not required
if (shouldBailOut(arguments[0])) {
original.scrollBy.call(
w,
arguments[0].left !== undefined
? arguments[0].left
: typeof arguments[0] !== 'object' ? arguments[0] : 0,
arguments[0].top !== undefined
? arguments[0].top
: arguments[1] !== undefined ? arguments[1] : 0
);
return;
}
// LET THE SMOOTHNESS BEGIN!
smoothScroll.call(
w,
d.body,
~~arguments[0].left + (w.scrollX || w.pageXOffset),
~~arguments[0].top + (w.scrollY || w.pageYOffset)
);
};
// Element.prototype.scroll and Element.prototype.scrollTo
Element.prototype.scroll = Element.prototype.scrollTo = function() {
// avoid action when no arguments are passed
if (arguments[0] === undefined) {
return;
}
// avoid smooth behavior if not required
if (shouldBailOut(arguments[0]) === true) {
// if one number is passed, throw error to match Firefox implementation
if (typeof arguments[0] === 'number' && arguments[1] === undefined) {
throw new SyntaxError('Value could not be converted');
}
original.elementScroll.call(
this,
// use left prop, first number argument or fallback to scrollLeft
arguments[0].left !== undefined
? ~~arguments[0].left
: typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,
// use top prop, second argument or fallback to scrollTop
arguments[0].top !== undefined
? ~~arguments[0].top
: arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop
);
return;
}
var left = arguments[0].left;
var top = arguments[0].top;
// LET THE SMOOTHNESS BEGIN!
smoothScroll.call(
this,
this,
typeof left === 'undefined' ? this.scrollLeft : ~~left,
typeof top === 'undefined' ? this.scrollTop : ~~top
);
};
// Element.prototype.scrollBy
Element.prototype.scrollBy = function() {
// avoid action when no arguments are passed
if (arguments[0] === undefined) {
return;
}
// avoid smooth behavior if not required
if (shouldBailOut(arguments[0]) === true) {
original.elementScroll.call(
this,
arguments[0].left !== undefined
? ~~arguments[0].left + this.scrollLeft
: ~~arguments[0] + this.scrollLeft,
arguments[0].top !== undefined
? ~~arguments[0].top + this.scrollTop
: ~~arguments[1] + this.scrollTop
);
return;
}
this.scroll({
left: ~~arguments[0].left + this.scrollLeft,
top: ~~arguments[0].top + this.scrollTop,
behavior: arguments[0].behavior
});
};
// Element.prototype.scrollIntoView
Element.prototype.scrollIntoView = function() {
// avoid smooth behavior if not required
if (shouldBailOut(arguments[0]) === true) {
original.scrollIntoView.call(
this,
arguments[0] === undefined ? true : arguments[0]
);
return;
}
// LET THE SMOOTHNESS BEGIN!
var scrollableParent = findScrollableParent(this);
var parentRects = scrollableParent.getBoundingClientRect();
var clientRects = this.getBoundingClientRect();
if (scrollableParent !== d.body) {
// reveal element inside parent
smoothScroll.call(
this,
scrollableParent,
scrollableParent.scrollLeft + clientRects.left - parentRects.left,
scrollableParent.scrollTop + clientRects.top - parentRects.top
);
// reveal parent in viewport unless is fixed
if (w.getComputedStyle(scrollableParent).position !== 'fixed') {
w.scrollBy({
left: parentRects.left,
top: parentRects.top,
behavior: 'smooth'
});
}
} else {
// reveal element in viewport
w.scrollBy({
left: clientRects.left,
top: clientRects.top,
behavior: 'smooth'
});
}
};
}
{
// commonjs
module.exports = { polyfill: polyfill };
}
}());
});
var smoothscroll_1 = smoothscroll.polyfill;
var _default$1 = /*#__PURE__*/function (_Core) {
_inherits(_default, _Core);
var _super = _createSuper(_default);
function _default() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, _default);
_this = _super.call(this, options);
if (_this.resetNativeScroll) {
if (history.scrollRestoration) {
history.scrollRestoration = 'manual';
}
window.scrollTo(0, 0);
}
window.addEventListener('scroll', _this.checkScroll, false);
if (window.smoothscrollPolyfill === undefined) {
window.smoothscrollPolyfill = smoothscroll;
window.smoothscrollPolyfill.polyfill();
}
return _this;
}
_createClass(_default, [{
key: "init",
value: function init() {
this.instance.scroll.y = window.pageYOffset;
this.addElements();
this.detectElements();
_get(_getPrototypeOf(_default.prototype), "init", this).call(this);
}
}, {
key: "checkScroll",
value: function checkScroll() {
var _this2 = this;
_get(_getPrototypeOf(_default.prototype), "checkScroll", this).call(this);
if (this.getDirection) {
this.addDirection();
}
if (this.getSpeed) {
this.addSpeed();
this.speedTs = Date.now();
}
this.instance.scroll.y = window.pageYOffset;
if (Object.entries(this.els).length) {
if (!this.hasScrollTicking) {
requestAnimationFrame(function () {
_this2.detectElements();
});
this.hasScrollTicking = true;
}
}
}
}, {
key: "addDirection",
value: function addDirection() {
if (window.pageYOffset > this.instance.scroll.y) {
if (this.instance.direction !== 'down') {
this.instance.direction = 'down';
}
} else if (window.pageYOffset < this.instance.scroll.y) {
if (this.instance.direction !== 'up') {
this.instance.direction = 'up';
}
}
}
}, {
key: "addSpeed",
value: function addSpeed() {
if (window.pageYOffset != this.instance.scroll.y) {
this.instance.speed = (window.pageYOffset - this.instance.scroll.y) / Math.max(1, Date.now() - this.speedTs);
} else {
this.instance.speed = 0;
}
}
}, {
key: "resize",
value: function resize() {
if (Object.entries(this.els).length) {
this.windowHeight = window.innerHeight;
this.updateElements();
}
}
}, {
key: "addElements",
value: function addElements() {
var _this3 = this;
this.els = {};
var els = this.el.querySelectorAll('[data-' + this.name + ']');
els.forEach(function (el, index) {
var BCR = el.getBoundingClientRect();
var cl = el.dataset[_this3.name + 'Class'] || _this3["class"];
var id = typeof el.dataset[_this3.name + 'Id'] === 'string' ? el.dataset[_this3.name + 'Id'] : index;
var top;
var left;
var offset = typeof el.dataset[_this3.name + 'Offset'] === 'string' ? el.dataset[_this3.name + 'Offset'].split(',') : _this3.offset;
var repeat = el.dataset[_this3.name + 'Repeat'];
var call = el.dataset[_this3.name + 'Call'];
var target = el.dataset[_this3.name + 'Target'];
var targetEl;
if (target !== undefined) {
targetEl = document.querySelector("".concat(target));
} else {
targetEl = el;
}
var targetElBCR = targetEl.getBoundingClientRect();
top = targetElBCR.top + _this3.instance.scroll.y;
left = targetElBCR.left + _this3.instance.scroll.x;
var bottom = top + targetEl.offsetHeight;
var right = left + targetEl.offsetWidth;
if (repeat == 'false') {
repeat = false;
} else if (repeat != undefined) {
repeat = true;
} else {
repeat = _this3.repeat;
}
var relativeOffset = _this3.getRelativeOffset(offset);
top = top + relativeOffset[0];
bottom = bottom - relativeOffset[1];
var mappedEl = {
el: el,
targetEl: targetEl,
id: id,
"class": cl,
top: top,
bottom: bottom,
left: left,
right: right,
offset: offset,
progress: 0,
repeat: repeat,
inView: false,
call: call
};
_this3.els[id] = mappedEl;
if (el.classList.contains(cl)) {
_this3.setInView(_this3.els[id], id);
}
});
}
}, {
key: "updateElements",
value: function updateElements() {
var _this4 = this;
Object.entries(this.els).forEach(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
i = _ref2[0],
el = _ref2[1];
var top = el.targetEl.getBoundingClientRect().top + _this4.instance.scroll.y;
var bottom = top + el.targetEl.offsetHeight;
var relativeOffset = _this4.getRelativeOffset(el.offset);
_this4.els[i].top = top + relativeOffset[0];
_this4.els[i].bottom = bottom - relativeOffset[1];
});
this.hasScrollTicking = false;
}
}, {
key: "getRelativeOffset",
value: function getRelativeOffset(offset) {
var relativeOffset = [0, 0];
if (offset) {
for (var i = 0; i < offset.length; i++) {
if (typeof offset[i] == 'string') {
if (offset[i].includes('%')) {
relativeOffset[i] = parseInt(offset[i].replace('%', '') * this.windowHeight / 100);
} else {
relativeOffset[i] = parseInt(offset[i]);
}
} else {
relativeOffset[i] = offset[i];
}
}
}
return relativeOffset;
}
/**
* Scroll to a desired target.
*
* @param Available options :
* target {node, string, "top", "bottom", int} - The DOM element we want to scroll to
* options {object} - Options object for additionnal settings.
* @return {void}
*/
}, {
key: "scrollTo",
value: function scrollTo(target) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// Parse options
var offset = parseInt(options.offset) || 0; // An offset to apply on top of given `target` or `sourceElem`'s target
var callback = options.callback ? options.callback : false; // function called when scrollTo completes (note that it won't wait for lerp to stabilize)
if (typeof target === 'string') {
// Selector or boundaries
if (target === 'top') {
target = this.html;
} else if (target === 'bottom') {
target = this.html.offsetHeight - window.innerHeight;
} else {
target = document.querySelector(target); // If the query fails, abort
if (!target) {
return;
}
}
} else if (typeof target === 'number') {
// Absolute coordinate
target = parseInt(target);
} else if (target && target.tagName) ; else {
console.warn('`target` parameter is not valid');
return;
} // We have a target that is not a coordinate yet, get it
if (typeof target !== 'number') {
offset = target.getBoundingClientRect().top + offset + this.instance.scroll.y;
} else {
offset = target + offset;
}
var isTargetReached = function isTargetReached() {
return parseInt(window.pageYOffset) === parseInt(offset);
};
if (callback) {
if (isTargetReached()) {
callback();
return;
} else {
var onScroll = function onScroll() {
if (isTargetReached()) {
window.removeEventListener('scroll', onScroll);
callback();
}
};
window.addEventListener('scroll', onScroll);
}
}
window.scrollTo({
top: offset,
behavior: 'smooth'
});
}
}, {
key: "update",
value: function update() {
this.addElements();
this.detectElements();
}
}, {
key: "destroy",
value: function destroy() {
_get(_getPrototypeOf(_default.prototype), "destroy", this).call(this);
window.removeEventListener('scroll', this.checkScroll, false);
}
}]);
return _default;
}(_default);
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
function E () {
// Keep this empty so it's easier to inherit from
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
}
E.prototype = {
on: function (name, callback, ctx) {
var e = this.e || (this.e = {});
(e[name] || (e[name] = [])).push({
fn: callback,
ctx: ctx
});
return this;
},
once: function (name, callback, ctx) {
var self = this;
function listener () {
self.off(name, listener);
callback.apply(ctx, arguments);
}
listener._ = callback;
return this.on(name, listener, ctx);
},
emit: function (name) {
var data = [].slice.call(arguments, 1);
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
var i = 0;
var len = evtArr.length;
for (i; i < len; i++) {
evtArr[i].fn.apply(evtArr[i].ctx, data);
}
return this;
},
off: function (name, callback) {
var e = this.e || (this.e = {});
var evts = e[name];
var liveEvents = [];
if (evts && callback) {
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
liveEvents.push(evts[i]);
}
}
// Remove event from queue to prevent memory leak
// Suggested by https://github.com/lazd
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
(liveEvents.length)
? e[name] = liveEvents
: delete e[name];
return this;
}
};
var tinyEmitter = E;
var lethargy = createCommonjsModule(function (module, exports) {
// Generated by CoffeeScript 1.9.2
(function() {
var root;
root = exports !== null ? exports : this;
root.Lethargy = (function() {
function Lethargy(stability, sensitivity, tolerance, delay) {
this.stability = stability != null ? Math.abs(stability) : 8;
this.sensitivity = sensitivity != null ? 1 + Math.abs(sensitivity) : 100;
this.tolerance = tolerance != null ? 1 + Math.abs(tolerance) : 1.1;
this.delay = delay != null ? delay : 150;
this.lastUpDeltas = (function() {
var i, ref, results;
results = [];
for (i = 1, ref = this.stability * 2; 1 <= ref ? i <= ref : i >= ref; 1 <= ref ? i++ : i--) {
results.push(null);
}
return results;
}).call(this);
this.lastDownDeltas = (function() {
var i, ref, results;
results = [];
for (i = 1, ref = this.stability * 2; 1 <= ref ? i <= ref : i >= ref; 1 <= ref ? i++ : i--) {
results.push(null);
}
return results;
}).call(this);
this.deltasTimestamp = (function() {
var i, ref, results;
results = [];
for (i = 1, ref = this.stability * 2; 1 <= ref ? i <= ref : i >= ref; 1 <= ref ? i++ : i--) {
results.push(null);
}
return results;
}).call(this);
}
Lethargy.prototype.check = function(e) {
var lastDelta;
e = e.originalEvent || e;
if (e.wheelDelta != null) {
lastDelta = e.wheelDelta;
} else if (e.deltaY != null) {
lastDelta = e.deltaY * -40;
} else if ((e.detail != null) || e.detail === 0) {
lastDelta = e.detail * -40;
}
this.deltasTimestamp.push(Date.now());
this.deltasTimestamp.shift();
if (lastDelta > 0) {
this.lastUpDeltas.push(lastDelta);
this.lastUpDeltas.shift();
return this.isInertia(1);
} else {
this.lastDownDeltas.push(lastDelta);
this.lastDownDeltas.shift();
return this.isInertia(-1);
}
};
Lethargy.prototype.isInertia = function(direction) {
var lastDeltas, lastDeltasNew, lastDeltasOld, newAverage, newSum, oldAverage, oldSum;
lastDeltas = direction === -1 ? this.lastDownDeltas : this.lastUpDeltas;
if (lastDeltas[0] === null) {
return direction;
}
if (this.deltasTimestamp[(this.stability * 2) - 2] + this.delay > Date.now() && lastDeltas[0] === lastDeltas[(this.stability * 2) - 1]) {
return false;
}
lastDeltasOld = lastDeltas.slice(0, this.stability);
lastDeltasNew = lastDeltas.slice(this.stability, this.stability * 2);
oldSum = lastDeltasOld.reduce(function(t, s) {
return t + s;
});
newSum = lastDeltasNew.reduce(function(t, s) {
return t + s;
});
oldAverage = oldSum / lastDeltasOld.length;
newAverage = newSum / lastDeltasNew.length;
if (Math.abs(oldAverage) < Math.abs(newAverage * this.tolerance) && (this.sensitivity < Math.abs(newAverage))) {
return direction;
} else {
return false;
}
};
Lethargy.prototype.showLastUpDeltas = function() {
return this.lastUpDeltas;
};
Lethargy.prototype.showLastDownDeltas = function() {
return this.lastDownDeltas;
};
return Lethargy;
})();
}).call(commonjsGlobal);
});
var support = (function getSupport() {
return {
hasWheelEvent: 'onwheel' in document,
hasMouseWheelEvent: 'onmousewheel' in document,
hasTouch: ('ontouchstart' in window) || window.TouchEvent || window.DocumentTouch && document instanceof DocumentTouch,
hasTouchWin: navigator.msMaxTouchPoints && navigator.msMaxTouchPoints > 1,
hasPointer: !!window.navigator.msPointerEnabled,
hasKeyDown: 'onkeydown' in document,
isFirefox: navigator.userAgent.indexOf('Firefox') > -1
};
})();
var toString = Object.prototype.toString,
hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var bindallStandalone = function(object) {
if(!object) return console.warn('bindAll requires at least one argument.');
var functions = Array.prototype.slice.call(arguments, 1);
if (functions.length === 0) {
for (var method in object) {
if(hasOwnProperty$1.call(object, method)) {
if(typeof object[method] == 'function' && toString.call(object[method]) == "[object Function]") {
functions.push(method);
}
}
}
}
for(var i = 0; i < functions.length; i++) {
var f = functions[i];
object[f] = bind(object[f], object);
}
};
/*
Faster bind without specific-case checking. (see https://coderwall.com/p/oi3j3w).
bindAll is only needed for events binding so no need to make slow fixes for constructor
or partial application.
*/
function bind(func, context) {
return function() {
return func.apply(context, arguments);
};
}
var Lethargy = lethargy.Lethargy;
var EVT_ID = 'virtualscroll';
var src = VirtualScroll;
var keyCodes = {
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
SPACE: 32
};
function VirtualScroll(options) {
bindallStandalone(this, '_onWheel', '_onMouseWheel', '_onTouchStart', '_onTouchMove', '_onKeyDown');
this.el = window;
if (options && options.el) {
this.el = options.el;
delete options.el;
}
this.options = objectAssign({
mouseMultiplier: 1,
touchMultiplier: 2,
firefoxMultiplier: 15,
keyStep: 120,
preventTouch: false,
unpreventTouchClass: 'vs-touchmove-allowed',
limitInertia: false,
useKeyboard: true,
useTouch: true
}, options);
if (this.options.limitInertia) this._lethargy = new Lethargy();
this._emitter = new tinyEmitter();
this._event = {
y: 0,
x: 0,
deltaX: 0,
deltaY: 0
};
this.touchStartX = null;
this.touchStartY = null;
this.bodyTouchAction = null;
if (this.options.passive !== undefined) {
this.listenerOptions = {passive: this.options.passive};
}
}
VirtualScroll.prototype._notify = function(e) {
var evt = this._event;
evt.x += evt.deltaX;
evt.y += evt.deltaY;
this._emitter.emit(EVT_ID, {
x: evt.x,
y: evt.y,
deltaX: evt.deltaX,
deltaY: evt.deltaY,
originalEvent: e
});
};
VirtualScroll.prototype._onWheel = function(e) {
var options = this.options;
if (this._lethargy && this._lethargy.check(e) === false) return;
var evt = this._event;
// In Chrome and in Firefox (at least the new one)
evt.deltaX = e.wheelDeltaX || e.deltaX * -1;
evt.deltaY = e.wheelDeltaY || e.deltaY * -1;
// for our purpose deltamode = 1 means user is on a wheel mouse, not touch pad
// real meaning: https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent#Delta_modes
if(support.isFirefox && e.deltaMode == 1) {
evt.deltaX *= options.firefoxMultiplier;
evt.deltaY *= options.firefoxMultiplier;
}
evt.deltaX *= options.mouseMultiplier;
evt.deltaY *= options.mouseMultiplier;
this._notify(e);
};
VirtualScroll.prototype._onMouseWheel = function(e) {
if (this.options.limitInertia && this._lethargy.check(e) === false) return;
var evt = this._event;
// In Safari, IE and in Chrome if 'wheel' isn't defined
evt.deltaX = (e.wheelDeltaX) ? e.wheelDeltaX : 0;
evt.deltaY = (e.wheelDeltaY) ? e.wheelDeltaY : e.wheelDelta;
this._notify(e);
};
VirtualScroll.prototype._onTouchStart = function(e) {
var t = (e.targetTouches) ? e.targetTouches[0] : e;
this.touchStartX = t.pageX;
this.touchStartY = t.pageY;
};
VirtualScroll.prototype._onTouchMove = function(e) {
var options = this.options;
if(options.preventTouch
&& !e.target.classList.contains(options.unpreventTouchClass)) {
e.preventDefault();
}
var evt = this._event;
var t = (e.targetTouches) ? e.targetTouches[0] : e;
evt.deltaX = (t.pageX - this.touchStartX) * options.touchMultiplier;
evt.deltaY = (t.pageY - this.touchStartY) * options.touchMultiplier;
this.touchStartX = t.pageX;
this.touchStartY = t.pageY;
this._notify(e);
};
VirtualScroll.prototype._onKeyDown = function(e) {
var evt = this._event;
evt.deltaX = evt.deltaY = 0;
var windowHeight = window.innerHeight - 40;
switch(e.keyCode) {
case keyCodes.LEFT:
case keyCodes.UP:
evt.deltaY = this.options.keyStep;
break;
case keyCodes.RIGHT:
case keyCodes.DOWN:
evt.deltaY = - this.options.keyStep;
break;
case e.shiftKey:
evt.deltaY = windowHeight;
break;
case keyCodes.SPACE:
evt.deltaY = - windowHeight;
break;
default:
return;
}
this._notify(e);
};
VirtualScroll.prototype._bind = function() {
if(support.hasWheelEvent) this.el.addEventListener('wheel', this._onWheel, this.listenerOptions);
if(support.hasMouseWheelEvent) this.el.addEventListener('mousewheel', this._onMouseWheel, this.listenerOptions);
if(support.hasTouch && this.options.useTouch) {
this.el.addEventListener('touchstart', this._onTouchStart, this.listenerOptions);
this.el.addEventListener('touchmove', this._onTouchMove, this.listenerOptions);
}
if(support.hasPointer && support.hasTouchWin) {
this.bodyTouchAction = document.body.style.msTouchAction;
document.body.style.msTouchAction = 'none';
this.el.addEventListener('MSPointerDown', this._onTouchStart, true);
this.el.addEventListener('MSPointerMove', this._onTouchMove, true);
}
if(support.hasKeyDown && this.options.useKeyboard) document.addEventListener('keydown', this._onKeyDown);
};
VirtualScroll.prototype._unbind = function() {
if(support.hasWheelEvent) this.el.removeEventListener('wheel', this._onWheel);
if(support.hasMouseWheelEvent) this.el.removeEventListener('mousewheel', this._onMouseWheel);
if(support.hasTouch) {
this.el.removeEventListener('touchstart', this._onTouchStart);
this.el.removeEventListener('touchmove', this._onTouchMove);
}
if(support.hasPointer && support.hasTouchWin) {
document.body.style.msTouchAction = this.bodyTouchAction;
this.el.removeEventListener('MSPointerDown', this._onTouchStart, true);
this.el.removeEventListener('MSPointerMove', this._onTouchMove, true);
}
if(support.hasKeyDown && this.options.useKeyboard) document.removeEventListener('keydown', this._onKeyDown);
};
VirtualScroll.prototype.on = function(cb, ctx) {
this._emitter.on(EVT_ID, cb, ctx);
var events = this._emitter.e;
if (events && events[EVT_ID] && events[EVT_ID].length === 1) this._bind();
};
VirtualScroll.prototype.off = function(cb, ctx) {
this._emitter.off(EVT_ID, cb, ctx);
var events = this._emitter.e;
if (!events[EVT_ID] || events[EVT_ID].length <= 0) this._unbind();
};
VirtualScroll.prototype.reset = function() {
var evt = this._event;
evt.x = 0;
evt.y = 0;
};
VirtualScroll.prototype.destroy = function() {
this._emitter.off();
this._unbind();
};
function lerp(start, end, amt) {
return (1 - amt) * start + amt * end;
}
function getTranslate(el) {
var translate = {};
if (!window.getComputedStyle) return;
var style = getComputedStyle(el);
var transform = style.transform || style.webkitTransform || style.mozTransform;
var mat = transform.match(/^matrix3d\((.+)\)$/);
if (mat) {
translate.x = mat ? parseFloat(mat[1].split(', ')[12]) : 0;
translate.y = mat ? parseFloat(mat[1].split(', ')[13]) : 0;
} else {
mat = transform.match(/^matrix\((.+)\)$/);
translate.x = mat ? parseFloat(mat[1].split(', ')[4]) : 0;
translate.y = mat ? parseFloat(mat[1].split(', ')[5]) : 0;
}
return translate;
}
/**
* Returns an array containing all the parent nodes of the given node
* @param {object} node
* @return {array} parent nodes
*/
function getParents(elem) {
// Set up a parent array
var parents = []; // Push each parent element to the array
for (; elem && elem !== document; elem = elem.parentNode) {
parents.push(elem);
} // Return our parent array
return parents;
} // https://gomakethings.com/how-to-get-the-closest-parent-element-with-a-matching-selector-using-vanilla-javascript/
/**
* https://github.com/gre/bezier-easing
* BezierEasing - use bezier curve for transition easing function
* by Gaëtan Renaudeau 2014 - 2015 MIT License
*/
// These values are established by empiricism with tests (tradeoff: performance VS precision)
var NEWTON_ITERATIONS = 4;
var NEWTON_MIN_SLOPE = 0.001;
var SUBDIVISION_PRECISION = 0.0000001;
var SUBDIVISION_MAX_ITERATIONS = 10;
var kSplineTableSize = 11;
var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
var float32ArraySupported = typeof Float32Array === 'function';
function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
function C (aA1) { return 3.0 * aA1; }
// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
function binarySubdivide (aX, aA, aB, mX1, mX2) {
var currentX, currentT, i = 0;
do {
currentT = aA + (aB - aA) / 2.0;
currentX = calcBezier(currentT, mX1, mX2) - aX;
if (currentX > 0.0) {
aB = currentT;
} else {
aA = currentT;
}
} while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
return currentT;
}
function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
var currentSlope = getSlope(aGuessT, mX1, mX2);
if (currentSlope === 0.0) {
return aGuessT;
}
var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
aGuessT -= currentX / currentSlope;
}
return aGuessT;
}
function LinearEasing (x) {
return x;
}
var src$1 = function bezier (mX1, mY1, mX2, mY2) {
if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
throw new Error('bezier x values must be in [0, 1] range');
}
if (mX1 === mY1 && mX2 === mY2) {
return LinearEasing;
}
// Precompute samples table
var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
for (var i = 0; i < kSplineTableSize; ++i) {
sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
}
function getTForX (aX) {
var intervalStart = 0.0;
var currentSample = 1;
var lastSample = kSplineTableSize - 1;
for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
intervalStart += kSampleStepSize;
}
--currentSample;
// Interpolate to provide an initial guess for t
var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
var guessForT = intervalStart + dist * kSampleStepSize;
var initialSlope = getSlope(guessForT, mX1, mX2);
if (initialSlope >= NEWTON_MIN_SLOPE) {
return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
} else if (initialSlope === 0.0) {
return guessForT;
} else {
return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
}
}
return function BezierEasing (x) {
// Because JavaScript number are imprecise, we should guarantee the extremes are right.
if (x === 0) {
return 0;
}
if (x === 1) {
return 1;
}
return calcBezier(getTForX(x), mY1, mY2);
};
};
var keyCodes$1 = {
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
SPACE: 32,
TAB: 9,
PAGEUP: 33,
PAGEDOWN: 34,
HOME: 36,
END: 35
};
var _default$2 = /*#__PURE__*/function (_Core) {
_inherits(_default, _Core);
var _super = _createSuper(_default);
function _default() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, _default);
if (history.scrollRestoration) {
history.scrollRestoration = 'manual';
}
window.scrollTo(0, 0);
_this = _super.call(this, options);
if (_this.inertia) _this.lerp = _this.inertia * 0.1;
_this.isScrolling = false;
_this.isDraggingScrollbar = false;
_this.isTicking = false;
_this.hasScrollTicking = false;
_this.parallaxElements = {};
_this.stop = false;
_this.scrollbarContainer = options.scrollbarContainer;
_this.checkKey = _this.checkKey.bind(_assertThisInitialized(_this));
window.addEventListener('keydown', _this.checkKey, false);
return _this;
}
_createClass(_default, [{
key: "init",
value: function init() {
var _this2 = this;
this.html.classList.add(this.smoothClass);
this.html.setAttribute("data-".concat(this.name, "-direction"), this.direction);
this.instance = _objectSpread2({
delta: {
x: this.initPosition.x,
y: this.initPosition.y
},
scroll: {
x: this.initPosition.x,
y: this.initPosition.y
}
}, this.instance);
this.vs = new src({
el: this.scrollFromAnywhere ? document : this.el,
mouseMultiplier: navigator.platform.indexOf('Win') > -1 ? 1 : 0.4,
firefoxMultiplier: this.firefoxMultiplier,
touchMultiplier: this.touchMultiplier,
useKeyboard: false,
passive: true
});
this.vs.on(function (e) {
if (_this2.stop) {
return;
}
if (!_this2.isDraggingScrollbar) {
requestAnimationFrame(function () {
_this2.updateDelta(e);
if (!_this2.isScrolling) _this2.startScrolling();
});
}
});
this.setScrollLimit();
this.initScrollBar();
this.addSections();
this.addElements();
this.checkScroll(true);
this.transformElements(true, true);
_get(_getPrototypeOf(_default.prototype), "init", this).call(this);
}
}, {
key: "setScrollLimit",
value: function setScrollLimit() {
this.instance.limit.y = this.el.offsetHeight - this.windowHeight;
if (this.direction === 'horizontal') {
var totalWidth = 0;
var nodes = this.el.children;
for (var i = 0; i < nodes.length; i++) {
totalWidth += nodes[i].offsetWidth;
}
this.instance.limit.x = totalWidth - this.windowWidth;
}
}
}, {
key: "startScrolling",
value: function startScrolling() {
this.startScrollTs = Date.now(); // Record timestamp
this.isScrolling = true;
this.checkScroll();
this.html.classList.add(this.scrollingClass);
}
}, {
key: "stopScrolling",
value: function stopScrolling() {
cancelAnimationFrame(this.checkScrollRaf); // Prevent checkScroll to continue looping
if (this.scrollToRaf) {
cancelAnimationFrame(this.scrollToRaf);
this.scrollToRaf = null;
}
this.isScrolling = false;
this.instance.scroll.y = Math.round(this.instance.scroll.y);
this.html.classList.remove(this.scrollingClass);
}
}, {
key: "checkKey",
value: function checkKey(e) {
var _this3 = this;
if (this.stop) {
// If we are stopped, we don't want any scroll to occur because of a keypress
// Prevent tab to scroll to activeElement
if (e.keyCode == keyCodes$1.TAB) {
requestAnimationFrame(function () {
// Make sure native scroll is always at top of page
_this3.html.scrollTop = 0;
document.body.scrollTop = 0;
_this3.html.scrollLeft = 0;
document.body.scrollLeft = 0;
});
}
return;
}
switch (e.keyCode) {
case keyCodes$1.TAB:
// Do not remove the RAF
// It allows to override the browser's native scrollTo, which is essential
requestAnimationFrame(function () {
// Make sure native scroll is always at top of page
_this3.html.scrollTop = 0;
document.body.scrollTop = 0;
_this3.html.scrollLeft = 0;
document.body.scrollLeft = 0; // Request scrollTo on the focusedElement, putting it at the center of the screen
_this3.scrollTo(document.activeElement, {
offset: -window.innerHeight / 2
});
});
break;
case keyCodes$1.UP:
this.instance.delta[this.directionAxis] -= 240;
break;
case keyCodes$1.DOWN:
this.instance.delta[this.directionAxis] += 240;
break;
case keyCodes$1.PAGEUP:
this.instance.delta[this.directionAxis] -= window.innerHeight;
break;
case keyCodes$1.PAGEDOWN:
this.instance.delta[this.directionAxis] += window.innerHeight;
break;
case keyCodes$1.HOME:
this.instance.delta[this.directionAxis] -= this.instance.limit[this.directionAxis];
break;
case keyCodes$1.END:
this.instance.delta[this.directionAxis] += this.instance.limit[this.directionAxis];
break;
case keyCodes$1.SPACE:
if (!(document.activeElement instanceof HTMLInputElement) && !(document.activeElement instanceof HTMLTextAreaElement)) {
if (e.shiftKey) {
this.instance.delta[this.directionAxis] -= window.innerHeight;
} else {
this.instance.delta[this.directionAxis] += window.innerHeight;
}
}
break;
default:
return;
}
if (this.instance.delta[this.directionAxis] < 0) this.instance.delta[this.directionAxis] = 0;
if (this.instance.delta[this.directionAxis] > this.instance.limit[this.directionAxis]) this.instance.delta[this.directionAxis] = this.instance.limit[this.directionAxis];
this.stopScrolling(); // Stop any movement, allows to kill any other `scrollTo` still happening
this.isScrolling = true;
this.checkScroll();
this.html.classList.add(this.scrollingClass);
}
}, {
key: "checkScroll",
value: function checkScroll() {
var _this4 = this;
var forced = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (forced || this.isScrolling || this.isDraggingScrollbar) {
if (!this.hasScrollTicking) {
this.checkScrollRaf = requestAnimationFrame(function () {
return _this4.checkScroll();
});
this.hasScrollTicking = true;
}
this.updateScroll();
var distance = Math.abs(this.instance.delta[this.directionAxis] - this.instance.scroll[this.directionAxis]);
var timeSinceStart = Date.now() - this.startScrollTs; // Get the time since the scroll was started: the scroll can be stopped again only past 100ms
if (!this.animatingScroll && timeSinceStart > 100 && (distance < 0.5 && this.instance.delta[this.directionAxis] != 0 || distance < 0.5 && this.instance.delta[this.directionAxis] == 0)) {
this.stopScrolling();
}
Object.entries(this.sections).forEach(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
i = _ref2[0],
section = _ref2[1];
if (section.persistent || _this4.instance.scroll[_this4.directionAxis] > section.offset[_this4.directionAxis] && _this4.instance.scroll[_this4.directionAxis] < section.limit[_this4.directionAxis]) {
if (_this4.direction === 'horizontal') {
_this4.transform(section.el, -_this4.instance.scroll[_this4.directionAxis], 0);
} else {
_this4.transform(section.el, 0, -_this4.instance.scroll[_this4.directionAxis]);
}
if (!section.inView) {
section.inView = true;
section.el.style.opacity = 1;
section.el.style.pointerEvents = 'all';
section.el.setAttribute("data-".concat(_this4.name, "-section-inview"), '');
}
} else {
if (section.inView || forced) {
section.inView = false;
section.el.style.opacity = 0;
section.el.style.pointerEvents = 'none';
section.el.removeAttribute("data-".concat(_this4.name, "-section-inview"));
}
_this4.transform(section.el, 0, 0);
}
});
if (this.getDirection) {
this.addDirection();
}
if (this.getSpeed) {
this.addSpeed();
this.speedTs = Date.now();
}
this.detectElements();
this.transformElements();
if (this.hasScrollbar) {
var scrollBarTranslation = this.instance.scroll[this.directionAxis] / this.instance.limit[this.directionAxis] * this.scrollBarLimit[this.directionAxis];
if (this.direction === 'horizontal') {
this.transform(this.scrollbarThumb, scrollBarTranslation, 0);
} else {
this.transform(this.scrollbarThumb, 0, scrollBarTranslation);
}
}
_get(_getPrototypeOf(_default.prototype), "checkScroll", this).call(this);
this.hasScrollTicking = false;
}
}
}, {
key: "resize",
value: function resize() {
this.windowHeight = window.innerHeight;
this.windowWidth = window.innerWidth;
this.checkContext();
this.windowMiddle = {
x: this.windowWidth / 2,
y: this.windowHeight / 2
};
this.update();
}
}, {
key: "updateDelta",
value: function updateDelta(e) {
var delta;
var gestureDirection = this[this.context] && this[this.context].gestureDirection ? this[this.context].gestureDirection : this.gestureDirection;
if (gestureDirection === 'both') {
delta = e.deltaX + e.deltaY;
} else if (gestureDirection === 'vertical') {
delta = e.deltaY;
} else if (gestureDirection === 'horizontal') {
delta = e.deltaX;
} else {
delta = e.deltaY;
}
this.instance.delta[this.directionAxis] -= delta * this.multiplier;
if (this.instance.delta[this.directionAxis] < 0) this.instance.delta[this.directionAxis] = 0;
if (this.instance.delta[this.directionAxis] > this.instance.limit[this.directionAxis]) this.instance.delta[this.directionAxis] = this.instance.limit[this.directionAxis];
}
}, {
key: "updateScroll",
value: function updateScroll(e) {
if (this.isScrolling || this.isDraggingScrollbar) {
this.instance.scroll[this.directionAxis] = lerp(this.instance.scroll[this.directionAxis], this.instance.delta[this.directionAxis], this.lerp);
} else {
if (this.instance.scroll[this.directionAxis] > this.instance.limit[this.directionAxis]) {
this.setScroll(this.instance.scroll[this.directionAxis], this.instance.limit[this.directionAxis]);
} else if (this.instance.scroll.y < 0) {
this.setScroll(this.instance.scroll[this.directionAxis], 0);
} else {
this.setScroll(this.instance.scroll[this.directionAxis], this.instance.delta[this.directionAxis]);
}
}
}
}, {
key: "addDirection",
value: function addDirection() {
if (this.instance.delta.y > this.instance.scroll.y) {
if (this.instance.direction !== 'down') {
this.instance.direction = 'down';
}
} else if (this.instance.delta.y < this.instance.scroll.y) {
if (this.instance.direction !== 'up') {
this.instance.direction = 'up';
}
}
if (this.instance.delta.x > this.instance.scroll.x) {
if (this.instance.direction !== 'right') {
this.instance.direction = 'right';
}
} else if (this.instance.delta.x < this.instance.scroll.x) {
if (this.instance.direction !== 'left') {
this.instance.direction = 'left';
}
}
}
}, {
key: "addSpeed",
value: function addSpeed() {
if (this.instance.delta[this.directionAxis] != this.instance.scroll[this.directionAxis]) {
this.instance.speed = (this.instance.delta[this.directionAxis] - this.instance.scroll[this.directionAxis]) / Math.max(1, Date.now() - this.speedTs);
} else {
this.instance.speed = 0;
}
}
}, {
key: "initScrollBar",
value: function initScrollBar() {
this.scrollbar = document.createElement('span');
this.scrollbarThumb = document.createElement('span');
this.scrollbar.classList.add("".concat(this.scrollbarClass));
this.scrollbarThumb.classList.add("".concat(this.scrollbarClass, "_thumb"));
this.scrollbar.append(this.scrollbarThumb);
if (this.scrollbarContainer) {
this.scrollbarContainer.append(this.scrollbar);
} else {
document.body.append(this.scrollbar);
} // Scrollbar Events
this.getScrollBar = this.getScrollBar.bind(this);
this.releaseScrollBar = this.releaseScrollBar.bind(this);
this.moveScrollBar = this.moveScrollBar.bind(this);
this.scrollbarThumb.addEventListener('mousedown', this.getScrollBar);
window.addEventListener('mouseup', this.releaseScrollBar);
window.addEventListener('mousemove', this.moveScrollBar); // Set scrollbar values
this.hasScrollbar = false;
if (this.direction == 'horizontal') {
if (this.instance.limit.x + this.windowWidth <= this.windowWidth) {
return;
}
} else {
if (this.instance.limit.y + this.windowHeight <= this.windowHeight) {
return;
}
}
this.hasScrollbar = true;
this.scrollbarBCR = this.scrollbar.getBoundingClientRect();
this.scrollbarHeight = this.scrollbarBCR.height;
this.scrollbarWidth = this.scrollbarBCR.width;
if (this.direction === 'horizontal') {
this.scrollbarThumb.style.width = "".concat(this.scrollbarWidth * this.scrollbarWidth / (this.instance.limit.x + this.scrollbarWidth), "px");
} else {
this.scrollbarThumb.style.height = "".concat(this.scrollbarHeight * this.scrollbarHeight / (this.instance.limit.y + this.scrollbarHeight), "px");
}
this.scrollbarThumbBCR = this.scrollbarThumb.getBoundingClientRect();
this.scrollBarLimit = {
x: this.scrollbarWidth - this.scrollbarThumbBCR.width,
y: this.scrollbarHeight - this.scrollbarThumbBCR.height
};
}
}, {
key: "reinitScrollBar",
value: function reinitScrollBar() {
this.hasScrollbar = false;
if (this.direction == 'horizontal') {
if (this.instance.limit.x + this.windowWidth <= this.windowWidth) {
return;
}
} else {
if (this.instance.limit.y + this.windowHeight <= this.windowHeight) {
return;
}
}
this.hasScrollbar = true;
this.scrollbarBCR = this.scrollbar.getBoundingClientRect();
this.scrollbarHeight = this.scrollbarBCR.height;
this.scrollbarWidth = this.scrollbarBCR.width;
if (this.direction === 'horizontal') {
this.scrollbarThumb.style.width = "".concat(this.scrollbarWidth * this.scrollbarWidth / (this.instance.limit.x + this.scrollbarWidth), "px");
} else {
this.scrollbarThumb.style.height = "".concat(this.scrollbarHeight * this.scrollbarHeight / (this.instance.limit.y + this.scrollbarHeight), "px");
}
this.scrollbarThumbBCR = this.scrollbarThumb.getBoundingClientRect();
this.scrollBarLimit = {
x: this.scrollbarWidth - this.scrollbarThumbBCR.width,
y: this.scrollbarHeight - this.scrollbarThumbBCR.height
};
}
}, {
key: "destroyScrollBar",
value: function destroyScrollBar() {
this.scrollbarThumb.removeEventListener('mousedown', this.getScrollBar);
window.removeEventListener('mouseup', this.releaseScrollBar);
window.removeEventListener('mousemove', this.moveScrollBar);
this.scrollbar.remove();
}
}, {
key: "getScrollBar",
value: function getScrollBar(e) {
this.isDraggingScrollbar = true;
this.checkScroll();
this.html.classList.remove(this.scrollingClass);
this.html.classList.add(this.draggingClass);
}
}, {
key: "releaseScrollBar",
value: function releaseScrollBar(e) {
this.isDraggingScrollbar = false;
this.html.classList.add(this.scrollingClass);
this.html.classList.remove(this.draggingClass);
}
}, {
key: "moveScrollBar",
value: function moveScrollBar(e) {
var _this5 = this;
if (this.isDraggingScrollbar) {
requestAnimationFrame(function () {
var x = (e.clientX - _this5.scrollbarBCR.left) * 100 / _this5.scrollbarWidth * _this5.instance.limit.x / 100;
var y = (e.clientY - _this5.scrollbarBCR.top) * 100 / _this5.scrollbarHeight * _this5.instance.limit.y / 100;
if (y > 0 && y < _this5.instance.limit.y) {
_this5.instance.delta.y = y;
}
if (x > 0 && x < _this5.instance.limit.x) {
_this5.instance.delta.x = x;
}
});
}
}
}, {
key: "addElements",
value: function addElements() {
var _this6 = this;
this.els = {};
this.parallaxElements = {}; // this.sections.forEach((section, y) => {
var els = this.el.querySelectorAll("[data-".concat(this.name, "]"));
els.forEach(function (el, index) {
// Try and find the target's parent section
var targetParents = getParents(el);
var section = Object.entries(_this6.sections).map(function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
key = _ref4[0],
section = _ref4[1];
return section;
}).find(function (section) {
return targetParents.includes(section.el);
});
var cl = el.dataset[_this6.name + 'Class'] || _this6["class"];
var id = typeof el.dataset[_this6.name + 'Id'] === 'string' ? el.dataset[_this6.name + 'Id'] : 'el' + index;
var top;
var left;
var repeat = el.dataset[_this6.name + 'Repeat'];
var call = el.dataset[_this6.name + 'Call'];
var position = el.dataset[_this6.name + 'Position'];
var delay = el.dataset[_this6.name + 'Delay'];
var direction = el.dataset[_this6.name + 'Direction'];
var sticky = typeof el.dataset[_this6.name + 'Sticky'] === 'string';
var speed = el.dataset[_this6.name + 'Speed'] ? parseFloat(el.dataset[_this6.name + 'Speed']) / 10 : false;
var offset = typeof el.dataset[_this6.name + 'Offset'] === 'string' ? el.dataset[_this6.name + 'Offset'].split(',') : _this6.offset;
var target = el.dataset[_this6.name + 'Target'];
var targetEl;
if (target !== undefined) {
targetEl = document.querySelector("".concat(target));
} else {
targetEl = el;
}
var targetElBCR = targetEl.getBoundingClientRect();
if (section === null) {
top = targetElBCR.top + _this6.instance.scroll.y - getTranslate(targetEl).y;
left = targetElBCR.left + _this6.instance.scroll.x - getTranslate(targetEl).x;
} else {
if (!section.inView) {
top = targetElBCR.top - getTranslate(section.el).y - getTranslate(targetEl).y;
left = targetElBCR.left - getTranslate(section.el).x - getTranslate(targetEl).x;
} else {
top = targetElBCR.top + _this6.instance.scroll.y - getTranslate(targetEl).y;
left = targetElBCR.left + _this6.instance.scroll.x - getTranslate(targetEl).x;
}
}
var bottom = top + targetEl.offsetHeight;
var right = left + targetEl.offsetWidth;
var middle = {
x: (right - left) / 2 + left,
y: (bottom - top) / 2 + top
};
if (sticky) {
var elBCR = el.getBoundingClientRect();
var elTop = elBCR.top;
var elLeft = elBCR.left;
var elDistance = {
x: elLeft - left,
y: elTop - top
};
top += window.innerHeight;
left += window.innerWidth;
bottom = elTop + targetEl.offsetHeight - el.offsetHeight - elDistance[_this6.directionAxis];
right = elLeft + targetEl.offsetWidth - el.offsetWidth - elDistance[_this6.directionAxis];
middle = {
x: (right - left) / 2 + left,
y: (bottom - top) / 2 + top
};
}
if (repeat == 'false') {
repeat = false;
} else if (repeat != undefined) {
repeat = true;
} else {
repeat = _this6.repeat;
}
var relativeOffset = [0, 0];
if (offset) {
if (_this6.direction === 'horizontal') {
for (var i = 0; i < offset.length; i++) {
if (typeof offset[i] == 'string') {
if (offset[i].includes('%')) {
relativeOffset[i] = parseInt(offset[i].replace('%', '') * _this6.windowWidth / 100);
} else {
relativeOffset[i] = parseInt(offset[i]);
}
} else {
relativeOffset[i] = offset[i];
}
}
left = left + relativeOffset[0];
right = right - relativeOffset[1];
} else {
for (var i = 0; i < offset.length; i++) {
if (typeof offset[i] == 'string') {
if (offset[i].includes('%')) {
relativeOffset[i] = parseInt(offset[i].replace('%', '') * _this6.windowHeight / 100);
} else {
relativeOffset[i] = parseInt(offset[i]);
}
} else {
relativeOffset[i] = offset[i];
}
}
top = top + relativeOffset[0];
bottom = bottom - relativeOffset[1];
}
}
var mappedEl = {
el: el,
id: id,
"class": cl,
section: section,
top: top,
middle: middle,
bottom: bottom,
left: left,
right: right,
offset: offset,
progress: 0,
repeat: repeat,
inView: false,
call: call,
speed: speed,
delay: delay,
position: position,
target: targetEl,
direction: direction,
sticky: sticky
};
_this6.els[id] = mappedEl;
if (el.classList.contains(cl)) {
_this6.setInView(_this6.els[id], id);
}
if (speed !== false || sticky) {
_this6.parallaxElements[id] = mappedEl;
}
}); // });
}
}, {
key: "addSections",
value: function addSections() {
var _this7 = this;
this.sections = {};
var sections = this.el.querySelectorAll("[data-".concat(this.name, "-section]"));
if (sections.length === 0) {
sections = [this.el];
}
sections.forEach(function (section, index) {
var id = typeof section.dataset[_this7.name + 'Id'] === 'string' ? section.dataset[_this7.name + 'Id'] : 'section' + index;
var sectionBCR = section.getBoundingClientRect();
var offset = {
x: sectionBCR.left - window.innerWidth * 1.5 - getTranslate(section).x,
y: sectionBCR.top - window.innerHeight * 1.5 - getTranslate(section).y
};
var limit = {
x: offset.x + sectionBCR.width + window.innerWidth * 2,
y: offset.y + sectionBCR.height + window.innerHeight * 2
};
var persistent = typeof section.dataset[_this7.name + 'Persistent'] === 'string';
section.setAttribute('data-scroll-section-id', id);
var mappedSection = {
el: section,
offset: offset,
limit: limit,
inView: false,
persistent: persistent,
id: id
};
_this7.sections[id] = mappedSection;
});
}
}, {
key: "transform",
value: function transform(element, x, y, delay) {
var transform;
if (!delay) {
transform = "matrix3d(1,0,0.00,0,0.00,1,0.00,0,0,0,1,0,".concat(x, ",").concat(y, ",0,1)");
} else {
var start = getTranslate(element);
var lerpX = lerp(start.x, x, delay);
var lerpY = lerp(start.y, y, delay);
transform = "matrix3d(1,0,0.00,0,0.00,1,0.00,0,0,0,1,0,".concat(lerpX, ",").concat(lerpY, ",0,1)");
}
element.style.webkitTransform = transform;
element.style.msTransform = transform;
element.style.transform = transform;
}
}, {
key: "transformElements",
value: function transformElements(isForced) {
var _this8 = this;
var setAllElements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var scrollRight = this.instance.scroll.x + this.windowWidth;
var scrollBottom = this.instance.scroll.y + this.windowHeight;
var scrollMiddle = {
x: this.instance.scroll.x + this.windowMiddle.x,
y: this.instance.scroll.y + this.windowMiddle.y
};
Object.entries(this.parallaxElements).forEach(function (_ref5) {
var _ref6 = _slicedToArray(_ref5, 2),
i = _ref6[0],
current = _ref6[1];
var transformDistance = false;
if (isForced) {
transformDistance = 0;
}
if (current.inView || setAllElements) {
switch (current.position) {
case 'top':
transformDistance = _this8.instance.scroll[_this8.directionAxis] * -current.speed;
break;
case 'elementTop':
transformDistance = (scrollBottom - current.top) * -current.speed;
break;
case 'bottom':
transformDistance = (_this8.instance.limit[_this8.directionAxis] - scrollBottom + _this8.windowHeight) * current.speed;
break;
case 'left':
transformDistance = _this8.instance.scroll[_this8.directionAxis] * -current.speed;
break;
case 'elementLeft':
transformDistance = (scrollRight - current.left) * -current.speed;
break;
case 'right':
transformDistance = (_this8.instance.limit[_this8.directionAxis] - scrollRight + _this8.windowHeight) * current.speed;
break;
default:
transformDistance = (scrollMiddle[_this8.directionAxis] - current.middle[_this8.directionAxis]) * -current.speed;
break;
}
}
if (current.sticky) {
if (current.inView) {
if (_this8.direction === 'horizontal') {
transformDistance = _this8.instance.scroll.x - current.left + window.innerWidth;
} else {
transformDistance = _this8.instance.scroll.y - current.top + window.innerHeight;
}
} else {
if (_this8.direction === 'horizontal') {
if (_this8.instance.scroll.x < current.left - window.innerWidth && _this8.instance.scroll.x < current.left - window.innerWidth / 2) {
transformDistance = 0;
} else if (_this8.instance.scroll.x > current.right && _this8.instance.scroll.x > current.right + 100) {
transformDistance = current.right - current.left + window.innerWidth;
} else {
transformDistance = false;
}
} else {
if (_this8.instance.scroll.y < current.top - window.innerHeight && _this8.instance.scroll.y < current.top - window.innerHeight / 2) {
transformDistance = 0;
} else if (_this8.instance.scroll.y > current.bottom && _this8.instance.scroll.y > current.bottom + 100) {
transformDistance = current.bottom - current.top + window.innerHeight;
} else {
transformDistance = false;
}
}
}
}
if (transformDistance !== false) {
if (current.direction === 'horizontal' || _this8.direction === 'horizontal' && current.direction !== 'vertical') {
_this8.transform(current.el, transformDistance, 0, isForced ? false : current.delay);
} else {
_this8.transform(current.el, 0, transformDistance, isForced ? false : current.delay);
}
}
});
}
/**
* Scroll to a desired target.
*
* @param Available options :
* target {node, string, "top", "bottom", int} - The DOM element we want to scroll to
* options {object} - Options object for additionnal settings.
* @return {void}
*/
}, {
key: "scrollTo",
value: function scrollTo(target) {
var _this9 = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// Parse options
var offset = parseInt(options.offset) || 0; // An offset to apply on top of given `target` or `sourceElem`'s target
var duration = !isNaN(parseInt(options.duration)) ? parseInt(options.duration) : 1000; // Duration of the scroll animation in milliseconds
var easing = options.easing || [0.25, 0.0, 0.35, 1.0]; // An array of 4 floats between 0 and 1 defining the bezier curve for the animation's easing. See http://greweb.me/bezier-easing-editor/example/
var disableLerp = options.disableLerp ? true : false; // Lerp effect won't be applied if set to true
var callback = options.callback ? options.callback : false; // function called when scrollTo completes (note that it won't wait for lerp to stabilize)
easing = src$1.apply(void 0, _toConsumableArray(easing));
if (typeof target === 'string') {
// Selector or boundaries
if (target === 'top') {
target = 0;
} else if (target === 'bottom') {
target = this.instance.limit.y;
} else if (target === 'left') {
target = 0;
} else if (target === 'right') {
target = this.instance.limit.x;
} else {
target = document.querySelector(target); // If the query fails, abort
if (!target) {
return;
}
}
} else if (typeof target === 'number') {
// Absolute coordinate
target = parseInt(target);
} else if (target && target.tagName) ; else {
console.warn('`target` parameter is not valid');
return;
} // We have a target that is not a coordinate yet, get it
if (typeof target !== 'number') {
// Verify the given target belongs to this scroll scope
var targetInScope = getParents(target).includes(this.el);
if (!targetInScope) {
// If the target isn't inside our main element, abort any action
return;
} // Get target offset from top
var targetBCR = target.getBoundingClientRect();
var offsetTop = targetBCR.top;
var offsetLeft = targetBCR.left; // Try and find the target's parent section
var targetParents = getParents(target);
var parentSection = targetParents.find(function (candidate) {
return Object.entries(_this9.sections) // Get sections associative array as a regular array
.map(function (_ref7) {
var _ref8 = _slicedToArray(_ref7, 2),
key = _ref8[0],
section = _ref8[1];
return section;
}) // map to section only (we dont need the key here)
.find(function (section) {
return section.el == candidate;
}); // finally find the section that matches the candidate
});
var parentSectionOffset = 0;
if (parentSection) {
parentSectionOffset = getTranslate(parentSection)[this.directionAxis]; // We got a parent section, store it's current offset to remove it later
} else {
// if no parent section is found we need to use instance scroll directly
parentSectionOffset = -this.instance.scroll[this.directionAxis];
} // Final value of scroll destination : offsetTop + (optional offset given in options) - (parent's section translate)
if (this.direction === 'horizontal') {
offset = offsetLeft + offset - parentSectionOffset;
} else {
offset = offsetTop + offset - parentSectionOffset;
}
} else {
offset = target + offset;
} // Actual scrollto
// ==========================================================================
// Setup
var scrollStart = parseFloat(this.instance.delta[this.directionAxis]);
var scrollTarget = Math.max(0, Math.min(offset, this.instance.limit[this.directionAxis])); // Make sure our target is in the scroll boundaries
var scrollDiff = scrollTarget - scrollStart;
var render = function render(p) {
if (disableLerp) {
if (_this9.direction === 'horizontal') {
_this9.setScroll(scrollStart + scrollDiff * p, _this9.instance.delta.y);
} else {
_this9.setScroll(_this9.instance.delta.x, scrollStart + scrollDiff * p);
}
} else {
_this9.instance.delta[_this9.directionAxis] = scrollStart + scrollDiff * p;
}
}; // Prepare the scroll
this.animatingScroll = true; // This boolean allows to prevent `checkScroll()` from calling `stopScrolling` when the animation is slow (i.e. at the beginning of an EaseIn)
this.stopScrolling(); // Stop any movement, allows to kill any other `scrollTo` still happening
this.startScrolling(); // Restart the scroll
// Start the animation loop
var start = Date.now();
var loop = function loop() {
var p = (Date.now() - start) / duration; // Animation progress
if (p > 1) {
// Animation ends
render(1);
_this9.animatingScroll = false;
if (duration == 0) _this9.update();
if (callback) callback();
} else {
_this9.scrollToRaf = requestAnimationFrame(loop);
render(easing(p));
}
};
loop();
}
}, {
key: "update",
value: function update() {
this.setScrollLimit();
this.addSections();
this.addElements();
this.detectElements();
this.updateScroll();
this.transformElements(true);
this.reinitScrollBar();
this.checkScroll(true);
}
}, {
key: "startScroll",
value: function startScroll() {
this.stop = false;
}
}, {
key: "stopScroll",
value: function stopScroll() {
this.stop = true;
}
}, {
key: "setScroll",
value: function setScroll(x, y) {
this.instance = _objectSpread2(_objectSpread2({}, this.instance), {}, {
scroll: {
x: x,
y: y
},
delta: {
x: x,
y: y
},
speed: 0
});
}
}, {
key: "destroy",
value: function destroy() {
_get(_getPrototypeOf(_default.prototype), "destroy", this).call(this);
this.stopScrolling();
this.html.classList.remove(this.smoothClass);
this.vs.destroy();
this.destroyScrollBar();
window.removeEventListener('keydown', this.checkKey, false);
}
}]);
return _default;
}(_default);
var Smooth = /*#__PURE__*/function () {
function Smooth() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Smooth);
this.options = options; // Override default options with given ones
Object.assign(this, defaults, options);
this.smartphone = defaults.smartphone;
if (options.smartphone) Object.assign(this.smartphone, options.smartphone);
this.tablet = defaults.tablet;
if (options.tablet) Object.assign(this.tablet, options.tablet);
if (!this.smooth && this.direction == 'horizontal') console.warn('🚨 `smooth:false` & `horizontal` direction are not yet compatible');
if (!this.tablet.smooth && this.tablet.direction == 'horizontal') console.warn('🚨 `smooth:false` & `horizontal` direction are not yet compatible (tablet)');
if (!this.smartphone.smooth && this.smartphone.direction == 'horizontal') console.warn('🚨 `smooth:false` & `horizontal` direction are not yet compatible (smartphone)');
this.init();
}
_createClass(Smooth, [{
key: "init",
value: function init() {
this.options.isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 || window.innerWidth < this.tablet.breakpoint;
this.options.isTablet = this.options.isMobile && window.innerWidth >= this.tablet.breakpoint;
if (this.smooth && !this.options.isMobile || this.tablet.smooth && this.options.isTablet || this.smartphone.smooth && this.options.isMobile && !this.options.isTablet) {
this.scroll = new _default$2(this.options);
} else {
this.scroll = new _default$1(this.options);
}
this.scroll.init();
if (window.location.hash) {
// Get the hash without the '#' and find the matching element
var id = window.location.hash.slice(1, window.location.hash.length);
var target = document.getElementById(id); // If found, scroll to the element
if (target) this.scroll.scrollTo(target);
}
}
}, {
key: "update",
value: function update() {
this.scroll.update();
}
}, {
key: "start",
value: function start() {
this.scroll.startScroll();
}
}, {
key: "stop",
value: function stop() {
this.scroll.stopScroll();
}
}, {
key: "scrollTo",
value: function scrollTo(target, options) {
this.scroll.scrollTo(target, options);
}
}, {
key: "setScroll",
value: function setScroll(x, y) {
this.scroll.setScroll(x, y);
}
}, {
key: "on",
value: function on(event, func) {
this.scroll.setEvents(event, func);
}
}, {
key: "off",
value: function off(event, func) {
this.scroll.unsetEvents(event, func);
}
}, {
key: "destroy",
value: function destroy() {
this.scroll.destroy();
}
}]);
return Smooth;
}();
return Smooth;
})));
!function() {
"use strict";
function t(t, e) {
if (!(t instanceof e))
throw new TypeError("Cannot call a class as a function")
}
function e(t, e) {
for (var i = 0; i < e.length; i++) {
var s = e[i];
s.enumerable = s.enumerable || !1,
s.configurable = !0,
"value"in s && (s.writable = !0),
Object.defineProperty(t, s.key, s)
}
}
function i(t, i, s) {
return i && e(t.prototype, i),
s && e(t, s),
t
}
function s(t, e, i) {
return e in t ? Object.defineProperty(t, e, {
value: i,
enumerable: !0,
configurable: !0,
writable: !0
}) : t[e] = i,
t
}
function n(t, e) {
var i = Object.keys(t);
if (Object.getOwnPropertySymbols) {
var s = Object.getOwnPropertySymbols(t);
e && (s = s.filter((function(e) {
return Object.getOwnPropertyDescriptor(t, e).enumerable
}
))),
i.push.apply(i, s)
}
return i
}
function o(t) {
for (var e = 1; e < arguments.length; e++) {
var i = null != arguments[e] ? arguments[e] : {};
e % 2 ? n(Object(i), !0).forEach((function(e) {
s(t, e, i[e])
}
)) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(i)) : n(Object(i)).forEach((function(e) {
Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(i, e))
}
))
}
return t
}
function l(t, e) {
if ("function" != typeof e && null !== e)
throw new TypeError("Super expression must either be null or a function");
t.prototype = Object.create(e && e.prototype, {
constructor: {
value: t,
writable: !0,
configurable: !0
}
}),
e && a(t, e)
}
function r(t) {
return (r = Object.setPrototypeOf ? Object.getPrototypeOf : function(t) {
return t.__proto__ || Object.getPrototypeOf(t)
}
)(t)
}
function a(t, e) {
return (a = Object.setPrototypeOf || function(t, e) {
return t.__proto__ = e,
t
}
)(t, e)
}
function c(t) {
if (void 0 === t)
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
return t
}
function h(t, e) {
return !e || "object" != typeof e && "function" != typeof e ? c(t) : e
}
function d(t) {
var e = function() {
if ("undefined" == typeof Reflect || !Reflect.construct)
return !1;
if (Reflect.construct.sham)
return !1;
if ("function" == typeof Proxy)
return !0;
try {
return Date.prototype.toString.call(Reflect.construct(Date, [], (function() {}
))),
!0
} catch (t) {
return !1
}
}();
return function() {
var i, s = r(t);
if (e) {
var n = r(this).constructor;
i = Reflect.construct(s, arguments, n)
} else
i = s.apply(this, arguments);
return h(this, i)
}
}
function u(t, e, i) {
return (u = "undefined" != typeof Reflect && Reflect.get ? Reflect.get : function(t, e, i) {
var s = function(t, e) {
for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = r(t)); )
;
return t
}(t, e);
if (s) {
var n = Object.getOwnPropertyDescriptor(s, e);
return n.get ? n.get.call(i) : n.value
}
}
)(t, e, i || t)
}
function f(t, e) {
return function(t) {
if (Array.isArray(t))
return t
}(t) || function(t, e) {
if ("undefined" == typeof Symbol || !(Symbol.iterator in Object(t)))
return;
var i = []
, s = !0
, n = !1
, o = void 0;
try {
for (var l, r = t[Symbol.iterator](); !(s = (l = r.next()).done) && (i.push(l.value),
!e || i.length !== e); s = !0)
;
} catch (t) {
n = !0,
o = t
} finally {
try {
s || null == r.return || r.return()
} finally {
if (n)
throw o
}
}
return i
}(t, e) || m(t, e) || function() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
}()
}
function p(t) {
return function(t) {
if (Array.isArray(t))
return v(t)
}(t) || function(t) {
if ("undefined" != typeof Symbol && Symbol.iterator in Object(t))
return Array.from(t)
}(t) || m(t) || function() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
}()
}
function m(t, e) {
if (t) {
if ("string" == typeof t)
return v(t, e);
var i = Object.prototype.toString.call(t).slice(8, -1);
return "Object" === i && t.constructor && (i = t.constructor.name),
"Map" === i || "Set" === i ? Array.from(t) : "Arguments" === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) ? v(t, e) : void 0
}
}
function v(t, e) {
(null == e || e > t.length) && (e = t.length);
for (var i = 0, s = new Array(e); i < e; i++)
s[i] = t[i];
return s
}
var y = {
el: document,
name: "scroll",
offset: [0, 0],
repeat: !1,
smooth: !1,
initPosition: {
x: 0,
y: 0
},
direction: "vertical",
gestureDirection: "vertical",
reloadOnContextChange: !1,
lerp: .1,
class: "trm-active-el",
scrollbarContainer: !1,
scrollbarClass: "c-scrollbar",
scrollingClass: "has-scroll-scrolling",
draggingClass: "has-scroll-dragging",
smoothClass: "has-scroll-smooth",
initClass: "has-scroll-init",
getSpeed: !1,
getDirection: !1,
scrollFromAnywhere: !1,
multiplier: 1,
firefoxMultiplier: 50,
touchMultiplier: 2,
resetNativeScroll: !0,
tablet: {
smooth: !1,
direction: "vertical",
gestureDirection: "vertical",
breakpoint: 1024
},
smartphone: {
smooth: !1,
direction: "vertical",
gestureDirection: "vertical"
}
}
, g = function() {
function e() {
var i = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
t(this, e),
Object.assign(this, y, i),
this.smartphone = y.smartphone,
i.smartphone && Object.assign(this.smartphone, i.smartphone),
this.tablet = y.tablet,
i.tablet && Object.assign(this.tablet, i.tablet),
this.namespace = "locomotive",
this.html = document.documentElement,
this.windowHeight = window.innerHeight,
this.windowWidth = window.innerWidth,
this.windowMiddle = {
x: this.windowWidth / 2,
y: this.windowHeight / 2
},
this.els = {},
this.currentElements = {},
this.listeners = {},
this.hasScrollTicking = !1,
this.hasCallEventSet = !1,
this.checkScroll = this.checkScroll.bind(this),
this.checkResize = this.checkResize.bind(this),
this.checkEvent = this.checkEvent.bind(this),
this.instance = {
scroll: {
x: 0,
y: 0
},
limit: {
x: this.html.offsetWidth,
y: this.html.offsetHeight
},
currentElements: this.currentElements
},
this.isMobile ? this.isTablet ? this.context = "tablet" : this.context = "smartphone" : this.context = "desktop",
this.isMobile && (this.direction = this[this.context].direction),
"horizontal" === this.direction ? this.directionAxis = "x" : this.directionAxis = "y",
this.getDirection && (this.instance.direction = null),
this.getDirection && (this.instance.speed = 0),
this.html.classList.add(this.initClass),
window.addEventListener("resize", this.checkResize, !1)
}
return i(e, [{
key: "init",
value: function() {
this.initEvents()
}
}, {
key: "checkScroll",
value: function() {
this.dispatchScroll()
}
}, {
key: "checkResize",
value: function() {
var t = this;
this.resizeTick || (this.resizeTick = !0,
requestAnimationFrame((function() {
t.resize(),
t.resizeTick = !1
}
)))
}
}, {
key: "resize",
value: function() {}
}, {
key: "checkContext",
value: function() {
if (this.reloadOnContextChange) {
this.isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1 || this.windowWidth < this.tablet.breakpoint,
this.isTablet = this.isMobile && this.windowWidth >= this.tablet.breakpoint;
var t = this.context;
if (this.isMobile ? this.isTablet ? this.context = "tablet" : this.context = "smartphone" : this.context = "desktop",
t != this.context)
("desktop" == t ? this.smooth : this[t].smooth) != ("desktop" == this.context ? this.smooth : this[this.context].smooth) && window.location.reload()
}
}
}, {
key: "initEvents",
value: function() {
var t = this;
this.scrollToEls = this.el.querySelectorAll("[data-".concat(this.name, "-to]")),
this.setScrollTo = this.setScrollTo.bind(this),
this.scrollToEls.forEach((function(e) {
e.addEventListener("click", t.setScrollTo, !1)
}
))
}
}, {
key: "setScrollTo",
value: function(t) {
t.preventDefault(),
this.scrollTo(t.currentTarget.getAttribute("data-".concat(this.name, "-href")) || t.currentTarget.getAttribute("href"), {
offset: t.currentTarget.getAttribute("data-".concat(this.name, "-offset"))
})
}
}, {
key: "addElements",
value: function() {}
}, {
key: "detectElements",
value: function(t) {
var e = this
, i = this.instance.scroll.y
, s = i + this.windowHeight
, n = this.instance.scroll.x
, o = n + this.windowWidth;
Object.entries(this.els).forEach((function(l) {
var r = f(l, 2)
, a = r[0]
, c = r[1];
if (!c || c.inView && !t || ("horizontal" === e.direction ? o >= c.left && n < c.right && e.setInView(c, a) : s >= c.top && i < c.bottom && e.setInView(c, a)),
c && c.inView)
if ("horizontal" === e.direction) {
var h = c.right - c.left;
c.progress = (e.instance.scroll.x - (c.left - e.windowWidth)) / (h + e.windowWidth),
(o < c.left || n > c.right) && e.setOutOfView(c, a)
} else {
var d = c.bottom - c.top;
c.progress = (e.instance.scroll.y - (c.top - e.windowHeight)) / (d + e.windowHeight),
(s < c.top || i > c.bottom) && e.setOutOfView(c, a)
}
}
)),
this.hasScrollTicking = !1
}
}, {
key: "setInView",
value: function(t, e) {
this.els[e].inView = !0,
t.el.classList.add(t.class),
this.currentElements[e] = t,
t.call && this.hasCallEventSet && (this.dispatchCall(t, "enter"),
t.repeat || (this.els[e].call = !1))
}
}, {
key: "setOutOfView",
value: function(t, e) {
var i = this;
this.els[e].inView = !1,
Object.keys(this.currentElements).forEach((function(t) {
t === e && delete i.currentElements[t]
}
)),
t.call && this.hasCallEventSet && this.dispatchCall(t, "exit"),
t.repeat && t.el.classList.remove(t.class)
}
}, {
key: "dispatchCall",
value: function(t, e) {
this.callWay = e,
this.callValue = t.call.split(",").map((function(t) {
return t.trim()
}
)),
this.callObj = t,
1 == this.callValue.length && (this.callValue = this.callValue[0]);
var i = new Event(this.namespace + "call");
this.el.dispatchEvent(i)
}
}, {
key: "dispatchScroll",
value: function() {
var t = new Event(this.namespace + "scroll");
this.el.dispatchEvent(t)
}
}, {
key: "setEvents",
value: function(t, e) {
this.listeners[t] || (this.listeners[t] = []);
var i = this.listeners[t];
i.push(e),
1 === i.length && this.el.addEventListener(this.namespace + t, this.checkEvent, !1),
"call" === t && (this.hasCallEventSet = !0,
this.detectElements(!0))
}
}, {
key: "unsetEvents",
value: function(t, e) {
if (this.listeners[t]) {
var i = this.listeners[t]
, s = i.indexOf(e);
s < 0 || (i.splice(s, 1),
0 === i.index && this.el.removeEventListener(this.namespace + t, this.checkEvent, !1))
}
}
}, {
key: "checkEvent",
value: function(t) {
var e = this
, i = t.type.replace(this.namespace, "")
, s = this.listeners[i];
s && 0 !== s.length && s.forEach((function(t) {
switch (i) {
case "scroll":
return t(e.instance);
case "call":
return t(e.callValue, e.callWay, e.callObj);
default:
return t()
}
}
))
}
}, {
key: "startScroll",
value: function() {}
}, {
key: "stopScroll",
value: function() {}
}, {
key: "setScroll",
value: function(t, e) {
this.instance.scroll = {
x: 0,
y: 0
}
}
}, {
key: "destroy",
value: function() {
var t = this;
window.removeEventListener("resize", this.checkResize, !1),
Object.keys(this.listeners).forEach((function(e) {
t.el.removeEventListener(t.namespace + e, t.checkEvent, !1)
}
)),
this.listeners = {},
this.scrollToEls.forEach((function(e) {
e.removeEventListener("click", t.setScrollTo, !1)
}
)),
this.html.classList.remove(this.initClass)
}
}]),
e
}()
, b = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {};
function w(t, e) {
return t(e = {
exports: {}
}, e.exports),
e.exports
}
var x = w((function(t, e) {
t.exports = {
polyfill: function() {
var t = window
, e = document;
if (!("scrollBehavior"in e.documentElement.style) || !0 === t.__forceSmoothScrollPolyfill__) {
var i, s = t.HTMLElement || t.Element, n = {
scroll: t.scroll || t.scrollTo,
scrollBy: t.scrollBy,
elementScroll: s.prototype.scroll || r,
scrollIntoView: s.prototype.scrollIntoView
}, o = t.performance && t.performance.now ? t.performance.now.bind(t.performance) : Date.now, l = (i = t.navigator.userAgent,
new RegExp(["MSIE ", "Trident/", "Edge/"].join("|")).test(i) ? 1 : 0);
t.scroll = t.scrollTo = function() {
void 0 !== arguments[0] && (!0 !== a(arguments[0]) ? p.call(t, e.body, void 0 !== arguments[0].left ? ~~arguments[0].left : t.scrollX || t.pageXOffset, void 0 !== arguments[0].top ? ~~arguments[0].top : t.scrollY || t.pageYOffset) : n.scroll.call(t, void 0 !== arguments[0].left ? arguments[0].left : "object" != typeof arguments[0] ? arguments[0] : t.scrollX || t.pageXOffset, void 0 !== arguments[0].top ? arguments[0].top : void 0 !== arguments[1] ? arguments[1] : t.scrollY || t.pageYOffset))
}
,
t.scrollBy = function() {
void 0 !== arguments[0] && (a(arguments[0]) ? n.scrollBy.call(t, void 0 !== arguments[0].left ? arguments[0].left : "object" != typeof arguments[0] ? arguments[0] : 0, void 0 !== arguments[0].top ? arguments[0].top : void 0 !== arguments[1] ? arguments[1] : 0) : p.call(t, e.body, ~~arguments[0].left + (t.scrollX || t.pageXOffset), ~~arguments[0].top + (t.scrollY || t.pageYOffset)))
}
,
s.prototype.scroll = s.prototype.scrollTo = function() {
if (void 0 !== arguments[0])
if (!0 !== a(arguments[0])) {
var t = arguments[0].left
, e = arguments[0].top;
p.call(this, this, void 0 === t ? this.scrollLeft : ~~t, void 0 === e ? this.scrollTop : ~~e)
} else {
if ("number" == typeof arguments[0] && void 0 === arguments[1])
throw new SyntaxError("Value could not be converted");
n.elementScroll.call(this, void 0 !== arguments[0].left ? ~~arguments[0].left : "object" != typeof arguments[0] ? ~~arguments[0] : this.scrollLeft, void 0 !== arguments[0].top ? ~~arguments[0].top : void 0 !== arguments[1] ? ~~arguments[1] : this.scrollTop)
}
}
,
s.prototype.scrollBy = function() {
void 0 !== arguments[0] && (!0 !== a(arguments[0]) ? this.scroll({
left: ~~arguments[0].left + this.scrollLeft,
top: ~~arguments[0].top + this.scrollTop,
behavior: arguments[0].behavior
}) : n.elementScroll.call(this, void 0 !== arguments[0].left ? ~~arguments[0].left + this.scrollLeft : ~~arguments[0] + this.scrollLeft, void 0 !== arguments[0].top ? ~~arguments[0].top + this.scrollTop : ~~arguments[1] + this.scrollTop))
}
,
s.prototype.scrollIntoView = function() {
if (!0 !== a(arguments[0])) {
var i = u(this)
, s = i.getBoundingClientRect()
, o = this.getBoundingClientRect();
i !== e.body ? (p.call(this, i, i.scrollLeft + o.left - s.left, i.scrollTop + o.top - s.top),
"fixed" !== t.getComputedStyle(i).position && t.scrollBy({
left: s.left,
top: s.top,
behavior: "smooth"
})) : t.scrollBy({
left: o.left,
top: o.top,
behavior: "smooth"
})
} else
n.scrollIntoView.call(this, void 0 === arguments[0] || arguments[0])
}
}
function r(t, e) {
this.scrollLeft = t,
this.scrollTop = e
}
function a(t) {
if (null === t || "object" != typeof t || void 0 === t.behavior || "auto" === t.behavior || "instant" === t.behavior)
return !0;
if ("object" == typeof t && "smooth" === t.behavior)
return !1;
throw new TypeError("behavior member of ScrollOptions " + t.behavior + " is not a valid value for enumeration ScrollBehavior.")
}
function c(t, e) {
return "Y" === e ? t.clientHeight + l < t.scrollHeight : "X" === e ? t.clientWidth + l < t.scrollWidth : void 0
}
function h(e, i) {
var s = t.getComputedStyle(e, null)["overflow" + i];
return "auto" === s || "scroll" === s
}
function d(t) {
var e = c(t, "Y") && h(t, "Y")
, i = c(t, "X") && h(t, "X");
return e || i
}
function u(t) {
for (; t !== e.body && !1 === d(t); )
t = t.parentNode || t.host;
return t
}
function f(e) {
var i, s, n, l, r = (o() - e.startTime) / 468;
l = r = r > 1 ? 1 : r,
i = .5 * (1 - Math.cos(Math.PI * l)),
s = e.startX + (e.x - e.startX) * i,
n = e.startY + (e.y - e.startY) * i,
e.method.call(e.scrollable, s, n),
s === e.x && n === e.y || t.requestAnimationFrame(f.bind(t, e))
}
function p(i, s, l) {
var a, c, h, d, u = o();
i === e.body ? (a = t,
c = t.scrollX || t.pageXOffset,
h = t.scrollY || t.pageYOffset,
d = n.scroll) : (a = i,
c = i.scrollLeft,
h = i.scrollTop,
d = r),
f({
scrollable: a,
method: d,
startTime: u,
startX: c,
startY: h,
x: s,
y: l
})
}
}
}
}
))
, S = (x.polyfill,
function(e) {
l(n, e);
var s = d(n);
function n() {
var e, i = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
return t(this, n),
(e = s.call(this, i)).resetNativeScroll && (history.scrollRestoration && (history.scrollRestoration = "manual"),
window.scrollTo(0, 0)),
window.addEventListener("scroll", e.checkScroll, !1),
void 0 === window.smoothscrollPolyfill && (window.smoothscrollPolyfill = x,
window.smoothscrollPolyfill.polyfill()),
e
}
return i(n, [{
key: "init",
value: function() {
this.instance.scroll.y = window.pageYOffset,
this.addElements(),
this.detectElements(),
u(r(n.prototype), "init", this).call(this)
}
}, {
key: "checkScroll",
value: function() {
var t = this;
u(r(n.prototype), "checkScroll", this).call(this),
this.getDirection && this.addDirection(),
this.getSpeed && (this.addSpeed(),
this.speedTs = Date.now()),
this.instance.scroll.y = window.pageYOffset,
Object.entries(this.els).length && (this.hasScrollTicking || (requestAnimationFrame((function() {
t.detectElements()
}
)),
this.hasScrollTicking = !0))
}
}, {
key: "addDirection",
value: function() {
window.pageYOffset > this.instance.scroll.y ? "down" !== this.instance.direction && (this.instance.direction = "down") : window.pageYOffset < this.instance.scroll.y && "up" !== this.instance.direction && (this.instance.direction = "up")
}
}, {
key: "addSpeed",
value: function() {
window.pageYOffset != this.instance.scroll.y ? this.instance.speed = (window.pageYOffset - this.instance.scroll.y) / Math.max(1, Date.now() - this.speedTs) : this.instance.speed = 0
}
}, {
key: "resize",
value: function() {
Object.entries(this.els).length && (this.windowHeight = window.innerHeight,
this.updateElements())
}
}, {
key: "addElements",
value: function() {
var t = this;
this.els = {},
this.el.querySelectorAll("[data-" + this.name + "]").forEach((function(e, i) {
e.getBoundingClientRect();
var s, n, o, l = e.dataset[t.name + "Class"] || t.class, r = "string" == typeof e.dataset[t.name + "Id"] ? e.dataset[t.name + "Id"] : i, a = "string" == typeof e.dataset[t.name + "Offset"] ? e.dataset[t.name + "Offset"].split(",") : t.offset, c = e.dataset[t.name + "Repeat"], h = e.dataset[t.name + "Call"], d = e.dataset[t.name + "Target"], u = (o = void 0 !== d ? document.querySelector("".concat(d)) : e).getBoundingClientRect();
s = u.top + t.instance.scroll.y,
n = u.left + t.instance.scroll.x;
var f = s + o.offsetHeight
, p = n + o.offsetWidth;
c = "false" != c && (null != c || t.repeat);
var m = t.getRelativeOffset(a)
, v = {
el: e,
targetEl: o,
id: r,
class: l,
top: s += m[0],
bottom: f -= m[1],
left: n,
right: p,
offset: a,
progress: 0,
repeat: c,
inView: !1,
call: h
};
t.els[r] = v,
e.classList.contains(l) && t.setInView(t.els[r], r)
}
))
}
}, {
key: "updateElements",
value: function() {
var t = this;
Object.entries(this.els).forEach((function(e) {
var i = f(e, 2)
, s = i[0]
, n = i[1]
, o = n.targetEl.getBoundingClientRect().top + t.instance.scroll.y
, l = o + n.targetEl.offsetHeight
, r = t.getRelativeOffset(n.offset);
t.els[s].top = o + r[0],
t.els[s].bottom = l - r[1]
}
)),
this.hasScrollTicking = !1
}
}, {
key: "getRelativeOffset",
value: function(t) {
var e = [0, 0];
if (t)
for (var i = 0; i < t.length; i++)
"string" == typeof t[i] ? t[i].includes("%") ? e[i] = parseInt(t[i].replace("%", "") * this.windowHeight / 100) : e[i] = parseInt(t[i]) : e[i] = t[i];
return e
}
}, {
key: "scrollTo",
value: function(t) {
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, i = parseInt(e.offset) || 0
, s = !!e.callback && e.callback;
if ("string" == typeof t) {
if ("top" === t)
t = this.html;
else if ("bottom" === t)
t = this.html.offsetHeight - window.innerHeight;
else if (!(t = document.querySelector(t)))
return
} else if ("number" == typeof t)
t = parseInt(t);
else if (!t || !t.tagName)
return void console.warn("`target` parameter is not valid");
i = "number" != typeof t ? t.getBoundingClientRect().top + i + this.instance.scroll.y : t + i;
var n = function() {
return parseInt(window.pageYOffset) === parseInt(i)
};
if (s) {
if (n())
return void s();
var o = function t() {
n() && (window.removeEventListener("scroll", t),
s())
};
window.addEventListener("scroll", o)
}
window.scrollTo({
top: i,
behavior: "smooth"
})
}
}, {
key: "update",
value: function() {
this.addElements(),
this.detectElements()
}
}, {
key: "destroy",
value: function() {
u(r(n.prototype), "destroy", this).call(this),
window.removeEventListener("scroll", this.checkScroll, !1)
}
}]),
n
}(g))
, k = Object.getOwnPropertySymbols
, T = Object.prototype.hasOwnProperty
, E = Object.prototype.propertyIsEnumerable;
function A(t) {
if (null == t)
throw new TypeError("Object.assign cannot be called with null or undefined");
return Object(t)
}
var O = function() {
try {
if (!Object.assign)
return !1;
var t = new String("abc");
if (t[5] = "de",
"5" === Object.getOwnPropertyNames(t)[0])
return !1;
for (var e = {}, i = 0; i < 10; i++)
e["_" + String.fromCharCode(i)] = i;
if ("0123456789" !== Object.getOwnPropertyNames(e).map((function(t) {
return e[t]
}
)).join(""))
return !1;
var s = {};
return "abcdefghijklmnopqrst".split("").forEach((function(t) {
s[t] = t
}
)),
"abcdefghijklmnopqrst" === Object.keys(Object.assign({}, s)).join("")
} catch (t) {
return !1
}
}() ? Object.assign : function(t, e) {
for (var i, s, n = A(t), o = 1; o < arguments.length; o++) {
for (var l in i = Object(arguments[o]))
T.call(i, l) && (n[l] = i[l]);
if (k) {
s = k(i);
for (var r = 0; r < s.length; r++)
E.call(i, s[r]) && (n[s[r]] = i[s[r]])
}
}
return n
}
;
function C() {}
C.prototype = {
on: function(t, e, i) {
var s = this.e || (this.e = {});
return (s[t] || (s[t] = [])).push({
fn: e,
ctx: i
}),
this
},
once: function(t, e, i) {
var s = this;
function n() {
s.off(t, n),
e.apply(i, arguments)
}
return n._ = e,
this.on(t, n, i)
},
emit: function(t) {
for (var e = [].slice.call(arguments, 1), i = ((this.e || (this.e = {}))[t] || []).slice(), s = 0, n = i.length; s < n; s++)
i[s].fn.apply(i[s].ctx, e);
return this
},
off: function(t, e) {
var i = this.e || (this.e = {})
, s = i[t]
, n = [];
if (s && e)
for (var o = 0, l = s.length; o < l; o++)
s[o].fn !== e && s[o].fn._ !== e && n.push(s[o]);
return n.length ? i[t] = n : delete i[t],
this
}
};
var D = C
, L = w((function(t, e) {
(function() {
(null !== e ? e : this).Lethargy = function() {
function t(t, e, i, s) {
this.stability = null != t ? Math.abs(t) : 8,
this.sensitivity = null != e ? 1 + Math.abs(e) : 100,
this.tolerance = null != i ? 1 + Math.abs(i) : 1.1,
this.delay = null != s ? s : 150,
this.lastUpDeltas = function() {
var t, e, i;
for (i = [],
t = 1,
e = 2 * this.stability; 1 <= e ? t <= e : t >= e; 1 <= e ? t++ : t--)
i.push(null);
return i
}
.call(this),
this.lastDownDeltas = function() {
var t, e, i;
for (i = [],
t = 1,
e = 2 * this.stability; 1 <= e ? t <= e : t >= e; 1 <= e ? t++ : t--)
i.push(null);
return i
}
.call(this),
this.deltasTimestamp = function() {
var t, e, i;
for (i = [],
t = 1,
e = 2 * this.stability; 1 <= e ? t <= e : t >= e; 1 <= e ? t++ : t--)
i.push(null);
return i
}
.call(this)
}
return t.prototype.check = function(t) {
var e;
return null != (t = t.originalEvent || t).wheelDelta ? e = t.wheelDelta : null != t.deltaY ? e = -40 * t.deltaY : null == t.detail && 0 !== t.detail || (e = -40 * t.detail),
this.deltasTimestamp.push(Date.now()),
this.deltasTimestamp.shift(),
e > 0 ? (this.lastUpDeltas.push(e),
this.lastUpDeltas.shift(),
this.isInertia(1)) : (this.lastDownDeltas.push(e),
this.lastDownDeltas.shift(),
this.isInertia(-1))
}
,
t.prototype.isInertia = function(t) {
var e, i, s, n, o, l, r;
return null === (e = -1 === t ? this.lastDownDeltas : this.lastUpDeltas)[0] ? t : !(this.deltasTimestamp[2 * this.stability - 2] + this.delay > Date.now() && e[0] === e[2 * this.stability - 1]) && (s = e.slice(0, this.stability),
i = e.slice(this.stability, 2 * this.stability),
r = s.reduce((function(t, e) {
return t + e
}
)),
o = i.reduce((function(t, e) {
return t + e
}
)),
l = r / s.length,
n = o / i.length,
Math.abs(l) < Math.abs(n * this.tolerance) && this.sensitivity < Math.abs(n) && t)
}
,
t.prototype.showLastUpDeltas = function() {
return this.lastUpDeltas
}
,
t.prototype.showLastDownDeltas = function() {
return this.lastDownDeltas
}
,
t
}()
}
).call(b)
}
))
, M = {
hasWheelEvent: "onwheel"in document,
hasMouseWheelEvent: "onmousewheel"in document,
hasTouch: "ontouchstart"in window || window.TouchEvent || window.DocumentTouch && document instanceof DocumentTouch,
hasTouchWin: navigator.msMaxTouchPoints && navigator.msMaxTouchPoints > 1,
hasPointer: !!window.navigator.msPointerEnabled,
hasKeyDown: "onkeydown"in document,
isFirefox: navigator.userAgent.indexOf("Firefox") > -1
}
, j = Object.prototype.toString
, _ = Object.prototype.hasOwnProperty;
function B(t, e) {
return function() {
return t.apply(e, arguments)
}
}
var W = L.Lethargy
, H = "virtualscroll"
, R = V
, P = 37
, Y = 38
, I = 39
, z = 40
, X = 32;
function V(t) {
!function(t) {
if (!t)
return console.warn("bindAll requires at least one argument.");
var e = Array.prototype.slice.call(arguments, 1);
if (0 === e.length)
for (var i in t)
_.call(t, i) && "function" == typeof t[i] && "[object Function]" == j.call(t[i]) && e.push(i);
for (var s = 0; s < e.length; s++) {
var n = e[s];
t[n] = B(t[n], t)
}
}(this, "_onWheel", "_onMouseWheel", "_onTouchStart", "_onTouchMove", "_onKeyDown"),
this.el = window,
t && t.el && (this.el = t.el,
delete t.el),
this.options = O({
mouseMultiplier: 1,
touchMultiplier: 2,
firefoxMultiplier: 15,
keyStep: 120,
preventTouch: !1,
unpreventTouchClass: "vs-touchmove-allowed",
limitInertia: !1,
useKeyboard: !0,
useTouch: !0
}, t),
this.options.limitInertia && (this._lethargy = new W),
this._emitter = new D,
this._event = {
y: 0,
x: 0,
deltaX: 0,
deltaY: 0
},
this.touchStartX = null,
this.touchStartY = null,
this.bodyTouchAction = null,
void 0 !== this.options.passive && (this.listenerOptions = {
passive: this.options.passive
})
}
function F(t, e, i) {
return (1 - i) * t + i * e
}
function q(t) {
var e = {};
if (window.getComputedStyle) {
var i = getComputedStyle(t)
, s = i.transform || i.webkitTransform || i.mozTransform
, n = s.match(/^matrix3d\((.+)\)$/);
return n ? (e.x = n ? parseFloat(n[1].split(", ")[12]) : 0,
e.y = n ? parseFloat(n[1].split(", ")[13]) : 0) : (n = s.match(/^matrix\((.+)\)$/),
e.x = n ? parseFloat(n[1].split(", ")[4]) : 0,
e.y = n ? parseFloat(n[1].split(", ")[5]) : 0),
e
}
}
function K(t) {
for (var e = []; t && t !== document; t = t.parentNode)
e.push(t);
return e
}
V.prototype._notify = function(t) {
var e = this._event;
e.x += e.deltaX,
e.y += e.deltaY,
this._emitter.emit(H, {
x: e.x,
y: e.y,
deltaX: e.deltaX,
deltaY: e.deltaY,
originalEvent: t
})
}
,
V.prototype._onWheel = function(t) {
var e = this.options;
if (!this._lethargy || !1 !== this._lethargy.check(t)) {
var i = this._event;
i.deltaX = t.wheelDeltaX || -1 * t.deltaX,
i.deltaY = t.wheelDeltaY || -1 * t.deltaY,
M.isFirefox && 1 == t.deltaMode && (i.deltaX *= e.firefoxMultiplier,
i.deltaY *= e.firefoxMultiplier),
i.deltaX *= e.mouseMultiplier,
i.deltaY *= e.mouseMultiplier,
this._notify(t)
}
}
,
V.prototype._onMouseWheel = function(t) {
if (!this.options.limitInertia || !1 !== this._lethargy.check(t)) {
var e = this._event;
e.deltaX = t.wheelDeltaX ? t.wheelDeltaX : 0,
e.deltaY = t.wheelDeltaY ? t.wheelDeltaY : t.wheelDelta,
this._notify(t)
}
}
,
V.prototype._onTouchStart = function(t) {
var e = t.targetTouches ? t.targetTouches[0] : t;
this.touchStartX = e.pageX,
this.touchStartY = e.pageY
}
,
V.prototype._onTouchMove = function(t) {
var e = this.options;
e.preventTouch && !t.target.classList.contains(e.unpreventTouchClass) && t.preventDefault();
var i = this._event
, s = t.targetTouches ? t.targetTouches[0] : t;
i.deltaX = (s.pageX - this.touchStartX) * e.touchMultiplier,
i.deltaY = (s.pageY - this.touchStartY) * e.touchMultiplier,
this.touchStartX = s.pageX,
this.touchStartY = s.pageY,
this._notify(t)
}
,
V.prototype._onKeyDown = function(t) {
var e = this._event;
e.deltaX = e.deltaY = 0;
var i = window.innerHeight - 40;
switch (t.keyCode) {
case P:
case Y:
e.deltaY = this.options.keyStep;
break;
case I:
case z:
e.deltaY = -this.options.keyStep;
break;
case t.shiftKey:
e.deltaY = i;
break;
case X:
e.deltaY = -i;
break;
default:
return
}
this._notify(t)
}
,
V.prototype._bind = function() {
M.hasWheelEvent && this.el.addEventListener("wheel", this._onWheel, this.listenerOptions),
M.hasMouseWheelEvent && this.el.addEventListener("mousewheel", this._onMouseWheel, this.listenerOptions),
M.hasTouch && this.options.useTouch && (this.el.addEventListener("touchstart", this._onTouchStart, this.listenerOptions),
this.el.addEventListener("touchmove", this._onTouchMove, this.listenerOptions)),
M.hasPointer && M.hasTouchWin && (this.bodyTouchAction = document.body.style.msTouchAction,
document.body.style.msTouchAction = "none",
this.el.addEventListener("MSPointerDown", this._onTouchStart, !0),
this.el.addEventListener("MSPointerMove", this._onTouchMove, !0)),
M.hasKeyDown && this.options.useKeyboard && document.addEventListener("keydown", this._onKeyDown)
}
,
V.prototype._unbind = function() {
M.hasWheelEvent && this.el.removeEventListener("wheel", this._onWheel),
M.hasMouseWheelEvent && this.el.removeEventListener("mousewheel", this._onMouseWheel),
M.hasTouch && (this.el.removeEventListener("touchstart", this._onTouchStart),
this.el.removeEventListener("touchmove", this._onTouchMove)),
M.hasPointer && M.hasTouchWin && (document.body.style.msTouchAction = this.bodyTouchAction,
this.el.removeEventListener("MSPointerDown", this._onTouchStart, !0),
this.el.removeEventListener("MSPointerMove", this._onTouchMove, !0)),
M.hasKeyDown && this.options.useKeyboard && document.removeEventListener("keydown", this._onKeyDown)
}
,
V.prototype.on = function(t, e) {
this._emitter.on(H, t, e);
var i = this._emitter.e;
i && i[H] && 1 === i[H].length && this._bind()
}
,
V.prototype.off = function(t, e) {
this._emitter.off(H, t, e);
var i = this._emitter.e;
(!i[H] || i[H].length <= 0) && this._unbind()
}
,
V.prototype.reset = function() {
var t = this._event;
t.x = 0,
t.y = 0
}
,
V.prototype.destroy = function() {
this._emitter.off(),
this._unbind()
}
;
var N = "function" == typeof Float32Array;
function U(t, e) {
return 1 - 3 * e + 3 * t
}
function $(t, e) {
return 3 * e - 6 * t
}
function G(t) {
return 3 * t
}
function J(t, e, i) {
return ((U(e, i) * t + $(e, i)) * t + G(e)) * t
}
function Q(t, e, i) {
return 3 * U(e, i) * t * t + 2 * $(e, i) * t + G(e)
}
function Z(t) {
return t
}
var tt = function(t, e, i, s) {
if (!(0 <= t && t <= 1 && 0 <= i && i <= 1))
throw new Error("bezier x values must be in [0, 1] range");
if (t === e && i === s)
return Z;
for (var n = N ? new Float32Array(11) : new Array(11), o = 0; o < 11; ++o)
n[o] = J(.1 * o, t, i);
function l(e) {
for (var s = 0, o = 1; 10 !== o && n[o] <= e; ++o)
s += .1;
--o;
var l = s + .1 * ((e - n[o]) / (n[o + 1] - n[o]))
, r = Q(l, t, i);
return r >= .001 ? function(t, e, i, s) {
for (var n = 0; n < 4; ++n) {
var o = Q(e, i, s);
if (0 === o)
return e;
e -= (J(e, i, s) - t) / o
}
return e
}(e, l, t, i) : 0 === r ? l : function(t, e, i, s, n) {
var o, l, r = 0;
do {
(o = J(l = e + (i - e) / 2, s, n) - t) > 0 ? i = l : e = l
} while (Math.abs(o) > 1e-7 && ++r < 10);
return l
}(e, s, s + .1, t, i)
}
return function(t) {
return 0 === t ? 0 : 1 === t ? 1 : J(l(t), e, s)
}
}
, et = 38
, it = 40
, st = 32
, nt = 9
, ot = 33
, lt = 34
, rt = 36
, at = 35
, ct = function(e) {
l(n, e);
var s = d(n);
function n() {
var e, i = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
return t(this, n),
history.scrollRestoration && (history.scrollRestoration = "manual"),
window.scrollTo(0, 0),
(e = s.call(this, i)).inertia && (e.lerp = .1 * e.inertia),
e.isScrolling = !1,
e.isDraggingScrollbar = !1,
e.isTicking = !1,
e.hasScrollTicking = !1,
e.parallaxElements = {},
e.stop = !1,
e.scrollbarContainer = i.scrollbarContainer,
e.checkKey = e.checkKey.bind(c(e)),
window.addEventListener("keydown", e.checkKey, !1),
e
}
return i(n, [{
key: "init",
value: function() {
var t = this;
this.html.classList.add(this.smoothClass),
this.html.setAttribute("data-".concat(this.name, "-direction"), this.direction),
this.instance = o({
delta: {
x: this.initPosition.x,
y: this.initPosition.y
},
scroll: {
x: this.initPosition.x,
y: this.initPosition.y
}
}, this.instance),
this.vs = new R({
el: this.scrollFromAnywhere ? document : this.el,
mouseMultiplier: navigator.platform.indexOf("Win") > -1 ? 1 : .4,
firefoxMultiplier: this.firefoxMultiplier,
touchMultiplier: this.touchMultiplier,
useKeyboard: !1,
passive: !0
}),
this.vs.on((function(e) {
t.stop || t.isDraggingScrollbar || requestAnimationFrame((function() {
t.updateDelta(e),
t.isScrolling || t.startScrolling()
}
))
}
)),
this.setScrollLimit(),
this.initScrollBar(),
this.addSections(),
this.addElements(),
this.checkScroll(!0),
this.transformElements(!0, !0),
u(r(n.prototype), "init", this).call(this)
}
}, {
key: "setScrollLimit",
value: function() {
if (this.instance.limit.y = this.el.offsetHeight - this.windowHeight,
"horizontal" === this.direction) {
for (var t = 0, e = this.el.children, i = 0; i < e.length; i++)
t += e[i].offsetWidth;
this.instance.limit.x = t - this.windowWidth
}
}
}, {
key: "startScrolling",
value: function() {
this.startScrollTs = Date.now(),
this.isScrolling = !0,
this.checkScroll(),
this.html.classList.add(this.scrollingClass)
}
}, {
key: "stopScrolling",
value: function() {
cancelAnimationFrame(this.checkScrollRaf),
this.scrollToRaf && (cancelAnimationFrame(this.scrollToRaf),
this.scrollToRaf = null),
this.isScrolling = !1,
this.instance.scroll.y = Math.round(this.instance.scroll.y),
this.html.classList.remove(this.scrollingClass)
}
}, {
key: "checkKey",
value: function(t) {
var e = this;
if (this.stop)
t.keyCode == nt && requestAnimationFrame((function() {
e.html.scrollTop = 0,
document.body.scrollTop = 0,
e.html.scrollLeft = 0,
document.body.scrollLeft = 0
}
));
else {
switch (t.keyCode) {
case nt:
requestAnimationFrame((function() {
e.html.scrollTop = 0,
document.body.scrollTop = 0,
e.html.scrollLeft = 0,
document.body.scrollLeft = 0,
e.scrollTo(document.activeElement, {
offset: -window.innerHeight / 2
})
}
));
break;
case et:
this.instance.delta[this.directionAxis] -= 240;
break;
case it:
this.instance.delta[this.directionAxis] += 240;
break;
case ot:
this.instance.delta[this.directionAxis] -= window.innerHeight;
break;
case lt:
this.instance.delta[this.directionAxis] += window.innerHeight;
break;
case rt:
this.instance.delta[this.directionAxis] -= this.instance.limit[this.directionAxis];
break;
case at:
this.instance.delta[this.directionAxis] += this.instance.limit[this.directionAxis];
break;
case st:
document.activeElement instanceof HTMLInputElement || document.activeElement instanceof HTMLTextAreaElement || (t.shiftKey ? this.instance.delta[this.directionAxis] -= window.innerHeight : this.instance.delta[this.directionAxis] += window.innerHeight);
break;
default:
return
}
this.instance.delta[this.directionAxis] < 0 && (this.instance.delta[this.directionAxis] = 0),
this.instance.delta[this.directionAxis] > this.instance.limit[this.directionAxis] && (this.instance.delta[this.directionAxis] = this.instance.limit[this.directionAxis]),
this.stopScrolling(),
this.isScrolling = !0,
this.checkScroll(),
this.html.classList.add(this.scrollingClass)
}
}
}, {
key: "checkScroll",
value: function() {
var t = this
, e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0];
if (e || this.isScrolling || this.isDraggingScrollbar) {
this.hasScrollTicking || (this.checkScrollRaf = requestAnimationFrame((function() {
return t.checkScroll()
}
)),
this.hasScrollTicking = !0),
this.updateScroll();
var i = Math.abs(this.instance.delta[this.directionAxis] - this.instance.scroll[this.directionAxis])
, s = Date.now() - this.startScrollTs;
if (!this.animatingScroll && s > 100 && (i < .5 && 0 != this.instance.delta[this.directionAxis] || i < .5 && 0 == this.instance.delta[this.directionAxis]) && this.stopScrolling(),
Object.entries(this.sections).forEach((function(i) {
var s = f(i, 2)
, n = (s[0],
s[1]);
n.persistent || t.instance.scroll[t.directionAxis] > n.offset[t.directionAxis] && t.instance.scroll[t.directionAxis] < n.limit[t.directionAxis] ? ("horizontal" === t.direction ? t.transform(n.el, -t.instance.scroll[t.directionAxis], 0) : t.transform(n.el, 0, -t.instance.scroll[t.directionAxis]),
n.inView || (n.inView = !0,
n.el.style.opacity = 1,
n.el.style.pointerEvents = "all",
n.el.setAttribute("data-".concat(t.name, "-section-inview"), ""))) : ((n.inView || e) && (n.inView = !1,
n.el.style.opacity = 0,
n.el.style.pointerEvents = "none",
n.el.removeAttribute("data-".concat(t.name, "-section-inview"))),
t.transform(n.el, 0, 0))
}
)),
this.getDirection && this.addDirection(),
this.getSpeed && (this.addSpeed(),
this.speedTs = Date.now()),
this.detectElements(),
this.transformElements(),
this.hasScrollbar) {
var o = this.instance.scroll[this.directionAxis] / this.instance.limit[this.directionAxis] * this.scrollBarLimit[this.directionAxis];
"horizontal" === this.direction ? this.transform(this.scrollbarThumb, o, 0) : this.transform(this.scrollbarThumb, 0, o)
}
u(r(n.prototype), "checkScroll", this).call(this),
this.hasScrollTicking = !1
}
}
}, {
key: "resize",
value: function() {
this.windowHeight = window.innerHeight,
this.windowWidth = window.innerWidth,
this.checkContext(),
this.windowMiddle = {
x: this.windowWidth / 2,
y: this.windowHeight / 2
},
this.update()
}
}, {
key: "updateDelta",
value: function(t) {
var e, i = this[this.context] && this[this.context].gestureDirection ? this[this.context].gestureDirection : this.gestureDirection;
e = "both" === i ? t.deltaX + t.deltaY : "vertical" === i ? t.deltaY : "horizontal" === i ? t.deltaX : t.deltaY,
this.instance.delta[this.directionAxis] -= e * this.multiplier,
this.instance.delta[this.directionAxis] < 0 && (this.instance.delta[this.directionAxis] = 0),
this.instance.delta[this.directionAxis] > this.instance.limit[this.directionAxis] && (this.instance.delta[this.directionAxis] = this.instance.limit[this.directionAxis])
}
}, {
key: "updateScroll",
value: function(t) {
this.isScrolling || this.isDraggingScrollbar ? this.instance.scroll[this.directionAxis] = F(this.instance.scroll[this.directionAxis], this.instance.delta[this.directionAxis], this.lerp) : this.instance.scroll[this.directionAxis] > this.instance.limit[this.directionAxis] ? this.setScroll(this.instance.scroll[this.directionAxis], this.instance.limit[this.directionAxis]) : this.instance.scroll.y < 0 ? this.setScroll(this.instance.scroll[this.directionAxis], 0) : this.setScroll(this.instance.scroll[this.directionAxis], this.instance.delta[this.directionAxis])
}
}, {
key: "addDirection",
value: function() {
this.instance.delta.y > this.instance.scroll.y ? "down" !== this.instance.direction && (this.instance.direction = "down") : this.instance.delta.y < this.instance.scroll.y && "up" !== this.instance.direction && (this.instance.direction = "up"),
this.instance.delta.x > this.instance.scroll.x ? "right" !== this.instance.direction && (this.instance.direction = "right") : this.instance.delta.x < this.instance.scroll.x && "left" !== this.instance.direction && (this.instance.direction = "left")
}
}, {
key: "addSpeed",
value: function() {
this.instance.delta[this.directionAxis] != this.instance.scroll[this.directionAxis] ? this.instance.speed = (this.instance.delta[this.directionAxis] - this.instance.scroll[this.directionAxis]) / Math.max(1, Date.now() - this.speedTs) : this.instance.speed = 0
}
}, {
key: "initScrollBar",
value: function() {
if (this.scrollbar = document.createElement("span"),
this.scrollbarThumb = document.createElement("span"),
this.scrollbar.classList.add("".concat(this.scrollbarClass)),
this.scrollbarThumb.classList.add("".concat(this.scrollbarClass, "_thumb")),
this.scrollbar.append(this.scrollbarThumb),
this.scrollbarContainer ? this.scrollbarContainer.append(this.scrollbar) : document.body.append(this.scrollbar),
this.getScrollBar = this.getScrollBar.bind(this),
this.releaseScrollBar = this.releaseScrollBar.bind(this),
this.moveScrollBar = this.moveScrollBar.bind(this),
this.scrollbarThumb.addEventListener("mousedown", this.getScrollBar),
window.addEventListener("mouseup", this.releaseScrollBar),
window.addEventListener("mousemove", this.moveScrollBar),
this.hasScrollbar = !1,
"horizontal" == this.direction) {
if (this.instance.limit.x + this.windowWidth <= this.windowWidth)
return
} else if (this.instance.limit.y + this.windowHeight <= this.windowHeight)
return;
this.hasScrollbar = !0,
this.scrollbarBCR = this.scrollbar.getBoundingClientRect(),
this.scrollbarHeight = this.scrollbarBCR.height,
this.scrollbarWidth = this.scrollbarBCR.width,
"horizontal" === this.direction ? this.scrollbarThumb.style.width = "".concat(this.scrollbarWidth * this.scrollbarWidth / (this.instance.limit.x + this.scrollbarWidth), "px") : this.scrollbarThumb.style.height = "".concat(this.scrollbarHeight * this.scrollbarHeight / (this.instance.limit.y + this.scrollbarHeight), "px"),
this.scrollbarThumbBCR = this.scrollbarThumb.getBoundingClientRect(),
this.scrollBarLimit = {
x: this.scrollbarWidth - this.scrollbarThumbBCR.width,
y: this.scrollbarHeight - this.scrollbarThumbBCR.height
}
}
}, {
key: "reinitScrollBar",
value: function() {
if (this.hasScrollbar = !1,
"horizontal" == this.direction) {
if (this.instance.limit.x + this.windowWidth <= this.windowWidth)
return
} else if (this.instance.limit.y + this.windowHeight <= this.windowHeight)
return;
this.hasScrollbar = !0,
this.scrollbarBCR = this.scrollbar.getBoundingClientRect(),
this.scrollbarHeight = this.scrollbarBCR.height,
this.scrollbarWidth = this.scrollbarBCR.width,
"horizontal" === this.direction ? this.scrollbarThumb.style.width = "".concat(this.scrollbarWidth * this.scrollbarWidth / (this.instance.limit.x + this.scrollbarWidth), "px") : this.scrollbarThumb.style.height = "".concat(this.scrollbarHeight * this.scrollbarHeight / (this.instance.limit.y + this.scrollbarHeight), "px"),
this.scrollbarThumbBCR = this.scrollbarThumb.getBoundingClientRect(),
this.scrollBarLimit = {
x: this.scrollbarWidth - this.scrollbarThumbBCR.width,
y: this.scrollbarHeight - this.scrollbarThumbBCR.height
}
}
}, {
key: "destroyScrollBar",
value: function() {
this.scrollbarThumb.removeEventListener("mousedown", this.getScrollBar),
window.removeEventListener("mouseup", this.releaseScrollBar),
window.removeEventListener("mousemove", this.moveScrollBar),
this.scrollbar.remove()
}
}, {
key: "getScrollBar",
value: function(t) {
this.isDraggingScrollbar = !0,
this.checkScroll(),
this.html.classList.remove(this.scrollingClass),
this.html.classList.add(this.draggingClass)
}
}, {
key: "releaseScrollBar",
value: function(t) {
this.isDraggingScrollbar = !1,
this.html.classList.add(this.scrollingClass),
this.html.classList.remove(this.draggingClass)
}
}, {
key: "moveScrollBar",
value: function(t) {
var e = this;
this.isDraggingScrollbar && requestAnimationFrame((function() {
var i = 100 * (t.clientX - e.scrollbarBCR.left) / e.scrollbarWidth * e.instance.limit.x / 100
, s = 100 * (t.clientY - e.scrollbarBCR.top) / e.scrollbarHeight * e.instance.limit.y / 100;
s > 0 && s < e.instance.limit.y && (e.instance.delta.y = s),
i > 0 && i < e.instance.limit.x && (e.instance.delta.x = i)
}
))
}
}, {
key: "addElements",
value: function() {
var t = this;
this.els = {},
this.parallaxElements = {},
this.el.querySelectorAll("[data-".concat(this.name, "]")).forEach((function(e, i) {
var s, n, o, l = K(e), r = Object.entries(t.sections).map((function(t) {
var e = f(t, 2);
e[0];
return e[1]
}
)).find((function(t) {
return l.includes(t.el)
}
)), a = e.dataset[t.name + "Class"] || t.class, c = "string" == typeof e.dataset[t.name + "Id"] ? e.dataset[t.name + "Id"] : "el" + i, h = e.dataset[t.name + "Repeat"], d = e.dataset[t.name + "Call"], u = e.dataset[t.name + "Position"], p = e.dataset[t.name + "Delay"], m = e.dataset[t.name + "Direction"], v = "string" == typeof e.dataset[t.name + "Sticky"], y = !!e.dataset[t.name + "Speed"] && parseFloat(e.dataset[t.name + "Speed"]) / 10, g = "string" == typeof e.dataset[t.name + "Offset"] ? e.dataset[t.name + "Offset"].split(",") : t.offset, b = e.dataset[t.name + "Target"], w = (o = void 0 !== b ? document.querySelector("".concat(b)) : e).getBoundingClientRect();
null === r || r.inView ? (s = w.top + t.instance.scroll.y - q(o).y,
n = w.left + t.instance.scroll.x - q(o).x) : (s = w.top - q(r.el).y - q(o).y,
n = w.left - q(r.el).x - q(o).x);
var x = s + o.offsetHeight
, S = n + o.offsetWidth
, k = {
x: (S - n) / 2 + n,
y: (x - s) / 2 + s
};
if (v) {
var T = e.getBoundingClientRect()
, E = T.top
, A = T.left
, O = {
x: A - n,
y: E - s
};
s += window.innerHeight,
n += window.innerWidth,
x = E + o.offsetHeight - e.offsetHeight - O[t.directionAxis],
k = {
x: ((S = A + o.offsetWidth - e.offsetWidth - O[t.directionAxis]) - n) / 2 + n,
y: (x - s) / 2 + s
}
}
h = "false" != h && (null != h || t.repeat);
var C = [0, 0];
if (g)
if ("horizontal" === t.direction) {
for (var D = 0; D < g.length; D++)
"string" == typeof g[D] ? g[D].includes("%") ? C[D] = parseInt(g[D].replace("%", "") * t.windowWidth / 100) : C[D] = parseInt(g[D]) : C[D] = g[D];
n += C[0],
S -= C[1]
} else {
for (D = 0; D < g.length; D++)
"string" == typeof g[D] ? g[D].includes("%") ? C[D] = parseInt(g[D].replace("%", "") * t.windowHeight / 100) : C[D] = parseInt(g[D]) : C[D] = g[D];
s += C[0],
x -= C[1]
}
var L = {
el: e,
id: c,
class: a,
section: r,
top: s,
middle: k,
bottom: x,
left: n,
right: S,
offset: g,
progress: 0,
repeat: h,
inView: !1,
call: d,
speed: y,
delay: p,
position: u,
target: o,
direction: m,
sticky: v
};
t.els[c] = L,
e.classList.contains(a) && t.setInView(t.els[c], c),
(!1 !== y || v) && (t.parallaxElements[c] = L)
}
))
}
}, {
key: "addSections",
value: function() {
var t = this;
this.sections = {};
var e = this.el.querySelectorAll("[data-".concat(this.name, "-section]"));
0 === e.length && (e = [this.el]),
e.forEach((function(e, i) {
var s = "string" == typeof e.dataset[t.name + "Id"] ? e.dataset[t.name + "Id"] : "section" + i
, n = e.getBoundingClientRect()
, o = {
x: n.left - 1.5 * window.innerWidth - q(e).x,
y: n.top - 1.5 * window.innerHeight - q(e).y
}
, l = {
x: o.x + n.width + 2 * window.innerWidth,
y: o.y + n.height + 2 * window.innerHeight
}
, r = "string" == typeof e.dataset[t.name + "Persistent"];
e.setAttribute("data-scroll-section-id", s);
var a = {
el: e,
offset: o,
limit: l,
inView: !1,
persistent: r,
id: s
};
t.sections[s] = a
}
))
}
}, {
key: "transform",
value: function(t, e, i, s) {
var n;
if (s) {
var o = q(t)
, l = F(o.x, e, s)
, r = F(o.y, i, s);
n = "matrix3d(1,0,0.00,0,0.00,1,0.00,0,0,0,1,0,".concat(l, ",").concat(r, ",0,1)")
} else
n = "matrix3d(1,0,0.00,0,0.00,1,0.00,0,0,0,1,0,".concat(e, ",").concat(i, ",0,1)");
t.style.webkitTransform = n,
t.style.msTransform = n,
t.style.transform = n
}
}, {
key: "transformElements",
value: function(t) {
var e = this
, i = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]
, s = this.instance.scroll.x + this.windowWidth
, n = this.instance.scroll.y + this.windowHeight
, o = {
x: this.instance.scroll.x + this.windowMiddle.x,
y: this.instance.scroll.y + this.windowMiddle.y
};
Object.entries(this.parallaxElements).forEach((function(l) {
var r = f(l, 2)
, a = (r[0],
r[1])
, c = !1;
if (t && (c = 0),
a.inView || i)
switch (a.position) {
case "top":
c = e.instance.scroll[e.directionAxis] * -a.speed;
break;
case "elementTop":
c = (n - a.top) * -a.speed;
break;
case "bottom":
c = (e.instance.limit[e.directionAxis] - n + e.windowHeight) * a.speed;
break;
case "left":
c = e.instance.scroll[e.directionAxis] * -a.speed;
break;
case "elementLeft":
c = (s - a.left) * -a.speed;
break;
case "right":
c = (e.instance.limit[e.directionAxis] - s + e.windowHeight) * a.speed;
break;
default:
c = (o[e.directionAxis] - a.middle[e.directionAxis]) * -a.speed
}
a.sticky && (c = a.inView ? "horizontal" === e.direction ? e.instance.scroll.x - a.left + window.innerWidth : e.instance.scroll.y - a.top + window.innerHeight : "horizontal" === e.direction ? e.instance.scroll.x < a.left - window.innerWidth && e.instance.scroll.x < a.left - window.innerWidth / 2 ? 0 : e.instance.scroll.x > a.right && e.instance.scroll.x > a.right + 100 && a.right - a.left + window.innerWidth : e.instance.scroll.y < a.top - window.innerHeight && e.instance.scroll.y < a.top - window.innerHeight / 2 ? 0 : e.instance.scroll.y > a.bottom && e.instance.scroll.y > a.bottom + 100 && a.bottom - a.top + window.innerHeight),
!1 !== c && ("horizontal" === a.direction || "horizontal" === e.direction && "vertical" !== a.direction ? e.transform(a.el, c, 0, !t && a.delay) : e.transform(a.el, 0, c, !t && a.delay))
}
))
}
}, {
key: "scrollTo",
value: function(t) {
var e = this
, i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, s = parseInt(i.offset) || 0
, n = isNaN(parseInt(i.duration)) ? 1e3 : parseInt(i.duration)
, o = i.easing || [.25, 0, .35, 1]
, l = !!i.disableLerp
, r = !!i.callback && i.callback;
if (o = tt.apply(void 0, p(o)),
"string" == typeof t) {
if ("top" === t)
t = 0;
else if ("bottom" === t)
t = this.instance.limit.y;
else if ("left" === t)
t = 0;
else if ("right" === t)
t = this.instance.limit.x;
else if (!(t = document.querySelector(t)))
return
} else if ("number" == typeof t)
t = parseInt(t);
else if (!t || !t.tagName)
return void console.warn("`target` parameter is not valid");
if ("number" != typeof t) {
var a = K(t).includes(this.el);
if (!a)
return;
var c = t.getBoundingClientRect()
, h = c.top
, d = c.left
, u = K(t)
, m = u.find((function(t) {
return Object.entries(e.sections).map((function(t) {
var e = f(t, 2);
e[0];
return e[1]
}
)).find((function(e) {
return e.el == t
}
))
}
))
, v = 0;
v = m ? q(m)[this.directionAxis] : -this.instance.scroll[this.directionAxis],
s = "horizontal" === this.direction ? d + s - v : h + s - v
} else
s = t + s;
var y = parseFloat(this.instance.delta[this.directionAxis])
, g = Math.max(0, Math.min(s, this.instance.limit[this.directionAxis]))
, b = g - y
, w = function(t) {
l ? "horizontal" === e.direction ? e.setScroll(y + b * t, e.instance.delta.y) : e.setScroll(e.instance.delta.x, y + b * t) : e.instance.delta[e.directionAxis] = y + b * t
};
this.animatingScroll = !0,
this.stopScrolling(),
this.startScrolling();
var x = Date.now()
, S = function t() {
var i = (Date.now() - x) / n;
i > 1 ? (w(1),
e.animatingScroll = !1,
0 == n && e.update(),
r && r()) : (e.scrollToRaf = requestAnimationFrame(t),
w(o(i)))
};
S()
}
}, {
key: "update",
value: function() {
this.setScrollLimit(),
this.addSections(),
this.addElements(),
this.detectElements(),
this.updateScroll(),
this.transformElements(!0),
this.reinitScrollBar(),
this.checkScroll(!0)
}
}, {
key: "startScroll",
value: function() {
this.stop = !1
}
}, {
key: "stopScroll",
value: function() {
this.stop = !0
}
}, {
key: "setScroll",
value: function(t, e) {
this.instance = o(o({}, this.instance), {}, {
scroll: {
x: t,
y: e
},
delta: {
x: t,
y: e
},
speed: 0
})
}
}, {
key: "destroy",
value: function() {
u(r(n.prototype), "destroy", this).call(this),
this.stopScrolling(),
this.html.classList.remove(this.smoothClass),
this.vs.destroy(),
this.destroyScrollBar(),
window.removeEventListener("keydown", this.checkKey, !1)
}
}]),
n
}(g)
, ht = function() {
function e() {
var i = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
t(this, e),
this.options = i,
Object.assign(this, y, i),
this.smartphone = y.smartphone,
i.smartphone && Object.assign(this.smartphone, i.smartphone),
this.tablet = y.tablet,
i.tablet && Object.assign(this.tablet, i.tablet),
this.smooth || "horizontal" != this.direction || console.warn("🚨 `smooth:false` & `horizontal` direction are not yet compatible"),
this.tablet.smooth || "horizontal" != this.tablet.direction || console.warn("🚨 `smooth:false` & `horizontal` direction are not yet compatible (tablet)"),
this.smartphone.smooth || "horizontal" != this.smartphone.direction || console.warn("🚨 `smooth:false` & `horizontal` direction are not yet compatible (smartphone)"),
this.init()
}
return i(e, [{
key: "init",
value: function() {
if (this.options.isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1 || window.innerWidth < this.tablet.breakpoint,
this.options.isTablet = this.options.isMobile && window.innerWidth >= this.tablet.breakpoint,
this.smooth && !this.options.isMobile || this.tablet.smooth && this.options.isTablet || this.smartphone.smooth && this.options.isMobile && !this.options.isTablet ? this.scroll = new ct(this.options) : this.scroll = new S(this.options),
this.scroll.init(),
window.location.hash) {
var t = window.location.hash.slice(1, window.location.hash.length)
, e = document.getElementById(t);
e && this.scroll.scrollTo(e)
}
}
}, {
key: "update",
value: function() {
this.scroll.update()
}
}, {
key: "start",
value: function() {
this.scroll.startScroll()
}
}, {
key: "stop",
value: function() {
this.scroll.stopScroll()
}
}, {
key: "scrollTo",
value: function(t, e) {
this.scroll.scrollTo(t, e)
}
}, {
key: "setScroll",
value: function(t, e) {
this.scroll.setScroll(t, e)
}
}, {
key: "on",
value: function(t, e) {
this.scroll.setEvents(t, e)
}
}, {
key: "off",
value: function(t, e) {
this.scroll.unsetEvents(t, e)
}
}, {
key: "destroy",
value: function() {
this.scroll.destroy()
}
}]),
e
}();
}();