{"version":3,"sources":["in-viewport-class.js"],"names":["window","document","WATCH_CLASS","IN_VIEWPORT_CLASS","ONCE_IN_VIEWPORT_CLASS","WAS_IN_VIEWPORT","elements","hasClass","element","className","classList","contains","RegExp","test","addClass","add","removeClass","remove","replace","split","join","storeElements","getElementsByClassName","update","viewportTop","pageYOffset","documentElement","scrollTop","viewportBottom","innerHeight","clientHeight","body","i","len","length","isInViewport","elementRect","getBoundingClientRect","elementTop","top","elementBottom","offsetHeight","onreadystatechange","readyState","addEventListener"],"mappings":"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","file":"in-viewport-class.js","sourcesContent":["/*jshint esversion: 6 */\n\n((window, document) => {\n const WATCH_CLASS = 'i-v';\n const IN_VIEWPORT_CLASS = 'in-viewport';\n const ONCE_IN_VIEWPORT_CLASS = 'in-viewport-once';\n const WAS_IN_VIEWPORT = 'was-in-viewport';\n\n let elements = [];\n\n function hasClass(element, className) {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className);\n }\n }\n\n function addClass(element, className) {\n if (element.classList) {\n return element.classList.add(className);\n } else {\n return element.className += ' ' + className;\n }\n }\n\n function removeClass(element, className) {\n if (element.classList) {\n return element.classList.remove(className);\n }\n else {\n return element.className = element.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\n }\n }\n\n function storeElements() {\n elements = document.getElementsByClassName(WATCH_CLASS);\n }\n\n function update() {\n let viewportTop = window.pageYOffset || document.documentElement.scrollTop;\n let viewportBottom = viewportTop + (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight);\n let scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\n for(let i=0, len = elements.length; i < len; i+= 1) {\n let element = elements[i];\n\n if (true === isInViewport(element, scrollTop, viewportTop, viewportBottom)) {\n if (!hasClass(element, IN_VIEWPORT_CLASS)) {\n addClass(element, IN_VIEWPORT_CLASS);\n\n if (!hasClass(element, ONCE_IN_VIEWPORT_CLASS)) {\n addClass(element, ONCE_IN_VIEWPORT_CLASS);\n }\n }\n } else {\n if (hasClass(element, IN_VIEWPORT_CLASS)) {\n removeClass(element, IN_VIEWPORT_CLASS);\n\n if (!hasClass(element, WAS_IN_VIEWPORT)) {\n addClass(element, WAS_IN_VIEWPORT);\n }\n }\n }\n }\n }\n\n function isInViewport(element, scrollTop, viewportTop, viewportBottom) {\n let elementRect = element.getBoundingClientRect();\n let elementTop = elementRect.top + scrollTop;\n let elementBottom = elementTop + element.offsetHeight;\n\n if (elementBottom >= viewportTop && elementTop < viewportBottom) return true;\n return false;\n }\n\n document.onreadystatechange = () => {\n if (document.readyState === 'interactive') {\n storeElements();\n\n window.addEventListener('scroll', update);\n window.addEventListener('resize', update);\n\n update();\n }\n };\n\n})(window, document);"]}