{"version":3,"sources":["webpack://frontendplaceholder/./Src/Scripts/components/top-navigation.js"],"names":["constructor","elm","this","self","isOpen","navItems","querySelectorAll","mobileToggle","curtainElem","querySelector","subMenus","heroStyle","classList","contains","window","timeouts","currentOpenSubMenu","heroTypeInitialized","desktopBreakpoint","throttledScrollHandler","scrollHandlerAssigned","curtainAnimated","lastScroll","then","result","default","throttle","handleScroll","currentScroll","pageYOffset","document","documentElement","scrollTop","Math","abs","scrollFromBottom","body","offsetHeight","innerHeight","add","remove","innerWidth","addEventListener","forEach","navItem","push","SubMenu","e","detail","_open","_close","onClosedEventHandler","removeEventListener","close","toggle","bind","_initializeHeroType","_animateToHeroStyle","_animateOffHeroStyle","determineHeroStyle","scrollY","textContainer","scrollPos","targetScrollPos","requestAnimationFrame","smoothScroll","listenToScroll","diff","style","setProperty","leading","conditionallyAssignScrollEventListener","offsetTop","_animateInCurtain","_removeCurtain","height","_disableHeroType","cancel","animateOffHeroStyle","animateToHeroStyle","animateInCurtain","removeCurtain","open","toggleHeroNavigationType","isHeroType","toggleOpenElem","toggleCloseElem","subMenuSections","subMenuSectionsInitialized","onClosedEvent","CustomEvent","onOpenedEvent","handleClickOutside","preventDefault","clickedMainNavItem","target","closest","_toggle","subSectionElm","SubMenuSection","setTimeout","dispatchEvent"],"mappings":"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","file":"8745.660efd48175c09529602.js","sourcesContent":["export default class TopNavigation {\n constructor(elm) {\n this.elm = elm;\n const self = this;\n this.isOpen = false;\n const navItems = elm.querySelectorAll('.top-navigation__menu-item');\n const mobileToggle = elm.querySelectorAll('[data-top-navigation__toggle]');\n const curtainElem = elm.querySelector('.top-navigation__curtain');\n const subMenus = [];\n const heroStyle = elm.classList.contains('top-navigation--hero-style');\n window.timeouts = [];\n let currentOpenSubMenu = null; // will hold reference to the currently opened submenu\n let heroTypeInitialized = false;\n const desktopBreakpoint = 992;\n window.throttledScrollHandler = null;\n let scrollHandlerAssigned = false;\n let curtainAnimated = false;\n let lastScroll = 0;\n\n import('lodash/throttle')\n .then(result => {\n return result.default;\n })\n .then(throttle => {\n lastScroll = 0;\n const threshold = 5;\n\n const handleScroll = throttle(function () {\n const currentScroll = window.pageYOffset || document.documentElement.scrollTop;\n\n if (Math.abs(currentScroll - lastScroll) > threshold) {\n const scrollFromBottom = document.body.offsetHeight - (currentScroll + window.innerHeight);\n if (currentScroll > lastScroll && currentScroll > 50 && scrollFromBottom > 90) {\n document.body.classList.add('scrolling-down');\n document.body.classList.remove('scrolling-up');\n if (window.innerWidth > desktopBreakpoint) {\n document.body.classList.remove('search-bar-open');\n }\n } else {\n document.body.classList.remove('scrolling-down');\n document.body.classList.add('scrolling-up');\n }\n lastScroll = currentScroll;\n }\n }, 200);\n\n window.addEventListener('scroll', handleScroll);\n });\n\n navItems.forEach((navItem) => {\n const subMenu = navItem.querySelector('.top-navigation__menu-item__submenu');\n\n if (subMenu) {\n subMenus.push(new SubMenu(navItem));\n\n navItem.addEventListener('onOpened', function (e) {\n currentOpenSubMenu = e.detail;\n });\n navItem.addEventListener('onClosed', function (e) {\n currentOpenSubMenu = null;\n });\n }\n\n }, this);\n\n this._open = function () {\n this.elm.classList.add('top-navigation--menu-open');\n document.body.classList.add('menu-open');\n this.isOpen = true;\n };\n\n this._close = function () {\n // if no open submenu, just close\n if (!currentOpenSubMenu) {\n this.elm.classList.remove('top-navigation--menu-open');\n document.body.classList.remove('menu-open');\n this.isOpen = false;\n } else {\n let onClosedEventHandler = null;\n onClosedEventHandler = function (e) {\n self._close();\n e.detail.elm.removeEventListener('onClosed', onClosedEventHandler);\n };\n\n // Assign eventlistener to submenu, to close self when submenu is closed\n currentOpenSubMenu.elm.addEventListener('onClosed', onClosedEventHandler);\n // Close currently open submenu\n currentOpenSubMenu.close();\n }\n };\n\n mobileToggle.forEach(toggle => {\n toggle.addEventListener('click', this.toggle.bind(this));\n });\n\n this._initializeHeroType = function () {\n if (heroTypeInitialized) {\n return;\n }\n heroTypeInitialized = true;\n const navBarHeight = 85;\n\n self._animateToHeroStyle = function () {\n if (self.elm.classList.contains('top-navigation--hero-style')) { return; }\n };\n\n self._animateOffHeroStyle = function () {\n if (!self.elm.classList.contains('top-navigation--hero-style')) { return; }\n };\n\n // Method for toggling the hero specific styles on and off\n const determineHeroStyle = function () {\n if (window.scrollY > navBarHeight) {\n self._animateOffHeroStyle();\n } else if (window.scrollY <= navBarHeight) {\n self._animateToHeroStyle();\n }\n };\n\n // if viewport is above desktop, determine hero style.\n if (window.innerWidth > desktopBreakpoint) {\n determineHeroStyle();\n }\n const textContainer = document.querySelector('.hero__text-container');\n\n let scrollPos = 0;\n let targetScrollPos = 0;\n const speed = 0.15;\n\n function smoothScroll() {\n if (window.listenToScroll) {\n const diff = targetScrollPos - scrollPos;\n if (Math.abs(diff) > 0.001) {\n scrollPos += diff * speed;\n } else {\n scrollPos = targetScrollPos;\n }\n\n document.documentElement.style.setProperty('--scroll', scrollPos);\n if (scrollPos < 0.5) {\n elm.classList.add('animating-hero');\n } else {\n elm.classList.remove('animating-hero');\n }\n } else {\n document.documentElement.style.setProperty('--scroll', 0);\n }\n window.requestAnimationFrame(smoothScroll); // Continue the loop\n }\n\n window.requestAnimationFrame(smoothScroll);\n\n // Import throttle from lodash and assign scroll handler to apply\n import('lodash/throttle')\n .then(result => {\n return result.default;\n })\n .then(throttle => {\n window.throttledScrollHandler = throttle(determineHeroStyle, 100, { leading: false });\n // Method for conditionally assigning scroll event listener - based on viewport width and current assigned status\n const conditionallyAssignScrollEventListener = function () {\n if (window.innerWidth >= desktopBreakpoint && !scrollHandlerAssigned) {\n scrollHandlerAssigned = true;\n window.addEventListener('scroll', window.throttledScrollHandler);\n window.addEventListener('scroll', () => {\n targetScrollPos = window.pageYOffset / (textContainer.offsetTop + 25);\n });\n } else if (window.innerWidth < desktopBreakpoint && scrollHandlerAssigned) {\n scrollHandlerAssigned = false;\n window.removeEventListener('scroll', window.throttledScrollHandler);\n }\n };\n conditionallyAssignScrollEventListener();\n\n // When window resizes, recheck if scroll event listener should be assigned.\n window.addEventListener('resize', throttle(conditionallyAssignScrollEventListener, 100, { leading: false }));\n });\n };\n\n this._animateInCurtain = function () {\n if (curtainAnimated) {\n return;\n }\n };\n\n this._removeCurtain = function () {\n if (!curtainAnimated) {\n return;\n }\n\n curtainElem.style.height = null;\n curtainAnimated = false;\n };\n\n this._disableHeroType = function () {\n if (!heroTypeInitialized) {\n return;\n }\n heroTypeInitialized = false;\n scrollHandlerAssigned = false;\n window.removeEventListener('scroll', window.throttledScrollHandler);\n window.throttledScrollHandler.cancel();\n };\n\n // Apply additionaly logic for pages that apply \"hero styling\" to the navigation bar\n if (heroStyle) {\n this._initializeHeroType();\n }\n }\n\n animateOffHeroStyle() {\n if (this._animateOffHeroStyle) {\n return this._animateOffHeroStyle();\n }\n }\n\n animateToHeroStyle() {\n if (this._animateToHeroStyle) {\n return this._animateToHeroStyle();\n }\n }\n\n animateInCurtain() {\n return this._animateInCurtain();\n }\n\n removeCurtain() {\n return this._removeCurtain();\n }\n\n open() {\n this._open();\n }\n\n close() {\n this._close();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n toggleHeroNavigationType(isHeroType) {\n if (isHeroType) {\n this._initializeHeroType();\n } else {\n this._disableHeroType();\n }\n }\n}\n\nclass SubMenu {\n constructor(elm) {\n this.elm = elm;\n const self = this;\n this.isOpen = false;\n const toggleOpenElem = elm.querySelector('[data-top-navigation__submenu-open]');\n const toggleCloseElem = elm.querySelector('[data-top-navigation__submenu-close]');\n const subMenuSections = [];\n let currentOpenSubMenu = null; // will hold reference to the currently opened submenu\n let subMenuSectionsInitialized = false;\n const onClosedEvent = new CustomEvent('onClosed', { detail: this });\n const onOpenedEvent = new CustomEvent('onOpened', { detail: this });\n\n // detect clicks outside the submenu - if clicked outside, close the submenu\n const handleClickOutside = function (e) {\n e.preventDefault();\n\n const clickedMainNavItem = e.target.closest('.top-navigation__menu-item');\n if (!clickedMainNavItem || clickedMainNavItem !== elm) {\n self._close();\n }\n };\n\n const initializeSubMenuSections = function () {\n elm.querySelectorAll('.top-navigation__menu-item__submenu-section').forEach(subSectionElm => {\n subMenuSections.push(new SubMenuSection(subSectionElm));\n\n subSectionElm.addEventListener('onOpened', function (e) {\n currentOpenSubMenu = e.detail;\n });\n subSectionElm.addEventListener('onClosed', function (e) {\n currentOpenSubMenu = null;\n });\n });\n subMenuSectionsInitialized = true;\n };\n\n window.addEventListener('navigate', function () {\n self._close();\n });\n\n this._toggle = function () {\n if (self.isOpen) {\n self._close();\n } else {\n self._open();\n }\n };\n\n this._open = function () {\n if (!subMenuSectionsInitialized) {\n initializeSubMenuSections();\n }\n\n self.elm.classList.add('top-navigation__menu-item--open');\n window.addEventListener('click', handleClickOutside);\n self.isOpen = true;\n\n window.timeouts.push(setTimeout(function () {\n self.elm.dispatchEvent(onOpenedEvent);\n }, 300));\n };\n\n this._close = function () {\n // if no open submenu, just close\n if (!currentOpenSubMenu) {\n self.elm.classList.remove('top-navigation__menu-item--open');\n window.removeEventListener('click', handleClickOutside);\n self.isOpen = false;\n\n window.timeouts.push(setTimeout(function () {\n self.elm.dispatchEvent(onClosedEvent);\n }, 300));\n } else {\n let onClosedEventHandler = null;\n onClosedEventHandler = function (e) {\n self._close();\n e.detail.elm.removeEventListener('onClosed', onClosedEventHandler);\n };\n\n // Assign eventlistener to submenu, to close self when submenu is closed\n currentOpenSubMenu.elm.addEventListener('onClosed', onClosedEventHandler);\n // Close currently open submenu\n currentOpenSubMenu.close();\n }\n };\n\n toggleOpenElem.addEventListener('click', this._toggle.bind(this));\n toggleCloseElem.addEventListener('click', this._close.bind(this));\n }\n\n open() {\n this._open();\n }\n\n close() {\n this._close();\n }\n}\n\nclass SubMenuSection {\n constructor(elm) {\n this.elm = elm;\n const self = this;\n this.isOpen = false;\n const toggleOpenElem = elm.querySelector('[data-top-navigation__submenu-section-open]');\n const toggleCloseElem = elm.querySelector('[data-top-navigation__submenu-section-close]');\n const onClosedEvent = new CustomEvent('onClosed', { detail: this });\n const onOpenedEvent = new CustomEvent('onOpened', { detail: this });\n\n this._open = function () {\n self.elm.classList.add('top-navigation__menu-item__submenu-section--open');\n self.isOpen = true;\n\n window.timeouts.push(setTimeout(function () {\n self.elm.dispatchEvent(onOpenedEvent);\n }, 300));\n };\n\n this._close = function () {\n self.elm.classList.remove('top-navigation__menu-item__submenu-section--open');\n self.isOpen = false;\n\n window.timeouts.push(setTimeout(function () {\n self.elm.dispatchEvent(onClosedEvent);\n }, 300));\n };\n\n toggleOpenElem?.addEventListener('click', this.open.bind(this));\n toggleCloseElem?.addEventListener('click', this.close.bind(this));\n }\n\n open() {\n this._open();\n }\n\n close() {\n this._close();\n }\n}\n"],"sourceRoot":""}