{"version":3,"file":"responsiveNavigation-5e126b20.js","sources":["../../../src/js/modules/responsive-navigation.js"],"sourcesContent":["import * as Helpers from './helpers.js';\n\n/**\n * Sets up mobile navigation. Adds open/close toggle button, adds handler for clicks on it.\n */\nexport function doMobileNavigation() {\n\tdocument.querySelector('html').classList.add('mobile-nav');\n\n\t// create the navigation toggle button\n\t\tlet templateToggleNav = `\n\t\t\t\n\t\t`;\n\t\tdocument.querySelector('.navigationBar > .l_constrain').insertAdjacentHTML('afterbegin', templateToggleNav);\n\t\tlet navToggle = document.querySelector('#mainNavToggle');\n\n\t// Accessibility enhancements for the dynamic toggling control\n\t\tlet theMenu = document.querySelector('#site_navigation');\n\t\ttheMenu.setAttribute(\"aria-labelledby\", \"mainNavToggle\");\n\n\t// handle clicks on the menu toggle button\n\t\tnavToggle.addEventListener(\"click\", function (e) {\n\t\t\tlet newNavStatus;\n\t\t\tlet html= document.querySelector('html');\n\t\t\tlet navIsOpen = document.querySelector('html').classList.contains(\"nav-active\"); // returns true|false\n\t\t\tlet navBarNav = document.querySelector('.navigationBar nav');\n\n\t\t\tnewNavStatus = !navIsOpen; // inverts the value\n\t\t\tnavToggle.setAttribute(\"aria-expanded\", newNavStatus); // applies new value\n\n\t\t\t/* Work around being unable to animate from display: hidden; to display: block; etc. */\n\t\t\tif(html.classList.contains('nav-active')) {\n\t\t\t\t// remove the nav-active, which should now animate\n\t\t\t\thtml.classList.remove(\"nav-active\");\n\n\t\t\t\t// and once the animation's done, add the display: none; class.\n\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\tnavBarNav.classList.add('js-hide-from-keyboard');\n\t\t\t\t},\n\t\t\t\t300\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// first remove the \"display: none\"; so it becomes block and animatable\n\t\t\t\tnavBarNav.classList.remove('js-hide-from-keyboard');\n\t\t\t\t// then add the nav-active, which should now animate\n\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\thtml.classList.add(\"nav-active\");\n\t\t\t\t},\n\t\t\t\t25\n\t\t\t\t);\n\t\t\t}\n\t\t});\n}\n\n/**\n * Undoes the changes that doMobileNavigation() makes to the document.\n */\nexport function undoMobileNavigation() {\n\tdocument.querySelector('html').classList.remove('mobile-nav');\n\n\tlet navMenuToggle = document.querySelector('#mainNavToggle');\n\tif( navMenuToggle ) {\n\t\tdocument.querySelector('html').classList.remove(\"nav-active\");\n\t\tdocument.querySelector('#mainNavToggle').remove();\n\t\tdocument.querySelector('#site_navigation').removeAttribute('aria-labelledby');\n\t}\n}\n\n/**\n * Initialise and handle the sub-menu reveal behaviour. Also injects a \"back button\" for each sub-menu so mobile users can navigate back up to the parent.\n */\nexport function subMenuToggle() {\n\tlet subNavs = document.querySelectorAll('li[data-submenu-status]');\n\n\tsubNavs.forEach(level => {\n\t\tlet childUl = level.querySelector(':scope > ul');\n\t\tlet toggleLink = level.querySelector(':scope > a');\n\n\t\tchildUl.insertAdjacentHTML(\n\t\t\t'afterbegin',\n\t\t\t\"
\"\n\t\t);\n\n\t\tlet backButton = childUl.querySelector('button');\n\n\t\tconsole.log({level, childUl});\n\n\t\ttoggleLink.addEventListener(\n\t\t\t'click',\n\t\t\tfunction(e){\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet parentLi = e.currentTarget.closest('li');\n\t\t\t\tlet parentUl = parentLi.closest('ul');\n\t\t\t\tlet parentSiblings = parentUl.querySelectorAll(\":scope > [data-submenu-status]\");\n\n\t\t\t\tconsole.log({parentLi, parentUl, parentSiblings});\n\n\t\t\t\tparentSiblings.forEach(thing => {\n\t\t\t\t\tif( thing != parentLi ) {\n\t\t\t\t\t\tthing.dataset.submenuStatus = 'closed';\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tlet parentLiStatus = parentLi.dataset.submenuStatus;\n\t\t\t\tparentLiStatus == 'closed' ?\n\t\t\t\t\t(parentLi.dataset.submenuStatus = 'open') :\n\t\t\t\t\t(parentLi.dataset.submenuStatus = 'closed');\n\t\t\t}\n\t\t);\n\n\t\tbackButton.addEventListener('click', event => {\n\t\t\tevent.currentTarget.closest('[data-submenu-status]').dataset.submenuStatus = 'closed';\n\t\t});\n\t});\n}\n\n/**\n * Closes all navigation structures.\n */\nexport function dismissAllNav() {\n\t/* Close the mobile nav */\n\tdocument.querySelector('html').classList.remove('nav-active');\n\n\t/* Close all other navs */\n\tconst subNavs = document.querySelectorAll('[data-submenu-status]');\n\tsubNavs.forEach(nav => {\n\t\tnav.dataset.submenuStatus = \"closed\";\n\t});\n}\n\n/**\n * Adds an event listener that handles clicks outside the .navigationBar, and triggers dismissAllNav() when matched.\n */\nexport function watchForDismiss() {\n\tconst navigationBar = document.querySelector('.navigationBar');\n\tdocument.addEventListener('click', function (event) {\n\t\tif (!navigationBar.contains(event.target)) {\n\t\t\t// the thing that was clicked was not inside the navigationBar div, so we should dismiss all nav!\n\t\t\tdismissAllNav();\n\t\t}\n\t});\n}\n\n/**\n * Assess the viewport size and trigger the correct JS as a result. Watch for changes of the viewport size and toggle the behaviour as a result.\n */\nexport function initNavigation() {\n\tlet screenWidth = window.matchMedia('(max-width: 1023px)');\n\n\t// initial load\n\tsubMenuToggle();\n\n\tif (screenWidth.matches) {\n\t\tdoMobileNavigation();\n\t} else {\n\t\tundoMobileNavigation();\n\t}\n\n\t// watch for changes in window size\n\tscreenWidth.addEventListener(\"change\", (e) => {\n\t\tif (e.matches) {\n\t\t\tdoMobileNavigation();\n\t\t} else {\n\t\t\tundoMobileNavigation();\n\t\t}\n\t});\n\n\twatchForDismiss();\n}\n\ninitNavigation();\nHelpers.initVAT();\n"],"names":["doMobileNavigation","templateToggleNav","navToggle","e","newNavStatus","html","navIsOpen","navBarNav","undoMobileNavigation","subMenuToggle","level","childUl","toggleLink","backButton","parentLi","parentUl","parentSiblings","thing","event","dismissAllNav","nav","watchForDismiss","navigationBar","initNavigation","screenWidth","Helpers.initVAT"],"mappings":"6EAKO,SAASA,GAAqB,CACpC,SAAS,cAAc,MAAM,EAAE,UAAU,IAAI,YAAY,EAGxD,IAAIC,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMxB,SAAS,cAAc,+BAA+B,EAAE,mBAAmB,aAAcA,CAAiB,EAC1G,IAAIC,EAAY,SAAS,cAAc,gBAAgB,EAGzC,SAAS,cAAc,kBAAkB,EAC/C,aAAa,kBAAmB,eAAe,EAGvDA,EAAU,iBAAiB,QAAS,SAAUC,EAAG,CAChD,IAAIC,EACAC,EAAM,SAAS,cAAc,MAAM,EACnCC,EAAc,SAAS,cAAc,MAAM,EAAE,UAAU,SAAS,YAAY,EAC5EC,EAAY,SAAS,cAAc,oBAAoB,EAE3DH,EAAgB,CAACE,EACjBJ,EAAU,aAAa,gBAAiBE,CAAY,EAGjDC,EAAK,UAAU,SAAS,YAAY,GAEtCA,EAAK,UAAU,OAAO,YAAY,EAGlC,WAAW,IAAI,CACdE,EAAU,UAAU,IAAI,uBAAuB,CAC/C,EACD,GACJ,IAGIA,EAAU,UAAU,OAAO,uBAAuB,EAElD,WAAW,IAAI,CACdF,EAAK,UAAU,IAAI,YAAY,CAC/B,EACD,EACJ,EAEA,CAAG,CACH,CAKO,SAASG,GAAuB,CACtC,SAAS,cAAc,MAAM,EAAE,UAAU,OAAO,YAAY,EAExC,SAAS,cAAc,gBAAgB,IAE1D,SAAS,cAAc,MAAM,EAAE,UAAU,OAAO,YAAY,EAC5D,SAAS,cAAc,gBAAgB,EAAE,OAAM,EAC/C,SAAS,cAAc,kBAAkB,EAAE,gBAAgB,iBAAiB,EAE9E,CAKO,SAASC,GAAgB,CACjB,SAAS,iBAAiB,yBAAyB,EAEzD,QAAQC,GAAS,CACxB,IAAIC,EAAUD,EAAM,cAAc,aAAa,EAC3CE,EAAaF,EAAM,cAAc,YAAY,EAEjDC,EAAQ,mBACP,aACA,8CACH,EAEE,IAAIE,EAAaF,EAAQ,cAAc,QAAQ,EAE/C,QAAQ,IAAI,CAAC,MAAAD,EAAO,QAAAC,CAAO,CAAC,EAE5BC,EAAW,iBACV,QACA,SAAST,EAAE,CACVA,EAAE,eAAc,EAEhB,IAAIW,EAAiBX,EAAE,cAAc,QAAQ,IAAI,EAC7CY,EAAiBD,EAAS,QAAQ,IAAI,EACtCE,EAAiBD,EAAS,iBAAiB,gCAAgC,EAE/E,QAAQ,IAAI,CAAC,SAAAD,EAAU,SAAAC,EAAU,eAAAC,CAAc,CAAC,EAEhDA,EAAe,QAAQC,GAAS,CAC3BA,GAASH,IACZG,EAAM,QAAQ,cAAgB,SAEpC,CAAK,EAEoBH,EAAS,QAAQ,eACpB,SAChBA,EAAS,QAAQ,cAAgB,OACjCA,EAAS,QAAQ,cAAgB,QACnC,CACJ,EAEED,EAAW,iBAAiB,QAASK,GAAS,CAC7CA,EAAM,cAAc,QAAQ,uBAAuB,EAAE,QAAQ,cAAgB,QAChF,CAAG,CACH,CAAE,CACF,CAKO,SAASC,GAAgB,CAE/B,SAAS,cAAc,MAAM,EAAE,UAAU,OAAO,YAAY,EAG5C,SAAS,iBAAiB,uBAAuB,EACzD,QAAQC,GAAO,CACtBA,EAAI,QAAQ,cAAgB,QAC9B,CAAE,CACF,CAKO,SAASC,GAAkB,CACjC,MAAMC,EAAgB,SAAS,cAAc,gBAAgB,EAC7D,SAAS,iBAAiB,QAAS,SAAUJ,EAAO,CAC9CI,EAAc,SAASJ,EAAM,MAAM,GAEvCC,GAEH,CAAE,CACF,CAKO,SAASI,GAAiB,CAChC,IAAIC,EAAc,OAAO,WAAW,qBAAqB,EAGzDf,IAEIe,EAAY,QACfxB,IAEAQ,IAIDgB,EAAY,iBAAiB,SAAW,GAAM,CACzC,EAAE,QACLxB,IAEAQ,GAEH,CAAE,EAEDa,GACD,CAEAE,IACAE,EAAiB"}