{"version":3,"sources":["skipNavigationController.js"],"names":["SkipNavigationController","_classCallCheck","this","_createClass","key","get","document","querySelector","skipNavButton","getAttribute","a","classList","remove","value","e","removeOverlay","target","href","indexOf","id","closest","modalDiv","undefined","add","escapeKeyRemoveOverlay","addEventListener","preventDefault","offClickRemoveOverlay","hasAttribute","tagName","toLocaleLowerCase","focusables","querySelectorAll","focusableQueryString","i","length","focus","offset","y","window","innerWidth","scrollTarget","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","targetItem","getElementById","replace","setFocusItem","showOverlay","scrollToArea","module"],"mappings":"6iCAEA,IAGMA,yBAAwB,WAAA,SAAAA,IAAAC,gBAAAC,KAAAF,CAAA,CAAA,CAAA,OAAAG,aAAAH,EAAA,KAAA,CAAA,CAAAI,IAAA,cAAAC,IAF9B,WACA,OAAAC,SAAAC,cACMP,EAAwBQ,cAAAC,aAAA,MAAA,CAAA,CAAAR,CAAA,EAAA,CAAAG,IAAA,uBAAAC,IAE9B,WACA,MAAA,+FACA,CAeI,EAAA,CAAAD,IAAA,gBAAAC,IAPJ,WACA,OAAAC,SAAAC,cAAA,kBAAA,CACA,CAHIH,EAAAA,CAAAA,IAAAA,gBAAAA,MAMA,SAAAM,GAcIJ,SAASC,cAAc,iBAAiB,EAAEI,UAAUC,OAAO,MAAM,EAZrEF,EAAAC,UAAAC,OAAA,eAAA,CACJ,CAAA,EAAA,CAAAR,IAAA,yBAAAS,MAEA,SAAAC,EAAAJ,GAHIN,EAAAU,EAAAV,IAAA,WAAAA,GAAA,QAAAA,GAIAJ,EAA2Be,cAAAL,CAAA,CAE3B,CAAA,EAAA,CAAAN,IAAA,wBAAAS,MAEA,SAAAC,EAAAJ,GAAAI,EAAAE,OAAAC,MACJ,CAAA,IADIH,EAAAE,OAAAC,KAAAC,QAAAR,EAAAS,EAAA,GAAA,OAAAL,EAAAE,OAAAI,QAAA,gBAAA,GAIId,EAAuBS,cAAmBJ,CAAAA,CAE9C,CAACP,EAAAA,CAAAA,IAAAA,cAAAA,MAuBD,SAlBQJ,GACJ,IAAAqB,EAAAf,SAAAC,cAAA,iBAAA,EACJe,KAAAA,IAAAD,IAACA,EAAAV,UAAAY,IAAA,MAAA,EAAAb,EAAAC,UAAAY,IAAA,eAAA,EAKST,SAASG,iBAAiBA,UAAKC,SAAaJ,GAG9Cd,EAAAA,eAAyBe,EAC7Bf,EAAAwB,uBAAAV,EAAAJ,CAAA,CACJ,CAAA,EAGJJ,SAAAmB,iBAAA,QAAA,SAAAX,GACAA,EAAAY,eAAA,EACA1B,EAAA2B,sBAAAb,EAAAJ,CAAA,CAHI,CAAA,EAAAG,CAwBA,EAAA,CAAAT,IAAA,eAAAS,MAIA,SAlBQC,GACAR,GAASmB,OAATnB,EAEIN,GACFc,EAAAc,aAAA,UAAA,GAmBoC,WAAlCd,EAAEe,QAAQC,kBAAkB,GAjBhC,UAAAhB,EAAAe,QAAAC,kBAAA,EAEMJ,EAAAA,MAAAA,OAMd,IAJU,IAAAK,EAAAjB,EAAAkB,iBACNhC,EAAAiC,oBACJ,EAEAC,EAAA,EAAAA,EAAAH,EAAAI,OAAAD,CAAA,GACJ,GAAA,OAAAH,EAAAG,GAAAd,QAAA,QAAA,EAAA,CACAW,EAAAG,GAAAE,MAAA,EACA,KAHI,CA0BA,CAEA,EAAA,CAAAhC,IAAA,eAAAS,MAIA,SAboBkB,GAehB,IAAIM,EAbY,GAOpBC,GANgB,IACJC,OAAAC,aACJH,EAAA,KAKZI,EAAAC,sBAAA,EAAAC,IACAJ,OAAAK,YACAP,GAHIE,OAAAM,SAAA,CAAAF,IAAAL,EAAAQ,SAAA,QAAA,CAAA,CAAA1C,CAoBA,EAAA,CAAAA,IAAA,cAAAS,MAIA,SAfsBH,GAClB,IAAAqC,EAAAzC,SAAA0C,eACAtC,EAAAD,aAAA,MAAA,EAAAwC,QAAA,IAAA,EAAA,CAgBA,EAbiBP,OADZK,IAImB,CAAA,EAAArC,EAAAD,aAAA,MAAA,EAAAS,QAAA,MAAA,EAAUhB,KAAEgD,aAAAH,CAAA,EACxC7C,KAAAiD,YAAAJ,CAAA,EAGJ7C,KAAAkD,aAAAL,CAAA,EAEA,CAAA,EAAA,CAAA,EAAA,EAEyBzC,aAiBrB,OAjBQyC,UAkBRM,OAfQN,QAAU/C","file":"skipNavigationController.min.js","sourcesContent":["// NOTE: Gulp adds this file to /components/Legacy, changes should be applied to the file found in /components/Feature\r\n\r\n/**\r\n * Controls the behavior of the primary skip navigation and jump links\r\n */\r\nclass SkipNavigationController {\r\n /**\r\n * Return the
tag as a node\r\n * @return Node\r\n */\r\n static get mainElement() {\r\n return document.querySelector(\r\n SkipNavigationController.skipNavButton.getAttribute('href')\r\n );\r\n }\r\n\r\n /**\r\n * Returns the string used to find focusable elements\r\n * @return String\r\n */\r\n static get focusableQueryString() {\r\n return 'button, [href], input:not([type=\"hidden\"]), select, textarea, [tabindex]:not([tabindex=\"-1\"])';\r\n }\r\n\r\n /**\r\n * Returns the skip navigation button as a node.\r\n * @return Node\r\n */\r\n static get skipNavButton() {\r\n return document.querySelector('.skip-navigation');\r\n }\r\n\r\n /**\r\n * Remove the overlay\r\n */\r\n static removeOverlay(a) {\r\n document.querySelector('.modal-backdrop').classList.remove('show');\r\n a.classList.remove('overlay-focus');\r\n }\r\n\r\n static escapeKeyRemoveOverlay(e, a) {\r\n let key = e.key;\r\n if (key === 'Escape' || key === 'Esc') {\r\n SkipNavigationController.removeOverlay(a);\r\n }\r\n }\r\n\r\n static offClickRemoveOverlay(e, a) {\r\n let notFound = -1;\r\n if (\r\n (!e.target.href || e.target.href.indexOf(a.id) === notFound) &&\r\n e.target.closest('.modal-content') === null\r\n ) {\r\n SkipNavigationController.removeOverlay(a);\r\n }\r\n }\r\n\r\n /**\r\n * Show the overlay\r\n * @param {Node} a\r\n */\r\n static showOverlay(a) {\r\n let modalDiv = document.querySelector('.modal-backdrop');\r\n if (modalDiv !== undefined) {\r\n modalDiv.classList.add('show');\r\n a.classList.add('overlay-focus');\r\n\r\n // Escape Key event\r\n document.addEventListener('keydown', function (e) {\r\n e.preventDefault();\r\n SkipNavigationController.escapeKeyRemoveOverlay(e, a);\r\n });\r\n\r\n // Overlay off click event\r\n document.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n SkipNavigationController.offClickRemoveOverlay(e, a);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the focus of the document in the first focusable item in the given main element or the target itself\r\n * @param {Node} e\r\n */\r\n static setFocusItem(e) {\r\n if (e !== null) {\r\n // 5/16/22 - This code is also temporary\r\n if (\r\n e.hasAttribute('tabindex') ||\r\n e.tagName.toLocaleLowerCase() === 'select' ||\r\n e.tagName.toLocaleLowerCase() === 'input'\r\n ) {\r\n e.focus();\r\n } else {\r\n let focusables = e.querySelectorAll(\r\n SkipNavigationController.focusableQueryString\r\n );\r\n\r\n for (let i = 0; i < focusables.length; i++) {\r\n if (focusables[i].closest('header') === null) {\r\n focusables[i].focus();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the scrollto location for the jump link target so it isn't behind the sticky primary nav\r\n * @param {Node} scrollTarget\r\n */\r\n static scrollToArea(scrollTarget) {\r\n /* eslint-disable no-magic-numbers */\r\n let offset = 50; // Height of the mobile primary nav\r\n let mobileViewPort = 991;\r\n if (window.innerWidth > mobileViewPort) {\r\n offset = 137; // Height of the desktop primary nav\r\n }\r\n /* eslint-enable no-magic-numbers */\r\n\r\n let y =\r\n scrollTarget.getBoundingClientRect().top +\r\n window.pageYOffset -\r\n offset;\r\n window.scrollTo({ top: y, behavior: 'smooth' });\r\n }\r\n\r\n /**\r\n * Initate all the work to scroll to and set any additional settings\r\n * @param {Node} a\r\n */\r\n static skipNavInit(a) {\r\n let targetItem = document.getElementById(\r\n a.getAttribute('href').replace('#', '')\r\n );\r\n if (targetItem !== null) {\r\n // If the target is a form show the overaly and set focus on the appropriate form element\r\n if (a.getAttribute('href').indexOf('form') > -1) {\r\n this.setFocusItem(targetItem);\r\n } else {\r\n this.showOverlay(targetItem);\r\n }\r\n\r\n this.scrollToArea(targetItem);\r\n }\r\n }\r\n}\r\n\r\n// Export for Jest testing\r\nif (typeof exports !== 'undefined') {\r\n module.exports = SkipNavigationController;\r\n}\r\n"]}