{"version":3,"sources":["webpack:///./js/components/init-subnav.ts"],"names":["whenDomReady","then","subnav","document","querySelector","triggers","querySelectorAll","subnavWrapper","subnavBreadcrumbs","subnavLinks","subnavLinksOther","subnavListItems","subnavListLastItem","length","subnavDropdownContent","subNavItems","initSubnav","forEach","navItem","classList","remove","window","matchMedia","matches","itemsWidthSum","sum","push","el","width","outerWidthMargin","isOther","getSubNavItemsWidthSum","spaceForItems","widthNoPadding","firstChild","removeChild","emptyElement","contains","add","offsetWidth","hideSubNavItem","breadcrumbsWidthSum","scrollLeft","index","clonedElem","cloneNode","prepend","style","getComputedStyle","parseInt","marginLeft","marginRight","paddingLeft","paddingRight","handleEnter","event","target","Element","setTimeout","handleLeave","addEventListener","i","navLink","firstElementChild","e","targetElement","isDesktop","preventDefault","toggle"],"mappings":"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","file":"50-4c9ec9f404bc9063c419.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport whenDomReady from 'when-dom-ready';\r\nfunction initialise() {\r\n const subnav = document.querySelector('.js-subnav');\r\n const triggers = document.querySelectorAll('.js-subnav .js-has-dropdown');\r\n const subnavWrapper = document.querySelector('.js-subnav-wrapper');\r\n const subnavBreadcrumbs = document.querySelector('.js-subnav__left');\r\n const subnavLinks = document.querySelector('.js-subnav__links');\r\n const subnavLinksOther = document.querySelector('.js-subnav__links-other');\r\n const subnavListItems = document.querySelectorAll('.js-subnav__links li');\r\n const subnavListLastItem = subnavListItems[subnavListItems.length - 1];\r\n const subnavDropdownContent = document.querySelector('.js-dropdown-subnav .subnav__dropdown-content');\r\n let subNavItems = [];\r\n initSubnav();\r\n // Setup a resize observer to track changes.\r\n window.addEventListener('resize', initSubnav);\r\n // Subnav update.\r\n function initSubnav() {\r\n subnavListItems.forEach((navItem) => {\r\n navItem.classList.remove(\"is-other\");\r\n });\r\n if (window.matchMedia('(min-width: 1024px)').matches) {\r\n if (!subnavWrapper || !subnav || !subnavBreadcrumbs || !subnavLinks || !subnavLinksOther || !subnavListLastItem) {\r\n return;\r\n }\r\n let itemsWidthSum = getSubNavItemsWidthSum();\r\n const spaceForItems = getSubNavSpaceForItems();\r\n subnavLinksOther.classList.remove('is-shown');\r\n emptyElement(subnavDropdownContent);\r\n while (itemsWidthSum > spaceForItems) {\r\n if (!subnavLinksOther.classList.contains(\"is-shown\")) {\r\n subnavLinksOther.classList.add('is-shown');\r\n itemsWidthSum += subnavLinksOther.offsetWidth;\r\n }\r\n itemsWidthSum -= hideSubNavItem();\r\n }\r\n }\r\n else {\r\n const breadcrumbsWidthSum = widthNoPadding(subnavBreadcrumbs);\r\n const spaceForItems = widthNoPadding(subnav);\r\n // Align breadcrumbs to right if necessary\r\n if (breadcrumbsWidthSum > spaceForItems) {\r\n subnav.scrollLeft += breadcrumbsWidthSum - spaceForItems;\r\n }\r\n }\r\n }\r\n // Get whole subnav width based on items widths\r\n function getSubNavItemsWidthSum() {\r\n let sum = 0;\r\n subNavItems = [];\r\n subnavListItems.forEach((navItem) => {\r\n navItem.classList.remove(\"is-other\");\r\n subNavItems.push({\r\n el: navItem,\r\n width: outerWidthMargin(navItem),\r\n isOther: false\r\n });\r\n sum += outerWidthMargin(navItem);\r\n });\r\n return sum;\r\n }\r\n // Space available for submenu items\r\n function getSubNavSpaceForItems() {\r\n return widthNoPadding(subnav) - widthNoPadding(subnavBreadcrumbs) - widthNoPadding(subnavLinksOther);\r\n }\r\n // Hide item and eventually return its width\r\n function hideSubNavItem() {\r\n let index = subNavItems.length - 1;\r\n while (subNavItems[index].isOther && index > 0) {\r\n index--;\r\n }\r\n subNavItems[index].isOther = true;\r\n subNavItems[index].el.classList.add('is-other');\r\n // Clone links to others dropdown\r\n const clonedElem = subNavItems[index].el?.cloneNode(true);\r\n clonedElem.querySelector('a')?.classList.remove('subnav__link');\r\n clonedElem.querySelector('a')?.classList.add('subnav-link-secondary');\r\n if (clonedElem.querySelector('a')?.classList.contains(\"subnav__link--current\")) {\r\n clonedElem.querySelector('a')?.classList.remove('subnav__link--current');\r\n clonedElem.querySelector('a')?.classList.add('subnav-link-secondary--current');\r\n }\r\n subnavDropdownContent.prepend(clonedElem);\r\n return index > 1 ? subNavItems[index].width : false;\r\n }\r\n // Calculate width with margins\r\n function outerWidthMargin(el) {\r\n let width = el.offsetWidth;\r\n const style = getComputedStyle(el);\r\n width += parseInt(style.marginLeft) + parseInt(style.marginRight);\r\n return width;\r\n }\r\n // Calculate width without paddings\r\n function widthNoPadding(el) {\r\n let width = el.offsetWidth;\r\n const style = getComputedStyle(el);\r\n width -= parseInt(style.paddingLeft) + parseInt(style.paddingRight);\r\n return width;\r\n }\r\n // Dropdown functionality\r\n // Hover over\r\n function handleEnter(event) {\r\n if (event.target instanceof Element) {\r\n event.target.classList.add('trigger-enter');\r\n setTimeout(() => {\r\n if (event.target instanceof Element) {\r\n event.target.classList.contains('trigger-enter');\r\n }\r\n });\r\n }\r\n }\r\n // Hover out\r\n function handleLeave(event) {\r\n if (event.target instanceof Element) {\r\n event.target.classList.remove('trigger-enter');\r\n }\r\n }\r\n // Empty given element\r\n function emptyElement(el) {\r\n while (el.firstChild)\r\n el.removeChild(el.firstChild);\r\n }\r\n // Handle touch based devices\r\n for (let i = 0; i < triggers.length; i++) {\r\n // The \"trigger\" here is an
  • we should be handling clicking on the anchor.\r\n const navItem = triggers[i];\r\n if ('touchstart' in window) {\r\n navItem.addEventListener('touchstart', handleEnter);\r\n }\r\n else {\r\n navItem.addEventListener('mouseenter', handleEnter);\r\n }\r\n if ('touchmove' in window) {\r\n navItem.addEventListener('touchmove', handleLeave);\r\n }\r\n else {\r\n navItem.addEventListener('mouseleave', handleLeave);\r\n }\r\n // Get anchor link.\r\n const navLink = navItem.firstElementChild;\r\n navLink.addEventListener('click', (e) => {\r\n const targetElement = e.target;\r\n const isDesktop = window.matchMedia('(min-width: 1190px)').matches;\r\n // Check if we've clicked on the icon, if so then don't navigate.\r\n if ((targetElement.matches('.js-subnav-link-dropdown') ||\r\n targetElement.matches('svg') ||\r\n targetElement.matches('use')) &&\r\n !isDesktop) {\r\n e.preventDefault();\r\n navLink.classList.toggle('is-open');\r\n }\r\n });\r\n }\r\n}\r\nwhenDomReady().then(initialise);\r\n"],"sourceRoot":""}