{"version":3,"file":"../stickyfill.js","sources":["src/js/stickyfill.js"],"sourcesContent":["/*!\n * Stickyfill – `position: sticky` polyfill\n * v. 2.1.0 | https://github.com/wilddeer/stickyfill\n * MIT License\n */\n\n;(function(window, document) {\n 'use strict';\n \n /*\n * 1. Check if the browser supports `position: sticky` natively or is too old to run the polyfill.\n * If either of these is the case set `seppuku` flag. It will be checked later to disable key features\n * of the polyfill, but the API will remain functional to avoid breaking things.\n */\n \n var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n \n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n \n var seppuku = false;\n \n var isWindowDefined = typeof window !== 'undefined';\n \n // The polyfill can’t function properly without `window` or `window.getComputedStyle`.\n if (!isWindowDefined || !window.getComputedStyle) seppuku = true;\n // Dont’t get in a way if the browser supports `position: sticky` natively.\n else {\n (function () {\n var testNode = document.createElement('div');\n \n if (['', '-webkit-', '-moz-', '-ms-'].some(function (prefix) {\n try {\n testNode.style.position = prefix + 'sticky';\n } catch (e) {}\n \n return testNode.style.position != '';\n })) seppuku = true;\n })();\n }\n \n /*\n * 2. “Global” vars used across the polyfill\n */\n var isInitialized = false;\n \n // Check if Shadow Root constructor exists to make further checks simpler\n var shadowRootExists = typeof ShadowRoot !== 'undefined';\n \n // Last saved scroll position\n var scroll = {\n top: null,\n left: null\n };\n \n // Array of created Sticky instances\n var stickies = [];\n \n /*\n * 3. Utility functions\n */\n function extend(targetObj, sourceObject) {\n for (var key in sourceObject) {\n if (sourceObject.hasOwnProperty(key)) {\n targetObj[key] = sourceObject[key];\n }\n }\n }\n \n function parseNumeric(val) {\n return parseFloat(val) || 0;\n }\n \n function getDocOffsetTop(node) {\n var docOffsetTop = 0;\n \n while (node) {\n docOffsetTop += node.offsetTop;\n node = node.offsetParent;\n }\n \n return docOffsetTop;\n }\n \n /*\n * 4. Sticky class\n */\n \n var Sticky = function () {\n function Sticky(node) {\n _classCallCheck(this, Sticky);\n \n if (!(node instanceof HTMLElement)) throw new Error('First argument must be HTMLElement');\n if (stickies.some(function (sticky) {\n return sticky._node === node;\n })) throw new Error('Stickyfill is already applied to this node');\n \n this._node = node;\n this._stickyMode = null;\n this._active = false;\n \n stickies.push(this);\n \n this.refresh();\n }\n \n _createClass(Sticky, [{\n key: 'refresh',\n value: function refresh() {\n if (seppuku || this._removed) return;\n if (this._active) this._deactivate();\n \n var node = this._node;\n \n /*\n * 1. Save node computed props\n */\n var nodeComputedStyle = getComputedStyle(node);\n var nodeComputedProps = {\n position: nodeComputedStyle.position,\n top: nodeComputedStyle.top,\n display: nodeComputedStyle.display,\n marginTop: nodeComputedStyle.marginTop,\n marginBottom: nodeComputedStyle.marginBottom,\n marginLeft: nodeComputedStyle.marginLeft,\n marginRight: nodeComputedStyle.marginRight,\n cssFloat: nodeComputedStyle.cssFloat\n };\n \n /*\n * 2. Check if the node can be activated\n */\n if (isNaN(parseFloat(nodeComputedProps.top)) || nodeComputedProps.display == 'table-cell' || nodeComputedProps.display == 'none') return;\n \n this._active = true;\n \n /*\n * 3. Check if the current node position is `sticky`. If it is, it means that the browser supports sticky positioning,\n * but the polyfill was force-enabled. We set the node’s position to `static` before continuing, so that the node\n * is in it’s initial position when we gather its params.\n */\n var originalPosition = node.style.position;\n if (nodeComputedStyle.position == 'sticky' || nodeComputedStyle.position == '-webkit-sticky') node.style.position = 'static';\n \n /*\n * 4. Get necessary node parameters\n */\n var referenceNode = node.parentNode;\n var parentNode = shadowRootExists && referenceNode instanceof ShadowRoot ? referenceNode.host : referenceNode;\n var nodeWinOffset = node.getBoundingClientRect();\n var parentWinOffset = parentNode.getBoundingClientRect();\n var parentComputedStyle = getComputedStyle(parentNode);\n \n this._parent = {\n node: parentNode,\n styles: {\n position: parentNode.style.position\n },\n offsetHeight: parentNode.offsetHeight\n };\n this._offsetToWindow = {\n left: nodeWinOffset.left,\n right: document.documentElement.clientWidth - nodeWinOffset.right\n };\n this._offsetToParent = {\n top: nodeWinOffset.top - parentWinOffset.top - parseNumeric(parentComputedStyle.borderTopWidth),\n left: nodeWinOffset.left - parentWinOffset.left - parseNumeric(parentComputedStyle.borderLeftWidth),\n right: -nodeWinOffset.right + parentWinOffset.right - parseNumeric(parentComputedStyle.borderRightWidth)\n };\n this._styles = {\n position: originalPosition,\n top: node.style.top,\n bottom: node.style.bottom,\n left: node.style.left,\n right: node.style.right,\n width: node.style.width,\n marginTop: node.style.marginTop,\n marginLeft: node.style.marginLeft,\n marginRight: node.style.marginRight\n };\n \n var nodeTopValue = parseNumeric(nodeComputedProps.top);\n this._limits = {\n start: nodeWinOffset.top + window.pageYOffset - nodeTopValue,\n end: parentWinOffset.top + window.pageYOffset + parentNode.offsetHeight - parseNumeric(parentComputedStyle.borderBottomWidth) - node.offsetHeight - nodeTopValue - parseNumeric(nodeComputedProps.marginBottom)\n };\n \n /*\n * 5. Ensure that the node will be positioned relatively to the parent node\n */\n var parentPosition = parentComputedStyle.position;\n \n if (parentPosition != 'absolute' && parentPosition != 'relative') {\n parentNode.style.position = 'relative';\n }\n \n /*\n * 6. Recalc node position.\n * It’s important to do this before clone injection to avoid scrolling bug in Chrome.\n */\n this._recalcPosition();\n \n /*\n * 7. Create a clone\n */\n var clone = this._clone = {};\n clone.node = document.createElement('div');\n \n // Apply styles to the clone\n extend(clone.node.style, {\n width: nodeWinOffset.right - nodeWinOffset.left + 'px',\n height: nodeWinOffset.bottom - nodeWinOffset.top + 'px',\n marginTop: nodeComputedProps.marginTop,\n marginBottom: nodeComputedProps.marginBottom,\n marginLeft: nodeComputedProps.marginLeft,\n marginRight: nodeComputedProps.marginRight,\n cssFloat: nodeComputedProps.cssFloat,\n padding: 0,\n border: 0,\n borderSpacing: 0,\n fontSize: '1em',\n position: 'static'\n });\n \n referenceNode.insertBefore(clone.node, node);\n clone.docOffsetTop = getDocOffsetTop(clone.node);\n }\n }, {\n key: '_recalcPosition',\n value: function _recalcPosition() {\n if (!this._active || this._removed) return;\n \n var stickyMode = scroll.top <= this._limits.start ? 'start' : scroll.top >= this._limits.end ? 'end' : 'middle';\n \n if (this._stickyMode == stickyMode) return;\n \n switch (stickyMode) {\n case 'start':\n extend(this._node.style, {\n position: 'absolute',\n left: this._offsetToParent.left + 'px',\n right: this._offsetToParent.right + 'px',\n top: this._offsetToParent.top + 'px',\n bottom: 'auto',\n width: 'auto',\n marginLeft: 0,\n marginRight: 0,\n marginTop: 0\n });\n break;\n \n case 'middle':\n extend(this._node.style, {\n position: 'fixed',\n left: this._offsetToWindow.left + 'px',\n right: this._offsetToWindow.right + 'px',\n top: this._styles.top,\n bottom: 'auto',\n width: 'auto',\n marginLeft: 0,\n marginRight: 0,\n marginTop: 0\n });\n break;\n \n case 'end':\n extend(this._node.style, {\n position: 'absolute',\n left: this._offsetToParent.left + 'px',\n right: this._offsetToParent.right + 'px',\n top: 'auto',\n bottom: 0,\n width: 'auto',\n marginLeft: 0,\n marginRight: 0\n });\n break;\n }\n \n this._stickyMode = stickyMode;\n }\n }, {\n key: '_fastCheck',\n value: function _fastCheck() {\n if (!this._active || this._removed) return;\n \n if (Math.abs(getDocOffsetTop(this._clone.node) - this._clone.docOffsetTop) > 1 || Math.abs(this._parent.node.offsetHeight - this._parent.offsetHeight) > 1) this.refresh();\n }\n }, {\n key: '_deactivate',\n value: function _deactivate() {\n var _this = this;\n \n if (!this._active || this._removed) return;\n \n this._clone.node.parentNode.removeChild(this._clone.node);\n delete this._clone;\n \n extend(this._node.style, this._styles);\n delete this._styles;\n \n // Check whether element’s parent node is used by other stickies.\n // If not, restore parent node’s styles.\n if (!stickies.some(function (sticky) {\n return sticky !== _this && sticky._parent && sticky._parent.node === _this._parent.node;\n })) {\n extend(this._parent.node.style, this._parent.styles);\n }\n delete this._parent;\n \n this._stickyMode = null;\n this._active = false;\n \n delete this._offsetToWindow;\n delete this._offsetToParent;\n delete this._limits;\n }\n }, {\n key: 'remove',\n value: function remove() {\n var _this2 = this;\n \n this._deactivate();\n \n stickies.some(function (sticky, index) {\n if (sticky._node === _this2._node) {\n stickies.splice(index, 1);\n return true;\n }\n });\n \n this._removed = true;\n }\n }]);\n \n return Sticky;\n }();\n \n /*\n * 5. Stickyfill API\n */\n \n \n var Stickyfill = {\n stickies: stickies,\n Sticky: Sticky,\n \n forceSticky: function forceSticky() {\n seppuku = false;\n init();\n \n this.refreshAll();\n },\n addOne: function addOne(node) {\n // Check whether it’s a node\n if (!(node instanceof HTMLElement)) {\n // Maybe it’s a node list of some sort?\n // Take first node from the list then\n if (node.length && node[0]) node = node[0];else return;\n }\n \n // Check if Stickyfill is already applied to the node\n // and return existing sticky\n for (var i = 0; i < stickies.length; i++) {\n if (stickies[i]._node === node) return stickies[i];\n }\n \n // Create and return new sticky\n return new Sticky(node);\n },\n add: function add(nodeList) {\n // If it’s a node make an array of one node\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\n // Check if the argument is an iterable of some sort\n if (!nodeList.length) return;\n \n // Add every element as a sticky and return an array of created Sticky instances\n var addedStickies = [];\n \n var _loop = function _loop(i) {\n var node = nodeList[i];\n \n // If it’s not an HTMLElement – create an empty element to preserve 1-to-1\n // correlation with input list\n if (!(node instanceof HTMLElement)) {\n addedStickies.push(void 0);\n return 'continue';\n }\n \n // If Stickyfill is already applied to the node\n // add existing sticky\n if (stickies.some(function (sticky) {\n if (sticky._node === node) {\n addedStickies.push(sticky);\n return true;\n }\n })) return 'continue';\n \n // Create and add new sticky\n addedStickies.push(new Sticky(node));\n };\n \n for (var i = 0; i < nodeList.length; i++) {\n var _ret2 = _loop(i);\n \n if (_ret2 === 'continue') continue;\n }\n \n return addedStickies;\n },\n refreshAll: function refreshAll() {\n stickies.forEach(function (sticky) {\n return sticky.refresh();\n });\n },\n removeOne: function removeOne(node) {\n // Check whether it’s a node\n if (!(node instanceof HTMLElement)) {\n // Maybe it’s a node list of some sort?\n // Take first node from the list then\n if (node.length && node[0]) node = node[0];else return;\n }\n \n // Remove the stickies bound to the nodes in the list\n stickies.some(function (sticky) {\n if (sticky._node === node) {\n sticky.remove();\n return true;\n }\n });\n },\n remove: function remove(nodeList) {\n // If it’s a node make an array of one node\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\n // Check if the argument is an iterable of some sort\n if (!nodeList.length) return;\n \n // Remove the stickies bound to the nodes in the list\n \n var _loop2 = function _loop2(i) {\n var node = nodeList[i];\n \n stickies.some(function (sticky) {\n if (sticky._node === node) {\n sticky.remove();\n return true;\n }\n });\n };\n \n for (var i = 0; i < nodeList.length; i++) {\n _loop2(i);\n }\n },\n removeAll: function removeAll() {\n while (stickies.length) {\n stickies[0].remove();\n }\n }\n };\n \n /*\n * 6. Setup events (unless the polyfill was disabled)\n */\n function init() {\n if (isInitialized) {\n return;\n }\n \n isInitialized = true;\n \n // Watch for scroll position changes and trigger recalc/refresh if needed\n function checkScroll() {\n if (window.pageXOffset != scroll.left) {\n scroll.top = window.pageYOffset;\n scroll.left = window.pageXOffset;\n \n Stickyfill.refreshAll();\n } else if (window.pageYOffset != scroll.top) {\n scroll.top = window.pageYOffset;\n scroll.left = window.pageXOffset;\n \n // recalc position for all stickies\n stickies.forEach(function (sticky) {\n return sticky._recalcPosition();\n });\n }\n }\n \n checkScroll();\n window.addEventListener('scroll', checkScroll);\n \n // Watch for window resizes and device orientation changes and trigger refresh\n window.addEventListener('resize', Stickyfill.refreshAll);\n window.addEventListener('orientationchange', Stickyfill.refreshAll);\n \n //Fast dirty check for layout changes every 500ms\n var fastCheckTimer = void 0;\n \n function startFastCheckTimer() {\n fastCheckTimer = setInterval(function () {\n stickies.forEach(function (sticky) {\n return sticky._fastCheck();\n });\n }, 500);\n }\n \n function stopFastCheckTimer() {\n clearInterval(fastCheckTimer);\n }\n \n var docHiddenKey = void 0;\n var visibilityChangeEventName = void 0;\n \n if ('hidden' in document) {\n docHiddenKey = 'hidden';\n visibilityChangeEventName = 'visibilitychange';\n } else if ('webkitHidden' in document) {\n docHiddenKey = 'webkitHidden';\n visibilityChangeEventName = 'webkitvisibilitychange';\n }\n \n if (visibilityChangeEventName) {\n if (!document[docHiddenKey]) startFastCheckTimer();\n \n document.addEventListener(visibilityChangeEventName, function () {\n if (document[docHiddenKey]) {\n stopFastCheckTimer();\n } else {\n startFastCheckTimer();\n }\n });\n } else startFastCheckTimer();\n }\n \n if (!seppuku) init();\n \n /*\n * 7. Expose Stickyfill\n */\n if (typeof module != 'undefined' && module.exports) {\n module.exports = Stickyfill;\n } else if (isWindowDefined) {\n window.Stickyfill = Stickyfill;\n }\n \n})(window, document);"],"names":["window","document","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","seppuku","isWindowDefined","getComputedStyle","testNode","createElement","some","prefix","style","position","e","isInitialized","shadowRootExists","ShadowRoot","scroll","top","left","stickies","extend","targetObj","sourceObject","hasOwnProperty","parseNumeric","val","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetTop","offsetParent","Sticky","HTMLElement","Error","sticky","_node","_stickyMode","_active","push","refresh","value","_removed","_deactivate","nodeComputedStyle","nodeComputedProps","display","marginTop","marginBottom","marginLeft","marginRight","cssFloat","isNaN","originalPosition","referenceNode","parentNode","host","nodeWinOffset","getBoundingClientRect","parentWinOffset","parentComputedStyle","_parent","styles","offsetHeight","_offsetToWindow","right","documentElement","clientWidth","_offsetToParent","borderTopWidth","borderLeftWidth","borderRightWidth","_styles","bottom","width","nodeTopValue","_limits","start","pageYOffset","end","borderBottomWidth","parentPosition","_recalcPosition","clone","_clone","height","padding","border","borderSpacing","fontSize","insertBefore","stickyMode","_fastCheck","Math","abs","_this","removeChild","remove","_this2","index","splice","Stickyfill","forceSticky","init","refreshAll","addOne","add","nodeList","addedStickies","_loop","_ret2","forEach","removeOne","_loop2","removeAll","checkScroll","pageXOffset","addEventListener","fastCheckTimer","startFastCheckTimer","setInterval","stopFastCheckTimer","clearInterval","docHiddenKey","visibilityChangeEventName","module","exports"],"mappings":"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"}