{"version":3,"file":"Sticky-03c357d8.js","names":["define","Moduler","create","defaults","wrapper","wrapperClass","stickyActiveClass","stickyHiddenClass","stickyBottomClass","offsetTop","widthFromWrapper","innerScrolling","contained","autoHide","autoHideOffset","autoShowOffset","minScreenWidth","maxScreenWidth","init","self","this","doc","document","window","el","isSticky","isDisabled","cache","offset","forceShow","options","classList","add","insertAdjacentHTML","previousElementSibling","appendChild","parentElement","container","style","position","listener","requestAnimationFrame","utils","bind","tick","setTimeout","addEventListener","recalc","enable","disable","totalHeight","parsed","parseInt","isNaN","querySelectorAll","forEach","o","getHeight","top","previousScrollTop","documentHeight","windowHeight","elementHeight","wrapperWidth","getWidth","wrapperOffsetTop","containerOffsetTop","containerHeight","containerEndOffsetTop","autoHideOffsetTop","height","width","windowWidth","outerWidth","isWiderThanMinWidth","isSmallerThanMaxWidth","isAllowedSpan","newDocHeight","scrollTop","scrollY","shouldStick","deltaScrollTop","isScrollingDown","isScrollEnd","previousScrollingDown","lastDirectionChangePosition","remove","shouldAutoHide","deltaScrollChangePos","Math","abs","max","min","show","removeEventListener","elem","body","html","documentElement","scrollHeight","offsetHeight","clientHeight","outerHeight","getBoundingClientRect"],"sources":["Sticky.js"],"mappings":"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","sourcesContent":["define(['moduler'], function (Moduler) {\r\n 'use strict';\r\n\r\n return Moduler.create({\r\n defaults: {\r\n wrapper: '
', // set to false to disable wrapper element\r\n wrapperClass: null, // additional css class for wrapper\r\n stickyActiveClass: 'is-sticky', // css class to add when actively sticky\r\n stickyHiddenClass: 'is-stickyHidden',\r\n stickyBottomClass: 'is-stickyBottom',\r\n offsetTop: 0, // [selector or pixels] offset from where to start being sticky\r\n widthFromWrapper: true, // the fixed element will have its width from wrapper element\r\n innerScrolling: true, // scroll the sticky element if it is taller than the viewport\r\n contained: false, // keep element sticky within its container\r\n autoHide: false, // will hide sticky element when scrolling down, and show on scroll up\r\n autoHideOffset: 300, // extra pixels offset until hidden\r\n autoShowOffset: 300, // offset until scrolling up will show element. set to 0 to disable. \r\n minScreenWidth: null, // mininum screen width when sticky is active\r\n maxScreenWidth: null // maxium screen width when sticky is active\r\n },\r\n\r\n init: function () {\r\n var self = this;\r\n\r\n self.doc = document;\r\n self.window = window;\r\n self.wrapper = self.el; // default if wrapper is disabled\r\n self.isSticky = false; // if element is currently fixed/sticky\r\n self.isDisabled = false;\r\n self.cache = {};\r\n self.offset = 0; // used for inner scrolling offsets\r\n self.forceShow = false; // force show an auto-hidden sticky element\r\n\r\n if (self.options.wrapper) {\r\n self.el.classList.add('Sticky-element');\r\n\r\n self.el.insertAdjacentHTML(\"beforebegin\", self.options.wrapper);\r\n self.el.previousElementSibling.appendChild(self.el);\r\n self.wrapper = self.el.parentElement;\r\n\r\n if (self.options.wrapperClass) {\r\n self.wrapper.classList.add(self.options.wrapperClass);\r\n }\r\n }\r\n\r\n self.container = self.wrapper.parentElement;\r\n\r\n if (self.options.contained) {\r\n // container element has to be relative for \"is-stickyBottom\" to work\r\n self.container.style.position = 'relative';\r\n }\r\n\r\n function recalcAndTick() {\r\n self.recalc();\r\n\r\n if (!self.isDisabled) {\r\n self.tick();\r\n }\r\n }\r\n\r\n self.listener = function () {\r\n (window.requestAnimationFrame && requestAnimationFrame(Moduler.utils.bind(self.tick, self))) || setTimeout(Moduler.utils.bind(self.tick, self), 16);\r\n };\r\n\r\n window.addEventListener('scroll', self.listener);\r\n window.addEventListener('resize', self.listener);\r\n\r\n self.listener();\r\n\r\n self.el.addEventListener('recalc', Moduler.utils.bind(recalcAndTick, self));\r\n self.el.addEventListener('tick', Moduler.utils.bind(self.tick, self));\r\n self.el.addEventListener('show', Moduler.utils.bind(self.tick, self));\r\n self.el.addEventListener('enable', Moduler.utils.bind(self.enable, self));\r\n self.el.addEventListener('disable', Moduler.utils.bind(self.disable, self));\r\n },\r\n\r\n /*\r\n * Recalculates the cached properties.\r\n * This is an expensive method and is only called on resize event \r\n * and when height of document changes.\r\n */\r\n recalc: function () {\r\n var self = this,\r\n cache = self.cache;\r\n\r\n if (typeof (self.options.offsetTop) === 'string') {\r\n var totalHeight = 0;\r\n var parsed = parseInt(self.options.offsetTop, 10);\r\n if (!isNaN(parsed)) {\r\n totalHeight = parsed;\r\n } else {\r\n // sum the heights of all elements matching selector\r\n document.querySelectorAll(self.options.offsetTop).forEach(o => {\r\n totalHeight += self.getHeight(o);\r\n });\r\n }\r\n\r\n cache.offsetTop = totalHeight;\r\n } else {\r\n cache.offsetTop = self.options.offsetTop;\r\n }\r\n\r\n self.el.style.top = cache.offsetTop + \"px\";\r\n\r\n cache.previousScrollTop = 0;\r\n\r\n // document/window\r\n cache.documentHeight = self.getHeight(self.doc);\r\n cache.windowHeight = self.getHeight(self.window);\r\n\r\n // element\r\n cache.elementHeight = self.getHeight(self.el);\r\n\r\n // wrapper\r\n cache.wrapperWidth = self.getWidth(self.wrapper);\r\n cache.wrapperOffsetTop = self.wrapper.offsetTop - cache.offsetTop;\r\n\r\n // container\r\n cache.containerOffsetTop = self.container.offsetTop;\r\n cache.containerHeight = self.getHeight(self.container);\r\n cache.containerEndOffsetTop = self.cache.containerHeight + self.cache.containerOffsetTop - self.cache.elementHeight;\r\n\r\n // auto hide\r\n cache.autoHideOffsetTop = self.cache.wrapperOffsetTop + self.cache.elementHeight + self.options.autoHideOffset;\r\n\r\n if (!self.isDisabled) {\r\n // set wrapper to same height as content to take space when content is sticky/fixed.\r\n self.wrapper.style.height = cache.elementHeight + \"px\";\r\n\r\n if (self.options.widthFromWrapper) {\r\n // update width of sticky element\r\n self.el.style.width = cache.wrapperWidth + \"px\";\r\n }\r\n }\r\n\r\n if (self.options.minScreenWidth || self.options.maxScreenWidth) {\r\n var windowWidth = self.window.outerWidth,\r\n isWiderThanMinWidth = !self.options.minScreenWidth || windowWidth > self.options.minScreenWidth,\r\n isSmallerThanMaxWidth = !self.options.maxScreenWidth || windowWidth < self.options.maxScreenWidth,\r\n isAllowedSpan = isWiderThanMinWidth && isSmallerThanMaxWidth;\r\n\r\n if (isAllowedSpan && self.isDisabled) {\r\n self.enable();\r\n } else if (!isAllowedSpan && !self.isDisabled) {\r\n self.disable();\r\n }\r\n }\r\n },\r\n\r\n /*\r\n * Tick is called on every scroll event.\r\n */\r\n tick: function () {\r\n var self = this,\r\n newDocHeight = self.getHeight(self.doc);\r\n\r\n if (self.cache.documentHeight != newDocHeight) {\r\n self.cache.documentHeight = newDocHeight;\r\n self.recalc();\r\n }\r\n\r\n var scrollTop = self.window.scrollY,\r\n shouldStick = self.cache.wrapperOffsetTop < scrollTop,\r\n deltaScrollTop = scrollTop - self.cache.previousScrollTop,\r\n isScrollingDown = deltaScrollTop > 0,\r\n isScrollEnd = scrollTop >= (self.cache.documentHeight - self.cache.windowHeight);\r\n\r\n if (isScrollingDown != self.cache.previousScrollingDown) {\r\n self.cache.lastDirectionChangePosition = scrollTop;\r\n }\r\n\r\n if (shouldStick && !self.isSticky) {\r\n self.el.classList.add(self.options.stickyActiveClass);\r\n self.isSticky = true;\r\n } else if (!shouldStick && self.isSticky) {\r\n self.el.classList.remove(self.options.stickyActiveClass);\r\n self.isSticky = false;\r\n }\r\n\r\n if (self.options.autoHide) {\r\n var shouldAutoHide = self.cache.autoHideOffsetTop < scrollTop && !isScrollEnd;\r\n var deltaScrollChangePos = Math.abs(scrollTop - self.cache.lastDirectionChangePosition);\r\n\r\n if (isScrollingDown && shouldAutoHide && !self.forceShow) {\r\n self.el.classList.add(self.options.stickyHiddenClass);\r\n } else if (deltaScrollChangePos >= self.options.autoShowOffset || !shouldAutoHide || self.forceShow) {\r\n self.el.classList.remove(self.options.stickyHiddenClass);\r\n self.forceShow = false;\r\n }\r\n }\r\n\r\n if (self.options.innerScrolling) {\r\n var needsInnerScrolling = self.cache.elementHeight > self.cache.windowHeight;\r\n\r\n if (needsInnerScrolling && self.isSticky) {\r\n self.offset -= deltaScrollTop;\r\n self.offset = Math.max(self.offset, (self.cache.windowHeight - self.cache.elementHeight));\r\n self.offset = Math.min(self.offset, 0);\r\n\r\n self.el.style.top = self.offset + 'px';\r\n }\r\n }\r\n\r\n if (self.options.contained) {\r\n var hasReachedEnd = (self.cache.containerEndOffsetTop - self.cache.offsetTop - self.offset) < scrollTop;\r\n\r\n if (hasReachedEnd) {\r\n self.el.classList.add(self.options.stickyBottomClass);\r\n } else {\r\n self.el.classList.remove(self.options.stickyBottomClass);\r\n }\r\n }\r\n\r\n self.cache.previousScrollTop = scrollTop;\r\n self.cache.previousScrollingDown = isScrollingDown;\r\n },\r\n\r\n /*\r\n * To show an auto-hidden sticky element, \r\n * trigger the \"show\" event on the module element.\r\n */\r\n show: function () {\r\n var self = this;\r\n\r\n self.forceShow = true;\r\n self.tick();\r\n },\r\n\r\n enable: function () {\r\n var self = this;\r\n\r\n if (self.isDisabled) {\r\n self.isDisabled = false;\r\n\r\n window.addEventListener('scroll', self.listener);\r\n self.recalc();\r\n self.tick();\r\n }\r\n },\r\n\r\n disable: function () {\r\n var self = this;\r\n\r\n if (!self.isDisabled) {\r\n self.isDisabled = true;\r\n self.isSticky = false;\r\n self.offset = 0;\r\n self.el.style.top = '';\r\n self.el.style.width = '';\r\n self.el.classList.remove(self.options.stickyActiveClass);\r\n self.el.classList.remove(self.options.stickyBottomClass);\r\n self.el.classList.remove(self.options.stickyHiddenClass);\r\n self.wrapper.style.height = '';\r\n\r\n window.removeEventListener('scroll', self.listener);\r\n }\r\n },\r\n\r\n getHeight: function (elem) {\r\n if (elem == document) {\r\n var body = elem.body,\r\n html = elem.documentElement;\r\n\r\n return Math.max(body.scrollHeight, body.offsetHeight,\r\n html.clientHeight, html.scrollHeight, html.offsetHeight);\r\n }\r\n\r\n if (elem == window) {\r\n return elem.outerHeight;\r\n }\r\n\r\n return elem.getBoundingClientRect().height;\r\n },\r\n\r\n getWidth: function (elem) {\r\n if (elem == document) {\r\n return elem.documentElement.getBoundingClientRect().width;\r\n }\r\n\r\n if (elem == window) {\r\n return elem.outerWidth;\r\n }\r\n\r\n return elem.getBoundingClientRect().width;\r\n }\r\n });\r\n});"]}