{"version":3,"file":"main.min.js","sources":["../../../Hedeparken.Frontend/js/utils/helpers.js","../../../Hedeparken.Frontend/js/utils/onReady.js","../../../Hedeparken.Frontend/js/utils/scrollPosition.js","../../../Hedeparken.Frontend/js/utils/elementProperties.js","../../../Hedeparken.Frontend/js/utils/scrollLock.js","../../../Hedeparken.Frontend/js/modules/navigation.js","../../../Hedeparken.Frontend/js/utils/windowResize.js","../../../node_modules/sal.js/dist/sal.js","../../../Hedeparken.Frontend/js/utils/scrollTo.js","../../../Hedeparken.Frontend/js/utils/variables.js","../../../node_modules/rellax/rellax.js","../../../Hedeparken.Frontend/js/modules/rellax.js","../../../node_modules/intersection-observer/intersection-observer.js","../../../Hedeparken.Frontend/js/main.js","../../../Hedeparken.Frontend/js/modules/faq.js","../../../Hedeparken.Frontend/js/modules/anchors.js"],"sourcesContent":["export const transitionEndEventName = detectTransitionEndEventName();\r\n\r\nexport function detectTransitionEndEventName() {\r\n\r\n const transitions = {\r\n \"transition\": \"transitionend\",\r\n \"OTransition\": \"oTransitionEnd\",\r\n \"MozTransition\": \"transitionend\",\r\n \"WebkitTransition\": \"webkitTransitionEnd\"\r\n };\r\n\r\n const el = document.createElement(\"div\");\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nexport function isVisible (elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\nexport function cssAnimateNewHeight(container, classTarget = container, classOnBoth = false) {\r\n let newHeight;\r\n const prevHeight = container.offsetHeight;\r\n\r\n const delayedClose = () => {\r\n if (classOnBoth) {\r\n container.classList.remove('open');\r\n classTarget.classList.remove('open');\r\n } else {\r\n classTarget.classList.remove('open');\r\n }\r\n\r\n classTarget.blur(); // removes focus if its a button\r\n container.removeEventListener(transitionEndEventName, delayedClose);\r\n };\r\n\r\n container.removeAttribute('style');\r\n\r\n if (classTarget.classList.contains('open')) {\r\n newHeight = 0;\r\n container.addEventListener(transitionEndEventName, delayedClose);\r\n\r\n if (classOnBoth) {\r\n classTarget.classList.remove('open');\r\n }\r\n } else {\r\n classTarget.classList.add('open');\r\n\r\n if (classOnBoth) {\r\n container.classList.add('open');\r\n }\r\n\r\n newHeight = container.offsetHeight;\r\n }\r\n\r\n container.style.height = `${prevHeight}px`;\r\n\r\n setTimeout(() => {\r\n container.style.height = `${newHeight}px`;\r\n }, 10);\r\n}\r\n\r\nexport function setupReadmore(selector = '[data-action*=\"readmore\"]') {\r\n const readMoreBtns = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < readMoreBtns.length; i++) {\r\n const readMoreBtn = readMoreBtns[i];\r\n const readMoreContainer = readMoreBtn.hasAttribute('data-target') ? document.getElementById(readMoreBtn.getAttribute('data-target').replace('#', '')) : readMoreBtn.nextElementSibling;\r\n\r\n if (readMoreContainer != null) {\r\n readMoreBtn.addEventListener('click', e => {\r\n e.preventDefault();\r\n\r\n cssAnimateNewHeight(readMoreContainer, readMoreBtn, true);\r\n });\r\n }\r\n\r\n }\r\n}\r\n\r\nexport function polyfillClosest() {\r\n Element.prototype.closest = function (selector) {\r\n const theparent = this.parentNode;\r\n const find = document.querySelectorAll(selector);\r\n\r\n if (theparent !== document.body) {\r\n let found = false;\r\n\r\n for (let a = 0; a < find.length; a++) {\r\n if (find[a] === theparent) {\r\n found = true;\r\n }\r\n }\r\n\r\n if (found) {\r\n return theparent;\r\n } else {\r\n return this.parentNode.closest(selector);\r\n }\r\n } else {\r\n return 0;\r\n }\r\n };\r\n}\r\n\r\nexport function scrollTo(element, to, duration) {\r\n const start = element.scrollTop,\r\n change = to - start,\r\n increment = 20;\r\n\r\n const animateScroll = function (elapsedTime) {\r\n elapsedTime += increment;\r\n const position = easeInOut(elapsedTime, start, change, duration);\r\n element.scrollTop = position;\r\n\r\n if (elapsedTime < duration) {\r\n setTimeout(() => {\r\n animateScroll(elapsedTime);\r\n }, increment);\r\n }\r\n };\r\n\r\n animateScroll(0);\r\n}\r\n\r\nfunction easeInOut(currentTime, start, change, duration) {\r\n currentTime /= duration / 2;\r\n if (currentTime < 1) {\r\n return change / 2 * currentTime * currentTime + start;\r\n }\r\n currentTime -= 1;\r\n return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element ||\r\n element instanceof Document ||\r\n element instanceof Window;\r\n}\r\n","/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === \"interactive\" || document.readyState === \"complete\";\r\n\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n\r\n if (typeof functionReference === \"function\") {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","import { activityThrottler } from \"../utils/trottle\";\r\n\r\n//use window.scrollY\r\nlet scrollpos = window.scrollY;\r\nconst header = document.getElementById(\"header\");\r\n\r\n// eslint-disable-next-line camelcase\r\nfunction addClassOnScroll() {\r\n header.classList.add(\"scroll\");\r\n}\r\n\r\n// eslint-disable-next-line camelcase\r\nfunction removeClassOnScroll() {\r\n header.classList.remove(\"scroll\");\r\n}\r\n\r\n\r\nfunction scrollEvent() {\r\n //Here you forgot to update the value\r\n scrollpos = window.scrollY;\r\n\r\n if (scrollpos > 10) {\r\n addClassOnScroll();\r\n }\r\n else {\r\n removeClassOnScroll();\r\n }\r\n}\r\n\r\nexport function initScrollHeader() {\r\n window.addEventListener('scroll', () => {\r\n scrollEvent();\r\n });\r\n\r\n}\r\n","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n\r\nimport { isElement } from \"./helpers\";\r\n\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n\r\n const useElement = typeof element === \"string\" ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw \"getElementPosition did not find an element.\";\r\n }\r\n\r\n\r\n const useRelativeTo = typeof relativeTo === \"string\" ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw \"getElementPosition did not find an element to show the position relative to.\";\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n // Calculate width with margin\r\n if (options.includeMargin) {\r\n width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n }\r\n\r\n // Calculate width without border\r\n if (!options.includeBorder) {\r\n width -= parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);\r\n }\r\n\r\n // Calculate width without padding\r\n if (!options.includePadding) {\r\n width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\r\n }\r\n\r\n return width;\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n * Get height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get height including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get height including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get height including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get height of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The height as a number\r\n */\r\nexport function getElementHeight(element, options = {}, elementStyle = null) {\r\n\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get height including border and padding\r\n let height = element.offsetHeight;\r\n\r\n // Calculate height with margin\r\n if (options.includeMargin) {\r\n height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n }\r\n\r\n // Calculate height without border\r\n if (!options.includeBorder) {\r\n height -= parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n\r\n // Calculate height without padding\r\n if (!options.includePadding) {\r\n height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\r\n }\r\n\r\n return height;\r\n\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport {getElementScroll} from \"./elementProperties\";\r\n\r\n\r\nconst className = \"scroll-lock\";\r\nlet scrollTop = 0;\r\n\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let currentState = false;\r\n\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!currentState) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = \"fixed\";\r\n htmlTag.style.overflow = \"hidden\";\r\n htmlTag.style.width = \"100%\";\r\n\r\n // Remember state\r\n currentState = true;\r\n scrollTop = scrollPosition.top;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const enable = enableScrollLock;\r\n\r\n\r\n\r\n/**\r\n * Disable the scroll lock\r\n */\r\nexport function disableScrollLock() {\r\n if (currentState) {\r\n const scrollPosition = getElementScroll();\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.remove(className);\r\n htmlTag.style.marginTop = \"\";\r\n htmlTag.style.position = \"\";\r\n htmlTag.style.overflow = \"\";\r\n htmlTag.style.width = \"\";\r\n\r\n // Set the scroll position to what it was before\r\n window.scrollTo(scrollPosition.left, scrollTop);\r\n\r\n // Remember state\r\n currentState = false;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const disable = disableScrollLock;\r\n\r\n\r\n\r\n/**\r\n * Toggle the scroll lock between on and off\r\n */\r\nexport function toggleScrollLock() {\r\n if (currentState) {\r\n disableScrollLock();\r\n } else {\r\n enableScrollLock();\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const toggle = toggleScrollLock;\r\n\r\n\r\nexport default {\r\n enable,\r\n disable,\r\n toggle\r\n};\r\n","import {disableScrollLock, enableScrollLock} from \"../utils/scrollLock\";\r\n\r\nexport function init() {\r\n //mandrill forms\r\n const navigationTakeoverToggles = document.querySelectorAll('[data-action*=\"navigation-takeover-toggle\"]');\r\n\r\n function navigationToggle (e) {\r\n e.preventDefault();\r\n\r\n if (!document.body.classList.contains('nav-open')) {\r\n enableScrollLock();\r\n document.body.classList.add('nav-open');\r\n } else {\r\n setTimeout(disableScrollLock, 400);\r\n document.body.classList.remove('nav-open');\r\n }\r\n }\r\n\r\n for (let i = 0; i < navigationTakeoverToggles.length; i++) {\r\n navigationTakeoverToggles[i].addEventListener('click', navigationToggle);\r\n }\r\n}\r\n","export const breakpoints = {\r\n \"xxs\": 1,\r\n \"xs\": 480,\r\n \"sm\": 768,\r\n \"md\": 1024,\r\n \"lg\": 1280,\r\n \"xl\": 1540,\r\n \"xxl\": 1840\r\n};\r\n\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint = 0;\r\nlet resizeTimer;\r\n\r\nconst resizeFunctions = [];\r\n\r\n/**\r\n * Get various window sizes - width, height etc.\r\n * This function is fired automatically upon page load. and run each time the window changes size.\r\n *\r\n */\r\nfunction getWindowSizes() {\r\n\r\n currentWindowWidth = window.innerWidth;\r\n currentWindowHeight = window.innerHeight;\r\n\r\n // Calculate which breakpoint is currently active, based on the screen width compared to the breakpoint definitions.\r\n\r\n let lastFoundWidth = 0;\r\n\r\n breakpointKeys.forEach((key, index) => {\r\n const width = breakpoints[key];\r\n if (currentWindowWidth >= width && width > lastFoundWidth) {\r\n lastFoundWidth = width;\r\n currentBreakpoint = index;\r\n }\r\n });\r\n}\r\n\r\nfunction resizeHandler() {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n getWindowSizes();\r\n resizeFunctions.forEach(funcRef => funcRef());\r\n }, 100);\r\n}\r\n\r\nexport function onWindowResize(handler) {\r\n resizeFunctions.push(handler);\r\n}\r\n\r\nexport function initWindowResize() {\r\n getWindowSizes();\r\n window.addEventListener('resize', resizeHandler);\r\n window.addEventListener('orientationchange', resizeHandler);\r\n}\r\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.sal=t():e.sal=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"dist/\",n(n.s=0)}([function(e,t,n){\"use strict\";n.r(t);n(1);function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=l.threshold?(!function(e){e.target.classList.add(l.animateClassName),f(l.enterEventName,e)}(e),l.once&&t.unobserve(e.target)):l.once||function(e){e.target.classList.remove(l.animateClassName),f(l.exitEventName,e)}(e)}))},m=function(){d(),c.disconnect(),c=null},y=function(){document.body.classList.remove(l.disabledClassName),c=new IntersectionObserver(p,{rootMargin:l.rootMargin,threshold:l.threshold}),(u=[].filter.call(document.querySelectorAll(l.selector),(function(e){return!function(e){return e.classList.contains(l.animateClassName)}(e,l.animateClassName)}))).forEach((function(e){return c.observe(e)}))};t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l;if(e!==l&&(l=o({},l,{},e)),\"undefined\"==typeof window)return console.warn(a),{elements:u,disable:m,enable:y};if(!window.IntersectionObserver)throw d(),Error(s);return b()?d():y(),{elements:u,disable:m,enable:y}}},function(e,t,n){}]).default}));\n//# sourceMappingURL=sal.js.map","import { getElementPosition } from './elementProperties';\r\n\r\nconst easeInOutQuad = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n time /= duration / 2;\r\n if (time < 1) {\r\n return (change / 2) * time * time + start;\r\n }\r\n time--;\r\n return (-change / 2) * (time * (time - 2) - 1) + start;\r\n};\r\n\r\nconst easeInOutQuintic = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n const ts = (time /= duration) * time,\r\n tc = ts * time;\r\n return start + change * (6 * tc * ts + -15 * ts * ts + 10 * tc);\r\n};\r\n\r\nexport function scrollTo(to, duration = 750, callback) {\r\n function move(amount) {\r\n if (document.scrollingElement) {\r\n document.scrollingElement.scrollTop = amount;\r\n } else {\r\n document.documentElement.scrollTop = amount;\r\n document.body.parentNode.scrollTop = amount;\r\n document.body.scrollTop = amount;\r\n }\r\n }\r\n function position() {\r\n return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop;\r\n }\r\n\r\n const start = position(),\r\n change = to instanceof Element ? getElementPosition(to).top - start : to - start,\r\n increment = 20;\r\n\r\n\r\n let currentTime = 0;\r\n\r\n const animate = function() {\r\n // increment the time\r\n currentTime += increment;\r\n // find the value with the quadratic in-out easing function\r\n const val = easeInOutQuintic(currentTime, start, change, duration);\r\n // move the document.body\r\n move(val);\r\n // do the animation unless its over\r\n if (currentTime < duration) {\r\n requestAnimationFrame(animate);\r\n } else {\r\n if (callback && typeof callback === 'function') {\r\n // the animation is done so lets callback\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n }\r\n };\r\n animate();\r\n}\r\n","export const isIE11 = !!window.MSInputMethodContext && !!document.documentMode;\r\nexport const windowWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\nexport const windowHeight = window.innerHeight;\r\nexport const header = document.querySelector('.header');\r\n","\n// ------------------------------------------\n// Rellax.js\n// Buttery smooth parallax library\n// Copyright (c) 2016 Moe Amaya (@moeamaya)\n// MIT license\n//\n// Thanks to Paraxify.js and Jaime Cabllero\n// for parallax concepts\n// ------------------------------------------\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.Rellax = factory();\n }\n}(typeof window !== \"undefined\" ? window : global, function () {\n var Rellax = function(el, options){\n \"use strict\";\n\n var self = Object.create(Rellax.prototype);\n\n var posY = 0;\n var screenY = 0;\n var posX = 0;\n var screenX = 0;\n var blocks = [];\n var pause = true;\n\n // check what requestAnimationFrame to use, and if\n // it's not supported, use the onscroll event\n var loop = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n function(callback){ return setTimeout(callback, 1000 / 60); };\n\n // store the id for later use\n var loopId = null;\n\n // Test via a getter in the options object to see if the passive property is accessed\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function() {\n supportsPassive = true;\n }\n });\n window.addEventListener(\"testPassive\", null, opts);\n window.removeEventListener(\"testPassive\", null, opts);\n } catch (e) {}\n\n // check what cancelAnimation method to use\n var clearLoop = window.cancelAnimationFrame || window.mozCancelAnimationFrame || clearTimeout;\n\n // check which transform property to use\n var transformProp = window.transformProp || (function(){\n var testEl = document.createElement('div');\n if (testEl.style.transform === null) {\n var vendors = ['Webkit', 'Moz', 'ms'];\n for (var vendor in vendors) {\n if (testEl.style[ vendors[vendor] + 'Transform' ] !== undefined) {\n return vendors[vendor] + 'Transform';\n }\n }\n }\n return 'transform';\n })();\n\n // Default Settings\n self.options = {\n speed: -2,\n\t verticalSpeed: null,\n\t horizontalSpeed: null,\n breakpoints: [576, 768, 1201],\n center: false,\n wrapper: null,\n relativeToWrapper: false,\n round: true,\n vertical: true,\n horizontal: false,\n verticalScrollAxis: \"y\",\n horizontalScrollAxis: \"x\",\n callback: function() {},\n };\n\n // User defined options (might have more in the future)\n if (options){\n Object.keys(options).forEach(function(key){\n self.options[key] = options[key];\n });\n }\n\n function validateCustomBreakpoints () {\n if (self.options.breakpoints.length === 3 && Array.isArray(self.options.breakpoints)) {\n var isAscending = true;\n var isNumerical = true;\n var lastVal;\n self.options.breakpoints.forEach(function (i) {\n if (typeof i !== 'number') isNumerical = false;\n if (lastVal !== null) {\n if (i < lastVal) isAscending = false;\n }\n lastVal = i;\n });\n if (isAscending && isNumerical) return;\n }\n // revert defaults if set incorrectly\n self.options.breakpoints = [576, 768, 1201];\n console.warn(\"Rellax: You must pass an array of 3 numbers in ascending order to the breakpoints option. Defaults reverted\");\n }\n\n if (options && options.breakpoints) {\n validateCustomBreakpoints();\n }\n\n // By default, rellax class\n if (!el) {\n el = '.rellax';\n }\n\n // check if el is a className or a node\n var elements = typeof el === 'string' ? document.querySelectorAll(el) : [el];\n\n // Now query selector\n if (elements.length > 0) {\n self.elems = elements;\n }\n\n // The elements don't exist\n else {\n console.warn(\"Rellax: The elements you're trying to select don't exist.\");\n return;\n }\n\n // Has a wrapper and it exists\n if (self.options.wrapper) {\n if (!self.options.wrapper.nodeType) {\n var wrapper = document.querySelector(self.options.wrapper);\n\n if (wrapper) {\n self.options.wrapper = wrapper;\n } else {\n console.warn(\"Rellax: The wrapper you're trying to use doesn't exist.\");\n return;\n }\n }\n }\n\n // set a placeholder for the current breakpoint\n var currentBreakpoint;\n\n // helper to determine current breakpoint\n var getCurrentBreakpoint = function (w) {\n var bp = self.options.breakpoints;\n if (w < bp[0]) return 'xs';\n if (w >= bp[0] && w < bp[1]) return 'sm';\n if (w >= bp[1] && w < bp[2]) return 'md';\n return 'lg';\n };\n\n // Get and cache initial position of all elements\n var cacheBlocks = function() {\n for (var i = 0; i < self.elems.length; i++){\n var block = createBlock(self.elems[i]);\n blocks.push(block);\n }\n };\n\n\n // Let's kick this script off\n // Build array for cached element values\n var init = function() {\n for (var i = 0; i < blocks.length; i++){\n self.elems[i].style.cssText = blocks[i].style;\n }\n\n blocks = [];\n\n screenY = window.innerHeight;\n screenX = window.innerWidth;\n currentBreakpoint = getCurrentBreakpoint(screenX);\n\n setPosition();\n\n cacheBlocks();\n\n animate();\n\n // If paused, unpause and set listener for window resizing events\n if (pause) {\n window.addEventListener('resize', init);\n pause = false;\n // Start the loop\n update();\n }\n };\n\n // We want to cache the parallax blocks'\n // values: base, top, height, speed\n // el: is dom object, return: el cache values\n var createBlock = function(el) {\n var dataPercentage = el.getAttribute( 'data-rellax-percentage' );\n var dataSpeed = el.getAttribute( 'data-rellax-speed' );\n var dataXsSpeed = el.getAttribute( 'data-rellax-xs-speed' );\n var dataMobileSpeed = el.getAttribute( 'data-rellax-mobile-speed' );\n var dataTabletSpeed = el.getAttribute( 'data-rellax-tablet-speed' );\n var dataDesktopSpeed = el.getAttribute( 'data-rellax-desktop-speed' );\n var dataVerticalSpeed = el.getAttribute('data-rellax-vertical-speed');\n var dataHorizontalSpeed = el.getAttribute('data-rellax-horizontal-speed');\n var dataVericalScrollAxis = el.getAttribute('data-rellax-vertical-scroll-axis');\n var dataHorizontalScrollAxis = el.getAttribute('data-rellax-horizontal-scroll-axis');\n var dataZindex = el.getAttribute( 'data-rellax-zindex' ) || 0;\n var dataMin = el.getAttribute( 'data-rellax-min' );\n var dataMax = el.getAttribute( 'data-rellax-max' );\n var dataMinX = el.getAttribute('data-rellax-min-x');\n var dataMaxX = el.getAttribute('data-rellax-max-x');\n var dataMinY = el.getAttribute('data-rellax-min-y');\n var dataMaxY = el.getAttribute('data-rellax-max-y');\n var mapBreakpoints;\n var breakpoints = true;\n\n if (!dataXsSpeed && !dataMobileSpeed && !dataTabletSpeed && !dataDesktopSpeed) {\n breakpoints = false;\n } else {\n mapBreakpoints = {\n 'xs': dataXsSpeed,\n 'sm': dataMobileSpeed,\n 'md': dataTabletSpeed,\n 'lg': dataDesktopSpeed\n };\n }\n\n // initializing at scrollY = 0 (top of browser), scrollX = 0 (left of browser)\n // ensures elements are positioned based on HTML layout.\n //\n // If the element has the percentage attribute, the posY and posX needs to be\n // the current scroll position's value, so that the elements are still positioned based on HTML layout\n var wrapperPosY = self.options.wrapper ? self.options.wrapper.scrollTop : (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);\n // If the option relativeToWrapper is true, use the wrappers offset to top, subtracted from the current page scroll.\n if (self.options.relativeToWrapper) {\n var scrollPosY = (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);\n wrapperPosY = scrollPosY - self.options.wrapper.offsetTop;\n }\n var posY = self.options.vertical ? ( dataPercentage || self.options.center ? wrapperPosY : 0 ) : 0;\n var posX = self.options.horizontal ? ( dataPercentage || self.options.center ? self.options.wrapper ? self.options.wrapper.scrollLeft : (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft) : 0 ) : 0;\n\n var blockTop = posY + el.getBoundingClientRect().top;\n var blockHeight = el.clientHeight || el.offsetHeight || el.scrollHeight;\n\n var blockLeft = posX + el.getBoundingClientRect().left;\n var blockWidth = el.clientWidth || el.offsetWidth || el.scrollWidth;\n\n // apparently parallax equation everyone uses\n var percentageY = dataPercentage ? dataPercentage : (posY - blockTop + screenY) / (blockHeight + screenY);\n var percentageX = dataPercentage ? dataPercentage : (posX - blockLeft + screenX) / (blockWidth + screenX);\n if(self.options.center){ percentageX = 0.5; percentageY = 0.5; }\n\n // Optional individual block speed as data attr, otherwise global speed\n var speed = (breakpoints && mapBreakpoints[currentBreakpoint] !== null) ? Number(mapBreakpoints[currentBreakpoint]) : (dataSpeed ? dataSpeed : self.options.speed);\n var verticalSpeed = dataVerticalSpeed ? dataVerticalSpeed : self.options.verticalSpeed;\n var horizontalSpeed = dataHorizontalSpeed ? dataHorizontalSpeed : self.options.horizontalSpeed;\n\n // Optional individual block movement axis direction as data attr, otherwise gobal movement direction\n var verticalScrollAxis = dataVericalScrollAxis ? dataVericalScrollAxis : self.options.verticalScrollAxis;\n var horizontalScrollAxis = dataHorizontalScrollAxis ? dataHorizontalScrollAxis : self.options.horizontalScrollAxis;\n\n var bases = updatePosition(percentageX, percentageY, speed, verticalSpeed, horizontalSpeed);\n\n // ~~Store non-translate3d transforms~~\n // Store inline styles and extract transforms\n var style = el.style.cssText;\n var transform = '';\n\n // Check if there's an inline styled transform\n var searchResult = /transform\\s*:/i.exec(style);\n if (searchResult) {\n // Get the index of the transform\n var index = searchResult.index;\n\n // Trim the style to the transform point and get the following semi-colon index\n var trimmedStyle = style.slice(index);\n var delimiter = trimmedStyle.indexOf(';');\n\n // Remove \"transform\" string and save the attribute\n if (delimiter) {\n transform = \" \" + trimmedStyle.slice(11, delimiter).replace(/\\s/g,'');\n } else {\n transform = \" \" + trimmedStyle.slice(11).replace(/\\s/g,'');\n }\n }\n\n return {\n baseX: bases.x,\n baseY: bases.y,\n top: blockTop,\n left: blockLeft,\n height: blockHeight,\n width: blockWidth,\n speed: speed,\n verticalSpeed: verticalSpeed,\n horizontalSpeed: horizontalSpeed,\n verticalScrollAxis: verticalScrollAxis,\n horizontalScrollAxis: horizontalScrollAxis,\n style: style,\n transform: transform,\n zindex: dataZindex,\n min: dataMin,\n max: dataMax,\n minX: dataMinX,\n maxX: dataMaxX,\n minY: dataMinY,\n maxY: dataMaxY\n };\n };\n\n // set scroll position (posY, posX)\n // side effect method is not ideal, but okay for now\n // returns true if the scroll changed, false if nothing happened\n var setPosition = function() {\n var oldY = posY;\n var oldX = posX;\n\n posY = self.options.wrapper ? self.options.wrapper.scrollTop : (document.documentElement || document.body.parentNode || document.body).scrollTop || window.pageYOffset;\n posX = self.options.wrapper ? self.options.wrapper.scrollLeft : (document.documentElement || document.body.parentNode || document.body).scrollLeft || window.pageXOffset;\n // If option relativeToWrapper is true, use relative wrapper value instead.\n if (self.options.relativeToWrapper) {\n var scrollPosY = (document.documentElement || document.body.parentNode || document.body).scrollTop || window.pageYOffset;\n posY = scrollPosY - self.options.wrapper.offsetTop;\n }\n\n\n if (oldY != posY && self.options.vertical) {\n // scroll changed, return true\n return true;\n }\n\n if (oldX != posX && self.options.horizontal) {\n // scroll changed, return true\n return true;\n }\n\n // scroll did not change\n return false;\n };\n\n // Ahh a pure function, gets new transform value\n // based on scrollPosition and speed\n // Allow for decimal pixel values\n var updatePosition = function(percentageX, percentageY, speed, verticalSpeed, horizontalSpeed) {\n var result = {};\n var valueX = ((horizontalSpeed ? horizontalSpeed : speed) * (100 * (1 - percentageX)));\n var valueY = ((verticalSpeed ? verticalSpeed : speed) * (100 * (1 - percentageY)));\n\n result.x = self.options.round ? Math.round(valueX) : Math.round(valueX * 100) / 100;\n result.y = self.options.round ? Math.round(valueY) : Math.round(valueY * 100) / 100;\n\n return result;\n };\n\n // Remove event listeners and loop again\n var deferredUpdate = function() {\n window.removeEventListener('resize', deferredUpdate);\n window.removeEventListener('orientationchange', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : window).removeEventListener('scroll', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : document).removeEventListener('touchmove', deferredUpdate);\n\n // loop again\n loopId = loop(update);\n };\n\n // Loop\n var update = function() {\n if (setPosition() && pause === false) {\n animate();\n\n // loop again\n loopId = loop(update);\n } else {\n loopId = null;\n\n // Don't animate until we get a position updating event\n window.addEventListener('resize', deferredUpdate);\n window.addEventListener('orientationchange', deferredUpdate);\n (self.options.wrapper ? self.options.wrapper : window).addEventListener('scroll', deferredUpdate, supportsPassive ? { passive: true } : false);\n (self.options.wrapper ? self.options.wrapper : document).addEventListener('touchmove', deferredUpdate, supportsPassive ? { passive: true } : false);\n }\n };\n\n // Transform3d on parallax element\n var animate = function() {\n var positions;\n for (var i = 0; i < self.elems.length; i++){\n // Determine relevant movement directions\n var verticalScrollAxis = blocks[i].verticalScrollAxis.toLowerCase();\n var horizontalScrollAxis = blocks[i].horizontalScrollAxis.toLowerCase();\n var verticalScrollX = verticalScrollAxis.indexOf(\"x\") != -1 ? posY : 0;\n var verticalScrollY = verticalScrollAxis.indexOf(\"y\") != -1 ? posY : 0;\n var horizontalScrollX = horizontalScrollAxis.indexOf(\"x\") != -1 ? posX : 0;\n var horizontalScrollY = horizontalScrollAxis.indexOf(\"y\") != -1 ? posX : 0;\n\n var percentageY = ((verticalScrollY + horizontalScrollY - blocks[i].top + screenY) / (blocks[i].height + screenY));\n var percentageX = ((verticalScrollX + horizontalScrollX - blocks[i].left + screenX) / (blocks[i].width + screenX));\n\n // Subtracting initialize value, so element stays in same spot as HTML\n positions = updatePosition(percentageX, percentageY, blocks[i].speed, blocks[i].verticalSpeed, blocks[i].horizontalSpeed);\n var positionY = positions.y - blocks[i].baseY;\n var positionX = positions.x - blocks[i].baseX;\n\n // The next two \"if\" blocks go like this:\n // Check if a limit is defined (first \"min\", then \"max\");\n // Check if we need to change the Y or the X\n // (Currently working only if just one of the axes is enabled)\n // Then, check if the new position is inside the allowed limit\n // If so, use new position. If not, set position to limit.\n\n // Check if a min limit is defined\n if (blocks[i].min !== null) {\n if (self.options.vertical && !self.options.horizontal) {\n positionY = positionY <= blocks[i].min ? blocks[i].min : positionY;\n }\n if (self.options.horizontal && !self.options.vertical) {\n positionX = positionX <= blocks[i].min ? blocks[i].min : positionX;\n }\n }\n\n // Check if directional min limits are defined\n if (blocks[i].minY != null) {\n positionY = positionY <= blocks[i].minY ? blocks[i].minY : positionY;\n }\n if (blocks[i].minX != null) {\n positionX = positionX <= blocks[i].minX ? blocks[i].minX : positionX;\n }\n\n // Check if a max limit is defined\n if (blocks[i].max !== null) {\n if (self.options.vertical && !self.options.horizontal) {\n positionY = positionY >= blocks[i].max ? blocks[i].max : positionY;\n }\n if (self.options.horizontal && !self.options.vertical) {\n positionX = positionX >= blocks[i].max ? blocks[i].max : positionX;\n }\n }\n\n // Check if directional max limits are defined\n if (blocks[i].maxY != null) {\n positionY = positionY >= blocks[i].maxY ? blocks[i].maxY : positionY;\n }\n if (blocks[i].maxX != null) {\n positionX = positionX >= blocks[i].maxX ? blocks[i].maxX : positionX;\n }\n\n var zindex = blocks[i].zindex;\n\n // Move that element\n // (Set the new translation and append initial inline transforms.)\n var translate = 'translate3d(' + (self.options.horizontal ? positionX : '0') + 'px,' + (self.options.vertical ? positionY : '0') + 'px,' + zindex + 'px) ' + blocks[i].transform;\n self.elems[i].style[transformProp] = translate;\n }\n self.options.callback(positions);\n };\n\n self.destroy = function() {\n for (var i = 0; i < self.elems.length; i++){\n self.elems[i].style.cssText = blocks[i].style;\n }\n\n // Remove resize event listener if not pause, and pause\n if (!pause) {\n window.removeEventListener('resize', init);\n pause = true;\n }\n\n // Clear the animation loop to prevent possible memory leak\n clearLoop(loopId);\n loopId = null;\n };\n\n // Init\n init();\n\n // Allow to recalculate the initial values whenever we want\n self.refresh = init;\n\n return self;\n };\n return Rellax;\n}));\n","import * as variables from '../utils/variables';\r\nimport Rellax from \"rellax\";\r\nimport { onWindowResize, currentWindowWidth } from '../utils/windowResize';\r\n\r\nexport function initRellaxJs () {\r\n let rellaxSelector = '.rellax';\r\n if (variables.header && variables.header.offsetHeight > variables.windowHeight) {\r\n rellaxSelector = '.rellax:not(.header)';\r\n }\r\n\r\n var rellax = new Rellax(rellaxSelector);\r\n onWindowResize((() => {\r\n if (currentWindowWidth > 480 && currentWindowWidth < 768) {\r\n rellax.destroy();\r\n } else {\r\n rellax.refresh();\r\n }\r\n }));\r\n}\r\n\r\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n(function() {\n'use strict';\n\n// Exit early if we're not running in a browser.\nif (typeof window !== 'object') {\n return;\n}\n\n// Exit early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\n // See: https://github.com/w3c/IntersectionObserver/issues/211\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n Object.defineProperty(window.IntersectionObserverEntry.prototype,\n 'isIntersecting', {\n get: function () {\n return this.intersectionRatio > 0;\n }\n });\n }\n return;\n}\n\n\n/**\n * A local reference to the document.\n */\nvar document = window.document;\n\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n this.time = entry.time;\n this.target = entry.target;\n this.rootBounds = entry.rootBounds;\n this.boundingClientRect = entry.boundingClientRect;\n this.intersectionRect = entry.intersectionRect || getEmptyRect();\n this.isIntersecting = !!entry.intersectionRect;\n\n // Calculates the intersection ratio.\n var targetRect = this.boundingClientRect;\n var targetArea = targetRect.width * targetRect.height;\n var intersectionRect = this.intersectionRect;\n var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n // Sets intersection ratio.\n if (targetArea) {\n // Round the intersection ratio to avoid floating point math issues:\n // https://github.com/w3c/IntersectionObserver/issues/324\n this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n } else {\n // If area is zero and is intersecting, sets to 1, otherwise to 0\n this.intersectionRatio = this.isIntersecting ? 1 : 0;\n }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n * changes have queued. The function is not invoked if the queue has\n * been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n var options = opt_options || {};\n\n if (typeof callback != 'function') {\n throw new Error('callback must be a function');\n }\n\n if (options.root && options.root.nodeType != 1) {\n throw new Error('root must be an Element');\n }\n\n // Binds and throttles `this._checkForIntersections`.\n this._checkForIntersections = throttle(\n this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n // Private properties.\n this._callback = callback;\n this._observationTargets = [];\n this._queuedEntries = [];\n this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n // Public properties.\n this.thresholds = this._initThresholds(options.threshold);\n this.root = options.root || null;\n this.rootMargin = this._rootMarginValues.map(function(margin) {\n return margin.value + margin.unit;\n }).join(' ');\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n return item.element == target;\n });\n\n if (isTargetAlreadyObserved) {\n return;\n }\n\n if (!(target && target.nodeType == 1)) {\n throw new Error('target must be an Element');\n }\n\n this._registerInstance();\n this._observationTargets.push({element: target, entry: null});\n this._monitorIntersections();\n this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n this._observationTargets =\n this._observationTargets.filter(function(item) {\n\n return item.element != target;\n });\n if (!this._observationTargets.length) {\n this._unmonitorIntersections();\n this._unregisterInstance();\n }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n this._observationTargets = [];\n this._unmonitorIntersections();\n this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n var records = this._queuedEntries.slice();\n this._queuedEntries = [];\n return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n * a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n var threshold = opt_threshold || [0];\n if (!Array.isArray(threshold)) threshold = [threshold];\n\n return threshold.sort().filter(function(t, i, a) {\n if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n throw new Error('threshold must be a number between 0 and 1 inclusively');\n }\n return t !== a[i - 1];\n });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n * defaulting to '0px'.\n * @return {Array} An array of margin objects with the keys\n * value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n var marginString = opt_rootMargin || '0px';\n var margins = marginString.split(/\\s+/).map(function(margin) {\n var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n if (!parts) {\n throw new Error('rootMargin must be specified in pixels or percent');\n }\n return {value: parseFloat(parts[1]), unit: parts[2]};\n });\n\n // Handles shorthand.\n margins[1] = margins[1] || margins[0];\n margins[2] = margins[2] || margins[0];\n margins[3] = margins[3] || margins[1];\n\n return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function() {\n if (!this._monitoringIntersections) {\n this._monitoringIntersections = true;\n\n // If a poll interval is set, use polling instead of listening to\n // resize and scroll events or DOM mutations.\n if (this.POLL_INTERVAL) {\n this._monitoringInterval = setInterval(\n this._checkForIntersections, this.POLL_INTERVAL);\n }\n else {\n addEvent(window, 'resize', this._checkForIntersections, true);\n addEvent(document, 'scroll', this._checkForIntersections, true);\n\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n this._domObserver = new MutationObserver(this._checkForIntersections);\n this._domObserver.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function() {\n if (this._monitoringIntersections) {\n this._monitoringIntersections = false;\n\n clearInterval(this._monitoringInterval);\n this._monitoringInterval = null;\n\n removeEvent(window, 'resize', this._checkForIntersections, true);\n removeEvent(document, 'scroll', this._checkForIntersections, true);\n\n if (this._domObserver) {\n this._domObserver.disconnect();\n this._domObserver = null;\n }\n }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n var rootIsInDom = this._rootIsInDom();\n var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n this._observationTargets.forEach(function(item) {\n var target = item.element;\n var targetRect = getBoundingClientRect(target);\n var rootContainsTarget = this._rootContainsTarget(target);\n var oldEntry = item.entry;\n var intersectionRect = rootIsInDom && rootContainsTarget &&\n this._computeTargetAndRootIntersection(target, rootRect);\n\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: rootRect,\n intersectionRect: intersectionRect\n });\n\n if (!oldEntry) {\n this._queuedEntries.push(newEntry);\n } else if (rootIsInDom && rootContainsTarget) {\n // If the new entry intersection ratio has crossed any of the\n // thresholds, add a new entry.\n if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n this._queuedEntries.push(newEntry);\n }\n } else {\n // If the root is not in the DOM or target is not contained within\n // root but the previous entry for this target had an intersection,\n // add a new record indicating removal.\n if (oldEntry && oldEntry.isIntersecting) {\n this._queuedEntries.push(newEntry);\n }\n }\n }, this);\n\n if (this._queuedEntries.length) {\n this._callback(this.takeRecords(), this);\n }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n * expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n * intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n function(target, rootRect) {\n\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n\n var targetRect = getBoundingClientRect(target);\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n\n while (!atRoot) {\n var parentRect = null;\n var parentComputedStyle = parent.nodeType == 1 ?\n window.getComputedStyle(parent) : {};\n\n // If the parent isn't displayed, an intersection can't happen.\n if (parentComputedStyle.display == 'none') return;\n\n if (parent == this.root || parent == document) {\n atRoot = true;\n parentRect = rootRect;\n } else {\n // If the element has a non-visible overflow, and it's not the \n // or element, update the intersection rect.\n // Note: and cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n if (parent != document.body &&\n parent != document.documentElement &&\n parentComputedStyle.overflow != 'visible') {\n parentRect = getBoundingClientRect(parent);\n }\n }\n\n // If either of the above conditionals set a new parentRect,\n // calculate new intersection data.\n if (parentRect) {\n intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n\n if (!intersectionRect) break;\n }\n parent = getParentNode(parent);\n }\n return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n var rootRect;\n if (this.root) {\n rootRect = getBoundingClientRect(this.root);\n } else {\n // Use / instead of window since scroll bars affect size.\n var html = document.documentElement;\n var body = document.body;\n rootRect = {\n top: 0,\n left: 0,\n right: html.clientWidth || body.clientWidth,\n width: html.clientWidth || body.clientWidth,\n bottom: html.clientHeight || body.clientHeight,\n height: html.clientHeight || body.clientHeight\n };\n }\n return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n var margins = this._rootMarginValues.map(function(margin, i) {\n return margin.unit == 'px' ? margin.value :\n margin.value * (i % 2 ? rect.width : rect.height) / 100;\n });\n var newRect = {\n top: rect.top - margins[0],\n right: rect.right + margins[1],\n bottom: rect.bottom + margins[2],\n left: rect.left - margins[3]\n };\n newRect.width = newRect.right - newRect.left;\n newRect.height = newRect.bottom - newRect.top;\n\n return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n * particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n * particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n function(oldEntry, newEntry) {\n\n // To make comparing easier, an entry that has a ratio of 0\n // but does not actually intersect is given a value of -1\n var oldRatio = oldEntry && oldEntry.isIntersecting ?\n oldEntry.intersectionRatio || 0 : -1;\n var newRatio = newEntry.isIntersecting ?\n newEntry.intersectionRatio || 0 : -1;\n\n // Ignore unchanged ratios\n if (oldRatio === newRatio) return;\n\n for (var i = 0; i < this.thresholds.length; i++) {\n var threshold = this.thresholds[i];\n\n // Return true if an entry matches a threshold or if the new ratio\n // and the old ratio are on the opposite sides of a threshold.\n if (threshold == oldRatio || threshold == newRatio ||\n threshold < oldRatio !== threshold < newRatio) {\n return true;\n }\n }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n return containsDeep(this.root || document, target);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n if (registry.indexOf(this) < 0) {\n registry.push(this);\n }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n var index = registry.indexOf(this);\n if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n * function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n var timer = null;\n return function () {\n if (!timer) {\n timer = setTimeout(function() {\n fn();\n timer = null;\n }, timeout);\n }\n };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n * phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n if (typeof node.addEventListener == 'function') {\n node.addEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.attachEvent == 'function') {\n node.attachEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n * flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n if (typeof node.removeEventListener == 'function') {\n node.removeEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.detatchEvent == 'function') {\n node.detatchEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n * is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n var top = Math.max(rect1.top, rect2.top);\n var bottom = Math.min(rect1.bottom, rect2.bottom);\n var left = Math.max(rect1.left, rect2.left);\n var right = Math.min(rect1.right, rect2.right);\n var width = right - left;\n var height = bottom - top;\n\n return (width >= 0 && height >= 0) && {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n var rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (err) {\n // Ignore Windows 7 IE11 \"Unspecified error\"\n // https://github.com/w3c/IntersectionObserver/pull/205\n }\n\n if (!rect) return getEmptyRect();\n\n // Older IE\n if (!(rect.width && rect.height)) {\n rect = {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n }\n return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\nfunction getEmptyRect() {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n width: 0,\n height: 0\n };\n}\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n var node = child;\n while (node) {\n if (node == parent) return true;\n\n node = getParentNode(node);\n }\n return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n var parent = node.parentNode;\n\n if (parent && parent.nodeType == 11 && parent.host) {\n // If the parent is a shadow root, return the host element.\n return parent.host;\n }\n\n if (parent && parent.assignedSlot) {\n // If the parent is distributed in a , return the parent of a slot.\n return parent.assignedSlot.parentNode;\n }\n\n return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}());\n","import { setupReadmore } from './utils/helpers';\r\nimport { onReady } from \"./utils/onReady\";\r\nimport { initScrollHeader } from \"./utils/scrollPosition\";\r\n// import {setupBgPlayButtons} from \"./modules/video\";\r\n// import {setupFilters} from \"./modules/filter\";\r\nimport * as navigation from \"./modules/navigation\";\r\nimport * as faq from \"./modules/faq\";\r\nimport * as logo from \"./modules/logo\";\r\n// import Rellax from \"rellax\";\r\nimport sal from 'sal.js';\r\n// import * as form from './modules/form';\r\nimport { onWindowResize, currentWindowWidth, initWindowResize } from './utils/windowResize';\r\nimport { setupAnchorLinkScroll } from './modules/anchors';\r\nimport { initRellaxJs } from './modules/rellax';\r\nimport \"intersection-observer\";\r\n\r\n\r\nonReady(() => {\r\n initWindowResize();\r\n\r\n setTimeout(() => {\r\n document.body.classList.remove(\"loading\");\r\n }, 250);\r\n\r\n // setupBgPlayButtons();\r\n // setupReadmore();\r\n // setupFilters();\r\n navigation.init();\r\n\r\n // logo.change();\r\n\r\n\r\n faq.initFaq();\r\n\r\n\r\n initScrollHeader();\r\n\r\n // form.init();\r\n sal({\r\n threshold: .2,\r\n });\r\n setupAnchorLinkScroll();\r\n initRellaxJs();\r\n});\r\n","// import { cssAnimateNewHeight } from '../utils/helpers';\r\n\r\nexport function initFaq() {\r\n\r\n\r\n function slidetoggle() {\r\n\r\n document.querySelectorAll(this.getAttribute('data-slidetoggle')).forEach(el => {\r\n\r\n\r\n const ch = el.clientHeight,\r\n sh = el.scrollHeight,\r\n isCollapsed = !ch,\r\n noHeightSet = !el.style.height;\r\n\r\n el.style.height = `${isCollapsed || noHeightSet ? sh : 0}px`;\r\n // if (noHeightSet) return slidetoggle.call(this);\r\n // console.log(\"call\");\r\n\r\n this.classList.toggle('faq-open');\r\n });\r\n\r\n }\r\n\r\n document.querySelectorAll(\"[data-slidetoggle]\").forEach(el => el.addEventListener('click', slidetoggle));\r\n}\r\n","import { scrollTo } from '../utils/scrollTo';\r\n\r\n/**\r\n * This function strips relative site path from hashlink\r\n *\r\n * @param {string} hashLink\r\n *\r\n * @returns {HTMLElement}\r\n */\r\nfunction returnHashElement(hashLink) {\r\n if (hashLink.indexOf(window.location.pathname) !== -1) {\r\n return document.getElementById(hashLink.replace(window.location.pathname, '').replace('#', ''));\r\n } else {\r\n return document.getElementById(hashLink.replace('#', ''));\r\n }\r\n}\r\n\r\n/**\r\n * Scrolls the viewport to an hash-id\r\n * if found in querystring\r\n */\r\nexport function scrollToUrlHash() {\r\n if (window.location.hash) {\r\n const element = document.getElementById(window.location.hash.replace('#', ''));\r\n\r\n if (element) {\r\n scrollTo(element);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Activate Anchor Link Scroll with this function\r\n * Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} triggerSelector\r\n */\r\n\r\nexport function setupAnchorLinkScroll(triggerSelector = '[data-action*=\"anchor\"], a[href^=\"#\"]:not([href=\"#\"]):not([role=\"tab\"]):not([data-action*=\"accordion\"])') {\r\n\r\n const triggers = document.querySelectorAll(triggerSelector);\r\n\r\n for (let i = 0; i < triggers.length; i++) {\r\n const trigger = triggers[i];\r\n const hashLink = trigger.getAttribute('href') || trigger.getAttribute('data-target');\r\n\r\n if (hashLink) {\r\n const element = returnHashElement(hashLink);\r\n\r\n trigger.addEventListener('click', e => {\r\n e.preventDefault();\r\n\r\n document.body.classList.add('dont-move');\r\n setTimeout(() => {\r\n document.body.classList.remove('dont-move');\r\n\r\n }, 500);\r\n\r\n scrollTo(element);\r\n });\r\n }\r\n }\r\n}\r\n"],"names":["transitions","el","document","createElement","t","undefined","style","detectTransitionEndEventName","functionReferences","readyState","readyEventBound","emptyCallbackArrays","length","tempArray","slice","forEach","funcRef","window","scrollY","header","getElementById","scrollEvent","classList","add","remove","getElementScroll","element","Element","Document","Window","left","pageXOffset","documentElement","scrollLeft","top","pageYOffset","scrollTop","scrollX","className","currentState","disableScrollLock","scrollPosition","htmlTag","marginTop","position","overflow","width","scrollTo","init","navigationTakeoverToggles","querySelectorAll","navigationToggle","e","preventDefault","body","contains","setTimeout","enableScrollLock","i","addEventListener","resizeTimer","module","n","r","exports","o","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","rootMargin","threshold","animateClassName","disabledClassName","enterEventName","exitEventName","selector","once","disabled","u","f","CustomEvent","bubbles","detail","target","dispatchEvent","intersectionRatio","unobserve","disconnect","y","IntersectionObserver","observe","arguments","configurable","writable","getOwnPropertyDescriptors","defineProperties","console","warn","elements","disable","enable","Error","breakpointKeys","currentWindowWidth","innerWidth","resizeFunctions","getWindowSizes","key","index","resizeHandler","clearTimeout","easeInOutQuintic","currentTime","start","change","duration","time","ts","tc","to","callback","parentNode","relativeTo","useElement","offsetTop","offsetLeft","rect","getBoundingClientRect","getElementPosition","animate","amount","val","scrollingElement","requestAnimationFrame","Math","max","clientWidth","functionReference","windowHeight","innerHeight","querySelector","root","factory","global","Rellax","options","self","posY","screenY","posX","screenX","blocks","pause","loop","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","loopId","supportsPassive","opts","removeEventListener","clearLoop","cancelAnimationFrame","mozCancelAnimationFrame","transformProp","testEl","transform","vendors","vendor","speed","verticalSpeed","horizontalSpeed","breakpoints","center","wrapper","relativeToWrapper","round","vertical","horizontal","verticalScrollAxis","horizontalScrollAxis","Array","isArray","lastVal","isAscending","isNumerical","validateCustomBreakpoints","elems","nodeType","currentBreakpoint","cssText","w","bp","setPosition","block","createBlock","cacheBlocks","update","mapBreakpoints","dataPercentage","getAttribute","dataSpeed","dataXsSpeed","dataMobileSpeed","dataTabletSpeed","dataDesktopSpeed","dataVerticalSpeed","dataHorizontalSpeed","dataVericalScrollAxis","dataHorizontalScrollAxis","dataZindex","dataMin","dataMax","dataMinX","dataMaxX","dataMinY","dataMaxY","xs","sm","md","lg","wrapperPosY","blockTop","blockHeight","clientHeight","offsetHeight","scrollHeight","blockLeft","blockWidth","offsetWidth","scrollWidth","percentageY","percentageX","Number","bases","updatePosition","searchResult","exec","trimmedStyle","delimiter","indexOf","replace","baseX","x","baseY","height","zindex","min","minX","maxX","minY","maxY","oldY","oldX","scrollPosY","result","valueX","valueY","deferredUpdate","passive","positions","toLowerCase","verticalScrollX","verticalScrollY","horizontalScrollX","positionY","positionX","translate","destroy","refresh","initRellaxJs","rellaxSelector","variables","handler","rellax","IntersectionObserverEntry","this","THROTTLE_TIMEOUT","POLL_INTERVAL","USE_MUTATION_OBSERVER","_observationTargets","some","item","_registerInstance","entry","_monitorIntersections","_checkForIntersections","_unmonitorIntersections","_unregisterInstance","takeRecords","records","_queuedEntries","_initThresholds","opt_threshold","sort","a","isNaN","_parseRootMargin","opt_rootMargin","margins","split","map","margin","parts","parseFloat","unit","_monitoringIntersections","_monitoringInterval","setInterval","addEvent","_domObserver","MutationObserver","attributes","childList","characterData","subtree","clearInterval","removeEvent","rootIsInDom","_rootIsInDom","rootRect","_getRootRect","bottom","right","targetRect","rootContainsTarget","_rootContainsTarget","oldEntry","intersectionRect","_computeTargetAndRootIntersection","newEntry","performance","now","boundingClientRect","rootBounds","_hasCrossedThreshold","isIntersecting","_callback","getComputedStyle","display","rect1","rect2","parent","getParentNode","atRoot","parentRect","parentComputedStyle","html","_expandRectByRootMargin","_rootMarginValues","newRect","oldRatio","newRatio","thresholds","containsDeep","targetArea","intersectionArea","toFixed","opt_options","fn","timeout","timer","join","node","event","opt_useCapture","attachEvent","detatchEvent","err","child","host","assignedSlot","navigation","slidetoggle","ch","sh","isCollapsed","noHeightSet","_this","toggle","faq","sal","triggerSelector","triggers","trigger","hashLink","location","pathname","setupAnchorLinkScroll"],"mappings":"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"}