{"version":3,"file":"disclosureNav.afa2260c.js","sources":["../../../src/js/modules/disclosure-nav.js"],"sourcesContent":["/*\n * This content is licensed according to the W3C Software License at\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n * Supplemental JS for the disclosure menu keyboard behavior\n */\n\n'use strict';\n\nclass DisclosureNav {\n\tconstructor(domNode) {\n\t\tthis.rootNode = domNode;\n\t\tthis.controlledNodes = [];\n\t\tthis.openIndex = null;\n\t\tthis.useArrowKeys = true;\n\t\tthis.topLevelNodes = [\n\t\t\t...this.rootNode.querySelectorAll(\n\t\t\t\t'.main-link, button[aria-expanded][aria-controls]'\n\t\t\t),\n\t\t];\n\n\t\tthis.topLevelNodes.forEach((node) => {\n\t\t\t// handle button + menu\n\t\t\tif (\n\t\t\t\tnode.tagName.toLowerCase() === 'button' &&\n\t\t\t\tnode.hasAttribute('aria-controls')\n\t\t\t) {\n\t\t\t\tconst menu = node.parentNode.querySelector('ul');\n\t\t\t\tif (menu) {\n\t\t\t\t\t// save ref controlled menu\n\t\t\t\t\tthis.controlledNodes.push(menu);\n\n\t\t\t\t\t// collapse menus\n\t\t\t\t\tnode.setAttribute('aria-expanded', 'false');\n\t\t\t\t\tthis.toggleMenu(menu, false);\n\n\t\t\t\t\t// attach event listeners\n\t\t\t\t\tmenu.addEventListener('keydown', this.onMenuKeyDown.bind(this));\n\t\t\t\t\tnode.addEventListener('click', this.onButtonClick.bind(this));\n\t\t\t\t\tnode.addEventListener('keydown', this.onButtonKeyDown.bind(this));\n\t\t\t\t}\n\t\t\t}\n\t\t\t// handle links\n\t\t\telse {\n\t\t\t\tthis.controlledNodes.push(null);\n\t\t\t\tnode.addEventListener('keydown', this.onLinkKeyDown.bind(this));\n\t\t\t}\n\t\t});\n\n\t\tthis.rootNode.addEventListener('focusout', this.onBlur.bind(this));\n\t}\n\n\tcontrolFocusByKey(keyboardEvent, nodeList, currentIndex) {\n\t\tswitch (keyboardEvent.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tif (currentIndex > -1) {\n\t\t\t\t\tvar prevIndex = Math.max(0, currentIndex - 1);\n\t\t\t\t\tnodeList[prevIndex].focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'ArrowRight':\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tif (currentIndex > -1) {\n\t\t\t\t\tvar nextIndex = Math.min(nodeList.length - 1, currentIndex + 1);\n\t\t\t\t\tnodeList[nextIndex].focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tnodeList[0].focus();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tnodeList[nodeList.length - 1].focus();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// public function to close open menu\n\tclose() {\n\t\tthis.toggleExpand(this.openIndex, false);\n\t}\n\n\tonBlur(event) {\n\t\tvar menuContainsFocus = this.rootNode.contains(event.relatedTarget);\n\t\tif (!menuContainsFocus && this.openIndex !== null) {\n\t\t\tthis.toggleExpand(this.openIndex, false);\n\t\t}\n\t}\n\n\tonButtonClick(event) {\n\t\tvar button = event.target;\n\t\tvar buttonIndex = this.topLevelNodes.indexOf(button);\n\t\tvar buttonExpanded = button.getAttribute('aria-expanded') === 'true';\n\t\tthis.toggleExpand(buttonIndex, !buttonExpanded);\n\t}\n\n\tonButtonKeyDown(event) {\n\t\tvar targetButtonIndex = this.topLevelNodes.indexOf(document.activeElement);\n\n\t\t// close on escape\n\t\tif (event.key === 'Escape') {\n\t\t\tthis.toggleExpand(this.openIndex, false);\n\t\t}\n\n\t\t// move focus into the open menu if the current menu is open\n\t\telse if (\n\t\t\tthis.useArrowKeys &&\n\t\t\tthis.openIndex === targetButtonIndex &&\n\t\t\tevent.key === 'ArrowDown'\n\t\t) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.controlledNodes[this.openIndex].querySelector('a').focus();\n\t\t}\n\n\t\t// handle arrow key navigation between top-level buttons, if set\n\t\telse if (this.useArrowKeys) {\n\t\t\tthis.controlFocusByKey(event, this.topLevelNodes, targetButtonIndex);\n\t\t}\n\t}\n\n\tonLinkKeyDown(event) {\n\t\tvar targetLinkIndex = this.topLevelNodes.indexOf(document.activeElement);\n\n\t\t// handle arrow key navigation between top-level buttons, if set\n\t\tif (this.useArrowKeys) {\n\t\t\tthis.controlFocusByKey(event, this.topLevelNodes, targetLinkIndex);\n\t\t}\n\t}\n\n\tonMenuKeyDown(event) {\n\t\tif (this.openIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar menuLinks = Array.prototype.slice.call(\n\t\t\tthis.controlledNodes[this.openIndex].querySelectorAll('a')\n\t\t);\n\t\tvar currentIndex = menuLinks.indexOf(document.activeElement);\n\n\t\t// close on escape\n\t\tif (event.key === 'Escape') {\n\t\t\tthis.topLevelNodes[this.openIndex].focus();\n\t\t\tthis.toggleExpand(this.openIndex, false);\n\t\t}\n\n\t\t// handle arrow key navigation within menu links, if set\n\t\telse if (this.useArrowKeys) {\n\t\t\tthis.controlFocusByKey(event, menuLinks, currentIndex);\n\t\t}\n\t}\n\n\ttoggleExpand(index, expanded) {\n\t\t// close open menu, if applicable\n\t\tif (this.openIndex !== index) {\n\t\t\tthis.toggleExpand(this.openIndex, false);\n\t\t}\n\n\t\t// handle menu at called index\n\t\tif (this.topLevelNodes[index]) {\n\t\t\tthis.openIndex = expanded ? index : null;\n\t\t\tthis.topLevelNodes[index].setAttribute('aria-expanded', expanded);\n\t\t\tthis.toggleMenu(this.controlledNodes[index], expanded);\n\t\t}\n\t}\n\n\ttoggleMenu(domNode, show) {\n\t\tif (domNode) {\n\t\t\tdomNode.style.display = show ? '' : 'none'; // the opposite of 'none' is not 'block'\n\t\t}\n\t}\n\n\tupdateKeyControls(useArrowKeys) {\n\t\tthis.useArrowKeys = useArrowKeys;\n\t}\n}\n\n/* Initialize Disclosure Menus */\n\nwindow.addEventListener(\n\t'load',\n\tfunction () {\n\t\tvar menus = document.querySelectorAll('.disclosure-nav');\n\t\tvar disclosureMenus = [];\n\n\t\tfor (var i = 0; i < menus.length; i++) {\n\t\t\tdisclosureMenus[i] = new DisclosureNav(menus[i]);\n\t\t}\n\n\t\t// listen to arrow key checkbox\n\t\tvar arrowKeySwitch = document.getElementById('arrow-behavior-switch');\n\t\tif (arrowKeySwitch) {\n\t\t\tarrowKeySwitch.addEventListener('change', function () {\n\t\t\t\tvar checked = arrowKeySwitch.checked;\n\t\t\t\tfor (var i = 0; i < disclosureMenus.length; i++) {\n\t\t\t\t\tdisclosureMenus[i].updateKeyControls(checked);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// fake link behavior\n\t\tdisclosureMenus.forEach((disclosureNav, i) => {\n\t\t\tvar links = menus[i].querySelectorAll('[href=\"#mythical-page-content\"]');\n\t\t\tvar examplePageHeading = document.getElementById('mythical-page-heading');\n\t\t\tfor (var k = 0; k < links.length; k++) {\n\t\t\t\t// The codepen export script updates the internal link href with a full URL\n\t\t\t\t// we're just manually fixing that behavior here\n\t\t\t\tlinks[k].href = '#mythical-page-content';\n\n\t\t\t\tlinks[k].addEventListener('click', (event) => {\n\t\t\t\t\t// change the heading text to fake a page change\n\t\t\t\t\tvar pageTitle = event.target.innerText;\n\t\t\t\t\texamplePageHeading.innerText = pageTitle;\n\n\t\t\t\t\t// handle aria-current\n\t\t\t\t\tfor (var n = 0; n < links.length; n++) {\n\t\t\t\t\t\tlinks[n].removeAttribute('aria-current');\n\t\t\t\t\t}\n\t\t\t\t\tevent.target.setAttribute('aria-current', 'page');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\tfalse\n);\n"],"names":["DisclosureNav","domNode","node","menu","keyboardEvent","nodeList","currentIndex","prevIndex","nextIndex","event","menuContainsFocus","button","buttonIndex","buttonExpanded","targetButtonIndex","targetLinkIndex","menuLinks","index","expanded","show","useArrowKeys","menus","disclosureMenus","i","arrowKeySwitch","checked","disclosureNav","links","examplePageHeading","k","pageTitle","n"],"mappings":"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"}