{"version":3,"file":"universal-BTAcG4cU.js","sources":["../../../../node_modules/@rei/skip-link/esm/index.js","../../../../src/main/js/navigation/universal/lib/auto-center.js","../../../../src/main/js/navigation/universal/main/main.js","../../../../src/main/js/navigation/universal/universal.js"],"sourcesContent":["/**\n * Build the two selector strings from linkName for attributes:\n * 'data-skip-link' and 'data-skip-show'\n * @param linkName\n * @returns {{dataLinkSelector: string, dataShowSelector: string}}\n */\nvar getSelectorsFromName = function getSelectorsFromName(linkName) {\n var dataLinkSelector = '[data-skip-link=\"' + linkName + '\"]';\n var dataShowSelector = '[data-skip-show=\"' + linkName + '\"]';\n return { dataLinkSelector: dataLinkSelector, dataShowSelector: dataShowSelector };\n};\n/**\n * Skip Link status\n * Can be used by tests and consumers to test whether\n * the skip link initialization was successful\n * @property {boolean} skipLinkSet: whether basic skip link functionality was init\n * @property {boolean} skipLinkShowSet: whether parent show/hide functionality was init\n */\nvar skipLinkStatus = {\n skipLinkSet: false,\n skipShowSet: false,\n resetStatus: function resetStatus() {\n this.skipLinkSet = false;\n this.skipShowSet = false;\n }\n};\n/**\n * Find dom elements by data-skip attribute\n * @param {string} linkName: the value provided via the init config,\n * identifies the elements to base the skip functionality off of\n * @returns: object with keys for link, show, and target:\n * @prop {object} link: the element with the skip link\n * @prop {object} show: the element that should show / hide (may be null)\n * @prop {object} target: the element that the anchor tag will link to\n */\nvar findDomElems = function findDomElems(linkName) {\n var _getSelectorsFromName = getSelectorsFromName(linkName),\n dataLinkSelector = _getSelectorsFromName.dataLinkSelector,\n dataShowSelector = _getSelectorsFromName.dataShowSelector;\n\n var link = document.querySelector(dataLinkSelector);\n var show = document.querySelector(dataShowSelector) || null;\n var target = link && link.hash ? document.querySelector(link.hash) : null;\n\n return { link: link, show: show, target: target };\n};\n\n/**\n * Show / hide when element hidden is not the link\n * as the one receiving focus (e.g the parent element)\n * @param {object} elem: the element that will be shown / hidden\n * @param {object} listener: the element that receives the focus\n */\nvar showHideElem = function showHideElem(elem, listener) {\n listener.addEventListener('focus', function () {\n elem.classList.remove('sr-only');\n });\n listener.addEventListener('blur', function () {\n elem.classList.add('sr-only');\n });\n // confirming focus event listeners have been added\n skipLinkStatus.skipShowSet = true;\n};\n\n/**\n * Make target element focusable\n * @param {object} target: the element defined by the anchor of the skip link\n */\nvar makeTargetFocusable = function makeTargetFocusable(target) {\n var domTarget = target;\n domTarget.tabIndex = -1;\n var clearTabIndex = function clearTabIndex() {\n return target.removeAttribute('tabIndex');\n };\n target.addEventListener('blur', clearTabIndex, { once: true });\n};\n\n/**\n * Initialize skip links, depending on which dom elements exist\n * @param {object} config: object containing\n * @param {array} config.links: strings used to identify the links / show\n * elements to initialize.\n */\nvar initSkipLinks = function initSkipLinks(config) {\n var linkSet = config.links;\n if (linkSet) {\n linkSet.forEach(function (linkName) {\n // finds the set of elements based on the strings provided\n var _findDomElems = findDomElems(linkName),\n link = _findDomElems.link,\n show = _findDomElems.show,\n target = _findDomElems.target;\n // test for required elements\n\n\n if (link && target) {\n link.addEventListener('click', function () {\n makeTargetFocusable(target);\n });\n // confirming event listener for makeTargetFocusable has been added\n skipLinkStatus.skipLinkSet = true;\n // extra functionality - only if \"show\" is defined\n if (show) {\n showHideElem(show, link);\n }\n }\n if (show && !target) {\n show.classList.add('skip-show--hidden');\n }\n });\n }\n};\n/**\n * Alternative for skip-links that navigate away from current page. Difference is:\n * link and show are both required, target is not.\n * @param {array} skipLinkNames: array of names assigned to the 'data-skip-[link and show]'\n * attributes.\n */\nvar skipToNewPage = function skipToNewPage(skipLinkNames) {\n if (Array.isArray(skipLinkNames)) {\n skipLinkNames.forEach(function (linkName) {\n var _getSelectorsFromName2 = getSelectorsFromName(linkName),\n dataLinkSelector = _getSelectorsFromName2.dataLinkSelector,\n dataShowSelector = _getSelectorsFromName2.dataShowSelector;\n // only link and show are required for outside links\n\n\n var link = document.querySelector(dataLinkSelector);\n var show = document.querySelector(dataShowSelector) || null;\n if (link && show) {\n showHideElem(show, link);\n }\n });\n }\n};\n\nexport { initSkipLinks as default, skipLinkStatus, skipToNewPage };\n//# sourceMappingURL=index.js.map","/**\n * Universal Navigation - Auto-center\n * Puts the active item in the center of the screen,\n * using the ends of the unav list as guardrails\n */\n\n/**\n * coverts query selectors to elements or returns null\n * @param {object} selectors:\n * @property {string} selectors.list: query selector for the list (ul) element\n * @property {string} selectors.active: query selector for the active item (li) element\n * @returns {object} dom elements:\n * @property unavList {Element}: list (ul) dom element\n * @property activeItem {Element}: active list item (li) dom element\n */\nexport const getDomElems = (selectors) => {\n const list = document.querySelector(selectors.list);\n const active = document.querySelector(selectors.active);\n if (list && active) {\n return {\n unavList: list,\n activeItem: active,\n };\n }\n return null;\n};\n\n/**\n * gets the coordinates needed from the elements found above\n * @param {object} elems: keyed dom elements (getDomElems return value)\n * @returns {object}:\n * @property {number} activeLeft: the left-hand coordinate of the active item\n * @property {number} activeWidth: the width of the active item\n * @property {number} viewportWidth: the width of the current viewport\n */\nexport const getElemCoords = (elems) => {\n const activeItemCoords = elems.activeItem.getBoundingClientRect();\n return {\n activeLeft: activeItemCoords.left,\n activeWidth: activeItemCoords.width,\n viewportWidth: elems.unavList.getBoundingClientRect().width,\n };\n};\n\n/**\n * checks if element is off screen\n * @param {object} coords: keyed coordinates (getElemCoords return value)\n * @returns {boolean}: if element is even partially off screen, returns true\n */\nexport const getIsOffScreen = (coords) => {\n const { activeLeft, activeWidth, viewportWidth } = coords;\n return activeLeft + activeWidth > viewportWidth;\n};\n\n/**\n * get new scroll position (x coordinate)\n * @param {object} coords: keyed coordinates (getElemCoords return value)\n * @returns {number}: the new x scroll coordinate for the unav list\n */\nexport const getNewPos = (coords) => {\n const { activeLeft, activeWidth, viewportWidth } = coords;\n return (activeLeft + (activeWidth / 2)) - (viewportWidth / 2);\n};\n\n/**\n * scroll to active element\n * @param elem: dom element to scroll\n * @param newPos: the new x coordinate for that element\n */\nexport const scrollToActive = (elem, newPos) => {\n const element = elem;\n element.scrollLeft = newPos;\n};\n\n/**\n * Gets all needed dom elems or null\n * If elements exist, gets needed element coordinates\n * Calculates if the element is off screen\n * If element is off screen, calculates where the unav should scroll to\n * Scrolls to that position\n * See auto-center.spec.js for notes on tests\n */\n/* istanbul ignore next */\nconst init = (selectors) => {\n const domElems = getDomElems(selectors);\n if (!domElems) return;\n const coords = getElemCoords(domElems);\n const isOffScreen = getIsOffScreen(coords);\n if (!isOffScreen) return;\n const newPos = getNewPos(coords);\n scrollToActive(domElems.unavList, newPos);\n};\n\nexport default init;\n","/**\n * Universal Navigation\n * Top bar navigation - navigates between sub-sites\n */\n\nimport initSkipLinks, { skipToNewPage } from '@rei/skip-link';\nimport initAutoCenter from '../lib/auto-center';\nimport analyticsInit from '../../../_shared-components/navigationMetrics';\n\nexport function app(win) {\n /* initialize universal navigation */\n initAutoCenter({\n list: '[data-js=\"unav-container\"]',\n active: '[data-js=\"unav\"] [data-active=\"true\"]',\n });\n\n /* link to accessibility statement */\n skipToNewPage(['accessibility-statement']);\n\n /* initialize skip links */\n initSkipLinks({\n links: ['content', 'secondary-nav'],\n });\n\n analyticsInit('[data-js=\"unav\"]');\n\n return win;\n}\n\nexport function main(win = window) {\n if (win.document.readyState === 'loading') {\n // Loading hasn't finished yet\n win.document.addEventListener('DOMContentLoaded', app.bind(null, win));\n } else {\n // `DOMContentLoaded` has already fired\n app(win);\n }\n}\n","/**\n * Universal Navigation - entry\n *\n * Note: all css imports need to be pulled in on this level,\n * otherwise tests will fail\n */\nimport '../../util/global-shim';\nimport { main } from './main/main';\n\nimport '../../../style/navigation/universal/universal.scss';\nimport '@rei/cedar/dist/cdr-fonts.css';\n\nmain(window);\n"],"names":["getSelectorsFromName","linkName","dataLinkSelector","dataShowSelector","findDomElems","_getSelectorsFromName","link","show","target","showHideElem","elem","listener","makeTargetFocusable","domTarget","clearTabIndex","initSkipLinks","config","linkSet","_findDomElems","skipToNewPage","skipLinkNames","_getSelectorsFromName2","getDomElems","selectors","list","document","querySelector","active","unavList","activeItem","getElemCoords","elems","activeItemCoords","getBoundingClientRect","activeLeft","left","activeWidth","width","viewportWidth","getIsOffScreen","coords","getNewPos","scrollToActive","newPos","element","scrollLeft","init","domElems","app","win","initAutoCenter","links","analyticsInit","main","window","readyState","addEventListener","bind"],"mappings":"qLAMA,IAAIA,EAAuB,SAA8BC,EAAU,CACjE,IAAIC,EAAmB,oBAAsBD,EAAW,KACpDE,EAAmB,oBAAsBF,EAAW,KACxD,MAAO,CAAE,iBAAkBC,EAAkB,iBAAkBC,CAAkB,CACnF,EAyBIC,EAAe,SAAsBH,EAAU,CACjD,IAAII,EAAwBL,EAAqBC,CAAQ,EACrDC,EAAmBG,EAAsB,iBACzCF,EAAmBE,EAAsB,iBAEzCC,EAAO,SAAS,cAAcJ,CAAgB,EAC9CK,EAAO,SAAS,cAAcJ,CAAgB,GAAK,KACnDK,EAASF,GAAQA,EAAK,KAAO,SAAS,cAAcA,EAAK,IAAI,EAAI,KAErE,MAAO,CAAE,KAAMA,EAAM,KAAMC,EAAM,OAAQC,CAAQ,CACnD,EAQIC,EAAe,SAAsBC,EAAMC,EAAU,CACvDA,EAAS,iBAAiB,QAAS,UAAY,CAC7CD,EAAK,UAAU,OAAO,SAAS,CACnC,CAAG,EACDC,EAAS,iBAAiB,OAAQ,UAAY,CAC5CD,EAAK,UAAU,IAAI,SAAS,CAChC,CAAG,CAGH,EAMIE,EAAsB,SAA6BJ,EAAQ,CAC7D,IAAIK,EAAYL,EAChBK,EAAU,SAAW,GACrB,IAAIC,EAAgB,UAAyB,CAC3C,OAAON,EAAO,gBAAgB,UAAU,CACzC,EACDA,EAAO,iBAAiB,OAAQM,EAAe,CAAE,KAAM,GAAM,CAC/D,EAQIC,EAAgB,SAAuBC,EAAQ,CACjD,IAAIC,EAAUD,EAAO,MACjBC,GACFA,EAAQ,QAAQ,SAAUhB,EAAU,CAElC,IAAIiB,EAAgBd,EAAaH,CAAQ,EACrCK,EAAOY,EAAc,KACrBX,EAAOW,EAAc,KACrBV,EAASU,EAAc,OAIvBZ,GAAQE,IACVF,EAAK,iBAAiB,QAAS,UAAY,CACzCM,EAAoBJ,CAAM,CACpC,CAAS,EAIGD,GACFE,EAAaF,EAAMD,CAAI,GAGvBC,GAAQ,CAACC,GACXD,EAAK,UAAU,IAAI,mBAAmB,CAE9C,CAAK,CAEL,EAOIY,EAAgB,SAAuBC,EAAe,CACpD,MAAM,QAAQA,CAAa,GAC7BA,EAAc,QAAQ,SAAUnB,EAAU,CACxC,IAAIoB,EAAyBrB,EAAqBC,CAAQ,EACtDC,EAAmBmB,EAAuB,iBAC1ClB,EAAmBkB,EAAuB,iBAI1Cf,EAAO,SAAS,cAAcJ,CAAgB,EAC9CK,EAAO,SAAS,cAAcJ,CAAgB,GAAK,KACnDG,GAAQC,GACVE,EAAaF,EAAMD,CAAI,CAE/B,CAAK,CAEL,ECvHO,MAAMgB,EAAeC,GAAc,CACxC,MAAMC,EAAOC,SAASC,cAAcH,EAAUC,IAAI,EAC5CG,EAASF,SAASC,cAAcH,EAAUI,MAAM,EACtD,OAAIH,GAAQG,EACH,CACLC,SAAUJ,EACVK,WAAYF,CACb,EAEI,IACT,EAUaG,EAAiBC,GAAU,CACtC,MAAMC,EAAmBD,EAAMF,WAAWI,sBAAuB,EACjE,MAAO,CACLC,WAAYF,EAAiBG,KAC7BC,YAAaJ,EAAiBK,MAC9BC,cAAeP,EAAMH,SAASK,wBAAwBI,KACvD,CACH,EAOaE,EAAkBC,GAAW,CACxC,KAAM,CAAEN,WAAAA,EAAYE,YAAAA,EAAaE,cAAAA,CAAc,EAAIE,EACnD,OAAON,EAAaE,EAAcE,CACpC,EAOaG,EAAaD,GAAW,CACnC,KAAM,CAAEN,WAAAA,EAAYE,YAAAA,EAAaE,cAAAA,CAAc,EAAIE,EACnD,OAAQN,EAAcE,EAAc,EAAOE,EAAgB,CAC7D,EAOaI,EAAiBA,CAAChC,EAAMiC,IAAW,CAC9C,MAAMC,EAAUlC,EAChBkC,EAAQC,WAAaF,CACvB,EAWMG,EAAQvB,GAAc,CAC1B,MAAMwB,EAAWzB,EAAYC,CAAS,EACtC,GAAI,CAACwB,EAAU,OACf,MAAMP,EAASV,EAAciB,CAAQ,EAErC,GAAI,CADgBR,EAAeC,CAAM,EACvB,OAClB,MAAMG,EAASF,EAAUD,CAAM,EAC/BE,EAAeK,EAASnB,SAAUe,CAAM,CAC1C,EClFO,SAASK,EAAIC,EAAK,CAEvBC,OAAAA,EAAe,CACb1B,KAAM,6BACNG,OAAQ,uCACV,CAAC,EAGDR,EAAc,CAAC,yBAAyB,CAAC,EAGzCJ,EAAc,CACZoC,MAAO,CAAC,UAAW,eAAe,CACpC,CAAC,EAEDC,EAAc,kBAAkB,EAEzBH,CACT,CAEO,SAASI,EAAKJ,EAAMK,OAAQ,CAC7BL,EAAIxB,SAAS8B,aAAe,UAE9BN,EAAIxB,SAAS+B,iBAAiB,mBAAoBR,EAAIS,KAAK,KAAMR,CAAG,CAAC,EAGrED,EAAIC,CAAG,CAEX,CCzBAI,EAAKC,MAAM","x_google_ignoreList":[0]}