{"version":3,"file":"Accessibility.js","names":["Mixin","a","deepMerge","on","off","getRelativeSelector","AccessibilityService","default","execute","superclass","constructor","element","options","arguments","length","store","altTabindexAttribute","ariaCloseTimeout","trackFocusedElements","bindEvents","listen","onStateRestore","onFocusIn","bind","onFocusOut","event","_focusedChild","target","restoreLastFocusState","getComponentKey","_componentKey","saveLastFocusState","focusedChild","setActiveFocus","retrieveSelectorForSubElement","saveLastScrollPosition","scrollPosition","setLastScroll","getLastScrollPosition","getLastScrollByKey","saveElement","setRemovedIndex","elementToRemove","siblings","indexOf","restoreFocusAfterRemove","removedIndex","getRemovedIndex","Number","isInteger","Math","max","min","focus","resetRemovedIndex","updateAria","message","timer","clearTimeout","innerHTML","setTimeout","clearAria","selector","getActiveFocusByKey","querySelector","resetActiveFocus","focusOnDefaultChildElement","focusableSelector","querySelectorAll","visibleElements","filter","el","offsetParent","window","getComputedStyle","visibility","getFocusableElements","container","ignoreTabIndex","includeSelf","elements","matches","saveOriginalTabIndex","selectors","focusableContainers","forEach","hasAttribute","setAttribute","getAttribute","setAltTabIndex","tabindex","resetOriginalTabIndex","removeAttribute","setFocusedOrder","item","i","arr","resetFocusedOrder","setTabKeyboardTrap","data","key","index","preventDefault","getNextIndex","nodes","focusedElement","getNextFocusedElement","currentIndex","maskPageFromSR","page","document","unmaskPageFromSR","initModalPattern","focusReturnElement","skipMaskPageFromSR","anchorElement","caller","activeElement","disabled","style","outline","destroyModalPattern","updateStatusMessage","status","statusMessage","statusMessageTimer","clearStatusMessage","focusTrap","focusableElements","firstElement","shiftKey","firstFocusable","lastFocusable","tabNavigate","isForward","isFirstElement","focusableTrapElement","focusableNextElement","destroy","unlisten"],"sources":["mixins/Accessibility.js"],"sourcesContent":["import { Mixin } from 'core/mixwith';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { on, off } from 'toolbox/event';\nimport { getRelativeSelector } from 'toolbox/html';\nimport AccessibilityService from 'services/Accessibility';\n\n/**\n * Holds Accessibility functions which are reused across components\n */\nexport default Mixin(superclass => class extends superclass {\n /**\n * @constructor\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options That belongs to the component\n * @param {Object} store Store\n */\n constructor(element, options = {}, store) {\n super(element, deepMerge({\n altTabindexAttribute: 'data-js-alt-tabindex',\n ariaCloseTimeout: 5000,\n trackFocusedElements: false, // if true, tracks focused elements\n }, options), store);\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonymous function\n */\n bindEvents() {\n super.bindEvents();\n\n if (this.options.trackFocusedElements) {\n AccessibilityService.listen('state.restore', this.onStateRestore, this);\n on('focusin.lastState', this.element, this.onFocusIn.bind(this));\n on('focusout.lastState', this.element, this.onFocusOut.bind(this));\n }\n }\n\n /**\n * Cache current focus element\n * @listens focusin.lastState\n * @param {Event} event DOM event\n */\n onFocusIn(event) {\n this._focusedChild = event.target;\n }\n\n /**\n * Resets current focus element\n * @listens focusout.lastState\n */\n onFocusOut() {\n this._focusedChild = null;\n }\n\n /**\n * Restores current compotent state (focused element)\n * @listens state.restore\n */\n onStateRestore() {\n this.restoreLastFocusState();\n }\n\n /**\n * Returns component key\n * @returns {String} component key\n */\n getComponentKey() {\n if (!this._componentKey) {\n this._componentKey = getRelativeSelector(this.element);\n }\n return this._componentKey;\n }\n\n /**\n * Save last focus state\n * @param {HTMLElement} focusedChild optional, custom focused state\n */\n saveLastFocusState(focusedChild = this._focusedChild) {\n if (focusedChild) {\n AccessibilityService.setActiveFocus(this.getComponentKey(), this.retrieveSelectorForSubElement(focusedChild));\n }\n }\n\n /**\n * Return selector for child element\n * @param {HTMLElement} element optional, custom focused state\n * @returns {String} selector for child element\n */\n retrieveSelectorForSubElement(element) {\n return getRelativeSelector(element, this.element) || true;\n }\n\n /**\n * Save last scroll position\n * @param {Any} scrollPosition last scroll position for this component\n */\n saveLastScrollPosition(scrollPosition) {\n AccessibilityService.setLastScroll(this.getComponentKey(), scrollPosition);\n }\n\n /**\n * Return last crollable position for this component\n * @returns {Any} last scroll position\n */\n getLastScrollPosition() {\n return AccessibilityService.getLastScrollByKey(this.getComponentKey());\n }\n\n /**\n * Save element\n * @param {HTMLElement} element component\n */\n saveElement(element) {\n AccessibilityService.saveElement(element);\n }\n\n /**\n * Set index of removed element\n * @param {HTMLElement} elementToRemove element that will be removed\n * @param {Array} siblings array of sibling elements including elementToRemove\n */\n setRemovedIndex(elementToRemove, siblings) {\n AccessibilityService.setRemovedIndex(this.getComponentKey(), siblings.indexOf(elementToRemove));\n }\n\n /**\n * Restore focus after element remove (needs set index of removed before)\n * @param {Array} siblings array of sibling elements including elementToRemove\n */\n restoreFocusAfterRemove(siblings) {\n let removedIndex = AccessibilityService.getRemovedIndex(this.getComponentKey());\n if (Number.isInteger(removedIndex) && siblings.length) {\n removedIndex = Math.max(Math.min(removedIndex, siblings.length) - 1, 0);\n if (siblings[removedIndex]) {\n siblings[removedIndex].focus();\n }\n AccessibilityService.resetRemovedIndex();\n }\n }\n\n /**\n * Update aria\n * @param {HTMLElement} element component\n * @param {String} message text\n */\n updateAria(element, message) {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n\n if (element) {\n element.innerHTML = message;\n }\n\n this.timer = setTimeout(() => {\n this.clearAria(element);\n }, this.options.ariaCloseTimeout);\n }\n\n /**\n * Clear aria\n * @param {HTMLElement} element component\n */\n clearAria(element) {\n if (element) {\n element.innerHTML = '';\n }\n }\n\n /**\n * Restore last focus state\n */\n restoreLastFocusState() {\n const selector = AccessibilityService.getActiveFocusByKey(this.getComponentKey());\n this._focusedChild = selector === true ? this.element : this.element && this.element.querySelector(selector);\n if (this._focusedChild) {\n AccessibilityService.resetActiveFocus();\n this._focusedChild.focus();\n }\n }\n\n /**\n * Focus on default child element\n * @param {HTMLElement} element DOM element\n */\n focusOnDefaultChildElement(element) {\n const focusableSelector = element.querySelectorAll('[data-js-anchor], input');\n const visibleElements = [...focusableSelector].filter(el => (el.offsetParent !== null && window.getComputedStyle(el).visibility !== 'hidden'));\n if (visibleElements.length) {\n visibleElements[0].focus();\n }\n }\n\n /**\n * Get list of focusable elements within a given container\n * @param {HTMLElement} container - HTML Container of the focusable elements\n * @param {Boolean} ignoreTabIndex - ignore tabindex=\"-1\" definition used in JS logic\n * @param {Boolean} includeSelf - include container to the list of elements tested against the focusable selector\n * @returns {NodeList} - Get all the focusable elements\n */\n getFocusableElements(container, ignoreTabIndex, includeSelf) {\n const focusableSelector = ignoreTabIndex\n ? 'a[href], area[href], input:not([disabled]):not([type=hidden]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex], [contentEditable=true]'\n : 'a[href]:not([tabindex^=\"-\"]), area[href]:not([tabindex^=\"-\"]), input:not([disabled]):not([type=hidden]):not([tabindex^=\"-\"]), select:not([disabled]):not([tabindex^=\"-\"]), textarea:not([disabled]):not([tabindex^=\"-\"]), button:not([disabled]):not([tabindex^=\"-\"]), [tabindex]:not([tabindex^=\"-\"]), [contentEditable=true]:not([tabindex^=\"-\"])';\n\n let elements;\n\n if (includeSelf) {\n elements = [container, ...container.querySelectorAll(focusableSelector)].filter(el => el.matches(focusableSelector));\n } else {\n elements = container.querySelectorAll(focusableSelector);\n }\n\n return [...elements].filter(el => (el.offsetParent !== null && window.getComputedStyle(el).visibility !== 'hidden'));\n }\n\n /**\n * Store original tabindex in data-js-original-tabindex attribute for all elements with altTabindexAttribute\n */\n saveOriginalTabIndex() {\n this.selectors.focusableContainers = this.element.querySelectorAll(`[${this.options.altTabindexAttribute}]`);\n this.selectors.focusableContainers.forEach((container) => {\n this.getFocusableElements(container).forEach((element) => {\n if (element.hasAttribute('tabindex')) {\n element.setAttribute('data-js-original-tabindex', element.getAttribute('tabindex'));\n }\n });\n });\n }\n\n /**\n * Modify tabindex property for consistent TAB navigation in alternative layout (i.e. sticky state).\n * altTabindexAttribute value on container element defines the tabindex for all child focusable elements.\n */\n setAltTabIndex() {\n this.selectors.focusableContainers.forEach((container) => {\n const tabindex = container.getAttribute(this.options.altTabindexAttribute);\n this.getFocusableElements(container).forEach((element) => {\n if (!element.hasAttribute('data-skip-focus')) {\n element.setAttribute('tabindex', tabindex);\n }\n });\n });\n }\n\n /**\n * Restore original tabindex property\n *\n * @param {Boolean} ignoreTabIndex - ignore tabindex=\"-1\" definition used in JS logic\n */\n resetOriginalTabIndex(ignoreTabIndex) {\n this.selectors.focusableContainers.forEach((container) => {\n this.getFocusableElements(container, ignoreTabIndex).forEach((element) => {\n if (element.hasAttribute('data-js-original-tabindex')) {\n element.setAttribute('tabindex', element.getAttribute('data-js-original-tabindex'));\n } else {\n element.removeAttribute('tabindex');\n }\n });\n });\n }\n\n /**\n * Set data-js-focus-order to the first and last focusable element\n * Useful for tabs keyboard trap\n *\n * @param {HTMLElement} element - list of elements\n * @param {Boolean} ignoreTabIndex - ignore tabindex=\"-1\" definition used in JS logic\n */\n setFocusedOrder(element, ignoreTabIndex) {\n this.getFocusableElements(element, ignoreTabIndex).forEach((item, i, arr) => {\n if (i === 0) {\n item.setAttribute('data-js-focus-order', 'first');\n } else if (i === arr.length - 1) {\n item.setAttribute('data-js-focus-order', 'last');\n }\n });\n }\n\n /**\n * Remove data-js-focus-order attribute\n *\n * @param {HTMLElement} element - list of elements\n */\n resetFocusedOrder(element) {\n this.getFocusableElements(element).forEach((item) => {\n if (item.hasAttribute('data-js-focus-order')) {\n item.removeAttribute('data-js-focus-order');\n }\n });\n }\n\n /**\n * Keyboard trap for Tabs event handler\n * Allows to navigate between tab elements with arrow keys and move the focus out of tabs with a TAB key.\n *\n * @param {Object} event Event object\n * @param {Object} data - contain active index element, selected element and nodes list\n * @returns {Number} - index of focused element\n */\n setTabKeyboardTrap(event, data) {\n if (event.key === 'Tab') {\n data.index = Number(data.element.getAttribute('data-js-index'));\n } else if (['ArrowRight', 'ArrowDown'].indexOf(event.key) !== -1) {\n event.preventDefault();\n data.index = this.getNextIndex(data.index + 1, data.nodes);\n } else if (['ArrowLeft', 'ArrowUp'].indexOf(event.key) !== -1) {\n event.preventDefault();\n data.index = this.getNextIndex(data.index - 1, data.nodes);\n }\n return data.index;\n }\n\n /**\n * Get index of next element\n *\n * @param {Number} index - index, which should be focused\n * @param {NodeList} nodes - list with focused elements\n * @returns {Number} - index of focused element\n */\n getNextIndex(index, nodes) {\n const focusedElement = this.getNextFocusedElement(index, nodes);\n\n focusedElement.focus();\n\n return Number(focusedElement.getAttribute('data-js-index'));\n }\n\n /**\n * Get next focused element\n * Check list of focusable elements boundaries and return first or last element if we try to go beyond\n * Useful when implementing circular navigation with keyboard\n *\n * @param {Number} currentIndex - index of focused element\n * @param {NodeList} nodes list of focusable elements\n * @returns {HTMLElement} - next focused element\n */\n getNextFocusedElement(currentIndex, nodes) {\n if (currentIndex >= nodes.length) {\n currentIndex = 0;\n } else if (currentIndex < 0) {\n currentIndex = nodes.length - 1;\n }\n return nodes[currentIndex];\n }\n\n /**\n * Mask the main page from screen readers.\n * Useful for elements with a modal window behaviour.\n */\n maskPageFromSR() {\n this.selectors.page = document.querySelector('[data-js-app]');\n if (this.selectors.page) {\n this.selectors.page.setAttribute('aria-hidden', 'true');\n }\n }\n\n /**\n * Remove main page masking and restore the focus\n */\n unmaskPageFromSR() {\n if (this.selectors.page) {\n this.selectors.page.removeAttribute('aria-hidden');\n }\n }\n\n /**\n * Init modal window pattern\n * Mask the main page from screen readers and move focus to the modal window\n * @param {HTMLElement} element - active element, staying in user's focus\n * @param {HTMLElement} focusReturnElement - the element that should gain the focus on modal close.\n * If empty, the focus will be returned to the element, which triggered the modal\n * @param {Boolean} skipMaskPageFromSR - skip masking from SR\n */\n // eslint-disable-next-line max-params, require-jsdoc\n initModalPattern(element, focusReturnElement, skipMaskPageFromSR) {\n const anchorElement = element.querySelector('[data-js-anchor]');\n\n if (!skipMaskPageFromSR) {\n this.maskPageFromSR();\n }\n\n // store active element caller\n if (!this.selectors.caller) {\n if (focusReturnElement) {\n this.selectors.caller = focusReturnElement;\n } else {\n this.selectors.caller = document.activeElement;\n }\n }\n\n if (anchorElement && !anchorElement.disabled && anchorElement.offsetParent !== null) {\n anchorElement.focus();\n } else {\n // set tabindex=-1 on the active element so it can get :focus.\n element.setAttribute('tabindex', '-1');\n // since the element is non-focusable, we don't need a visible outline around it\n element.style.outline = 'none';\n element.setAttribute('data-js-anchor', '');\n\n element.focus();\n }\n }\n\n /**\n * Destroy modal window pattern\n * Remove main page masking and restore the focus\n * @param {Boolean} skipMaskPageFromSR - skip masking from SR\n */\n destroyModalPattern(skipMaskPageFromSR) {\n if (!skipMaskPageFromSR) {\n this.unmaskPageFromSR();\n }\n\n // restore focus on caller element\n if (this.selectors.caller) {\n this.selectors.caller.focus();\n this.selectors.caller = null;\n }\n }\n\n /**\n * Update status message\n * @param {String|Boolean} status - new status, if a value is boolean then default processing or finished message uses\n */\n updateStatusMessage(status) {\n this.selectors.statusMessage = document.querySelector('[data-js-global-status-message]');\n\n if (this.selectors.statusMessage) {\n if (typeof status === 'boolean') {\n status = this.selectors.statusMessage.getAttribute(status ? 'data-processing-text' : 'data-finished-text');\n }\n\n if (this.statusMessageTimer) {\n clearTimeout(this.statusMessageTimer);\n }\n\n const { statusMessage } = this.selectors;\n statusMessage.innerHTML = status;\n this.statusMessageTimer = setTimeout(() => {\n this.clearAria(statusMessage);\n }, this.options.ariaCloseTimeout);\n }\n }\n\n /**\n * Clear status message\n */\n clearStatusMessage() {\n this.selectors.statusMessage = document.querySelector('[data-js-global-status-message]');\n this.clearAria(this.selectors.statusMessage);\n }\n\n /**\n * Focus trap\n * Return focus to the first/last element if it goes outside\n *\n * @param {HTMLElement} element - active element, staying in user's focus\n * @param {Event} event - DOM event\n */\n focusTrap(element, event) {\n // Find first and last focusable elements in modal window to trap focus\n const focusableElements = this.getFocusableElements(element);\n const firstElement = focusableElements[0];\n\n if (focusableElements && focusableElements.length === 1 && (event.target === firstElement || event.shiftKey)) {\n event.preventDefault();\n return;\n }\n\n this.selectors.firstFocusable = element.querySelector('[data-js-focus-order=\"first\"]') || firstElement;\n this.selectors.lastFocusable = element.querySelector('[data-js-focus-order=\"last\"]') || focusableElements[focusableElements.length - 1];\n\n this.tabNavigate(event);\n }\n\n /* eslint-disable complexity */\n /**\n * TAB navigation\n * When navigating forward (TAB) return focus to the first focusable element if last focusable element is selected\n * OR one of radio button elements is selected (and radio group is the last focusable element in a modal)\n * When navigating backwards (SHIFT + TAB) return focus to the last focusable element if first focusable element is selected\n * OR one of radio button elements is selected (and radio group is the first focusable element in a modal)\n * @param {Object} event Event object\n */\n tabNavigate(event) {\n const isForward = !event.shiftKey;\n const isFirstElement = event.target.getAttribute('data-js-focus-order') === 'first' || event.target === this.selectors.firstFocusable;\n const focusableTrapElement = isForward ? this.selectors.lastFocusable : this.selectors.firstFocusable;\n let focusableNextElement = isForward ? this.selectors.firstFocusable : this.selectors.lastFocusable;\n\n if (!isForward && (isFirstElement || event.target.hasAttribute('data-js-anchor'))) {\n focusableNextElement = this.selectors.lastFocusable;\n } else if (focusableTrapElement.getAttribute('type') === 'radio') {\n if (event.target.getAttribute('name') !== focusableTrapElement.getAttribute('name')) {\n return; // Do nothing\n }\n } else if (event.target !== focusableTrapElement) {\n return; // Do nothing\n }\n\n // Apply keyboard trap\n event.preventDefault();\n focusableNextElement.focus();\n }\n /* eslint-enable complexity */\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n off(this.element);\n\n if (this.options.trackFocusedElements) {\n AccessibilityService.unlisten('state.restore', this);\n }\n }\n});\n"],"mappings":"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","ignoreList":[]}