{"version":3,"sources":["sticky.compile.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","prototype","Sticky","selector","arguments","undefined","options","this","elements","version","vp","getViewportSize","document","querySelector","wrap","wrapWith","marginTop","marginBottom","stickyFor","stickyClass","stickyContainer","updateScrollTopPosition","bind","window","addEventListener","value","clearInterval","querySelectorAll","_this","forEach","element","renderElement","_this2","sticky","active","parseInt","getAttribute","hasAttribute","container","getStickyContainer","rect","getRectangle","tagName","toLowerCase","onload","wrapElement","activate","insertAdjacentHTML","appendChild","top","height","width","resizeEvent","initResizeEvents","scrollEvent","initScrollEvents","_this3","onResizeEvents","setPosition","resizeListener","destroyResizeEvents","removeEventListener","_this4","onScrollEvents","scrollListener","css","position","left","display","body","scrollTop","offsetHeight","classList","remove","parentNode","_this5","_this6","destroyScrollEvents","Math","max","offsetWidth","clientWidth","scrollWidth","clientHeight","scrollHeight","offsetTop","offsetLeft","offsetParent","documentElement","innerWidth","innerHeight","pageYOffset","clientTop","array","callback","len","properties","property","hasOwnProperty","style","root","factory","exports","module","amd","define"],"mappings":"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","file":"../sticky.compile.min.js","sourcesContent":["function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * Sticky.js\n * Library for sticky elements written in vanilla javascript. With this library you can easily set sticky elements on your website. It's also responsive.\n *\n * @version 1.3.0\n * @author Rafal Galus \n * @website https://rgalus.github.io/sticky-js/\n * @repo https://github.com/rgalus/sticky-js\n * @license https://github.com/rgalus/sticky-js/blob/master/LICENSE\n */\nvar Sticky = /*#__PURE__*/function () {\n /**\n * Sticky instance constructor\n * @constructor\n * @param {string} selector - Selector which we can find elements\n * @param {string} options - Global options for sticky elements (could be overwritten by data-{option}=\"\" attributes)\n */\n function Sticky() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Sticky);\n\n this.selector = selector;\n this.elements = [];\n this.version = '1.3.0';\n this.vp = this.getViewportSize();\n this.body = document.querySelector('body');\n this.options = {\n wrap: options.wrap || false,\n wrapWith: options.wrapWith || '',\n marginTop: options.marginTop || 0,\n marginBottom: options.marginBottom || 0,\n stickyFor: options.stickyFor || 0,\n stickyClass: options.stickyClass || null,\n stickyContainer: options.stickyContainer || 'body'\n };\n this.updateScrollTopPosition = this.updateScrollTopPosition.bind(this);\n this.updateScrollTopPosition();\n window.addEventListener('load', this.updateScrollTopPosition);\n window.addEventListener('scroll', this.updateScrollTopPosition);\n this.run();\n }\n /**\n * Function that waits for page to be fully loaded and then renders & activates every sticky element found with specified selector\n * @function\n */\n\n\n _createClass(Sticky, [{\n key: \"run\",\n value: function run() {\n var _this = this;\n\n // wait for page to be fully loaded\n var pageLoaded = setInterval(function () {\n if (document.readyState === 'complete') {\n clearInterval(pageLoaded);\n var elements = document.querySelectorAll(_this.selector);\n\n _this.forEach(elements, function (element) {\n return _this.renderElement(element);\n });\n }\n }, 10);\n }\n /**\n * Function that assign needed variables for sticky element, that are used in future for calculations and other\n * @function\n * @param {node} element - Element to be rendered\n */\n\n }, {\n key: \"renderElement\",\n value: function renderElement(element) {\n var _this2 = this;\n\n // create container for variables needed in future\n element.sticky = {}; // set default variables\n\n element.sticky.active = false;\n element.sticky.marginTop = parseInt(element.getAttribute('data-margin-top')) || this.options.marginTop;\n element.sticky.marginBottom = parseInt(element.getAttribute('data-margin-bottom')) || this.options.marginBottom;\n element.sticky.stickyFor = parseInt(element.getAttribute('data-sticky-for')) || this.options.stickyFor;\n element.sticky.stickyClass = element.getAttribute('data-sticky-class') || this.options.stickyClass;\n element.sticky.wrap = element.hasAttribute('data-sticky-wrap') ? true : this.options.wrap; // @todo attribute for stickyContainer\n // element.sticky.stickyContainer = element.getAttribute('data-sticky-container') || this.options.stickyContainer;\n\n element.sticky.stickyContainer = this.options.stickyContainer;\n element.sticky.container = this.getStickyContainer(element);\n element.sticky.container.rect = this.getRectangle(element.sticky.container);\n element.sticky.rect = this.getRectangle(element); // fix when element is image that has not yet loaded and width, height = 0\n\n if (element.tagName.toLowerCase() === 'img') {\n element.onload = function () {\n return element.sticky.rect = _this2.getRectangle(element);\n };\n }\n\n if (element.sticky.wrap) {\n this.wrapElement(element);\n } // activate rendered element\n\n\n this.activate(element);\n }\n /**\n * Wraps element into placeholder element\n * @function\n * @param {node} element - Element to be wrapped\n */\n\n }, {\n key: \"wrapElement\",\n value: function wrapElement(element) {\n element.insertAdjacentHTML('beforebegin', element.getAttribute('data-sticky-wrapWith') || this.options.wrapWith);\n element.previousSibling.appendChild(element);\n }\n /**\n * Function that activates element when specified conditions are met and then initalise events\n * @function\n * @param {node} element - Element to be activated\n */\n\n }, {\n key: \"activate\",\n value: function activate(element) {\n if (element.sticky.rect.top + element.sticky.rect.height < element.sticky.container.rect.top + element.sticky.container.rect.height && element.sticky.stickyFor < this.vp.width && !element.sticky.active) {\n element.sticky.active = true;\n }\n\n if (this.elements.indexOf(element) < 0) {\n this.elements.push(element);\n }\n\n if (!element.sticky.resizeEvent) {\n this.initResizeEvents(element);\n element.sticky.resizeEvent = true;\n }\n\n if (!element.sticky.scrollEvent) {\n this.initScrollEvents(element);\n element.sticky.scrollEvent = true;\n }\n\n this.setPosition(element);\n }\n /**\n * Function which is adding onResizeEvents to window listener and assigns function to element as resizeListener\n * @function\n * @param {node} element - Element for which resize events are initialised\n */\n\n }, {\n key: \"initResizeEvents\",\n value: function initResizeEvents(element) {\n var _this3 = this;\n\n element.sticky.resizeListener = function () {\n return _this3.onResizeEvents(element);\n };\n\n window.addEventListener('resize', element.sticky.resizeListener);\n }\n /**\n * Removes element listener from resize event\n * @function\n * @param {node} element - Element from which listener is deleted\n */\n\n }, {\n key: \"destroyResizeEvents\",\n value: function destroyResizeEvents(element) {\n window.removeEventListener('resize', element.sticky.resizeListener);\n }\n /**\n * Function which is fired when user resize window. It checks if element should be activated or deactivated and then run setPosition function\n * @function\n * @param {node} element - Element for which event function is fired\n */\n\n }, {\n key: \"onResizeEvents\",\n value: function onResizeEvents(element) {\n this.vp = this.getViewportSize();\n element.sticky.rect = this.getRectangle(element);\n element.sticky.container.rect = this.getRectangle(element.sticky.container);\n\n if (element.sticky.rect.top + element.sticky.rect.height < element.sticky.container.rect.top + element.sticky.container.rect.height && element.sticky.stickyFor < this.vp.width && !element.sticky.active) {\n element.sticky.active = true;\n } else if (element.sticky.rect.top + element.sticky.rect.height >= element.sticky.container.rect.top + element.sticky.container.rect.height || element.sticky.stickyFor >= this.vp.width && element.sticky.active) {\n element.sticky.active = false;\n }\n\n this.setPosition(element);\n }\n /**\n * Function which is adding onScrollEvents to window listener and assigns function to element as scrollListener\n * @function\n * @param {node} element - Element for which scroll events are initialised\n */\n\n }, {\n key: \"initScrollEvents\",\n value: function initScrollEvents(element) {\n var _this4 = this;\n\n element.sticky.scrollListener = function () {\n return _this4.onScrollEvents(element);\n };\n\n window.addEventListener('scroll', element.sticky.scrollListener);\n }\n /**\n * Removes element listener from scroll event\n * @function\n * @param {node} element - Element from which listener is deleted\n */\n\n }, {\n key: \"destroyScrollEvents\",\n value: function destroyScrollEvents(element) {\n window.removeEventListener('scroll', element.sticky.scrollListener);\n }\n /**\n * Function which is fired when user scroll window. If element is active, function is invoking setPosition function\n * @function\n * @param {node} element - Element for which event function is fired\n */\n\n }, {\n key: \"onScrollEvents\",\n value: function onScrollEvents(element) {\n if (element.sticky && element.sticky.active) {\n this.setPosition(element);\n }\n }\n /**\n * Main function for the library. Here are some condition calculations and css appending for sticky element when user scroll window\n * @function\n * @param {node} element - Element that will be positioned if it's active\n */\n\n }, {\n key: \"setPosition\",\n value: function setPosition(element) {\n this.css(element, {\n position: '',\n width: '',\n top: '',\n left: ''\n });\n\n if (this.vp.height < element.sticky.rect.height || !element.sticky.active) {\n return;\n }\n\n if (!element.sticky.rect.width) {\n element.sticky.rect = this.getRectangle(element);\n }\n\n if (element.sticky.wrap) {\n this.css(element.parentNode, {\n display: 'block',\n width: element.sticky.rect.width + 'px',\n height: element.sticky.rect.height + 'px'\n });\n }\n\n if (element.sticky.rect.top === 0 && element.sticky.container === this.body) {\n this.css(element, {\n position: 'fixed',\n top: element.sticky.rect.top + 'px',\n left: element.sticky.rect.left + 'px',\n width: element.sticky.rect.width + 'px'\n });\n\n if (element.sticky.stickyClass) {\n element.classList.add(element.sticky.stickyClass);\n }\n } else if (this.scrollTop > element.sticky.rect.top - element.sticky.marginTop) {\n this.css(element, {\n position: 'fixed',\n width: element.sticky.rect.width + 'px',\n left: element.sticky.rect.left + 'px'\n });\n\n if (this.scrollTop + element.sticky.rect.height + element.sticky.marginTop > element.sticky.container.rect.top + element.sticky.container.offsetHeight - element.sticky.marginBottom) {\n if (element.sticky.stickyClass) {\n element.classList.remove(element.sticky.stickyClass);\n }\n\n this.css(element, {\n top: element.sticky.container.rect.top + element.sticky.container.offsetHeight - (this.scrollTop + element.sticky.rect.height + element.sticky.marginBottom) + 'px'\n });\n } else {\n if (element.sticky.stickyClass) {\n element.classList.add(element.sticky.stickyClass);\n }\n\n this.css(element, {\n top: element.sticky.marginTop + 'px'\n });\n }\n } else {\n if (element.sticky.stickyClass) {\n element.classList.remove(element.sticky.stickyClass);\n }\n\n this.css(element, {\n position: '',\n width: '',\n top: '',\n left: ''\n });\n\n if (element.sticky.wrap) {\n this.css(element.parentNode, {\n display: '',\n width: '',\n height: ''\n });\n }\n }\n }\n /**\n * Function that updates element sticky rectangle (with sticky container), then activate or deactivate element, then update position if it's active\n * @function\n */\n\n }, {\n key: \"update\",\n value: function update() {\n var _this5 = this;\n\n this.forEach(this.elements, function (element) {\n element.sticky.rect = _this5.getRectangle(element);\n element.sticky.container.rect = _this5.getRectangle(element.sticky.container);\n\n _this5.activate(element);\n\n _this5.setPosition(element);\n });\n }\n /**\n * Destroys sticky element, remove listeners\n * @function\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n var _this6 = this;\n\n window.removeEventListener('load', this.updateScrollTopPosition);\n window.removeEventListener('scroll', this.updateScrollTopPosition);\n this.forEach(this.elements, function (element) {\n _this6.destroyResizeEvents(element);\n\n _this6.destroyScrollEvents(element);\n\n delete element.sticky;\n });\n }\n /**\n * Function that returns container element in which sticky element is stuck (if is not specified, then it's stuck to body)\n * @function\n * @param {node} element - Element which sticky container are looked for\n * @return {node} element - Sticky container\n */\n\n }, {\n key: \"getStickyContainer\",\n value: function getStickyContainer(element) {\n var container = element.parentNode;\n\n while (!container.hasAttribute('data-sticky-container') && !container.parentNode.querySelector(element.sticky.stickyContainer) && container !== this.body) {\n container = container.parentNode;\n }\n\n return container;\n }\n /**\n * Function that returns element rectangle & position (width, height, top, left)\n * @function\n * @param {node} element - Element which position & rectangle are returned\n * @return {object}\n */\n\n }, {\n key: \"getRectangle\",\n value: function getRectangle(element) {\n this.css(element, {\n position: '',\n width: '',\n top: '',\n left: ''\n });\n var width = Math.max(element.offsetWidth, element.clientWidth, element.scrollWidth);\n var height = Math.max(element.offsetHeight, element.clientHeight, element.scrollHeight);\n var top = 0;\n var left = 0;\n\n do {\n top += element.offsetTop || 0;\n left += element.offsetLeft || 0;\n element = element.offsetParent;\n } while (element);\n\n return {\n top: top,\n left: left,\n width: width,\n height: height\n };\n }\n /**\n * Function that returns viewport dimensions\n * @function\n * @return {object}\n */\n\n }, {\n key: \"getViewportSize\",\n value: function getViewportSize() {\n return {\n width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),\n height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0)\n };\n }\n /**\n * Function that updates window scroll position\n * @function\n * @return {number}\n */\n\n }, {\n key: \"updateScrollTopPosition\",\n value: function updateScrollTopPosition() {\n this.scrollTop = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0) || 0;\n }\n /**\n * Helper function for loops\n * @helper\n * @param {array}\n * @param {function} callback - Callback function (no need for explanation)\n */\n\n }, {\n key: \"forEach\",\n value: function forEach(array, callback) {\n for (var i = 0, len = array.length; i < len; i++) {\n callback(array[i]);\n }\n }\n /**\n * Helper function to add/remove css properties for specified element.\n * @helper\n * @param {node} element - DOM element\n * @param {object} properties - CSS properties that will be added/removed from specified element\n */\n\n }, {\n key: \"css\",\n value: function css(element, properties) {\n for (var property in properties) {\n if (properties.hasOwnProperty(property)) {\n element.style[property] = properties[property];\n }\n }\n }\n }]);\n\n return Sticky;\n}();\n/**\n * Export function that supports AMD, CommonJS and Plain Browser.\n */\n\n\n(function (root, factory) {\n if (typeof exports !== 'undefined') {\n module.exports = factory;\n } else if (typeof define === 'function' && define.amd) {\n define([], function () {\n return factory;\n });\n } else {\n root.Sticky = factory;\n }\n})(this, Sticky);"]}