{"version":3,"file":"header.js","names":[],"sources":["../resources/javascript/header.js"],"sourcesContent":["import {\n    headerActiveClasses,\n    navigationActivatingClasses,\n    navigationActiveClasses,\n} from './features/header/constants';\nimport {\n    toggleClass,\n    addClass,\n    removeClass,\n    removeAllActiveClasses,\n} from './features/header/util';\nimport {\n    header,\n    submenus,\n    toggleSubmenuButtons,\n    resetHeaderMenus,\n} from './features/header/index';\nimport {\n    setQuickBasketCountFromCookie,\n    initQuickBasket,\n} from './features/basket/mini-basket';\nimport { initNoticeCarousel } from './features/header-v2/notice-carousel';\nimport { initialiseLazySearch } from './features/autocomplete/lazy';\nimport {\n    getHeaderSearchInput,\n    setHeaderSearchOpen,\n} from './features/autocomplete/header';\nimport { trackNavigationMenu, trackNoticeBar } from './util/tracking';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    // TODO move most of this into ../features/header/index.js\n\n    const mobileToggle = document.querySelector('[data-mobile-toggle]');\n    const secondLevelButtons = document.querySelectorAll(\n        '[data-toggle-second-level]'\n    );\n    const searchInput = getHeaderSearchInput();\n\n    /**\n     * Track all nav links\n     */\n    const initHeaderLinkTracking = () => {\n        const nav = header.querySelector('[data-navigation]');\n\n        nav.addEventListener('click', e => {\n            if (e.target.tagName.toLowerCase() === 'a') {\n                trackNavigationMenu(\n                    'Navigation Link Clicked',\n                    e.target.textContent.trim(),\n                    e.target.href.trim()\n                );\n            }\n        });\n    };\n\n    /**\n     * Track all notice bar links\n     */\n    const initNoticeBarLinkTracking = () => {\n        const noticeBar = document.querySelector('aside.notice-bar');\n\n        noticeBar.addEventListener('click', e => {\n            if (e.target.tagName.toLowerCase() === 'a') {\n                trackNoticeBar(\n                    'Notice Bar Link Clicked',\n                    e.target.textContent.trim(),\n                    e.target.href.trim()\n                );\n            }\n        });\n    };\n\n    /**\n     * Toggles the submenu based on the clicked button.\n     * @param {Element} clickedButton\n     */\n    const toggleSubmenu = clickedButton => {\n        const clickedSubmenu = clickedButton.nextElementSibling;\n        const isActive = clickedSubmenu?.classList.contains(\n            navigationActiveClasses.groups\n        );\n\n        resetHeaderMenus();\n        setHeaderSearchOpen(false);\n\n        // No fade on mobile\n        const timeout = window.matchMedia('(max-width: 1024px)').matches\n            ? 0\n            : 100;\n\n        if (!isActive) {\n            setTimeout(() => {\n                addClass(clickedSubmenu, navigationActiveClasses.groups);\n            }, timeout);\n            addClass(clickedSubmenu, navigationActivatingClasses.groups);\n            addClass(clickedButton, navigationActiveClasses.button);\n            addClass(header, headerActiveClasses.submenu);\n            clickedButton.setAttribute('aria-expanded', 'true');\n\n            trackNavigationMenu(\n                'Open Submenu',\n                clickedButton.textContent.trim()\n            );\n        } else {\n            setTimeout(() => {\n                removeClass(clickedSubmenu, navigationActivatingClasses.groups);\n                trackNavigationMenu(\n                    'Close Submenu',\n                    clickedButton.textContent.trim()\n                );\n            }, timeout);\n        }\n    };\n\n    /**\n     * Toggles the mobile menu.\n     */\n    const toggleMobileMenu = () => {\n        const isMobileActive = header?.classList.toggle(\n            headerActiveClasses.mobile\n        );\n\n        if (isMobileActive) {\n            document.documentElement.classList.add('lock-scroll');\n            closeSearch();\n        } else {\n            document.documentElement.classList.remove('lock-scroll');\n            removeAllActiveClasses(header);\n        }\n    };\n\n    /**\n     * Close the search\n     */\n    const closeSearch = () => {\n        const searchContainer = header.querySelector('.js-header-search');\n\n        searchContainer.classList.remove('header-search--active');\n    };\n\n    /**\n     * Toggles the second-level menu based on the clicked button.\n     * @param {Element} clickedButton\n     */\n    const toggleSecondLevel = clickedButton => {\n        toggleClass(clickedButton.parentElement, navigationActiveClasses.group);\n        toggleClass(header, headerActiveClasses.secondLevel);\n\n        if (\n            header.classList.contains(headerActiveClasses.secondLevel) &&\n            clickedButton.parentElement.classList.contains(\n                navigationActiveClasses.group\n            )\n        ) {\n            trackNavigationMenu(\n                'Open Second Level Menu',\n                clickedButton.textContent.trim()\n            );\n        } else {\n            trackNavigationMenu(\n                'Close Second Level Menu',\n                clickedButton.textContent.trim()\n            );\n        }\n\n        clickedButton.setAttribute('aria-expanded', 'false');\n    };\n\n    /**\n     * Initializes Intersection Observer to manage header position based on scrolling.\n     */\n    const initIntersectionObserver = () => {\n        const sentinel = document.querySelector('[data-sentinel]');\n        const observer = new IntersectionObserver(\n            entries => {\n                const position = entries[0].isIntersecting\n                    ? 'static'\n                    : 'sticky';\n                header.setAttribute('data-position', position);\n            },\n            { threshold: 1.0 }\n        );\n        observer.observe(sentinel);\n    };\n\n    /**\n     * Initializes a fallback scroll listener for browsers without IntersectionObserver support.\n     */\n    const initFallbackScrollListener = () => {\n        window.addEventListener('scroll', () => {\n            const position = window.scrollY > 0 ? 'static' : 'sticky';\n            header.setAttribute('data-position', position);\n        });\n    };\n\n    mobileToggle?.addEventListener('click', toggleMobileMenu);\n\n    toggleSubmenuButtons.forEach(button => {\n        button.addEventListener('click', e => toggleSubmenu(e.currentTarget));\n    });\n\n    secondLevelButtons.forEach(button => {\n        button.addEventListener('click', e =>\n            toggleSecondLevel(e.currentTarget)\n        );\n    });\n\n    searchInput.addEventListener('keydown', e => {\n        if (e.key === 'Escape') {\n            e.preventDefault();\n            setHeaderSearchOpen(false);\n        }\n    });\n\n    /**\n     * Initialize Observers and Event Listeners\n     */\n    if (window.IntersectionObserver) {\n        initIntersectionObserver();\n    } else {\n        initFallbackScrollListener();\n    }\n\n    /**\n     * Close header when clicking outside of the header.\n     */\n    document.addEventListener('click', e => {\n        if (header && !header.contains(e.target)) {\n            if (header.classList.toString().includes('active')) {\n                trackNavigationMenu(\n                    'Closed Navigation Menu',\n                    'Clicked Off Menu'\n                );\n            }\n\n            removeAllActiveClasses(header);\n        }\n    });\n\n    initQuickBasket();\n    initNoticeCarousel(window.innerWidth <= 1120);\n    initialiseLazySearch();\n    initHeaderLinkTracking();\n    initNoticeBarLinkTracking();\n});\n\nsetQuickBasketCountFromCookie();\n"],"mappings":"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"}